From 757f18a84c0a0548060929cd41d47b05cc1e2e0f Mon Sep 17 00:00:00 2001 From: Tennyson Date: Mon, 6 Mar 2017 12:25:44 +0800 Subject: [PATCH 1/9] ... --- .../coding/src/com/coderising/array/ArrayUtil.java | 8 +++++--- .../coding/src/com/coderising/array/ArrayUtilTest.java | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java b/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java index 557f917c37..41e731a462 100644 --- a/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java +++ b/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java @@ -100,7 +100,7 @@ public int[] grow(int [] oldArray, int size) { /** * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] + * max = 1, 则返回空数组 [] * @param max * @return */ @@ -111,7 +111,8 @@ public int[] fibonacci(int max) { arrayList.add(1); int i, num; - for (i = 2; (num = (int) (arrayList.get(i - 1)) + (int) (arrayList.get(i - 2))) < max; i++) + for (i = 2; (num = (int) (arrayList.get(i - 1)) + + (int) (arrayList.get(i - 2))) < max; i++) arrayList.add(num); return ArrayUtil.toArray(arrayList); @@ -163,10 +164,12 @@ public int[] getPerfectNumbers(int max) { boolean flag = false; + // 尾数为6的数 if (i % 10 == 6 ) { flag = true; } + // 尾数8则其后两位尾数必为28 if (i % 10 == 8) { if (i % 100 == 28) { flag = true; @@ -174,7 +177,6 @@ public int[] getPerfectNumbers(int max) { } if (flag) { - for (int j = 1; j <= (i / 2); j++) { if (i % j == 0) { diff --git a/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java b/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java index 1b1e7005b4..d56b2381c8 100644 --- a/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java +++ b/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java @@ -83,7 +83,7 @@ public void getPrimes() throws Exception { @Test public void getPerfectNumbers() throws Exception { newArray = new int[]{6, 28, 496, 8128}; - System.out.println(33550336 % 27); + Assert.assertArrayEquals(newArray, arrayUtil.getPerfectNumbers(10000)); } From 2d47efb6de5b01543920032d9ba980c686864ec5 Mon Sep 17 00:00:00 2001 From: Tennyson Date: Tue, 7 Mar 2017 12:20:34 +0800 Subject: [PATCH 2/9] ... --- .../src/com/coding/basic/LinkedListTest.java | 95 +++++++++++++++++++ .../src/com/coding/basic/QueueTest.java | 53 +++++++++++ .../src/com/coding/basic/StackTest.java | 55 +++++++++++ 3 files changed, 203 insertions(+) create mode 100644 group14/296933284/coding/src/com/coding/basic/LinkedListTest.java create mode 100644 group14/296933284/coding/src/com/coding/basic/QueueTest.java create mode 100644 group14/296933284/coding/src/com/coding/basic/StackTest.java diff --git a/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java b/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..825df453ff --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java @@ -0,0 +1,95 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by damocles on 2017/3/6. + */ +public class LinkedListTest { + private LinkedList bookList; + + @Before + public void setUp() throws Exception { + bookList = new LinkedList<>(); + + bookList.add("javascript"); + bookList.add("java"); + bookList.add("c++"); + bookList.add("c"); + + } + + @After + public void tearDown() throws Exception { + bookList = null; + } + + @Test + public void add() throws Exception { + Assert.assertTrue(bookList.add("python")); + } + + @Test + public void add1() throws Exception { + bookList.add("python"); + Assert.assertEquals("python", bookList.removeLast()); + } + + @Test + public void addFirst() throws Exception { + bookList.addFirst("python"); + Assert.assertEquals("python", bookList.removeFirst()); + } + + @Test + public void addLast() throws Exception { + bookList.addLast("python"); + Assert.assertEquals("python", bookList.removeLast()); + } + + @Test + public void get() throws Exception { + Assert.assertEquals("javascript", bookList.get(0)); + } + + @Test + public void remove() throws Exception { + Assert.assertEquals("javascript", bookList.remove(0)); + } + + @Test + public void removeFirst() throws Exception { + Assert.assertEquals("javascript", bookList.removeFirst()); + } + + @Test + public void removeLast() throws Exception { + Assert.assertEquals("c", bookList.removeLast()); + } + + @Test + public void size() throws Exception { + Assert.assertEquals(4, bookList.size()); + } + + @Test + public void isEmpty() throws Exception { + Assert.assertFalse(bookList.isEmpty()); + } + + @Test + public void iterator() throws Exception { + Iterator it = bookList.iterator(); + Assert.assertTrue(it.hasNext()); + int count = 0; + while (it.hasNext()) { + Assert.assertEquals(bookList.get(count++), it.next()); + } + } + +} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/QueueTest.java b/group14/296933284/coding/src/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..3a32d0f0c9 --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/QueueTest.java @@ -0,0 +1,53 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by damocles on 2017/3/7. + */ +public class QueueTest { + private Queue queue; + + @Before + public void setUp() throws Exception { + queue = new Queue<>(); + + queue.enQueue("javascript"); + queue.enQueue("java"); + queue.enQueue("c++"); + queue.enQueue("c"); + } + + @After + public void tearDown() throws Exception { + queue = null; + } + + @Test + public void enQueue() throws Exception { + queue.enQueue("php"); + + Assert.assertEquals(5, queue.size()); + } + + @Test + public void deQueue() throws Exception { + Assert.assertEquals("javascript",queue.deQueue()); + } + + @Test + public void isEmpty() throws Exception { + Assert.assertFalse(queue.isEmpty()); + } + + @Test + public void size() throws Exception { + Assert.assertEquals(4, queue.size()); + } + +} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/StackTest.java b/group14/296933284/coding/src/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..e67a4ec361 --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/StackTest.java @@ -0,0 +1,55 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by damocles on 2017/3/7. + */ +public class StackTest { + private Stack stack; + + @Before + public void setUp() throws Exception { + stack = new Stack<>(); + + stack.push("javascript"); + stack.push("java"); + stack.push("c++"); + stack.push("c"); + } + + @After + public void tearDown() throws Exception { + stack = null; + } + + @Test + public void push() throws Exception { + stack.push("php"); + Assert.assertEquals("php", stack.pop()); + } + + @Test + public void pop() throws Exception { + Assert.assertEquals("c", stack.pop()); + } + + @Test + public void peek() throws Exception { + Assert.assertEquals("c", stack.peek()); + } + + @Test + public void isEmpty() throws Exception { + Assert.assertFalse(stack.isEmpty()); + } + + @Test + public void size() throws Exception { + Assert.assertEquals(4, stack.size()); + } + +} \ No newline at end of file From c4a1df67c308a403fb7c3f9e03f711f8c7ae97d2 Mon Sep 17 00:00:00 2001 From: Tennyson Date: Tue, 7 Mar 2017 12:58:15 +0800 Subject: [PATCH 3/9] delete --- .gitignore | 30 - .../1298552064/src/week01/basic/Iterator.java | 8 - group01/1298552064/src/week01/basic/List.java | 13 - .../src/week01/basic/MyArrayList.java | 131 -- .../src/week01/basic/MyBinaryTreeNode.java | 70 - .../src/week01/basic/MyLinkedList.java | 215 --- .../1298552064/src/week01/basic/MyQueue.java | 22 - .../1298552064/src/week01/basic/MyStack.java | 25 - .../src/week01/test/MyArrayListTest.java | 53 - .../src/week01/test/MyLinkedListTest.java | 78 - .../src/week01/test/MyQueueTest.java | 48 - .../src/week01/test/MyStackTest.java | 53 - .../RemoteSystemsTempFiles/.project | 12 - group01/1328404806/dataStructure/.classpath | 27 - group01/1328404806/dataStructure/.gitignore | 1 - group01/1328404806/dataStructure/.project | 23 - .../org.eclipse.core.resources.prefs | 4 - .../.settings/org.eclipse.jdt.core.prefs | 5 - .../.settings/org.eclipse.m2e.core.prefs | 4 - group01/1328404806/dataStructure/pom.xml | 25 - .../main/java/ListService/KILinkedList.java | 10 - .../src/main/java/ListService/KIList.java | 28 - .../main/java/ListService/KIQueueList.java | 11 - .../main/java/ListService/KIStackList.java | 9 - .../main/java/ListServiceImpl/KArrayList.java | 192 --- .../java/ListServiceImpl/KLinkedList.java | 201 --- .../main/java/ListServiceImpl/KQueueList.java | 97 -- .../main/java/ListServiceImpl/KStackList.java | 48 - .../increaseLearning/dataStructure/App.java | 13 - .../dataStructure/AppTest.java | 38 - .../dataStructure/arrayListTest.java | 36 - .../dataStructure/linkedListTest.java | 21 - .../dataStructure/queueListTest.java | 42 - .../dataStructure/stackListTest.java | 26 - group01/1664823950/.classpath | 6 - group01/1664823950/.gitignore | 1 - group01/1664823950/.project | 17 - .../src/com/coding/basic/ArrayList.java | 73 - .../src/com/coding/basic/BinaryTreeNode.java | 45 - .../src/com/coding/basic/Iterator.java | 8 - .../src/com/coding/basic/LinkedList.java | 108 -- .../1664823950/src/com/coding/basic/List.java | 10 - .../src/com/coding/basic/Queue.java | 26 - .../src/com/coding/basic/Stack.java | 31 - group01/1814014897/zhouhui/.classpath | 7 - group01/1814014897/zhouhui/.gitignore | 1 - group01/1814014897/zhouhui/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../week01/BasicDataStructure/ArrayList.java | 75 - .../BasicDataStructure/BinaryTreeNode.java | 56 - .../week01/BasicDataStructure/Iterator.java | 7 - .../week01/BasicDataStructure/LinkedList.java | 113 -- .../src/week01/BasicDataStructure/List.java | 9 - .../src/week01/BasicDataStructure/Queue.java | 25 - .../src/week01/BasicDataStructure/Stack.java | 25 - .../BasicDataStructureTest/AllTest.java | 18 - .../BasicDataStructureTest/ArrayListTest.java | 72 - .../BinaryTreeNodeTest.java | 80 - .../LinkedListTest.java | 106 -- .../BasicDataStructureTest/QueueTest.java | 56 - .../BasicDataStructureTest/StackTest.java | 71 - group01/1925347167/1925347167.md | 1 - .../Week1 Basic Data Structure/ArrayList.java | 64 - .../BinaryTreeNode.java | 38 - .../Week1 Basic Data Structure/Iterator.java | 7 - .../LinkedList.java | 127 -- .../Week1 Basic Data Structure/List.java | 9 - .../Week1 Basic Data Structure/Queue.java | 24 - .../Week1 Basic Data Structure/Stack.java | 28 - .../Week1 Basic Data Structure/readme.md | 1 - group01/2137642225/work01/.classpath | 7 - group01/2137642225/work01/.gitignore | 1 - group01/2137642225/work01/.project | 17 - .../src/com/coding/mybasic/ArrayList.java | 139 -- .../com/coding/mybasic/BinaryTreeNode.java | 73 - .../src/com/coding/mybasic/Iterator.java | 7 - .../src/com/coding/mybasic/LinkedList.java | 226 --- .../work01/src/com/coding/mybasic/List.java | 10 - .../work01/src/com/coding/mybasic/Queue.java | 30 - .../work01/src/com/coding/mybasic/Stack.java | 35 - .../src/com/coding/test/TestArrayList.java | 81 -- .../com/coding/test/TestBinaryTreeNode.java | 32 - .../src/com/coding/test/TestLinkedList.java | 73 - .../work01/src/com/coding/test/TestQueue.java | 36 - .../work01/src/com/coding/test/TestStack.java | 49 - .../275150374Learning/.idea/compiler.xml | 23 - .../275150374Learning/.idea/description.html | 1 - .../275150374Learning/.idea/encodings.xml | 5 - .../275150374Learning/.idea/misc.xml | 12 - .../275150374Learning/.idea/modules.xml | 8 - .../275150374/275150374Learning/.idea/vcs.xml | 6 - .../275150374Learning/275150374Learning.iml | 12 - .../src/task01/ArrayList.java | 86 -- .../src/task01/LinkedList.java | 162 --- .../275150374Learning/src/task01/Main.java | 12 - .../275150374Learning/src/task01/Queue.java | 42 - .../275150374Learning/src/task01/Stack.java | 30 - group01/280646174/.gitignore | 27 - group01/280646174/280646174.md | 1 - group01/280646174/basic/pom.xml | 27 - .../java/com/coding2017/basic/ArrayList.java | 100 -- .../com/coding2017/basic/BinaryTreeNode.java | 57 - .../java/com/coding2017/basic/Iterator.java | 7 - .../java/com/coding2017/basic/LinkedList.java | 179 --- .../main/java/com/coding2017/basic/List.java | 13 - .../main/java/com/coding2017/basic/Queue.java | 22 - .../main/java/com/coding2017/basic/Stack.java | 25 - .../com/coding2017/basic/ArrayListTest.java | 79 - .../coding2017/basic/BinaryTreeNodeTest.java | 24 - .../com/coding2017/basic/LinkedListTest.java | 83 -- .../java/com/coding2017/basic/QueueTest.java | 23 - .../java/com/coding2017/basic/StackTest.java | 24 - group01/280646174/pom.xml | 38 - group01/349209948/.gitignore | 3 - .../349209948/src/week1_0226/ArrayList.java | 68 - .../src/week1_0226/BinaryTreeNode.java | 37 - .../349209948/src/week1_0226/Iterator.java | 6 - .../349209948/src/week1_0226/LinkedList.java | 129 -- group01/349209948/src/week1_0226/List.java | 9 - group01/349209948/src/week1_0226/Queue.java | 21 - group01/349209948/src/week1_0226/Stack.java | 29 - group01/360176196/.classpath | 6 - group01/360176196/.gitignore | 1 - group01/360176196/.project | 17 - .../src/xqfGit/dataStructure/ArrayList.java | 73 - .../xqfGit/dataStructure/BinaryTreeNode.java | 49 - .../src/xqfGit/dataStructure/Iterator.java | 7 - .../src/xqfGit/dataStructure/LinkedList.java | 116 -- .../src/xqfGit/dataStructure/List.java | 9 - .../src/xqfGit/dataStructure/Queue.java | 27 - .../src/xqfGit/dataStructure/Stack.java | 28 - group01/378213871/.classpath | 6 - group01/378213871/.gitignore | 1 - group01/378213871/.project | 17 - .../com/coding/basic/week01/ArrayList.java | 74 - .../coding/basic/week01/BinaryTreeNode.java | 32 - .../src/com/coding/basic/week01/Iterator.java | 7 - .../com/coding/basic/week01/LinkedList.java | 129 -- .../src/com/coding/basic/week01/List.java | 9 - .../src/com/coding/basic/week01/Queue.java | 24 - .../src/com/coding/basic/week01/Stack.java | 35 - group01/496740686/src/Impl/MyArraryList.java | 141 -- group01/496740686/src/Impl/MyLinkedList.java | 177 --- group01/496740686/src/Impl/MyQueue.java | 68 - group01/496740686/src/Impl/MyStack.java | 70 - .../496740686/src/Interface/ArrayList.java | 34 - .../src/Interface/BinaryTreeNode.java | 32 - group01/496740686/src/Interface/Iterator.java | 7 - .../496740686/src/Interface/LinkedList.java | 47 - group01/496740686/src/Interface/List.java | 9 - group01/496740686/src/Interface/Queue.java | 19 - group01/496740686/src/Interface/Stack.java | 22 - group01/496740686/src/ex/MyArrest.java | 75 - group01/751425278/.classpath | 6 - group01/751425278/.gitignore | 1 - group01/751425278/.project | 17 - .../basicDataStructure/ArrayList.java | 156 -- .../basicDataStructure/BinaryTreeNode.java | 58 - .../basicDataStructure/Iterator.java | 6 - .../basicDataStructure/LinkedList.java | 159 -- .../sanmubird/basicDataStructure/List.java | 9 - .../sanmubird/basicDataStructure/Queue.java | 76 - .../sanmubird/basicDataStructure/Stack.java | 50 - .../src/zavier/week01/basic/ArrayList.java | 85 -- .../zavier/week01/basic/BinaryTreeNode.java | 63 - .../src/zavier/week01/basic/Iterator.java | 8 - .../src/zavier/week01/basic/LinkedList.java | 148 -- .../src/zavier/week01/basic/List.java | 13 - .../src/zavier/week01/basic/Queue.java | 25 - .../src/zavier/week01/basic/Stack.java | 33 - .../src/zavier/week01/test/AllTests.java | 12 - .../src/zavier/week01/test/ArrayListTest.java | 91 -- .../week01/test/BinaryTreeNodeTest.java | 33 - .../zavier/week01/test/LinkedListTest.java | 109 -- .../src/zavier/week01/test/QueueTest.java | 49 - .../src/zavier/week01/test/StackTest.java | 60 - .../lvxg2017/src/basic/BinaryTree.java | 41 - .../lvxg2017/src/basic/BinaryTreeNode.java | 34 - .../lvxg2017/src/basic/MyArrayList.java | 88 -- .../lvxg2017/src/basic/MyLinkedList.java | 168 --- .../819048836/lvxg2017/src/basic/Queue.java | 43 - .../819048836/lvxg2017/src/basic/Stack.java | 58 - .../src/datastructure/basic/ArrayList.java | 136 -- .../datastructure/basic/BinarySortedTree.java | 61 - .../datastructure/basic/BinaryTreeNode.java | 32 - .../src/datastructure/basic/Iterator.java | 6 - .../src/datastructure/basic/LinkedList.java | 132 -- .../code/src/datastructure/basic/List.java | 10 - .../code/src/datastructure/basic/Queue.java | 68 - .../code/src/datastructure/basic/Stack.java | 32 - .../exception/EmptyListException.java | 8 - .../exception/EmptyQueueException.java | 7 - .../datastructure/basic/ArrayListTest.java | 152 -- .../basic/BinarySortedTreeTest.java | 60 - .../datastructure/basic/LinkedListTest.java | 88 -- .../test/datastructure/basic/QueueTest.java | 108 -- .../test/datastructure/basic/StackTest.java | 93 -- .../test/datastructure/basic/TestSuite.java | 13 - group01/932573198/20170220/.classpath | 7 - group01/932573198/20170220/.gitignore | 1 - group01/932573198/20170220/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coding/basic/ArrayList.java | 92 -- .../src/com/coding/basic/BinaryTree.java | 77 - .../src/com/coding/basic/Iterator.java | 6 - .../src/com/coding/basic/LinkedList.java | 144 -- .../20170220/src/com/coding/basic/List.java | 9 - .../20170220/src/com/coding/basic/Queue.java | 28 - .../20170220/src/com/coding/basic/Stack.java | 40 - .../src/com/coding/test/ArrayListTest.java | 79 - .../src/com/coding/test/BinaryTreeTest.java | 29 - .../src/com/coding/test/IteratorTest.java | 40 - .../src/com/coding/test/LinkedListTest.java | 108 -- .../src/com/coding/test/QueueTest.java | 52 - .../src/com/coding/test/StackTest.java | 76 - group01/954958168/954958168.md | 0 .../class01/BasicDataStructure/.gitignore | 28 - .../class01/BasicDataStructure/pom.xml | 24 - .../com/aaront/exercise/basic/ArrayList.java | 90 -- .../com/aaront/exercise/basic/BinaryTree.java | 235 --- .../com/aaront/exercise/basic/Iterator.java | 9 - .../com/aaront/exercise/basic/LinkedList.java | 129 -- .../java/com/aaront/exercise/basic/List.java | 9 - .../java/com/aaront/exercise/basic/Queue.java | 26 - .../java/com/aaront/exercise/basic/Stack.java | 29 - .../exercise/generic/GenericArrayList.java | 98 -- .../exercise/generic/GenericBinaryTree.java | 255 ---- .../exercise/generic/GenericIterator.java | 9 - .../exercise/generic/GenericLinkedList.java | 140 -- .../aaront/exercise/generic/GenericList.java | 9 - .../aaront/exercise/generic/GenericQueue.java | 30 - .../aaront/exercise/generic/GenericStack.java | 33 - .../com/aaront/execrise/basic/AllTest.java | 19 - .../aaront/execrise/basic/ArrayListTest.java | 69 - .../aaront/execrise/basic/BinaryTreeTest.java | 94 -- .../aaront/execrise/basic/LinkListTest.java | 81 -- .../com/aaront/execrise/basic/QueueTest.java | 33 - .../com/aaront/execrise/basic/StackTest.java | 46 - .../execrise/generic/GenericAllTest.java | 19 - .../generic/GenericArrayListTest.java | 76 - .../generic/GenericBinaryTreeTest.java | 75 - .../generic/GenericLinkedListTest.java | 90 -- .../execrise/generic/GenericQueueTest.java | 33 - .../execrise/generic/GenericStackTest.java | 46 - group01/group01.md | 1 - .../Ven13/coding2017/basic/ArrayList.java | 97 -- .../coding2017/basic/BinaryTreeNode.java | 32 - .../Ven13/coding2017/basic/Iterator.java | 7 - .../Ven13/coding2017/basic/LinkedList.java | 173 --- .../github/Ven13/coding2017/basic/List.java | 11 - .../github/Ven13/coding2017/basic/Queue.java | 30 - .../github/Ven13/coding2017/basic/Stack.java | 30 - .../coding2017/basic/test/ArrayListTest.java | 11 - .../coding2017/basic/test/LinkedListTest.java | 100 -- .../Ven13/coding2017/basic/test/ListTest.java | 129 -- .../coding2017/basic/test/QueueTest.java | 36 - .../coding2017/basic/test/StackTest.java | 40 - .../FelixCJF/coding2017/basic/ArrayList.java | 105 -- .../coding2017/basic/BinaryTreeNode.java | 32 - .../FelixCJF/coding2017/basic/Iterator.java | 8 - .../FelixCJF/coding2017/basic/LinkedList.java | 214 --- .../FelixCJF/coding2017/basic/List.java | 11 - .../FelixCJF/coding2017/basic/Queue.java | 53 - .../FelixCJF/coding2017/basic/Stack.java | 34 - .../coding2017/basic/test/ArrayListTest.java | 14 - .../coding2017/basic/test/LinkedListTest.java | 100 -- .../coding2017/basic/test/ListTest.java | 124 -- .../coding2017/basic/test/QueueTest.java | 34 - .../coding2017/basic/test/StackTest.java | 41 - .../coding2017/basic/MyArrayList.java | 83 -- .../coding2017/basic/MyLinkedList.java | 119 -- .../lhpmatlab/coding2017/basic/MyQueue.java | 29 - .../lhpmatlab/coding2017/basic/MyStack.java | 30 - .../coding2017/basic/MyArrayListTest.java | 113 -- .../coding2017/basic/MyLinkedListTest.java | 121 -- .../coding2017/basic/MyQueueTest.java | 71 - .../coding2017/basic/MyStackTest.java | 104 -- group02/527705641/.gitignore | 1 - .../fei9009/coding2017/basic/ArrayList.java | 71 - .../coding2017/basic/ArrayListTest.java | 55 - .../coding2017/basic/BinaryTreeNode.java | 57 - .../fei9009/coding2017/basic/Iterator.java | 7 - .../fei9009/coding2017/basic/LinkedList.java | 91 -- .../coding2017/basic/LinkedListTest.java | 92 -- .../github/fei9009/coding2017/basic/List.java | 9 - .../fei9009/coding2017/basic/Queue.java | 21 - .../fei9009/coding2017/basic/QueueTest.java | 35 - .../fei9009/coding2017/basic/Stack.java | 26 - .../fei9009/coding2017/basic/StackTest.java | 37 - .../orajavac/coding2017/basic/ArrayList.java | 101 -- .../coding2017/basic/BinaryTreeNode.java | 32 - .../orajavac/coding2017/basic/Iterator.java | 7 - .../orajavac/coding2017/basic/LinkedList.java | 110 -- .../orajavac/coding2017/basic/List.java | 9 - .../orajavac/coding2017/basic/Queue.java | 34 - .../orajavac/coding2017/basic/Stack.java | 49 - group02/609990377/DataStructure/.gitignore | 3 - .../coding2017/basic/ArrayList.java | 113 -- .../coding2017/basic/BinaryTreeNode.java | 78 - .../coding2017/basic/Iterator.java | 8 - .../coding2017/basic/LinkedList.java | 182 --- .../coding2017/basic/List.java | 9 - .../coding2017/basic/Queue.java | 34 - .../coding2017/basic/Stack.java | 32 - .../coding2017/basicTest/ArrayListTest.java | 115 -- .../basicTest/BinaryTreeNodeTest.java | 69 - .../coding2017/basicTest/LinkedListTest.java | 143 -- .../coding2017/basicTest/QueueTest.java | 76 - .../coding2017/basicTest/StackTest.java | 75 - .../coding2017/basicTest/TestRunner.java | 38 - .../coding2017/basicTest/testCase.java | 21 - group02/727171008/.classpath | 7 - group02/727171008/.gitignore | 19 - group02/727171008/.project | 17 - .../coding2017/basic/ArrayListTest.java | 15 - .../coding2017/basic/BinaryTreeNode.java | 121 -- .../coding2017/basic/BinaryTreeNodeTest.java | 40 - .../HarryHook/coding2017/basic/Iterator.java | 7 - .../coding2017/basic/LinkedListTest.java | 93 -- .../HarryHook/coding2017/basic/List.java | 14 - .../HarryHook/coding2017/basic/ListTest.java | 122 -- .../coding2017/basic/MyArrayList.java | 167 --- .../coding2017/basic/MyLinkedList.java | 219 --- .../HarryHook/coding2017/basic/MyQueue.java | 54 - .../HarryHook/coding2017/basic/MyStack.java | 59 - .../HarryHook/coding2017/basic/QueueTest.java | 33 - .../HarryHook/coding2017/basic/StackTest.java | 40 - .../coding2017/basic/Iterator.java | 7 - .../ZhoufeifeiJAVA/coding2017/basic/List.java | 9 - .../coding2017/basic/MyArrayList.java | 78 - .../coding2017/basic/MyArrayListTest.java | 34 - .../coding2017/basic/MyLinkedList.java | 127 -- .../coding2017/basic/MyLinkedListTest.java | 34 - .../coding2017/basic/Queue.java | 26 - .../coding2017/basic/QueueTest.java | 17 - .../coding2017/basic/Stack.java | 28 - .../coding2017/basic/StackTest.java | 17 - group02/812350401/.gitignore | 3 - .../coding2017/basic/ArrayList.java | 77 - .../coding2017/basic/BinaryTreeNode.java | 55 - .../miniyk2012/coding2017/basic/Iterator.java | 6 - .../coding2017/basic/IteratorImp.java | 24 - .../coding2017/basic/LinkedList.java | 103 -- .../miniyk2012/coding2017/basic/List.java | 10 - .../miniyk2012/coding2017/basic/Queue.java | 23 - .../miniyk2012/coding2017/basic/Stack.java | 25 - .../coding2017/basic/test/ArrayListTest.java | 14 - .../basic/test/BinaryTreeNodeTest.java | 70 - .../coding2017/basic/test/LinkedListTest.java | 93 -- .../coding2017/basic/test/ListTest.java | 117 -- .../coding2017/basic/test/QueueTest.java | 33 - .../coding2017/basic/test/StackTest.java | 40 - group02/851113375/.gitignore | 3 - .../coding2017/basic/ArrayList.java | 91 -- .../coding2017/basic/BinaryTreeNode.java | 72 - .../eloiseSJTU/coding2017/basic/Iterator.java | 6 - .../coding2017/basic/LinkedList.java | 170 --- .../eloiseSJTU/coding2017/basic/List.java | 15 - .../eloiseSJTU/coding2017/basic/Queue.java | 28 - .../eloiseSJTU/coding2017/basic/Stack.java | 31 - .../coding2017/basic/test/ArrayListTest.java | 15 - .../basic/test/BinaryTreeNodeTest.java | 34 - .../coding2017/basic/test/LinkedListTest.java | 93 -- .../coding2017/basic/test/ListTest.java | 120 -- .../coding2017/basic/test/QueueTest.java | 33 - .../coding2017/basic/test/StackTest.java | 40 - .../coding2017/basic/ArrayList.java | 86 -- .../coding2017/basic/ArrayListTest.java | 69 - .../lqingchenl/coding2017/basic/Iterator.java | 7 - .../coding2017/basic/LinkedList.java | 118 -- .../coding2017/basic/LinkedListTest.java | 125 -- .../lqingchenl/coding2017/basic/List.java | 9 - .../lqingchenl/coding2017/basic/Queue.java | 28 - .../coding2017/basic/QueueTest.java | 57 - .../lqingchenl/coding2017/basic/Stack.java | 33 - .../coding2017/basic/StackTest.java | 64 - group02/group02.md | 1 - .../src/ArrayList.java" | 102 -- .../src/BinaryTree.java" | 66 - .../src/BinaryTreeNode.java" | 42 - .../src/Iterator.java" | 7 - .../src/LinkedList.java" | 152 -- .../src/List.java" | 13 - .../src/Queue.java" | 23 - .../src/Stack.java" | 36 - .../test/ArrayListTest.java" | 81 -- .../test/BinaryTreeTest.java" | 24 - .../test/LinkedListTest.java" | 122 -- .../test/QueueTest.java" | 34 - .../test/StackTest.java" | 52 - group03/1196051822/README | 2 - group03/1360464792/.gitignore | 34 - group03/1360464792/pom.xml | 42 - .../java/rui/study/coding2017/ArrayList.java | 142 -- .../java/rui/study/coding2017/BinaryTree.java | 93 -- .../rui/study/coding2017/BinaryTreeNode.java | 40 - .../java/rui/study/coding2017/Iterator.java | 8 - .../java/rui/study/coding2017/LinkedList.java | 156 -- .../main/java/rui/study/coding2017/List.java | 9 - .../main/java/rui/study/coding2017/Queue.java | 21 - .../main/java/rui/study/coding2017/Stack.java | 24 - .../rui/study/coding2017/ArrayListTest.java | 82 -- .../rui/study/coding2017/BinaryTreeTest.java | 34 - .../rui/study/coding2017/LinkedListTest.java | 138 -- .../java/rui/study/coding2017/QueueTest.java | 39 - .../java/rui/study/coding2017/StackTest.java | 54 - group03/172487938/Iterator.java | 7 - group03/172487938/MyArrayList.java | 186 --- group03/172487938/MyLinkedList.java | 274 ---- group03/172487938/MyList.java | 27 - group03/172487938/Queue.java | 32 - group03/172487938/Stack.java | 37 - group03/172487938/TestMyArrayList.java | 36 - group03/172487938/TestMyLinkedList.java | 19 - group03/1753176091/bin/.gitignore | 1 - .../src/com/coding/basic/ArrayList.java | 56 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/FileUtil.java | 68 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 120 -- .../1753176091/src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 25 - .../src/com/coding/basic/Stack.java | 28 - group03/2864885311/DS/.classpath | 8 - group03/2864885311/DS/.gitignore | 1 - group03/2864885311/DS/.project | 17 - .../DS/.settings/org.eclipse.jdt.core.prefs | 11 - .../DS/src/com/coding/basic/ArrayList.java | 68 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../DS/src/com/coding/basic/Iterator.java | 7 - .../DS/src/com/coding/basic/LinkedList.java | 46 - .../DS/src/com/coding/basic/List.java | 10 - .../DS/src/com/coding/basic/Queue.java | 19 - .../DS/src/com/coding/basic/Stack.java | 22 - .../src/com/coding/basic/ArrayList.java | 91 -- .../src/com/coding/basic/BinaryTree.java | 132 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 129 -- .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 42 - .../src/com/coding/basic/Stack.java | 51 - .../src/com/coding/test/ArrayListTest.java | 48 - .../src/com/coding/test/BinaryTreeTest.java | 25 - .../src/com/coding/test/LinkedListTest.java | 44 - .../src/com/coding/test/QueueTest.java | 23 - .../src/com/coding/test/StackTest.java | 24 - group03/510782645/.gitignore | 46 - .../src/com/coding/basic/ArrayList.java | 152 -- .../src/com/coding/basic/BinaryTreeNode.java | 83 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 202 --- .../510782645/src/com/coding/basic/List.java | 9 - .../510782645/src/com/coding/basic/Queue.java | 100 -- .../510782645/src/com/coding/basic/Stack.java | 39 - group03/569045298/pom.xml | 35 - .../coding/basic/datastructure/ArrayList.java | 108 -- .../basic/datastructure/BinaryTreeNode.java | 41 - .../coding/basic/datastructure/Iterator.java | 13 - .../basic/datastructure/LinkedList.java | 167 --- .../com/coding/basic/datastructure/List.java | 17 - .../com/coding/basic/datastructure/Queue.java | 43 - .../com/coding/basic/datastructure/Stack.java | 47 - .../datastructure/TestDataStructure.java | 66 - group03/617187912/Learning02/.classpath | 6 - group03/617187912/Learning02/.gitignore | 1 - group03/617187912/Learning02/.project | 17 - .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coding/basic/ArrayList.java | 117 -- .../src/com/coding/basic/BinaryTreeNode.java | 33 - .../src/com/coding/basic/Iterator.java | 8 - .../src/com/coding/basic/LinkedList.java | 137 -- .../Learning02/src/com/coding/basic/List.java | 10 - .../src/com/coding/basic/Queue.java | 33 - .../src/com/coding/basic/Stack.java | 48 - group03/617187912/Learning201702/.classpath | 6 - group03/617187912/Learning201702/.gitignore | 1 - group03/617187912/Learning201702/.project | 17 - .../org.eclipse.core.resources.prefs | 2 - .../src/com/coding/basic/ArrayList.java | 47 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 46 - .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 19 - .../src/com/coding/basic/Stack.java | 22 - group03/619224754/.classpath | 7 - group03/619224754/.gitignore | 1 - group03/619224754/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - group03/619224754/src/Main/Main.java | 5 - .../src/com/coding/basic/ArrayList.java | 75 - .../src/com/coding/basic/BinaryTreeNode.java | 80 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 182 --- .../619224754/src/com/coding/basic/List.java | 9 - .../619224754/src/com/coding/basic/Queue.java | 23 - .../619224754/src/com/coding/basic/Stack.java | 25 - group03/619224754/src/test/ArrayListTest.java | 62 - group03/664269713/DataStructure/.gitignore | 3 - .../src/com/ace/coding/ArrayList.java | 84 -- .../src/com/ace/coding/BinaryTreeNode.java | 61 - .../src/com/ace/coding/Iterator.java | 7 - .../src/com/ace/coding/LinkedList.java | 123 -- .../src/com/ace/coding/List.java | 9 - .../src/com/ace/coding/Queue.java | 27 - .../src/com/ace/coding/Stack.java | 36 - group03/763878069/.classpath | 6 - group03/763878069/.gitignore | 1 - group03/763878069/.project | 17 - .../src/cmj/datastructure/list/ArrayList.java | 154 -- .../cmj/datastructure/list/LinkedList.java | 208 --- .../src/cmj/datastructure/list/List.java | 13 - .../src/cmj/datastructure/list/Queue.java | 128 -- .../src/cmj/datastructure/list/Stack.java | 58 - .../src/cmj/datastructure/tree/BSTree.java | 191 --- .../cmj/datastructure/tree/BinaryTree.java | 185 --- group03/894844916/coding2017-01/.classpath | 6 - group03/894844916/coding2017-01/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coding/basic/ArrayList.java | 149 -- .../src/com/coding/basic/BinaryTreeNode.java | 67 - .../src/com/coding/basic/Iterator.java | 22 - .../src/com/coding/basic/LinkedList.java | 168 --- .../src/com/coding/basic/List.java | 54 - .../com/coding/basic/ListIndexException.java | 21 - .../src/com/coding/basic/Queue.java | 36 - .../src/com/coding/basic/Stack.java | 43 - group03/group03.md | 1 - .../1020483199/1020483199Learning/.classpath | 7 - .../1020483199/1020483199Learning/.gitignore | 1 - .../1020483199/1020483199Learning/.project | 17 - .../org.eclipse.core.resources.prefs | 3 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coding/basic/ArrayList.java | 128 -- .../src/com/coding/basic/BinaryTreeNode.java | 82 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 175 --- .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 40 - .../src/com/coding/basic/Stack.java | 38 - .../src/com/coding/test/JavaTest.java | 223 --- .../RemoteSystemsTempFiles/.project | 12 - group04/120549547/base/buil.bat | 5 - .../base/src/com/coding/basic/ArrayList.java | 93 -- .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../base/src/com/coding/basic/Iterator.java | 7 - .../base/src/com/coding/basic/LinkedList.java | 127 -- .../base/src/com/coding/basic/List.java | 10 - .../base/src/com/coding/basic/Main.java | 85 -- .../base/src/com/coding/basic/Queue.java | 29 - .../base/src/com/coding/basic/Stack.java | 37 - group04/120549547/my.txt | 1 - group04/120549547/shell.sh | 18 - .../src/com/coding/basic/ArrayList.java | 125 -- .../src/com/coding/basic/BinaryTreeNode.java | 73 - .../src/com/coding/basic/LinkedList.java | 211 --- .../src/com/coding/basic/Queue.java | 29 - .../src/com/coding/basic/Stack.java | 34 - group04/1751801281/.classpath | 8 - group04/1751801281/.gitignore | 1 - group04/1751801281/.project | 17 - .../src/com/coding/basic/ArrayList.java | 100 -- .../src/com/coding/basic/Iterator.java | 6 - .../src/com/coding/basic/LinkedList.java | 133 -- .../1751801281/src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 27 - .../src/com/coding/basic/Stack.java | 29 - .../test/com/coding/basic/ArrayListTest.java | 30 - .../test/com/coding/basic/LinkedListTeat.java | 29 - .../test/com/coding/basic/QueueTest.java | 16 - .../test/com/coding/basic/StackTest.java | 19 - group04/1796244932/.gitignore | 138 -- group04/1796244932/learn01/.gitignore | 6 - group04/1796244932/learn01/pom.xml | 42 - .../com/dudy/learn01/base/MyArrayList.java | 124 -- .../com/dudy/learn01/base/MyBinaryTree.java | 71 - .../com/dudy/learn01/base/MyIterator.java | 6 - .../com/dudy/learn01/base/MyLinkedList.java | 132 -- .../java/com/dudy/learn01/base/MyList.java | 8 - .../java/com/dudy/learn01/base/MyQueue.java | 22 - .../java/com/dudy/learn01/base/MyStack.java | 26 - .../dudy/learn01/base/MyArrayListTest.java | 59 - .../dudy/learn01/base/MyBinaryTreeTest.java | 42 - .../dudy/learn01/base/MyLinkedListTest.java | 88 -- .../com/dudy/learn01/base/MyQueueTest.java | 27 - .../com/dudy/learn01/base/MyStackTest.java | 58 - group04/1906242834/.classpath | 6 - group04/1906242834/.gitignore | 1 - group04/1906242834/.project | 17 - .../src/com/coding/basic/ArrayList.java | 71 - .../src/com/coding/basic/BinaryTreeNode.java | 5 - .../src/com/coding/basic/Iterator.java | 5 - .../src/com/coding/basic/LinkedList.java | 5 - .../1906242834/src/com/coding/basic/List.java | 5 - .../src/com/coding/basic/Queue.java | 5 - .../src/com/coding/basic/Stack.java | 35 - group04/1972376180/.classpath | 6 - group04/1972376180/.gitignore | 1 - group04/1972376180/.project | 17 - .../src/tong/java/one/MyArrayList.java | 76 - .../src/tong/java/one/MyLinkedList.java | 127 -- .../1972376180/src/tong/java/one/MyQueue.java | 34 - .../1972376180/src/tong/java/one/MyStack.java | 38 - group04/2082945465/.gitignore | 138 -- group04/2082945465/week01/src/Hello.java | 7 - .../2082945465/week01/src/MyArrayList.java | 79 - group04/2082945465/week01/src/MyIterator.java | 9 - .../2082945465/week01/src/MyLinkedList.java | 111 -- group04/2082945465/week01/src/MyList.java | 12 - group04/2082945465/week01/src/MyQueue.java | 20 - group04/2082945465/week01/src/MyStack.java | 26 - group04/24658892/.classpath | 6 - group04/24658892/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - group04/24658892/learnjava/build.gradle | 14 - .../gradle/wrapper/gradle-wrapper.properties | 6 - group04/24658892/learnjava/gradlew | 169 --- group04/24658892/learnjava/gradlew.bat | 84 -- group04/24658892/learnjava/settings.gradle | 2 - .../main/java/com/coding/basic/ArrayList.java | 77 - .../java/com/coding/basic/BinaryTreeNode.java | 32 - .../main/java/com/coding/basic/Iterator.java | 7 - .../java/com/coding/basic/LinkedList.java | 46 - .../src/main/java/com/coding/basic/List.java | 9 - .../src/main/java/com/coding/basic/Queue.java | 24 - .../src/main/java/com/coding/basic/Stack.java | 36 - .../java/com/coding/basic/ArrayListTest.java | 114 -- .../java/com/coding/basic/LinkedListTest.java | 57 - group04/274407594/226/.classpath | 6 - group04/274407594/226/.gitignore | 1 - group04/274407594/226/.project | 17 - .../226/.settings/org.eclipse.jdt.core.prefs | 11 - ...64\347\232\204\345\205\263\347\263\273.md" | 29 - group04/312816708/coding/coding01/.gitignore | 7 - group04/312816708/coding/coding01/pom.xml | 12 - .../com/kevin/coding01/basic/MyArrayList.java | 117 -- .../kevin/coding01/basic/MyLinkedList.java | 135 -- .../java/com/kevin/coding01/basic/MyList.java | 17 - .../com/kevin/coding01/basic/MyQueue.java | 35 - .../com/kevin/coding01/basic/MyStack.java | 67 - ...\347\233\230\346\214\207\344\273\244.docx" | Bin 11099 -> 0 bytes .../src/Collection/Onehomework/ArrayList.java | 101 -- .../Onehomework/BinaryTreeNode.java | 79 - .../src/Collection/Onehomework/Iterator.java | 7 - .../Collection/Onehomework/LinkedList.java | 170 --- .../src/Collection/Onehomework/List.java | 9 - .../src/Collection/Onehomework/Queue.java | 29 - .../src/Collection/Onehomework/Stack.java | 34 - .../src/com/coding/basic/ArrayList.java | 73 - .../src/com/coding/basic/Iterator.java | 9 - .../src/com/coding/basic/LinkedList.java | 79 - .../351121278/src/com/coding/basic/List.java | 9 - .../351121278/src/com/coding/basic/Queue.java | 23 - .../351121278/src/com/coding/basic/Stack.java | 24 - group04/474772605/.classpath | 7 - group04/474772605/.gitignore | 1 - group04/474772605/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coding/basic/ArrayList.java | 85 -- .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Dinkedlist.java | 22 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 155 -- .../474772605/src/com/coding/basic/List.java | 9 - .../474772605/src/com/coding/basic/Queue.java | 42 - .../474772605/src/com/coding/basic/Stack.java | 31 - .../src/com/coding/basic/testarraylist.java | 22 - group04/498654356/one/.classpath | 8 - group04/498654356/one/.gitignore | 1 - group04/498654356/one/.project | 17 - .../one/src/org/coding/one/ArrayList.java | 95 -- .../src/org/coding/one/BinaryTreeNode.java | 62 - .../one/src/org/coding/one/LinkedList.java | 138 -- .../one/src/org/coding/one/List.java | 16 - .../one/src/org/coding/one/Queue.java | 22 - .../one/src/org/coding/one/Stack.java | 26 - .../one/test/org/coding/one/AllTests.java | 11 - .../test/org/coding/one/ArrayListTest.java | 95 -- .../org/coding/one/BinaryTreeNodeTest.java | 45 - .../test/org/coding/one/LinkedListTest.java | 194 --- .../one/test/org/coding/one/QueueTest.java | 60 - .../one/test/org/coding/one/StackTest.java | 70 - group04/564451732/.classpath | 7 - group04/564451732/.gitignore | 1 - group04/564451732/.project | 17 - group04/564451732/src/DataStructureTest.java | 114 -- group04/564451732/src/Test.java | 8 - group04/564451732/src/hw1/ArrayListImpl.java | 88 -- group04/564451732/src/hw1/BinaryTreeNode.java | 71 - group04/564451732/src/hw1/Iterator.java | 7 - group04/564451732/src/hw1/LinkedList.java | 117 -- group04/564451732/src/hw1/List.java | 9 - group04/564451732/src/hw1/QueueImpl.java | 21 - group04/564451732/src/hw1/StackImpl.java | 23 - .../project_basic_001/.gitignore | 44 - .../project_basic_001/pom.xml | 25 - .../main/java/com/coding/basic/ArrayList.java | 119 -- .../java/com/coding/basic/BinaryTreeNode.java | 84 -- .../main/java/com/coding/basic/Iterator.java | 7 - .../java/com/coding/basic/LinkedList.java | 134 -- .../src/main/java/com/coding/basic/List.java | 9 - .../src/main/java/com/coding/basic/Queue.java | 27 - .../src/main/java/com/coding/basic/Stack.java | 28 - .../com/sunline/project_basic_001/App.java | 15 - .../test/java/com/coding/basic/TestBasic.java | 92 -- .../sunline/project_basic_001/AppTest.java | 38 - group04/844028312/.gitignore | 1 - group04/844028312/one/.classpath | 7 - group04/844028312/one/.gitignore | 1 - group04/844028312/one/.project | 17 - .../one/src/com/coding/basic/ArrayList.java | 97 -- .../src/com/coding/basic/BinaryTreeNode.java | 145 -- .../one/src/com/coding/basic/Iterator.java | 7 - .../one/src/com/coding/basic/JavaTest.java | 89 -- .../one/src/com/coding/basic/LinkedList.java | 195 --- .../one/src/com/coding/basic/List.java | 9 - .../one/src/com/coding/basic/Queue.java | 24 - .../one/src/com/coding/basic/Stack.java | 28 - .../src/com/coding/test/ArrayListTest.java | 60 - .../com/coding/test/BinaryTreeNodeTest.java | 28 - .../src/com/coding/test/LinkedListTest.java | 66 - .../one/src/com/coding/test/QueueTest.java | 35 - .../one/src/com/coding/test/StackTest.java | 40 - group04/916758663/learn01/.gitignore | 21 - group04/916758663/learn01/learn01.iml | 17 - group04/916758663/learn01/pom.xml | 32 - .../main/java/com/coding/basic/ArrayList.java | 73 - .../java/com/coding/basic/BinaryTreeNode.java | 32 - .../main/java/com/coding/basic/Iterator.java | 7 - .../java/com/coding/basic/LinkedList.java | 117 -- .../src/main/java/com/coding/basic/List.java | 9 - .../src/main/java/com/coding/basic/Queue.java | 22 - .../src/main/java/com/coding/basic/Stack.java | 23 - .../java/com/coding/basic/ArrayListTest.java | 68 - .../com/coding/basic/JavaArrayListTest.java | 21 - .../java/com/coding/basic/LinkedListTest.java | 64 - .../test/java/com/coding/basic/QueueTest.java | 29 - .../test/java/com/coding/basic/StackTest.java | 29 - group04/group04.md | 1 - group05/1026626960/.classpath | 6 - group05/1026626960/.gitignore | 1 - group05/1026626960/.project | 17 - .../1026626960/src/cn/study1/myIterator.java | 5 - group05/1026626960/src/cn/study1/myQueue.java | 38 - group05/1026626960/src/cn/study1/myStack.java | 29 - group05/1094051862/test01/.classpath | 7 - group05/1094051862/test01/.gitignore | 1 - group05/1094051862/test01/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 12 - .../test01/src/com/coding/basic/.gitignore | 0 .../src/com/coding/basic/ArrayList.java | 79 - .../src/com/coding/basic/ArrayListTest.java | 31 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../test01/src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 149 -- .../src/com/coding/basic/LinkedListTest.java | 36 - .../test01/src/com/coding/basic/List.java | 10 - .../test01/src/com/coding/basic/Queue.java | 25 - .../src/com/coding/basic/QueueTest.java | 26 - .../test01/src/com/coding/basic/Stack.java | 28 - .../src/com/coding/basic/StackTest.java | 26 - group05/1377699408/.gitignore | 4 - .../20170226/src/list/ArrayList.java" | 54 - .../20170226/src/test/ArrayListTest.java" | 59 - group05/183127807/HomeWork0226/.idea/misc.xml | 22 - .../183127807/HomeWork0226/.idea/modules.xml | 8 - group05/183127807/HomeWork0226/.idea/vcs.xml | 6 - .../HomeWork0226/.idea/workspace.xml | 1056 -------------- .../183127807/HomeWork0226/HomeWork0226.iml | 11 - .../src/com/coding/basic/ArrayList.java | 85 -- .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 142 -- .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 22 - .../src/com/coding/basic/Stack.java | 35 - group05/284422826/.gitignore | 9 - .../coding2017/basic/ArrayList.java | 132 -- .../coding2017/basic/BinaryTreeNode.java | 37 - .../coding2017/basic/Iterator.java | 7 - .../coding2017/basic/LinkedList.java | 168 --- .../zhanglifeng/coding2017/basic/List.java | 9 - .../zhanglifeng/coding2017/basic/Queue.java | 25 - .../zhanglifeng/coding2017/basic/Stack.java | 31 - group05/371492887/task_01/.classpath | 7 - group05/371492887/task_01/.gitignore | 1 - group05/371492887/task_01/.project | 17 - .../src/com/nitasty/test/ArrayListTest.java | 95 -- .../src/com/nitasty/test/BinaryTreeTest.java | 66 - .../src/com/nitasty/test/LinkedListTest.java | 142 -- .../src/com/nitasty/test/QueueTest.java | 49 - .../src/com/nitasty/test/StackTest.java | 51 - .../src/com/nitasty/util/ArrayList.java | 307 ---- .../src/com/nitasty/util/BinaryTree.java | 190 --- .../src/com/nitasty/util/BinaryTreeNode.java | 43 - .../src/com/nitasty/util/Iterator.java | 7 - .../src/com/nitasty/util/LinkedList.java | 393 ----- .../task_01/src/com/nitasty/util/List.java | 46 - .../task_01/src/com/nitasty/util/Queue.java | 27 - .../task_01/src/com/nitasty/util/Stack.java | 31 - group05/399258474/.classpath | 7 - group05/399258474/.gitignore | 1 - group05/399258474/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coding/basic/ArrayList.java | 71 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 104 -- .../399258474/src/com/coding/basic/List.java | 9 - .../399258474/src/com/coding/basic/Queue.java | 35 - .../399258474/src/com/coding/basic/Stack.java | 39 - group05/399258474/src/test/BasicTest.java | 78 - group05/441517454/work1/.classpath | 6 - group05/441517454/work1/.gitignore | 1 - group05/441517454/work1/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../work1/src/com/coding/basic/ArrayList.java | 106 -- .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../work1/src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 156 -- .../work1/src/com/coding/basic/List.java | 9 - .../work1/src/com/coding/basic/Queue.java | 30 - .../work1/src/com/coding/basic/Stack.java | 30 - .../work1/src/com/coding/basic/Test1.java | 48 - .../515505513/RemoteSystemsTempFiles/.project | 12 - group05/515505513/Task01/.classpath | 6 - group05/515505513/Task01/.gitignore | 1 - group05/515505513/Task01/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coding/basic/ArrayList.java | 78 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../Task01/src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 48 - .../Task01/src/com/coding/basic/List.java | 9 - .../Task01/src/com/coding/basic/Queue.java | 49 - .../Task01/src/com/coding/basic/Stack.java | 49 - .../src/com/coding/basic/TestExample.java | 27 - group05/578505552/.gitignore | 17 - group05/578505552/578505552.iml | 16 - group05/578505552/pom.xml | 24 - .../main/java/com/coding/basic/ArrayList.java | 103 -- .../java/com/coding/basic/BinaryTreeNode.java | 57 - .../main/java/com/coding/basic/Iterator.java | 11 - .../java/com/coding/basic/LinkedList.java | 156 -- .../src/main/java/com/coding/basic/List.java | 13 - .../src/main/java/com/coding/basic/Queue.java | 90 -- .../src/main/java/com/coding/basic/Stack.java | 63 - group05/578505552/src/test/java/JavaTest.java | 25 - .../java/com/coding/basic/ArrayListTest.java | 97 -- .../test/java/com/coding/basic/QueueTest.java | 75 - .../test/java/com/coding/basic/StackTest.java | 65 - .../job_2017_02_19_data_structure/.gitignore | 7 - .../job_2017_02_19_data_structure.iml | 21 - .../com/java/xiaoqin/impl/ArrayListImpl.java | 127 -- .../com/java/xiaoqin/impl/BinaryTreeNode.java | 82 -- .../com/java/xiaoqin/impl/LinkedListImpl.java | 202 --- .../src/com/java/xiaoqin/impl/StackImpl.java | 60 - .../java/xiaoqin/interfaces/IIterator.java | 19 - .../com/java/xiaoqin/interfaces/IList.java | 53 - .../com/java/xiaoqin/interfaces/IQueue.java | 15 - .../java/xiaoqin/impl/ArrayListImplTest.java | 107 -- .../java/xiaoqin/impl/BinaryTreeNodeTest.java | 46 - .../com/java/xiaoqin/impl/IQueueImplTest.java | 77 - .../com/java/xiaoqin/impl/IStackImplTest.java | 90 -- .../java/xiaoqin/impl/LinkedListImplTest.java | 108 -- group05/810574652/.classpath | 6 - group05/810574652/.gitignore | 1 - group05/810574652/.project | 17 - .../PingPi357/coding2017/basic/ArrayList.java | 81 -- .../coding2017/basic/LinkedList.java | 131 -- .../PingPi357/coding2017/basic/List.java | 17 - .../PingPi357/coding2017/basic/Queue.java | 18 - .../PingPi357/coding2017/basic/Stack.java | 33 - .../basic/\350\257\264\346\230\216" | 2 - group05/group05.md | 1 - group06/group06.md | 1 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - group07/1536161030/.classpath | 6 - group07/1536161030/.gitignore | 22 - group07/1536161030/.project | 17 - .../org.eclipse.core.resources.prefs | 2 - ...\347\233\230,\346\214\207\344\273\244.txt" | 12 - .../git\345\221\275\344\273\244.txt" | 11 - .../src/com/coding/basic/ArrayList.java | 95 -- .../src/com/coding/basic/BinaryTreeNode.java | 75 - .../src/com/coding/basic/Iterator.java | 8 - .../src/com/coding/basic/LinkedList.java | 139 -- .../1536161030/src/com/coding/basic/List.java | 13 - .../src/com/coding/basic/Queue.java | 72 - .../src/com/coding/basic/Stack.java | 47 - .../src/com/coding/test/ArrayListTest.java | 70 - .../com/coding/test/BinaryTreeNodeTest.java | 19 - .../src/com/coding/test/LinkedListTest.java | 68 - .../src/com/coding/test/QueueTest.java | 47 - .../src/com/coding/test/StackTest.java | 58 - .../git\345\221\275\344\273\244.txt" | 11 - .../20409287/git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - group07/2306826375/txt | 1 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../43819473/git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - group07/476770768/MyDataStructure/.classpath | 6 - group07/476770768/MyDataStructure/.gitignore | 17 - group07/476770768/MyDataStructure/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coding/basic/BinaryTreeNode.java | 44 - .../src/com/coding/basic/MyArrayList.java | 149 -- .../src/com/coding/basic/MyIterator.java | 6 - .../src/com/coding/basic/MyLinkedList.java | 223 --- .../src/com/coding/basic/MyList.java | 9 - .../src/com/coding/basic/MyQueue.java | 30 - .../src/com/coding/basic/MyStack.java | 44 - .../src/com/coding/basic/testFile.java | 23 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - group07/562247675/homework/.gitignore | 22 - .../562247675/homework/homework-0226/pom.xml | 22 - .../group7/homework/c0226/MyArrayList.java | 98 -- .../homework/c0226/MyArrayListTest.java | 71 - .../homework/c0226/MyBinaryTreeNode.java | 52 - .../homework/c0226/MyBinaryTreeNodeTest.java | 34 - .../group7/homework/c0226/MyIterator.java | 8 - .../group7/homework/c0226/MyLinkedList.java | 150 -- .../homework/c0226/MyLinkedListTest.java | 108 -- .../group7/homework/c0226/MyList.java | 13 - .../group7/homework/c0226/MyQueue.java | 35 - .../group7/homework/c0226/MyQueueTest.java | 48 - .../group7/homework/c0226/MyStack.java | 40 - .../group7/homework/c0226/MyStackTest.java | 50 - .../src/main/resources/readme.md | 0 .../src/test/resources/readme.md | 0 group07/562247675/homework/pom.xml | 53 - group07/562247675/homework/readme.md | 1 - group07/562247675/notebook/readme.md | 1 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - .../git\345\221\275\344\273\244.txt" | 11 - group07/764189149/.classpath | 6 - group07/764189149/.gitignore | 23 - group07/764189149/.project | 17 - .../src/firstHomeWork/util/ArrayList.java | 197 --- .../firstHomeWork/util/BinaryTreeNode.java | 31 - .../firstHomeWork/util/DoubleLinkedList.java | 335 ----- .../src/firstHomeWork/util/Iterator.java | 30 - .../src/firstHomeWork/util/List.java | 87 -- .../src/firstHomeWork/util/Queue.java | 59 - .../src/firstHomeWork/util/Stack.java | 23 - .../git\345\221\275\344\273\244.txt" | 11 - group07/770164810/test.txt | 1 - group07/group07.md | 1 - .../2-26/com/coding/basic/ArrayList.java | 119 -- .../2-26/com/coding/basic/BinaryTreeNode.java | 56 - .../2-26/com/coding/basic/Iterator.java | 9 - .../2-26/com/coding/basic/LinkedList.java | 174 --- .../108621969/2-26/com/coding/basic/List.java | 12 - .../2-26/com/coding/basic/Queue.java | 33 - .../2-26/com/coding/basic/Stack.java | 40 - group08/108621969/README.md | 7 - .../article/Comp-Units-Relations(2-16).md | 14 - group08/1144989424/Readme.md | 3 - group08/1144989424/firstPractice/readme.md | 4 - .../src/basic/BinaryTreeNode.java | 49 - .../firstPractice/src/basic/MyArrayList.java | 97 -- .../firstPractice/src/basic/MyIterator.java | 7 - .../firstPractice/src/basic/MyLinkedList.java | 113 -- .../firstPractice/src/basic/MyList.java | 9 - .../firstPractice/src/basic/MyQueue.java | 31 - .../src/basic/MySortBinaryTree.java | 81 -- .../firstPractice/src/basic/MyStack.java | 33 - ...13\351\227\264\345\205\263\347\263\273.md" | 8 - .../0226/src/com/my/list/ArrayList.java | 131 -- .../0226/src/com/my/list/LinkedList.java | 156 -- .../121027265/0226/src/com/my/list/Test.java | 65 - group08/121027265/README.md | 3 - group08/1226637491/2_26/ArrayList.java | 95 -- group08/1226637491/2_26/LinkedList.java | 127 -- group08/1226637491/2_26/Queue.java | 39 - group08/1226637491/2_26/Stack.java | 44 - ...0\347\232\204\347\275\221\345\235\200.txt" | 1 - group08/125980622/125980622.js | 1 - group08/125980622/first_hw/ArrayList.java | 44 - .../125980622/first_hw/BinaryTreeNode.java | 52 - group08/125980622/first_hw/Iterator.java | 4 - group08/125980622/first_hw/LinkedList.java | 90 -- group08/125980622/first_hw/List.java | 7 - group08/125980622/first_hw/Queue.java | 21 - group08/125980622/first_hw/Stack.java | 24 - group08/125980622/first_hw/myIterator.java | 37 - group08/1277959541/1277959541 | 1 - group08/1287324781/1287324781 | 1 - .../02-26/com/xuyangyang/util/BinaryTree.java | 65 - .../com/xuyangyang/util/MyArrayList.java | 113 -- .../02-26/com/xuyangyang/util/MyIterator.java | 8 - .../com/xuyangyang/util/MyLinkedList.java | 277 ---- .../02-26/com/xuyangyang/util/MyList.java | 14 - .../com/xuyangyang/util/MyQueueArray.java | 107 -- .../com/xuyangyang/util/MyQueueLinked.java | 139 -- .../02-26/com/xuyangyang/util/MyStack.java | 95 -- .../02-26/com/xuyangyang/util/Test.java | 29 - ...4\347\232\204\345\205\263\347\263\273.txt" | 16 - ...6\200\345\215\225\346\246\202\350\277\260" | 1 - group08/1425809544/1425809544.md | 1 - group08/1509102580/2.27/ArrayList.java | 103 -- group08/1509102580/2.27/Iterator.java | 7 - group08/1509102580/2.27/LinkedList.java | 196 --- group08/1509102580/2.27/List.java | 9 - group08/1509102580/2.27/Queue.java | 33 - group08/1509102580/2.27/Stack.java | 38 - .../1509102580/2.27/\346\226\207\347\253\240" | 25 - group08/2420826330/2420826330.md | 1 - group08/283677872/2-26/.classpath | 6 - group08/283677872/2-26/.gitignore | 1 - group08/283677872/2-26/.project | 17 - ...\344\273\244\345\205\263\347\263\273.docx" | Bin 865923 -> 0 bytes .../2-26/src/com/coding/basic/ArrayList.java | 70 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../2-26/src/com/coding/basic/Iterator.java | 7 - .../2-26/src/com/coding/basic/LinkedList.java | 130 -- .../2-26/src/com/coding/basic/List.java | 9 - .../2-26/src/com/coding/basic/Main.java | 19 - .../2-26/src/com/coding/basic/Queue.java | 25 - .../2-26/src/com/coding/basic/Stack.java | 31 - ...72\346\234\254\347\273\223\346\236\204.md" | 54 - .../first/collection/AbstractCollection.java | 25 - .../homework/first/collection/Collection.java | 42 - .../homework/first/collection/Iterator.java | 23 - .../first/collection/list/ArrayList.java | 166 --- .../first/collection/list/LinkedList.java | 240 --- .../homework/first/collection/list/List.java | 14 - .../first/collection/queue/LinkQueue.java | 202 --- .../first/collection/queue/Queue.java | 26 - .../first/collection/stack/LinkStack.java | 94 -- .../first/collection/stack/Stack.java | 22 - .../homework/first/tree/AbstractTree.java | 29 - .../homework/first/tree/BinaryNode.java | 40 - .../homework/first/tree/BinaryTree.java | 125 -- .../practice/homework/first/tree/Tree.java | 30 - .../com/pop/practice/homework/utils/Math.java | 29 - group08/286060098/readme.md | 17 - group08/406166841/2-26/CPU.md | 76 - group08/406166841/2-26/CustomArrayList.java | 92 -- group08/406166841/2-26/CustomLinkedList.java | 172 --- group08/406166841/2-26/CustomQueue.java | 51 - group08/406166841/2-26/CustomStack.java | 70 - group08/406166841/2-26/Iterator.java | 10 - group08/406166841/2-26/List.java | 13 - group08/406166841/406166841.md | 1 - .../com/coding/basic/ArrayList.java" | 92 -- .../com/coding/basic/BinaryTreeNode.java" | 32 - .../com/coding/basic/Iterator.java" | 7 - .../com/coding/basic/LinkedList.java" | 143 -- .../com/coding/basic/List.java" | 9 - .../com/coding/basic/Queue.java" | 25 - .../com/coding/basic/Stack.java" | 30 - .../com/coding/basic/Test.java" | 15 - ...4\346\210\220\345\216\237\347\220\206.doc" | Bin 10240 -> 0 bytes ...4\347\232\204\345\205\263\347\263\273.pdf" | Bin 63305 -> 0 bytes .../2-26/code/com/coding/basic/ArrayList.java | 80 - .../code/com/coding/basic/BinaryTreeNode.java | 47 - .../2-26/code/com/coding/basic/Iterator.java | 7 - .../code/com/coding/basic/LinkedList.java | 137 -- .../2-26/code/com/coding/basic/List.java | 9 - .../2-26/code/com/coding/basic/Queue.java | 22 - .../2-26/code/com/coding/basic/Stack.java | 23 - .../2-26/code/com/coding/test/Main.java | 103 -- group08/619057560/CHHSAlex.md | 1 - group08/648354678/README.md | 4 - group08/649859235/2-26/article.md | 2 - .../2-26/com/vvv/base/ArrayList.java | 68 - .../2-26/com/vvv/base/BinaryTreeNode.java | 37 - .../649859235/2-26/com/vvv/base/IList.java | 9 - .../2-26/com/vvv/base/LinkedList.java | 117 -- .../649859235/2-26/com/vvv/base/Queue.java | 73 - .../649859235/2-26/com/vvv/base/Stack.java | 30 - group08/649859235/README.md | 1 - group08/729770920/.gitignore | 1 - group08/729770920/2-26/resource/report.txt | 5 - .../2-26/src/com/coding/basic/ArrayList.java | 111 -- .../2-26/src/com/coding/basic/BinaryTree.java | 105 -- .../2-26/src/com/coding/basic/Iterator.java | 9 - .../2-26/src/com/coding/basic/LinkedList.java | 164 --- .../2-26/src/com/coding/basic/List.java | 19 - .../2-26/src/com/coding/basic/Queue.java | 21 - .../2-26/src/com/coding/basic/Stack.java | 25 - group08/729770920/README.md | 0 group08/769638826/2-27/ArrayList.java | 111 -- group08/769638826/2-27/ArrayListTest.java | 74 - group08/769638826/2-27/Iterator.java | 13 - group08/769638826/2-27/LinkedList.java | 190 --- group08/769638826/2-27/LinkedListTest.java | 10 - group08/769638826/2-27/List.java | 19 - group08/769638826/2-27/Queue.java | 26 - group08/769638826/2-27/QueueTest.java | 10 - group08/769638826/2-27/Stack.java | 32 - group08/769638826/2-27/StackTest.java | 9 - group08/769638826/README.md | 1 - group08/782476895/20170225/ArrayList.java | 55 - group08/782476895/20170225/LinkedList.java | 127 -- group08/782476895/20170225/List.java | 9 - group08/782476895/20170225/Queue.java | 65 - group08/782476895/20170225/Stack.java | 31 - ...\347\232\204\345\205\263\347\263\273.docx" | Bin 6797 -> 0 bytes group08/875325254/2-26/ArrayList.java | 37 - group08/875325254/2-26/LinkList.java | 73 - group08/875325254/2-26/Queue.java | 41 - group08/875325254/2-26/Stack.java | 29 - group08/875325254/2-26/Test.java | 35 - group08/875325254/875325254.md | 1 - group08/group08.md | 1 - group09/group09.md | 1 - .../ArrayList.java" | 119 -- .../BinaryTreeNode.java" | 68 - .../Iterator.java" | 6 - .../JavaTest.java" | 62 - .../LinkedList.java" | 165 --- .../List.java" | 10 - .../Queue.java" | 30 - .../Stack.java" | 30 - .../src/com/coding/week1/ArrayList.java | 96 -- .../src/com/coding/week1/BinaryTreeNode.java | 53 - .../src/com/coding/week1/Iterator.java | 6 - .../src/com/coding/week1/LinkedList.java | 162 --- .../205301442/src/com/coding/week1/List.java | 9 - .../205301442/src/com/coding/week1/Queue.java | 23 - .../205301442/src/com/coding/week1/Stack.java | 28 - .../test/com/coding/week1/AllTests.java | 11 - .../test/com/coding/week1/TestArrayList.java | 31 - .../com/coding/week1/TestBiranyTreeNode.java | 21 - .../test/com/coding/week1/TestLinkedList.java | 42 - .../test/com/coding/week1/TestQueue.java | 17 - .../test/com/coding/week1/TestStack.java | 23 - ...7\347\253\240\345\234\260\345\235\200.txt" | 1 - group10/3314793852/.classpath | 6 - group10/3314793852/.gitignore | 1 - group10/3314793852/.project | 17 - .../3314793852/src/myList/MyArrayList.java | 103 -- .../src/myList/MyBinarySearchTree.java | 113 -- group10/3314793852/src/myList/MyIterator.java | 40 - .../3314793852/src/myList/MyLinkedList.java | 122 -- group10/3314793852/src/myList/MyQueue.java | 60 - group10/3314793852/src/myList/MyStack.java | 48 - group10/3314793852/src/myList/Test.java | 26 - group10/353261578/.classpath | 8 - group10/353261578/.gitignore | 1 - group10/353261578/.project | 17 - .../src/com/sx/structures/BinaryNode.java | 44 - .../src/com/sx/structures/BinaryTree.java | 74 - .../src/com/sx/structures/Iterator.java | 6 - .../src/com/sx/structures/MyArrayList.java | 83 -- .../src/com/sx/structures/MyLinkedList.java | 105 -- .../src/com/sx/structures/MyList.java | 13 - .../src/com/sx/structures/MyQueue.java | 25 - .../src/com/sx/structures/MyStack.java | 37 - .../test/com/test/BinaryTreeTest.java | 31 - .../test/com/test/MyArrayListTest.java | 64 - .../test/com/test/MyLinkedListTest.java | 83 -- .../353261578/test/com/test/StaQueTest.java | 44 - group10/364298692/article.md | 3 - group10/364298692/cs/.classpath | 6 - group10/364298692/cs/.gitignore | 1 - group10/364298692/cs/.project | 17 - .../cs/.settings/org.eclipse.jdt.core.prefs | 11 - .../cs/src/com/coding/basic/ArrayList.java | 75 - .../src/com/coding/basic/BinaryTreeNode.java | 41 - .../cs/src/com/coding/basic/Iterator.java | 7 - .../cs/src/com/coding/basic/LinkedList.java | 92 -- .../cs/src/com/coding/basic/List.java | 9 - .../cs/src/com/coding/basic/Queue.java | 23 - .../cs/src/com/coding/basic/Stack.java | 25 - group10/569420966/struct/pom.xml | 12 - .../src/main/java/com/myutil/ArrayList.java | 162 --- .../main/java/com/myutil/BinaryTreeNode.java | 167 --- .../src/main/java/com/myutil/Iterator.java | 28 - .../src/main/java/com/myutil/LinkedList.java | 207 --- .../struct/src/main/java/com/myutil/List.java | 52 - .../src/main/java/com/myutil/Queue.java | 44 - .../src/main/java/com/myutil/Stack.java | 61 - group10/584709796/worka/.classpath | 7 - group10/584709796/worka/.gitignore | 1 - group10/584709796/worka/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../worka/src/com/coding/basic/ArrayList.java | 75 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../worka/src/com/coding/basic/DemoTest.java | 72 - .../worka/src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 168 --- .../worka/src/com/coding/basic/List.java | 9 - .../worka/src/com/coding/basic/Queue.java | 24 - .../worka/src/com/coding/basic/ReadMe.txt | 11 - .../worka/src/com/coding/basic/Stack.java | 49 - ...46\214\207\344\273\244\343\200\201cpu.pdf" | Bin 180260 -> 0 bytes group10/595128841/Readme.txt | 1 - group10/595128841/src/org/le/ArrayList.java | 144 -- group10/595128841/src/org/le/LinkedList.java | 299 ---- group10/595128841/src/org/le/List.java | 19 - .../src/com/coding/basic/ArrayList.java | 89 -- .../src/com/coding/basic/ArrayListTest.java | 66 - .../src/com/coding/basic/LinkedList.java | 143 -- .../src/com/coding/basic/LinkedListTest.java | 100 -- .../630505243/src/com/coding/basic/List.java | 9 - .../com/hmily/learning/BinaryTreeNode.java | 31 - .../src/com/hmily/learning/Iterator.java | 7 - .../src/com/hmily/learning/LinkedList.java | 91 -- .../learning/src/com/hmily/learning/List.java | 8 - .../src/com/hmily/learning/MyArrayList.java | 91 -- .../src/com/hmily/learning/MyQueue.java | 23 - .../src/com/hmily/learning/MyStack.java | 26 - .../learning/src/com/hmily/test/MyTest.java | 9 - group10/875867419/.classpath | 6 - group10/875867419/.gitignore | 1 - group10/875867419/.project | 17 - .../src/com/work/week01/MyArrayList.java | 203 --- .../src/com/work/week01/MyBinaryTree.java | 82 -- .../src/com/work/week01/MyIterator.java | 6 - .../src/com/work/week01/MyLinkedList.java | 169 --- .../875867419/src/com/work/week01/MyList.java | 11 - .../src/com/work/week01/MyQueue.java | 38 - .../src/com/work/week01/MyStack.java | 43 - ...4\344\270\232\345\234\260\345\235\200.txt" | 1 - group10/group10.md | 1 - group11/1178243325/DataStructure/build.gradle | 10 - group11/1178243325/DataStructure/readme.md | 1 - .../src/main/java/com/coding/Main.java | 58 - .../main/java/com/coding/basic/ArrayList.java | 97 -- .../java/com/coding/basic/BinaryTreeNode.java | 32 - .../main/java/com/coding/basic/Iterator.java | 6 - .../java/com/coding/basic/LinkedList.java | 135 -- .../src/main/java/com/coding/basic/List.java | 9 - .../src/main/java/com/coding/basic/Queue.java | 30 - .../src/main/java/com/coding/basic/Stack.java | 38 - .../ConcurrentModificationException.java | 9 - .../basic/exception/EmptyQueueException.java | 8 - .../basic/exception/EmptyStackException.java | 8 - group11/1310368322/GitHub/.gitignore | 1 - group11/1310368322/GitHub/src/ArrayList.java | 79 - group11/1310368322/GitHub/src/testGitHub.java | 7 - group11/171535320/ArrayList.java | 62 - group11/171535320/BinaryTreeNode.java | 43 - group11/171535320/Iterator.java | 5 - group11/171535320/LinkedList.java | 152 -- group11/171535320/List.java | 7 - group11/171535320/stackANDqueue/Queue.java | 34 - group11/171535320/stackANDqueue/Stack.java | 52 - group11/252308879/dataStructure/.gitignore | 10 - group11/252308879/dataStructure/pom.xml | 25 - .../org/apn/coding2017/basic/ArrayList.java | 212 --- .../apn/coding2017/basic/BinaryTreeNode.java | 76 - .../org/apn/coding2017/basic/Iterator.java | 12 - .../org/apn/coding2017/basic/LinkedList.java | 121 -- .../java/org/apn/coding2017/basic/List.java | 24 - .../java/org/apn/coding2017/basic/Queue.java | 50 - .../java/org/apn/coding2017/basic/Stack.java | 51 - .../java/org/apn/coding2017/basic/Stack2.java | 47 - .../apn/coding2017/TestJavaUtilArrayList.java | 31 - .../apn/coding2017/basic/ArrayListTest.java | 76 - .../coding2017/basic/BinaryTreeNodeTest.java | 40 - .../apn/coding2017/basic/LinkedListTest.java | 82 -- .../org/apn/coding2017/basic/QueueTest.java | 46 - .../org/apn/coding2017/basic/StackTest.java | 47 - .../src/com/coding/basic/ArrayList.java | 113 -- .../src/com/coding/basic/BinaryTreeNode.java | 89 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 178 --- .../283091182/src/com/coding/basic/List.java | 9 - .../283091182/src/com/coding/basic/Queue.java | 42 - .../283091182/src/com/coding/basic/Stack.java | 48 - group11/395443277/data_structure/.gitignore | 111 -- .../src/com/coding/basic/ArrayList.java | 82 -- .../src/com/coding/basic/ArrayListTest.java | 84 -- .../src/com/coding/basic/BinaryTreeNode.java | 75 - .../com/coding/basic/BinaryTreeNodeTest.java | 40 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 156 -- .../src/com/coding/basic/LinkedListTest.java | 127 -- .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 21 - .../src/com/coding/basic/QueueTest.java | 29 - .../src/com/coding/basic/Stack.java | 23 - .../src/com/coding/basic/StackTest.java | 45 - group11/635189253/dataStructure/.classpath | 6 - group11/635189253/dataStructure/.gitignore | 1 - group11/635189253/dataStructure/.project | 17 - .../src/com/coding/basic/ArrayList.java | 74 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Iterator.java | 6 - .../src/com/coding/basic/LinkedList.java | 191 --- .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 22 - .../src/com/coding/basic/Stack.java | 22 - .../src/main/coding_170225/ArrayList.java | 86 -- .../src/main/coding_170225/BinaryTree.java | 57 - .../main/coding_170225/BinaryTreeNode.java | 40 - .../src/main/coding_170225/Iterator.java | 9 - .../src/main/coding_170225/LinkedList.java | 113 -- .../src/main/coding_170225/Queue.java | 23 - .../src/main/coding_170225/Stack.java | 27 - .../main/coding_170225/ArrayListTest.java | 39 - .../main/coding_170225/BinaryTreeTest.java | 37 - group11/996108220/.classpath | 6 - group11/996108220/.gitignore | 1 - group11/996108220/.project | 17 - .../src/com/coding/basic/ArrayList.java | 124 -- .../src/com/coding/basic/BinaryTree.java | 129 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 176 --- .../996108220/src/com/coding/basic/List.java | 9 - .../996108220/src/com/coding/basic/Queue.java | 20 - .../996108220/src/com/coding/basic/Stack.java | 24 - group11/group11.md | 1 - group12/2258659044/readme.txt | 1 - .../src/com/coding/basic/ArrayList.java | 94 -- .../src/com/coding/basic/BinaryTree.java | 64 - .../src/com/coding/basic/BinaryTreeNode.java | 37 - .../src/com/coding/basic/Iterator.java | 8 - .../src/com/coding/basic/LinkedList.java | 137 -- .../zj-2017/src/com/coding/basic/List.java | 10 - .../zj-2017/src/com/coding/basic/Queue.java | 26 - .../zj-2017/src/com/coding/basic/Stack.java | 28 - .../test/com/coding/basic/ArrayListTest.java | 109 -- .../test/com/coding/basic/BinaryTreeTest.java | 58 - .../test/com/coding/basic/LinkedListTest.java | 109 -- .../src/test/com/coding/basic/QueueTest.java | 64 - .../src/test/com/coding/basic/StackTest.java | 76 - group12/247565311/week1/ArrayList.java | 249 ---- group12/247565311/week1/Deque.java | 34 - group12/247565311/week1/Link.java | 5 - group12/247565311/week1/LinkedList.java | 266 ---- group12/247565311/week1/Stack.java | 39 - group12/251822722/ArrayList.java | 87 -- group12/251822722/BinaryTreeNode.java | 35 - group12/251822722/Iterator.java | 6 - group12/251822722/LinkedList.java | 51 - group12/251822722/List.java | 11 - group12/251822722/Queue.java | 38 - group12/251822722/Stack.java | 33 - group12/377401843/learning_1/.gitignore | 3 - .../com/guodong/datastructure/ArrayList.java | 171 --- .../guodong/datastructure/BinaryTreeNode.java | 58 - .../com/guodong/datastructure/Iterator.java | 7 - .../com/guodong/datastructure/LinkedList.java | 285 ---- .../src/com/guodong/datastructure/List.java | 14 - .../src/com/guodong/datastructure/Queue.java | 21 - .../src/com/guodong/datastructure/Stack.java | 25 - .../datastructure/test/ArrayListTest.java | 135 -- .../test/BinaryTreeNodeTest.java | 37 - .../datastructure/test/LinkedListTest.java | 143 -- .../guodong/datastructure/test/QueueTest.java | 62 - .../guodong/datastructure/test/StackTest.java | 46 - group12/382266293/.classpath | 7 - group12/382266293/.gitignore | 1 - group12/382266293/.project | 17 - .../src/Collection/AbstractList.java | 43 - .../src/Collection/Concrete/ArrayList.java | 148 -- .../Collection/Concrete/BinaryTreeNode.java | 126 -- .../src/Collection/Concrete/LinkedList.java | 196 --- .../src/Collection/Concrete/Queue.java | 84 -- .../src/Collection/Concrete/Stack.java | 106 -- .../382266293/src/Collection/Iterator.java | 7 - group12/382266293/src/Collection/List.java | 16 - .../src/TestCollection/AllTests.java | 11 - .../src/TestCollection/ArrayListTest.java | 173 --- .../TestCollection/BinaryTreeNodeTest.java | 54 - .../src/TestCollection/LinkedListTest.java | 212 --- .../src/TestCollection/QueueTest.java | 98 -- .../src/TestCollection/StackTest.java | 129 -- group12/382266293/src/test.java | 15 - group12/382266293/src/util/Print.java | 14 - group12/382266293/src/util/TestUtil.java | 78 - group12/441908378/ArrayList.java | 50 - group12/441908378/BinaryTreeNode.java | 47 - group12/441908378/LinkedList.java | 121 -- group12/441908378/Queue.java | 39 - group12/441908378/Stack.java | 30 - .../src/com/coding/basic/ArrayList.java | 121 -- .../src/com/coding/basic/BinaryTreeNode.java | 44 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 225 --- .../446031103/src/com/coding/basic/List.java | 9 - .../446031103/src/com/coding/basic/Queue.java | 68 - .../446031103/src/com/coding/basic/Stack.java | 81 -- group12/495473393/Coding/.gitignore | 1 - .../495473393/Coding/src/Base/ArrayList.java | 32 - .../Coding/src/Base/BinaryTreeNode.java | 32 - .../495473393/Coding/src/Base/Iterator.java | 7 - .../495473393/Coding/src/Base/LinkedList.java | 46 - group12/495473393/Coding/src/Base/List.java | 9 - group12/495473393/Coding/src/Base/Queue.java | 19 - group12/495473393/Coding/src/Base/Stack.java | 22 - group12/563253496/datastructure/.classpath | 6 - group12/563253496/datastructure/.gitignore | 1 - group12/563253496/datastructure/.project | 17 - .../src/Collection/ArrayList.java | 173 --- .../src/Collection/LinkedList.java | 227 --- .../datastructure/src/Collection/Queue.java | 44 - .../datastructure/src/Collection/Stack.java | 55 - .../src/Collection/TestArrayList.java | 33 - .../src/Collection/TestStack.java | 15 - .../src/com/coding/basic/ArrayList.java | 32 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 46 - .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 19 - .../src/com/coding/basic/Stack.java | 22 - group12/group12.md | 1 - group13/group13.md | 1 - .../basicstructuredemo/.classpath" | 7 - .../basicstructuredemo/.gitignore" | 1 - .../basicstructuredemo/.project" | 17 - .../.settings/org.eclipse.jdt.core.prefs" | 11 - .../src/com/maple/basic/ArrayList.java" | 66 - .../src/com/maple/basic/BinaryTree.java" | 45 - .../src/com/maple/basic/BinaryTreeNode.java" | 69 - .../src/com/maple/basic/Iterator.java" | 7 - .../src/com/maple/basic/LinkedList.java" | 154 -- .../src/com/maple/basic/List.java" | 9 - .../src/com/maple/basic/Queue.java" | 21 - .../src/com/maple/basic/Stack.java" | 26 - .../src/com/maple/test/TestAPIDemo.java" | 53 - .../src/com/maple/test/TestAll.java" | 71 - .../src/com/maple/test/TestArrayList.java" | 22 - .../src/com/maple/test/TestMyDemo.java" | 75 - ...\240\351\223\276\346\216\245_20170224.txt" | 5 - group14/187114392/work_1_20170225/.classpath | 6 - group14/187114392/work_1_20170225/.gitignore | 1 - group14/187114392/work_1_20170225/.idea/.name | 1 - .../work_1_20170225/.idea/compiler.xml | 22 - .../.idea/copyright/profiles_settings.xml | 3 - .../work_1_20170225/.idea/encodings.xml | 6 - .../.idea/junitgenerator-prj-settings.xml | 11 - .../187114392/work_1_20170225/.idea/misc.xml | 26 - .../work_1_20170225/.idea/modules.xml | 8 - .../work_1_20170225/.idea/uiDesigner.xml | 124 -- .../work_1_20170225/.idea/work_1_20170225.iml | 9 - .../work_1_20170225/.idea/workspace.xml | 1295 ----------------- group14/187114392/work_1_20170225/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../work_1_20170225/2017Learning.iml | 23 - group14/187114392/work_1_20170225/ReadMe.md | 3 - .../187114392/work_1_20170225/src/Main.java | 31 - .../src/com/coding/basic/ArrayList.java | 73 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 168 --- .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 22 - .../src/com/coding/basic/Stack.java | 37 - .../work_1_20170225/test/ArrayList_Test.java | 52 - .../work_1_20170225/test/LinkedList_Test.java | 122 -- .../work_1_20170225/test/Queue_Test.java | 44 - .../work_1_20170225/test/Stack_Test.java | 72 - .../ArrayList.java" | 67 - .../LinkedList.java" | 128 -- .../Queue.java" | 25 - .../Stack.java" | 33 - ...7\347\253\240\351\223\276\346\216\245.txt" | 1 - group14/254659936/.gitignore | 10 - group14/254659936/src/Main.java | 7 - .../src/com/coding/basic/ArrayList.java | 73 - .../src/com/coding/basic/BinaryTreeNode.java | 69 - .../src/com/coding/basic/Iterator.java | 8 - .../src/com/coding/basic/LinkedList.java | 155 -- .../254659936/src/com/coding/basic/List.java | 13 - .../254659936/src/com/coding/basic/Queue.java | 45 - .../254659936/src/com/coding/basic/Stack.java | 50 - group14/296933284/Note/README.md | 5 - group14/296933284/README.md | 4 - group14/296933284/coding/.classpath | 10 - group14/296933284/coding/.gitignore | 6 - group14/296933284/coding/.project | 17 - .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coderising/array/ArrayUtil.java | 230 --- .../com/coderising/array/ArrayUtilTest.java | 99 -- .../coderising/litestruts/LoginAction.java | 44 - .../src/com/coderising/litestruts/Struts.java | 141 -- .../com/coderising/litestruts/StrutsTest.java | 41 - .../src/com/coderising/litestruts/View.java | 23 - .../src/com/coderising/litestruts/struts.xml | 11 - .../src/com/coding/basic/ArrayList.java | 147 -- .../com/coding/basic/BinarySearchTree.java | 154 -- .../coding/src/com/coding/basic/Iterator.java | 6 - .../coding/src/com/coding/basic/JavaTest.java | 176 --- .../src/com/coding/basic/LinkedList.java | 215 --- .../src/com/coding/basic/LinkedListTest.java | 95 -- .../coding/src/com/coding/basic/List.java | 9 - .../coding/src/com/coding/basic/Queue.java | 50 - .../src/com/coding/basic/QueueTest.java | 53 - .../coding/src/com/coding/basic/Stack.java | 61 - .../src/com/coding/basic/StackTest.java | 55 - group14/352504906/test/.classpath | 6 - group14/352504906/test/.project | 17 - .../org.eclipse.core.resources.prefs | 6 - .../test/.settings/org.eclipse.jdt.core.prefs | 12 - .../src/com/coding/basic/SimpleArrayList.java | 118 -- .../src/com/coding/basic/SimpleIterator.java | 11 - .../com/coding/basic/SimpleLinkedList.java | 126 -- .../test/src/com/coding/basic/SimpleList.java | 14 - .../src/com/coding/basic/SimpleQueue.java | 68 - .../src/com/coding/basic/SimpleStack.java | 76 - ...4\347\232\204\345\205\263\347\263\273.txt" | 1 - group14/598808350/20170219.txt | 5 - .../src/org/learning/container/ArrayList.java | 186 --- .../org/learning/container/LinkedList.java | 183 --- .../src/org/learning/container/Queue.java | 47 - .../src/org/learning/container/Stack.java | 44 - group14/676615845/algo/pom.xml | 18 - .../algo/src/main/java/algo/BinarySearch.java | 17 - .../src/main/java/com/coding/basic/Array.java | 16 - .../main/java/com/coding/basic/ArrayList.java | 73 - .../java/com/coding/basic/BinaryTreeNode.java | 41 - .../main/java/com/coding/basic/Iterator.java | 7 - .../java/com/coding/basic/LinkedList.java | 164 --- .../src/main/java/com/coding/basic/List.java | 9 - .../src/main/java/com/coding/basic/Queue.java | 22 - .../src/main/java/com/coding/basic/Stack.java | 26 - .../src/test/java/algo/BinarySearchTest.java | 26 - .../java/com/coding/basic/ArrayListTest.java | 146 -- .../test/java/com/coding/basic/ArrayTest.java | 30 - .../com/coding/basic/BinaryTreeNodeTest.java | 64 - .../java/com/coding/basic/LinkedListTest.java | 115 -- .../test/java/com/coding/basic/QueueTest.java | 58 - .../test/java/com/coding/basic/StackTest.java | 70 - group14/775857669/.gitignore | 1 - .../src/com/coding/basic/ArrayList.java | 86 -- .../src/com/coding/basic/BinaryTreeNode.java | 52 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/JUnitTest.java | 69 - .../src/com/coding/basic/LinkedList.java | 140 -- .../775857669/src/com/coding/basic/List.java | 9 - .../775857669/src/com/coding/basic/Queue.java | 21 - .../775857669/src/com/coding/basic/Stack.java | 28 - group14/857999411/FirstHomework/.classpath | 7 - group14/857999411/FirstHomework/.gitignore | 1 - group14/857999411/FirstHomework/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coding/basic/MyArrayList.java | 73 - .../src/com/coding/basic/MyLinkedList.java | 138 -- .../src/com/coding/basic/MyList.java | 10 - .../src/com/coding/basic/MyQueue.java | 23 - .../src/com/coding/basic/MyStack.java | 44 - .../src/com/coding/test/MyArrayListTest.java | 34 - .../src/com/coding/test/MyLinkedListTest.java | 38 - .../src/com/coding/test/MyQueueTest.java | 25 - .../src/com/coding/test/MyStackTest.java | 25 - group14/group14.md | 1 - group15/1500_369516660/.classpath | 6 - group15/1500_369516660/.gitignore | 1 - group15/1500_369516660/.project | 17 - .../src/com/arrayList/basic/List.java | 16 - .../com/arrayList/basic/SimpleArrayList.java | 155 -- .../com/arrayList/basic/SimpleLinkedList.java | 38 - .../2017code/src/arraylist.java | 252 ---- .../2017code/src/linkedlist.java | 194 --- .../1501_2535894075/2017code/src/queue.java | 115 -- .../1501_2535894075/2017code/src/stack.java | 71 - .../src/com/coding/basic/ArrayList.java | 77 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 163 --- .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 26 - .../src/com/coding/basic/Stack.java | 30 - .../myCollection/src/ArrayList.java | 99 -- .../myCollection/src/BinaryTreeNode.java | 70 - .../myCollection/src/Iterator.java | 5 - .../myCollection/src/LinkedList.java | 182 --- .../myCollection/src/List.java | 7 - .../myCollection/src/Queue.java | 44 - .../myCollection/src/Stack.java | 53 - .../myCollection/test/BinaryTreeNodeTest.java | 21 - .../1506_1084478979/.classpath | 6 - .../1506_1084478979/.gitignore | 1 - .../1506_1084478979/1506_1084478979/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/banshee/ArrayList.java | 70 - .../src/banshee/LinkedList.java | 154 -- .../1506_1084478979/src/banshee/Queue.java | 20 - .../1506_1084478979/src/banshee/Stack.java | 23 - .../RemoteSystemsTempFiles/.project | 12 - group15/1507_977996067/README.md | 1 - .../1507_977996067/src/task1/MyArrayList.java | 95 -- .../src/task1/MyLinkedList.java | 130 -- group15/1507_977996067/src/task1/MyList.java | 16 - group15/1507_977996067/src/task1/MyQueue.java | 25 - group15/1507_977996067/src/task1/MyStack.java | 29 - group15/1507_977996067/src/task1/README.md | 1 - .../com/bruce/homework0226/ArrayListV00.java | 177 --- .../src/com/bruce/homework0226/JuintTest.java | 141 -- .../com/bruce/homework0226/LinkedListV00.java | 204 --- .../src/com/bruce/homework0226/QueueV00.java | 117 -- .../src/com/bruce/homework0226/StackV00.java | 144 -- .../src/com/bruce/utils/MyException.java | 29 - .../1511_714512544/.idea/checkstyle-idea.xml | 10 - group15/1511_714512544/.idea/encodings.xml | 6 - group15/1511_714512544/.idea/misc.xml | 6 - group15/1511_714512544/.idea/modules.xml | 8 - group15/1511_714512544/.idea/uiDesigner.xml | 124 -- group15/1511_714512544/.idea/vcs.xml | 6 - group15/1511_714512544/.idea/workspace.xml | 1295 ----------------- group15/1511_714512544/1511_714512544.iml | 20 - .../src/com/coding/basic/ArrayList.java | 66 - .../com/coding/basic/BinarySearchTree.java | 238 --- .../coding/basic/BinarySearchTreeNode.java | 49 - .../src/com/coding/basic/Iterator.java | 6 - .../src/com/coding/basic/LinkedList.java | 157 -- .../src/com/coding/basic/List.java | 16 - .../src/com/coding/basic/Queue.java | 37 - .../src/com/coding/basic/Stack.java | 35 - .../test/com/coding/basic/ArrayListTest.java | 74 - .../coding/basic/BinarySearchTreeTest.java | 113 -- .../test/com/coding/basic/LinkedListTest.java | 149 -- .../src/test/com/coding/basic/QueueTest.java | 67 - .../src/test/com/coding/basic/StackTest.java | 59 - ...07\347\253\240\345\234\260\345\235\200.md" | 1 - group15/1512_656512403/.idea/compiler.xml | 23 - .../.idea/copyright/profiles_settings.xml | 3 - group15/1512_656512403/.idea/description.html | 1 - group15/1512_656512403/.idea/encodings.xml | 5 - .../inspectionProfiles/Project_Default.xml | 6 - .../inspectionProfiles/profiles_settings.xml | 7 - group15/1512_656512403/.idea/misc.xml | 12 - group15/1512_656512403/.idea/modules.xml | 8 - group15/1512_656512403/.idea/vcs.xml | 7 - group15/1512_656512403/.idea/workspace.xml | 768 ---------- group15/1512_656512403/1512_656512403.iml | 12 - group15/1512_656512403/1512_656512403.md | 1 - group15/1512_656512403/src/Iterator.java | 7 - group15/1512_656512403/src/List.java | 10 - group15/1512_656512403/src/Main.java | 7 - group15/1512_656512403/src/MyArrayList.java | 198 --- .../1512_656512403/src/MyBinaryTreeNode.java | 27 - group15/1512_656512403/src/MyLinkedList.java | 119 -- group15/1512_656512403/src/MyQuque.java | 35 - group15/1512_656512403/src/MyStack.java | 43 - group15/1513_121469918/HomeWork01/.classpath | 6 - group15/1513_121469918/HomeWork01/.gitignore | 1 - group15/1513_121469918/HomeWork01/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../HomeWork01/src/coding/ArrayList.java | 118 -- .../HomeWork01/src/coding/BinaryTreeNode.java | 53 - .../HomeWork01/src/coding/Iterator.java | 7 - .../HomeWork01/src/coding/LinkedList.java | 170 --- .../HomeWork01/src/coding/List.java | 9 - .../HomeWork01/src/coding/Queue.java | 35 - .../HomeWork01/src/coding/Stack.java | 41 - group15/1514_616019420/ArrayList.java | 79 - group15/1514_616019420/BinaryTreeNode.java | 46 - group15/1514_616019420/Iterator.java | 7 - group15/1514_616019420/LinkedList.java | 136 -- group15/1514_616019420/List.java | 9 - group15/1514_616019420/Queue.java | 23 - group15/1514_616019420/Stack.java | 24 - group15/1515_337959725/.classpath | 6 - group15/1515_337959725/.gitignore | 1 - group15/1515_337959725/.project | 17 - .../src/com/coding/basic/ArrayListTest.java | 65 - .../src/com/coding/basic/BinaryTreeTest.java | 42 - .../src/com/coding/basic/IteratorTest.java | 6 - .../src/com/coding/basic/LinkedListTest.java | 100 -- .../src/com/coding/basic/ListTest.java | 9 - .../src/com/coding/basic/Queue.java | 27 - .../src/com/coding/basic/StackTest.java | 33 - .../my/collection/linear/MyArrayList.java | 73 - .../my/collection/linear/MyIterator.java | 8 - .../my/collection/linear/MyLinkedList.java | 95 -- .../my/collection/linear/MyList.java | 14 - .../my/collection/linear/MyQueue.java | 26 - .../my/collection/linear/MyStack.java | 36 - .../linearTest/MyArrayListTest.java | 38 - .../linearTest/MyLinkedListTest.java | 32 - .../my/collection/linearTest/MyQueueTest.java | 25 - .../my/collection/linearTest/MyStackTest.java | 24 - .../src/com/coding/basic/ArrayList.java | 150 -- .../src/com/coding/basic/BasicTest.java | 184 --- .../src/com/coding/basic/BinaryTreeNode.java | 105 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 271 ---- .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 60 - .../src/com/coding/basic/Stack.java | 64 - group15/group15.md | 1 - .../1012075117/DataStructure219/.classpath | 6 - group16/1012075117/DataStructure219/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../com/stackwei/DataStructure/ArrayList.java | 94 -- .../stackwei/DataStructure/LinkedList.java | 194 --- .../src/com/stackwei/DataStructure/List.java | 13 - .../src/com/stackwei/DataStructure/Queue.java | 52 - .../src/com/stackwei/DataStructure/Stack.java | 59 - group16/1154151360/.classpath | 6 - group16/1154151360/.gitignore | 1 - group16/1154151360/.project | 17 - .../org.eclipse.core.resources.prefs | 2 - .../1154151360/src/com/list/ArrayList.java | 93 -- .../1154151360/src/com/list/LinkedList.java | 158 -- group16/1154151360/src/com/list/Queue.java | 51 - group16/1154151360/src/com/list/Stack.java | 35 - .../0226/src/com/coding/basic/ArrayList.java | 63 - .../0226/src/com/coding/basic/Iterator.java | 6 - .../0226/src/com/coding/basic/LinkedList.java | 101 -- .../0226/src/com/coding/basic/List.java | 9 - .../0226/src/com/coding/basic/Queue.java | 28 - .../0226/src/com/coding/basic/Stack.java | 38 - group16/1325756593/.classpath | 7 - group16/1325756593/.gitignore | 1 - group16/1325756593/.project | 17 - group16/1325756593/dongqihust.readme | 0 .../src/com/dong/week1/ArrayList.java | 109 -- .../src/com/dong/week1/ArrayListTest.java | 63 - .../src/com/dong/week1/BinaryTreeNode.java | 39 - .../src/com/dong/week1/Iterator.java | 7 - .../src/com/dong/week1/LinkedList.java | 208 --- .../1325756593/src/com/dong/week1/List.java | 9 - .../1325756593/src/com/dong/week1/Queue.java | 24 - .../1325756593/src/com/dong/week1/Stack.java | 31 - group16/1924332561/.classpath | 6 - group16/1924332561/.project | 17 - .../org.eclipse.core.resources.prefs | 2 - .../src/com/coding/basic/ArrayList.java | 41 - .../src/com/coding/basic/BinaryTreeNode.java | 29 - .../src/com/coding/basic/Iterator.java | 6 - .../src/com/coding/basic/LinkedList.java | 62 - .../1924332561/src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 23 - .../src/com/coding/basic/Stack.java | 29 - group16/214074094/readme.txt | 1 - .../src/com/coding/basic/ArrayList.java | 165 --- .../src/com/coding/basic/BinaryTreeNode.java | 39 - .../src/com/coding/basic/Iterator.java | 9 - .../src/com/coding/basic/LinkedList.java | 222 --- .../214074094/src/com/coding/basic/List.java | 15 - .../214074094/src/com/coding/basic/Queue.java | 36 - .../214074094/src/com/coding/basic/Stack.java | 37 - .../214074094/src/com/reading/blog_test.txt | 1 - .../src/test/coding/basic/AbstractTest.java | 19 - .../src/test/coding/basic/ArrayListTest.java | 81 -- .../src/test/coding/basic/LinkedListTest.java | 63 - .../src/test/coding/basic/QueueTest.java | 62 - .../src/test/coding/basic/StackTest.java | 68 - .../214074094/reading/blog_test.txt | 1 - .../2562124714/.idea/dictionaries/zhangwj.xml | 3 - group16/2562124714/.idea/misc.xml | 22 - group16/2562124714/.idea/modules.xml | 8 - group16/2562124714/.idea/workspace.xml | 780 ---------- group16/2562124714/2562124714.iml | 21 - .../2562124714/src/Test/ArrayListTest.java | 70 - .../src/Test/BinaryTreeNodeTest.java | 100 -- .../2562124714/src/Test/LinkedListTest.java | 81 -- group16/2562124714/src/Test/QueueTest.java | 58 - group16/2562124714/src/Test/StackTest.java | 57 - group16/2562124714/src/Test/TestRunner.java | 19 - .../src/com/coding/basic/ArrayList.java | 100 -- .../src/com/coding/basic/BinaryTreeNode.java | 94 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 200 --- .../2562124714/src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 24 - .../src/com/coding/basic/Stack.java | 34 - .../src/com/coding/basic/TestJunit.java | 17 - .../src/com/coding/basic/TestRunner.java | 25 - .../src/com/coding/basic/TreeData.java | 28 - group16/313001956/.classpath | 12 - group16/313001956/.gitignore | 1 - group16/313001956/.project | 36 - group16/313001956/.settings/.jsdtscope | 12 - .../.settings/org.eclipse.jdt.core.prefs | 7 - .../org.eclipse.wst.common.component | 8 - ....eclipse.wst.common.project.facet.core.xml | 9 - ...rg.eclipse.wst.jsdt.ui.superType.container | 1 - .../org.eclipse.wst.jsdt.ui.superType.name | 1 - .../313001956/WebContent/META-INF/MANIFEST.MF | 3 - .../src/com/coding/basic/ArrayList.java | Bin 453 -> 0 bytes group16/502059278/.classpath | 6 - group16/502059278/.gitignore | 1 - group16/502059278/.project | 17 - ...350\260\210_\344\275\234\344\270\232.docx" | Bin 532875 -> 0 bytes .../502059278/src/cn/mark/MyArrayList.java | 144 -- .../502059278/src/cn/mark/MyLinkedList.java | 67 - group16/502059278/src/cn/mark/MyList.java | 32 - .../src/com/coding/basic/ArrayList.java | 88 -- .../src/com/coding/basic/BinaryTreeNode.java | 62 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 192 --- .../542087872/src/com/coding/basic/List.java | 9 - .../542087872/src/com/coding/basic/Queue.java | 22 - .../542087872/src/com/coding/basic/Stack.java | 25 - .../542087872/src/com/coding/basic/Test.java | 166 --- group16/group16.md | 1 - .../214074094/com/reading/blog_test.txt | 1 - group16/out/production/214074094/readme.txt | 1 - .../214074094/src/com/reading/blog_test.txt | 1 - group17/102228177/.classpath | 6 - group17/102228177/.project | 17 - group17/102228177/src/data2_19/ArrayList.java | 148 -- .../src/data2_19/BinaryTreeNode.java | 74 - group17/102228177/src/data2_19/Iterator.java | 8 - .../102228177/src/data2_19/LinkedList.java | 142 -- group17/102228177/src/data2_19/List.java | 10 - group17/102228177/src/data2_19/Queue.java | 38 - group17/102228177/src/data2_19/Stack.java | 44 - .../src/com/coding/basic/MyArrayList.java | 41 - .../com/coding/basic/MyBinaryTreeNode.java | 30 - .../src/com/coding/basic/MyIterator.java | 6 - .../src/com/coding/basic/MyLinkedList.java | 45 - .../homework/src/com/coding/basic/MyList.java | 9 - .../src/com/coding/basic/MyQueue.java | 32 - .../src/com/coding/basic/MyStack.java | 34 - .../1204187480/code/homework/basic/pom.xml | 12 - .../main/java/com/coding/basic/ArrayList.java | 108 -- .../java/com/coding/basic/BinaryTreeNode.java | 32 - .../main/java/com/coding/basic/Iterator.java | 7 - .../java/com/coding/basic/LinkedList.java | 147 -- .../src/main/java/com/coding/basic/List.java | 9 - .../src/main/java/com/coding/basic/Queue.java | 24 - .../src/main/java/com/coding/basic/Stack.java | 30 - .../java/com/coding/api/ArrayListTest.java | 25 - .../test/java/com/coding/api/ArraysTest.java | 22 - .../test/java/com/coding/api/SystemTest.java | 24 - .../java/com/coding/basic/ArrayListTest.java | 35 - .../1204187480/code/homework/parent/pom.xml | 95 -- group17/1204187480/code/homework/pom.xml | 14 - ...0\210\350\256\241\347\256\227\346\234\272" | 0 group17/1264835468/.gitignore | 5 - .../1264835468/src/assignment/BinaryTree.java | 154 -- .../src/assignment/BinaryTreeNode.java | 58 - .../1264835468/src/assignment/Iterable.java | 6 - .../1264835468/src/assignment/Iterator.java | 7 - group17/1264835468/src/assignment/List.java | 14 - .../src/assignment/MyArrayList.java | 110 -- .../src/assignment/MyLinkedList.java | 144 -- .../1264835468/src/assignment/MyQueue.java | 34 - .../1264835468/src/assignment/MyStack.java | 39 - group17/1282579502/.classpath | 7 - group17/1282579502/.gitignore | 1 - group17/1282579502/.project | 37 - .../src/com/coding/basic/ArrayList.java | 106 -- .../src/com/coding/basic/BinaryTreeNode.java | 66 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 148 -- .../1282579502/src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 30 - .../src/com/coding/basic/Stack.java | 29 - .../com/coding/basic/ut/ArrayListTest.java | 121 -- .../coding/basic/ut/BinaryTreeNodeTest.java | 42 - .../com/coding/basic/ut/LinkedListTest.java | 162 --- .../src/com/coding/basic/ut/QueueTest.java | 54 - .../src/com/coding/basic/ut/StackTest.java | 66 - group17/1540186032/First/src/ArrayList.java | 64 - .../1540186032/First/src/BinaryTreeNode.java | 31 - group17/1540186032/First/src/Iterator.java | 6 - group17/1540186032/First/src/LinkedList.java | 131 -- group17/1540186032/First/src/List.java | 8 - group17/1540186032/First/src/Queue.java | 23 - group17/1540186032/First/src/Stack.java | 28 - .../176653813/1766538130226Lesson/.classpath | 7 - .../176653813/1766538130226Lesson/.gitignore | 1 - .../176653813/1766538130226Lesson/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coding/basic/ArrayList.java | 80 - .../src/com/coding/basic/LinkList.java | 96 -- .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 35 - .../src/com/coding/basic/Stack.java | 41 - .../src/com/coding/basic/Test.java | 36 - .../176653813/RemoteSystemsTempFiles/.project | 12 - group17/240094626/.gitignore | 45 - group17/240094626/warm-up/.gitignore | 4 - .../src/com/coding/basic/Iterator.java | 7 - .../warm-up/src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/impl/ArrayList.java | 169 --- .../src/com/coding/basic/impl/BinaryTree.java | 110 -- .../src/com/coding/basic/impl/LinkedList.java | 205 --- .../src/com/coding/basic/impl/Queue.java | 73 - .../src/com/coding/basic/impl/Stack.java | 86 -- .../com/coding/basic/test/ArrayListTest.java | 55 - .../com/coding/basic/test/LinkedListTest.java | 60 - .../src/com/coding/basic/test/QueueTest.java | 57 - .../src/com/coding/basic/test/StackTest.java | 71 - group17/51075907/HomeWork/.classpath | 6 - group17/51075907/HomeWork/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../HomeWork/src/day1_HomeWork/ArrayList.java | 75 - .../src/day1_HomeWork/LinkedList.java | 103 -- .../HomeWork/src/day1_HomeWork/List.java | 9 - .../HomeWork/src/day1_HomeWork/Queue.java | 19 - .../HomeWork/src/day1_HomeWork/Stack.java | 23 - group17/785396327/binarytree/BinaryTree.java | 55 - .../785396327/binarytree/DLRSearchType.java | 16 - .../785396327/binarytree/LDRSearchType.java | 15 - .../785396327/binarytree/LFSearchType.java | 27 - .../785396327/binarytree/LRDSearchType.java | 15 - group17/785396327/binarytree/SearchType.java | 9 - group17/785396327/list/ArrayList.java | 135 -- group17/785396327/list/Iterator.java | 13 - group17/785396327/list/LinkedList.java | 163 --- group17/785396327/list/List.java | 25 - group17/785396327/queue/Queue.java | 41 - group17/785396327/stack/Stack.java | 29 - group17/82427129/.gitignore | 7 - group17/82427129/JavaUtil/.gitignore | 1 - group17/82427129/JavaUtil/pom.xml | 27 - .../main/java/com/coding/basic/ArrayList.java | 100 -- .../java/com/coding/basic/BinaryTreeNode.java | 32 - .../main/java/com/coding/basic/Iterator.java | 7 - .../java/com/coding/basic/LinkedList.java | 180 --- .../src/main/java/com/coding/basic/List.java | 9 - .../src/main/java/com/coding/basic/Queue.java | 21 - .../src/main/java/com/coding/basic/Stack.java | 32 - group17/865797761/.classpath | 6 - group17/865797761/.gitignore | 1 - group17/865797761/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../865797761/src/Collection/ArrayList.java | 135 -- .../865797761/src/Collection/Iterable.java | 6 - .../865797761/src/Collection/Iterator.java | 7 - group17/865797761/src/Collection/List.java | 14 - .../865797761/src/Collection/MyArrayList.java | 110 -- .../src/Collection/MyLinkedList.java | 144 -- group17/865797761/src/Collection/MyQueue.java | 34 - group17/876385982/.classpath | 6 - group17/876385982/.gitignore | 1 - group17/876385982/.project | 17 - group17/876385982/src/test/Test.java | 10 - ...2\204\345\205\263\347\263\273_20170226.md" | 56 - group17/group17.md | 1 - .../src/basicStruct/BasicStruct.java | 11 - .../src/simpleArrayList/SimpleArrayList.java | 140 -- .../simpleLinkedList/SimpleLinkedList.java | 197 --- .../src/simpleQueue/SimpleQueue.java | 22 - .../src/simpleStack/SimpleStack.java | 44 - group18/1159828430/20170219/.classpath | 7 - group18/1159828430/20170219/.gitignore | 1 - group18/1159828430/20170219/.project | 17 - .../src/com/coding/basic/ArrayList.java | 145 -- .../src/com/coding/basic/Iterator.java | 11 - .../src/com/coding/basic/LinkedList.java | 238 --- .../20170219/src/com/coding/basic/List.java | 13 - .../20170219/src/com/coding/basic/Queue.java | 31 - .../20170219/src/com/coding/basic/Stack.java | 57 - group18/1159828430/README.md | 2 - group18/744888802/dataStructure/pom.xml | 24 - .../main/java/com/coding/basic/ArrayList.java | 109 -- .../java/com/coding/basic/BinaryTreeNode.java | 84 -- .../main/java/com/coding/basic/Iterator.java | 7 - .../java/com/coding/basic/LinkedList.java | 237 --- .../src/main/java/com/coding/basic/List.java | 13 - .../src/main/java/com/coding/basic/Queue.java | 21 - .../src/main/java/com/coding/basic/Stack.java | 47 - .../main/java/com/coding/basic/TestMain.java | 29 - group18/784140710/week01/.gitignore | 4 - .../src/com/coding/basic/ArrayIterator.java | 27 - .../src/com/coding/basic/ArrayList.java | 84 -- .../src/com/coding/basic/BinaryTree.java | 65 - .../src/com/coding/basic/BinaryTreeNode.java | 66 - .../week01/src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 114 -- .../week01/src/com/coding/basic/List.java | 9 - .../week01/src/com/coding/basic/Queue.java | 21 - .../week01/src/com/coding/basic/Stack.java | 23 - .../week01/src/com/coding/test/Test01.java | 62 - .../src/com/coding/test/TestBinaryTree.java | 20 - group18/935542673/Coding/.classpath | 8 - group18/935542673/Coding/.gitignore | 1 - group18/935542673/Coding/.project | 17 - .../basic_data_structure/MyArrayListTest.java | 92 -- .../MyBinarySearchTreeTest.java | 64 - .../MyLinkedListTest.java | 131 -- .../basic_data_structure/MyQueueTest.java | 54 - .../basic_data_structure/MyStackTest.java | 55 - .../basic_data_structure/MyArrayList.java | 215 --- .../MyBinarySearchTree.java | 200 --- .../basic_data_structure/MyIterator.java | 14 - .../basic_data_structure/MyLinkedList.java | 359 ----- .../ikook/basic_data_structure/MyList.java | 22 - .../ikook/basic_data_structure/MyQueue.java | 42 - .../ikook/basic_data_structure/MyStack.java | 73 - .../com/ikook/basic_data_structure/README.md | 83 -- ...\347\232\204\351\227\256\351\242\230.docx" | Bin 82125 -> 0 bytes group18/group18.md | 1 - group19/1294642551/.gitignore | 1 - group19/1294642551/readme.txt | 1 - .../src/data_Structures/ArrayList.java | 57 - .../src/data_Structures/LinkedList.java | 125 -- .../1294642551/src/data_Structures/List.java | 9 - .../1294642551/src/data_Structures/Queue.java | 28 - .../1294642551/src/data_Structures/Stack.java | 29 - group19/1592562638/.gitignore | 9 - group19/1592562638/src/ArrayList_self.java | 126 -- .../1592562638/src/BinaryTreeNode_self.java | 71 - group19/1592562638/src/CollectionTest.java | 50 - group19/1592562638/src/KIList.java | 18 - group19/1592562638/src/LinkedList_self.java | 199 --- group19/1592562638/src/Name.java | 36 - group19/1592562638/src/Queue_self.java | 37 - group19/1592562638/src/Stack_self.java | 42 - ...4\346\210\220\345\216\237\347\220\206.pdf" | Bin 710498 -> 0 bytes group19/2558178127/.gitignore | 9 - group19/2558178127/src/com/cn/kevin/Test.java | 5 - .../src/com/coding/basic/ArrayList.java | 99 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 140 -- .../2558178127/src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 24 - .../src/com/coding/basic/Stack.java | 31 - group19/398129523/ArrayList | 88 -- group19/398129523/LinkedList | 46 - group19/398129523/Queue | 38 - group19/398129523/Stack | 36 - group19/527220084/xukai_coding/.gitignore | 8 - .../xukai_coding/coding-common/pom.xml | 107 -- .../main/java/org/xukai/common/ArrayList.java | 102 -- .../java/org/xukai/common/BinaryTreeNode.java | 53 - .../main/java/org/xukai/common/Iterator.java | 7 - .../java/org/xukai/common/LinkedList.java | 163 --- .../src/main/java/org/xukai/common/List.java | 9 - .../src/main/java/org/xukai/common/Queue.java | 27 - .../src/main/java/org/xukai/common/Stack.java | 34 - .../java/org/xukai/common/ArrayListTest.java | 70 - .../org/xukai/common/BinaryTreeNodeTest.java | 28 - .../java/org/xukai/common/LinkedListTest.java | 91 -- .../test/java/org/xukai/common/QueueTest.java | 46 - .../test/java/org/xukai/common/StackTest.java | 52 - group19/527220084/xukai_coding/pom.xml | 422 ------ ...4\347\233\230\346\214\207\344\273\244.txt" | 3 - .../main/java/com/coding/basic/ArrayList.java | 53 - .../java/com/coding/basic/BinaryTreeNode.java | 32 - .../main/java/com/coding/basic/Iterator.java | 7 - .../java/com/coding/basic/LinkedList.java | 143 -- .../src/main/java/com/coding/basic/List.java | 9 - .../src/main/java/com/coding/basic/Queue.java | 52 - .../src/main/java/com/coding/basic/Stack.java | 43 - .../src/com/coding/basic/ArrayList.java | 109 -- .../src/com/coding/basic/Iterator.java | 6 - .../src/com/coding/basic/LinkedList.java | 183 --- .../src/com/coding/basic/List.java | 13 - .../src/com/coding/basic/Queue.java | 26 - .../src/com/coding/basic/Stack.java | 35 - .../src/com/coding/basic/ArrayList.java | 106 -- .../src/com/coding/basic/BinaryTreeNode.java | 52 - .../src/com/coding/basic/Iterator.java | 6 - .../src/com/coding/basic/LinkedList.java | 134 -- .../972815123/src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/MainTest.java | 21 - .../972815123/src/com/coding/basic/Queue.java | 28 - .../972815123/src/com/coding/basic/Stack.java | 31 - group19/972815123/test.txt | 0 group19/976180558/.gitignore | 1 - .../src/com/coding/basic/ArrayList.java | 32 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 46 - .../976180558/src/com/coding/basic/List.java | 9 - .../976180558/src/com/coding/basic/Queue.java | 19 - .../976180558/src/com/coding/basic/Stack.java | 22 - group19/group19.md | 1 - group20/.gitignore | 43 - .../src/SinglyLinkedList/LinkedList0.java | 75 - .../src/SinglyLinkedList2/LinkedList1.java | 242 --- .../1040154728Learning/src/honoka.md | 5 - .../lib/hamcrest-core-1.3.jar | Bin 45024 -> 0 bytes .../1107837739Learning/lib/junit-4.12.jar | Bin 314932 -> 0 bytes .../src/org/korben/Main.java | 8 - .../src/org/korben/list/KArrayList.java | 169 --- .../src/org/korben/list/KIterator.java | 10 - .../src/org/korben/list/KLinkedList.java | 172 --- .../src/org/korben/list/KList.java | 35 - .../org/korben/list/KListIteratorTest.java | 36 - .../src/org/korben/list/KListTest.java | 142 -- .../src/org/korben/queue/KArrayQueue.java | 111 -- .../src/org/korben/queue/KQueue.java | 20 - .../src/org/korben/queue/KQueueTest.java | 78 - .../src/org/korben/stack/KStack.java | 72 - .../src/org/korben/stack/KStackTest.java | 71 - .../src/org/korben/tree/BinaryTreeNode.java | 127 -- .../org/korben/tree/BinaryTreeNodeTest.java | 59 - group20/1107837739/korben.md | 7 - group20/286166752/.gitignore | 4 - .../liven/code/dataStructures/ArrayList.java | 86 -- .../liven/code/dataStructures/LinkedList.java | 40 - .../wiki/liven/code/dataStructures/List.java | 14 - .../wiki/liven/code/dataStructures/Queue.java | 7 - .../wiki/liven/code/dataStructures/Stack.java | 7 - .../src/wiki/liven/code/test/SomeDemos.java | 15 - .../src/com/coding/basic/ArrayList.java | 122 -- .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 148 -- .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 30 - .../src/com/coding/basic/Stack.java | 37 - .../com/basic/datastructure/ArrayList.java | 110 -- .../com/basic/datastructure/LinkedList.java | 176 --- .../src/com/basic/datastructure/List.java | 10 - .../src/com/basic/datastructure/Queue.java | 33 - .../src/com/basic/datastructure/Stack.java | 41 - .../com/basic/practice/PolymorphicInJava.java | 41 - .../com/basic/practice/ValuePassInJava.java | 44 - .../src/com/coding/basic/ArrayList.java | 32 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 46 - .../423184723/src/com/coding/basic/List.java | 9 - .../423184723/src/com/coding/basic/Queue.java | 19 - .../423184723/src/com/coding/basic/Stack.java | 22 - group20/452472201/.gitignore | 1 - .../src/com/coding/basic/ArrayList.java | 98 -- .../src/com/coding/basic/BinaryTreeNode.java | 32 - .../src/com/coding/basic/Iterator.java | 9 - .../src/com/coding/basic/LinkedList.java | 46 - .../452472201/src/com/coding/basic/List.java | 9 - .../452472201/src/com/coding/basic/Queue.java | 19 - .../452472201/src/com/coding/basic/Stack.java | 22 - .../src/cn/wsc/util/ArrayList.java | 233 --- .../src/cn/wsc/util/LinkedList.java | 284 ---- .../data _structure/src/cn/wsc/util/List.java | 105 -- .../src/cn/wsc/utils/Stack.java | 22 - ...0\344\273\266\347\220\206\350\247\243.txt" | 2 - .../src/liuxincourse/ArrayList.java | 56 - .../src/liuxincourse/LinkedList.java | 120 -- .../src/liuxincourse/List.java | 10 - .../src/liuxincourse/Queue.java | 25 - .../src/liuxincourse/Stack.java | 27 - .../test/liuxincourse/ArrayListTest.java | 53 - .../test/liuxincourse/LinkedListTest.java | 69 - .../test/liuxincourse/QueueTest.java | 27 - .../test/liuxincourse/StackTest.java | 26 - .../test/liuxincourse/SuiteTest.java | 14 - .../MyArrayList.java" | 136 -- .../MyIterator.java" | 7 - .../MyList.java" | 16 - .../MyQueue.java" | 79 - .../MyStack.java" | 44 - .../MyTreeNode.java" | 99 -- .../SingleLinkedList.java" | 212 --- ...6\207\347\253\240\345\234\260\345\235\200" | 1 - group20/group20.md | 1 - group21/group21.md | 1 - liuxin/.classpath | 7 - liuxin/.gitignore | 1 - liuxin/.project | 17 - liuxin/.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/coderising/array/ArrayUtil.java | 96 -- .../coderising/litestruts/LoginAction.java | 39 - .../src/com/coderising/litestruts/Struts.java | 34 - .../com/coderising/litestruts/StrutsTest.java | 43 - .../src/com/coderising/litestruts/View.java | 23 - .../src/com/coderising/litestruts/struts.xml | 11 - liuxin/src/com/coding/basic/ArrayList.java | 32 - .../src/com/coding/basic/BinaryTreeNode.java | 32 - liuxin/src/com/coding/basic/Iterator.java | 7 - liuxin/src/com/coding/basic/LinkedList.java | 46 - liuxin/src/com/coding/basic/List.java | 9 - liuxin/src/com/coding/basic/Queue.java | 19 - liuxin/src/com/coding/basic/Stack.java | 22 - shell.sh | 4 - 2168 files changed, 111611 deletions(-) delete mode 100644 .gitignore delete mode 100644 group01/1298552064/src/week01/basic/Iterator.java delete mode 100644 group01/1298552064/src/week01/basic/List.java delete mode 100644 group01/1298552064/src/week01/basic/MyArrayList.java delete mode 100644 group01/1298552064/src/week01/basic/MyBinaryTreeNode.java delete mode 100644 group01/1298552064/src/week01/basic/MyLinkedList.java delete mode 100644 group01/1298552064/src/week01/basic/MyQueue.java delete mode 100644 group01/1298552064/src/week01/basic/MyStack.java delete mode 100644 group01/1298552064/src/week01/test/MyArrayListTest.java delete mode 100644 group01/1298552064/src/week01/test/MyLinkedListTest.java delete mode 100644 group01/1298552064/src/week01/test/MyQueueTest.java delete mode 100644 group01/1298552064/src/week01/test/MyStackTest.java delete mode 100644 group01/1328404806/RemoteSystemsTempFiles/.project delete mode 100644 group01/1328404806/dataStructure/.classpath delete mode 100644 group01/1328404806/dataStructure/.gitignore delete mode 100644 group01/1328404806/dataStructure/.project delete mode 100644 group01/1328404806/dataStructure/.settings/org.eclipse.core.resources.prefs delete mode 100644 group01/1328404806/dataStructure/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group01/1328404806/dataStructure/.settings/org.eclipse.m2e.core.prefs delete mode 100644 group01/1328404806/dataStructure/pom.xml delete mode 100644 group01/1328404806/dataStructure/src/main/java/ListService/KILinkedList.java delete mode 100644 group01/1328404806/dataStructure/src/main/java/ListService/KIList.java delete mode 100644 group01/1328404806/dataStructure/src/main/java/ListService/KIQueueList.java delete mode 100644 group01/1328404806/dataStructure/src/main/java/ListService/KIStackList.java delete mode 100644 group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KArrayList.java delete mode 100644 group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KLinkedList.java delete mode 100644 group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KQueueList.java delete mode 100644 group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KStackList.java delete mode 100644 group01/1328404806/dataStructure/src/main/java/increaseLearning/dataStructure/App.java delete mode 100644 group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/AppTest.java delete mode 100644 group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/arrayListTest.java delete mode 100644 group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/linkedListTest.java delete mode 100644 group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/queueListTest.java delete mode 100644 group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/stackListTest.java delete mode 100644 group01/1664823950/.classpath delete mode 100644 group01/1664823950/.gitignore delete mode 100644 group01/1664823950/.project delete mode 100644 group01/1664823950/src/com/coding/basic/ArrayList.java delete mode 100644 group01/1664823950/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group01/1664823950/src/com/coding/basic/Iterator.java delete mode 100644 group01/1664823950/src/com/coding/basic/LinkedList.java delete mode 100644 group01/1664823950/src/com/coding/basic/List.java delete mode 100644 group01/1664823950/src/com/coding/basic/Queue.java delete mode 100644 group01/1664823950/src/com/coding/basic/Stack.java delete mode 100644 group01/1814014897/zhouhui/.classpath delete mode 100644 group01/1814014897/zhouhui/.gitignore delete mode 100644 group01/1814014897/zhouhui/.project delete mode 100644 group01/1814014897/zhouhui/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/ArrayList.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/BinaryTreeNode.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/Iterator.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/LinkedList.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/List.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/Queue.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/Stack.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/AllTest.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/ArrayListTest.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/BinaryTreeNodeTest.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/LinkedListTest.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/QueueTest.java delete mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/StackTest.java delete mode 100644 group01/1925347167/1925347167.md delete mode 100644 group01/1925347167/Week1 Basic Data Structure/ArrayList.java delete mode 100644 group01/1925347167/Week1 Basic Data Structure/BinaryTreeNode.java delete mode 100644 group01/1925347167/Week1 Basic Data Structure/Iterator.java delete mode 100644 group01/1925347167/Week1 Basic Data Structure/LinkedList.java delete mode 100644 group01/1925347167/Week1 Basic Data Structure/List.java delete mode 100644 group01/1925347167/Week1 Basic Data Structure/Queue.java delete mode 100644 group01/1925347167/Week1 Basic Data Structure/Stack.java delete mode 100644 group01/1925347167/Week1 Basic Data Structure/readme.md delete mode 100644 group01/2137642225/work01/.classpath delete mode 100644 group01/2137642225/work01/.gitignore delete mode 100644 group01/2137642225/work01/.project delete mode 100644 group01/2137642225/work01/src/com/coding/mybasic/ArrayList.java delete mode 100644 group01/2137642225/work01/src/com/coding/mybasic/BinaryTreeNode.java delete mode 100644 group01/2137642225/work01/src/com/coding/mybasic/Iterator.java delete mode 100644 group01/2137642225/work01/src/com/coding/mybasic/LinkedList.java delete mode 100644 group01/2137642225/work01/src/com/coding/mybasic/List.java delete mode 100644 group01/2137642225/work01/src/com/coding/mybasic/Queue.java delete mode 100644 group01/2137642225/work01/src/com/coding/mybasic/Stack.java delete mode 100644 group01/2137642225/work01/src/com/coding/test/TestArrayList.java delete mode 100644 group01/2137642225/work01/src/com/coding/test/TestBinaryTreeNode.java delete mode 100644 group01/2137642225/work01/src/com/coding/test/TestLinkedList.java delete mode 100644 group01/2137642225/work01/src/com/coding/test/TestQueue.java delete mode 100644 group01/2137642225/work01/src/com/coding/test/TestStack.java delete mode 100644 group01/275150374/275150374Learning/.idea/compiler.xml delete mode 100644 group01/275150374/275150374Learning/.idea/description.html delete mode 100644 group01/275150374/275150374Learning/.idea/encodings.xml delete mode 100644 group01/275150374/275150374Learning/.idea/misc.xml delete mode 100644 group01/275150374/275150374Learning/.idea/modules.xml delete mode 100644 group01/275150374/275150374Learning/.idea/vcs.xml delete mode 100644 group01/275150374/275150374Learning/275150374Learning.iml delete mode 100644 group01/275150374/275150374Learning/src/task01/ArrayList.java delete mode 100644 group01/275150374/275150374Learning/src/task01/LinkedList.java delete mode 100644 group01/275150374/275150374Learning/src/task01/Main.java delete mode 100644 group01/275150374/275150374Learning/src/task01/Queue.java delete mode 100644 group01/275150374/275150374Learning/src/task01/Stack.java delete mode 100644 group01/280646174/.gitignore delete mode 100644 group01/280646174/280646174.md delete mode 100644 group01/280646174/basic/pom.xml delete mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/ArrayList.java delete mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/BinaryTreeNode.java delete mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/Iterator.java delete mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/LinkedList.java delete mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/List.java delete mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/Queue.java delete mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/Stack.java delete mode 100644 group01/280646174/basic/src/test/java/com/coding2017/basic/ArrayListTest.java delete mode 100644 group01/280646174/basic/src/test/java/com/coding2017/basic/BinaryTreeNodeTest.java delete mode 100644 group01/280646174/basic/src/test/java/com/coding2017/basic/LinkedListTest.java delete mode 100644 group01/280646174/basic/src/test/java/com/coding2017/basic/QueueTest.java delete mode 100644 group01/280646174/basic/src/test/java/com/coding2017/basic/StackTest.java delete mode 100644 group01/280646174/pom.xml delete mode 100644 group01/349209948/.gitignore delete mode 100644 group01/349209948/src/week1_0226/ArrayList.java delete mode 100644 group01/349209948/src/week1_0226/BinaryTreeNode.java delete mode 100644 group01/349209948/src/week1_0226/Iterator.java delete mode 100644 group01/349209948/src/week1_0226/LinkedList.java delete mode 100644 group01/349209948/src/week1_0226/List.java delete mode 100644 group01/349209948/src/week1_0226/Queue.java delete mode 100644 group01/349209948/src/week1_0226/Stack.java delete mode 100644 group01/360176196/.classpath delete mode 100644 group01/360176196/.gitignore delete mode 100644 group01/360176196/.project delete mode 100644 group01/360176196/src/xqfGit/dataStructure/ArrayList.java delete mode 100644 group01/360176196/src/xqfGit/dataStructure/BinaryTreeNode.java delete mode 100644 group01/360176196/src/xqfGit/dataStructure/Iterator.java delete mode 100644 group01/360176196/src/xqfGit/dataStructure/LinkedList.java delete mode 100644 group01/360176196/src/xqfGit/dataStructure/List.java delete mode 100644 group01/360176196/src/xqfGit/dataStructure/Queue.java delete mode 100644 group01/360176196/src/xqfGit/dataStructure/Stack.java delete mode 100644 group01/378213871/.classpath delete mode 100644 group01/378213871/.gitignore delete mode 100644 group01/378213871/.project delete mode 100644 group01/378213871/src/com/coding/basic/week01/ArrayList.java delete mode 100644 group01/378213871/src/com/coding/basic/week01/BinaryTreeNode.java delete mode 100644 group01/378213871/src/com/coding/basic/week01/Iterator.java delete mode 100644 group01/378213871/src/com/coding/basic/week01/LinkedList.java delete mode 100644 group01/378213871/src/com/coding/basic/week01/List.java delete mode 100644 group01/378213871/src/com/coding/basic/week01/Queue.java delete mode 100644 group01/378213871/src/com/coding/basic/week01/Stack.java delete mode 100644 group01/496740686/src/Impl/MyArraryList.java delete mode 100644 group01/496740686/src/Impl/MyLinkedList.java delete mode 100644 group01/496740686/src/Impl/MyQueue.java delete mode 100644 group01/496740686/src/Impl/MyStack.java delete mode 100644 group01/496740686/src/Interface/ArrayList.java delete mode 100644 group01/496740686/src/Interface/BinaryTreeNode.java delete mode 100644 group01/496740686/src/Interface/Iterator.java delete mode 100644 group01/496740686/src/Interface/LinkedList.java delete mode 100644 group01/496740686/src/Interface/List.java delete mode 100644 group01/496740686/src/Interface/Queue.java delete mode 100644 group01/496740686/src/Interface/Stack.java delete mode 100644 group01/496740686/src/ex/MyArrest.java delete mode 100644 group01/751425278/.classpath delete mode 100644 group01/751425278/.gitignore delete mode 100644 group01/751425278/.project delete mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/ArrayList.java delete mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/BinaryTreeNode.java delete mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/Iterator.java delete mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/LinkedList.java delete mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/List.java delete mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/Queue.java delete mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/Stack.java delete mode 100644 group01/765324639/src/zavier/week01/basic/ArrayList.java delete mode 100644 group01/765324639/src/zavier/week01/basic/BinaryTreeNode.java delete mode 100644 group01/765324639/src/zavier/week01/basic/Iterator.java delete mode 100644 group01/765324639/src/zavier/week01/basic/LinkedList.java delete mode 100644 group01/765324639/src/zavier/week01/basic/List.java delete mode 100644 group01/765324639/src/zavier/week01/basic/Queue.java delete mode 100644 group01/765324639/src/zavier/week01/basic/Stack.java delete mode 100644 group01/765324639/src/zavier/week01/test/AllTests.java delete mode 100644 group01/765324639/src/zavier/week01/test/ArrayListTest.java delete mode 100644 group01/765324639/src/zavier/week01/test/BinaryTreeNodeTest.java delete mode 100644 group01/765324639/src/zavier/week01/test/LinkedListTest.java delete mode 100644 group01/765324639/src/zavier/week01/test/QueueTest.java delete mode 100644 group01/765324639/src/zavier/week01/test/StackTest.java delete mode 100644 group01/819048836/lvxg2017/src/basic/BinaryTree.java delete mode 100644 group01/819048836/lvxg2017/src/basic/BinaryTreeNode.java delete mode 100644 group01/819048836/lvxg2017/src/basic/MyArrayList.java delete mode 100644 group01/819048836/lvxg2017/src/basic/MyLinkedList.java delete mode 100644 group01/819048836/lvxg2017/src/basic/Queue.java delete mode 100644 group01/819048836/lvxg2017/src/basic/Stack.java delete mode 100644 group01/895457260/code/src/datastructure/basic/ArrayList.java delete mode 100644 group01/895457260/code/src/datastructure/basic/BinarySortedTree.java delete mode 100644 group01/895457260/code/src/datastructure/basic/BinaryTreeNode.java delete mode 100644 group01/895457260/code/src/datastructure/basic/Iterator.java delete mode 100644 group01/895457260/code/src/datastructure/basic/LinkedList.java delete mode 100644 group01/895457260/code/src/datastructure/basic/List.java delete mode 100644 group01/895457260/code/src/datastructure/basic/Queue.java delete mode 100644 group01/895457260/code/src/datastructure/basic/Stack.java delete mode 100644 group01/895457260/code/src/datastructure/exception/EmptyListException.java delete mode 100644 group01/895457260/code/src/datastructure/exception/EmptyQueueException.java delete mode 100644 group01/895457260/code/src/test/datastructure/basic/ArrayListTest.java delete mode 100644 group01/895457260/code/src/test/datastructure/basic/BinarySortedTreeTest.java delete mode 100644 group01/895457260/code/src/test/datastructure/basic/LinkedListTest.java delete mode 100644 group01/895457260/code/src/test/datastructure/basic/QueueTest.java delete mode 100644 group01/895457260/code/src/test/datastructure/basic/StackTest.java delete mode 100644 group01/895457260/code/src/test/datastructure/basic/TestSuite.java delete mode 100644 group01/932573198/20170220/.classpath delete mode 100644 group01/932573198/20170220/.gitignore delete mode 100644 group01/932573198/20170220/.project delete mode 100644 group01/932573198/20170220/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group01/932573198/20170220/src/com/coding/basic/ArrayList.java delete mode 100644 group01/932573198/20170220/src/com/coding/basic/BinaryTree.java delete mode 100644 group01/932573198/20170220/src/com/coding/basic/Iterator.java delete mode 100644 group01/932573198/20170220/src/com/coding/basic/LinkedList.java delete mode 100644 group01/932573198/20170220/src/com/coding/basic/List.java delete mode 100644 group01/932573198/20170220/src/com/coding/basic/Queue.java delete mode 100644 group01/932573198/20170220/src/com/coding/basic/Stack.java delete mode 100644 group01/932573198/20170220/src/com/coding/test/ArrayListTest.java delete mode 100644 group01/932573198/20170220/src/com/coding/test/BinaryTreeTest.java delete mode 100644 group01/932573198/20170220/src/com/coding/test/IteratorTest.java delete mode 100644 group01/932573198/20170220/src/com/coding/test/LinkedListTest.java delete mode 100644 group01/932573198/20170220/src/com/coding/test/QueueTest.java delete mode 100644 group01/932573198/20170220/src/com/coding/test/StackTest.java delete mode 100644 group01/954958168/954958168.md delete mode 100644 group01/954958168/class01/BasicDataStructure/.gitignore delete mode 100644 group01/954958168/class01/BasicDataStructure/pom.xml delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/ArrayList.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/BinaryTree.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Iterator.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/LinkedList.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/List.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Queue.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Stack.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericArrayList.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericIterator.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericLinkedList.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericList.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericQueue.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericStack.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/AllTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericAllTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java delete mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java delete mode 100644 group01/group01.md delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/ArrayList.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/BinaryTreeNode.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Iterator.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/LinkedList.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/List.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Queue.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Stack.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ArrayListTest.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/LinkedListTest.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ListTest.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/QueueTest.java delete mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/StackTest.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/ArrayList.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/BinaryTreeNode.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Iterator.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/LinkedList.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/List.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Queue.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Stack.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ArrayListTest.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/LinkedListTest.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ListTest.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/QueueTest.java delete mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/StackTest.java delete mode 100644 group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyArrayList.java delete mode 100644 group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyLinkedList.java delete mode 100644 group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyQueue.java delete mode 100644 group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyStack.java delete mode 100644 group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyArrayListTest.java delete mode 100644 group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyLinkedListTest.java delete mode 100644 group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyQueueTest.java delete mode 100644 group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyStackTest.java delete mode 100644 group02/527705641/.gitignore delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayList.java delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayListTest.java delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/BinaryTreeNode.java delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/Iterator.java delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/LinkedList.java delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/LinkedListTest.java delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/List.java delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/Queue.java delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/QueueTest.java delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/Stack.java delete mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/StackTest.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/ArrayList.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/BinaryTreeNode.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/Iterator.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/LinkedList.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/List.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/Queue.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/Stack.java delete mode 100644 group02/609990377/DataStructure/.gitignore delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/ArrayList.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/BinaryTreeNode.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Iterator.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/LinkedList.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/List.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Queue.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Stack.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/ArrayListTest.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/BinaryTreeNodeTest.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/LinkedListTest.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/QueueTest.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/StackTest.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/TestRunner.java delete mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/testCase.java delete mode 100644 group02/727171008/.classpath delete mode 100644 group02/727171008/.gitignore delete mode 100644 group02/727171008/.project delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/ArrayListTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/BinaryTreeNode.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/BinaryTreeNodeTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/Iterator.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/LinkedListTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java delete mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Iterator.java delete mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/List.java delete mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyArrayList.java delete mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyArrayListTest.java delete mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyLinkedList.java delete mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyLinkedListTest.java delete mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Queue.java delete mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/QueueTest.java delete mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Stack.java delete mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/StackTest.java delete mode 100644 group02/812350401/.gitignore delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/ArrayList.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/BinaryTreeNode.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/Iterator.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/IteratorImp.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/LinkedList.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/List.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/Queue.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/Stack.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ArrayListTest.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/BinaryTreeNodeTest.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/LinkedListTest.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ListTest.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/QueueTest.java delete mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/StackTest.java delete mode 100644 group02/851113375/.gitignore delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/ArrayList.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/BinaryTreeNode.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Iterator.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/LinkedList.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/List.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Queue.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Stack.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ArrayListTest.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/BinaryTreeNodeTest.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/LinkedListTest.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ListTest.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/QueueTest.java delete mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/StackTest.java delete mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayList.java delete mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayListTest.java delete mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/Iterator.java delete mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedList.java delete mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedListTest.java delete mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/List.java delete mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/Queue.java delete mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/QueueTest.java delete mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/Stack.java delete mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/StackTest.java delete mode 100644 group02/group02.md delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayList.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTree.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTreeNode.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Iterator.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/LinkedList.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/List.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Queue.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Stack.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayListTest.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/BinaryTreeTest.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/LinkedListTest.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/QueueTest.java" delete mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/StackTest.java" delete mode 100644 group03/1196051822/README delete mode 100644 group03/1360464792/.gitignore delete mode 100644 group03/1360464792/pom.xml delete mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/ArrayList.java delete mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/BinaryTree.java delete mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/BinaryTreeNode.java delete mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/Iterator.java delete mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/LinkedList.java delete mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/List.java delete mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/Queue.java delete mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/Stack.java delete mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/ArrayListTest.java delete mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/BinaryTreeTest.java delete mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/LinkedListTest.java delete mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/QueueTest.java delete mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/StackTest.java delete mode 100644 group03/172487938/Iterator.java delete mode 100644 group03/172487938/MyArrayList.java delete mode 100644 group03/172487938/MyLinkedList.java delete mode 100644 group03/172487938/MyList.java delete mode 100644 group03/172487938/Queue.java delete mode 100644 group03/172487938/Stack.java delete mode 100644 group03/172487938/TestMyArrayList.java delete mode 100644 group03/172487938/TestMyLinkedList.java delete mode 100644 group03/1753176091/bin/.gitignore delete mode 100644 group03/1753176091/src/com/coding/basic/ArrayList.java delete mode 100644 group03/1753176091/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group03/1753176091/src/com/coding/basic/FileUtil.java delete mode 100644 group03/1753176091/src/com/coding/basic/Iterator.java delete mode 100644 group03/1753176091/src/com/coding/basic/LinkedList.java delete mode 100644 group03/1753176091/src/com/coding/basic/List.java delete mode 100644 group03/1753176091/src/com/coding/basic/Queue.java delete mode 100644 group03/1753176091/src/com/coding/basic/Stack.java delete mode 100644 group03/2864885311/DS/.classpath delete mode 100644 group03/2864885311/DS/.gitignore delete mode 100644 group03/2864885311/DS/.project delete mode 100644 group03/2864885311/DS/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group03/2864885311/DS/src/com/coding/basic/ArrayList.java delete mode 100644 group03/2864885311/DS/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group03/2864885311/DS/src/com/coding/basic/Iterator.java delete mode 100644 group03/2864885311/DS/src/com/coding/basic/LinkedList.java delete mode 100644 group03/2864885311/DS/src/com/coding/basic/List.java delete mode 100644 group03/2864885311/DS/src/com/coding/basic/Queue.java delete mode 100644 group03/2864885311/DS/src/com/coding/basic/Stack.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/basic/ArrayList.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/basic/BinaryTree.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/basic/Iterator.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/basic/LinkedList.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/basic/List.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/basic/Queue.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/basic/Stack.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/test/ArrayListTest.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/test/BinaryTreeTest.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/test/LinkedListTest.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/test/QueueTest.java delete mode 100644 group03/345943980/2017Learning/src/com/coding/test/StackTest.java delete mode 100644 group03/510782645/.gitignore delete mode 100644 group03/510782645/src/com/coding/basic/ArrayList.java delete mode 100644 group03/510782645/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group03/510782645/src/com/coding/basic/Iterator.java delete mode 100644 group03/510782645/src/com/coding/basic/LinkedList.java delete mode 100644 group03/510782645/src/com/coding/basic/List.java delete mode 100644 group03/510782645/src/com/coding/basic/Queue.java delete mode 100644 group03/510782645/src/com/coding/basic/Stack.java delete mode 100644 group03/569045298/pom.xml delete mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java delete mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/BinaryTreeNode.java delete mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/Iterator.java delete mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java delete mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/List.java delete mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/Queue.java delete mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/Stack.java delete mode 100644 group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java delete mode 100644 group03/617187912/Learning02/.classpath delete mode 100644 group03/617187912/Learning02/.gitignore delete mode 100644 group03/617187912/Learning02/.project delete mode 100644 group03/617187912/Learning02/.settings/org.eclipse.core.resources.prefs delete mode 100644 group03/617187912/Learning02/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group03/617187912/Learning02/src/com/coding/basic/ArrayList.java delete mode 100644 group03/617187912/Learning02/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group03/617187912/Learning02/src/com/coding/basic/Iterator.java delete mode 100644 group03/617187912/Learning02/src/com/coding/basic/LinkedList.java delete mode 100644 group03/617187912/Learning02/src/com/coding/basic/List.java delete mode 100644 group03/617187912/Learning02/src/com/coding/basic/Queue.java delete mode 100644 group03/617187912/Learning02/src/com/coding/basic/Stack.java delete mode 100644 group03/617187912/Learning201702/.classpath delete mode 100644 group03/617187912/Learning201702/.gitignore delete mode 100644 group03/617187912/Learning201702/.project delete mode 100644 group03/617187912/Learning201702/.settings/org.eclipse.core.resources.prefs delete mode 100644 group03/617187912/Learning201702/src/com/coding/basic/ArrayList.java delete mode 100644 group03/617187912/Learning201702/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group03/617187912/Learning201702/src/com/coding/basic/Iterator.java delete mode 100644 group03/617187912/Learning201702/src/com/coding/basic/LinkedList.java delete mode 100644 group03/617187912/Learning201702/src/com/coding/basic/List.java delete mode 100644 group03/617187912/Learning201702/src/com/coding/basic/Queue.java delete mode 100644 group03/617187912/Learning201702/src/com/coding/basic/Stack.java delete mode 100644 group03/619224754/.classpath delete mode 100644 group03/619224754/.gitignore delete mode 100644 group03/619224754/.project delete mode 100644 group03/619224754/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group03/619224754/src/Main/Main.java delete mode 100644 group03/619224754/src/com/coding/basic/ArrayList.java delete mode 100644 group03/619224754/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group03/619224754/src/com/coding/basic/Iterator.java delete mode 100644 group03/619224754/src/com/coding/basic/LinkedList.java delete mode 100644 group03/619224754/src/com/coding/basic/List.java delete mode 100644 group03/619224754/src/com/coding/basic/Queue.java delete mode 100644 group03/619224754/src/com/coding/basic/Stack.java delete mode 100644 group03/619224754/src/test/ArrayListTest.java delete mode 100644 group03/664269713/DataStructure/.gitignore delete mode 100644 group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java delete mode 100644 group03/664269713/DataStructure/src/com/ace/coding/BinaryTreeNode.java delete mode 100644 group03/664269713/DataStructure/src/com/ace/coding/Iterator.java delete mode 100644 group03/664269713/DataStructure/src/com/ace/coding/LinkedList.java delete mode 100644 group03/664269713/DataStructure/src/com/ace/coding/List.java delete mode 100644 group03/664269713/DataStructure/src/com/ace/coding/Queue.java delete mode 100644 group03/664269713/DataStructure/src/com/ace/coding/Stack.java delete mode 100644 group03/763878069/.classpath delete mode 100644 group03/763878069/.gitignore delete mode 100644 group03/763878069/.project delete mode 100644 group03/763878069/src/cmj/datastructure/list/ArrayList.java delete mode 100644 group03/763878069/src/cmj/datastructure/list/LinkedList.java delete mode 100644 group03/763878069/src/cmj/datastructure/list/List.java delete mode 100644 group03/763878069/src/cmj/datastructure/list/Queue.java delete mode 100644 group03/763878069/src/cmj/datastructure/list/Stack.java delete mode 100644 group03/763878069/src/cmj/datastructure/tree/BSTree.java delete mode 100644 group03/763878069/src/cmj/datastructure/tree/BinaryTree.java delete mode 100644 group03/894844916/coding2017-01/.classpath delete mode 100644 group03/894844916/coding2017-01/.project delete mode 100644 group03/894844916/coding2017-01/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/ArrayList.java delete mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/Iterator.java delete mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/LinkedList.java delete mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/List.java delete mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/ListIndexException.java delete mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/Queue.java delete mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/Stack.java delete mode 100644 group03/group03.md delete mode 100644 group04/1020483199/1020483199Learning/.classpath delete mode 100644 group04/1020483199/1020483199Learning/.gitignore delete mode 100644 group04/1020483199/1020483199Learning/.project delete mode 100644 group04/1020483199/1020483199Learning/.settings/org.eclipse.core.resources.prefs delete mode 100644 group04/1020483199/1020483199Learning/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/ArrayList.java delete mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/Iterator.java delete mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/LinkedList.java delete mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/List.java delete mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/Queue.java delete mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/Stack.java delete mode 100644 group04/1020483199/1020483199Learning/src/com/coding/test/JavaTest.java delete mode 100644 group04/1020483199/RemoteSystemsTempFiles/.project delete mode 100644 group04/120549547/base/buil.bat delete mode 100644 group04/120549547/base/src/com/coding/basic/ArrayList.java delete mode 100644 group04/120549547/base/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group04/120549547/base/src/com/coding/basic/Iterator.java delete mode 100644 group04/120549547/base/src/com/coding/basic/LinkedList.java delete mode 100644 group04/120549547/base/src/com/coding/basic/List.java delete mode 100644 group04/120549547/base/src/com/coding/basic/Main.java delete mode 100644 group04/120549547/base/src/com/coding/basic/Queue.java delete mode 100644 group04/120549547/base/src/com/coding/basic/Stack.java delete mode 100644 group04/120549547/my.txt delete mode 100644 group04/120549547/shell.sh delete mode 100644 group04/1299310140/src/com/coding/basic/ArrayList.java delete mode 100644 group04/1299310140/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group04/1299310140/src/com/coding/basic/LinkedList.java delete mode 100644 group04/1299310140/src/com/coding/basic/Queue.java delete mode 100644 group04/1299310140/src/com/coding/basic/Stack.java delete mode 100644 group04/1751801281/.classpath delete mode 100644 group04/1751801281/.gitignore delete mode 100644 group04/1751801281/.project delete mode 100644 group04/1751801281/src/com/coding/basic/ArrayList.java delete mode 100644 group04/1751801281/src/com/coding/basic/Iterator.java delete mode 100644 group04/1751801281/src/com/coding/basic/LinkedList.java delete mode 100644 group04/1751801281/src/com/coding/basic/List.java delete mode 100644 group04/1751801281/src/com/coding/basic/Queue.java delete mode 100644 group04/1751801281/src/com/coding/basic/Stack.java delete mode 100644 group04/1751801281/test/com/coding/basic/ArrayListTest.java delete mode 100644 group04/1751801281/test/com/coding/basic/LinkedListTeat.java delete mode 100644 group04/1751801281/test/com/coding/basic/QueueTest.java delete mode 100644 group04/1751801281/test/com/coding/basic/StackTest.java delete mode 100644 group04/1796244932/.gitignore delete mode 100644 group04/1796244932/learn01/.gitignore delete mode 100644 group04/1796244932/learn01/pom.xml delete mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java delete mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java delete mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyIterator.java delete mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java delete mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyList.java delete mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java delete mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java delete mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java delete mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyBinaryTreeTest.java delete mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyLinkedListTest.java delete mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java delete mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java delete mode 100644 group04/1906242834/.classpath delete mode 100644 group04/1906242834/.gitignore delete mode 100644 group04/1906242834/.project delete mode 100644 group04/1906242834/src/com/coding/basic/ArrayList.java delete mode 100644 group04/1906242834/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group04/1906242834/src/com/coding/basic/Iterator.java delete mode 100644 group04/1906242834/src/com/coding/basic/LinkedList.java delete mode 100644 group04/1906242834/src/com/coding/basic/List.java delete mode 100644 group04/1906242834/src/com/coding/basic/Queue.java delete mode 100644 group04/1906242834/src/com/coding/basic/Stack.java delete mode 100644 group04/1972376180/.classpath delete mode 100644 group04/1972376180/.gitignore delete mode 100644 group04/1972376180/.project delete mode 100644 group04/1972376180/src/tong/java/one/MyArrayList.java delete mode 100644 group04/1972376180/src/tong/java/one/MyLinkedList.java delete mode 100644 group04/1972376180/src/tong/java/one/MyQueue.java delete mode 100644 group04/1972376180/src/tong/java/one/MyStack.java delete mode 100644 group04/2082945465/.gitignore delete mode 100644 group04/2082945465/week01/src/Hello.java delete mode 100644 group04/2082945465/week01/src/MyArrayList.java delete mode 100644 group04/2082945465/week01/src/MyIterator.java delete mode 100644 group04/2082945465/week01/src/MyLinkedList.java delete mode 100644 group04/2082945465/week01/src/MyList.java delete mode 100644 group04/2082945465/week01/src/MyQueue.java delete mode 100644 group04/2082945465/week01/src/MyStack.java delete mode 100644 group04/24658892/.classpath delete mode 100644 group04/24658892/.project delete mode 100644 group04/24658892/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group04/24658892/learnjava/build.gradle delete mode 100644 group04/24658892/learnjava/gradle/wrapper/gradle-wrapper.properties delete mode 100755 group04/24658892/learnjava/gradlew delete mode 100644 group04/24658892/learnjava/gradlew.bat delete mode 100644 group04/24658892/learnjava/settings.gradle delete mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/ArrayList.java delete mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/Iterator.java delete mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java delete mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/List.java delete mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java delete mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/Stack.java delete mode 100644 group04/24658892/learnjava/src/test/java/com/coding/basic/ArrayListTest.java delete mode 100644 group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java delete mode 100644 group04/274407594/226/.classpath delete mode 100644 group04/274407594/226/.gitignore delete mode 100644 group04/274407594/226/.project delete mode 100644 group04/274407594/226/.settings/org.eclipse.jdt.core.prefs delete mode 100644 "group04/312816708/blog/blog01/CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\343\200\201\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" delete mode 100644 group04/312816708/coding/coding01/.gitignore delete mode 100644 group04/312816708/coding/coding01/pom.xml delete mode 100644 group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyArrayList.java delete mode 100644 group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyLinkedList.java delete mode 100644 group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyList.java delete mode 100644 group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyQueue.java delete mode 100644 group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyStack.java delete mode 100644 "group04/349184132/post/CPU\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.docx" delete mode 100644 group04/349184132/src/Collection/Onehomework/ArrayList.java delete mode 100644 group04/349184132/src/Collection/Onehomework/BinaryTreeNode.java delete mode 100644 group04/349184132/src/Collection/Onehomework/Iterator.java delete mode 100644 group04/349184132/src/Collection/Onehomework/LinkedList.java delete mode 100644 group04/349184132/src/Collection/Onehomework/List.java delete mode 100644 group04/349184132/src/Collection/Onehomework/Queue.java delete mode 100644 group04/349184132/src/Collection/Onehomework/Stack.java delete mode 100644 group04/351121278/351121278/src/com/coding/basic/ArrayList.java delete mode 100644 group04/351121278/351121278/src/com/coding/basic/Iterator.java delete mode 100644 group04/351121278/351121278/src/com/coding/basic/LinkedList.java delete mode 100644 group04/351121278/351121278/src/com/coding/basic/List.java delete mode 100644 group04/351121278/351121278/src/com/coding/basic/Queue.java delete mode 100644 group04/351121278/351121278/src/com/coding/basic/Stack.java delete mode 100644 group04/474772605/.classpath delete mode 100644 group04/474772605/.gitignore delete mode 100644 group04/474772605/.project delete mode 100644 group04/474772605/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group04/474772605/src/com/coding/basic/ArrayList.java delete mode 100644 group04/474772605/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group04/474772605/src/com/coding/basic/Dinkedlist.java delete mode 100644 group04/474772605/src/com/coding/basic/Iterator.java delete mode 100644 group04/474772605/src/com/coding/basic/LinkedList.java delete mode 100644 group04/474772605/src/com/coding/basic/List.java delete mode 100644 group04/474772605/src/com/coding/basic/Queue.java delete mode 100644 group04/474772605/src/com/coding/basic/Stack.java delete mode 100644 group04/474772605/src/com/coding/basic/testarraylist.java delete mode 100644 group04/498654356/one/.classpath delete mode 100644 group04/498654356/one/.gitignore delete mode 100644 group04/498654356/one/.project delete mode 100644 group04/498654356/one/src/org/coding/one/ArrayList.java delete mode 100644 group04/498654356/one/src/org/coding/one/BinaryTreeNode.java delete mode 100644 group04/498654356/one/src/org/coding/one/LinkedList.java delete mode 100644 group04/498654356/one/src/org/coding/one/List.java delete mode 100644 group04/498654356/one/src/org/coding/one/Queue.java delete mode 100644 group04/498654356/one/src/org/coding/one/Stack.java delete mode 100644 group04/498654356/one/test/org/coding/one/AllTests.java delete mode 100644 group04/498654356/one/test/org/coding/one/ArrayListTest.java delete mode 100644 group04/498654356/one/test/org/coding/one/BinaryTreeNodeTest.java delete mode 100644 group04/498654356/one/test/org/coding/one/LinkedListTest.java delete mode 100644 group04/498654356/one/test/org/coding/one/QueueTest.java delete mode 100644 group04/498654356/one/test/org/coding/one/StackTest.java delete mode 100644 group04/564451732/.classpath delete mode 100644 group04/564451732/.gitignore delete mode 100644 group04/564451732/.project delete mode 100644 group04/564451732/src/DataStructureTest.java delete mode 100644 group04/564451732/src/Test.java delete mode 100644 group04/564451732/src/hw1/ArrayListImpl.java delete mode 100644 group04/564451732/src/hw1/BinaryTreeNode.java delete mode 100644 group04/564451732/src/hw1/Iterator.java delete mode 100644 group04/564451732/src/hw1/LinkedList.java delete mode 100644 group04/564451732/src/hw1/List.java delete mode 100644 group04/564451732/src/hw1/QueueImpl.java delete mode 100644 group04/564451732/src/hw1/StackImpl.java delete mode 100644 group04/821655640/learning_projects/project_basic_001/.gitignore delete mode 100644 group04/821655640/learning_projects/project_basic_001/pom.xml delete mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/ArrayList.java delete mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Iterator.java delete mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/LinkedList.java delete mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/List.java delete mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Queue.java delete mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Stack.java delete mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/sunline/project_basic_001/App.java delete mode 100644 group04/821655640/learning_projects/project_basic_001/src/test/java/com/coding/basic/TestBasic.java delete mode 100644 group04/821655640/learning_projects/project_basic_001/src/test/java/com/sunline/project_basic_001/AppTest.java delete mode 100644 group04/844028312/.gitignore delete mode 100644 group04/844028312/one/.classpath delete mode 100644 group04/844028312/one/.gitignore delete mode 100644 group04/844028312/one/.project delete mode 100644 group04/844028312/one/src/com/coding/basic/ArrayList.java delete mode 100644 group04/844028312/one/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group04/844028312/one/src/com/coding/basic/Iterator.java delete mode 100644 group04/844028312/one/src/com/coding/basic/JavaTest.java delete mode 100644 group04/844028312/one/src/com/coding/basic/LinkedList.java delete mode 100644 group04/844028312/one/src/com/coding/basic/List.java delete mode 100644 group04/844028312/one/src/com/coding/basic/Queue.java delete mode 100644 group04/844028312/one/src/com/coding/basic/Stack.java delete mode 100644 group04/844028312/one/src/com/coding/test/ArrayListTest.java delete mode 100644 group04/844028312/one/src/com/coding/test/BinaryTreeNodeTest.java delete mode 100644 group04/844028312/one/src/com/coding/test/LinkedListTest.java delete mode 100644 group04/844028312/one/src/com/coding/test/QueueTest.java delete mode 100644 group04/844028312/one/src/com/coding/test/StackTest.java delete mode 100644 group04/916758663/learn01/.gitignore delete mode 100644 group04/916758663/learn01/learn01.iml delete mode 100644 group04/916758663/learn01/pom.xml delete mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/ArrayList.java delete mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/Iterator.java delete mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/LinkedList.java delete mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/List.java delete mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/Queue.java delete mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/Stack.java delete mode 100644 group04/916758663/learn01/src/test/java/com/coding/basic/ArrayListTest.java delete mode 100644 group04/916758663/learn01/src/test/java/com/coding/basic/JavaArrayListTest.java delete mode 100644 group04/916758663/learn01/src/test/java/com/coding/basic/LinkedListTest.java delete mode 100644 group04/916758663/learn01/src/test/java/com/coding/basic/QueueTest.java delete mode 100644 group04/916758663/learn01/src/test/java/com/coding/basic/StackTest.java delete mode 100644 group04/group04.md delete mode 100644 group05/1026626960/.classpath delete mode 100644 group05/1026626960/.gitignore delete mode 100644 group05/1026626960/.project delete mode 100644 group05/1026626960/src/cn/study1/myIterator.java delete mode 100644 group05/1026626960/src/cn/study1/myQueue.java delete mode 100644 group05/1026626960/src/cn/study1/myStack.java delete mode 100644 group05/1094051862/test01/.classpath delete mode 100644 group05/1094051862/test01/.gitignore delete mode 100644 group05/1094051862/test01/.project delete mode 100644 group05/1094051862/test01/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group05/1094051862/test01/src/com/coding/basic/.gitignore delete mode 100644 group05/1094051862/test01/src/com/coding/basic/ArrayList.java delete mode 100644 group05/1094051862/test01/src/com/coding/basic/ArrayListTest.java delete mode 100644 group05/1094051862/test01/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group05/1094051862/test01/src/com/coding/basic/Iterator.java delete mode 100644 group05/1094051862/test01/src/com/coding/basic/LinkedList.java delete mode 100644 group05/1094051862/test01/src/com/coding/basic/LinkedListTest.java delete mode 100644 group05/1094051862/test01/src/com/coding/basic/List.java delete mode 100644 group05/1094051862/test01/src/com/coding/basic/Queue.java delete mode 100644 group05/1094051862/test01/src/com/coding/basic/QueueTest.java delete mode 100644 group05/1094051862/test01/src/com/coding/basic/Stack.java delete mode 100644 group05/1094051862/test01/src/com/coding/basic/StackTest.java delete mode 100644 group05/1377699408/.gitignore delete mode 100644 "group05/1377699408/\344\275\234\344\270\232/20170226/src/list/ArrayList.java" delete mode 100644 "group05/1377699408/\344\275\234\344\270\232/20170226/src/test/ArrayListTest.java" delete mode 100644 group05/183127807/HomeWork0226/.idea/misc.xml delete mode 100644 group05/183127807/HomeWork0226/.idea/modules.xml delete mode 100644 group05/183127807/HomeWork0226/.idea/vcs.xml delete mode 100644 group05/183127807/HomeWork0226/.idea/workspace.xml delete mode 100644 group05/183127807/HomeWork0226/HomeWork0226.iml delete mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/ArrayList.java delete mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/Iterator.java delete mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/LinkedList.java delete mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/List.java delete mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/Queue.java delete mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/Stack.java delete mode 100644 group05/284422826/.gitignore delete mode 100644 group05/284422826/src/com/github/zhanglifeng/coding2017/basic/ArrayList.java delete mode 100644 group05/284422826/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java delete mode 100644 group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Iterator.java delete mode 100644 group05/284422826/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java delete mode 100644 group05/284422826/src/com/github/zhanglifeng/coding2017/basic/List.java delete mode 100644 group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Queue.java delete mode 100644 group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Stack.java delete mode 100644 group05/371492887/task_01/.classpath delete mode 100644 group05/371492887/task_01/.gitignore delete mode 100644 group05/371492887/task_01/.project delete mode 100644 group05/371492887/task_01/src/com/nitasty/test/ArrayListTest.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/test/BinaryTreeTest.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/test/LinkedListTest.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/test/QueueTest.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/test/StackTest.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/util/ArrayList.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/util/BinaryTree.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/util/BinaryTreeNode.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/util/Iterator.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/util/LinkedList.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/util/List.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/util/Queue.java delete mode 100644 group05/371492887/task_01/src/com/nitasty/util/Stack.java delete mode 100644 group05/399258474/.classpath delete mode 100644 group05/399258474/.gitignore delete mode 100644 group05/399258474/.project delete mode 100644 group05/399258474/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group05/399258474/src/com/coding/basic/ArrayList.java delete mode 100644 group05/399258474/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group05/399258474/src/com/coding/basic/Iterator.java delete mode 100644 group05/399258474/src/com/coding/basic/LinkedList.java delete mode 100644 group05/399258474/src/com/coding/basic/List.java delete mode 100644 group05/399258474/src/com/coding/basic/Queue.java delete mode 100644 group05/399258474/src/com/coding/basic/Stack.java delete mode 100644 group05/399258474/src/test/BasicTest.java delete mode 100644 group05/441517454/work1/.classpath delete mode 100644 group05/441517454/work1/.gitignore delete mode 100644 group05/441517454/work1/.project delete mode 100644 group05/441517454/work1/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group05/441517454/work1/src/com/coding/basic/ArrayList.java delete mode 100644 group05/441517454/work1/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group05/441517454/work1/src/com/coding/basic/Iterator.java delete mode 100644 group05/441517454/work1/src/com/coding/basic/LinkedList.java delete mode 100644 group05/441517454/work1/src/com/coding/basic/List.java delete mode 100644 group05/441517454/work1/src/com/coding/basic/Queue.java delete mode 100644 group05/441517454/work1/src/com/coding/basic/Stack.java delete mode 100644 group05/441517454/work1/src/com/coding/basic/Test1.java delete mode 100644 group05/515505513/RemoteSystemsTempFiles/.project delete mode 100644 group05/515505513/Task01/.classpath delete mode 100644 group05/515505513/Task01/.gitignore delete mode 100644 group05/515505513/Task01/.project delete mode 100644 group05/515505513/Task01/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group05/515505513/Task01/src/com/coding/basic/ArrayList.java delete mode 100644 group05/515505513/Task01/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group05/515505513/Task01/src/com/coding/basic/Iterator.java delete mode 100644 group05/515505513/Task01/src/com/coding/basic/LinkedList.java delete mode 100644 group05/515505513/Task01/src/com/coding/basic/List.java delete mode 100644 group05/515505513/Task01/src/com/coding/basic/Queue.java delete mode 100644 group05/515505513/Task01/src/com/coding/basic/Stack.java delete mode 100644 group05/515505513/Task01/src/com/coding/basic/TestExample.java delete mode 100644 group05/578505552/.gitignore delete mode 100644 group05/578505552/578505552.iml delete mode 100644 group05/578505552/pom.xml delete mode 100644 group05/578505552/src/main/java/com/coding/basic/ArrayList.java delete mode 100644 group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group05/578505552/src/main/java/com/coding/basic/Iterator.java delete mode 100644 group05/578505552/src/main/java/com/coding/basic/LinkedList.java delete mode 100644 group05/578505552/src/main/java/com/coding/basic/List.java delete mode 100644 group05/578505552/src/main/java/com/coding/basic/Queue.java delete mode 100644 group05/578505552/src/main/java/com/coding/basic/Stack.java delete mode 100644 group05/578505552/src/test/java/JavaTest.java delete mode 100644 group05/578505552/src/test/java/com/coding/basic/ArrayListTest.java delete mode 100644 group05/578505552/src/test/java/com/coding/basic/QueueTest.java delete mode 100644 group05/578505552/src/test/java/com/coding/basic/StackTest.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/.gitignore delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/job_2017_02_19_data_structure.iml delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/ArrayListImpl.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/BinaryTreeNode.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/LinkedListImpl.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/StackImpl.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IIterator.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IList.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IQueue.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/ArrayListImplTest.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/BinaryTreeNodeTest.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IQueueImplTest.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IStackImplTest.java delete mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/LinkedListImplTest.java delete mode 100644 group05/810574652/.classpath delete mode 100644 group05/810574652/.gitignore delete mode 100644 group05/810574652/.project delete mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/basic/ArrayList.java delete mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/basic/LinkedList.java delete mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/basic/List.java delete mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/basic/Queue.java delete mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/basic/Stack.java delete mode 100644 "group05/810574652/src/com/github/PingPi357/coding2017/basic/\350\257\264\346\230\216" delete mode 100644 group05/group05.md delete mode 100644 group06/group06.md delete mode 100644 "group07/1046545622/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/1058267830/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/1070440331/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/1280157271/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/1448276993/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/1519504320/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/1520332119/git\345\221\275\344\273\244.txt" delete mode 100644 group07/1536161030/.classpath delete mode 100644 group07/1536161030/.gitignore delete mode 100644 group07/1536161030/.project delete mode 100644 group07/1536161030/.settings/org.eclipse.core.resources.prefs delete mode 100644 "group07/1536161030/CPU,\345\206\205\345\255\230,\347\241\254\347\233\230,\346\214\207\344\273\244.txt" delete mode 100644 "group07/1536161030/git\345\221\275\344\273\244.txt" delete mode 100644 group07/1536161030/src/com/coding/basic/ArrayList.java delete mode 100644 group07/1536161030/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group07/1536161030/src/com/coding/basic/Iterator.java delete mode 100644 group07/1536161030/src/com/coding/basic/LinkedList.java delete mode 100644 group07/1536161030/src/com/coding/basic/List.java delete mode 100644 group07/1536161030/src/com/coding/basic/Queue.java delete mode 100644 group07/1536161030/src/com/coding/basic/Stack.java delete mode 100644 group07/1536161030/src/com/coding/test/ArrayListTest.java delete mode 100644 group07/1536161030/src/com/coding/test/BinaryTreeNodeTest.java delete mode 100644 group07/1536161030/src/com/coding/test/LinkedListTest.java delete mode 100644 group07/1536161030/src/com/coding/test/QueueTest.java delete mode 100644 group07/1536161030/src/com/coding/test/StackTest.java delete mode 100644 "group07/178007127/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/20409287/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/2306826375/git\345\221\275\344\273\244.txt" delete mode 100644 group07/2306826375/txt delete mode 100644 "group07/2708094737/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/2915553181/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/328536398/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/396868934/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/43819473/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/466199956/git\345\221\275\344\273\244.txt" delete mode 100644 group07/476770768/MyDataStructure/.classpath delete mode 100644 group07/476770768/MyDataStructure/.gitignore delete mode 100644 group07/476770768/MyDataStructure/.project delete mode 100644 group07/476770768/MyDataStructure/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyArrayList.java delete mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyIterator.java delete mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyLinkedList.java delete mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyList.java delete mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyQueue.java delete mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyStack.java delete mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/testFile.java delete mode 100644 "group07/476770768/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/515372252/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/562247675/git\345\221\275\344\273\244.txt" delete mode 100644 group07/562247675/homework/.gitignore delete mode 100644 group07/562247675/homework/homework-0226/pom.xml delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayList.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayListTest.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNode.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNodeTest.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyIterator.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedList.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedListTest.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyList.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueue.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueueTest.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStack.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStackTest.java delete mode 100644 group07/562247675/homework/homework-0226/src/main/resources/readme.md delete mode 100644 group07/562247675/homework/homework-0226/src/test/resources/readme.md delete mode 100644 group07/562247675/homework/pom.xml delete mode 100644 group07/562247675/homework/readme.md delete mode 100644 group07/562247675/notebook/readme.md delete mode 100644 "group07/598812995/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/603622009/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/724319952/git\345\221\275\344\273\244.txt" delete mode 100644 "group07/752262774/git\345\221\275\344\273\244.txt" delete mode 100644 group07/764189149/.classpath delete mode 100644 group07/764189149/.gitignore delete mode 100644 group07/764189149/.project delete mode 100644 group07/764189149/src/firstHomeWork/util/ArrayList.java delete mode 100644 group07/764189149/src/firstHomeWork/util/BinaryTreeNode.java delete mode 100644 group07/764189149/src/firstHomeWork/util/DoubleLinkedList.java delete mode 100644 group07/764189149/src/firstHomeWork/util/Iterator.java delete mode 100644 group07/764189149/src/firstHomeWork/util/List.java delete mode 100644 group07/764189149/src/firstHomeWork/util/Queue.java delete mode 100644 group07/764189149/src/firstHomeWork/util/Stack.java delete mode 100644 "group07/770164810/git\345\221\275\344\273\244.txt" delete mode 100644 group07/770164810/test.txt delete mode 100644 group07/group07.md delete mode 100644 group08/108621969/2-26/com/coding/basic/ArrayList.java delete mode 100644 group08/108621969/2-26/com/coding/basic/BinaryTreeNode.java delete mode 100644 group08/108621969/2-26/com/coding/basic/Iterator.java delete mode 100644 group08/108621969/2-26/com/coding/basic/LinkedList.java delete mode 100644 group08/108621969/2-26/com/coding/basic/List.java delete mode 100644 group08/108621969/2-26/com/coding/basic/Queue.java delete mode 100644 group08/108621969/2-26/com/coding/basic/Stack.java delete mode 100644 group08/108621969/README.md delete mode 100644 group08/108621969/article/Comp-Units-Relations(2-16).md delete mode 100644 group08/1144989424/Readme.md delete mode 100644 group08/1144989424/firstPractice/readme.md delete mode 100644 group08/1144989424/firstPractice/src/basic/BinaryTreeNode.java delete mode 100644 group08/1144989424/firstPractice/src/basic/MyArrayList.java delete mode 100644 group08/1144989424/firstPractice/src/basic/MyIterator.java delete mode 100644 group08/1144989424/firstPractice/src/basic/MyLinkedList.java delete mode 100644 group08/1144989424/firstPractice/src/basic/MyList.java delete mode 100644 group08/1144989424/firstPractice/src/basic/MyQueue.java delete mode 100644 group08/1144989424/firstPractice/src/basic/MySortBinaryTree.java delete mode 100644 group08/1144989424/firstPractice/src/basic/MyStack.java delete mode 100644 "group08/121027265/0226/cpu_\345\206\205\345\255\230_\347\241\254\347\233\230_\346\214\207\344\273\244\344\271\213\351\227\264\345\205\263\347\263\273.md" delete mode 100644 group08/121027265/0226/src/com/my/list/ArrayList.java delete mode 100644 group08/121027265/0226/src/com/my/list/LinkedList.java delete mode 100644 group08/121027265/0226/src/com/my/list/Test.java delete mode 100644 group08/121027265/README.md delete mode 100644 group08/1226637491/2_26/ArrayList.java delete mode 100644 group08/1226637491/2_26/LinkedList.java delete mode 100644 group08/1226637491/2_26/Queue.java delete mode 100644 group08/1226637491/2_26/Stack.java delete mode 100644 "group08/1226637491/2_26/\346\226\207\347\253\240\346\211\200\345\234\250\347\232\204\347\275\221\345\235\200.txt" delete mode 100644 group08/125980622/125980622.js delete mode 100644 group08/125980622/first_hw/ArrayList.java delete mode 100644 group08/125980622/first_hw/BinaryTreeNode.java delete mode 100644 group08/125980622/first_hw/Iterator.java delete mode 100644 group08/125980622/first_hw/LinkedList.java delete mode 100644 group08/125980622/first_hw/List.java delete mode 100644 group08/125980622/first_hw/Queue.java delete mode 100644 group08/125980622/first_hw/Stack.java delete mode 100644 group08/125980622/first_hw/myIterator.java delete mode 100644 group08/1277959541/1277959541 delete mode 100644 group08/1287324781/1287324781 delete mode 100644 group08/1425809544/02-26/com/xuyangyang/util/BinaryTree.java delete mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyArrayList.java delete mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyIterator.java delete mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyLinkedList.java delete mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyList.java delete mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyQueueArray.java delete mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyQueueLinked.java delete mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyStack.java delete mode 100644 group08/1425809544/02-26/com/xuyangyang/util/Test.java delete mode 100644 "group08/1425809544/02-26/cpu \345\206\205\345\255\230 \347\241\254\347\233\230 \345\222\214\346\214\207\344\273\244\347\232\204\345\205\263\347\263\273.txt" delete mode 100644 "group08/1425809544/02-26/\346\226\207\347\253\240\351\223\276\346\216\245-java\351\233\206\345\220\210 \345\256\271\345\231\250 \347\256\200\345\215\225\346\246\202\350\277\260" delete mode 100644 group08/1425809544/1425809544.md delete mode 100644 group08/1509102580/2.27/ArrayList.java delete mode 100644 group08/1509102580/2.27/Iterator.java delete mode 100644 group08/1509102580/2.27/LinkedList.java delete mode 100644 group08/1509102580/2.27/List.java delete mode 100644 group08/1509102580/2.27/Queue.java delete mode 100644 group08/1509102580/2.27/Stack.java delete mode 100644 "group08/1509102580/2.27/\346\226\207\347\253\240" delete mode 100644 group08/2420826330/2420826330.md delete mode 100644 group08/283677872/2-26/.classpath delete mode 100644 group08/283677872/2-26/.gitignore delete mode 100644 group08/283677872/2-26/.project delete mode 100644 "group08/283677872/2-26/CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\345\205\263\347\263\273.docx" delete mode 100644 group08/283677872/2-26/src/com/coding/basic/ArrayList.java delete mode 100644 group08/283677872/2-26/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group08/283677872/2-26/src/com/coding/basic/Iterator.java delete mode 100644 group08/283677872/2-26/src/com/coding/basic/LinkedList.java delete mode 100644 group08/283677872/2-26/src/com/coding/basic/List.java delete mode 100644 group08/283677872/2-26/src/com/coding/basic/Main.java delete mode 100644 group08/283677872/2-26/src/com/coding/basic/Queue.java delete mode 100644 group08/283677872/2-26/src/com/coding/basic/Stack.java delete mode 100644 "group08/286060098/2-26/blong/\345\237\272\346\234\254\347\273\223\346\236\204.md" delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/AbstractCollection.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Collection.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Iterator.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/ArrayList.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/LinkedList.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/List.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/LinkQueue.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/Queue.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/LinkStack.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/Stack.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/tree/AbstractTree.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryNode.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryTree.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/tree/Tree.java delete mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/utils/Math.java delete mode 100644 group08/286060098/readme.md delete mode 100644 group08/406166841/2-26/CPU.md delete mode 100644 group08/406166841/2-26/CustomArrayList.java delete mode 100644 group08/406166841/2-26/CustomLinkedList.java delete mode 100644 group08/406166841/2-26/CustomQueue.java delete mode 100644 group08/406166841/2-26/CustomStack.java delete mode 100644 group08/406166841/2-26/Iterator.java delete mode 100644 group08/406166841/2-26/List.java delete mode 100644 group08/406166841/406166841.md delete mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/ArrayList.java" delete mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/BinaryTreeNode.java" delete mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Iterator.java" delete mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/LinkedList.java" delete mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/List.java" delete mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Queue.java" delete mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Stack.java" delete mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Test.java" delete mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.doc" delete mode 100644 "group08/619057560/2-26/article/CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.pdf" delete mode 100644 group08/619057560/2-26/code/com/coding/basic/ArrayList.java delete mode 100644 group08/619057560/2-26/code/com/coding/basic/BinaryTreeNode.java delete mode 100644 group08/619057560/2-26/code/com/coding/basic/Iterator.java delete mode 100644 group08/619057560/2-26/code/com/coding/basic/LinkedList.java delete mode 100644 group08/619057560/2-26/code/com/coding/basic/List.java delete mode 100644 group08/619057560/2-26/code/com/coding/basic/Queue.java delete mode 100644 group08/619057560/2-26/code/com/coding/basic/Stack.java delete mode 100644 group08/619057560/2-26/code/com/coding/test/Main.java delete mode 100644 group08/619057560/CHHSAlex.md delete mode 100644 group08/648354678/README.md delete mode 100644 group08/649859235/2-26/article.md delete mode 100644 group08/649859235/2-26/com/vvv/base/ArrayList.java delete mode 100644 group08/649859235/2-26/com/vvv/base/BinaryTreeNode.java delete mode 100644 group08/649859235/2-26/com/vvv/base/IList.java delete mode 100644 group08/649859235/2-26/com/vvv/base/LinkedList.java delete mode 100644 group08/649859235/2-26/com/vvv/base/Queue.java delete mode 100644 group08/649859235/2-26/com/vvv/base/Stack.java delete mode 100644 group08/649859235/README.md delete mode 100644 group08/729770920/.gitignore delete mode 100644 group08/729770920/2-26/resource/report.txt delete mode 100644 group08/729770920/2-26/src/com/coding/basic/ArrayList.java delete mode 100644 group08/729770920/2-26/src/com/coding/basic/BinaryTree.java delete mode 100644 group08/729770920/2-26/src/com/coding/basic/Iterator.java delete mode 100644 group08/729770920/2-26/src/com/coding/basic/LinkedList.java delete mode 100644 group08/729770920/2-26/src/com/coding/basic/List.java delete mode 100644 group08/729770920/2-26/src/com/coding/basic/Queue.java delete mode 100644 group08/729770920/2-26/src/com/coding/basic/Stack.java delete mode 100644 group08/729770920/README.md delete mode 100644 group08/769638826/2-27/ArrayList.java delete mode 100644 group08/769638826/2-27/ArrayListTest.java delete mode 100644 group08/769638826/2-27/Iterator.java delete mode 100644 group08/769638826/2-27/LinkedList.java delete mode 100644 group08/769638826/2-27/LinkedListTest.java delete mode 100644 group08/769638826/2-27/List.java delete mode 100644 group08/769638826/2-27/Queue.java delete mode 100644 group08/769638826/2-27/QueueTest.java delete mode 100644 group08/769638826/2-27/Stack.java delete mode 100644 group08/769638826/2-27/StackTest.java delete mode 100644 group08/769638826/README.md delete mode 100644 group08/782476895/20170225/ArrayList.java delete mode 100644 group08/782476895/20170225/LinkedList.java delete mode 100644 group08/782476895/20170225/List.java delete mode 100644 group08/782476895/20170225/Queue.java delete mode 100644 group08/782476895/20170225/Stack.java delete mode 100644 "group08/782476895/20170225/\346\217\217\350\277\260CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" delete mode 100644 group08/875325254/2-26/ArrayList.java delete mode 100644 group08/875325254/2-26/LinkList.java delete mode 100644 group08/875325254/2-26/Queue.java delete mode 100644 group08/875325254/2-26/Stack.java delete mode 100644 group08/875325254/2-26/Test.java delete mode 100644 group08/875325254/875325254.md delete mode 100644 group08/group08.md delete mode 100644 group09/group09.md delete mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java" delete mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/BinaryTreeNode.java" delete mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Iterator.java" delete mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/JavaTest.java" delete mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java" delete mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/List.java" delete mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Queue.java" delete mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Stack.java" delete mode 100644 group10/205301442/src/com/coding/week1/ArrayList.java delete mode 100644 group10/205301442/src/com/coding/week1/BinaryTreeNode.java delete mode 100644 group10/205301442/src/com/coding/week1/Iterator.java delete mode 100644 group10/205301442/src/com/coding/week1/LinkedList.java delete mode 100644 group10/205301442/src/com/coding/week1/List.java delete mode 100644 group10/205301442/src/com/coding/week1/Queue.java delete mode 100644 group10/205301442/src/com/coding/week1/Stack.java delete mode 100644 group10/205301442/test/com/coding/week1/AllTests.java delete mode 100644 group10/205301442/test/com/coding/week1/TestArrayList.java delete mode 100644 group10/205301442/test/com/coding/week1/TestBiranyTreeNode.java delete mode 100644 group10/205301442/test/com/coding/week1/TestLinkedList.java delete mode 100644 group10/205301442/test/com/coding/week1/TestQueue.java delete mode 100644 group10/205301442/test/com/coding/week1/TestStack.java delete mode 100644 "group10/205301442/\346\226\207\347\253\240\345\234\260\345\235\200.txt" delete mode 100644 group10/3314793852/.classpath delete mode 100644 group10/3314793852/.gitignore delete mode 100644 group10/3314793852/.project delete mode 100644 group10/3314793852/src/myList/MyArrayList.java delete mode 100644 group10/3314793852/src/myList/MyBinarySearchTree.java delete mode 100644 group10/3314793852/src/myList/MyIterator.java delete mode 100644 group10/3314793852/src/myList/MyLinkedList.java delete mode 100644 group10/3314793852/src/myList/MyQueue.java delete mode 100644 group10/3314793852/src/myList/MyStack.java delete mode 100644 group10/3314793852/src/myList/Test.java delete mode 100644 group10/353261578/.classpath delete mode 100644 group10/353261578/.gitignore delete mode 100644 group10/353261578/.project delete mode 100644 group10/353261578/src/com/sx/structures/BinaryNode.java delete mode 100644 group10/353261578/src/com/sx/structures/BinaryTree.java delete mode 100644 group10/353261578/src/com/sx/structures/Iterator.java delete mode 100644 group10/353261578/src/com/sx/structures/MyArrayList.java delete mode 100644 group10/353261578/src/com/sx/structures/MyLinkedList.java delete mode 100644 group10/353261578/src/com/sx/structures/MyList.java delete mode 100644 group10/353261578/src/com/sx/structures/MyQueue.java delete mode 100644 group10/353261578/src/com/sx/structures/MyStack.java delete mode 100644 group10/353261578/test/com/test/BinaryTreeTest.java delete mode 100644 group10/353261578/test/com/test/MyArrayListTest.java delete mode 100644 group10/353261578/test/com/test/MyLinkedListTest.java delete mode 100644 group10/353261578/test/com/test/StaQueTest.java delete mode 100644 group10/364298692/article.md delete mode 100644 group10/364298692/cs/.classpath delete mode 100644 group10/364298692/cs/.gitignore delete mode 100644 group10/364298692/cs/.project delete mode 100644 group10/364298692/cs/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group10/364298692/cs/src/com/coding/basic/ArrayList.java delete mode 100644 group10/364298692/cs/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group10/364298692/cs/src/com/coding/basic/Iterator.java delete mode 100644 group10/364298692/cs/src/com/coding/basic/LinkedList.java delete mode 100644 group10/364298692/cs/src/com/coding/basic/List.java delete mode 100644 group10/364298692/cs/src/com/coding/basic/Queue.java delete mode 100644 group10/364298692/cs/src/com/coding/basic/Stack.java delete mode 100644 group10/569420966/struct/pom.xml delete mode 100644 group10/569420966/struct/src/main/java/com/myutil/ArrayList.java delete mode 100644 group10/569420966/struct/src/main/java/com/myutil/BinaryTreeNode.java delete mode 100644 group10/569420966/struct/src/main/java/com/myutil/Iterator.java delete mode 100644 group10/569420966/struct/src/main/java/com/myutil/LinkedList.java delete mode 100644 group10/569420966/struct/src/main/java/com/myutil/List.java delete mode 100644 group10/569420966/struct/src/main/java/com/myutil/Queue.java delete mode 100644 group10/569420966/struct/src/main/java/com/myutil/Stack.java delete mode 100644 group10/584709796/worka/.classpath delete mode 100644 group10/584709796/worka/.gitignore delete mode 100644 group10/584709796/worka/.project delete mode 100644 group10/584709796/worka/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group10/584709796/worka/src/com/coding/basic/ArrayList.java delete mode 100644 group10/584709796/worka/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group10/584709796/worka/src/com/coding/basic/DemoTest.java delete mode 100644 group10/584709796/worka/src/com/coding/basic/Iterator.java delete mode 100644 group10/584709796/worka/src/com/coding/basic/LinkedList.java delete mode 100644 group10/584709796/worka/src/com/coding/basic/List.java delete mode 100644 group10/584709796/worka/src/com/coding/basic/Queue.java delete mode 100644 group10/584709796/worka/src/com/coding/basic/ReadMe.txt delete mode 100644 group10/584709796/worka/src/com/coding/basic/Stack.java delete mode 100644 "group10/584709796/worka/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232\357\274\232\345\206\205\345\255\230\343\200\201\346\214\207\344\273\244\343\200\201cpu.pdf" delete mode 100644 group10/595128841/Readme.txt delete mode 100644 group10/595128841/src/org/le/ArrayList.java delete mode 100644 group10/595128841/src/org/le/LinkedList.java delete mode 100644 group10/595128841/src/org/le/List.java delete mode 100644 group10/630505243/src/com/coding/basic/ArrayList.java delete mode 100644 group10/630505243/src/com/coding/basic/ArrayListTest.java delete mode 100644 group10/630505243/src/com/coding/basic/LinkedList.java delete mode 100644 group10/630505243/src/com/coding/basic/LinkedListTest.java delete mode 100644 group10/630505243/src/com/coding/basic/List.java delete mode 100644 group10/706097141/learning/src/com/hmily/learning/BinaryTreeNode.java delete mode 100644 group10/706097141/learning/src/com/hmily/learning/Iterator.java delete mode 100644 group10/706097141/learning/src/com/hmily/learning/LinkedList.java delete mode 100644 group10/706097141/learning/src/com/hmily/learning/List.java delete mode 100644 group10/706097141/learning/src/com/hmily/learning/MyArrayList.java delete mode 100644 group10/706097141/learning/src/com/hmily/learning/MyQueue.java delete mode 100644 group10/706097141/learning/src/com/hmily/learning/MyStack.java delete mode 100644 group10/706097141/learning/src/com/hmily/test/MyTest.java delete mode 100644 group10/875867419/.classpath delete mode 100644 group10/875867419/.gitignore delete mode 100644 group10/875867419/.project delete mode 100644 group10/875867419/src/com/work/week01/MyArrayList.java delete mode 100644 group10/875867419/src/com/work/week01/MyBinaryTree.java delete mode 100644 group10/875867419/src/com/work/week01/MyIterator.java delete mode 100644 group10/875867419/src/com/work/week01/MyLinkedList.java delete mode 100644 group10/875867419/src/com/work/week01/MyList.java delete mode 100644 group10/875867419/src/com/work/week01/MyQueue.java delete mode 100644 group10/875867419/src/com/work/week01/MyStack.java delete mode 100644 "group10/875867419/src/com/work/week01/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" delete mode 100644 group10/group10.md delete mode 100644 group11/1178243325/DataStructure/build.gradle delete mode 100644 group11/1178243325/DataStructure/readme.md delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/Main.java delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/ArrayList.java delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/Iterator.java delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/LinkedList.java delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/List.java delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/Queue.java delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/Stack.java delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/ConcurrentModificationException.java delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyQueueException.java delete mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyStackException.java delete mode 100644 group11/1310368322/GitHub/.gitignore delete mode 100644 group11/1310368322/GitHub/src/ArrayList.java delete mode 100644 group11/1310368322/GitHub/src/testGitHub.java delete mode 100644 group11/171535320/ArrayList.java delete mode 100644 group11/171535320/BinaryTreeNode.java delete mode 100644 group11/171535320/Iterator.java delete mode 100644 group11/171535320/LinkedList.java delete mode 100644 group11/171535320/List.java delete mode 100644 group11/171535320/stackANDqueue/Queue.java delete mode 100644 group11/171535320/stackANDqueue/Stack.java delete mode 100644 group11/252308879/dataStructure/.gitignore delete mode 100644 group11/252308879/dataStructure/pom.xml delete mode 100644 group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/ArrayList.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/BinaryTreeNode.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Iterator.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/LinkedList.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/List.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Queue.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack2.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/apn/coding2017/TestJavaUtilArrayList.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/ArrayListTest.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/BinaryTreeNodeTest.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/LinkedListTest.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/QueueTest.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/StackTest.java delete mode 100644 group11/283091182/src/com/coding/basic/ArrayList.java delete mode 100644 group11/283091182/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group11/283091182/src/com/coding/basic/Iterator.java delete mode 100644 group11/283091182/src/com/coding/basic/LinkedList.java delete mode 100644 group11/283091182/src/com/coding/basic/List.java delete mode 100644 group11/283091182/src/com/coding/basic/Queue.java delete mode 100644 group11/283091182/src/com/coding/basic/Stack.java delete mode 100644 group11/395443277/data_structure/.gitignore delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/ArrayList.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/ArrayListTest.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNodeTest.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/Iterator.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/LinkedList.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/LinkedListTest.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/List.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/Queue.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/QueueTest.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/Stack.java delete mode 100644 group11/395443277/data_structure/src/com/coding/basic/StackTest.java delete mode 100644 group11/635189253/dataStructure/.classpath delete mode 100644 group11/635189253/dataStructure/.gitignore delete mode 100644 group11/635189253/dataStructure/.project delete mode 100644 group11/635189253/dataStructure/src/com/coding/basic/ArrayList.java delete mode 100644 group11/635189253/dataStructure/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group11/635189253/dataStructure/src/com/coding/basic/Iterator.java delete mode 100644 group11/635189253/dataStructure/src/com/coding/basic/LinkedList.java delete mode 100644 group11/635189253/dataStructure/src/com/coding/basic/List.java delete mode 100644 group11/635189253/dataStructure/src/com/coding/basic/Queue.java delete mode 100644 group11/635189253/dataStructure/src/com/coding/basic/Stack.java delete mode 100644 group11/729245768/DataStructure/src/main/coding_170225/ArrayList.java delete mode 100644 group11/729245768/DataStructure/src/main/coding_170225/BinaryTree.java delete mode 100644 group11/729245768/DataStructure/src/main/coding_170225/BinaryTreeNode.java delete mode 100644 group11/729245768/DataStructure/src/main/coding_170225/Iterator.java delete mode 100644 group11/729245768/DataStructure/src/main/coding_170225/LinkedList.java delete mode 100644 group11/729245768/DataStructure/src/main/coding_170225/Queue.java delete mode 100644 group11/729245768/DataStructure/src/main/coding_170225/Stack.java delete mode 100644 group11/729245768/DataStructure/tests/main/coding_170225/ArrayListTest.java delete mode 100644 group11/729245768/DataStructure/tests/main/coding_170225/BinaryTreeTest.java delete mode 100644 group11/996108220/.classpath delete mode 100644 group11/996108220/.gitignore delete mode 100644 group11/996108220/.project delete mode 100644 group11/996108220/src/com/coding/basic/ArrayList.java delete mode 100644 group11/996108220/src/com/coding/basic/BinaryTree.java delete mode 100644 group11/996108220/src/com/coding/basic/Iterator.java delete mode 100644 group11/996108220/src/com/coding/basic/LinkedList.java delete mode 100644 group11/996108220/src/com/coding/basic/List.java delete mode 100644 group11/996108220/src/com/coding/basic/Queue.java delete mode 100644 group11/996108220/src/com/coding/basic/Stack.java delete mode 100644 group11/group11.md delete mode 100644 group12/2258659044/readme.txt delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/List.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/Queue.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/Stack.java delete mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/ArrayListTest.java delete mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java delete mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java delete mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java delete mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java delete mode 100644 group12/247565311/week1/ArrayList.java delete mode 100644 group12/247565311/week1/Deque.java delete mode 100644 group12/247565311/week1/Link.java delete mode 100644 group12/247565311/week1/LinkedList.java delete mode 100644 group12/247565311/week1/Stack.java delete mode 100755 group12/251822722/ArrayList.java delete mode 100755 group12/251822722/BinaryTreeNode.java delete mode 100755 group12/251822722/Iterator.java delete mode 100755 group12/251822722/LinkedList.java delete mode 100755 group12/251822722/List.java delete mode 100755 group12/251822722/Queue.java delete mode 100755 group12/251822722/Stack.java delete mode 100644 group12/377401843/learning_1/.gitignore delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/ArrayList.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/BinaryTreeNode.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/Iterator.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/LinkedList.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/List.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/Queue.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/Stack.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/test/ArrayListTest.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/test/BinaryTreeNodeTest.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/test/LinkedListTest.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/test/QueueTest.java delete mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/test/StackTest.java delete mode 100644 group12/382266293/.classpath delete mode 100644 group12/382266293/.gitignore delete mode 100644 group12/382266293/.project delete mode 100644 group12/382266293/src/Collection/AbstractList.java delete mode 100644 group12/382266293/src/Collection/Concrete/ArrayList.java delete mode 100644 group12/382266293/src/Collection/Concrete/BinaryTreeNode.java delete mode 100644 group12/382266293/src/Collection/Concrete/LinkedList.java delete mode 100644 group12/382266293/src/Collection/Concrete/Queue.java delete mode 100644 group12/382266293/src/Collection/Concrete/Stack.java delete mode 100644 group12/382266293/src/Collection/Iterator.java delete mode 100644 group12/382266293/src/Collection/List.java delete mode 100644 group12/382266293/src/TestCollection/AllTests.java delete mode 100644 group12/382266293/src/TestCollection/ArrayListTest.java delete mode 100644 group12/382266293/src/TestCollection/BinaryTreeNodeTest.java delete mode 100644 group12/382266293/src/TestCollection/LinkedListTest.java delete mode 100644 group12/382266293/src/TestCollection/QueueTest.java delete mode 100644 group12/382266293/src/TestCollection/StackTest.java delete mode 100644 group12/382266293/src/test.java delete mode 100644 group12/382266293/src/util/Print.java delete mode 100644 group12/382266293/src/util/TestUtil.java delete mode 100755 group12/441908378/ArrayList.java delete mode 100755 group12/441908378/BinaryTreeNode.java delete mode 100755 group12/441908378/LinkedList.java delete mode 100755 group12/441908378/Queue.java delete mode 100755 group12/441908378/Stack.java delete mode 100644 group12/446031103/src/com/coding/basic/ArrayList.java delete mode 100644 group12/446031103/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group12/446031103/src/com/coding/basic/Iterator.java delete mode 100644 group12/446031103/src/com/coding/basic/LinkedList.java delete mode 100644 group12/446031103/src/com/coding/basic/List.java delete mode 100644 group12/446031103/src/com/coding/basic/Queue.java delete mode 100644 group12/446031103/src/com/coding/basic/Stack.java delete mode 100644 group12/495473393/Coding/.gitignore delete mode 100644 group12/495473393/Coding/src/Base/ArrayList.java delete mode 100644 group12/495473393/Coding/src/Base/BinaryTreeNode.java delete mode 100644 group12/495473393/Coding/src/Base/Iterator.java delete mode 100644 group12/495473393/Coding/src/Base/LinkedList.java delete mode 100644 group12/495473393/Coding/src/Base/List.java delete mode 100644 group12/495473393/Coding/src/Base/Queue.java delete mode 100644 group12/495473393/Coding/src/Base/Stack.java delete mode 100644 group12/563253496/datastructure/.classpath delete mode 100644 group12/563253496/datastructure/.gitignore delete mode 100644 group12/563253496/datastructure/.project delete mode 100644 group12/563253496/datastructure/src/Collection/ArrayList.java delete mode 100644 group12/563253496/datastructure/src/Collection/LinkedList.java delete mode 100644 group12/563253496/datastructure/src/Collection/Queue.java delete mode 100644 group12/563253496/datastructure/src/Collection/Stack.java delete mode 100644 group12/563253496/datastructure/src/Collection/TestArrayList.java delete mode 100644 group12/563253496/datastructure/src/Collection/TestStack.java delete mode 100644 group12/563253496/datastructure/src/com/coding/basic/ArrayList.java delete mode 100644 group12/563253496/datastructure/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group12/563253496/datastructure/src/com/coding/basic/Iterator.java delete mode 100644 group12/563253496/datastructure/src/com/coding/basic/LinkedList.java delete mode 100644 group12/563253496/datastructure/src/com/coding/basic/List.java delete mode 100644 group12/563253496/datastructure/src/com/coding/basic/Queue.java delete mode 100644 group12/563253496/datastructure/src/com/coding/basic/Stack.java delete mode 100644 group12/group12.md delete mode 100644 group13/group13.md delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.classpath" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.gitignore" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.project" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.settings/org.eclipse.jdt.core.prefs" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/ArrayList.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTree.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTreeNode.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Iterator.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/LinkedList.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/List.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Queue.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Stack.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAPIDemo.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAll.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestArrayList.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestMyDemo.java" delete mode 100644 "group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/\346\226\207\347\253\240\351\223\276\346\216\245_20170224.txt" delete mode 100644 group14/187114392/work_1_20170225/.classpath delete mode 100644 group14/187114392/work_1_20170225/.gitignore delete mode 100644 group14/187114392/work_1_20170225/.idea/.name delete mode 100644 group14/187114392/work_1_20170225/.idea/compiler.xml delete mode 100644 group14/187114392/work_1_20170225/.idea/copyright/profiles_settings.xml delete mode 100644 group14/187114392/work_1_20170225/.idea/encodings.xml delete mode 100644 group14/187114392/work_1_20170225/.idea/junitgenerator-prj-settings.xml delete mode 100644 group14/187114392/work_1_20170225/.idea/misc.xml delete mode 100644 group14/187114392/work_1_20170225/.idea/modules.xml delete mode 100644 group14/187114392/work_1_20170225/.idea/uiDesigner.xml delete mode 100644 group14/187114392/work_1_20170225/.idea/work_1_20170225.iml delete mode 100644 group14/187114392/work_1_20170225/.idea/workspace.xml delete mode 100644 group14/187114392/work_1_20170225/.project delete mode 100644 group14/187114392/work_1_20170225/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group14/187114392/work_1_20170225/2017Learning.iml delete mode 100644 group14/187114392/work_1_20170225/ReadMe.md delete mode 100644 group14/187114392/work_1_20170225/src/Main.java delete mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/ArrayList.java delete mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/Iterator.java delete mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/LinkedList.java delete mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/List.java delete mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/Queue.java delete mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/Stack.java delete mode 100644 group14/187114392/work_1_20170225/test/ArrayList_Test.java delete mode 100644 group14/187114392/work_1_20170225/test/LinkedList_Test.java delete mode 100644 group14/187114392/work_1_20170225/test/Queue_Test.java delete mode 100644 group14/187114392/work_1_20170225/test/Stack_Test.java delete mode 100644 "group14/190530132/20170219\344\275\234\344\270\232/ArrayList.java" delete mode 100644 "group14/190530132/20170219\344\275\234\344\270\232/LinkedList.java" delete mode 100644 "group14/190530132/20170219\344\275\234\344\270\232/Queue.java" delete mode 100644 "group14/190530132/20170219\344\275\234\344\270\232/Stack.java" delete mode 100644 "group14/190530132/20170219\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" delete mode 100644 group14/254659936/.gitignore delete mode 100644 group14/254659936/src/Main.java delete mode 100644 group14/254659936/src/com/coding/basic/ArrayList.java delete mode 100644 group14/254659936/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group14/254659936/src/com/coding/basic/Iterator.java delete mode 100644 group14/254659936/src/com/coding/basic/LinkedList.java delete mode 100644 group14/254659936/src/com/coding/basic/List.java delete mode 100644 group14/254659936/src/com/coding/basic/Queue.java delete mode 100644 group14/254659936/src/com/coding/basic/Stack.java delete mode 100644 group14/296933284/Note/README.md delete mode 100644 group14/296933284/README.md delete mode 100644 group14/296933284/coding/.classpath delete mode 100644 group14/296933284/coding/.gitignore delete mode 100644 group14/296933284/coding/.project delete mode 100644 group14/296933284/coding/.settings/org.eclipse.core.resources.prefs delete mode 100644 group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group14/296933284/coding/src/com/coderising/array/ArrayUtil.java delete mode 100644 group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java delete mode 100644 group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java delete mode 100644 group14/296933284/coding/src/com/coderising/litestruts/Struts.java delete mode 100644 group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 group14/296933284/coding/src/com/coderising/litestruts/View.java delete mode 100644 group14/296933284/coding/src/com/coderising/litestruts/struts.xml delete mode 100644 group14/296933284/coding/src/com/coding/basic/ArrayList.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/Iterator.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/JavaTest.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/LinkedList.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/LinkedListTest.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/List.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/Queue.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/QueueTest.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/Stack.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/StackTest.java delete mode 100644 group14/352504906/test/.classpath delete mode 100644 group14/352504906/test/.project delete mode 100644 group14/352504906/test/.settings/org.eclipse.core.resources.prefs delete mode 100644 group14/352504906/test/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group14/352504906/test/src/com/coding/basic/SimpleArrayList.java delete mode 100644 group14/352504906/test/src/com/coding/basic/SimpleIterator.java delete mode 100644 group14/352504906/test/src/com/coding/basic/SimpleLinkedList.java delete mode 100644 group14/352504906/test/src/com/coding/basic/SimpleList.java delete mode 100644 group14/352504906/test/src/com/coding/basic/SimpleQueue.java delete mode 100644 group14/352504906/test/src/com/coding/basic/SimpleStack.java delete mode 100644 "group14/352504906/\346\265\205\350\260\210CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.txt" delete mode 100644 group14/598808350/20170219.txt delete mode 100644 group14/598808350/2017project/src/org/learning/container/ArrayList.java delete mode 100644 group14/598808350/2017project/src/org/learning/container/LinkedList.java delete mode 100644 group14/598808350/2017project/src/org/learning/container/Queue.java delete mode 100644 group14/598808350/2017project/src/org/learning/container/Stack.java delete mode 100644 group14/676615845/algo/pom.xml delete mode 100644 group14/676615845/algo/src/main/java/algo/BinarySearch.java delete mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/Array.java delete mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/ArrayList.java delete mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/Iterator.java delete mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/LinkedList.java delete mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/List.java delete mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/Queue.java delete mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/Stack.java delete mode 100644 group14/676615845/algo/src/test/java/algo/BinarySearchTest.java delete mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/ArrayListTest.java delete mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/ArrayTest.java delete mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/BinaryTreeNodeTest.java delete mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/LinkedListTest.java delete mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/QueueTest.java delete mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/StackTest.java delete mode 100644 group14/775857669/.gitignore delete mode 100644 group14/775857669/src/com/coding/basic/ArrayList.java delete mode 100644 group14/775857669/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group14/775857669/src/com/coding/basic/Iterator.java delete mode 100644 group14/775857669/src/com/coding/basic/JUnitTest.java delete mode 100644 group14/775857669/src/com/coding/basic/LinkedList.java delete mode 100644 group14/775857669/src/com/coding/basic/List.java delete mode 100644 group14/775857669/src/com/coding/basic/Queue.java delete mode 100644 group14/775857669/src/com/coding/basic/Stack.java delete mode 100644 group14/857999411/FirstHomework/.classpath delete mode 100644 group14/857999411/FirstHomework/.gitignore delete mode 100644 group14/857999411/FirstHomework/.project delete mode 100644 group14/857999411/FirstHomework/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group14/857999411/FirstHomework/src/com/coding/basic/MyArrayList.java delete mode 100644 group14/857999411/FirstHomework/src/com/coding/basic/MyLinkedList.java delete mode 100644 group14/857999411/FirstHomework/src/com/coding/basic/MyList.java delete mode 100644 group14/857999411/FirstHomework/src/com/coding/basic/MyQueue.java delete mode 100644 group14/857999411/FirstHomework/src/com/coding/basic/MyStack.java delete mode 100644 group14/857999411/FirstHomework/src/com/coding/test/MyArrayListTest.java delete mode 100644 group14/857999411/FirstHomework/src/com/coding/test/MyLinkedListTest.java delete mode 100644 group14/857999411/FirstHomework/src/com/coding/test/MyQueueTest.java delete mode 100644 group14/857999411/FirstHomework/src/com/coding/test/MyStackTest.java delete mode 100644 group14/group14.md delete mode 100644 group15/1500_369516660/.classpath delete mode 100644 group15/1500_369516660/.gitignore delete mode 100644 group15/1500_369516660/.project delete mode 100644 group15/1500_369516660/src/com/arrayList/basic/List.java delete mode 100644 group15/1500_369516660/src/com/arrayList/basic/SimpleArrayList.java delete mode 100644 group15/1500_369516660/src/com/arrayList/basic/SimpleLinkedList.java delete mode 100644 group15/1501_2535894075/2017code/src/arraylist.java delete mode 100644 group15/1501_2535894075/2017code/src/linkedlist.java delete mode 100644 group15/1501_2535894075/2017code/src/queue.java delete mode 100644 group15/1501_2535894075/2017code/src/stack.java delete mode 100644 group15/1502_1617273078/src/com/coding/basic/ArrayList.java delete mode 100644 group15/1502_1617273078/src/com/coding/basic/Iterator.java delete mode 100644 group15/1502_1617273078/src/com/coding/basic/LinkedList.java delete mode 100644 group15/1502_1617273078/src/com/coding/basic/List.java delete mode 100644 group15/1502_1617273078/src/com/coding/basic/Queue.java delete mode 100644 group15/1502_1617273078/src/com/coding/basic/Stack.java delete mode 100644 group15/1503_1311822904/myCollection/src/ArrayList.java delete mode 100644 group15/1503_1311822904/myCollection/src/BinaryTreeNode.java delete mode 100644 group15/1503_1311822904/myCollection/src/Iterator.java delete mode 100644 group15/1503_1311822904/myCollection/src/LinkedList.java delete mode 100644 group15/1503_1311822904/myCollection/src/List.java delete mode 100644 group15/1503_1311822904/myCollection/src/Queue.java delete mode 100644 group15/1503_1311822904/myCollection/src/Stack.java delete mode 100644 group15/1503_1311822904/myCollection/test/BinaryTreeNodeTest.java delete mode 100644 group15/1506_1084478979/1506_1084478979/.classpath delete mode 100644 group15/1506_1084478979/1506_1084478979/.gitignore delete mode 100644 group15/1506_1084478979/1506_1084478979/.project delete mode 100644 group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java delete mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java delete mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/Queue.java delete mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/Stack.java delete mode 100644 group15/1506_1084478979/RemoteSystemsTempFiles/.project delete mode 100644 group15/1507_977996067/README.md delete mode 100644 group15/1507_977996067/src/task1/MyArrayList.java delete mode 100644 group15/1507_977996067/src/task1/MyLinkedList.java delete mode 100644 group15/1507_977996067/src/task1/MyList.java delete mode 100644 group15/1507_977996067/src/task1/MyQueue.java delete mode 100644 group15/1507_977996067/src/task1/MyStack.java delete mode 100644 group15/1507_977996067/src/task1/README.md delete mode 100644 group15/1510_739253131/src/com/bruce/homework0226/ArrayListV00.java delete mode 100644 group15/1510_739253131/src/com/bruce/homework0226/JuintTest.java delete mode 100644 group15/1510_739253131/src/com/bruce/homework0226/LinkedListV00.java delete mode 100644 group15/1510_739253131/src/com/bruce/homework0226/QueueV00.java delete mode 100644 group15/1510_739253131/src/com/bruce/homework0226/StackV00.java delete mode 100644 group15/1510_739253131/src/com/bruce/utils/MyException.java delete mode 100644 group15/1511_714512544/.idea/checkstyle-idea.xml delete mode 100644 group15/1511_714512544/.idea/encodings.xml delete mode 100644 group15/1511_714512544/.idea/misc.xml delete mode 100644 group15/1511_714512544/.idea/modules.xml delete mode 100644 group15/1511_714512544/.idea/uiDesigner.xml delete mode 100644 group15/1511_714512544/.idea/vcs.xml delete mode 100644 group15/1511_714512544/.idea/workspace.xml delete mode 100644 group15/1511_714512544/1511_714512544.iml delete mode 100644 group15/1511_714512544/src/com/coding/basic/ArrayList.java delete mode 100644 group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java delete mode 100644 group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java delete mode 100644 group15/1511_714512544/src/com/coding/basic/Iterator.java delete mode 100644 group15/1511_714512544/src/com/coding/basic/LinkedList.java delete mode 100644 group15/1511_714512544/src/com/coding/basic/List.java delete mode 100644 group15/1511_714512544/src/com/coding/basic/Queue.java delete mode 100644 group15/1511_714512544/src/com/coding/basic/Stack.java delete mode 100644 group15/1511_714512544/src/test/com/coding/basic/ArrayListTest.java delete mode 100644 group15/1511_714512544/src/test/com/coding/basic/BinarySearchTreeTest.java delete mode 100644 group15/1511_714512544/src/test/com/coding/basic/LinkedListTest.java delete mode 100644 group15/1511_714512544/src/test/com/coding/basic/QueueTest.java delete mode 100644 group15/1511_714512544/src/test/com/coding/basic/StackTest.java delete mode 100644 "group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md" delete mode 100644 group15/1512_656512403/.idea/compiler.xml delete mode 100644 group15/1512_656512403/.idea/copyright/profiles_settings.xml delete mode 100644 group15/1512_656512403/.idea/description.html delete mode 100644 group15/1512_656512403/.idea/encodings.xml delete mode 100644 group15/1512_656512403/.idea/inspectionProfiles/Project_Default.xml delete mode 100644 group15/1512_656512403/.idea/inspectionProfiles/profiles_settings.xml delete mode 100644 group15/1512_656512403/.idea/misc.xml delete mode 100644 group15/1512_656512403/.idea/modules.xml delete mode 100644 group15/1512_656512403/.idea/vcs.xml delete mode 100644 group15/1512_656512403/.idea/workspace.xml delete mode 100644 group15/1512_656512403/1512_656512403.iml delete mode 100644 group15/1512_656512403/1512_656512403.md delete mode 100644 group15/1512_656512403/src/Iterator.java delete mode 100644 group15/1512_656512403/src/List.java delete mode 100644 group15/1512_656512403/src/Main.java delete mode 100644 group15/1512_656512403/src/MyArrayList.java delete mode 100644 group15/1512_656512403/src/MyBinaryTreeNode.java delete mode 100644 group15/1512_656512403/src/MyLinkedList.java delete mode 100644 group15/1512_656512403/src/MyQuque.java delete mode 100644 group15/1512_656512403/src/MyStack.java delete mode 100644 group15/1513_121469918/HomeWork01/.classpath delete mode 100644 group15/1513_121469918/HomeWork01/.gitignore delete mode 100644 group15/1513_121469918/HomeWork01/.project delete mode 100644 group15/1513_121469918/HomeWork01/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group15/1513_121469918/HomeWork01/src/coding/ArrayList.java delete mode 100644 group15/1513_121469918/HomeWork01/src/coding/BinaryTreeNode.java delete mode 100644 group15/1513_121469918/HomeWork01/src/coding/Iterator.java delete mode 100644 group15/1513_121469918/HomeWork01/src/coding/LinkedList.java delete mode 100644 group15/1513_121469918/HomeWork01/src/coding/List.java delete mode 100644 group15/1513_121469918/HomeWork01/src/coding/Queue.java delete mode 100644 group15/1513_121469918/HomeWork01/src/coding/Stack.java delete mode 100644 group15/1514_616019420/ArrayList.java delete mode 100644 group15/1514_616019420/BinaryTreeNode.java delete mode 100644 group15/1514_616019420/Iterator.java delete mode 100644 group15/1514_616019420/LinkedList.java delete mode 100644 group15/1514_616019420/List.java delete mode 100644 group15/1514_616019420/Queue.java delete mode 100644 group15/1514_616019420/Stack.java delete mode 100644 group15/1515_337959725/.classpath delete mode 100644 group15/1515_337959725/.gitignore delete mode 100644 group15/1515_337959725/.project delete mode 100644 group15/1515_337959725/src/com/coding/basic/ArrayListTest.java delete mode 100644 group15/1515_337959725/src/com/coding/basic/BinaryTreeTest.java delete mode 100644 group15/1515_337959725/src/com/coding/basic/IteratorTest.java delete mode 100644 group15/1515_337959725/src/com/coding/basic/LinkedListTest.java delete mode 100644 group15/1515_337959725/src/com/coding/basic/ListTest.java delete mode 100644 group15/1515_337959725/src/com/coding/basic/Queue.java delete mode 100644 group15/1515_337959725/src/com/coding/basic/StackTest.java delete mode 100644 group15/1517_279137987/my/collection/linear/MyArrayList.java delete mode 100644 group15/1517_279137987/my/collection/linear/MyIterator.java delete mode 100644 group15/1517_279137987/my/collection/linear/MyLinkedList.java delete mode 100644 group15/1517_279137987/my/collection/linear/MyList.java delete mode 100644 group15/1517_279137987/my/collection/linear/MyQueue.java delete mode 100644 group15/1517_279137987/my/collection/linear/MyStack.java delete mode 100644 group15/1517_279137987/my/collection/linearTest/MyArrayListTest.java delete mode 100644 group15/1517_279137987/my/collection/linearTest/MyLinkedListTest.java delete mode 100644 group15/1517_279137987/my/collection/linearTest/MyQueueTest.java delete mode 100644 group15/1517_279137987/my/collection/linearTest/MyStackTest.java delete mode 100644 group15/1521_653895972/src/com/coding/basic/ArrayList.java delete mode 100644 group15/1521_653895972/src/com/coding/basic/BasicTest.java delete mode 100644 group15/1521_653895972/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group15/1521_653895972/src/com/coding/basic/Iterator.java delete mode 100644 group15/1521_653895972/src/com/coding/basic/LinkedList.java delete mode 100644 group15/1521_653895972/src/com/coding/basic/List.java delete mode 100644 group15/1521_653895972/src/com/coding/basic/Queue.java delete mode 100644 group15/1521_653895972/src/com/coding/basic/Stack.java delete mode 100644 group15/group15.md delete mode 100644 group16/1012075117/DataStructure219/.classpath delete mode 100644 group16/1012075117/DataStructure219/.project delete mode 100644 group16/1012075117/DataStructure219/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/ArrayList.java delete mode 100644 group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/LinkedList.java delete mode 100644 group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/List.java delete mode 100644 group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Queue.java delete mode 100644 group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Stack.java delete mode 100644 group16/1154151360/.classpath delete mode 100644 group16/1154151360/.gitignore delete mode 100644 group16/1154151360/.project delete mode 100644 group16/1154151360/.settings/org.eclipse.core.resources.prefs delete mode 100644 group16/1154151360/src/com/list/ArrayList.java delete mode 100644 group16/1154151360/src/com/list/LinkedList.java delete mode 100644 group16/1154151360/src/com/list/Queue.java delete mode 100644 group16/1154151360/src/com/list/Stack.java delete mode 100644 group16/1287642108/0226/src/com/coding/basic/ArrayList.java delete mode 100644 group16/1287642108/0226/src/com/coding/basic/Iterator.java delete mode 100644 group16/1287642108/0226/src/com/coding/basic/LinkedList.java delete mode 100644 group16/1287642108/0226/src/com/coding/basic/List.java delete mode 100644 group16/1287642108/0226/src/com/coding/basic/Queue.java delete mode 100644 group16/1287642108/0226/src/com/coding/basic/Stack.java delete mode 100644 group16/1325756593/.classpath delete mode 100644 group16/1325756593/.gitignore delete mode 100644 group16/1325756593/.project delete mode 100644 group16/1325756593/dongqihust.readme delete mode 100644 group16/1325756593/src/com/dong/week1/ArrayList.java delete mode 100644 group16/1325756593/src/com/dong/week1/ArrayListTest.java delete mode 100644 group16/1325756593/src/com/dong/week1/BinaryTreeNode.java delete mode 100644 group16/1325756593/src/com/dong/week1/Iterator.java delete mode 100644 group16/1325756593/src/com/dong/week1/LinkedList.java delete mode 100644 group16/1325756593/src/com/dong/week1/List.java delete mode 100644 group16/1325756593/src/com/dong/week1/Queue.java delete mode 100644 group16/1325756593/src/com/dong/week1/Stack.java delete mode 100644 group16/1924332561/.classpath delete mode 100644 group16/1924332561/.project delete mode 100644 group16/1924332561/.settings/org.eclipse.core.resources.prefs delete mode 100644 group16/1924332561/src/com/coding/basic/ArrayList.java delete mode 100644 group16/1924332561/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group16/1924332561/src/com/coding/basic/Iterator.java delete mode 100644 group16/1924332561/src/com/coding/basic/LinkedList.java delete mode 100644 group16/1924332561/src/com/coding/basic/List.java delete mode 100644 group16/1924332561/src/com/coding/basic/Queue.java delete mode 100644 group16/1924332561/src/com/coding/basic/Stack.java delete mode 100644 group16/214074094/readme.txt delete mode 100644 group16/214074094/src/com/coding/basic/ArrayList.java delete mode 100644 group16/214074094/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group16/214074094/src/com/coding/basic/Iterator.java delete mode 100644 group16/214074094/src/com/coding/basic/LinkedList.java delete mode 100644 group16/214074094/src/com/coding/basic/List.java delete mode 100644 group16/214074094/src/com/coding/basic/Queue.java delete mode 100644 group16/214074094/src/com/coding/basic/Stack.java delete mode 100644 group16/214074094/src/com/reading/blog_test.txt delete mode 100644 group16/214074094/src/test/coding/basic/AbstractTest.java delete mode 100644 group16/214074094/src/test/coding/basic/ArrayListTest.java delete mode 100644 group16/214074094/src/test/coding/basic/LinkedListTest.java delete mode 100644 group16/214074094/src/test/coding/basic/QueueTest.java delete mode 100644 group16/214074094/src/test/coding/basic/StackTest.java delete mode 100644 group16/214074094/target/production/214074094/reading/blog_test.txt delete mode 100644 group16/2562124714/.idea/dictionaries/zhangwj.xml delete mode 100644 group16/2562124714/.idea/misc.xml delete mode 100644 group16/2562124714/.idea/modules.xml delete mode 100644 group16/2562124714/.idea/workspace.xml delete mode 100644 group16/2562124714/2562124714.iml delete mode 100644 group16/2562124714/src/Test/ArrayListTest.java delete mode 100644 group16/2562124714/src/Test/BinaryTreeNodeTest.java delete mode 100644 group16/2562124714/src/Test/LinkedListTest.java delete mode 100644 group16/2562124714/src/Test/QueueTest.java delete mode 100644 group16/2562124714/src/Test/StackTest.java delete mode 100644 group16/2562124714/src/Test/TestRunner.java delete mode 100644 group16/2562124714/src/com/coding/basic/ArrayList.java delete mode 100644 group16/2562124714/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group16/2562124714/src/com/coding/basic/Iterator.java delete mode 100644 group16/2562124714/src/com/coding/basic/LinkedList.java delete mode 100644 group16/2562124714/src/com/coding/basic/List.java delete mode 100644 group16/2562124714/src/com/coding/basic/Queue.java delete mode 100644 group16/2562124714/src/com/coding/basic/Stack.java delete mode 100644 group16/2562124714/src/com/coding/basic/TestJunit.java delete mode 100644 group16/2562124714/src/com/coding/basic/TestRunner.java delete mode 100644 group16/2562124714/src/com/coding/basic/TreeData.java delete mode 100644 group16/313001956/.classpath delete mode 100644 group16/313001956/.gitignore delete mode 100644 group16/313001956/.project delete mode 100644 group16/313001956/.settings/.jsdtscope delete mode 100644 group16/313001956/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group16/313001956/.settings/org.eclipse.wst.common.component delete mode 100644 group16/313001956/.settings/org.eclipse.wst.common.project.facet.core.xml delete mode 100644 group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.container delete mode 100644 group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.name delete mode 100644 group16/313001956/WebContent/META-INF/MANIFEST.MF delete mode 100644 group16/313001956/src/com/coding/basic/ArrayList.java delete mode 100644 group16/502059278/.classpath delete mode 100644 group16/502059278/.gitignore delete mode 100644 group16/502059278/.project delete mode 100644 "group16/502059278/homework/\350\256\241\347\256\227\346\234\272\346\274\253\350\260\210_\344\275\234\344\270\232.docx" delete mode 100644 group16/502059278/src/cn/mark/MyArrayList.java delete mode 100644 group16/502059278/src/cn/mark/MyLinkedList.java delete mode 100644 group16/502059278/src/cn/mark/MyList.java delete mode 100644 group16/542087872/src/com/coding/basic/ArrayList.java delete mode 100644 group16/542087872/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group16/542087872/src/com/coding/basic/Iterator.java delete mode 100644 group16/542087872/src/com/coding/basic/LinkedList.java delete mode 100644 group16/542087872/src/com/coding/basic/List.java delete mode 100644 group16/542087872/src/com/coding/basic/Queue.java delete mode 100644 group16/542087872/src/com/coding/basic/Stack.java delete mode 100644 group16/542087872/src/com/coding/basic/Test.java delete mode 100644 group16/group16.md delete mode 100644 group16/out/production/214074094/com/reading/blog_test.txt delete mode 100644 group16/out/production/214074094/readme.txt delete mode 100644 group16/out/production/214074094/src/com/reading/blog_test.txt delete mode 100644 group17/102228177/.classpath delete mode 100644 group17/102228177/.project delete mode 100644 group17/102228177/src/data2_19/ArrayList.java delete mode 100644 group17/102228177/src/data2_19/BinaryTreeNode.java delete mode 100644 group17/102228177/src/data2_19/Iterator.java delete mode 100644 group17/102228177/src/data2_19/LinkedList.java delete mode 100644 group17/102228177/src/data2_19/List.java delete mode 100644 group17/102228177/src/data2_19/Queue.java delete mode 100644 group17/102228177/src/data2_19/Stack.java delete mode 100644 group17/116665530/homework/src/com/coding/basic/MyArrayList.java delete mode 100644 group17/116665530/homework/src/com/coding/basic/MyBinaryTreeNode.java delete mode 100644 group17/116665530/homework/src/com/coding/basic/MyIterator.java delete mode 100644 group17/116665530/homework/src/com/coding/basic/MyLinkedList.java delete mode 100644 group17/116665530/homework/src/com/coding/basic/MyList.java delete mode 100644 group17/116665530/homework/src/com/coding/basic/MyQueue.java delete mode 100644 group17/116665530/homework/src/com/coding/basic/MyStack.java delete mode 100644 group17/1204187480/code/homework/basic/pom.xml delete mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java delete mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java delete mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java delete mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java delete mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java delete mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java delete mode 100644 group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArrayListTest.java delete mode 100644 group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java delete mode 100644 group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java delete mode 100644 group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java delete mode 100644 group17/1204187480/code/homework/parent/pom.xml delete mode 100644 group17/1204187480/code/homework/pom.xml delete mode 100644 "group17/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272" delete mode 100644 group17/1264835468/.gitignore delete mode 100644 group17/1264835468/src/assignment/BinaryTree.java delete mode 100644 group17/1264835468/src/assignment/BinaryTreeNode.java delete mode 100644 group17/1264835468/src/assignment/Iterable.java delete mode 100644 group17/1264835468/src/assignment/Iterator.java delete mode 100644 group17/1264835468/src/assignment/List.java delete mode 100644 group17/1264835468/src/assignment/MyArrayList.java delete mode 100644 group17/1264835468/src/assignment/MyLinkedList.java delete mode 100644 group17/1264835468/src/assignment/MyQueue.java delete mode 100644 group17/1264835468/src/assignment/MyStack.java delete mode 100644 group17/1282579502/.classpath delete mode 100644 group17/1282579502/.gitignore delete mode 100644 group17/1282579502/.project delete mode 100644 group17/1282579502/src/com/coding/basic/ArrayList.java delete mode 100644 group17/1282579502/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group17/1282579502/src/com/coding/basic/Iterator.java delete mode 100644 group17/1282579502/src/com/coding/basic/LinkedList.java delete mode 100644 group17/1282579502/src/com/coding/basic/List.java delete mode 100644 group17/1282579502/src/com/coding/basic/Queue.java delete mode 100644 group17/1282579502/src/com/coding/basic/Stack.java delete mode 100644 group17/1282579502/src/com/coding/basic/ut/ArrayListTest.java delete mode 100644 group17/1282579502/src/com/coding/basic/ut/BinaryTreeNodeTest.java delete mode 100644 group17/1282579502/src/com/coding/basic/ut/LinkedListTest.java delete mode 100644 group17/1282579502/src/com/coding/basic/ut/QueueTest.java delete mode 100644 group17/1282579502/src/com/coding/basic/ut/StackTest.java delete mode 100644 group17/1540186032/First/src/ArrayList.java delete mode 100644 group17/1540186032/First/src/BinaryTreeNode.java delete mode 100644 group17/1540186032/First/src/Iterator.java delete mode 100644 group17/1540186032/First/src/LinkedList.java delete mode 100644 group17/1540186032/First/src/List.java delete mode 100644 group17/1540186032/First/src/Queue.java delete mode 100644 group17/1540186032/First/src/Stack.java delete mode 100644 group17/176653813/1766538130226Lesson/.classpath delete mode 100644 group17/176653813/1766538130226Lesson/.gitignore delete mode 100644 group17/176653813/1766538130226Lesson/.project delete mode 100644 group17/176653813/1766538130226Lesson/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/ArrayList.java delete mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/LinkList.java delete mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/List.java delete mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/Queue.java delete mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/Stack.java delete mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/Test.java delete mode 100644 group17/176653813/RemoteSystemsTempFiles/.project delete mode 100644 group17/240094626/.gitignore delete mode 100644 group17/240094626/warm-up/.gitignore delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/Iterator.java delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/List.java delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/impl/ArrayList.java delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/impl/BinaryTree.java delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/impl/LinkedList.java delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/impl/Queue.java delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/impl/Stack.java delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/test/ArrayListTest.java delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/test/LinkedListTest.java delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/test/QueueTest.java delete mode 100644 group17/240094626/warm-up/src/com/coding/basic/test/StackTest.java delete mode 100644 group17/51075907/HomeWork/.classpath delete mode 100644 group17/51075907/HomeWork/.project delete mode 100644 group17/51075907/HomeWork/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group17/51075907/HomeWork/src/day1_HomeWork/ArrayList.java delete mode 100644 group17/51075907/HomeWork/src/day1_HomeWork/LinkedList.java delete mode 100644 group17/51075907/HomeWork/src/day1_HomeWork/List.java delete mode 100644 group17/51075907/HomeWork/src/day1_HomeWork/Queue.java delete mode 100644 group17/51075907/HomeWork/src/day1_HomeWork/Stack.java delete mode 100644 group17/785396327/binarytree/BinaryTree.java delete mode 100644 group17/785396327/binarytree/DLRSearchType.java delete mode 100644 group17/785396327/binarytree/LDRSearchType.java delete mode 100644 group17/785396327/binarytree/LFSearchType.java delete mode 100644 group17/785396327/binarytree/LRDSearchType.java delete mode 100644 group17/785396327/binarytree/SearchType.java delete mode 100644 group17/785396327/list/ArrayList.java delete mode 100644 group17/785396327/list/Iterator.java delete mode 100644 group17/785396327/list/LinkedList.java delete mode 100644 group17/785396327/list/List.java delete mode 100644 group17/785396327/queue/Queue.java delete mode 100644 group17/785396327/stack/Stack.java delete mode 100644 group17/82427129/.gitignore delete mode 100644 group17/82427129/JavaUtil/.gitignore delete mode 100644 group17/82427129/JavaUtil/pom.xml delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/Queue.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java delete mode 100644 group17/865797761/.classpath delete mode 100644 group17/865797761/.gitignore delete mode 100644 group17/865797761/.project delete mode 100644 group17/865797761/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group17/865797761/src/Collection/ArrayList.java delete mode 100644 group17/865797761/src/Collection/Iterable.java delete mode 100644 group17/865797761/src/Collection/Iterator.java delete mode 100644 group17/865797761/src/Collection/List.java delete mode 100644 group17/865797761/src/Collection/MyArrayList.java delete mode 100644 group17/865797761/src/Collection/MyLinkedList.java delete mode 100644 group17/865797761/src/Collection/MyQueue.java delete mode 100644 group17/876385982/.classpath delete mode 100644 group17/876385982/.gitignore delete mode 100644 group17/876385982/.project delete mode 100644 group17/876385982/src/test/Test.java delete mode 100644 "group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md" delete mode 100644 group17/group17.md delete mode 100644 group18/1078285863/javaStudy/src/basicStruct/BasicStruct.java delete mode 100644 group18/1078285863/javaStudy/src/simpleArrayList/SimpleArrayList.java delete mode 100644 group18/1078285863/javaStudy/src/simpleLinkedList/SimpleLinkedList.java delete mode 100644 group18/1078285863/javaStudy/src/simpleQueue/SimpleQueue.java delete mode 100644 group18/1078285863/javaStudy/src/simpleStack/SimpleStack.java delete mode 100644 group18/1159828430/20170219/.classpath delete mode 100644 group18/1159828430/20170219/.gitignore delete mode 100644 group18/1159828430/20170219/.project delete mode 100644 group18/1159828430/20170219/src/com/coding/basic/ArrayList.java delete mode 100644 group18/1159828430/20170219/src/com/coding/basic/Iterator.java delete mode 100644 group18/1159828430/20170219/src/com/coding/basic/LinkedList.java delete mode 100644 group18/1159828430/20170219/src/com/coding/basic/List.java delete mode 100644 group18/1159828430/20170219/src/com/coding/basic/Queue.java delete mode 100644 group18/1159828430/20170219/src/com/coding/basic/Stack.java delete mode 100644 group18/1159828430/README.md delete mode 100644 group18/744888802/dataStructure/pom.xml delete mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/ArrayList.java delete mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/Iterator.java delete mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/LinkedList.java delete mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/List.java delete mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/Queue.java delete mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/Stack.java delete mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/TestMain.java delete mode 100644 group18/784140710/week01/.gitignore delete mode 100644 group18/784140710/week01/src/com/coding/basic/ArrayIterator.java delete mode 100644 group18/784140710/week01/src/com/coding/basic/ArrayList.java delete mode 100644 group18/784140710/week01/src/com/coding/basic/BinaryTree.java delete mode 100644 group18/784140710/week01/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group18/784140710/week01/src/com/coding/basic/Iterator.java delete mode 100644 group18/784140710/week01/src/com/coding/basic/LinkedList.java delete mode 100644 group18/784140710/week01/src/com/coding/basic/List.java delete mode 100644 group18/784140710/week01/src/com/coding/basic/Queue.java delete mode 100644 group18/784140710/week01/src/com/coding/basic/Stack.java delete mode 100644 group18/784140710/week01/src/com/coding/test/Test01.java delete mode 100644 group18/784140710/week01/src/com/coding/test/TestBinaryTree.java delete mode 100644 group18/935542673/Coding/.classpath delete mode 100644 group18/935542673/Coding/.gitignore delete mode 100644 group18/935542673/Coding/.project delete mode 100644 group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyArrayListTest.java delete mode 100644 group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyBinarySearchTreeTest.java delete mode 100644 group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyLinkedListTest.java delete mode 100644 group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyQueueTest.java delete mode 100644 group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyStackTest.java delete mode 100644 group18/935542673/Coding/src/com/ikook/basic_data_structure/MyArrayList.java delete mode 100644 group18/935542673/Coding/src/com/ikook/basic_data_structure/MyBinarySearchTree.java delete mode 100644 group18/935542673/Coding/src/com/ikook/basic_data_structure/MyIterator.java delete mode 100644 group18/935542673/Coding/src/com/ikook/basic_data_structure/MyLinkedList.java delete mode 100644 group18/935542673/Coding/src/com/ikook/basic_data_structure/MyList.java delete mode 100644 group18/935542673/Coding/src/com/ikook/basic_data_structure/MyQueue.java delete mode 100644 group18/935542673/Coding/src/com/ikook/basic_data_structure/MyStack.java delete mode 100644 group18/935542673/Coding/src/com/ikook/basic_data_structure/README.md delete mode 100644 "group18/935542673/Datum/\345\205\263\344\272\216.metadata\347\233\256\345\275\225\345\222\214.gitignore\344\275\277\347\224\250\347\232\204\351\227\256\351\242\230.docx" delete mode 100644 group18/group18.md delete mode 100644 group19/1294642551/.gitignore delete mode 100644 group19/1294642551/readme.txt delete mode 100644 group19/1294642551/src/data_Structures/ArrayList.java delete mode 100644 group19/1294642551/src/data_Structures/LinkedList.java delete mode 100644 group19/1294642551/src/data_Structures/List.java delete mode 100644 group19/1294642551/src/data_Structures/Queue.java delete mode 100644 group19/1294642551/src/data_Structures/Stack.java delete mode 100644 group19/1592562638/.gitignore delete mode 100644 group19/1592562638/src/ArrayList_self.java delete mode 100644 group19/1592562638/src/BinaryTreeNode_self.java delete mode 100644 group19/1592562638/src/CollectionTest.java delete mode 100644 group19/1592562638/src/KIList.java delete mode 100644 group19/1592562638/src/LinkedList_self.java delete mode 100644 group19/1592562638/src/Name.java delete mode 100644 group19/1592562638/src/Queue_self.java delete mode 100644 group19/1592562638/src/Stack_self.java delete mode 100644 "group19/1592562638/\350\257\273\344\271\246\347\254\224\350\256\260/1\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206/\350\257\273\344\271\246\347\254\224\350\256\260_\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.pdf" delete mode 100644 group19/2558178127/.gitignore delete mode 100644 group19/2558178127/src/com/cn/kevin/Test.java delete mode 100644 group19/2558178127/src/com/coding/basic/ArrayList.java delete mode 100644 group19/2558178127/src/com/coding/basic/Iterator.java delete mode 100644 group19/2558178127/src/com/coding/basic/LinkedList.java delete mode 100644 group19/2558178127/src/com/coding/basic/List.java delete mode 100644 group19/2558178127/src/com/coding/basic/Queue.java delete mode 100644 group19/2558178127/src/com/coding/basic/Stack.java delete mode 100644 group19/398129523/ArrayList delete mode 100644 group19/398129523/LinkedList delete mode 100644 group19/398129523/Queue delete mode 100644 group19/398129523/Stack delete mode 100644 group19/527220084/xukai_coding/.gitignore delete mode 100644 group19/527220084/xukai_coding/coding-common/pom.xml delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/ArrayList.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/BinaryTreeNode.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Iterator.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/LinkedList.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/List.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Queue.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Stack.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/ArrayListTest.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/BinaryTreeNodeTest.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/LinkedListTest.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/QueueTest.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/StackTest.java delete mode 100644 group19/527220084/xukai_coding/pom.xml delete mode 100644 "group19/604322962/cpu\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.txt" delete mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java delete mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java delete mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java delete mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/List.java delete mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/Queue.java delete mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/Stack.java delete mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/ArrayList.java delete mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/Iterator.java delete mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/LinkedList.java delete mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/List.java delete mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/Queue.java delete mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/Stack.java delete mode 100644 group19/972815123/src/com/coding/basic/ArrayList.java delete mode 100644 group19/972815123/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group19/972815123/src/com/coding/basic/Iterator.java delete mode 100644 group19/972815123/src/com/coding/basic/LinkedList.java delete mode 100644 group19/972815123/src/com/coding/basic/List.java delete mode 100644 group19/972815123/src/com/coding/basic/MainTest.java delete mode 100644 group19/972815123/src/com/coding/basic/Queue.java delete mode 100644 group19/972815123/src/com/coding/basic/Stack.java delete mode 100644 group19/972815123/test.txt delete mode 100644 group19/976180558/.gitignore delete mode 100644 group19/976180558/src/com/coding/basic/ArrayList.java delete mode 100644 group19/976180558/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group19/976180558/src/com/coding/basic/Iterator.java delete mode 100644 group19/976180558/src/com/coding/basic/LinkedList.java delete mode 100644 group19/976180558/src/com/coding/basic/List.java delete mode 100644 group19/976180558/src/com/coding/basic/Queue.java delete mode 100644 group19/976180558/src/com/coding/basic/Stack.java delete mode 100644 group19/group19.md delete mode 100644 group20/.gitignore delete mode 100644 group20/1040154728/1040154728Learning/src/SinglyLinkedList/LinkedList0.java delete mode 100644 group20/1040154728/1040154728Learning/src/SinglyLinkedList2/LinkedList1.java delete mode 100644 group20/1040154728/1040154728Learning/src/honoka.md delete mode 100644 group20/1107837739/1107837739Learning/lib/hamcrest-core-1.3.jar delete mode 100644 group20/1107837739/1107837739Learning/lib/junit-4.12.jar delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/Main.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/list/KArrayList.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/list/KIterator.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/list/KLinkedList.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/list/KList.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/list/KListIteratorTest.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/list/KListTest.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/queue/KArrayQueue.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/queue/KQueue.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/queue/KQueueTest.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/stack/KStack.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/stack/KStackTest.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNode.java delete mode 100644 group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNodeTest.java delete mode 100644 group20/1107837739/korben.md delete mode 100644 group20/286166752/.gitignore delete mode 100644 group20/286166752/src/wiki/liven/code/dataStructures/ArrayList.java delete mode 100644 group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java delete mode 100644 group20/286166752/src/wiki/liven/code/dataStructures/List.java delete mode 100644 group20/286166752/src/wiki/liven/code/dataStructures/Queue.java delete mode 100644 group20/286166752/src/wiki/liven/code/dataStructures/Stack.java delete mode 100644 group20/286166752/src/wiki/liven/code/test/SomeDemos.java delete mode 100644 group20/331798361/assignment1/src/com/coding/basic/ArrayList.java delete mode 100644 group20/331798361/assignment1/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group20/331798361/assignment1/src/com/coding/basic/Iterator.java delete mode 100644 group20/331798361/assignment1/src/com/coding/basic/LinkedList.java delete mode 100644 group20/331798361/assignment1/src/com/coding/basic/List.java delete mode 100644 group20/331798361/assignment1/src/com/coding/basic/Queue.java delete mode 100644 group20/331798361/assignment1/src/com/coding/basic/Stack.java delete mode 100644 group20/404130810/src/com/basic/datastructure/ArrayList.java delete mode 100644 group20/404130810/src/com/basic/datastructure/LinkedList.java delete mode 100644 group20/404130810/src/com/basic/datastructure/List.java delete mode 100644 group20/404130810/src/com/basic/datastructure/Queue.java delete mode 100644 group20/404130810/src/com/basic/datastructure/Stack.java delete mode 100644 group20/404130810/src/com/basic/practice/PolymorphicInJava.java delete mode 100644 group20/404130810/src/com/basic/practice/ValuePassInJava.java delete mode 100644 group20/423184723/src/com/coding/basic/ArrayList.java delete mode 100644 group20/423184723/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group20/423184723/src/com/coding/basic/Iterator.java delete mode 100644 group20/423184723/src/com/coding/basic/LinkedList.java delete mode 100644 group20/423184723/src/com/coding/basic/List.java delete mode 100644 group20/423184723/src/com/coding/basic/Queue.java delete mode 100644 group20/423184723/src/com/coding/basic/Stack.java delete mode 100644 group20/452472201/.gitignore delete mode 100644 group20/452472201/src/com/coding/basic/ArrayList.java delete mode 100644 group20/452472201/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group20/452472201/src/com/coding/basic/Iterator.java delete mode 100644 group20/452472201/src/com/coding/basic/LinkedList.java delete mode 100644 group20/452472201/src/com/coding/basic/List.java delete mode 100644 group20/452472201/src/com/coding/basic/Queue.java delete mode 100644 group20/452472201/src/com/coding/basic/Stack.java delete mode 100644 group20/592146505/data _structure/src/cn/wsc/util/ArrayList.java delete mode 100644 group20/592146505/data _structure/src/cn/wsc/util/LinkedList.java delete mode 100644 group20/592146505/data _structure/src/cn/wsc/util/List.java delete mode 100644 group20/592146505/data _structure/src/cn/wsc/utils/Stack.java delete mode 100644 "group20/755659358/blogs/\350\256\241\347\256\227\346\234\272\351\203\250\344\273\266\347\220\206\350\247\243.txt" delete mode 100644 group20/755659358/liuxincourse_datastructure/src/liuxincourse/ArrayList.java delete mode 100644 group20/755659358/liuxincourse_datastructure/src/liuxincourse/LinkedList.java delete mode 100644 group20/755659358/liuxincourse_datastructure/src/liuxincourse/List.java delete mode 100644 group20/755659358/liuxincourse_datastructure/src/liuxincourse/Queue.java delete mode 100644 group20/755659358/liuxincourse_datastructure/src/liuxincourse/Stack.java delete mode 100644 group20/755659358/liuxincourse_datastructure/test/liuxincourse/ArrayListTest.java delete mode 100644 group20/755659358/liuxincourse_datastructure/test/liuxincourse/LinkedListTest.java delete mode 100644 group20/755659358/liuxincourse_datastructure/test/liuxincourse/QueueTest.java delete mode 100644 group20/755659358/liuxincourse_datastructure/test/liuxincourse/StackTest.java delete mode 100644 group20/755659358/liuxincourse_datastructure/test/liuxincourse/SuiteTest.java delete mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyArrayList.java" delete mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyIterator.java" delete mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyList.java" delete mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyQueue.java" delete mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyStack.java" delete mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java" delete mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/SingleLinkedList.java" delete mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\345\234\260\345\235\200" delete mode 100644 group20/group20.md delete mode 100644 group21/group21.md delete mode 100644 liuxin/.classpath delete mode 100644 liuxin/.gitignore delete mode 100644 liuxin/.project delete mode 100644 liuxin/.settings/org.eclipse.jdt.core.prefs delete mode 100644 liuxin/src/com/coderising/array/ArrayUtil.java delete mode 100644 liuxin/src/com/coderising/litestruts/LoginAction.java delete mode 100644 liuxin/src/com/coderising/litestruts/Struts.java delete mode 100644 liuxin/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 liuxin/src/com/coderising/litestruts/View.java delete mode 100644 liuxin/src/com/coderising/litestruts/struts.xml delete mode 100644 liuxin/src/com/coding/basic/ArrayList.java delete mode 100644 liuxin/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 liuxin/src/com/coding/basic/Iterator.java delete mode 100644 liuxin/src/com/coding/basic/LinkedList.java delete mode 100644 liuxin/src/com/coding/basic/List.java delete mode 100644 liuxin/src/com/coding/basic/Queue.java delete mode 100644 liuxin/src/com/coding/basic/Stack.java delete mode 100644 shell.sh diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 1a08aba0c8..0000000000 --- a/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -*.class -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -target - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -#ide config -.metadata -.recommenders -.idea/ - - - -#macOS -.DS_Store - - -*.iml -rebel.* -.rebel.* - -target - diff --git a/group01/1298552064/src/week01/basic/Iterator.java b/group01/1298552064/src/week01/basic/Iterator.java deleted file mode 100644 index e209875b54..0000000000 --- a/group01/1298552064/src/week01/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package week01.basic; - -public interface Iterator { - public boolean hasNext(); - - public Object next(); - -} diff --git a/group01/1298552064/src/week01/basic/List.java b/group01/1298552064/src/week01/basic/List.java deleted file mode 100644 index 608c1b532b..0000000000 --- a/group01/1298552064/src/week01/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package week01.basic; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group01/1298552064/src/week01/basic/MyArrayList.java b/group01/1298552064/src/week01/basic/MyArrayList.java deleted file mode 100644 index c4f6572f1c..0000000000 --- a/group01/1298552064/src/week01/basic/MyArrayList.java +++ /dev/null @@ -1,131 +0,0 @@ -package week01.basic; - -import java.util.Arrays; - -public class MyArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - ensureCapacity(size + 1); - - elementData[size++] = o; - } - - public void add(int index, Object o) { - checkPositionIndex(index); - ensureCapacity(size + 1); - - if (index >= size) { - elementData[size++] = o; - } else { - System.arraycopy(elementData, index, elementData, index + 1, size - - index); - - elementData[index] = o; - - size++; - } - } - - public Object get(int index) { - checkElementIndex(index); - return elementData[index]; - } - - public Object remove(int index) { - checkElementIndex(index); - Object removeElement = elementData[index]; - if (index == (size - 1)) { - elementData[index] = null; - size--; - } else { - System.arraycopy(elementData, index + 1, elementData, index, size - - index - 1); - elementData[size - 1] = null; - size--; - } - return removeElement; - } - - public int size() { - return size; - } - - /** - * 保证数组空间充足 - * - * @param minCapacity - */ - private void ensureCapacity(int minCapacity) { - int capacity = elementData.length; - if (minCapacity > capacity) { - capacity += capacity / 2; - grow(capacity); - } - } - - private void checkElementIndex(int index) { - if (!isElementIndex(index)) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - } - } - - private boolean isElementIndex(int index) { - return index >= 0 && index < size; - } - - private void checkPositionIndex(int index) { - if (!isPositionIndex(index)) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - } - } - - private boolean isPositionIndex(int index) { - return index >= 0 && index <= size; - } - - private void grow(int newCapacity) { - elementData = Arrays.copyOf(elementData, newCapacity); - } - - public Iterator iterator() { - return new ArrayListIterator(this); - } - - private class ArrayListIterator implements Iterator { - private MyArrayList list; - private int position = 0; - - private ArrayListIterator(MyArrayList list) { - this.list = list; - } - - @Override - public boolean hasNext() { - if ((position + 1) > size) { - return false; - } - return true; - } - - @Override - public Object next() { - return list.get(position++); - } - } - - @Override - public String toString() { - String elementStr = ""; - for (int i = 0; i < size; i++) { - elementStr += elementData[i] + ","; - } - return "MyArrayList: { size=" + size + ", elementData=" + "[" - + elementStr.substring(0, elementStr.length() - 1) + "]" + " }"; - } -} diff --git a/group01/1298552064/src/week01/basic/MyBinaryTreeNode.java b/group01/1298552064/src/week01/basic/MyBinaryTreeNode.java deleted file mode 100644 index 30e6c810a5..0000000000 --- a/group01/1298552064/src/week01/basic/MyBinaryTreeNode.java +++ /dev/null @@ -1,70 +0,0 @@ -package week01.basic; - -public class MyBinaryTreeNode { - - private Object data; - private MyBinaryTreeNode left; - private MyBinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public MyBinaryTreeNode getLeft() { - return left; - } - - public void setLeft(MyBinaryTreeNode left) { - this.left = left; - } - - public MyBinaryTreeNode getRight() { - return right; - } - - public void setRight(MyBinaryTreeNode right) { - this.right = right; - } - - public MyBinaryTreeNode insert(Object o) { - if(this.getData() == null && this.getLeft() == null && this.getRight() == null){ - this.setData(o); - this.setLeft(null); - this.setRight(null); - return this; - } - - MyBinaryTreeNode node = new MyBinaryTreeNode(); - MyBinaryTreeNode currentNode = this; - while(true){ - if((Integer) o < (Integer) getData()){ - if(currentNode.getLeft() == null){ - node.setData(o); - node.setLeft(null); - node.setRight(null); - - currentNode.setLeft(node); - return this; - }else{ - currentNode = currentNode.getLeft(); - } - - }else{ - if(currentNode.getRight() == null){ - node.setData(o); - node.setLeft(null); - node.setRight(null); - - currentNode.setRight(node); - return this; - }else{ - currentNode = currentNode.getRight(); - } - } - } - } -} diff --git a/group01/1298552064/src/week01/basic/MyLinkedList.java b/group01/1298552064/src/week01/basic/MyLinkedList.java deleted file mode 100644 index 4894c5ff6c..0000000000 --- a/group01/1298552064/src/week01/basic/MyLinkedList.java +++ /dev/null @@ -1,215 +0,0 @@ -package week01.basic; - -public class MyLinkedList implements List { - - private Node head; - private int size; - - public void add(Object o) { - // 空链表 - if (head == null) { - head = new Node(); - head.data = o; - head.next = null; - } else { - Node p = head; - while (p.next != null) { - p = p.next; - } - - Node target = new Node(); - target.data = o; - target.next = null; - p.next = target; - } - size++; - } - - public void add(int index, Object o) { - // index 是否合法 - checkPositionIndex(index); - if (head == null) { - head = new Node(); - head.data = o; - head.next = null; - } else { - if (index == 0) { - addFirst(o); - } else if (index == size) { - addLast(o); - } else { - Node p = new Node(); - Node p1 = head; - for (int i = 0; i < index - 1; i++) { - p1 = p1.next; - } - p.data = o; - p.next = p1.next; - p1.next = p; - - size++; - } - } - } - - public Object get(int index) { - checkElementIndex(index); - Node p = head; - for (int i = 0; i < index; i++) { - p = p.next; - } - return p.data; - } - - public Object remove(int index) { - checkElementRemove(); - checkElementIndex(index); - - Object removeObject = null; - if (index == 0) { - removeObject = removeFirst(); - } else if (index == (size - 1)) { - removeObject = removeLast(); - } else { - Node p = head; - for (int i = 1; i < index; i++) { - p = p.next; - } - removeObject = p.next.data; - p.next = p.next.next; - size--; - } - return removeObject; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - if (head == null) { - head = new Node(); - head.data = o; - head.next = null; - } else { - Node p = new Node(); - p.data = o; - p.next = head; - head = p; - } - size++; - } - - public void addLast(Object o) { - add(o); - } - - public Object removeFirst() { - checkElementRemove(); - Object removeObject = head.data; - head = head.next; - size--; - return removeObject; - } - - public Object removeLast() { - checkElementRemove(); - - Object removeObject = null; - - if (size == 1) { - removeObject = head.data; - head = head.next; - } else { - Node p = head; - for (int i = 0; i < size; i++) { - if (p.next.next == null) { - removeObject = p.next; - p.next = null; - break; - } else { - p = p.next; - } - } - } - size--; - return removeObject; - } - - private boolean isEmpty() { - return size == 0; - } - - private void checkElementRemove() { - if (isEmpty()) { - throw new NullPointerException("The list is empty."); - } - } - - private void checkElementIndex(int index) { - if (!isElementIndex(index)) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - } - } - - private boolean isElementIndex(int index) { - return index >= 0 && index < size; - } - - private void checkPositionIndex(int index) { - if (!isPositionIndex(index)) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - } - } - - private boolean isPositionIndex(int index) { - return index >= 0 && index <= size; - } - - public Iterator iterator() { - return new MyLinkedListIterator(this); - } - - private class MyLinkedListIterator implements Iterator { - private MyLinkedList list = null; - private int position = 0; - - private MyLinkedListIterator(MyLinkedList list) { - this.list = list; - } - - @Override - public boolean hasNext() { - if ((position + 1) > size()) { - return false; - } - return true; - } - - @Override - public Object next() { - return list.get(position++); - } - } - - private static class Node { - Object data; - Node next; - } - - @Override - public String toString() { - String elementStr = ""; - Node p = head; - while (p != null) { - elementStr += p.data + ","; - p = p.next; - } - - return "MyLinkedList: { size=" + size + ", elementData=" + "[" - + elementStr.substring(0, elementStr.length() - 1) + "]" + " }"; - } - -} diff --git a/group01/1298552064/src/week01/basic/MyQueue.java b/group01/1298552064/src/week01/basic/MyQueue.java deleted file mode 100644 index 54008652ff..0000000000 --- a/group01/1298552064/src/week01/basic/MyQueue.java +++ /dev/null @@ -1,22 +0,0 @@ -package week01.basic; - -public class MyQueue { - - private MyLinkedList elementData = new MyLinkedList(); - - public void enQueue(Object o) { - elementData.add(o); - } - - public Object deQueue() { - return elementData.removeFirst(); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} diff --git a/group01/1298552064/src/week01/basic/MyStack.java b/group01/1298552064/src/week01/basic/MyStack.java deleted file mode 100644 index aea4d94e24..0000000000 --- a/group01/1298552064/src/week01/basic/MyStack.java +++ /dev/null @@ -1,25 +0,0 @@ -package week01.basic; - -public class MyStack { - private MyArrayList elementData = new MyArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - return elementData.remove(size() - 1); - } - - public Object peek() { - return elementData.get(size() - 1); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} diff --git a/group01/1298552064/src/week01/test/MyArrayListTest.java b/group01/1298552064/src/week01/test/MyArrayListTest.java deleted file mode 100644 index 219035b46f..0000000000 --- a/group01/1298552064/src/week01/test/MyArrayListTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package week01.test; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import week01.basic.MyArrayList; - - - -public class MyArrayListTest { - - private MyArrayList list = null; - - @Before - public void setUp() throws Exception { - list = new MyArrayList(); - - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - } - - @After - public void tearDown() throws Exception { - list = null; - } - - @Test - public void testAdd(){ - list.add(4, 10); - Assert.assertEquals("MyArrayList: { size=6, elementData=[1,2,3,4,10,5] }", list.toString()); - } - - @Test - public void testGet(){ - Assert.assertEquals((Object)new Integer(3), list.get(2)); - } - - @Test - public void testRemove(){ - list.remove(2); - Assert.assertEquals("MyArrayList: { size=4, elementData=[1,2,4,5] }", list.toString()); - } - - @Test - public void testSize(){ - Assert.assertEquals((Object)new Integer(5), list.size()); - } -} diff --git a/group01/1298552064/src/week01/test/MyLinkedListTest.java b/group01/1298552064/src/week01/test/MyLinkedListTest.java deleted file mode 100644 index b5d6c048d6..0000000000 --- a/group01/1298552064/src/week01/test/MyLinkedListTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package week01.test; - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import week01.basic.MyLinkedList; - -public class MyLinkedListTest { - - private MyLinkedList list = null; - - @Before - public void setUp() throws Exception { - list = new MyLinkedList(); - - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - } - - @After - public void tearDown() throws Exception { - list = null; - } - - - @Test - public void testAdd(){ - list.add(3,10); - Assert.assertEquals("MyLinkedList: { size=6, elementData=[1,2,3,10,4,5] }",list.toString()); - } - - @Test - public void testAddFirst(){ - list.addFirst(100); - Assert.assertEquals("MyLinkedList: { size=6, elementData=[100,1,2,3,4,5] }",list.toString()); - } - - @Test - public void testAddLast(){ - list.addLast(100); - Assert.assertEquals("MyLinkedList: { size=6, elementData=[1,2,3,4,5,100] }",list.toString()); - } - - @Test - public void testGet(){ - Assert.assertEquals((Object)new Integer(5), list.get(4)); - } - - @Test - public void testRemove(){ - list.remove(3); - Assert.assertEquals("MyLinkedList: { size=4, elementData=[1,2,3,5] }",list.toString()); - } - - @Test - public void testRemoveFirst(){ - list.removeFirst(); - Assert.assertEquals("MyLinkedList: { size=4, elementData=[2,3,4,5] }",list.toString()); - } - - @Test - public void testRemoveLast(){ - list.removeLast(); - Assert.assertEquals("MyLinkedList: { size=4, elementData=[1,2,3,4] }",list.toString()); - } - - @Test - public void testSize(){ - Assert.assertEquals((Object)new Integer(5), list.size()); - } - -} diff --git a/group01/1298552064/src/week01/test/MyQueueTest.java b/group01/1298552064/src/week01/test/MyQueueTest.java deleted file mode 100644 index f9b7cb63f2..0000000000 --- a/group01/1298552064/src/week01/test/MyQueueTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package week01.test; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import week01.basic.MyQueue; - -public class MyQueueTest { - - private MyQueue queue = null; - - @Before - public void setUp() throws Exception { - queue = new MyQueue(); - - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - } - - @After - public void tearDown() throws Exception { - queue = null; - } - - @Test - public void testEnQueue(){ - queue.enQueue(4); - Assert.assertEquals((Object)new Integer(4), queue.size()); - } - - @Test - public void testDeQueue(){ - Assert.assertEquals((Object) new Integer(1), queue.deQueue()); - } - - @Test - public void testIsEmpty(){ - Assert.assertFalse(queue.isEmpty()); - } - - @Test - public void testSize(){ - Assert.assertEquals((Object)new Integer(3), queue.size()); - } -} diff --git a/group01/1298552064/src/week01/test/MyStackTest.java b/group01/1298552064/src/week01/test/MyStackTest.java deleted file mode 100644 index 4efbc2b204..0000000000 --- a/group01/1298552064/src/week01/test/MyStackTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package week01.test; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import week01.basic.MyStack; - -public class MyStackTest { - private MyStack stack = null; - - @Before - public void setUp() throws Exception { - stack = new MyStack(); - - stack.push(1); - stack.push(2); - stack.push(3); - } - - @After - public void tearDown() throws Exception { - stack = null; - } - - @Test - public void tearPush() throws Exception { - stack.push(10); - Assert.assertEquals((Object) new Integer(4), stack.size()); - Assert.assertEquals((Object) new Integer(10), stack.peek()); - } - - @Test - public void testPop(){ - Assert.assertEquals((Object) new Integer(3), stack.pop()); - Assert.assertEquals((Object) new Integer(2), stack.size()); - } - - @Test - public void testPeek(){ - Assert.assertEquals((Object) new Integer(3), stack.peek()); - } - - @Test - public void testIsEmpty(){ - Assert.assertFalse(stack.isEmpty()); - } - - @Test - public void testSize(){ - Assert.assertEquals((Object) new Integer(3), stack.size()); - } -} diff --git a/group01/1328404806/RemoteSystemsTempFiles/.project b/group01/1328404806/RemoteSystemsTempFiles/.project deleted file mode 100644 index 7675629320..0000000000 --- a/group01/1328404806/RemoteSystemsTempFiles/.project +++ /dev/null @@ -1,12 +0,0 @@ - - - RemoteSystemsTempFiles - - - - - - - org.eclipse.rse.ui.remoteSystemsTempNature - - diff --git a/group01/1328404806/dataStructure/.classpath b/group01/1328404806/dataStructure/.classpath deleted file mode 100644 index 7faf63dc05..0000000000 --- a/group01/1328404806/dataStructure/.classpath +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/group01/1328404806/dataStructure/.gitignore b/group01/1328404806/dataStructure/.gitignore deleted file mode 100644 index b83d22266a..0000000000 --- a/group01/1328404806/dataStructure/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/group01/1328404806/dataStructure/.project b/group01/1328404806/dataStructure/.project deleted file mode 100644 index 86bf42de91..0000000000 --- a/group01/1328404806/dataStructure/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - dataStructure - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/group01/1328404806/dataStructure/.settings/org.eclipse.core.resources.prefs b/group01/1328404806/dataStructure/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 4c28b1a898..0000000000 --- a/group01/1328404806/dataStructure/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/group01/1328404806/dataStructure/.settings/org.eclipse.jdt.core.prefs b/group01/1328404806/dataStructure/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 8626026241..0000000000 --- a/group01/1328404806/dataStructure/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/group01/1328404806/dataStructure/.settings/org.eclipse.m2e.core.prefs b/group01/1328404806/dataStructure/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index 14b697b7bb..0000000000 --- a/group01/1328404806/dataStructure/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/group01/1328404806/dataStructure/pom.xml b/group01/1328404806/dataStructure/pom.xml deleted file mode 100644 index 0b5e3a1ca3..0000000000 --- a/group01/1328404806/dataStructure/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - 4.0.0 - - increaseLearning - dataStructure - 0.0.1-SNAPSHOT - jar - - dataStructure - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 3.8.1 - test - - - diff --git a/group01/1328404806/dataStructure/src/main/java/ListService/KILinkedList.java b/group01/1328404806/dataStructure/src/main/java/ListService/KILinkedList.java deleted file mode 100644 index 8f0307f340..0000000000 --- a/group01/1328404806/dataStructure/src/main/java/ListService/KILinkedList.java +++ /dev/null @@ -1,10 +0,0 @@ -package ListService; - -//集合接口 -public interface KILinkedList { - - public void add(T t, int pos); - - public T remove(int pos); - -} diff --git a/group01/1328404806/dataStructure/src/main/java/ListService/KIList.java b/group01/1328404806/dataStructure/src/main/java/ListService/KIList.java deleted file mode 100644 index b0851d30b0..0000000000 --- a/group01/1328404806/dataStructure/src/main/java/ListService/KIList.java +++ /dev/null @@ -1,28 +0,0 @@ -package ListService; - -//集合接口 -public interface KIList { - - public void add(T item); - - public void add(int index, T item); - - public void set(int index, T item); - - public void remove(int index); - - public void remove(T item); - - public void clear(); - - public boolean contains(T item); - - public boolean isEmpty(); - - public T get(int index); - - public int indexOf(T item); - - public int size(); - -} diff --git a/group01/1328404806/dataStructure/src/main/java/ListService/KIQueueList.java b/group01/1328404806/dataStructure/src/main/java/ListService/KIQueueList.java deleted file mode 100644 index b02c0e86a5..0000000000 --- a/group01/1328404806/dataStructure/src/main/java/ListService/KIQueueList.java +++ /dev/null @@ -1,11 +0,0 @@ -package ListService; - -//集合接口 -public interface KIQueueList { - public T add(T ele); - - public T remove(); - - public Object[] getData(); - -} diff --git a/group01/1328404806/dataStructure/src/main/java/ListService/KIStackList.java b/group01/1328404806/dataStructure/src/main/java/ListService/KIStackList.java deleted file mode 100644 index 8a1f031976..0000000000 --- a/group01/1328404806/dataStructure/src/main/java/ListService/KIStackList.java +++ /dev/null @@ -1,9 +0,0 @@ -package ListService; - -//集合接口 -public interface KIStackList { - public void push(T ele); - - public void pop(); - -} diff --git a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KArrayList.java b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KArrayList.java deleted file mode 100644 index d85a8957cf..0000000000 --- a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KArrayList.java +++ /dev/null @@ -1,192 +0,0 @@ -package ListServiceImpl; - -import ListService.KIList; - -public class KArrayList implements KIList { - - /** 初始化的容量的大小 */ - private final static int INIT_CAPACITY = 12; - private Object[] mList = null; - - /** 当前的容量 */ - private int mCurrentCapacity = 0; - /** 容器中元素的个数 */ - private int mSize = 0; - - public KArrayList() { - mList = new Object[INIT_CAPACITY]; - mCurrentCapacity = INIT_CAPACITY; - } - - /** - * 插入一个元素到链表尾部 - * - * @param item - */ - public void add(T item) { - if (mSize == mCurrentCapacity) { - expansion(); - } - mList[mSize] = item; - mSize++; - - } - - /** - * 插入一个元素到指定位置,从插入位置及其后面的元素往后移动一个位置 - * - * @param index - * 要插入的位置 - * @param item - */ - public void add(int index, T item) { - if (index < 0 || index >= mSize) { // 不允许index小于0,或者index >= 数组当前大小 - throw new IndexOutOfBoundsException(); - } - if (mSize == mCurrentCapacity) { - expansion(); - } - Object[] newList = new Object[mCurrentCapacity]; - System.arraycopy(mList, 0, newList, 0, index); - System.arraycopy(mList, index, newList, index + 1, mSize - index); - newList[index] = item; - mList = newList; - mSize++; - - } - - /** - * 更新指定位置的元素 - * - * @param index - * @param item - */ - public void set(int index, T item) { - if (index < 0 || index >= mSize) { - throw new IndexOutOfBoundsException(); - } - mList[index] = item; - - } - - /** - * 移除指定位置的元素,后面的元素向前移动一位 - * - * @param index - */ - public void remove(int index) { - if (index < 0 || index >= mSize) { - throw new IndexOutOfBoundsException(); - } - Object[] newList = new Object[mCurrentCapacity]; - System.arraycopy(mList, 0, newList, 0, index); - System.arraycopy(mList, index + 1, newList, index, mSize - index); - mList = newList; - mSize--; - - } - - /** - * 移除链表中特定的元素。(如果item在链表中有多个,只移除第一个) - * - * @param item - */ - public void remove(T item) { - for (int i = 0; i < mSize; i++) { - if (mList[i].equals(item)) { - remove(i); - break; - } - } - - } - - /** - * 将链表清空,capacity不变 - */ - public void clear() { - mList = new Object[mCurrentCapacity]; - mSize = 0; - - } - - /** - * 判断是否包含某个元素 - * - * @param item - * @return true表示有这个元素,false表示没有这个元素 - */ - public boolean contains(T item) { - for (int i = 0; i < mSize; i++) { - if (mList[i].equals(item)) { - return true; - } - } - return false; - } - - /** - * 判断链表是否为空 - * - * @return boolean - */ - public boolean isEmpty() { - return (mSize == 0) ? true : false; - } - - /** - * 获取指定位置的元素 - * - * @param index - * @return - */ - @SuppressWarnings("unchecked") - public T get(int index) { - if (index < 0 || index >= mSize) { - throw new IndexOutOfBoundsException(); - } - return (T) mList[index]; - } - - /** - * 获取特定元素所在的位置。 如果该链表中存在多个相同的元素,只返回第一个的位置,如果找不到,则返回-1。 - * - * @param item - * @return int 如果没找到,返回-1 - */ - public int indexOf(T item) { - for (int i = 0; i < mSize; i++) { - if (mList[i].equals(item)) { - return i; - } - } - return -1; - } - - /** - * 获取当前链表的长度 - * - * @return int - */ - public int size() { - return mSize; - } - - /** - * 扩容,当 mSize == mCurrentCapacity 时调用 - */ - private void expansion() { - Object[] oldList = mList; - Object[] newList = new Object[getNewCapacity()]; - System.arraycopy(oldList, 0, newList, 0, oldList.length); - mList = newList; - } - - /** - * 获取新的容量大小 当满的时候每次增加当前容量的50% - */ - private int getNewCapacity() { - return mCurrentCapacity = mCurrentCapacity + (mCurrentCapacity >> 1); - } - -} diff --git a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KLinkedList.java b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KLinkedList.java deleted file mode 100644 index 6afb12befc..0000000000 --- a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KLinkedList.java +++ /dev/null @@ -1,201 +0,0 @@ -package ListServiceImpl; - -import java.util.Iterator; - -import ListService.KILinkedList; - -public class KLinkedList implements Iterable, KILinkedList { - - // 记录链表的长度 - private int mSize = 0; - // private int mActionCount = 0; - // 开始和结束节点 - private Node mBeginNode, mLastNode; - - public KLinkedList() { - // TODO Auto-generated constructor stub - init(); - } - - /** - * 初始化一个只有开始节点和结束节点的空链表 - */ - private void init() { - // 将首位节点链接起来 - mBeginNode = new Node(null, null, null); - mLastNode = new Node(null, mBeginNode, null); - mBeginNode.nextNode = mLastNode; - mSize = 0; - // mActionCount++; - } - - public int size() { - return mSize; - } - - public boolean isEmpty() { - return mSize == 0 ? true : false; - } - - /** - * 在链表的pos位置之前放置t_node这个节点 - * - * @param t_node - * 需要放置的节点 - * @param pos - * 放置节点在pos之前 - */ - private void add(Node newNode, int pos) { - // 抛出不合法的位置 - if (pos < 0 || pos > mSize) { - throw new IndexOutOfBoundsException(); - } - - // 链接新节点 - newNode.nextNode = getNode(pos); - getNode(pos - 1).nextNode = newNode; - getNode(pos).preNode = newNode; - // mActionCount++; - mSize++; - - } - - /** - * t 供外部调用,直接在链表的末尾添加,即在mLastNode节点之前 - * - * @param - */ - public void add(T t) { - add(new Node(t, null, null), mSize); - } - - /** - * 往链表pos位置之前添加数据t - * - * @param t - * 添加的数据 - * @param pos - * 添加在pos位置之前 - */ - public void add(T t, int pos) { - add(new Node(t, null, null), pos); - } - - /** - * - * @param pos - * 链表中的某个位置 - * @return 翻去pos位置的节点 (此处的pos的范围是[-1,mSize],此方法是私有方法,外部访问不了,只共此类中呢个访问) - */ - private Node getNode(int pos) { - Node node; - int currentPos; - if (pos == -1) { - // -1的位置是开始节点 - return mBeginNode; - } else if (pos == mSize) { - // mSize的位置是结束的节点 - return mLastNode; - } - // 因为这是双向节点,所以判断一下能提高搜索效率 - if (pos < mSize / 2) { - currentPos = 0; - node = mBeginNode.nextNode; - while (currentPos < pos) { - node = node.nextNode; - currentPos++; - } - } else { - node = mLastNode.preNode; - currentPos = mSize - 1; - while (currentPos > pos) { - node = node.preNode; - currentPos--; - } - } - return node; - } - - public T get(int pos) { - return getNode(pos).t; - } - - public void set(T t, int pos) { - if (pos < 0 || pos >= mSize) { - throw new IndexOutOfBoundsException(); - } - getNode(pos).t = t; - } - - /** - * 删除特定位置的节点 - * - * @param t_node - * 需要删除节点的位置 - * @return - */ - private T remove(Node t_node) { - - t_node.preNode.nextNode = t_node.nextNode; - t_node.nextNode.preNode = t_node.preNode; - // 最好在此处给其设置为空,不要其链接到其他节点,因为已经被销毁,不再持有其他的节点的引用 - t_node.nextNode = null; - t_node.preNode = null; - mSize--; - // mActionCount++; - return t_node.t; - } - - public T remove(int pos) { - if (pos < 0 || pos >= mSize) { - throw new IndexOutOfBoundsException(); - } - Node tempNode = getNode(pos); - remove(tempNode); - return tempNode.t; - } - - public Iterator iterator() { - - return new MyLinkedListIterator(); - } - - private class MyLinkedListIterator implements Iterator { - - private int currentPos = 0; - - public boolean hasNext() { - // TODO Auto-generated method stub - if (currentPos < mSize) { - return true; - } - return false; - } - - public T next() { - // TODO Auto-generated method stub - return (T) getNode(currentPos++).t; - } - - public void remove() { - // TODO Auto-generated method stub - KLinkedList.this.remove(getNode(--currentPos)); - ; - } - - } - - // 静态内部类,定义的节点,双向链表,需要一个指向前面一项的引用域和一个指向后面一项的引用域,方便查找 - private static class Node { - public T t; - public Node preNode; - public Node nextNode; - - public Node(T t, Node preNode, Node nextNode) { - this.preNode = preNode; - this.nextNode = nextNode; - this.t = t; - } - } - -} diff --git a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KQueueList.java b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KQueueList.java deleted file mode 100644 index 7ea8643c43..0000000000 --- a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KQueueList.java +++ /dev/null @@ -1,97 +0,0 @@ -package ListServiceImpl; - -import java.util.Arrays; -import java.util.Collection; - -import ListService.KIQueueList; - -public class KQueueList implements KIQueueList{ - - /** 初始容量 */ - public static final int DEFAULT_SIZE = 10; - /** 容量不足时翻倍数 */ - public static final float DEFAULT_INCREMENT = 1.5f; - /** 数据 */ - private Object[] elementData; - /** 元素个数 */ - private int elementCount; - /** 数组的头部,即 下次删除数据的 index */ - private int head; - /** 数组的尾部,即 下次插入数据的 index */ - private int tail; - - public KQueueList() { - this(DEFAULT_SIZE); - } - - public KQueueList(int size) { - this.elementData = new Object[size]; - this.elementCount = 0; - this.head = 0; - this.tail = 0; - } - - public KQueueList(Object[] data) { - this.elementData = data; - this.elementCount = data.length; - this.head = 0; - this.tail = 0; - } - - public KQueueList(Collection c) { - this(c.toArray()); - } - - /** - * 添加数据 到尾部 - * - * @param ele - * @return - */ - public T add(T ele) { - if (tail >= elementData.length) { - adjustData(); - } - elementData[tail] = ele; - elementCount++; - tail++; - return ele; - }; - - /** - * 删除数据 从头部 - * - * @return - */ - @SuppressWarnings("unchecked") - public T remove() { - T e = (T) elementData[head]; - elementData[head] = null; - elementCount--; - head++; - return e; - }; - - /** - * 获得当前的数据 - * - * @return - */ - public Object[] getData() { - return Arrays.copyOfRange(this.elementData, this.head, this.tail); - } - - public void adjustData() { - if (tail >= elementData.length) { // tail 处空间不足时调用 - // head 的空位去掉 - int newSize = (elementData.length == elementCount) ? (int) Math.ceil(elementCount * DEFAULT_INCREMENT) - : elementData.length; - elementData = Arrays.copyOfRange(elementData, head, elementData.length); - // 调整空间 - elementData = Arrays.copyOf(elementData, newSize); - tail = elementCount; - head = 0; - } - } - -} diff --git a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KStackList.java b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KStackList.java deleted file mode 100644 index e2b9ee1186..0000000000 --- a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KStackList.java +++ /dev/null @@ -1,48 +0,0 @@ -package ListServiceImpl; - -import java.util.Arrays; - -import ListService.KIStackList; - -public class KStackList implements KIStackList{ - Object[] data; - private int capacity; - private int size; - - public KStackList() - { - capacity=16; - size=0; - data=new Object[capacity]; - } - - public void ensureCapacity() { - capacity = capacity * 2; - data = Arrays.copyOf(data, capacity); - } - - //压入栈底 - public void push(T ele) { - if (size < capacity) { - data[size++] = ele; - } else { - ensureCapacity(); - data[size++] = ele; - } - } - - //弹出 - public void pop() { - if (size > 0) { - System.out.println(data[size - 1]); - data[--size] = null; - } else { - System.out.println("Empty stack!"); - } - } - - boolean isEmpty() { - return size == 0; - } - -} diff --git a/group01/1328404806/dataStructure/src/main/java/increaseLearning/dataStructure/App.java b/group01/1328404806/dataStructure/src/main/java/increaseLearning/dataStructure/App.java deleted file mode 100644 index 018ba70bdb..0000000000 --- a/group01/1328404806/dataStructure/src/main/java/increaseLearning/dataStructure/App.java +++ /dev/null @@ -1,13 +0,0 @@ -package increaseLearning.dataStructure; - -/** - * Hello world! - * - */ -public class App -{ - public static void main( String[] args ) - { - System.out.println( "Hello World!" ); - } -} diff --git a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/AppTest.java b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/AppTest.java deleted file mode 100644 index 4fffcb78ed..0000000000 --- a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package increaseLearning.dataStructure; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/arrayListTest.java b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/arrayListTest.java deleted file mode 100644 index 3815775989..0000000000 --- a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/arrayListTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package increaseLearning.dataStructure; - - -import org.junit.Test; - -import ListServiceImpl.KArrayList; -import junit.framework.TestCase; - -public class arrayListTest extends TestCase { - @Test - public void testArrayList() { - - KArrayList arr = new KArrayList(); - - for (int i = 1; i <= 50; i++) { - arr.add(i); - } - - arr.add(10, 99); - arr.add(0, 99); - - System.out.println(arr.get(51)); - System.out.println(arr.get(11)); - - // arr.clear(); - - // System.out.println(arr.contains(99)); - // System.out.println(arr.indexOf(59)); - - arr.remove(11); - - arr = null; - - } - -} diff --git a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/linkedListTest.java b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/linkedListTest.java deleted file mode 100644 index 6b42a261fa..0000000000 --- a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/linkedListTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package increaseLearning.dataStructure; - -import org.junit.Test; - -import ListServiceImpl.KLinkedList; -import junit.framework.TestCase; - -public class linkedListTest extends TestCase{ - @Test - public void testLinkedList(){ - KLinkedList linkList=new KLinkedList(); - - - linkList.add(3, 0); - - System.out.println(linkList.get(0)); -// System.out.println("成功!!!"); - - } - -} diff --git a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/queueListTest.java b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/queueListTest.java deleted file mode 100644 index af4f952f6c..0000000000 --- a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/queueListTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package increaseLearning.dataStructure; - -import org.junit.Assert; -import org.junit.Test; - -import ListServiceImpl.KQueueList; -import junit.framework.TestCase; - -public class queueListTest extends TestCase { - @Test - public void testQueueList() { - KQueueList queueOne = new KQueueList(); - // 第1次 加入个数 - int addCountOne = 30; - // 第1次 删除个数 - int removeCountOne = 20; - // 第2次 加入个数 - int addCountTwo = 10; - - for (int i = 0; i < addCountOne; i++) { - queueOne.add(i); - } - Object[] data = queueOne.getData(); - for (int i = 0; i < data.length; i++) { - Assert.assertTrue((Integer) data[i] == i); - } - - for (int i = 0; i < removeCountOne; i++) { - Assert.assertTrue(queueOne.remove() == i); - } - - for (int i = 0; i < addCountTwo; i++) { - queueOne.add(i * 10); - } - Object[] data2 = queueOne.getData(); - int baseCount = addCountOne - removeCountOne; - for (int i = 0; i < addCountTwo; i++) { - Assert.assertTrue((Integer) data2[baseCount + i] == i * 10); - } - } - -} diff --git a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/stackListTest.java b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/stackListTest.java deleted file mode 100644 index 614f18cb8c..0000000000 --- a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/stackListTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package increaseLearning.dataStructure; - -import org.junit.Test; - -import ListServiceImpl.KStackList; -import junit.framework.TestCase; - -public class stackListTest extends TestCase{ - @Test - public void testStackList(){ - KStackList fcStack=new KStackList(); - for(int i=0;i<10;i++) - { - fcStack.push(i); - System.out.println(fcStack); - } - - for(int i=0;i<10;i++) - { - fcStack.pop(); - System.out.println(fcStack); - } - fcStack.pop(); - } - -} diff --git a/group01/1664823950/.classpath b/group01/1664823950/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group01/1664823950/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group01/1664823950/.gitignore b/group01/1664823950/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group01/1664823950/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group01/1664823950/.project b/group01/1664823950/.project deleted file mode 100644 index 14ce66b1b3..0000000000 --- a/group01/1664823950/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 1664823950 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group01/1664823950/src/com/coding/basic/ArrayList.java b/group01/1664823950/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 87928e7483..0000000000 --- a/group01/1664823950/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List -{ - - private int size = 0; - - - private Object[] elementData = new Object[100]; - - public void add(Object o) - { - elementData[size] = o; - size ++; - } - - public void add(int index, Object o) - { - if(index > size || index < 0) - { - return; - } - else - { - for (int i = size-1; i > index; i--) - { - elementData[i+1] = elementData[size]; - } - elementData[index] = o; - size++; - } - - } - - public Object get(int index) - { - if(index < size || index >= 0) - { - return elementData[index]; - } - return null; - } - - public Object remove(int index) - { - Object removedObj; - if(index >= size || index < 0) - { - removedObj = null; - } - else - { - removedObj = elementData[index]; - for (int j = index; j < elementData.length; j++) - { - elementData[j] = elementData[j+1]; - } - size--; - } - return removedObj; - } - - public int size() - { - return size; - } - - public Iterator iterator() - { - return null; - } - -} diff --git a/group01/1664823950/src/com/coding/basic/BinaryTreeNode.java b/group01/1664823950/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 24710872cb..0000000000 --- a/group01/1664823950/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode -{ - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() - { - return data; - } - - public void setData(Object data) - { - this.data = data; - } - - public BinaryTreeNode getLeft() - { - return left; - } - - public void setLeft(BinaryTreeNode left) - { - this.left = left; - } - - public BinaryTreeNode getRight() - { - return right; - } - - public void setRight(BinaryTreeNode right) - { - this.right = right; - } - - public BinaryTreeNode insert(Object o) - { - return null; - } - -} diff --git a/group01/1664823950/src/com/coding/basic/Iterator.java b/group01/1664823950/src/com/coding/basic/Iterator.java deleted file mode 100644 index e5ccd24b42..0000000000 --- a/group01/1664823950/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic; - -public interface Iterator -{ - public boolean hasNext(); - public Object next(); - -} diff --git a/group01/1664823950/src/com/coding/basic/LinkedList.java b/group01/1664823950/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 2a217b2df7..0000000000 --- a/group01/1664823950/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List -{ - - private Node head; - private Node tail; - - public void add(Object o) - { - Node n = new Node(o); - tail.next = n; - tail = n; - } - - public void add(int index , Object o) - { - Node n = new Node(o); - getNode(index-1).next = n; - n.next = getNode(index); - } - - private Node getNode(int index) - { - Node n = head; - int counter = 0; - while (counter - - - - - - diff --git a/group01/1814014897/zhouhui/.gitignore b/group01/1814014897/zhouhui/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group01/1814014897/zhouhui/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group01/1814014897/zhouhui/.project b/group01/1814014897/zhouhui/.project deleted file mode 100644 index fab8d7f04c..0000000000 --- a/group01/1814014897/zhouhui/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group01/1814014897/zhouhui/.settings/org.eclipse.jdt.core.prefs b/group01/1814014897/zhouhui/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group01/1814014897/zhouhui/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/ArrayList.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/ArrayList.java deleted file mode 100644 index 23ed3f6bc2..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/ArrayList.java +++ /dev/null @@ -1,75 +0,0 @@ -package week01.BasicDataStructure; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - ensureCapacity(size + 1); //size increase,in order to have enough capacity. - elementData[size++] = o; //similar to: elementData[size]=o; size++; - } - - private void ensureCapacity(int minCapacity){ - if(minCapacity > elementData.length){ - grow(minCapacity); - } - } - - private void grow(int minCapacity){ - int oldCapacity = elementData.length; - int newCapacity = oldCapacity + ( oldCapacity >> 1 ); - if(newCapacity < minCapacity){ - newCapacity = minCapacity; - } - elementData = Arrays.copyOf(elementData, newCapacity); - - } - - public void add(int index, Object o){ - if(index < 0 || index > size) throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); - ensureCapacity(size+1); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - if(index < 0 || index >= size) throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); - return elementData[index]; - } - - public Object remove(int index){ - if(index < 0 || index >= size) throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); - Object data_index = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - elementData[size - 1] = null; - size--; - return data_index; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator{ - - private int pos = 0; - - public boolean hasNext() { - return pos < size; - } - - public Object next() { - return elementData[pos++]; - } - } - -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/BinaryTreeNode.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/BinaryTreeNode.java deleted file mode 100644 index a4fb2cf8b9..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/BinaryTreeNode.java +++ /dev/null @@ -1,56 +0,0 @@ -package week01.BasicDataStructure; - -public class BinaryTreeNode{ - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Object data){ - this.data = data; - left = null; - right = null; - } - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - if((Integer)o < (Integer)this.data) - { - if(this.left == null){ - BinaryTreeNode node = new BinaryTreeNode(o); - this.setLeft(node); - return node; - }else{ - return this.left.insert(o); - } - }else{ - if(this.right == null){ - BinaryTreeNode node = new BinaryTreeNode(o); - this.setRight(node); - return node; - }else{ - return this.right.insert(o); - } - } - } - } - - diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Iterator.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Iterator.java deleted file mode 100644 index 0ad3fff8f3..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package week01.BasicDataStructure; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/LinkedList.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/LinkedList.java deleted file mode 100644 index 35b1158cd1..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/LinkedList.java +++ /dev/null @@ -1,113 +0,0 @@ -package week01.BasicDataStructure; - -public class LinkedList implements List { - - private Node head; - private int size = 0; - - public void add(Object o){ - if(head == null){ - head = new Node(o); - }else{ - Node pos = head; - while(pos.next != null){ - pos = pos.next; - } - pos.next = new Node(o); - } - size++; - } - - public void add(int index , Object o){ - if(index < 0 || index >size ) throw new IndexOutOfBoundsException("Index:"+index+",Size"+size); - if(index == 0) { - Node node = new Node(o); - node.next = head; - head = node; - } - else{ - Node pos = head; - for(int i = 0;i < index-1;i++){ - pos = pos.next; - } - Node node = new Node(o); - node.next = pos.next; - pos.next = node; - } - size++; - } - - public Object get(int index){ - if(index < 0 || index >=size ) throw new IndexOutOfBoundsException("Index:"+index+",Size"+size); - Node pos = head; - for(int i = 0;i < index;i++){ - pos = pos.next; - } - return pos.data; - } - - public Object remove(int index){ - if(index < 0 || index >=size ) throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); - Node element = head; - if(index == 0){ - head = head.next; - }else{ - Node pos = head; - for(int i = 0;i < index - 1;i++){ - pos = pos.next; - } - element = pos.next; - pos.next = pos.next.next; - } - size--; - return element.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - add(0,o); - } - public void addLast(Object o){ - add(size,o); - } - public Object removeFirst(){ - return remove(0); - } - public Object removeLast(){ - return remove(size-1); - } - public Iterator iterator(){ - return new LinkedListIterator(); - } - - class LinkedListIterator implements Iterator{ - - private Node node = head; - private int pos = 0; - @Override - public boolean hasNext() { - return pos < size; - } - - @Override - public Object next() { - pos++; - if(pos != 1){ - node = node.next; - } - return node.data; - } - } - - private static class Node{ - Object data; - Node next; - public Node(Object data){ - this.data = data; - next = null; - } - } -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/List.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/List.java deleted file mode 100644 index 7806b75ed3..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package week01.BasicDataStructure; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Queue.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Queue.java deleted file mode 100644 index e0ab6bbb9c..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Queue.java +++ /dev/null @@ -1,25 +0,0 @@ -package week01.BasicDataStructure; - -public class Queue { - - private LinkedList linkedList = new LinkedList(); - private int size = 0; - - public void enQueue(Object o){ - linkedList.add(o); - size++; - } - - public Object deQueue(){ - size--; - return linkedList.removeFirst(); - } - - public boolean isEmpty(){ - return linkedList.size() == 0; - } - - public int size(){ - return size; - } -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Stack.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Stack.java deleted file mode 100644 index 53f99b37c7..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package week01.BasicDataStructure; - -public class Stack { - private ArrayList elementData = new ArrayList(); - private int size = 0; - - public void push(Object o){ - elementData.add(o); - size++; - } - - public Object pop(){ - return elementData.remove(--size); - } - - public Object peek(){ - return elementData.get(size - 1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/AllTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/AllTest.java deleted file mode 100644 index 5d5f07d815..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/AllTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package week01.BasicDataStructureTest; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@SuiteClasses({ - ArrayListTest.class, - BinaryTreeNodeTest.class, - LinkedListTest.class, - QueueTest.class, - StackTest.class -}) - -public class AllTest { - -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/ArrayListTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/ArrayListTest.java deleted file mode 100644 index c5513acfda..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/ArrayListTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package week01.BasicDataStructureTest; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import week01.BasicDataStructure.ArrayList; -import week01.BasicDataStructure.Iterator; - -public class ArrayListTest { - - private ArrayList arrayList = new ArrayList(); - - @Before - public void setUp() throws Exception { - for(int i = 0;i < 100 ; i++){ - arrayList.add(i); - } - } - - @Test - public void testAddObject() { - for(int i = 0;i < 100;i++){ - Assert.assertEquals(arrayList.get(i), i); - } - } - - @Test - public void testAddIntObject() { - arrayList.add(0,10); - arrayList.add(22, 44); - arrayList.add(40, 5); - arrayList.add(100,88); - Assert.assertEquals(arrayList.get(0), 10); - Assert.assertEquals(arrayList.get(22),44); - Assert.assertEquals(arrayList.get(40), 5); - Assert.assertEquals(arrayList.get(100), 88); - } - - @Test - public void testGet() { - Assert.assertEquals(arrayList.get(0), 0); - Assert.assertEquals(arrayList.get(33), 33); - Assert.assertEquals(arrayList.get(77), 77); - Assert.assertEquals(arrayList.get(99), 99); - } - - @Test - public void testRemove() { - Assert.assertEquals(arrayList.remove(0), 0); - Assert.assertEquals(arrayList.remove(0), 1); - Assert.assertEquals(arrayList.remove(97), 99); - Assert.assertEquals(arrayList.size(), 97); - } - - @Test - public void testSize() { - Assert.assertEquals(arrayList.size(), 100); - arrayList.add(5,5); - Assert.assertEquals(arrayList.size(),101); - arrayList.remove(5); - Assert.assertEquals(arrayList.size(), 100); - } - - @Test - public void testIterator() { - Iterator iterator = arrayList.iterator(); - for(int i=0;iterator.hasNext();i++){ - Assert.assertEquals(iterator.next(),i); - } - } -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/BinaryTreeNodeTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/BinaryTreeNodeTest.java deleted file mode 100644 index 724e6c0e03..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/BinaryTreeNodeTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package week01.BasicDataStructureTest; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import week01.BasicDataStructure.BinaryTreeNode; - - -public class BinaryTreeNodeTest { - - private BinaryTreeNode root = new BinaryTreeNode(5); - - @Before - public void setUp() throws Exception { - root.insert(2); - root.insert(7); - root.insert(1); - root.insert(6); - } - - @Test - public void testGetData() { - Assert.assertEquals(root.getData(), 5); - Assert.assertEquals(root.getLeft().getData(), 2); - Assert.assertEquals(root.getRight().getData(), 7); - Assert.assertEquals(root.getLeft().getLeft().getData(), 1); - Assert.assertEquals(root.getRight().getLeft().getData(), 6); - } - - @Test - public void testSetData() { - root.setData(8); - Assert.assertEquals(root.getData(),8); - root.getLeft().setData(88); - Assert.assertEquals(root.getLeft().getData(),88); - root.getRight().setData(888); - Assert.assertEquals(root.getRight().getData(),888); - } - - @Test - public void testGetLeft() { - BinaryTreeNode node_left = root.getLeft(); - Assert.assertEquals(node_left.getData(), 2); - BinaryTreeNode node_left_left = root.getLeft().getLeft(); - Assert.assertEquals(node_left_left.getData(), 1); - } - - @Test - public void testSetLeft() { - BinaryTreeNode node = new BinaryTreeNode(100); - root.setLeft(node); - Assert.assertEquals(root.getLeft().getData(), 100); - } - - @Test - public void testGetRight() { - BinaryTreeNode node_right = root.getRight(); - Assert.assertEquals(node_right.getData(), 7); - root.insert(8); - BinaryTreeNode node_right_right = root.getRight().getRight(); - Assert.assertEquals(node_right_right.getData(), 8); - } - - @Test - public void testSetRight() { - BinaryTreeNode node = new BinaryTreeNode(100); - root.setRight(node); - Assert.assertEquals(root.getRight().getData(), 100); - } - - @Test - public void testInsert() { - root.insert(4); - root.insert(8); - Assert.assertEquals(root.getLeft().getRight().getData(), 4); - Assert.assertEquals(root.getRight().getRight().getData(), 8); - } - -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/LinkedListTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/LinkedListTest.java deleted file mode 100644 index 2fb20d12f4..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/LinkedListTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package week01.BasicDataStructureTest; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import week01.BasicDataStructure.Iterator; -import week01.BasicDataStructure.LinkedList; - -public class LinkedListTest { - - private LinkedList linkedList = new LinkedList(); - - @Before - public void setUp() throws Exception { - for(int i=0;i<100;i++){ - linkedList.add(i); - } - } - - @Test - public void testAddObject() { - for(int i=0;i<200;i++){ - linkedList.add(i); - } - for(int i=0;i<100;i++){ - Assert.assertEquals(linkedList.get(i), i); - } - for(int i=100;i<300;i++){ - Assert.assertEquals(linkedList.get(i), i-100); - } - } - - @Test - public void testAddIntObject() { - linkedList.add(0, 10); - Assert.assertEquals(linkedList.get(0), 10); - linkedList.add(5,60); - Assert.assertEquals(linkedList.get(5), 60); - Assert.assertEquals(linkedList.get(101), 99); - } - - @Test - public void testGet() { - for(int i =0;i<100;i++){ - Assert.assertEquals(linkedList.get(i), i); - } - } - - @Test - public void testRemove() { - Assert.assertEquals(linkedList.remove(0), 0); - Assert.assertEquals(linkedList.remove(0), 1); - Assert.assertEquals(linkedList.size(), 98); - linkedList.remove(97); - Assert.assertEquals(linkedList.get(96), 98); - } - - @Test - public void testSize() { - linkedList.add(0); - Assert.assertEquals(linkedList.size(), 101); - linkedList.add(0, 10); - Assert.assertEquals(linkedList.size(), 102); - linkedList.remove(0); - Assert.assertEquals(linkedList.size(), 101); - } - - @Test - public void testAddFirst() { - linkedList.addFirst(22); - Assert.assertEquals(linkedList.get(0), 22); - linkedList.addFirst(44); - Assert.assertEquals(linkedList.get(0), 44); - Assert.assertEquals(linkedList.size(), 102); - } - - @Test - public void testAddLast() { - linkedList.addLast(22); - Assert.assertEquals(linkedList.get(100), 22); - linkedList.addLast(44); - Assert.assertEquals(linkedList.get(101), 44); - } - - @Test - public void testRemoveFirst() { - Assert.assertEquals(linkedList.removeFirst(), 0); - Assert.assertEquals(linkedList.removeFirst(), 1); - } - - @Test - public void testRemoveLast() { - Assert.assertEquals(linkedList.removeLast(),99 ); - Assert.assertEquals(linkedList.removeLast(), 98); - } - - @Test - public void testIterator() { - Iterator iterator = linkedList.iterator(); - for(int i = 0;iterator.hasNext();i++){ - Assert.assertEquals(iterator.next(), i); - } - } - -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/QueueTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/QueueTest.java deleted file mode 100644 index 7302b5ec38..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/QueueTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package week01.BasicDataStructureTest; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import week01.BasicDataStructure.Queue; - - -public class QueueTest { - - Queue queue = new Queue(); - - @Before - public void setUp() throws Exception { - for(int i=0;i<100;i++){ - queue.enQueue(i); - } - } - - @Test - public void testEnQueue() { - Assert.assertEquals(queue.size(), 100); - for(int i =0;i<100;i++){ - queue.enQueue(i); - } - Assert.assertEquals(queue.size(), 200); - } - - @Test - public void testDeQueue() { - for(int i =0;i<100;i++){ - Assert.assertEquals(queue.deQueue(), i); - } - - } - - @Test - public void testIsEmpty() { - Assert.assertEquals(queue.isEmpty(), false); - for(int i=0;i<100;i++){ - queue.deQueue(); - } - Assert.assertEquals(queue.isEmpty(), true); - } - - @Test - public void testSize() { - Assert.assertEquals(queue.size(), 100); - queue.enQueue(100); - Assert.assertEquals(queue.size(), 101); - queue.deQueue(); - Assert.assertEquals(queue.size(), 100); - } - -} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/StackTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/StackTest.java deleted file mode 100644 index ae6d3a39d4..0000000000 --- a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/StackTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package week01.BasicDataStructureTest; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import week01.BasicDataStructure.Stack; - - -public class StackTest { - - Stack stack = new Stack(); - - @Before - public void setUp() throws Exception { - for(int i =0 ;i <100;i++){ - stack.push(i); - } - } - - @Test - public void testPush() { - Assert.assertEquals(stack.peek(), 99); - for(int i =0;i <200;i++){ - stack.push(i); - } - Assert.assertEquals(stack.peek(), 199); - Assert.assertEquals(stack.size(), 300); - } - - @Test - public void testPop() { - Assert.assertEquals(stack.pop(), 99); - Assert.assertEquals(stack.pop(), 98); - for(int i=0;i<98;i++){ - stack.pop(); - } - Assert.assertEquals(stack.size(), 0); - } - - @Test - public void testPeek() { - for(int i=0;i<100;i++){ - Assert.assertEquals(stack.peek(), 99); - Assert.assertEquals(stack.size(), 100); - } - stack.pop(); - Assert.assertEquals(stack.peek(), 98); - Assert.assertEquals(stack.peek(), 98); - } - - @Test - public void testIsEmpty() { - Assert.assertEquals(stack.isEmpty(), false); - for(int i =0 ;i <100;i++){ - stack.pop(); - } - Assert.assertEquals(stack.isEmpty(), true); - } - - @Test - public void testSize() { - stack.push(100); - Assert.assertEquals(stack.size(), 101); - stack.pop(); - Assert.assertEquals(stack.size(), 100); - stack.peek(); - Assert.assertEquals(stack.size(), 100); - } - -} diff --git a/group01/1925347167/1925347167.md b/group01/1925347167/1925347167.md deleted file mode 100644 index 8b13789179..0000000000 --- a/group01/1925347167/1925347167.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group01/1925347167/Week1 Basic Data Structure/ArrayList.java b/group01/1925347167/Week1 Basic Data Structure/ArrayList.java deleted file mode 100644 index 2797e0b129..0000000000 --- a/group01/1925347167/Week1 Basic Data Structure/ArrayList.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - if (fullCheck()) - elementData = Arrays.copyOf(elementData, size*2); - elementData[size++] = o; - } - public void add(int index, Object o){ - - if (fullCheck()) - elementData = Arrays.copyOf(elementData, size*2); - if (!rangeCheck(index)) - throw new IndexOutOfBoundsException(); - for (int i = size; i > index; --i) - elementData[i] = elementData[i-1]; - elementData[index] = o; - size++; - } - - public Object get(int index){ - if (rangeCheck(index)) - return elementData[index]; - throw new IndexOutOfBoundsException(); - } - - public Object remove(int index){ - if (!rangeCheck(index)) - throw new IndexOutOfBoundsException(); - Object rmo = elementData[index]; - for (int i = index; i < size-1; ++i) - elementData[i] = elementData[i-1]; - size--; - return rmo; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return null; - } - - private boolean rangeCheck(int index) { - if (index < 0 || index >= size) - return false; - return true; - } - - private boolean fullCheck() { - if (size >= elementData.length) - return true; - return false; - } - -} diff --git a/group01/1925347167/Week1 Basic Data Structure/BinaryTreeNode.java b/group01/1925347167/Week1 Basic Data Structure/BinaryTreeNode.java deleted file mode 100644 index 45827be3a5..0000000000 --- a/group01/1925347167/Week1 Basic Data Structure/BinaryTreeNode.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Object o) { - data = o; - left = null; - right = null; - } - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group01/1925347167/Week1 Basic Data Structure/Iterator.java b/group01/1925347167/Week1 Basic Data Structure/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group01/1925347167/Week1 Basic Data Structure/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group01/1925347167/Week1 Basic Data Structure/LinkedList.java b/group01/1925347167/Week1 Basic Data Structure/LinkedList.java deleted file mode 100644 index 3097f69edc..0000000000 --- a/group01/1925347167/Week1 Basic Data Structure/LinkedList.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - private int size = 0; - - public void add(Object o){ - Node tmp = head; - while (tmp.next != null) - tmp = tmp.next; - - Node n = new Node(o); - tmp.next = n; - size++; - } - public void add(int index , Object o){ - if (!rangeCheck(index)) - throw new IndexOutOfBoundsException(); - - if (index == 0) { - Node newhead = new Node(o); - newhead.next = head; - head = newhead; - } else { - Node tmp = head; - for (int i = 0; i < index - 1; ++i) - tmp = tmp.next; - Node node = new Node(o); - node.next = tmp.next; - tmp.next = node; - } - - size++; - } - public Object get(int index){ - if (!rangeCheck(index)) - throw new IndexOutOfBoundsException(); - Node tmp = head; - for (int i = 0; i < index - 1; ++i) - tmp = tmp.next; - return tmp.data; - - } - - public Object remove(int index){ - if (!rangeCheck(index)) - throw new IndexOutOfBoundsException(); - - if (index == 0) { - Node oldHead= head; - head = head.next; - size--; - return oldHead.data; - }else { - Node tmp = head; - for (int i = 0; i < index - 1; i++) { - tmp = tmp.next; - } - Node node = tmp.next; - tmp.next = node.next; - size--; - return node.data; - } - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node newHead = new Node(o); - newHead.next = head; - head = newHead; - size++; - } - public void addLast(Object o){ - Node tmp = head; - while (tmp.next != null) { - tmp = tmp.next; - } - Node node = new Node(o); - tmp.next = node; - size++; - } - public Object removeFirst(){ - if (head == null) - throw new IndexOutOfBoundsException(); - Node oldHead = head; - head = head.next; - size--; - return oldHead.data; - } - public Object removeLast(){ - if (head == null) - throw new IndexOutOfBoundsException(); - Node tmp = head; - while (tmp.next.next != null) { - tmp = tmp.next; - } - Node node = tmp.next; - tmp.next = null; - size--; - return node.data; - } - public Iterator iterator(){ - return null; - } - - private boolean rangeCheck(int index) { - if (index < 0 || index >= size) - return false; - return true; - } - - private static class Node{ - Object data; - Node next; - - Node(Object data) { - this.data = data; - next = null; - } - - } -} diff --git a/group01/1925347167/Week1 Basic Data Structure/List.java b/group01/1925347167/Week1 Basic Data Structure/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group01/1925347167/Week1 Basic Data Structure/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group01/1925347167/Week1 Basic Data Structure/Queue.java b/group01/1925347167/Week1 Basic Data Structure/Queue.java deleted file mode 100644 index b8c394b833..0000000000 --- a/group01/1925347167/Week1 Basic Data Structure/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList llist = new LinkedList(); - - public void enQueue(Object o){ - llist.add(o); - } - - public Object deQueue(){ - if (isEmpty()) - return null; - return llist.removeFirst(); - } - - public boolean isEmpty(){ - return (llist.size()==0); - } - - public int size(){ - return -llist.size(); - } -} diff --git a/group01/1925347167/Week1 Basic Data Structure/Stack.java b/group01/1925347167/Week1 Basic Data Structure/Stack.java deleted file mode 100644 index 4458cb61d7..0000000000 --- a/group01/1925347167/Week1 Basic Data Structure/Stack.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.basic; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (isEmpty()) - return null; - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - if (elementData.size() == 0) - return null; - return elementData.get(elementData.size() - 1); - } - public boolean isEmpty(){ - return (elementData.size() == 0); - } - public int size(){ - return elementData.size(); - } -} diff --git a/group01/1925347167/Week1 Basic Data Structure/readme.md b/group01/1925347167/Week1 Basic Data Structure/readme.md deleted file mode 100644 index 8b13789179..0000000000 --- a/group01/1925347167/Week1 Basic Data Structure/readme.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group01/2137642225/work01/.classpath b/group01/2137642225/work01/.classpath deleted file mode 100644 index 2d7497573f..0000000000 --- a/group01/2137642225/work01/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group01/2137642225/work01/.gitignore b/group01/2137642225/work01/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group01/2137642225/work01/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group01/2137642225/work01/.project b/group01/2137642225/work01/.project deleted file mode 100644 index f8dde642e5..0000000000 --- a/group01/2137642225/work01/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - work01 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group01/2137642225/work01/src/com/coding/mybasic/ArrayList.java b/group01/2137642225/work01/src/com/coding/mybasic/ArrayList.java deleted file mode 100644 index 1826ee7c50..0000000000 --- a/group01/2137642225/work01/src/com/coding/mybasic/ArrayList.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.coding.mybasic; - -public class ArrayList implements List{ - - private static final int DEF_CAPACITY = 10; - private int size; - private Object[] elementData; - - public ArrayList(){ - elementData = new Object[DEF_CAPACITY]; - } - - public ArrayList(int initCapacity) { - if(initCapacity <= 0){ - throw new RuntimeException("初始化长度必须大于0"); - } - elementData = new Object[initCapacity]; - } - - @Override - public void add(Object element) { - checkArrayOutOfRange(); - elementData[size++] = element; - } - - - @Override - public void add(int index, Object element) { - // 末尾插入 - if(index == size){ - add(element); - return; - } - // index 在 0到size 之间,index之后元素要后移 - checkIndex(index); - checkArrayOutOfRange(); - moveBackwardElement(index); - elementData[index] = element; - size++; - } - - - @Override - public Object get(int index) { - checkIndex(index); - return elementData[index]; - } - - @Override - public Object remove(int index) { - checkIndex(index); - Object temp = elementData[index]; - moveForwardElement(index); - elementData[size--] = null; - return temp; - } - - - - @Override - public int size() { - return size; - } - - @Override - public Iterator iterator() { - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator{ - private int i = 0; - @Override - public boolean hasNext() { - return i < size; - } - - @Override - public Object next() { - checkIndex(i); - return elementData[i++]; - } - - } - - /** - * 数组增长 - * @param newCapacity 新数组容量 - */ - private void grow(int newCapacity) { - Object[] dest = new Object[newCapacity]; - System.arraycopy(elementData, 0, dest , 0, elementData.length); - elementData = dest; - } - - /** - * 检查index index >=0 且 < size - * @param index - * @throws Exception - */ - private void checkIndex(int index) { - if(index < 0){ - throw new RuntimeException("index 必须大于0"); - } - // 越界 - if(index >= size){ - throw new RuntimeException("index 必须小于size:" + size); - } - } - - /** - * 检查数组容量是否已满,已满则扩容 - */ - private void checkArrayOutOfRange() { - if(size >= elementData.length){ - // 扩容 默认新容量是原来容量的2倍 - grow(elementData.length * 2); - } - } - - /** - * 后移元素,从index开始 - * @param index - */ - private void moveBackwardElement(int index) { - for (int i = size; i > index; i--) { - elementData[i] = elementData[i - 1]; - } - } - /** - * 前移元素,从index开始 - * @param index - */ - private void moveForwardElement(int index) { - for (int i = index; i < size; i++) { - elementData[i] = elementData[i + 1]; - } - } - -} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/BinaryTreeNode.java b/group01/2137642225/work01/src/com/coding/mybasic/BinaryTreeNode.java deleted file mode 100644 index 21bd8f696f..0000000000 --- a/group01/2137642225/work01/src/com/coding/mybasic/BinaryTreeNode.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.mybasic; - -public class BinaryTreeNode { - - private Integer data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Integer data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Integer o){ - if(o == null){ - throw new RuntimeException("不能插入空值"); - } - BinaryTreeNode searchNode = search(this,o); - if(isExistData(searchNode,o)){ - throw new RuntimeException("该值已存在 无法插入"); - } - if(searchNode != null){ - BinaryTreeNode binaryTreeNode = new BinaryTreeNode(); - binaryTreeNode.setData(o); - if(searchNode.data.intValue() > o.intValue()){ - searchNode.setLeft(binaryTreeNode); - }else{ - searchNode.setRight(binaryTreeNode); - } - } else { - throw new RuntimeException("根节点未赋值,无法插入"); - } - return this; - } - - private boolean isExistData(BinaryTreeNode searchNode,Integer data) { - return searchNode != null && searchNode.data.intValue() == data.intValue(); - - } - - private BinaryTreeNode search(BinaryTreeNode binaryTreeNode, Integer data) { - if(binaryTreeNode == null || binaryTreeNode.data == null){ - return null; - } - Integer curNodeData = binaryTreeNode.data; - if(curNodeData.intValue() > data.intValue()){// 左 curNodeData > data - if(binaryTreeNode.left != null){ - return search(binaryTreeNode.left,data); - } - }else if(curNodeData.intValue() < data.intValue()){ - if(binaryTreeNode.right != null){ - return search(binaryTreeNode.right,data); - } - - } - return binaryTreeNode; - } - -} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/Iterator.java b/group01/2137642225/work01/src/com/coding/mybasic/Iterator.java deleted file mode 100644 index 622cc5b902..0000000000 --- a/group01/2137642225/work01/src/com/coding/mybasic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.mybasic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/LinkedList.java b/group01/2137642225/work01/src/com/coding/mybasic/LinkedList.java deleted file mode 100644 index ab37360e78..0000000000 --- a/group01/2137642225/work01/src/com/coding/mybasic/LinkedList.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.coding.mybasic; - -public class LinkedList implements List { - - private Node head; - private Node last; - private int size; - - public LinkedList() { - } - - @Override - public void add(Object element) { - if(head == null){ - addHead(element); - }else{ - addLast(element); - } - } - - @Override - public void add(int index, Object element) { - if(index == size){ - add(element); - return; - } - - if(index == 0){ - addFirst(element); - return; - } - checkIndex(index); - insertElement(index - 1,element); - } - - - @Override - public Object get(int index) { - checkIndex(index); - Node node = getNodeByIndex(index); - return node != null ? node.data : null; - } - - @Override - public Object remove(int index) { - - checkIndex(index); - Object element = null; - if(index == 0){ - element = removeFirst(); - } - else if(index == (size - 1)){ - element = removeLast(); - } - else { - element = removeMiddle(index); - } - return element; - } - - - @Override - public int size() { - return size; - } - - - @Override - public Iterator iterator() { - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator{ - private Node node = head; - int i = 0; - @Override - public boolean hasNext() { - return i < size; - } - - @Override - public Object next() { - checkIndex(i); - Object element = node.data; - node = node.next; - i++; - return element; - } - - } - - public void addFirst(Object o){ - Node node = new Node(); - node.data = o; - node.next = head.next; - head = node; - size++; - } - public void addLast(Object o){ - Node node = new Node(); - node.data = o; - node.next = null; - last.next = node; - last = node; - size++; - } - public Object removeFirst(){ - return removeFirstNode(); - } - public Object removeLast(){ - return removeLastNode(); - } - private Object removeMiddle(int index) { - Node temp = getNodeByIndex(index - 1); - Node removeNode = temp.next; - Object element = removeNode.data; - temp.next = removeNode.next; - removeNode = null; - size--; - return element; - } - - /** - * 检查index index >=0 且 < size - * @param index - * @throws Exception - */ - private void checkIndex(int index) { - if(index < 0){ - throw new RuntimeException("index 必须大于0"); - } - // 越界 - if(index >= size){ - throw new RuntimeException("index 必须小于size:" + size); - } - } - - /** - * 添加head - * @param element - */ - private void addHead(Object element) { - head = new Node(); - head.data = element; - head.next = null; - last = head; - size++; - } - /** - * 插入序号在0-size之间的元素,不包含0和size位置 - * @param index - * @param element - */ - private void insertElement(int index, Object element) { - - Node temp = getNodeByIndex(index); - if(temp != null){ - Node node = new Node(); - node.data = element; - node.next = temp.next; - temp.next = node; - } - size++; - } - /** - * 获取下标为index的元素 - * @param index - * @return - */ - private Node getNodeByIndex(int index) { - Node temp = head; - int i = 0; - - while(i < size){ - if(i == index){ - return temp; - } - temp = temp.next; - i++; - } - - return null; - } - /** - * 移除最后一个元素 - * @return - */ - private Object removeLastNode() { - Node node = getNodeByIndex(size - 2); - Node lastNode = node.next; - Object element = lastNode.data; - lastNode = null; - last = node; - size--; - return element; - } - /** - * 移除第一个元素 - * @return - */ - private Object removeFirstNode() { - Node node = head.next; - Object element = head.data; - head = null; - head = node; - size--; - return element; - } - - - - private static class Node{ - Object data; - Node next; - public Node() { - } - @SuppressWarnings("unused") - public Node(Object data, Node next) { - super(); - this.data = data; - this.next = next; - } - - - } -} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/List.java b/group01/2137642225/work01/src/com/coding/mybasic/List.java deleted file mode 100644 index 87a58a6c4c..0000000000 --- a/group01/2137642225/work01/src/com/coding/mybasic/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.mybasic; - -public interface List { - public void add(Object element); - public void add(int index, Object element); - public Object get(int index); - public Object remove(int index); - public int size(); - public Iterator iterator(); -} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/Queue.java b/group01/2137642225/work01/src/com/coding/mybasic/Queue.java deleted file mode 100644 index 36d10fd668..0000000000 --- a/group01/2137642225/work01/src/com/coding/mybasic/Queue.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.mybasic; - -public class Queue { - private LinkedList linkedList = new LinkedList(); - public void enQueue(Object o){ - linkedList.add(o); - } - - public Object deQueue(){ - checkEmptyQueue(); - return linkedList.remove(0); - } - - public boolean isEmpty(){ - return size() <= 0; - } - - public int size(){ - return linkedList.size(); - } - - /** - * 检查队列是否为空 - */ - private void checkEmptyQueue() { - if(isEmpty()){ - throw new RuntimeException("size:" + size() + " 空队列"); - } - } -} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/Stack.java b/group01/2137642225/work01/src/com/coding/mybasic/Stack.java deleted file mode 100644 index f50e686317..0000000000 --- a/group01/2137642225/work01/src/com/coding/mybasic/Stack.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.mybasic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - checkEmptyStack(); - return elementData.remove(size() - 1); - } - - public Object peek(){ - checkEmptyStack(); - Object element = elementData.get(size() - 1); - return element; - } - - public boolean isEmpty(){ - return size() <= 0; - } - public int size(){ - return elementData.size(); - } - /** - * 检查栈是否为空 - */ - private void checkEmptyStack() { - if(isEmpty()){ - throw new RuntimeException("size:" + size() + " 空栈"); - } - } -} diff --git a/group01/2137642225/work01/src/com/coding/test/TestArrayList.java b/group01/2137642225/work01/src/com/coding/test/TestArrayList.java deleted file mode 100644 index 8bd8952195..0000000000 --- a/group01/2137642225/work01/src/com/coding/test/TestArrayList.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.coding.test; - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.mybasic.ArrayList; -import com.coding.mybasic.Iterator; -import com.coding.mybasic.List; - -public class TestArrayList { - - private List list; - @Before - public void before() { - list = new ArrayList(); - } - - @Test - public void testAddObject() { - list.add("ele"); - Assert.assertEquals("ele", list.get(0)); - } - - @Test - public void testAddIntObject() { - - for (int i = 0; i < 5; i++) { - list.add(i,i); - Assert.assertEquals(i, list.get(i)); - } - - } - - @Test - public void testGet() { - list.add("ss"); - Assert.assertEquals("ss", list.get(0)); - } - - @Test - public void testRemove() { - list.add("we"); - list.add(1, "gga"); - list.add(0, "start"); - list.add(3, "end"); - - Assert.assertEquals("end", list.remove(3)); - - } - - @Test - public void testSize() { - - for (int i = 0; i < 10; i++) { - list.add(i); - } - - Assert.assertEquals(10, list.size()); - } - - @Test - public void testIterator() { - - for (int i = 0; i < 10; i++) { - list.add(i); - } - Iterator iterator = list.iterator(); - int i = 0; - while(iterator.hasNext()){ - Assert.assertEquals(i++, iterator.next()); - } - } - - @After - public void after(){ - - } -} diff --git a/group01/2137642225/work01/src/com/coding/test/TestBinaryTreeNode.java b/group01/2137642225/work01/src/com/coding/test/TestBinaryTreeNode.java deleted file mode 100644 index 662bb55570..0000000000 --- a/group01/2137642225/work01/src/com/coding/test/TestBinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.coding.mybasic.BinaryTreeNode; - -public class TestBinaryTreeNode { - - private BinaryTreeNode node; - @Before - public void before(){ - node = new BinaryTreeNode(); - } - - @Test - public void testInsert() { - node.insert(1); - node.insert(0); - node.insert(3); - node.insert(-2); - node.insert(-1); - assertEquals(1, node.getData()); - assertEquals(0, node.getLeft().getData()); - assertEquals(3, node.getRight().getData()); - assertEquals(-2, node.getLeft().getLeft().getData()); - assertEquals(-1, node.getLeft().getLeft().getRight().getData()); - } - -} diff --git a/group01/2137642225/work01/src/com/coding/test/TestLinkedList.java b/group01/2137642225/work01/src/com/coding/test/TestLinkedList.java deleted file mode 100644 index 57a8b13bb8..0000000000 --- a/group01/2137642225/work01/src/com/coding/test/TestLinkedList.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.coding.mybasic.Iterator; -import com.coding.mybasic.LinkedList; -import com.coding.mybasic.List; - -public class TestLinkedList { - - private List list; - - @Before - public void before(){ - list = new LinkedList(); - } - - @Test - public void testAddObject() { - list.add(1); - - System.out.println(list.get(0)); - assertEquals(1, list.get(0)); - assertEquals(1, list.size()); - } - - @Test - public void testAddIntObject() { - list.add(0,1); - System.out.println(list.get(0)); - assertEquals(1, list.get(0)); - assertEquals(1, list.size()); - } - - @Test - public void testGet() { - fail("Not yet implemented"); - } - - @Test - public void testRemove() { - list.add(0,1); - System.out.println(list.remove(0)); - assertEquals(0, list.size()); - } - - @Test - public void testSize() { - - for(int i = 0; i < 10; i++){ - list.add(i, i); - } - - assertEquals(10, list.size()); - } - - @Test - public void testIterator() { - - for(int i = 0; i < 10; i++){ - list.add(i, i); - } - Iterator iterator = list.iterator(); - int i = 0; - while(iterator.hasNext()){ - assertEquals(i++, iterator.next()); - } - //iterator.next(); - } -} diff --git a/group01/2137642225/work01/src/com/coding/test/TestQueue.java b/group01/2137642225/work01/src/com/coding/test/TestQueue.java deleted file mode 100644 index 367a44d151..0000000000 --- a/group01/2137642225/work01/src/com/coding/test/TestQueue.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; - -import com.coding.mybasic.Queue; - -public class TestQueue { - - private Queue queue; - @Before - public void before(){ - queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - } - @Test - public void testEnQueue() { - queue.enQueue(3); - assertEquals(3, queue.size()); - } - - @Test - public void testDeQueue() { - assertEquals(2, queue.deQueue()); - assertEquals(1, queue.deQueue()); - } - - @Test - public void testSize() { - assertEquals(2, queue.size()); - } - -} diff --git a/group01/2137642225/work01/src/com/coding/test/TestStack.java b/group01/2137642225/work01/src/com/coding/test/TestStack.java deleted file mode 100644 index 0e278f2992..0000000000 --- a/group01/2137642225/work01/src/com/coding/test/TestStack.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.coding.mybasic.Stack; - -public class TestStack { - - private Stack stack; - @Before - public void before() { - stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - } - - @Test - public void testPush() { - assertEquals(3, stack.peek()); - } - - @Test - public void testPop() { - assertEquals(3, stack.pop()); - assertEquals(2, stack.pop()); - assertEquals(1, stack.pop()); - //stack.pop(); - //System.out.println(stack.size()); - } - - @Test - public void testPeek() { - assertEquals(3, stack.peek()); - assertEquals(3, stack.pop()); - assertEquals(2, stack.pop()); - //assertEquals(1, stack.pop()); - assertEquals(1, stack.peek()); - } - - @Test - public void testSize() { - assertEquals(3, stack.size()); - } - -} diff --git a/group01/275150374/275150374Learning/.idea/compiler.xml b/group01/275150374/275150374Learning/.idea/compiler.xml deleted file mode 100644 index 217af471a9..0000000000 --- a/group01/275150374/275150374Learning/.idea/compiler.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/group01/275150374/275150374Learning/.idea/description.html b/group01/275150374/275150374Learning/.idea/description.html deleted file mode 100644 index db5f129556..0000000000 --- a/group01/275150374/275150374Learning/.idea/description.html +++ /dev/null @@ -1 +0,0 @@ -Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group01/275150374/275150374Learning/.idea/encodings.xml b/group01/275150374/275150374Learning/.idea/encodings.xml deleted file mode 100644 index e206d70d85..0000000000 --- a/group01/275150374/275150374Learning/.idea/encodings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/group01/275150374/275150374Learning/.idea/misc.xml b/group01/275150374/275150374Learning/.idea/misc.xml deleted file mode 100644 index de8f7c75a3..0000000000 --- a/group01/275150374/275150374Learning/.idea/misc.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/group01/275150374/275150374Learning/.idea/modules.xml b/group01/275150374/275150374Learning/.idea/modules.xml deleted file mode 100644 index 5534fceb30..0000000000 --- a/group01/275150374/275150374Learning/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/group01/275150374/275150374Learning/.idea/vcs.xml b/group01/275150374/275150374Learning/.idea/vcs.xml deleted file mode 100644 index c2365ab11f..0000000000 --- a/group01/275150374/275150374Learning/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/group01/275150374/275150374Learning/275150374Learning.iml b/group01/275150374/275150374Learning/275150374Learning.iml deleted file mode 100644 index d5c0743275..0000000000 --- a/group01/275150374/275150374Learning/275150374Learning.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/group01/275150374/275150374Learning/src/task01/ArrayList.java b/group01/275150374/275150374Learning/src/task01/ArrayList.java deleted file mode 100644 index 8d604f109e..0000000000 --- a/group01/275150374/275150374Learning/src/task01/ArrayList.java +++ /dev/null @@ -1,86 +0,0 @@ -package task01; - -import java.util.Arrays; - -/**第一周作业 - * 自己实现一个 ArrayList - * Created by eurry on 2017/2/26. - */ -public class ArrayList { - /** - * ArrayList的长度 - */ - private int size = 0; - - private Object[] elementData = {}; - - public void add(Object o){ - elementData = Arrays.copyOf(elementData, size+1); - elementData[size] = o; - size++; - } - - public void add(int index, Object o){ - if(index < size){ - elementData = Arrays.copyOf(elementData, size+1); - System.arraycopy(elementData, index, elementData, index+1, size-index); - elementData[index] = o; - size++; - }else{ - elementData = Arrays.copyOf(elementData, index+1); - elementData[index] = o; - size = index+1; - } - } - - public Object get(int index){ - if(index < size){ - return elementData[index]; - }else{ - throw new IndexOutOfBoundsException("导致对数组范围以外的数据的访问"); - } - } - - public Object remove(int index){ - if(index < size){ - Object re = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, size-index-1); - elementData = Arrays.copyOf(elementData, size-1); - size--; - return re; - }else{ - throw new IndexOutOfBoundsException("导致对数组范围以外的数据的访问"); - } - } - - public int size(){ - return size; - } - - public String toString(){ - String str = null; - if(elementData.length > 0){ - str = ""; - for (Object anElementData : elementData) { - str += anElementData.toString() + ","; - } - str = str.substring(0, str.length()-1); - } - return str; - } - - /** - * 测试 - */ - public static void main(String[] str){ - ArrayList list = new ArrayList(); - list.add("A"); - list.add("B"); - list.add(1, "C"); - list.add("D"); - Object d = list.get(3); - Object dd = list.remove(3); - System.out.println(list.size()); - System.out.println(list.toString()); - } -} diff --git a/group01/275150374/275150374Learning/src/task01/LinkedList.java b/group01/275150374/275150374Learning/src/task01/LinkedList.java deleted file mode 100644 index 23eb1adaae..0000000000 --- a/group01/275150374/275150374Learning/src/task01/LinkedList.java +++ /dev/null @@ -1,162 +0,0 @@ -package task01; - -import java.util.Arrays; - -/**第一周作业 - * 自己实现一个 LinkedList - * Created by eurry on 2017/2/26. - */ -public class LinkedList { - - private int size = 0; - private Node head=null; - - public void add(Object o){ - if(size == 0){ - head = new Node(o); - }else{ - Node next = head; - while(next.next != null){ - next = next.next; - } - next.next = new Node(o); - } - size++; - } - - public void add(int index, Object o){ - if(index <= size){ - if(size == 0){ - add(o); - }else{ - if(index==0){ - addFirst(o); - }else if(index==size){ - add(o); - }else{ - Node next = head; - for(int i=0; i 0){ - Node ele = null; - Node next = head; - for(int i=0; i - - - root - com.coding2017 - 1.0-SNAPSHOT - - 4.0.0 - - basic - - - - - junit - junit - - - junit - junit-dep - - - - - \ No newline at end of file diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/ArrayList.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/ArrayList.java deleted file mode 100644 index a4199bdbdb..0000000000 --- a/group01/280646174/basic/src/main/java/com/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.coding2017.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[4]; - - public void add(Object o) { - if (noSpace()) { - extendSpace(); - } - - elementData[size++] = o; - } - - private void extendSpace() { - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - - private boolean noSpace() { - return size == elementData.length; - } - - public void add(int index, Object o) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - if (noSpace()) { - extendSpace(); - } - - if (index == size) { - add(o); - return; - } - - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - return elementData[index]; - } - - public Object remove(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - if (index == size - 1) { - return elementData[--size]; - } - - Object removed = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - size--; - return removed; - } - - public int size() { - return size; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder("["); - if (size > 0) { - builder.append(get(0)); - } - for (int i = 1; i < size; i++) { - builder.append(", ").append(get(i)); - } - builder.append("]"); - return builder.toString(); - } - - public Iterator iterator() { - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator { - private int pos; - - @Override - public boolean hasNext() { - return pos < size(); - } - - @Override - public Object next() { - return ArrayList.this.get(pos++); - } - } -} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/BinaryTreeNode.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index acf4798b9e..0000000000 --- a/group01/280646174/basic/src/main/java/com/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding2017.basic; - -public class BinaryTreeNode { - - private Integer data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode insert(Integer o) { - if (o <= data) { - if (left == null) { - left = new BinaryTreeNode(o); - return left; - } - return left.insert(o); - } else { - if (right == null) { - right = new BinaryTreeNode(o); - return right; - } - return right.insert(o); - } - } - - public BinaryTreeNode(Integer data) { - this.data = data; - } - - public Integer getData() { - return data; - } - - public void setData(Integer data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - @Override - public String toString() { - return data + " " + left + " " + right; - } -} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/Iterator.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/Iterator.java deleted file mode 100644 index 19e214cfbb..0000000000 --- a/group01/280646174/basic/src/main/java/com/coding2017/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding2017.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/LinkedList.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/LinkedList.java deleted file mode 100644 index 5aeeb7c7f8..0000000000 --- a/group01/280646174/basic/src/main/java/com/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,179 +0,0 @@ -package com.coding2017.basic; - -public class LinkedList implements List { - - private Node head; - - private Node tail; - - private int size; - - public void add(Object o) { - addLast(o); - } - - public void add(int index, Object o) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - if (index == size) { - addLast(o); - } else if (index == 0) { - addFirst(o); - } else { - Node node = new Node(o); - Node prevNode = getNode(index - 1); - Node nextNode = prevNode.next; - prevNode.next = node; - node.prev = prevNode; - nextNode.prev = node; - node.next = nextNode; - size++; - } - } - - private Node getNode(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - Node node = head; - for (int j = 0; j < index; j++) { - node = node.next; - } - return node; - } - - public Object get(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - return getNode(index).data; - } - - public Object remove(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - - if (index == 0) { - return removeFirst(); - } else if (index == size - 1) { - return removeLast(); - } else { - Node node = getNode(index); - node.prev.next = node.next; - node.next.prev = node.prev; - size--; - return node.data; - } - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node node = new Node(o); - if (size == 0) { - head = node; - tail = node; - } else { - head.prev = node; - node.next = head; - head = node; - } - size++; - } - - public void addLast(Object o) { - if (size == 0) { - addFirst(o); - } else { - Node node = new Node(o); - tail.next = node; - node.prev = tail; - tail = node; - size++; - } - } - - public Object removeFirst() { - if (size == 0) { - throw new IndexOutOfBoundsException(); - } - Node node = head; - if (size == 1) { - head = null; - tail = null; - size--; - } else { - head.next.prev = null; - head = head.next; - size--; - } - return node.data; - } - - public Object removeLast() { - if (size == 0) { - throw new IndexOutOfBoundsException(); - } - if (size == 1) { - return removeFirst(); - } - Node node = tail; - tail.prev.next = null; - tail = tail.prev; - size--; - return node.data; - } - - public Iterator iterator() { - return new LinkedListIterator(); - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder("["); - if (size > 0) { - builder.append(get(0)); - } - for(Node node = head.next; node != null; node = node.next) { - builder.append(", ").append(node.data); - } - builder.append("]"); - return builder.toString(); - } - - private static class Node { - private Object data; - private Node next; - private Node prev; - - public Node() {} - - private Node(Object data) { - this.data = data; - } - } - - private class LinkedListIterator implements Iterator { - private Node node; - - public LinkedListIterator() { - this.node = LinkedList.this.head; - } - - @Override - public boolean hasNext() { - return node != null; - } - - @Override - public Object next() { - Node temp = node; - node = node.next; - return temp.data; - } - } -} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/List.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/List.java deleted file mode 100644 index 0fee4d7a42..0000000000 --- a/group01/280646174/basic/src/main/java/com/coding2017/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding2017.basic; - -public interface List { - void add(Object o); - - void add(int index, Object o); - - Object get(int index); - - Object remove(int index); - - int size(); -} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/Queue.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/Queue.java deleted file mode 100644 index f611b874e0..0000000000 --- a/group01/280646174/basic/src/main/java/com/coding2017/basic/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding2017.basic; - -public class Queue { - - LinkedList list = new LinkedList(); - - public void enQueue(Object o) { - list.addLast(o); - } - - public Object deQueue() { - return list.removeFirst(); - } - - public boolean isEmpty() { - return list.size() == 0; - } - - public int size() { - return list.size(); - } -} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/Stack.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/Stack.java deleted file mode 100644 index 3ec7b5788b..0000000000 --- a/group01/280646174/basic/src/main/java/com/coding2017/basic/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding2017.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - return elementData.remove(elementData.size() - 1); - } - - public Object peek() { - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} diff --git a/group01/280646174/basic/src/test/java/com/coding2017/basic/ArrayListTest.java b/group01/280646174/basic/src/test/java/com/coding2017/basic/ArrayListTest.java deleted file mode 100644 index 21e9d59694..0000000000 --- a/group01/280646174/basic/src/test/java/com/coding2017/basic/ArrayListTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.coding2017.basic; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by kaitao.li on 17/2/21. - */ -public class ArrayListTest { - @Test - public void testAdd() throws Exception { - ArrayList arrayList = new ArrayList(); - arrayList.add("0"); - Assert.assertTrue(arrayList.get(0).equals("0")); - } - - @Test - public void testAddWithIndex() throws Exception { - ArrayList arrayList = new ArrayList(); - arrayList.add("0"); - arrayList.add("1"); - arrayList.add(1, "2"); - Assert.assertTrue(arrayList.get(1).equals("2")); - Assert.assertTrue(arrayList.get(2).equals("1")); - Assert.assertTrue(arrayList.size() == 3); - } - - @Test - public void get() throws Exception { - ArrayList arrayList = new ArrayList(); - arrayList.add("0"); - arrayList.add("1"); - Assert.assertTrue(arrayList.get(1).equals("1")); - } - - @Test - public void remove() throws Exception { - ArrayList arrayList = new ArrayList(); - arrayList.add("0"); - arrayList.add("1"); - arrayList.add("2"); - Object remove = arrayList.remove(1); - Assert.assertTrue(remove.equals("1")); - Assert.assertTrue(arrayList.size() == 2); - } - - @Test - public void size() throws Exception { - ArrayList arrayList = new ArrayList(); - arrayList.add("0"); - arrayList.add("1"); - Assert.assertEquals(arrayList.size(), 2); - } - - @Test - public void testExtend() { - ArrayList arrayList = new ArrayList(); - arrayList.add("0"); - arrayList.add("1"); - arrayList.add("2"); - arrayList.add("3"); - arrayList.add("4"); - Assert.assertTrue(arrayList.get(4).equals("4")); - } - - @Test - public void iterator() throws Exception { - ArrayList arrayList = new ArrayList(); - arrayList.add("0"); - arrayList.add("1"); - Iterator iterator = arrayList.iterator(); - Assert.assertTrue(iterator.hasNext()); - Assert.assertTrue(iterator.next().equals("0")); - Assert.assertTrue(iterator.hasNext()); - Assert.assertTrue(iterator.next().equals("1")); - Assert.assertTrue(!iterator.hasNext()); - } - -} \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/basic/BinaryTreeNodeTest.java b/group01/280646174/basic/src/test/java/com/coding2017/basic/BinaryTreeNodeTest.java deleted file mode 100644 index 3a9877c596..0000000000 --- a/group01/280646174/basic/src/test/java/com/coding2017/basic/BinaryTreeNodeTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding2017.basic; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by kaitao.li on 17/2/24. - */ -public class BinaryTreeNodeTest { - - @Test - public void insert() throws Exception { - BinaryTreeNode binaryTreeNode = new BinaryTreeNode(5); - binaryTreeNode.insert(4); - binaryTreeNode.insert(6); - binaryTreeNode.insert(5); - assertTrue(binaryTreeNode.getLeft().getData() == 4); - assertTrue(binaryTreeNode.getRight().getData() == 6); - assertTrue(binaryTreeNode.getLeft().getRight().getData() == 5); - System.out.println(binaryTreeNode); - } - -} \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/basic/LinkedListTest.java b/group01/280646174/basic/src/test/java/com/coding2017/basic/LinkedListTest.java deleted file mode 100644 index f6855d3583..0000000000 --- a/group01/280646174/basic/src/test/java/com/coding2017/basic/LinkedListTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.coding2017.basic; - -import org.junit.Assert; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by kaitao.li on 17/2/21. - */ -public class LinkedListTest { - @Test - public void testAdd() throws Exception { - LinkedList list = new LinkedList(); - list.add("0"); - Assert.assertTrue(list.get(0).equals("0")); - } - - @Test - public void testAddWithIndex() throws Exception { - LinkedList list = new LinkedList(); - list.add("0"); - list.add("1"); - list.add(1, "2"); - Assert.assertTrue(list.get(1).equals("2")); - Assert.assertTrue(list.get(2).equals("1")); - Assert.assertTrue(list.size() == 3); - } - - @Test - public void get() throws Exception { - LinkedList list = new LinkedList(); - list.add("0"); - list.add("1"); - Assert.assertTrue(list.get(1).equals("1")); - } - - @Test - public void remove() throws Exception { - LinkedList list = new LinkedList(); - list.add("0"); - list.add("1"); - list.add("2"); - Object remove = list.remove(1); - Assert.assertTrue(remove.equals("1")); - Assert.assertTrue(list.size() == 2); - } - - @Test - public void size() throws Exception { - LinkedList list = new LinkedList(); - list.add("0"); - list.add("1"); - Assert.assertEquals(list.size(), 2); - } - - @Test - public void testAddFirst() { - LinkedList list = new LinkedList(); - list.addFirst("0"); - Assert.assertTrue(list.get(0).equals("0")); - list.addFirst("1"); - Assert.assertTrue(list.get(0).equals("1")); - list.removeFirst(); - Assert.assertTrue(list.get(0).equals("0")); - list.removeLast(); - Assert.assertTrue(list.size() == 0); - } - - @Test - public void iterator() throws Exception { - ArrayList arrayList = new ArrayList(); - arrayList.add("0"); - arrayList.add("1"); - Iterator iterator = arrayList.iterator(); - Assert.assertTrue(iterator.hasNext()); - Assert.assertTrue(iterator.next().equals("0")); - Assert.assertTrue(iterator.hasNext()); - Assert.assertTrue(iterator.next().equals("1")); - Assert.assertTrue(!iterator.hasNext()); - } - -} \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/basic/QueueTest.java b/group01/280646174/basic/src/test/java/com/coding2017/basic/QueueTest.java deleted file mode 100644 index 5fde883433..0000000000 --- a/group01/280646174/basic/src/test/java/com/coding2017/basic/QueueTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding2017.basic; - -import org.junit.Assert; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by kaitao.li on 17/2/21. - */ -public class QueueTest { - @Test - public void enQueue() throws Exception { - Queue queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - Assert.assertTrue(queue.size() == 2); - Assert.assertTrue(queue.deQueue().equals(1)); - Assert.assertTrue(queue.deQueue().equals(2)); - Assert.assertTrue(queue.isEmpty()); - } - -} \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/basic/StackTest.java b/group01/280646174/basic/src/test/java/com/coding2017/basic/StackTest.java deleted file mode 100644 index 145d22d371..0000000000 --- a/group01/280646174/basic/src/test/java/com/coding2017/basic/StackTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding2017.basic; - -import org.junit.Assert; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by kaitao.li on 17/2/21. - */ -public class StackTest { - @Test - public void push() throws Exception { - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - Assert.assertTrue(stack.size() == 2); - Assert.assertTrue(stack.peek().equals(2)); - Assert.assertTrue(stack.pop().equals(2)); - Assert.assertTrue(stack.pop().equals(1)); - Assert.assertTrue(stack.isEmpty()); - } - -} \ No newline at end of file diff --git a/group01/280646174/pom.xml b/group01/280646174/pom.xml deleted file mode 100644 index c99644072b..0000000000 --- a/group01/280646174/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - 4.0.0 - - com.coding2017 - root - pom - 1.0-SNAPSHOT - - basic - - - - 4.12 - 4.11 - - - - - - - junit - junit - ${junit.junit.version} - test - - - junit - junit-dep - ${junit.junit-dep.version} - test - - - - - \ No newline at end of file diff --git a/group01/349209948/.gitignore b/group01/349209948/.gitignore deleted file mode 100644 index b3d8633e2b..0000000000 --- a/group01/349209948/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/bin/ -*.project -*.classpath \ No newline at end of file diff --git a/group01/349209948/src/week1_0226/ArrayList.java b/group01/349209948/src/week1_0226/ArrayList.java deleted file mode 100644 index 57d25187f8..0000000000 --- a/group01/349209948/src/week1_0226/ArrayList.java +++ /dev/null @@ -1,68 +0,0 @@ -package week1_0226; -import java.util.Arrays; -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - ensureCapacity(size + 1); - elementData[size++] = o; - } - private void ensureCapacity(int size){ - if (size > elementData.length){ - grow(); - } - } - private void grow(){ - elementData = Arrays.copyOf(elementData, size * 2); - } - public void add(int index, Object o){ - rangeCheckForAdd(index); - ensureCapacity(size + 1); - System.arraycopy(elementData,index, elementData, index + 1, size - index); - elementData[index] = o; - size ++; - } - private void rangeCheckForAdd(int index){ - //index = size时不需要报错? - if (index > size || index < 0){ - throw new IndexOutOfBoundsException(); - } - } - public Object get(int index){ - rangeCheck(index); - return elementData[index]; - } - private void rangeCheck(int index){ - if (index >= size || index < 0){ - throw new IndexOutOfBoundsException(); - } - } - - public Object remove(int index){ - rangeCheck(index); - Object dest = elementData[index]; - System.arraycopy(elementData, index +1, elementData, index, size-index-1); - size --; - return dest; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new Iterator(){ - private int index = 0; - public Object next(){ - return elementData[index++]; - } - public boolean hasNext(){ - return index >= size; - } - }; - } - -} diff --git a/group01/349209948/src/week1_0226/BinaryTreeNode.java b/group01/349209948/src/week1_0226/BinaryTreeNode.java deleted file mode 100644 index e667bdf15a..0000000000 --- a/group01/349209948/src/week1_0226/BinaryTreeNode.java +++ /dev/null @@ -1,37 +0,0 @@ -package week1_0226; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Object o){ - this.data = o; - } - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - BinaryTreeNode node = new BinaryTreeNode(o); - this.setRight(node); - return node; - } - -} diff --git a/group01/349209948/src/week1_0226/Iterator.java b/group01/349209948/src/week1_0226/Iterator.java deleted file mode 100644 index 3eddc2b726..0000000000 --- a/group01/349209948/src/week1_0226/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package week1_0226; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group01/349209948/src/week1_0226/LinkedList.java b/group01/349209948/src/week1_0226/LinkedList.java deleted file mode 100644 index 51c9ab8844..0000000000 --- a/group01/349209948/src/week1_0226/LinkedList.java +++ /dev/null @@ -1,129 +0,0 @@ -package week1_0226; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - private int size = 0; - - public void add(Object o){ - if (head == null) { - head = new Node(o); - } else { - //遍历到链表的尾部 - Node tail = head; - while (tail.next != null) { - tail = tail.next; - } - Node node = new Node(o); - tail.next = node; - } - size ++; - } - public void add(int index , Object o){ - rangeCheckForAdd(index); - if (index ==0) { - Node node = new Node(o); - node.next = head; - head = node; - } else { - Node preHead = head; - for (int i = 0; i < index -1; i ++){ - preHead = head.next; - } - Node node = new Node(o); - node.next = preHead.next; - preHead.next = node; - } - } - public Object get(int index){ - rangeCheck(index); - Node dest = head; - for (int i = 0; i< index; i++){ - dest = dest.next; - } - return dest.data; - } - private void rangeCheck(int index){ - if (index >= size || index <0){ - throw new IndexOutOfBoundsException(); - } - } - public Object remove(int index){ - rangeCheck(index); - Node preDest = head; - for (int i = 0; i < index; i++){ - preDest = preDest.next; - } - Node dest = preDest.next; - preDest.next = dest.next; - size --; - return dest; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node node = new Node(o); - node.next = head; - head = node; - size ++; - } - public void addLast(Object o){ - Node lastNode = head; - while (lastNode.next != null){ - lastNode = lastNode.next; - } - Node node = new Node(o); - lastNode.next = node; - size++; - } - public Object removeFirst(){ - if (head == null) { - throw new NoSuchElementException(); - } - Node headTmp = head; - head = head.next; - size --; - return headTmp; - } - public Object removeLast(){ - if (head == null) { - throw new NoSuchElementException(); - } - if (head.next == null) { - Node dest = head; - head = null; - size --; - return dest; - } - Node preLastNode = head; - while(preLastNode.next.next != null) { - preLastNode = preLastNode.next; - } - Node dest = preLastNode.next; - preLastNode.next = null; - size --; - return dest; - } - public Iterator iterator(){ - return null; - } - private void rangeCheckForAdd(int index){ - if (index > size || index <0){ - throw new IndexOutOfBoundsException(); - } - } - - private static class Node{ - Object data; - Node next; - Node (Object data) { - this.data = data; - next = null; - } - } -} diff --git a/group01/349209948/src/week1_0226/List.java b/group01/349209948/src/week1_0226/List.java deleted file mode 100644 index ba1577cfaa..0000000000 --- a/group01/349209948/src/week1_0226/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package week1_0226; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group01/349209948/src/week1_0226/Queue.java b/group01/349209948/src/week1_0226/Queue.java deleted file mode 100644 index a20d6a303e..0000000000 --- a/group01/349209948/src/week1_0226/Queue.java +++ /dev/null @@ -1,21 +0,0 @@ -package week1_0226; - -public class Queue { - - private LinkedList list = new LinkedList(); - public void enQueue(Object o){ - list.add(o); - } - - public Object deQueue(){ - return list.removeFirst(); - } - - public boolean isEmpty(){ - return list.size() == 0; - } - - public int size(){ - return list.size(); - } -} diff --git a/group01/349209948/src/week1_0226/Stack.java b/group01/349209948/src/week1_0226/Stack.java deleted file mode 100644 index f5d6add66d..0000000000 --- a/group01/349209948/src/week1_0226/Stack.java +++ /dev/null @@ -1,29 +0,0 @@ -package week1_0226; -import java.util.EmptyStackException; -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - checkStack(); - return elementData.remove(elementData.size() - 1); - } - private void checkStack(){ - if (elementData.size() == 0){ - throw new EmptyStackException(); - } - } - public Object peek(){ - checkStack(); - return elementData.get(elementData.size() - 1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group01/360176196/.classpath b/group01/360176196/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group01/360176196/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group01/360176196/.gitignore b/group01/360176196/.gitignore deleted file mode 100644 index 5e56e040ec..0000000000 --- a/group01/360176196/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin diff --git a/group01/360176196/.project b/group01/360176196/.project deleted file mode 100644 index a895f05a76..0000000000 --- a/group01/360176196/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - xqfGit - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group01/360176196/src/xqfGit/dataStructure/ArrayList.java b/group01/360176196/src/xqfGit/dataStructure/ArrayList.java deleted file mode 100644 index 5996182fbe..0000000000 --- a/group01/360176196/src/xqfGit/dataStructure/ArrayList.java +++ /dev/null @@ -1,73 +0,0 @@ -package xqfGit.dataStructure; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - - public void add(Object o){ - if(this.size >= elementData.length){ - elementData = Arrays.copyOf(elementData, size+1); - elementData[size] = o; - size++; - } - else{ - elementData[size-1] = o; - size++; - } - - } - - public void add(int index, Object o){ - if(index<0 || index>elementData.length){ - throw new ArrayIndexOutOfBoundsException("OutOfBounds"); - } - else{ - System.arraycopy(elementData, index, elementData, index+1, elementData.length+1); - elementData[index] = o; - size++; - } - } - - - public Object get(int index){ - if(index<0 || index>elementData.length){ - throw new ArrayIndexOutOfBoundsException("OutOfBounds"); - } - else{ - return elementData[index]; - } - } - - - public Object remove(int index){ - if(index<0 || index>elementData.length){ - throw new ArrayIndexOutOfBoundsException("OutOfBounds"); - } - else{ - Object reObject = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, elementData.length-1); - size--; - return reObject; - } - } - - public int size(){ - if(this.size < elementData.length){ - return size; - }else{ - elementData = Arrays.copyOf(elementData, size); - return size; - } - } - - - public Iterator iterator(){ - return null; - } - -} diff --git a/group01/360176196/src/xqfGit/dataStructure/BinaryTreeNode.java b/group01/360176196/src/xqfGit/dataStructure/BinaryTreeNode.java deleted file mode 100644 index 7662484884..0000000000 --- a/group01/360176196/src/xqfGit/dataStructure/BinaryTreeNode.java +++ /dev/null @@ -1,49 +0,0 @@ -package xqfGit.dataStructure; - -import com.sun.swing.internal.plaf.basic.resources.basic; - -public class BinaryTreeNode { - - private Integer data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - - - - public Integer getData() { - return data; - } - public void setData(Integer data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Integer i){ - - return null; - } - - public BinaryTreeNode (){ - - } - - - - public BinaryTreeNode(BinaryTreeNode b1,BinaryTreeNode b2){ - this.left = b1; - this.right = b2; - } - -} diff --git a/group01/360176196/src/xqfGit/dataStructure/Iterator.java b/group01/360176196/src/xqfGit/dataStructure/Iterator.java deleted file mode 100644 index ee4842739f..0000000000 --- a/group01/360176196/src/xqfGit/dataStructure/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package xqfGit.dataStructure; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group01/360176196/src/xqfGit/dataStructure/LinkedList.java b/group01/360176196/src/xqfGit/dataStructure/LinkedList.java deleted file mode 100644 index a663f85b15..0000000000 --- a/group01/360176196/src/xqfGit/dataStructure/LinkedList.java +++ /dev/null @@ -1,116 +0,0 @@ -package xqfGit.dataStructure; - -public class LinkedList implements List { - - private Node first; - private Node last; - private int size; - - public void add(Object o){ - Node l = new Node(o); - l = last.next; - size++; - } - - public void add(int index , Object o){ - Node l = new Node(o); - Node n = first; - if(size == index){ - l = last.next; - l = last; - size++; - }else{ - Node m = first; - for(int i =0;i - - - - - diff --git a/group01/378213871/.gitignore b/group01/378213871/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group01/378213871/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group01/378213871/.project b/group01/378213871/.project deleted file mode 100644 index a6666f301e..0000000000 --- a/group01/378213871/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - coding - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group01/378213871/src/com/coding/basic/week01/ArrayList.java b/group01/378213871/src/com/coding/basic/week01/ArrayList.java deleted file mode 100644 index 5745209a08..0000000000 --- a/group01/378213871/src/com/coding/basic/week01/ArrayList.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.coding.basic.week01; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - ensureCapacity(size + 1); - elementData[size++] = o; - } - - public void ensureCapacity(int size) { - if (size > elementData.length) { - grow(); - } - } - - public void grow() { - elementData = Arrays.copyOf(elementData, size * 2); - } - - public void add(int index, Object o){ - if (index < 0 || index >= size) { - throw new ArrayIndexOutOfBoundsException(); - } - ensureCapacity(size + 1); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - if (index < 0 || index >= size) { - throw new ArrayIndexOutOfBoundsException(); - } - return elementData[index]; - } - - public Object remove(int index){ - if (index < 0 || index >= size) { - throw new ArrayIndexOutOfBoundsException(); - } - Object removedItem = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - size--; - return removedItem; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new Iterator() { - private int current = 0; - - public boolean hasNext() { - return current < size(); - } - - public Object next() { - if(!hasNext()) { - throw new java.util.NoSuchElementException(); - } - return elementData[current++]; - } - }; - } - -} diff --git a/group01/378213871/src/com/coding/basic/week01/BinaryTreeNode.java b/group01/378213871/src/com/coding/basic/week01/BinaryTreeNode.java deleted file mode 100644 index 36e20a95c5..0000000000 --- a/group01/378213871/src/com/coding/basic/week01/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic.week01; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group01/378213871/src/com/coding/basic/week01/Iterator.java b/group01/378213871/src/com/coding/basic/week01/Iterator.java deleted file mode 100644 index 365e98e8b4..0000000000 --- a/group01/378213871/src/com/coding/basic/week01/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic.week01; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group01/378213871/src/com/coding/basic/week01/LinkedList.java b/group01/378213871/src/com/coding/basic/week01/LinkedList.java deleted file mode 100644 index dd6f3fb2e6..0000000000 --- a/group01/378213871/src/com/coding/basic/week01/LinkedList.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.coding.basic.week01; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - - private int size; - - public void add(Object o){ - if (head == null) { - head = new Node(o); - size++; - } else{ - addLast(o); - } - } - public void add(int index , Object o){ - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - if (index == 0) { - addFirst(o); - } else { - //定义标记节点sentinelNode,标记节点的下一个节点即为要新加的元素 - Node sentinelNode = head; - for (int i = 0; i < index - 1; i++) { - sentinelNode = sentinelNode.next; - } - Node node = new Node(o); - node.next = sentinelNode.next; - sentinelNode.next = node; - size++; - } - } - public Object get(int index){ - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } else { - Node indexNode = head; - for (int i = 0; i < index; i++) { - indexNode = indexNode.next; - } - return indexNode.data; - } - } - public Object remove(int index){ - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } else { - /** - * sentinelNode是所删除节点的上一个节点; - * indexNode是需要被删除的节点 - */ - Node sentinelNode = head; - Node indexNode = head; - for (int i = 0; i < index - 1; i++) { - sentinelNode = sentinelNode.next; - } - for (int i = 0; i < index; i++) { - indexNode = indexNode.next; - } - Node nextIndexNode = indexNode.next; - sentinelNode.next = nextIndexNode; - indexNode.next = null; - size--; - return indexNode.data; - } - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node node = new Node(o); - node.next = head; - head = node; - size++; - } - public void addLast(Object o){ - //定义尾节点并通过while循环找到当前链表的尾节点 - Node tailNode = head; - while (tailNode.next != null) { - tailNode = tailNode.next; - } - Node node = new Node(o); - tailNode.next = node; - size++; - } - public Object removeFirst(){ - if (head == null) { - throw new NoSuchElementException(); - } - Node newNode = head; - head = head.next; - size--; - return newNode.data; - } - public Object removeLast(){ - if (head == null) { - throw new NoSuchElementException(); - } - Node newNode = head; - while (newNode.next.next != null) { - newNode = newNode.next; - } - Node lastNode = newNode.next; - newNode.next = null; - size--; - return lastNode.data; - } - - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; // 下一个节点 - - private Node(Object data) { - this.data = data; - next = null; - } - } -} diff --git a/group01/378213871/src/com/coding/basic/week01/List.java b/group01/378213871/src/com/coding/basic/week01/List.java deleted file mode 100644 index 966ca016e8..0000000000 --- a/group01/378213871/src/com/coding/basic/week01/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic.week01; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group01/378213871/src/com/coding/basic/week01/Queue.java b/group01/378213871/src/com/coding/basic/week01/Queue.java deleted file mode 100644 index 1b25880f67..0000000000 --- a/group01/378213871/src/com/coding/basic/week01/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic.week01; - -public class Queue { - private LinkedList list = new LinkedList(); - //入队列 - public void enQueue(Object o){ - list.add(o); - } - //出队列 - public Object deQueue(){ - if(list.size() == 0) { - return null; - } - return list.removeFirst(); - } - - public boolean isEmpty(){ - return list.size() == 0; - } - - public int size(){ - return list.size(); - } -} diff --git a/group01/378213871/src/com/coding/basic/week01/Stack.java b/group01/378213871/src/com/coding/basic/week01/Stack.java deleted file mode 100644 index 64cfa30da6..0000000000 --- a/group01/378213871/src/com/coding/basic/week01/Stack.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic.week01; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - //入栈 - public void push(Object o){ - elementData.add(o); - - } - - //出栈 - public Object pop(){ - if(elementData.size() == 0) { - throw new EmptyStackException(); - } - return elementData.remove(elementData.size() - 1); - } - - //读取栈顶元素 - public Object peek(){ - if(elementData.size() == 0) { - throw new EmptyStackException(); - } - return elementData.get(elementData.size() - 1); - } - public boolean isEmpty(){ - return size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group01/496740686/src/Impl/MyArraryList.java b/group01/496740686/src/Impl/MyArraryList.java deleted file mode 100644 index 20fb5dcfdf..0000000000 --- a/group01/496740686/src/Impl/MyArraryList.java +++ /dev/null @@ -1,141 +0,0 @@ -package Impl; - -import Interface.ArrayList; -import Interface.Iterator; -import ex.MyArrest; - -/** - * Created by Administrator on 2017/2/25. - */ -public class MyArraryList extends ArrayList { - private Object[] objArr; - private int size; - private int postion; - - public MyArraryList() { - this.objArr = new Object[10]; - this.size = 10; - this.postion = 0; - } - - - public MyArraryList(int size) { - this.objArr = new Object[size]; - this.size = size; - this.postion = 0; - } - - public MyArraryList(Object[] objArr) { - this.objArr = objArr; - this.size = objArr.length; - this.postion = objArr.length - 1; - } - - @Override - public void add(Object o) { - int limit = this.size + (this.size / 2); - Object[] newObjArr = new Object[limit]; - //public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)从指定源数组中复制一个数组, - // 复制从指定的位置开始,到目标数组的指定位置结束。从src引用的源数组到dest引用的目标数组, - // 数组组件的一个子序列被复制下来。被复制的组件的编号等于length参数。 - // 源数组中位置在srcPos到srcPos+length-1之间的组件被分别复制到目标数组中的destPos到destPos+length-1位置。 - System.arraycopy(this.objArr, 0, newObjArr, 0, objArr.length); - this.postion = this.size - 1; - newObjArr[this.postion] = o; - this.size = limit; - objArr = null; - this.objArr = newObjArr; - } - - @Override - public void add(int index, Object o) { - arrIndexVildate(index); - objArr[index - 1] = o; - size++; - } - - @Override - public Object get(int index) { - arrIndexVildate(index); - return objArr[index - 1]; - } - - @Override - public Object remove(int index) { - arrIndexVildate(index); - Object remoteObj = objArr[index - 1]; - objArr[index - 1] = null; - size--; - //TODO need GC ccontrol - return remoteObj; - } - - @Override - public int size() { - return this.size; - } - - @Override - public Iterator iterator() { - return new ArrayListIterator(this); - } - - private class ArrayListIterator implements Iterator { - private MyArraryList arraryList; - private int index; - - public ArrayListIterator(MyArraryList arraryList) { - this.arraryList = arraryList; - this.index = arraryList.size - 1; - } - - @Override - public boolean hasNext() { - if (index > arraryList.size) { - return true; - } else { - return false; - } - } - - @Override - public Object next() { - Object obj = arraryList.get(index); - index++; - return obj; - } - } - - private void arrIndexVildate(int index) { - if (index > size - 1 || index < 0) { - new Exception(String.format("cant than that array index %s,but got %", size - 1, index)); - } - } - - //test method - public static void main(String[] args) { - MyArraryList myArrary = new MyArraryList(); - MyArrest.arrestEq(10, myArrary.size()); - myArrary.add(1, 10); - MyArrest.arrestEq(10, myArrary.get(1)); - myArrary.add(100); - System.out.println(myArrary.get(11)); - myArrary.remove(1); - MyArrest.arrestIsNull(myArrary.get(1)); - if (myArrary.iterator().hasNext()) { - myArrary.iterator().next(); - } - System.out.println("test myArrary2"); - MyArraryList myArrary2 = new MyArraryList(20); - MyArrest.arrestEq(20, myArrary2.size()); - myArrary2.add(1, 10); - MyArrest.arrestEq(10, myArrary2.get(1)); - myArrary2.add(100); - MyArrest.arrestIsNull(myArrary2.get(20)); - myArrary2.remove(1); - MyArrest.arrestIsNull(myArrary2.get(1)); - if (myArrary.iterator().hasNext()) { - myArrary2.iterator().next(); - } - } -} diff --git a/group01/496740686/src/Impl/MyLinkedList.java b/group01/496740686/src/Impl/MyLinkedList.java deleted file mode 100644 index 017bac5baf..0000000000 --- a/group01/496740686/src/Impl/MyLinkedList.java +++ /dev/null @@ -1,177 +0,0 @@ -package Impl; - -import Interface.Iterator; -import Interface.LinkedList; -import ex.MyArrest; - -/** - * Created by Administrator on 2017/2/26. - */ -public class MyLinkedList extends LinkedList { - private MyLinkedList.Node head; - private int size = 1; - - public MyLinkedList() { - - } - - private static class Node { - Object data; - MyLinkedList.Node next; - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } - - public void add(Object o) { - if (this.size == 1) { - head.data = o; - return; - } - MyLinkedList.Node newHead = new MyLinkedList.Node(o, this.head); - this.size += 1; - this.head = newHead; - } - - - public void add(int index, Object o) { - IndexVildate(index); - int pos = 0; - if (index == 1) { - this.head = new Node(o, null); - return; - } - for (MyLinkedList.Node node = this.head; node != null; node = node.next) { - pos += 1; - if (pos == index - 1) { - node.data = o; - this.size += 1; - } - } - } - - - public Object get(int index) { - int pos = 0; - for (MyLinkedList.Node node = this.head; node != null; node = node.next) { - if (pos == index - 1) { - return node.data; - } - pos += 1; - } - return null; - } - - - public Object remove(int index) { - IndexVildate(index); - int pos = 0; - MyLinkedList.Node preNode; - for (MyLinkedList.Node node = this.head; node != null; node = node.next) { - pos += 1; - if (pos == index - 2) { - //record previous node - preNode = node; - if (pos == index - 1) { - MyLinkedList.Node willDelNode = node; - preNode.next = node.next; - node = null; - this.size -= 1; - return willDelNode; - } - } - } - return null; - } - - - public int size() { - return this.size; - } - - - public void addFirst(Object o) { - MyLinkedList.Node newHead = this.head; - newHead.data = o; - newHead.next = this.head; - this.size += 1; - this.head = newHead; - } - - - public void addLast(Object o) { - for (MyLinkedList.Node node = this.head; node != null; node = node.next) { - if (node.next == null) { - MyLinkedList.Node lastNode = new MyLinkedList.Node(o, null); - node.next = lastNode; - this.size += 1; - } - } - } - - - public Object removeFirst() { - MyLinkedList.Node oldHead = this.head; - this.head = oldHead.next; - this.size -= 1; - return oldHead; - } - - - public Object removeLast() { - for (MyLinkedList.Node node = this.head; node != null; node = node.next) { - if (node.next == null) { - MyLinkedList.Node willDelNode = node.next; - node.next = null; - this.size -= 1; - return willDelNode; - } - } - return null; - } - - public Iterator iterator() { - return new LinkedListIterator(this); - } - - private class LinkedListIterator implements Iterator { - private MyLinkedList linkedList; - private int index; - - public LinkedListIterator(MyLinkedList linkedList) { - this.linkedList = linkedList; - this.index = linkedList.size; - } - - @Override - public boolean hasNext() { - if (index > linkedList.size) { - return true; - } else { - return false; - } - } - - @Override - public Object next() { - Object obj = linkedList.get(index); - index++; - return obj; - } - } - - private void IndexVildate(int index) { - if (index > this.size || index < 0) { - System.out.println("happend error"); - } - } - - public static void main(String[] args) { - MyLinkedList linkedList = new MyLinkedList(); - linkedList.add(1, 23); - MyArrest.arrestEqByBasicType(1, linkedList.size()); - - } -} diff --git a/group01/496740686/src/Impl/MyQueue.java b/group01/496740686/src/Impl/MyQueue.java deleted file mode 100644 index 1a029738d2..0000000000 --- a/group01/496740686/src/Impl/MyQueue.java +++ /dev/null @@ -1,68 +0,0 @@ -package Impl; - -import Interface.Queue; - -/** - * Created by Administrator on 2017/2/26. - */ -public class MyQueue extends Queue { - - private Node first; // beginning of queue - private Node last; // end of queue - private int size; // number of elements on queue - - private static class Node { - private Object value; - private Node next; - - public Node(Object value, Node next) { - this.value = value; - this.next = next; - } - } - - public MyQueue() { - first = null; - last = null; - int n = 0; - } - - @Override - public void enQueue(Object o) { - Node oldlast = this.last; - this.last = new Node(o, null); - size += 1; - //第一个进队列 - if (isEmpty()) { - first = last; - } else { - oldlast.next = this.last; - } - - } - - @Override - public Object deQueue() { - if (isEmpty()) { - return null; - } else { - Node oldFirst = this.first; - Node newFirst = this.first.next; - this.first = null; - this.first = newFirst; - this.size -= 1; - return oldFirst; - - } - } - - @Override - public boolean isEmpty() { - return first == null; - } - - @Override - public int size() { - return size; - } -} diff --git a/group01/496740686/src/Impl/MyStack.java b/group01/496740686/src/Impl/MyStack.java deleted file mode 100644 index 3a7c119e99..0000000000 --- a/group01/496740686/src/Impl/MyStack.java +++ /dev/null @@ -1,70 +0,0 @@ -package Impl; - -import Interface.ArrayList; -import Interface.Stack; - - -/** - * Created by Administrator on 2017/2/26. - */ -public class MyStack extends Stack { - - private MyStack.Node first; // beginning of queue - private MyStack.Node last; // end of queue - private int size; // number of elements on queue - - private static class Node { - private Object value; - private MyStack.Node next; - - public Node(Object value, MyStack.Node next) { - this.value = value; - this.next = next; - } - } - - public MyStack() { - first = null; - last = null; - int n = 0; - } - - @Override - public void push(Object o) { - if (isEmpty()) { - MyStack.Node oldFirst = this.first; - this.first = new MyStack.Node(o, null); - size += 1; - //第一个进栈 - if (isEmpty()) { - first = last; - } else { - oldFirst.next = this.last; - } - } - } - - @Override - public Object pop() { - if (isEmpty()) { - return null; - } else { - MyStack.Node oldFirst = this.first; - this.first = oldFirst.next; - this.size -= 1; - return oldFirst; - - } - - } - - @Override - public Object peek() { - return this.first; - } - - @Override - public boolean isEmpty() { - return first == null; - } -} diff --git a/group01/496740686/src/Interface/ArrayList.java b/group01/496740686/src/Interface/ArrayList.java deleted file mode 100644 index 567c1996b1..0000000000 --- a/group01/496740686/src/Interface/ArrayList.java +++ /dev/null @@ -1,34 +0,0 @@ -package Interface; - - - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group01/496740686/src/Interface/BinaryTreeNode.java b/group01/496740686/src/Interface/BinaryTreeNode.java deleted file mode 100644 index c5480a614f..0000000000 --- a/group01/496740686/src/Interface/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package Interface; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group01/496740686/src/Interface/Iterator.java b/group01/496740686/src/Interface/Iterator.java deleted file mode 100644 index 77e3c0b216..0000000000 --- a/group01/496740686/src/Interface/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package Interface; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group01/496740686/src/Interface/LinkedList.java b/group01/496740686/src/Interface/LinkedList.java deleted file mode 100644 index b7166a1731..0000000000 --- a/group01/496740686/src/Interface/LinkedList.java +++ /dev/null @@ -1,47 +0,0 @@ -package Interface; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } - -} diff --git a/group01/496740686/src/Interface/List.java b/group01/496740686/src/Interface/List.java deleted file mode 100644 index 98d6a4da0a..0000000000 --- a/group01/496740686/src/Interface/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package Interface; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group01/496740686/src/Interface/Queue.java b/group01/496740686/src/Interface/Queue.java deleted file mode 100644 index 8e3a5d5f43..0000000000 --- a/group01/496740686/src/Interface/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package Interface; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group01/496740686/src/Interface/Stack.java b/group01/496740686/src/Interface/Stack.java deleted file mode 100644 index 7e536e250a..0000000000 --- a/group01/496740686/src/Interface/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package Interface; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group01/496740686/src/ex/MyArrest.java b/group01/496740686/src/ex/MyArrest.java deleted file mode 100644 index 9987b83535..0000000000 --- a/group01/496740686/src/ex/MyArrest.java +++ /dev/null @@ -1,75 +0,0 @@ -package ex; - -/** - * Created by Administrator on 2017/2/26. - */ -public class MyArrest { - - - public static void arrestEq(T expect, T value) { - if (expect == null || value == null) { - if (expect == value) { - System.out.println("it's ok \n" ); - return; - } else { - System.out.println("happend error \n" ); - return; - } - } - if (expect.equals(value)) { - System.out.println("it's ok \n" ); - return; - } else { - System.out.println("happend error \n" ); - return; - } - } - - public static void arrestEq(T expect, T value, String errorInfo) { - if (expect == null || value == null) { - if (expect == value) { - System.out.println("it's ok \n" ); - return; - } else { - System.out.println("happend error \n" ); - return; - } - } - if (expect.equals(value)) { - System.out.println("it's ok \n" ); - return; - } else { - System.out.println("happend error \n" ); - return; - } - } - - public static void arrestEqByBasicType(T expect, T value) { - if (expect == null || value == null) { - if (expect == value) { - System.out.println("it's ok \n" ); - return; - } else { - System.out.println("happend error \n" ); - return; - } - } - if (expect == value) { - System.out.println("it's ok \n" ); - return; - } else { - System.out.println("happend error \n" ); - return; - } - } - - public static void arrestIsNull(Object obj) { - if (obj == null) { - System.out.println("it's null , you're right \n" ); - return; - } else { - System.out.println("happend error \n" ); - return; - } - } -} diff --git a/group01/751425278/.classpath b/group01/751425278/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group01/751425278/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group01/751425278/.gitignore b/group01/751425278/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group01/751425278/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group01/751425278/.project b/group01/751425278/.project deleted file mode 100644 index 85d6b2c816..0000000000 --- a/group01/751425278/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - basicDataStructure - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group01/751425278/src/com/sanmubird/basicDataStructure/ArrayList.java b/group01/751425278/src/com/sanmubird/basicDataStructure/ArrayList.java deleted file mode 100644 index 3e6c874d90..0000000000 --- a/group01/751425278/src/com/sanmubird/basicDataStructure/ArrayList.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.sanmubird.basicDataStructure; - -import java.util.Arrays; - -public class ArrayList implements List { - - /** ArrayList 是一个类,一个类就会有对象,属性,构造方法,方法 - * ArrayList 是基于数组来实现List接口; 那么它的元素就会有 存储在数组中的元素, 和ArrayList的长度 - * 这个地方需要区分size= ArrayList.size() 和 length = Array.length ; - * size 是 已经占用的长度; - * length 是数组的长度; length 》= size 当,size > length 时,数组要动态扩容; - * */ - -// 数组默认的长度 - private static final int DEFAULT_SIZE = 10; - -// ArrayList的大小 - private int size ; - -// 数组中存储的元素 - private Object[] elementData = null; - - private int count ; - -// ArrayList 的构造方法 通过构造方法 可以得到这个类的对象 -// 有参构造方法 - public ArrayList(int i){ - if(i <= 0 ){ - throw new RuntimeException("数组的长度不能小于等于0"); - }else{ - this.elementData = new Object[i]; - this.size = 0 ; // 集合ArrayList的大小; - } - } - // 无参构造方法 - public ArrayList(){ - this(DEFAULT_SIZE); // this 会调用本类中 相同参数(相同的参数个数和参数类型)的构造方法; - } - - /** ArrayList 其他方法分析 - * 目标方法: - * size(); Array的length就是ArrayList的大小 - * get(int index); Array的【index-1】就是 ArrayList的第index位元素 - * add(Object o) ; 这个方法是在数组的末尾顺序添加一个元素; 找到数组的长度size,将array【size-1】= Object - * add(int index , Object o); 这个方法是在数组的指定位置添加一个元素;找到index位,将index位起往后挪一位,并将array【index】=Object - * remove(int index); 这个方法是 删除指定位上的元素,直接将这个位至最后的元素往前挪移一位。 - * - * 工具方法: - * argumentCheck(int index); 判断输入的参数是否合法;比如传入的参数不能比数组长度大,或者不能为负数等 - * ensureCapacity(); 判断当前数组的长度是否足够大,能再容纳下一个元素。 - * - * */ - - -// 对传入的参数进行验证是否合法 如果输入的参数不合法 就抛出异常 - public void argumentCheck(int index){ - if(index >= size || index < 0 ){ // 此处我觉得需要 ‘=’ 因为 index 我觉得是下标 - throw new IndexOutOfBoundsException("插入的下标是:"+index +",但ArrayLsit的长度是:"+size); - } - } - - // 判断是否数组是否溢出的方法 如果数组现在的长度小于所需的最小长度,就需要对数组进行扩容 - public void ensureCapacity(int minCapacity){ - int length = elementData.length; // 得出当前数组的长度 - if(minCapacity > length){ - int newCapacity = length * 3 / 2 + 1 ; //你是否对此有疑问?得出的结果会不会是小数? 答案是不会的,java中算术运算符“/”;两个int类型相除,结果一定是int类型 - if(minCapacity > newCapacity ){ - newCapacity = minCapacity ; - } - count++; - System.out.println("扩容"+count+"次"); - elementData = Arrays.copyOf(elementData, newCapacity);//此处为什么用Arrays.copyOf()而不用System.arraycopy()? - // Arrays.copyOf(): 不仅仅copy数组中的元素,还会创建一个新的数组来存放copy的对象 - // System.arraycopy():仅仅是copy数组中的元素,不会新建一个数组对象,也不会改变原有的数组长度。 - // 在原有数组长度不够的情况下,只能选择新建一个数组,并将原有的数组复制到新数组的办法来解决。 - } - } - - // 得到ArrayList 大小的方法 ; 此处的size 不是Array的length,而是ArrayList中元素的个数 - public int size(){ - return size; - } - -// 传入下标得到元素 - public Object get(int index){ - argumentCheck(index); //需要判断传入的参数是否合法; - return elementData[index]; - } - -// 按顺序在数字尾部添加元素 - public void add(Object o){ - ensureCapacity(size+1); // 判断是否会溢出 - elementData[size++] = o ; //此处使用 size++ 的好处:elementData[size+1];size++; - } - - public void add(int index, Object o){ //这个地方需要搞清楚index的含义:index在此处是下标的意思 - argumentCheck(index); //判断输入的下标是否合法 ---> - // 刚开始的时候 ; 我觉得这个地方不需要加这个判断,因为ArrayList是动态增长的; - // 我还需要想明白这个问题; - ensureCapacity(size+1); // 判断是否会溢出 - int moveLength = size - (index + 1) + 1; // 此处index是下标;下标是从0开始计算的;所以第n位的下标就是(n-1);所以,n = index + 1 - // 此处的 +1 刚开始没想明白,后来组长给举了个例子,1-3 有三个数,但不是通过3-1=2 算出来的 - System.arraycopy(elementData, index, elementData, index+1, moveLength ); - elementData[index] = o ; - size++; - } - - public Object remove(int index){ - argumentCheck(index); //判断输入的下标是否合法 - Object o = elementData[index]; - System.arraycopy(elementData, index, elementData, index-1, size-index); - elementData[size] = null ; - size--; - return o; - } - - public Iterator iterator(){ - return new Iterator(){ - private int index = 0 ; - - @Override - public Object next(){ - return elementData[index++]; - } - @Override - public boolean hasNext() { - return index < size ; - } - }; - } - - public static void main(String [] args){ - ArrayList al = new ArrayList(); - al.add(1); - al.add(2); - al.add(4); - al.add(5); - al.add(6); - al.add(7); - al.add(2,3); - al.add(8); - al.add(9); - al.add(10); - al.add(11); - al.add(13); - al.add(9,12); - al.add(14); - al.add(15); - al.remove(9); - for(int i = 0 ; i < al.size() ; i++ ){ - System.out.println(al.get(i)); - } - System.out.println("al的size是"+al.size()); - System.out.println(al.get(15)); - } -} \ No newline at end of file diff --git a/group01/751425278/src/com/sanmubird/basicDataStructure/BinaryTreeNode.java b/group01/751425278/src/com/sanmubird/basicDataStructure/BinaryTreeNode.java deleted file mode 100644 index 4096c79e36..0000000000 --- a/group01/751425278/src/com/sanmubird/basicDataStructure/BinaryTreeNode.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.sanmubird.basicDataStructure; - -public class BinaryTreeNode { - /** 二叉树同时具有数组和链表各自的特点:它可以像数组一样迅速查找;也可以像链表一样快速添加; - * 但 删除操作复杂; - * 二叉树是每个节点最多有两个子树的有序树; - * 一个节点的左子点的关键值必须小于此节点,右节点的关键值必须大于或者等于此节点, - * */ - - - private Integer data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Integer i){ - this.data = i ; - } - - - public Object getData() { - return data; - } - public void setData(Integer i) { - this.data = i; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Integer i){ - BinaryTreeNode node = new BinaryTreeNode(i); - if(i > this.data){ - if(this.getRight() == null ){ - this.setRight(node); - return node; - }else{ - return this.getRight().insert(i); - } - }else{ - if(this.getLeft() == null ){ - this.setLeft(node); - return node ; - }else{ - return this.getLeft().insert(i); - } - } - } - -} \ No newline at end of file diff --git a/group01/751425278/src/com/sanmubird/basicDataStructure/Iterator.java b/group01/751425278/src/com/sanmubird/basicDataStructure/Iterator.java deleted file mode 100644 index df4a1e3a6d..0000000000 --- a/group01/751425278/src/com/sanmubird/basicDataStructure/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.sanmubird.basicDataStructure; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} \ No newline at end of file diff --git a/group01/751425278/src/com/sanmubird/basicDataStructure/LinkedList.java b/group01/751425278/src/com/sanmubird/basicDataStructure/LinkedList.java deleted file mode 100644 index 31703dd5f1..0000000000 --- a/group01/751425278/src/com/sanmubird/basicDataStructure/LinkedList.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.sanmubird.basicDataStructure; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - /** 链表:是由节点(Node)组成的, - * 而向外暴露的只有一个头节点;我们对链表的所有操作,都是直接或简洁地通过头节点来实现的。 - * 节点(Node)是由 一个 存储的对象和一个对下个节点的引用组成的。 - * Node中最重要的就是引用了,如果说对ArrayList的增删是ArrayCopy的话,那对LinkedList的增删就是改变引用的指向。 - * 因为节点的添加顺序是自右向左的,且最左边的节点是头节点; - * 所以,新添加的节点会在左边,而是新添加的节点会成为新的t头节点。 - * 头节点可以通过对下一个节点的引用,来找到所有的节点; - * 所以:链表里面的属性就有两个,一个是头节点,一个是节点的数量。 - ***/ - private Node head; //定义一个头节点 - private int size ; //节点的数量 - - public LinkedList(){ - this.head = null ; - this.size = 0 ; - } - -// 检查输入的参数是否合法 - public void argumentCheckForAdd(int index){ - if(index > size || index < 0 ){ //这个地反需要验证 index = 0 的情况 - throw new IndexOutOfBoundsException("输入的参数超出了边界!"); - } - } - -// 检查输入的参数是否合法 - public void argumentCheckForOther(int index){ - if(index >= size || index < 0 ){ - throw new IndexOutOfBoundsException("输入的参数超出了边界!"); - } - } - - - public Node getHead(){ - return head ; - } - - public Object get(int index){ - argumentCheckForOther(index); - Node node = head ; - for(int i = 0 ; i < index ; i++){ - node = head.next ; - } - return node.data; - } - public int size(){ - return size; // return this.size 跟 return size ;有区别没有? - } - -// - public void add(Object o){ - Node newNode = new Node(o); //实例化一个要添加的节点 - if(head == null ){ - head = newNode ; - }else{ - Node temp = head ; - while (temp.next != null ){ //这个地方为什么是 temp.next != null ? - // 这个地方的作用就是:取出下一个节点;那么当然是在存在下个节点的情况下,才能取出下个节点 - temp = temp.next ; - // 这样就找到了最后一个节点: temp - } - temp.next = newNode ; - } - size++; - } - -// 这个通过画图,然后看图说话就很容易弄出来。 - public void add(int index , Object o){ - argumentCheckForAdd(index); - if(size == index ) - add(o); - else{ - Node preNode = head ; - for (int i = 0 ; i < index ; i++){ - preNode = preNode.next; - } - Node nextNode = preNode.next ; - Node node = new Node(o); - preNode.next = node; - node.next = nextNode; - size++; - } - } - - public Object remove(int index){ - argumentCheckForOther(index); - Node temp = head ; - for(int i = 0 ; i < index ; i++){ - temp = temp.next ; - } - Node removedNode = temp.next ; - Node nextNode = removedNode.next ; - temp.next = nextNode ; - size--; - return removedNode.data; - } - - - public void addFirst(Object o){ - Node node = new Node(o); - node.next = head ; - head = node ; - size++; - } - - public void addLast(Object o){ - Node lastNode = head ; - while(lastNode.next != null ){ - lastNode = lastNode.next ; - } - Node node = new Node(o); - lastNode.next = node ; - size++; - } - - public void noSuchElement(){ - if(head.next == null){ - throw new NoSuchElementException("没有这个元素"); - } - } - - - public Object removeFirst(){ - noSuchElement(); - Node node = head.next ; - head.next = node.next ; - size--; - return node.data; - } - - public Object removeLast(){ - noSuchElement(); - Node temp = head ; - for(int i = 0 ; i 0){ - this.queArray = new Object[initialSize]; - this.maxSize = initialSize; - this.front = this.rear = 0 ; - }else{ - throw new RuntimeException("初始化的大小不能小于0;"+ initialSize); - } -} - - public void enQueue(Object o){ - if(rear == maxSize){ - throw new RuntimeException("队列已满,无法插入新的元素!"); - }else{ - queArray[rear++] = o ; - } - } - - public Object deQueue(){ - if(isEmpty()){ - throw new RuntimeException("空队列异常!"); - }else{ - Object obj = (Object) queArray[front]; - queArray[front++] = null; - return obj; - } - } - - //判空 - public boolean isEmpty(){ - return rear == front?true:false; - } - - public int size(){ - return rear-front; - } - */ - - - /** 采用链表实现对队列;队列的特点是:先进先出,而且不能插队;所以只能从尾进,从头出。 - * - * */ - private LinkedList ll ; - - public Queue(){ - this.ll = new LinkedList(); - } - - public void enQueue(Object o){ - ll.addLast(o); - } - - public Object deQueue(){ - return ll.removeLast(); - } - - public boolean isEmpty(){ - return ll.getHead().next == null ? true: false; - } - - public int size(){ - return ll.size(); - } -} \ No newline at end of file diff --git a/group01/751425278/src/com/sanmubird/basicDataStructure/Stack.java b/group01/751425278/src/com/sanmubird/basicDataStructure/Stack.java deleted file mode 100644 index 7c6b03b3df..0000000000 --- a/group01/751425278/src/com/sanmubird/basicDataStructure/Stack.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.sanmubird.basicDataStructure; - -public class Stack { - - private Object[] arrayStack ;// - private int maxSize ; //栈容量 - private int top ; //栈指针; - - public Stack(int initialSize){ - if(initialSize >= 0 ){ - this.arrayStack = new Object[initialSize]; - this.maxSize = initialSize ; - this.top = -1 ; - }else{ - throw new RuntimeException("初始化的大小不能小于0"+initialSize); - } - } - - // 进栈,进栈的第一个元素的top = 0 ; - public void push(Object o){ - if(top == maxSize -1 ){ - throw new RuntimeException("栈已满,无法将元素插入栈"); - }else{ - arrayStack[++top] = o ; - } - } - - public Object pop(){ - if(top == -1){ - throw new RuntimeException("栈为空!"); - }else{ - return arrayStack[top--]; - } - } - -// 查看栈顶元素,但是不移除 - public Object peek(){ - if(top == -1){ - throw new RuntimeException("栈为空!"); - }else{ - return arrayStack[top]; - } - } - public boolean isEmpty(){ - return top == -1 ? true : false; - } - public int size(){ - return arrayStack.length; - } -} \ No newline at end of file diff --git a/group01/765324639/src/zavier/week01/basic/ArrayList.java b/group01/765324639/src/zavier/week01/basic/ArrayList.java deleted file mode 100644 index 38e5739fb8..0000000000 --- a/group01/765324639/src/zavier/week01/basic/ArrayList.java +++ /dev/null @@ -1,85 +0,0 @@ -package zavier.week01.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - @Override - public void add(Object o) { - ensureCapacity(size + 1); - elementData[size++] = o; - } - - private void ensureCapacity(int size) { - if (size > elementData.length) { - grow(); - } - } - - private void grow() { - elementData = Arrays.copyOf(elementData, size * 2); - } - - @Override - public void add(int index, Object o) { - rangeCheckForAdd(index); - ensureCapacity(size + 1); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - private void rangeCheckForAdd(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - } - - @Override - public Object get(int index) { - rangeCheck(index); - return elementData[index]; - } - - private void rangeCheck(int index) { - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(); - } - } - - @Override - public Object remove(int index) { - rangeCheck(index); - Object dest = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - size--; - return dest; - } - - @Override - public int size() { - return size; - } - - public Iterator iterator() { - return new Iterator() { - - private int index = 0; - - @Override - public Object next() { - return elementData[index++]; - } - - @Override - public boolean hasNext() { - return index < size; - } - }; - } - -} diff --git a/group01/765324639/src/zavier/week01/basic/BinaryTreeNode.java b/group01/765324639/src/zavier/week01/basic/BinaryTreeNode.java deleted file mode 100644 index 6ef26e8f9a..0000000000 --- a/group01/765324639/src/zavier/week01/basic/BinaryTreeNode.java +++ /dev/null @@ -1,63 +0,0 @@ -package zavier.week01.basic; - -public class BinaryTreeNode { - - private Integer data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Integer data) { - this.data = data; - } - - public Integer getData() { - return data; - } - - public void setData(Integer data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Integer o) { - - if (o > this.data) { - - if (this.getRight() == null) { - BinaryTreeNode node = new BinaryTreeNode(o); - this.setRight(node); - return node; - } else { - return this.getRight().insert(o); - } - - } else { - - if (this.getLeft() == null) { - BinaryTreeNode node = new BinaryTreeNode(o); - this.setLeft(node); - return node; - } else { - return this.getLeft().insert(o); - } - - } - - } - -} diff --git a/group01/765324639/src/zavier/week01/basic/Iterator.java b/group01/765324639/src/zavier/week01/basic/Iterator.java deleted file mode 100644 index 664983e0fd..0000000000 --- a/group01/765324639/src/zavier/week01/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package zavier.week01.basic; - -public interface Iterator { - public boolean hasNext(); - - public Object next(); - -} diff --git a/group01/765324639/src/zavier/week01/basic/LinkedList.java b/group01/765324639/src/zavier/week01/basic/LinkedList.java deleted file mode 100644 index c876b48f1b..0000000000 --- a/group01/765324639/src/zavier/week01/basic/LinkedList.java +++ /dev/null @@ -1,148 +0,0 @@ -package zavier.week01.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - - private int size = 0; - - @Override - public void add(Object o) { - if (head == null) { - head = new Node(o); - } else { - Node tail = head; - while (tail.next != null) { - tail = tail.next; - } - Node node = new Node(o); - - tail.next = node; - } - size++; - } - - @Override - public void add(int index, Object o) { - rangeCheckForAdd(index); - if (index == 0) { - Node node = new Node(o); - node.next = head; - head = node; - } else { - Node preDest = head; - for (int i = 0; i < index - 1; i++) { - preDest = preDest.next; - } - Node node = new Node(o); - node.next = preDest.next; - preDest.next = node; - } - - size++; - } - - private void rangeCheckForAdd(int index) { - if (index > size || index < 0) { - throw new IndexOutOfBoundsException(); - } - } - - @Override - public Object get(int index) { - rangeCheck(index); - - Node dest = head; - for (int i = 0; i < index; i++) { - dest = dest.next; - } - return dest.data; - } - - private void rangeCheck(int index) { - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(); - } - } - - @Override - public Object remove(int index) { - rangeCheck(index); - - Node preDest = head; - for (int i = 0; i < index - 1; i++) { - preDest = preDest.next; - } - Node dest = preDest.next; - preDest.next = dest.next; - - size--; - return dest.data; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object o) { - Node node = new Node(o); - node.next = head; - head = node; - size++; - } - - public void addLast(Object o) { - Node lastNode = head; - while (lastNode.next != null) { - lastNode = lastNode.next; - } - - Node node = new Node(o); - lastNode.next = node; - size++; - } - - public Object removeFirst() { - if (head == null) { - throw new NoSuchElementException(); - } - Node target = head; - head = head.next; - size--; - return target.data; - } - - public Object removeLast() { - if (head == null) { - throw new NoSuchElementException(); - } - - Node preDest = head; - while (preDest.next.next != null) { - preDest = preDest.next; - } - Node dest = preDest.next; - preDest.next = null; - - size--; - return dest.data; - } - - public Iterator iterator() { - return null; - } - - - private static class Node { - Object data; - Node next; - - Node(Object data) { - this.data = data; - next = null; - } - } -} diff --git a/group01/765324639/src/zavier/week01/basic/List.java b/group01/765324639/src/zavier/week01/basic/List.java deleted file mode 100644 index 4f2d49bd73..0000000000 --- a/group01/765324639/src/zavier/week01/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package zavier.week01.basic; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group01/765324639/src/zavier/week01/basic/Queue.java b/group01/765324639/src/zavier/week01/basic/Queue.java deleted file mode 100644 index 5a212d46c1..0000000000 --- a/group01/765324639/src/zavier/week01/basic/Queue.java +++ /dev/null @@ -1,25 +0,0 @@ -package zavier.week01.basic; - -public class Queue { - - private LinkedList list = new LinkedList(); - - public void enQueue(Object o) { - list.add(o); - } - - public Object deQueue() { - if (list.size() == 0) { - return null; - } - return list.removeFirst(); - } - - public boolean isEmpty() { - return list.size() == 0; - } - - public int size() { - return list.size(); - } -} diff --git a/group01/765324639/src/zavier/week01/basic/Stack.java b/group01/765324639/src/zavier/week01/basic/Stack.java deleted file mode 100644 index ebe4afb19f..0000000000 --- a/group01/765324639/src/zavier/week01/basic/Stack.java +++ /dev/null @@ -1,33 +0,0 @@ -package zavier.week01.basic; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - if (elementData.size() == 0) { - throw new EmptyStackException(); - } - return elementData.remove(elementData.size() - 1); - } - - public Object peek() { - if (elementData.size() == 0) { - throw new EmptyStackException(); - } - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} diff --git a/group01/765324639/src/zavier/week01/test/AllTests.java b/group01/765324639/src/zavier/week01/test/AllTests.java deleted file mode 100644 index c1755f6803..0000000000 --- a/group01/765324639/src/zavier/week01/test/AllTests.java +++ /dev/null @@ -1,12 +0,0 @@ -package zavier.week01.test; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@SuiteClasses({ArrayListTest.class, LinkedListTest.class, QueueTest.class, StackTest.class, - BinaryTreeNodeTest.class}) -public class AllTests { - -} diff --git a/group01/765324639/src/zavier/week01/test/ArrayListTest.java b/group01/765324639/src/zavier/week01/test/ArrayListTest.java deleted file mode 100644 index 6a475500df..0000000000 --- a/group01/765324639/src/zavier/week01/test/ArrayListTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package zavier.week01.test; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import zavier.week01.basic.ArrayList; -import zavier.week01.basic.Iterator; - -public class ArrayListTest { - - private ArrayList arrayList = new ArrayList(); - - @Before - public void setUp() { - for (int i = 0; i < 500; i++) { - arrayList.add(i); - } - } - - @Test - public void testAddObject() { - for (int i = 0; i < 500; i++) { - arrayList.add(i); - } - } - - @Test - public void testAddIntObject() { - arrayList.add(100, -100); - Assert.assertEquals(-100, arrayList.get(100)); - Assert.assertEquals(100, arrayList.get(101)); - Assert.assertEquals(501, arrayList.size()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testAddIllegalIntObject() { - arrayList.add(1000, 5); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testAddNegativeIntObject() { - arrayList.add(-1, 5); - } - - @Test - public void testGet() { - for (int i = 0; i < 500; i++) { - Assert.assertEquals(i, ((Integer) arrayList.get(i)).intValue()); - } - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testIllegalGet() { - arrayList.get(500); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testNegativeGet() { - arrayList.get(-10); - } - - @Test - public void testRemove() { - Assert.assertEquals(100, arrayList.remove(100)); - Assert.assertEquals(101, arrayList.get(100)); - Assert.assertEquals(499, arrayList.size()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testIllegalRemove() { - arrayList.remove(500); - } - - @Test - public void testSize() { - Assert.assertEquals(500, arrayList.size()); - } - - @Test - public void testIterator() { - Iterator iterator = arrayList.iterator(); - int i = 0; - while (iterator.hasNext()) { - Assert.assertEquals(i, iterator.next()); - i++; - } - Assert.assertEquals(500, i); - } - -} diff --git a/group01/765324639/src/zavier/week01/test/BinaryTreeNodeTest.java b/group01/765324639/src/zavier/week01/test/BinaryTreeNodeTest.java deleted file mode 100644 index 30a096a350..0000000000 --- a/group01/765324639/src/zavier/week01/test/BinaryTreeNodeTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package zavier.week01.test; - -import org.junit.Assert; -import org.junit.Test; - -import zavier.week01.basic.BinaryTreeNode; - -public class BinaryTreeNodeTest { - - private BinaryTreeNode root = new BinaryTreeNode(5); - - @Test - public void testInsert() { - root.insert(2); - root.insert(7); - root.insert(1); - root.insert(6); - - Assert.assertEquals((Integer) 5, root.getData()); - Assert.assertEquals((Integer) 2, root.getLeft().getData()); - Assert.assertEquals((Integer) 1, root.getLeft().getLeft().getData()); - Assert.assertEquals(null, root.getLeft().getRight()); - Assert.assertEquals((Integer) 7, root.getRight().getData()); - Assert.assertEquals((Integer) 6, root.getRight().getLeft().getData()); - Assert.assertEquals(null, root.getRight().getRight()); - - root.insert(4); - root.insert(8); - Assert.assertEquals((Integer) 4, root.getLeft().getRight().getData()); - Assert.assertEquals((Integer) 8, root.getRight().getRight().getData()); - } - -} diff --git a/group01/765324639/src/zavier/week01/test/LinkedListTest.java b/group01/765324639/src/zavier/week01/test/LinkedListTest.java deleted file mode 100644 index de7436a350..0000000000 --- a/group01/765324639/src/zavier/week01/test/LinkedListTest.java +++ /dev/null @@ -1,109 +0,0 @@ -package zavier.week01.test; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import zavier.week01.basic.LinkedList; - - -public class LinkedListTest { - - private LinkedList linkedList = new LinkedList(); - - @Before - public void setUp() { - for (int i = 0; i < 500; i++) { - linkedList.add(i); - } - } - - @Test - public void testAddObject() { - for (int i = 0; i < 100; i++) { - linkedList.add(i); - } - Assert.assertEquals(600, linkedList.size()); - } - - @Test - public void testAddIntObject() { - linkedList.add(100, -100); - Assert.assertEquals(-100, linkedList.get(100)); - Assert.assertEquals(100, linkedList.get(101)); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testAddIllegalIntObject() { - linkedList.add(1000, 10); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testAddNegativeIntObject() { - linkedList.add(-10, 10); - } - - @Test - public void testGet() { - for (int i = 0; i < 500; i++) { - Assert.assertEquals(i, ((Integer) linkedList.get(i)).intValue()); - } - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testIllegalGet() { - linkedList.get(500); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testNegativeGet() { - linkedList.get(-10); - } - - @Test - public void testRemove() { - Assert.assertEquals(100, linkedList.remove(100)); - Assert.assertEquals(101, linkedList.get(100)); - Assert.assertEquals(499, linkedList.size()); - } - - @Test - public void testSize() { - Assert.assertEquals(500, linkedList.size()); - linkedList.add(10); - Assert.assertEquals(501, linkedList.size()); - } - - @Test - public void testAddFirst() { - linkedList.addFirst(-10); - Assert.assertEquals(-10, linkedList.get(0)); - linkedList.addFirst(-100); - Assert.assertEquals(-100, linkedList.get(0)); - Assert.assertEquals(-10, linkedList.get(1)); - } - - @Test - public void testAddLast() { - linkedList.addLast(-9); - Assert.assertEquals(-9, linkedList.get(linkedList.size() - 1)); - linkedList.addLast(-8); - Assert.assertEquals(-8, linkedList.get(linkedList.size() - 1)); - Assert.assertEquals(-9, linkedList.get(linkedList.size() - 2)); - } - - @Test - public void testRemoveFirst() { - Assert.assertEquals(0, linkedList.removeFirst()); - Assert.assertEquals(1, linkedList.removeFirst()); - Assert.assertEquals(498, linkedList.size()); - } - - @Test - public void testRemoveLast() { - Assert.assertEquals(499, linkedList.removeLast()); - Assert.assertEquals(498, linkedList.removeLast()); - Assert.assertEquals(498, linkedList.size()); - } - -} diff --git a/group01/765324639/src/zavier/week01/test/QueueTest.java b/group01/765324639/src/zavier/week01/test/QueueTest.java deleted file mode 100644 index 99d6466c8a..0000000000 --- a/group01/765324639/src/zavier/week01/test/QueueTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package zavier.week01.test; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import zavier.week01.basic.Queue; - -public class QueueTest { - - private Queue queue = new Queue(); - - @Before - public void setUp() { - for (int i = 0; i < 500; i++) { - queue.enQueue(i); - } - } - - @Test - public void testEnQueue() { - for (int i = 0; i < 100; i++) { - queue.enQueue(i); - } - Assert.assertEquals(600, queue.size()); - } - - @Test - public void testDeQueue() { - for (int i = 0; i < 500; i++) { - Assert.assertEquals(i, queue.deQueue()); - } - Assert.assertNull(queue.deQueue()); - Assert.assertNull(queue.deQueue()); - } - - @Test - public void testIsEmpty() { - Assert.assertFalse(queue.isEmpty()); - Queue q = new Queue(); - Assert.assertTrue(q.isEmpty()); - } - - @Test - public void testSize() { - Assert.assertEquals(500, queue.size()); - } - -} diff --git a/group01/765324639/src/zavier/week01/test/StackTest.java b/group01/765324639/src/zavier/week01/test/StackTest.java deleted file mode 100644 index 8138f97d3d..0000000000 --- a/group01/765324639/src/zavier/week01/test/StackTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package zavier.week01.test; - -import java.util.EmptyStackException; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import zavier.week01.basic.Stack; - - -public class StackTest { - - private Stack stack = new Stack(); - - @Before - public void setUp() { - for (int i = 0; i < 500; i++) { - stack.push(i); - } - } - - @Test - public void testPush() { - for (int i = 0; i < 100; i++) { - stack.push(i); - } - Assert.assertEquals(600, stack.size()); - } - - @Test(expected = EmptyStackException.class) - public void testPop() { - for (int i = 0; i < 500; i++) { - Assert.assertEquals(499 - i, stack.pop()); - } - stack.pop(); - } - - @Test - public void testPeek() { - Assert.assertEquals(499, stack.peek()); - Assert.assertEquals(499, stack.peek()); - stack.pop(); - Assert.assertEquals(498, stack.peek()); - } - - @Test - public void testIsEmpty() { - Assert.assertFalse(stack.isEmpty()); - Assert.assertTrue(new Stack().isEmpty()); - } - - @Test - public void testSize() { - Assert.assertEquals(500, stack.size()); - stack.pop(); - Assert.assertEquals(499, stack.size()); - } - -} diff --git a/group01/819048836/lvxg2017/src/basic/BinaryTree.java b/group01/819048836/lvxg2017/src/basic/BinaryTree.java deleted file mode 100644 index f966389ea5..0000000000 --- a/group01/819048836/lvxg2017/src/basic/BinaryTree.java +++ /dev/null @@ -1,41 +0,0 @@ -package basic; - -public class BinaryTree { - private BinaryTreeNode root;//根节点 - - //插入操作 - public void insert(int value){ - BinaryTreeNode newNode = new BinaryTreeNode(value); - if(root==null){ - root = newNode; - root.setLeft(null); - root.setRight(null); - }else{ - BinaryTreeNode currentNode = root; - BinaryTreeNode parentNode; - while(true) - { - parentNode = currentNode; - //往右放 - if(newNode.getData()>currentNode.getData()){ - currentNode = currentNode.getRight(); - if(currentNode ==null){ - parentNode.setRight(newNode); - return; - } - }else if(newNode.getData()<=currentNode.getData()){ - currentNode = currentNode.getLeft(); - if(currentNode ==null){ - parentNode.setLeft(newNode); - return; - } - } - - } - - } - - - } - -} diff --git a/group01/819048836/lvxg2017/src/basic/BinaryTreeNode.java b/group01/819048836/lvxg2017/src/basic/BinaryTreeNode.java deleted file mode 100644 index 7f984b6131..0000000000 --- a/group01/819048836/lvxg2017/src/basic/BinaryTreeNode.java +++ /dev/null @@ -1,34 +0,0 @@ -package basic; - -//������ -public class BinaryTreeNode { - private int data;//节点值 - private BinaryTreeNode left; //左子节点 - private BinaryTreeNode right;//右子节点 - public BinaryTreeNode(int data){ - this.data =data; - this.left = null; - this.right = null; - } - public void setDate(int data){ - this.data =data; - } - public int getData(){ - return data; - } - public BinaryTreeNode getLeft(){ - return left; - } - public BinaryTreeNode getRight(){ - return right; - } - public void setLeft(BinaryTreeNode left){ - this.left = left; - } - public void setRight(BinaryTreeNode right){ - this.right =right; - } - - - -} diff --git a/group01/819048836/lvxg2017/src/basic/MyArrayList.java b/group01/819048836/lvxg2017/src/basic/MyArrayList.java deleted file mode 100644 index 064acf941e..0000000000 --- a/group01/819048836/lvxg2017/src/basic/MyArrayList.java +++ /dev/null @@ -1,88 +0,0 @@ -package basic; -/** - * - * - * @author lvxg - * - */ -public class MyArrayList { - private Object[] element; - private int size; - private static final Object[] EMPTY = new Object[10]; - - public MyArrayList() { - this.element = EMPTY; - } - - public boolean add(Object o) { - if (size < element.length) { - element[size] = o; - size++; - } else { - //数组扩容 - grow(); - element[size] = o; - size++; - } - return true; - } - - //根据索引添加 - public boolean add(int index, Object o) { - rangeCheckForAdd(index); - if (size < element.length + 1) { - Object[] e = new Object[element.length+1]; - System.arraycopy(element, 0, e, 0, index); - e[index] = o; - System.arraycopy(element, index, e, index + 1, element.length-index); - element = e; - size++; - } - return true; - } - - public Object get(int index) { - rangeCheck(index); - return element[index]; - } - - public Object remove(int index) { - rangeCheck(index); - Object oldValue = element[index]; - int numMoved = size - index-1; - if(numMoved>0){ - System.arraycopy(element, index+1, element, index, numMoved); - } - element[--size] =null; - return oldValue; - } - public int size() { - return size; - } - private void rangeCheck(int index) { - if (index >= size) - throw new IndexOutOfBoundsException(); - } - private void rangeCheckForAdd(int index) { - if (index > size || index < 0) { - throw new IndexOutOfBoundsException(); - } - } - - //数组扩容方法 - private void grow() { - Object[] e = new Object[size * 2]; - System.arraycopy(element, 0, e, 0, element.length); - element = e; - - } - - public static void main(String[] args) { - MyArrayList m = new MyArrayList(); - for (int i = 0; i < 10; i++) { - m.add(i); - } - m.add(2, "123"); - } - -} diff --git a/group01/819048836/lvxg2017/src/basic/MyLinkedList.java b/group01/819048836/lvxg2017/src/basic/MyLinkedList.java deleted file mode 100644 index c79c0e1b81..0000000000 --- a/group01/819048836/lvxg2017/src/basic/MyLinkedList.java +++ /dev/null @@ -1,168 +0,0 @@ -package basic; - - - -/** - * 链表 - * - * @author lvxg - * - */ -public class MyLinkedList { - // 头节点 - private Node first; - // 尾节点 - private Node last; - // 链表长度 - private int size = 0; - - public boolean add(Object o) { - linklast(o); - return true; - } - /** - * 根据索引添加节点 - * @param index - * @param o - */ - public void add(int index, Object o) { - checkPositionIndex(index); - if (index == size) { - linklast(o); - } else { - final Node succ = node(index); - final Node pred = succ.prev; - Node newNode = new Node(o, pred, succ); - if (pred == null) { - first = newNode; - } else { - pred.next = newNode; - } - size++; - } - } - //根据索引删除节点 - private Object remove(int index){ - Object x= unllink(node(index)); - return x; - } - private Object remove(){ - Object x = unllink(node(size)); - return x; - } - @SuppressWarnings("unused") - private Object get(int index) - { - Node f = first; - for (int i = 0; i < index; i++) { - f = f.next; - } - return f.data; - } - @SuppressWarnings("unused") - private int size(){ - return size; - } - @SuppressWarnings("unused") - private void addFirst(Object o){ - Node f= first; - Node newNode = new Node(o, f, null); - f.prev = newNode; - first = newNode; - } - @SuppressWarnings("unused") - private void addLast(Object o){ - Node l = last; - Node newNode = new Node(o, null, l); - l.next = newNode; - last = newNode; - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - - private void linklast(Object e) { - final Node l = last; - final Node newNode = new Node(e, null, l); - last = newNode; - if (l == null) { - first = newNode; - } else { - l.next = newNode; - } - size++; - - } - - private Object unllink(Node x) { - final Object element = x.data; - final Node next = x.next; - final Node prev = x.prev; - if (prev == null) { - first = next; - } else { - prev.next = next; - x.next = null; - x.prev = null; - } - if (next == null) { - last = prev; - x.next = null; - } - size--; - x.data = null; - return element; - } - - private Node node(int index) { - if (index < (size >> 1)) { - Node x = first; - for (int i = 0; i < index; i++) { - x = x.next; - } - return x; - } else { - Node x = last; - for (int i = size - 1; i > index; i--) { - x = x.prev; - } - return x; - } - } - - private static class Node { - Object data; // 节点值 - Node next;// 后继节点 - Node prev;// 前驱节点 - - public Node(Object o, Node n, Node p) { - this.data = o; - this.prev = p; - this.next = n; - } - } - - private void checkPositionIndex(int index) { - if (!isPositionIndex(index)) { - throw new IndexOutOfBoundsException(); - } - } - - private boolean isPositionIndex(int index) { - return index >= 0 && index <= size; - } - - public static void main(String[] args) { - MyLinkedList l = new MyLinkedList(); - l.add("1"); - l.add("2"); - l.add("3"); - l.add(2, "4"); - l.remove(); - l.remove(1); - } - -} diff --git a/group01/819048836/lvxg2017/src/basic/Queue.java b/group01/819048836/lvxg2017/src/basic/Queue.java deleted file mode 100644 index e29bf6fa4f..0000000000 --- a/group01/819048836/lvxg2017/src/basic/Queue.java +++ /dev/null @@ -1,43 +0,0 @@ -package basic; - -public class Queue { - private Node first; - private Node last; - private int size = 0; - - //入列 - @SuppressWarnings("unused") - private void enQueue(Object o) { - final Node f = first; - final Node newNode = new Node(o, f, null); - f.prev = newNode; - } - public int size(){ - return size; - } -public boolean isEmpty(){ - return size>=0; -} - // 出列 - @SuppressWarnings("unused") - private Object deQueue() { - final Node l = last; - final Node p = l.prev; - last = p; - p.next = null; - return l; - } - - private static class Node { - Object data; - Node next; - Node prev; - - public Node(Object o, Node n, Node p) { - this.data = o; - this.prev = p; - this.next = n; - } - } - -} diff --git a/group01/819048836/lvxg2017/src/basic/Stack.java b/group01/819048836/lvxg2017/src/basic/Stack.java deleted file mode 100644 index 916eac298a..0000000000 --- a/group01/819048836/lvxg2017/src/basic/Stack.java +++ /dev/null @@ -1,58 +0,0 @@ -package basic; - -//ջ -public class Stack { - private Node first; - private Node last; - private int size = 0; - - // 出栈 - private void pop() { - removeLast(); - } - - // 入栈 - private void push(Object o) { - addLast(o); - } - private boolean isEmpty(){ - if(size==0){ - return true; - }else{ - return false; - } - } - private int size(){ - return size; - } - private void removeLast(){ - final Node f = last.prev; - last = f; - f.next =null; - } - - - private void addLast(Object o){ - final Node f= first; - final Node l = last; - final Node newNode = new Node(o, last, null); - if(f==null){ - first =newNode; - }else{ - l.next = newNode; - } - size++; - } - - private static class Node { - Object data; - Node next; - Node prev; - - public Node(Object o, Node n, Node p) { - this.data = o; - this.prev = p; - this.next = n; - } - } -} diff --git a/group01/895457260/code/src/datastructure/basic/ArrayList.java b/group01/895457260/code/src/datastructure/basic/ArrayList.java deleted file mode 100644 index 28eb439c1b..0000000000 --- a/group01/895457260/code/src/datastructure/basic/ArrayList.java +++ /dev/null @@ -1,136 +0,0 @@ -package datastructure.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData; - - public ArrayList() { - elementData = new Object[100]; - } - - public ArrayList(int initCapacity) { - elementData = new Object[initCapacity]; - } - - public void add(Object o) { - autoGrow(); - elementData[size()] = o; - size++; - } - - public void add(int index, Object o) { - autoGrow(); - System.arraycopy(elementData, index, elementData, index + 1, size() - index); - elementData[index] = o; - size++; - } - - public Object get(int index) { - checkIndex(index); - return elementData[index]; - } - - public Object remove(int index) { - checkIndex(index); - Object removed = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size() - index - 1); - size--; - return removed; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new Iterator() { - int index = -1; - @Override - public boolean hasNext() { - return index + 1 < size(); - } - - @Override - public Object next() { - index++; - return elementData[index]; - } - }; - } - - private void autoGrow() { - if (size >= elementData.length) { - Object[] newArray = new Object[nextCapacity()]; - System.arraycopy(elementData, 0, newArray, 0, elementData.length); - elementData = newArray; - } - } - - private int nextCapacity() { - return elementData.length * 2; - } - - private void checkIndex(int index) { - if (index >= size() || index < 0) { - throw new IndexOutOfBoundsException(indexOutOfBoundMessage(index)); - } - } - - private String indexOutOfBoundMessage(int index) { - return "index: " + index + ", size: " + size(); - } - - public static void main(String[] args) { - ArrayList list = new ArrayList(); - for (int i = 0; i < 10; ++i) { - list.add(i); - list.add(10 - i); - } - System.out.println("------------------size"); - System.out.println("size: " + list.size()); - - System.out.println("------------------for(int i)"); - for (int i = 0; i < list.size(); ++i) { - System.out.print(list.get(i) + " "); - } - - System.out.println("\n-----------------iterator"); - Iterator iterator = list.iterator(); - while (iterator.hasNext()) { - System.out.print(iterator.next() + " "); - } - - System.out.println("\n-----------------add at index 0 100~104"); - for (int i = 100; i < 105; ++i) { - list.add(0, i); - } - list.print(); - System.out.println("-----------------add at last 200~204"); - for (int i = 200; i < 205; ++i) { - list.add(list.size(), i); - } - list.print(); - - System.out.println("-----------------removeFirst x4"); - for (int i = 0; i < 4; ++i) { - list.remove(0); - } - list.print(); - - System.out.println("\n-----------------removeLast x4"); - for (int i = 0; i < 4; ++i) { - list.remove(list.size() - 1); - } - list.print(); - } - - public void print() { - Iterator iterator = iterator(); - while (iterator.hasNext()) { - System.out.print(iterator.next() + " "); - } - System.out.println("\nsize: " + size()); - } -} diff --git a/group01/895457260/code/src/datastructure/basic/BinarySortedTree.java b/group01/895457260/code/src/datastructure/basic/BinarySortedTree.java deleted file mode 100644 index b251ff02ee..0000000000 --- a/group01/895457260/code/src/datastructure/basic/BinarySortedTree.java +++ /dev/null @@ -1,61 +0,0 @@ -package datastructure.basic; - -/** - * Created by Haochen on 2017/2/24. - * TODO: - */ -public class BinarySortedTree { - - private BinaryTreeNode root = null; - - public void traverse(Visitor visitor) { - traverse(root, visitor); - } - - private void traverse(BinaryTreeNode node, Visitor visitor) { - if (node == null) { - return; - } - traverse(node.getLeft(), visitor); - visitor.visit(node); - traverse(node.getRight(), visitor); - } - - public interface Visitor { - void visit(BinaryTreeNode node); - } - - //不递归的写法 - public void add(T o) { - //根节点空,直接加入 - if (root == null) { - root = new BinaryTreeNode(); - root.setData(o); - } else { - BinaryTreeNode target = root; - //从根结点不断向下比较target和o,o小则往左,o大则往右,相等不加入 - while (true) { - int compare = o.compareTo(target.getData()); - if (compare == 0) {//相等不加入 - return; - } else if (compare < 0) {//o小往左 - if (target.getLeft() == null) {//左空则加入 - target.setLeft(new BinaryTreeNode()); - target.getLeft().setData(o); - return; - } else {//不空继续比较 - target = target.getLeft(); - } - } else {//o大往右 - if (target.getRight() == null) { - target.setRight(new BinaryTreeNode()); - target.getRight().setData(o); - return; - } else { - target = target.getRight(); - } - } - } - } - } -} diff --git a/group01/895457260/code/src/datastructure/basic/BinaryTreeNode.java b/group01/895457260/code/src/datastructure/basic/BinaryTreeNode.java deleted file mode 100644 index d3a9ff377b..0000000000 --- a/group01/895457260/code/src/datastructure/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package datastructure.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group01/895457260/code/src/datastructure/basic/Iterator.java b/group01/895457260/code/src/datastructure/basic/Iterator.java deleted file mode 100644 index c1fb7ae8a5..0000000000 --- a/group01/895457260/code/src/datastructure/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package datastructure.basic; - -public interface Iterator { - boolean hasNext(); - Object next(); -} diff --git a/group01/895457260/code/src/datastructure/basic/LinkedList.java b/group01/895457260/code/src/datastructure/basic/LinkedList.java deleted file mode 100644 index 174044c546..0000000000 --- a/group01/895457260/code/src/datastructure/basic/LinkedList.java +++ /dev/null @@ -1,132 +0,0 @@ -package datastructure.basic; - -import datastructure.exception.EmptyListException; - -public class LinkedList implements List { - - private Node head; - private int size; - - public LinkedList() { - head = new Node(); - } - - @Override - public void add(Object o) { - addLast(o); - } - - @Override - public void add(int index , Object o) { - Node pre = findNode(index - 1); - Node node = new Node(); - node.data = o; - addNode(node, pre); - } - - @Override - public Object get(int index) { - checkIndex(index); - return findNode(index).data; - } - - @Override - public Object remove(int index) { - checkIndex(index); - Node pre = findNode(index - 1); - Node removed = pre.next; - removeNode(removed, pre); - return removed.data; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object o) { - Node node = new Node(); - node.data = o; - addNode(node, head); - } - - public void addLast(Object o) { - Node node = new Node(); - node.data = o; - Node pre = findNode(size() - 1); - addNode(node, pre); - } - - public Object removeFirst() { - if (size() == 0) { - throw new EmptyListException(); - } - Node removed = head.next; - removeNode(head.next, head); - return removed.data; - } - - public Object removeLast() { - if (size() == 0) { - throw new EmptyListException(); - } - return remove(size() - 1); - } - - @Override - public Iterator iterator() { - return new Iterator() { - Node node = head; - @Override - public boolean hasNext() { - return node.next != null; - } - - @Override - public Object next() { - node = node.next; - return node.data; - } - }; - } - - private static class Node{ - Object data; - Node next; - } - - private Node findNode(int index) { - if (index == -1) { - return head; - } else { - checkIndex(index); - } - Node node = head.next; - for (int i = 0; i < index; ++i) { - node = node.next; - } - return node; - } - - private void checkIndex(int index) { - if (index >= size() || index < 0) { - throw new IndexOutOfBoundsException(indexOutOfBoundMessage(index)); - } - } - - private String indexOutOfBoundMessage(int index) { - return "index: " + index + ", size: " + size(); - } - - private void addNode(Node node, Node pre) { - node.next = pre.next; - pre.next = node; - size++; - } - - private void removeNode(Node node, Node pre) { - pre.next = node.next; - node.next = null; - size--; - } -} diff --git a/group01/895457260/code/src/datastructure/basic/List.java b/group01/895457260/code/src/datastructure/basic/List.java deleted file mode 100644 index 2f085701c5..0000000000 --- a/group01/895457260/code/src/datastructure/basic/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package datastructure.basic; - -public interface List { - void add(Object o); - void add(int index, Object o); - Object get(int index); - Object remove(int index); - int size(); - Iterator iterator(); -} diff --git a/group01/895457260/code/src/datastructure/basic/Queue.java b/group01/895457260/code/src/datastructure/basic/Queue.java deleted file mode 100644 index edd0a6a29e..0000000000 --- a/group01/895457260/code/src/datastructure/basic/Queue.java +++ /dev/null @@ -1,68 +0,0 @@ -package datastructure.basic; - -import datastructure.exception.EmptyQueueException; - -public class Queue { - //数组实现自增长的循环队列 - private Object[] array; - private int head = 0; - private int rear = 0; - - public Queue() { - this.array = new Object[10]; - } - - public Queue(int initCapacity) { - this.array = new Object[initCapacity]; - } - - public void enQueue(Object o) { - int target = mapIndex(rear); - autoGrow(); - array[target] = o; - rear++; - } - - public Object deQueue() { - if (isEmpty()) { - throw new EmptyQueueException(); - } - Object obj = array[mapIndex(head)]; - head++; - return obj; - } - - public boolean isEmpty() { - return head == rear; - } - - public int size() { - return rear - head; - } - - private int capacity() { - return array.length; - } - - private void autoGrow() { - if (size() >= capacity()) { - Object[] newArray = new Object[nextCapacity()]; - System.arraycopy(array, 0, newArray, 0, capacity()); - - int increase = nextCapacity() - capacity(); - int moveCount = size() - mapIndex(rear); - System.arraycopy(newArray, mapIndex(head), newArray, mapIndex(head) + increase, moveCount); - array = newArray; - head += increase; - rear += increase; - } - } - - private int nextCapacity() { - return capacity() * 2; - } - - private int mapIndex(int index) { - return index >= capacity() ? index % capacity() : index; - } -} diff --git a/group01/895457260/code/src/datastructure/basic/Stack.java b/group01/895457260/code/src/datastructure/basic/Stack.java deleted file mode 100644 index ab4fc874ae..0000000000 --- a/group01/895457260/code/src/datastructure/basic/Stack.java +++ /dev/null @@ -1,32 +0,0 @@ -package datastructure.basic; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - if (isEmpty()) { - throw new EmptyStackException(); - } - Object peek = peek(); - elementData.remove(elementData.size() - 1); - return peek; - } - - public Object peek() { - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return size() == 0; - } - - public int size() { - return elementData.size(); - } -} diff --git a/group01/895457260/code/src/datastructure/exception/EmptyListException.java b/group01/895457260/code/src/datastructure/exception/EmptyListException.java deleted file mode 100644 index 6f38ed6c43..0000000000 --- a/group01/895457260/code/src/datastructure/exception/EmptyListException.java +++ /dev/null @@ -1,8 +0,0 @@ -package datastructure.exception; - -/** - * Created by Haochen on 2017/2/24. - * TODO: - */ -public class EmptyListException extends RuntimeException { -} diff --git a/group01/895457260/code/src/datastructure/exception/EmptyQueueException.java b/group01/895457260/code/src/datastructure/exception/EmptyQueueException.java deleted file mode 100644 index 071a366ed8..0000000000 --- a/group01/895457260/code/src/datastructure/exception/EmptyQueueException.java +++ /dev/null @@ -1,7 +0,0 @@ -package datastructure.exception; - -/** - * Created by Haochen on 2017/2/24. - * TODO: - */ -public class EmptyQueueException extends RuntimeException {} diff --git a/group01/895457260/code/src/test/datastructure/basic/ArrayListTest.java b/group01/895457260/code/src/test/datastructure/basic/ArrayListTest.java deleted file mode 100644 index 42b9144d38..0000000000 --- a/group01/895457260/code/src/test/datastructure/basic/ArrayListTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package test.datastructure.basic; - -import datastructure.basic.ArrayList; -import datastructure.basic.Iterator; -import datastructure.basic.List; -import org.junit.Assert; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -/** - * ArrayList Tester. - * - * @author - * @version 1.0 - * @since
二月 24, 2017
- */ -public class ArrayListTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - protected final List getList() { - List list = createList(); - init(list); - return list; - } - - List createList() { - return new ArrayList(5); - } - - private void init(List list) { - for (int i = 1; i <= 5; ++i) { - list.add(i); - } - } - - protected final Object[] toArray(List list) { - Object[] array = new Object[list.size()]; - Iterator iterator = list.iterator(); - int pos = 0; - while (iterator.hasNext()) { - array[pos++] = iterator.next(); - } - return array; - } - - /** - * Method: add(Object o) - */ - @Test - public void testAddO() throws Exception { -//TODO: Test goes here... - List list = getList(); - for (int i = 6; i <= 10; ++i) { - list.add(i); - } - Assert.assertArrayEquals(toArray(list), new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); - Assert.assertEquals(list.size(), 10); - } - - /** - * Method: add(int index, Object o) - */ - @Test - public void testAddForIndexO() throws Exception { -//TODO: Test goes here... - List list = getList(); - int nowSize = list.size(); - int[] indexes = {nowSize + 1, -1, nowSize, nowSize, 0, 1}; - Object[] values = {0, 0, 300, 400, 100, 200}; - boolean[] exceptions = new boolean[indexes.length]; - for (int i = 0; i < indexes.length; ++i) { - try { - list.add(indexes[i], values[i]); - } catch (IndexOutOfBoundsException e) { - exceptions[i] = true; - } - } - Assert.assertArrayEquals(toArray(list), new Object[]{100, 200, 1, 2, 3, 4, 5, 400, 300}); - Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false}); - Assert.assertEquals(list.size(), nowSize + 4); - } - - /** - * Method: get(int index) - */ - @Test - public void testGet() throws Exception { -//TODO: Test goes here... - List list = getList(); - int nowSize = list.size(); - int[] indexes = {-1, nowSize, 0, 1, nowSize - 1, nowSize - 2}; - Object[] values = new Object[indexes.length]; - boolean[] exceptions = new boolean[indexes.length]; - for (int i = 0; i < indexes.length; ++i) { - try { - values[i] = list.get(indexes[i]); - } catch (IndexOutOfBoundsException e) { - exceptions[i] = true; - } - } - Assert.assertArrayEquals(values, new Object[]{null, null, 1, 2, 5, 4}); - Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false}); - Assert.assertEquals(list.size(), nowSize); - } - - /** - * Method: remove(int index) - */ - @Test - public void testRemove() throws Exception { -//TODO: Test goes here... - List list = getList(); - int nowSize = list.size(); - int[] indexes = {-1, nowSize, nowSize - 2, nowSize - 2, 1, 0}; - Object[] values = new Object[indexes.length]; - boolean[] exceptions = new boolean[indexes.length]; - for (int i = 0; i < indexes.length; ++i) { - try { - values[i] = list.remove(indexes[i]); - } catch (IndexOutOfBoundsException e) { - exceptions[i] = true; - } - } - Assert.assertArrayEquals(values, new Object[]{null, null, 4, 5, 2, 1}); - Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false}); - Assert.assertEquals(list.size(), nowSize - 4); - } - - /** - * Method: iterator() - */ - @Test - public void testIterator() throws Exception { -//TODO: Test goes here... - List list = getList(); - Iterator iterator = list.iterator(); - Object[] values = new Object[list.size()]; - int pos = 0; - while (iterator.hasNext()) { - values[pos++] = iterator.next(); - } - Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5}); - } -} diff --git a/group01/895457260/code/src/test/datastructure/basic/BinarySortedTreeTest.java b/group01/895457260/code/src/test/datastructure/basic/BinarySortedTreeTest.java deleted file mode 100644 index ce15d5622c..0000000000 --- a/group01/895457260/code/src/test/datastructure/basic/BinarySortedTreeTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package test.datastructure.basic; - -import datastructure.basic.BinarySortedTree; -import datastructure.basic.BinaryTreeNode; -import org.junit.Assert; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -/** - * BinarySortedTree Tester. - * - * @author - * @version 1.0 - * @since
二月 24, 2017
- */ -public class BinarySortedTreeTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - private BinarySortedTree getTree() { - return new BinarySortedTree<>(); - } - - /** - * Method: add(T o) - */ - @Test - public void testAdd() throws Exception { -//TODO: Test goes here... - BinarySortedTree tree = getTree(); - int[] addValues = {5, 3, 1, 7, 6, 4, 8}; - for (int i : addValues) { - tree.add(i); - } - - final Object[] left = new Object[addValues.length]; - final Object[] value = new Object[addValues.length]; - final Object[] right = new Object[addValues.length]; - tree.traverse(new BinarySortedTree.Visitor() { - int pos = 0; - @Override - public void visit(BinaryTreeNode node) { - left[pos] = node.getLeft() == null ? null : (int) node.getLeft().getData(); - value[pos] = node.getData(); - right[pos] = node.getRight() == null ? null : (int) node.getRight().getData(); - pos++; - } - }); - Assert.assertArrayEquals(left, new Object[]{null, 1, null, 3, null, 6, null}); - Assert.assertArrayEquals(value, new Object[]{1, 3, 4, 5, 6, 7, 8}); - Assert.assertArrayEquals(right, new Object[]{null, 4, null, 7, null, 8, null}); - } -} diff --git a/group01/895457260/code/src/test/datastructure/basic/LinkedListTest.java b/group01/895457260/code/src/test/datastructure/basic/LinkedListTest.java deleted file mode 100644 index 0ab03eb589..0000000000 --- a/group01/895457260/code/src/test/datastructure/basic/LinkedListTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package test.datastructure.basic; - -import datastructure.exception.EmptyListException; -import datastructure.basic.LinkedList; -import datastructure.basic.List; -import org.junit.Assert; -import org.junit.Test; - -/** - * LinkedList Tester. - * - * @author - * @version 1.0 - * @since
二月 24, 2017
- */ -public class LinkedListTest extends ArrayListTest { - - @Override - List createList() { - return new LinkedList(); - } - - /** - * Method: addFirst(Object o) - */ - @Test - public void testAddFirst() throws Exception { -//TODO: Test goes here... - LinkedList list = (LinkedList) getList(); - list.addFirst(100); - Assert.assertArrayEquals(toArray(list), new Object[]{100, 1, 2, 3, 4, 5}); - } - - /** - * Method: addLast(Object o) - */ - @Test - public void testAddLast() throws Exception { -//TODO: Test goes here... - LinkedList list = (LinkedList) getList(); - list.addLast(100); - Assert.assertArrayEquals(toArray(list), new Object[]{1, 2, 3, 4, 5, 100}); - } - - /** - * Method: removeFirst() - */ - @Test - public void testRemoveFirst() throws Exception { -//TODO: Test goes here... - LinkedList list = (LinkedList) getList(); - int count = list.size() + 2; - Object[] values = new Object[count]; - boolean[] exceptions = new boolean[count]; - for (int i = 0; i < count; ++i) { - try { - values[i] = list.removeFirst(); - } catch (EmptyListException e) { - exceptions[i] = true; - } - } - Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5, null, null}); - Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true}); - Assert.assertArrayEquals(toArray(list), new Object[0]); - } - - /** - * Method: removeLast() - */ - @Test - public void testRemoveLast() throws Exception { -//TODO: Test goes here... - LinkedList list = (LinkedList) getList(); - int count = list.size() + 2; - Object[] values = new Object[count]; - boolean[] exceptions = new boolean[count]; - for (int i = 0; i < count; ++i) { - try { - values[i] = list.removeLast(); - } catch (EmptyListException e) { - exceptions[i] = true; - } - } - Assert.assertArrayEquals(values, new Object[]{5, 4, 3, 2, 1, null, null}); - Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true}); - Assert.assertArrayEquals(toArray(list), new Object[0]); - } -} diff --git a/group01/895457260/code/src/test/datastructure/basic/QueueTest.java b/group01/895457260/code/src/test/datastructure/basic/QueueTest.java deleted file mode 100644 index df7587bd3c..0000000000 --- a/group01/895457260/code/src/test/datastructure/basic/QueueTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package test.datastructure.basic; - -import datastructure.exception.EmptyQueueException; -import datastructure.basic.Queue; -import org.junit.Assert; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * Queue Tester. - * - * @author - * @version 1.0 - * @since
二月 24, 2017
- */ -public class QueueTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - private Queue getQueue() { - Queue queue = new Queue(5); - for (int i = 1; i <= 5; ++i) { - queue.enQueue(i); - } - return queue; - } - - private void assertQueue(Queue queue, Object[] actual) { - Class clazz = Queue.class; - Object[] array = null; - int head = 0; - int rear = 0; - Method mapIndex = null; - try { - Field arrayField = clazz.getDeclaredField("array"); - Field headField = clazz.getDeclaredField("head"); - Field rearField = clazz.getDeclaredField("rear"); - mapIndex = clazz.getDeclaredMethod("mapIndex", int.class); - arrayField.setAccessible(true); - headField.setAccessible(true); - rearField.setAccessible(true); - mapIndex.setAccessible(true); - array = (Object[]) arrayField.get(queue); - head = (int) headField.get(queue); - rear = (int) rearField.get(queue); - } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) { - e.printStackTrace(); - } - int size = queue.size(); - Object[] excepted = new Object[size]; - int pos = 0; - try { - while (head < rear) { - excepted[pos++] = array[(int) mapIndex.invoke(queue, head)]; - head++; - } - } catch (IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - } - Assert.assertArrayEquals(excepted, actual); - } - - /** - * Method: enQueue(Object o) - */ - @Test - public void testEnQueue() throws Exception { -//TODO: Test goes here... - Queue queue = getQueue(); - for (int i = 6; i <= 10; ++i) { - queue.enQueue(i); - } - assertQueue(queue, new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); - } - - /** - * Method: deQueue() - */ - @Test - public void testDeQueue() throws Exception { -//TODO: Test goes here... - Queue queue = getQueue(); - int count = queue.size() + 2; - Object[] values = new Object[count]; - boolean[] exceptions = new boolean[count]; - for (int i = 0; i < count; ++i) { - try { - values[i] = queue.deQueue(); - } catch (EmptyQueueException e) { - exceptions[i] = true; - } - } - Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5, null, null}); - Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true}); - assertQueue(queue, new Object[0]); - } -} diff --git a/group01/895457260/code/src/test/datastructure/basic/StackTest.java b/group01/895457260/code/src/test/datastructure/basic/StackTest.java deleted file mode 100644 index ac2bd31a22..0000000000 --- a/group01/895457260/code/src/test/datastructure/basic/StackTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package test.datastructure.basic; - -import datastructure.basic.*; -import org.junit.Assert; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import java.lang.reflect.Field; -import java.util.EmptyStackException; - -/** - * Stack Tester. - * - * @author - * @version 1.0 - * @since
二月 24, 2017
- */ -public class StackTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - private Stack getStack() { - Stack stack = new Stack(); - for (int i = 1; i <= 5; ++i) { - stack.push(i); - } - return stack; - } - - private void assertStack(Stack stack, Object[] actual) { - Class clazz = Stack.class; - ArrayList elementData = null; - try { - Field field = clazz.getDeclaredField("elementData"); - field.setAccessible(true); - elementData = (ArrayList) field.get(stack); - } catch (NoSuchFieldException | IllegalAccessException e) { - e.printStackTrace(); - } - - Object[] excepted = null; - if (elementData != null) { - int size = stack.size(); - excepted = new Object[size]; - for (int i = 0; i < size; ++i) { - excepted[i] = elementData.get(i); - } - } - Assert.assertArrayEquals(excepted, actual); - } - - /** - * Method: push(Object o) - */ - @Test - public void testPush() throws Exception { -//TODO: Test goes here... - Stack stack = getStack(); - for (int i = 6; i <= 10; ++i) { - stack.push(i); - } - assertStack(stack, new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); - } - - /** - * Method: pop() - */ - @Test - public void testPop() throws Exception { -//TODO: Test goes here... - Stack stack = getStack(); - int count = stack.size() + 2; - Object[] values = new Object[count]; - boolean[] exceptions = new boolean[count]; - for (int i = 0; i < count; ++i) { - try { - values[i] = stack.pop(); - } catch (EmptyStackException e) { - exceptions[i] = true; - } - } - Assert.assertArrayEquals(values, new Object[]{5, 4, 3, 2, 1, null, null}); - Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true}); - assertStack(stack, new Object[0]); - } -} diff --git a/group01/895457260/code/src/test/datastructure/basic/TestSuite.java b/group01/895457260/code/src/test/datastructure/basic/TestSuite.java deleted file mode 100644 index f7c5868383..0000000000 --- a/group01/895457260/code/src/test/datastructure/basic/TestSuite.java +++ /dev/null @@ -1,13 +0,0 @@ -package test.datastructure.basic; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -/** - * Created by Haochen on 2017/2/24. - * TODO: - */ -@RunWith(Suite.class) -@Suite.SuiteClasses({ArrayListTest.class, LinkedListTest.class, - BinarySortedTreeTest.class, QueueTest.class, StackTest.class}) -public class TestSuite {} diff --git a/group01/932573198/20170220/.classpath b/group01/932573198/20170220/.classpath deleted file mode 100644 index b387714202..0000000000 --- a/group01/932573198/20170220/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group01/932573198/20170220/.gitignore b/group01/932573198/20170220/.gitignore deleted file mode 100644 index 65776c32fc..0000000000 --- a/group01/932573198/20170220/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ \ No newline at end of file diff --git a/group01/932573198/20170220/.project b/group01/932573198/20170220/.project deleted file mode 100644 index 82b0a5ccfd..0000000000 --- a/group01/932573198/20170220/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 20170220 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group01/932573198/20170220/.settings/org.eclipse.jdt.core.prefs b/group01/932573198/20170220/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a87..0000000000 --- a/group01/932573198/20170220/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group01/932573198/20170220/src/com/coding/basic/ArrayList.java b/group01/932573198/20170220/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 039e83f095..0000000000 --- a/group01/932573198/20170220/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[10]; - - /** - * 扩容 - */ - private void expansion() { - if (elementData.length <= size) - elementData = Arrays.copyOf(elementData, elementData.length * 3 / 2 + 1); - } - - /** - * 越界 - */ - private void outOfBoundsForAdd(int index) { - if (index > size || index < 0) - throw new IndexOutOfBoundsException("数组下标越界"); - } - - private void outOfBoundsForOther(int index) { - if (index >= size || index < 0) - throw new IndexOutOfBoundsException("数组下标越界"); - } - - public void add(Object o) { - expansion(); - elementData[size++] = o; - } - - public void add(int index, Object o) { - outOfBoundsForAdd(index); - expansion(); - for (int i = size - 1; i >= index; i--) { - elementData[i + 1] = elementData[i]; - } - elementData[index] = o; - size++; - } - - public Object get(int index) { - outOfBoundsForOther(index); - return elementData[index]; - } - - public Object remove(int index) { - outOfBoundsForOther(index); - Object re = elementData[index]; - for (int i = index; i < size - 1; i++) { - elementData[i] = elementData[i + 1]; - } - elementData[size - 1] = null; - size--; - return re; - } - - public int size() { - return size; - } - - @Override - public String toString() { - return Arrays.toString(elementData); - } - - public Iterator iterator() { - return new ArrayIterator(); - } - - private class ArrayIterator implements Iterator { - - int pos = -1; - - @Override - public boolean hasNext() { - return size > ++pos ? true : false; - } - - @Override - public Object next() { - return elementData[pos]; - } - - } - -} diff --git a/group01/932573198/20170220/src/com/coding/basic/BinaryTree.java b/group01/932573198/20170220/src/com/coding/basic/BinaryTree.java deleted file mode 100644 index 730d7e7b3a..0000000000 --- a/group01/932573198/20170220/src/com/coding/basic/BinaryTree.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.coding.basic; - -public class BinaryTree { - - private BinaryTreeNode tNode; - - @Override - public String toString() { - return tNode + ""; - } - - public void insert(Object o) { - tNode = insert(o, tNode); - } - - public BinaryTreeNode insert(Object o, BinaryTreeNode node) { - if (node == null) { - node = new BinaryTreeNode(o); - } else { - int result = o.toString().compareTo(node.getData().toString()); - if (result < 0) - node.setLeft(insert(o, node.getLeft())); - if (result > 0) - node.setRight(insert(o, node.getRight())); - } - return node; - } - - private static class BinaryTreeNode { - - private BinaryTreeNode left; - - private Object data; - - private BinaryTreeNode right; - - public BinaryTreeNode() { - } - - public BinaryTreeNode(Object data) { - this.left = null; - this.data = data; - this.right = null; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - @Override - public String toString() { - return "[" + left + ", " + data + ", " + right + "]"; - } - - } - -} diff --git a/group01/932573198/20170220/src/com/coding/basic/Iterator.java b/group01/932573198/20170220/src/com/coding/basic/Iterator.java deleted file mode 100644 index ff93e30377..0000000000 --- a/group01/932573198/20170220/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group01/932573198/20170220/src/com/coding/basic/LinkedList.java b/group01/932573198/20170220/src/com/coding/basic/LinkedList.java deleted file mode 100644 index db61384e4c..0000000000 --- a/group01/932573198/20170220/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private int size = 0; - - private Node head; - - - public Node getHead() { - return head; - } - - public LinkedList() { - this.head = new Node(); - } - - @Override - public String toString() { - return "[" + head + "]"; - } - - private void outOfBoundsForAdd(int index) { - if (index > size || index < 0) - throw new IndexOutOfBoundsException("数组下标越界"); - } - - private void outOfBoundsForOther(int index) { - if (index >= size || index < 0) - throw new IndexOutOfBoundsException("数组下标越界"); - } - - public void add(Object o) { - Node node = head; - while (node.next != null) { - node = node.next; - } - node.next = new Node(o); - size++; - } - - public void add(int index, Object o) { - outOfBoundsForAdd(index); - if(size == index) - add(o); - else{ - Node prevNode = head; - for (int i = 0; i < index; i++) { - prevNode = prevNode.next; - } - Node nextNode = prevNode.next; - Node node = new Node(o); - prevNode.next = node; - node.next = nextNode; - size++; - } - } - - public Object get(int index) { - outOfBoundsForOther(index); - Node node = head; - for (int i = 0; i <= index; i++) { - node = node.next; - } - return node.data; - } - - public Object remove(int index) { - outOfBoundsForOther(index); - Node prevNode = head; - for (int i = 0; i < index; i++) { - prevNode = prevNode.next; - } - Node node = prevNode.next; - prevNode.next = node.next; - size--; - return node.data; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node newNode = new Node(o); - Node node = head.next; - head.next = newNode; - newNode.next = node; - size++; - } - - public void addLast(Object o) { - Node node = head; - while (node.next != null) { - node = node.next; - } - node.next = new Node(o); - size++; - } - - private void noSuchEle() { - if (head.next == null) - throw new NoSuchElementException("没有这个元素"); - } - - public Object removeFirst() { - noSuchEle(); - Node node = head.next; - head.next = node.next; - size--; - return node.data; - } - - public Object removeLast() { - noSuchEle(); - Node node = head; - for(int i=0;i - - 4.0.0 - - com.aaront.execrise - coding2017 - 1.0.0-SNAPSHOT - jar - - - - UTF-8 - 1.8 - - - - - junit - junit - 4.12 - - - \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/ArrayList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/ArrayList.java deleted file mode 100644 index ae462ea905..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/ArrayList.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.aaront.exercise.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private static final double factor = 0.75; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - _ensureCapacityEnough(); - elementData[size++] = o; - } - - public void add(int index, Object o) { - if (index < 0 || index > size) throw new IndexOutOfBoundsException("index超出边界"); - _ensureCapacityEnough(); - int i = size; - for (; i > index; i--) { - elementData[i] = elementData[i - 1]; - } - elementData[i] = o; - size++; - } - - private void _ensureCapacityEnough() { - if (size >= elementData.length) { - dilatancy(); - } - } - - private void dilatancy() { - int newLength = elementData.length + (int) (elementData.length * factor); - elementData = Arrays.copyOf(elementData, newLength); - } - - public Object get(int index) { - if(index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界"); - return elementData[index]; - } - - public Object remove(int index) { - if (index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界"); - Object element = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - 1 - index); - size--; - return element; - - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new ArrayListIterator(this); - } - - public Object[] toArray() { - Object[] objects = new Object[size]; - System.arraycopy(elementData, 0, objects, 0, size); - return objects; - } - - private static class ArrayListIterator implements Iterator { - - private ArrayList arrayList; - private int pos = 0; - - private ArrayListIterator(ArrayList arrayList) { - this.arrayList = arrayList; - } - - public boolean hasNext() { - return pos < arrayList.size(); - } - - public Object next() { - return arrayList.elementData[pos++]; - } - - public void remove() { - arrayList.remove(pos - 1); - pos--; - } - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/BinaryTree.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/BinaryTree.java deleted file mode 100644 index 2c0d156561..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/BinaryTree.java +++ /dev/null @@ -1,235 +0,0 @@ -package com.aaront.exercise.basic; - -public class BinaryTree { - - private BinaryTreeNode head = new BinaryTreeNode(null); - private BinaryTreeNode root; - private int size; - private int index = 0; - - public static final int PREORDER = 0; - public static final int INORDER = 1; - public static final int POSTORDER = 2; - public static final int HIERARCHICAL = 3; - - public static final int RECURSION = 10; - public static final int ITERATION = 11; - - public void add(Integer o) { - BinaryTreeNode node = new BinaryTreeNode(o); - if (root == null) { - root = node; - head.setLeft(root); - } else { - insert(root, node); - } - size++; - } - - private void insert(BinaryTreeNode node, BinaryTreeNode newNode) { - // 要插入的节点插入当前节点的左子树 - if (node.getData() > newNode.getData()) { - if (node.getLeft() == null) { - node.setLeft(newNode); - } else { - insert(node.left, newNode); - } - } else { // 要插入的节点插入当前节点的右子树 - if (node.getRight() == null) { - node.setRight(newNode); - } else { - insert(node.right, newNode); - } - } - } - - public BinaryTreeNode search(int data) { - return search(data, ITERATION); - } - - public BinaryTreeNode search(int data, int method) { - switch (method) { - case RECURSION: - return findNodeRecursion(root, data); - case ITERATION: - return findNodeIteration(data); - default: - throw new IllegalArgumentException("不支持的查找方法"); - } - } - - private BinaryTreeNode findNodeRecursion(BinaryTreeNode node, int data) { - if (node == null) return null; - if (node.getData() == data) return node; - if (node.getData() > data) return findNodeRecursion(node.getLeft(), data); - return findNodeRecursion(node.getRight(), data); - } - - private BinaryTreeNode findNodeIteration(int data) { - BinaryTreeNode currentNode = root; - while (currentNode != null) { - if (currentNode.getData() == data) { - return currentNode; - } - if (currentNode.getData() > data) { - currentNode = currentNode.getLeft(); - } else { - currentNode = currentNode.getRight(); - } - } - return null; - } - - public BinaryTreeNode min() { - return findMin(root); - } - - private BinaryTreeNode findMin(BinaryTreeNode node) { - if (node == null) return null; - if (node.getLeft() == null) return node; - return findMin(node.getLeft()); - } - - public BinaryTreeNode max() { - return findMax(root); - } - - private BinaryTreeNode findMax(BinaryTreeNode node) { - if (node == null) return null; - if (node.getRight() == null) return node; - return findMax(node.getRight()); - } - - public void delete(Integer data) { - BinaryTreeNode node = search(data); - if (node == null) return; - BinaryTreeNode parentNode = searchParentNode(node); - if (parentNode == null) return; - // 删除叶子节点 - if (node.getLeft() == null && node.getRight() == null) { - if (parentNode.getLeft() == node) parentNode.setLeft(null); - else parentNode.setRight(null); - } else if (node.getLeft() != null && node.getRight() == null) { // 删除只有左子树的节点 - if (parentNode.getLeft() == node) parentNode.setLeft(node.getLeft()); - else parentNode.setRight(node.getLeft()); - } else if (node.getRight() != null && node.getLeft() == null) { // 删除只有右子树的节点 - if (parentNode.getLeft() == node) parentNode.setLeft(node.getRight()); - else parentNode.setRight(node.getRight()); - } else { // 删除有两个子树的节点 - BinaryTreeNode replace = findMin(node.getRight()); - BinaryTreeNode replaceParentNode = searchParentNode(replace); - replaceParentNode.setLeft(replace.getRight()); - node.setData(replace.getData()); - replace.setLeft(null); - replace.setRight(null); - } - size--; - } - - private BinaryTreeNode searchParentNode(BinaryTreeNode node) { - if (node == null) return null; - if (node == root) return head; - BinaryTreeNode current = root; - while (current != null) { - if (current.getLeft() == node || current.getRight() == node) return current; - if (current.getData().compareTo(node.getData()) > 0) current = current.getLeft(); - else current = current.getRight(); - } - return null; - } - - public int[] traversal() { - return traversal(PREORDER); - } - - public int[] traversal(int order) { - int[] datas = new int[size]; - if (order == PREORDER) { - preorderTraversal(root, datas); - } else if (order == INORDER) { - inorderTraversal(root, datas); - } else if (order == POSTORDER) { - postorderTraversal(root, datas); - } else { - hierarchicalTraversal(root, datas); - } - index = 0; - return datas; - } - - private void preorderTraversal(BinaryTreeNode node, int[] datas) { - if (node == null) { - return; - } - - datas[index++] = node.getData(); - preorderTraversal(node.getLeft(), datas); - preorderTraversal(node.getRight(), datas); - } - - private void inorderTraversal(BinaryTreeNode node, int[] datas) { - if (node == null) { - return; - } - - inorderTraversal(node.getLeft(), datas); - datas[index++] = node.getData(); - inorderTraversal(node.getRight(), datas); - } - - private void postorderTraversal(BinaryTreeNode node, int[] datas) { - if (node == null) { - return; - } - - postorderTraversal(node.getLeft(), datas); - postorderTraversal(node.getRight(), datas); - datas[index++] = node.getData(); - } - - private void hierarchicalTraversal(BinaryTreeNode node, int[] datas) { - if (node == null) return; - Queue queue = new Queue(); - queue.enQueue(node); - while (!queue.isEmpty()) { - BinaryTreeNode tmp = (BinaryTreeNode) queue.deQueue(); - datas[index++] = tmp.getData(); - if (tmp.getLeft() != null) queue.enQueue(tmp.getLeft()); - if (tmp.getRight() != null) queue.enQueue(tmp.getRight()); - } - } - - public class BinaryTreeNode { - private Integer data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Integer data) { - this.data = data; - } - - public Integer getData() { - return data; - } - - public void setData(Integer data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Iterator.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Iterator.java deleted file mode 100644 index e446dd8f65..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Iterator.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.aaront.exercise.basic; - -public interface Iterator { - boolean hasNext(); - - Object next(); - - void remove(); -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/LinkedList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/LinkedList.java deleted file mode 100644 index 504e73580b..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/LinkedList.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.aaront.exercise.basic; - -public class LinkedList implements List { - - private Node head = new Node(null); - private int size = 0; - - public void add(Object o) { - Node newNode = new Node(o); - Node first = head.next; - Node second = head; - while (first != null) { - second = first; - first = first.next; - } - second.next = newNode; - size++; - } - - public void add(int index, Object o) { - if (index < 0 || index > size) throw new IndexOutOfBoundsException("索引超出范围"); - Node first = head; - int i = 0; - while (i < index) { - first = first.next; - i++; - } - Node node = new Node(o); - node.next = first.next; - first.next = node; - size++; - } - - public Object get(int index) { - if (index < 0 || index >= size) throw new IndexOutOfBoundsException("索引超出范围"); - Node first = head.next; - int i = 0; - while (i < index) { - first = first.next; - i++; - } - return first.data; - } - - public Object remove(int index) { - if (index < 0 || index >= size) throw new IndexOutOfBoundsException("索引超出范围"); - Node first = head; - int i = 0; - while (i < index) { - first = first.next; - i++; - } - Node element = first.next; - first.next = first.next.next; - size--; - return element.data; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - add(0, o); - } - - public void addLast(Object o) { - add(size, o); - } - - public Object removeFirst() { - return remove(0); - } - - public Object removeLast() { - return remove(size - 1); - } - - public Iterator iterator() { - return new LinkedListIterator(this); - } - - public Object[] toArray() { - Object[] objects = new Object[size]; - Node first = head.next; - int pos = 0; - while (first!= null) { - objects[pos++] = first.data; - first = first.next; - } - return objects; - } - - private static class LinkedListIterator implements Iterator { - - private int pos = 0; - private LinkedList linkedList; - - private LinkedListIterator(LinkedList linkList) { - this.linkedList = linkList; - } - - @Override - public boolean hasNext() { - return pos < linkedList.size(); - } - - @Override - public Object next() { - return linkedList.get(pos++); - } - - @Override - public void remove() { - linkedList.remove(pos - 1); - pos--; - } - } - - - private static class Node { - private Object data; - private Node next; - - private Node(Object data) { - this.data = data; - } - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/List.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/List.java deleted file mode 100644 index 0988b60f4a..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.aaront.exercise.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Queue.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Queue.java deleted file mode 100644 index 7c310bca9e..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Queue.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.aaront.exercise.basic; - -public class Queue { - - private LinkedList linkedList = new LinkedList(); - - public void enQueue(Object o) { - linkedList.add(o); - } - - public Object deQueue() { - return linkedList.removeFirst(); - } - - public boolean isEmpty() { - return linkedList.size() == 0; - } - - public int size() { - return linkedList.size(); - } - - public Object[] toArray() { - return linkedList.toArray(); - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Stack.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Stack.java deleted file mode 100644 index 450d21ee89..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Stack.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.aaront.exercise.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - return elementData.remove(elementData.size() - 1); - } - - public Object peek() { - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } - - public Object[] toArray() { - return elementData.toArray(); - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericArrayList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericArrayList.java deleted file mode 100644 index a099746b55..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericArrayList.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.aaront.exercise.generic; - -import java.util.Arrays; - -public class GenericArrayList implements GenericList { - - private int size = 0; - - private static final double factor = 0.75; - - private Object[] elementData = new Object[100]; - - public void add(T o) { - _ensureCapacityEnough(); - elementData[size++] = o; - } - - public void add(int index, T o) { - if (index < 0 || index > size) throw new IndexOutOfBoundsException("index超出边界"); - _ensureCapacityEnough(); - int i = size; - for (; i > index; i--) { - elementData[i] = elementData[i - 1]; - } - elementData[i] = o; - size++; - } - - private void _ensureCapacityEnough() { - if (size >= elementData.length) { - dilatancy(); - } - } - - private void dilatancy() { - int newLength = elementData.length + (int) (elementData.length * factor); - elementData = Arrays.copyOf(elementData, newLength); - } - - public T get(int index) { - if(index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界"); - return (T) elementData[index]; - } - - public T remove(int index) { - if (index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界"); - Object element = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - 1 - index); - size--; - return (T) element; - - } - - public int size() { - return size; - } - - public GenericIterator iterator() { - return new ArrayListGenericIterator(this); - } - - public Object[] toArray() { - Object[] objects = new Object[size]; - System.arraycopy(elementData, 0, objects, 0, size); - return objects; - } - - public T[] toArray(T[] a) { - if (a.length < size) - // Make a new array of a's runtime type, but my contents: - return (T[]) Arrays.copyOf(elementData, size, a.getClass()); - System.arraycopy(elementData, 0, a, 0, size); - return a; - } - - private static class ArrayListGenericIterator implements GenericIterator { - - private GenericArrayList genericArrayList; - private int pos = 0; - - private ArrayListGenericIterator(GenericArrayList genericArrayList) { - this.genericArrayList = genericArrayList; - } - - public boolean hasNext() { - return pos < genericArrayList.size(); - } - - public T next() { - return (T) genericArrayList.elementData[pos++]; - } - - public void remove() { - genericArrayList.remove(pos - 1); - pos--; - } - } -} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java deleted file mode 100644 index e5cf3b439a..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java +++ /dev/null @@ -1,255 +0,0 @@ -package com.aaront.exercise.generic; - -import java.util.Arrays; - -public class GenericBinaryTree> { - - private BinaryTreeNode head = new BinaryTreeNode<>(null); - private BinaryTreeNode root; - private int size; - private int index = 0; - public static final int PREORDER = 0; - public static final int INORDER = 1; - public static final int POSTORDER = 2; - public static final int HIERARCHICAL = 3; - - public static final int RECURSION = 10; - public static final int ITERATION = 11; - - public void add(T o) { - BinaryTreeNode node = new BinaryTreeNode<>(o); - if (root == null) { - root = node; - head.setLeft(root); - } else { - insert(root, node); - } - size++; - } - - private void insert(BinaryTreeNode node, BinaryTreeNode newNode) { - // 要插入的节点插入当前节点的左子树 - if (node.getData().compareTo(newNode.getData()) > 0) { - if (node.getLeft() == null) { - node.setLeft(newNode); - } else { - insert(node.left, newNode); - } - } else { // 要插入的节点插入当前节点的右子树 - if (node.getRight() == null) { - node.setRight(newNode); - } else { - insert(node.right, newNode); - } - } - } - - public BinaryTreeNode search(T data) { - return search(data, ITERATION); - } - - public BinaryTreeNode search(T data, int method) { - switch (method) { - case RECURSION: - return findNodeRecursion(root, data); - case ITERATION: - return findNodeIteration(data); - default: - throw new IllegalArgumentException("不支持的查找方法"); - } - } - - private BinaryTreeNode findNodeRecursion(BinaryTreeNode node, T data) { - if (node == null) return null; - if (node.getData().compareTo(data) == 0) return node; - if (node.getData().compareTo(data) > 0) return findNodeRecursion(node.getLeft(), data); - return findNodeRecursion(node.getRight(), data); - } - - private BinaryTreeNode findNodeIteration(T data) { - BinaryTreeNode currentNode = root; - while (currentNode != null) { - if (currentNode.getData().compareTo(data) == 0) { - return currentNode; - } - if (currentNode.getData().compareTo(data) > 0) { - currentNode = currentNode.getLeft(); - } else { - currentNode = currentNode.getRight(); - } - } - return null; - } - - public BinaryTreeNode min() { - return findMin(root); - } - - private BinaryTreeNode findMin(BinaryTreeNode node) { - if (node == null) return null; - if (node.getLeft() == null) return node; - return findMin(node.getLeft()); - } - - public BinaryTreeNode max() { - return findMax(root); - } - - private BinaryTreeNode findMax(BinaryTreeNode node) { - if (node == null) return null; - if (node.getRight() == null) return node; - return findMax(node.getRight()); - } - - public void delete(T data) { - BinaryTreeNode node = search(data); - if (node == null) return; - BinaryTreeNode parentNode = searchParentNode(node); - if (parentNode == null) return; - // 删除叶子节点 - if (node.getLeft() == null && node.getRight() == null) { - if (parentNode.getLeft() == node) parentNode.setLeft(null); - else parentNode.setRight(null); - } else if (node.getLeft() != null && node.getRight() == null) { // 删除只有左子树的节点 - if (parentNode.getLeft() == node) parentNode.setLeft(node.getLeft()); - else parentNode.setRight(node.getLeft()); - } else if (node.getRight() != null && node.getLeft() == null) { // 删除只有右子树的节点 - if (parentNode.getLeft() == node) parentNode.setLeft(node.getRight()); - else parentNode.setRight(node.getRight()); - } else { // 删除有两个子树的节点 - BinaryTreeNode replace = findMin(node.getRight()); - BinaryTreeNode replaceParentNode = searchParentNode(replace); - replaceParentNode.setLeft(replace.getRight()); - node.setData(replace.getData()); - replace.setLeft(null); - replace.setRight(null); - } - size--; - } - - private BinaryTreeNode searchParentNode(BinaryTreeNode node) { - if (node == null) return null; - if (node == root) return head; - BinaryTreeNode current = root; - while (current != null) { - if (current.getLeft() == node || current.getRight() == node) return current; - if (current.getData().compareTo(node.getData()) > 0) current = current.getLeft(); - else current = current.getRight(); - } - return null; - } - - public Object[] traversal() { - return traversal(PREORDER); - } - - public T[] traversal(T[] a) { - Object[] elementData = traversal(PREORDER); - return toArray(elementData, a); - } - - public T[] traversal(int order, T[] a) { - Object[] elementData = traversal(order); - return toArray(elementData, a); - } - - private T[] toArray(Object[] elementData, T[] a) { - if (a.length < size) - // Make a new array of a's runtime type, but my contents: - return (T[]) Arrays.copyOf(elementData, size, a.getClass()); - System.arraycopy(elementData, 0, a, 0, size); - return a; - } - - public Object[] traversal(int order) { - Object[] datas = new Object[size]; - if (order == PREORDER) { - preorderTraversal(root, datas); - } else if (order == INORDER) { - inorderTraversal(root, datas); - } else if (order == POSTORDER) { - postorderTraversal(root, datas); - } else { - hierarchicalTraversal(root, datas); - } - index = 0; - return datas; - } - - private void preorderTraversal(BinaryTreeNode node, Object[] datas) { - if (node == null) { - return; - } - - datas[index++] = node.getData(); - preorderTraversal(node.getLeft(), datas); - preorderTraversal(node.getRight(), datas); - } - - private void inorderTraversal(BinaryTreeNode node, Object[] datas) { - if (node == null) { - return; - } - - inorderTraversal(node.getLeft(), datas); - datas[index++] = node.getData(); - inorderTraversal(node.getRight(), datas); - } - - private void postorderTraversal(BinaryTreeNode node, Object[] datas) { - if (node == null) { - return; - } - - postorderTraversal(node.getLeft(), datas); - postorderTraversal(node.getRight(), datas); - datas[index++] = node.getData(); - } - - private void hierarchicalTraversal(BinaryTreeNode node, Object[] datas) { - if (node == null) return; - GenericQueue> queue = new GenericQueue<>(); - queue.enQueue(node); - while (!queue.isEmpty()) { - BinaryTreeNode tmp = queue.deQueue(); - datas[index++] = tmp.getData(); - if (tmp.getLeft() != null) queue.enQueue(tmp.getLeft()); - if (tmp.getRight() != null) queue.enQueue(tmp.getRight()); - } - } - - - class BinaryTreeNode> { - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(T data) { - this.data = data; - } - - public T getData() { - return data; - } - - public void setData(T data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericIterator.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericIterator.java deleted file mode 100644 index 565114dce7..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericIterator.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.aaront.exercise.generic; - -public interface GenericIterator { - boolean hasNext(); - - T next(); - - void remove(); -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericLinkedList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericLinkedList.java deleted file mode 100644 index 7caf32eae1..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericLinkedList.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.aaront.exercise.generic; - -import java.util.Arrays; - -public class GenericLinkedList implements GenericList { - - private Node head = new Node<>(null); - private int size = 0; - - public void add(T o) { - Node newNode = new Node<>(o); - Node first = head.next; - Node second = head; - while (first != null) { - second = first; - first = first.next; - } - second.next = newNode; - size++; - } - - public void add(int index, T o) { - if (index < 0 || index > size) throw new IndexOutOfBoundsException("索引超出范围"); - Node first = head; - int i = 0; - while (i < index) { - first = first.next; - i++; - } - Node node = new Node<>(o); - node.next = first.next; - first.next = node; - size++; - } - - public T get(int index) { - if (index < 0 || index >= size) throw new IndexOutOfBoundsException("索引超出范围"); - Node first = head.next; - int i = 0; - while (i < index) { - first = first.next; - i++; - } - return first.data; - } - - public T remove(int index) { - if (index < 0 || index >= size) throw new IndexOutOfBoundsException("索引超出范围"); - Node first = head; - int i = 0; - while (i < index) { - first = first.next; - i++; - } - Node element = first.next; - first.next = first.next.next; - size--; - return element.data; - } - - public int size() { - return size; - } - - public void addFirst(T o) { - add(0, o); - } - - public void addLast(T o) { - add(size, o); - } - - public T removeFirst() { - return remove(0); - } - - public T removeLast() { - return remove(size - 1); - } - - public GenericIterator iterator() { - return new LinkedListGenericIterator<>(this); - } - - public Object[] toArray() { - Object[] objects = new Object[size]; - Node first = head.next; - int pos = 0; - while (first != null) { - objects[pos++] = first.data; - first = first.next; - } - return objects; - } - - public T[] toArray(T[] a) { - Object[] elementData = toArray(); - if (a.length < size) - // Make a new array of a's runtime type, but my contents: - return (T[]) Arrays.copyOf(elementData, size, a.getClass()); - System.arraycopy(elementData, 0, a, 0, size); - return a; - } - - private static class LinkedListGenericIterator implements GenericIterator { - - private int pos = 0; - private GenericLinkedList genericLinkedList; - - private LinkedListGenericIterator(GenericLinkedList linkList) { - this.genericLinkedList = linkList; - } - - @Override - public boolean hasNext() { - return pos < genericLinkedList.size(); - } - - @Override - public T next() { - return genericLinkedList.get(pos++); - } - - @Override - public void remove() { - genericLinkedList.remove(pos - 1); - pos--; - } - } - - - private static class Node { - private T data; - private Node next; - - private Node(T data) { - this.data = data; - } - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericList.java deleted file mode 100644 index 94dc9f8a98..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericList.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.aaront.exercise.generic; - -public interface GenericList { - public void add(T o); - public void add(int index, T o); - public T get(int index); - public T remove(int index); - public int size(); -} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericQueue.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericQueue.java deleted file mode 100644 index d5cf5681e5..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericQueue.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.aaront.exercise.generic; - -public class GenericQueue { - - private GenericLinkedList linkedList = new GenericLinkedList<>(); - - public void enQueue(T o) { - linkedList.add(o); - } - - public T deQueue() { - return linkedList.removeFirst(); - } - - public boolean isEmpty() { - return linkedList.size() == 0; - } - - public int size() { - return linkedList.size(); - } - - public Object[] toArray() { - return linkedList.toArray(); - } - - public T[] toArray(T[] a) { - return linkedList.toArray(a); - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericStack.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericStack.java deleted file mode 100644 index 9efb2f2220..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericStack.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.aaront.exercise.generic; - -public class GenericStack { - private GenericArrayList elementData = new GenericArrayList<>(); - - public void push(T o) { - elementData.add(o); - } - - public T pop() { - return elementData.remove(elementData.size() - 1); - } - - public T peek() { - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } - - public Object[] toArray() { - return elementData.toArray(); - } - - public T[] toArray(T[] a) { - return elementData.toArray(a); - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/AllTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/AllTest.java deleted file mode 100644 index ebff633b23..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/AllTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.aaront.execrise.basic; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -/** - * @author tonyhui - * @since 17/2/21 - */ -@RunWith(Suite.class) -@Suite.SuiteClasses({ - ArrayListTest.class, - BinaryTreeTest.class, - LinkListTest.class, - QueueTest.class, - StackTest.class -}) -public class AllTest { -} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java deleted file mode 100644 index dcc45d792e..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.aaront.execrise.basic; - -import com.aaront.exercise.basic.ArrayList; -import com.aaront.exercise.basic.Iterator; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author tonyhui - * @since 17/2/20 - */ -public class ArrayListTest { - - private ArrayList arrayList = new ArrayList(); - - @Before - public void init() { - arrayList.add(1); - arrayList.add(2); - arrayList.add(3); - } - - @Test - public void testAdd() { - Assert.assertEquals(arrayList.get(0), 1); - Assert.assertEquals(arrayList.get(1), 2); - Assert.assertEquals(arrayList.get(2), 3); - Assert.assertEquals(arrayList.size(), 3); - } - - @Test - public void testAddIndex() { - arrayList.add(1, 4); - arrayList.add(2, 5); - Assert.assertArrayEquals(arrayList.toArray(), new Object[]{1, 4, 5, 2, 3}); - } - - @Test - public void testToArray() { - Assert.assertArrayEquals(arrayList.toArray(), new Object[]{1, 2, 3}); - } - - @Test - public void testGet() { - Assert.assertEquals(arrayList.get(2), 3); - Assert.assertEquals(arrayList.get(0), 1); - Assert.assertEquals(arrayList.get(1), 2); - } - - @Test - public void testRemove() { - testAddIndex(); - arrayList.remove(2); - arrayList.add(4, 10); - arrayList.add(3, 9); - Assert.assertArrayEquals(arrayList.toArray(), new Object[]{1, 4, 2, 9, 3, 10}); - } - - @Test - public void testIterator() { - Iterator iterator = arrayList.iterator(); - while (iterator.hasNext()) { - iterator.next(); - iterator.remove(); - } - Assert.assertArrayEquals(arrayList.toArray(), new Object[]{}); - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java deleted file mode 100644 index 11fb7ad66b..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.aaront.execrise.basic; - -import com.aaront.exercise.basic.BinaryTree; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author tonyhui - * @since 17/2/20 - */ -public class BinaryTreeTest { - - private BinaryTree binaryTree = null; - - @Before - public void init() { - int[] datas = new int[]{9, 4, 5, 7, 1, 2, 3, 10, 17, 9}; - binaryTree = new BinaryTree(); - for (int data : datas) { - binaryTree.add(data); - } - } - - - @Test - public void testAdd() { - int[] preorderDatas = binaryTree.traversal(BinaryTree.PREORDER); - Assert.assertArrayEquals(preorderDatas, new int[]{9, 4, 1, 2, 3, 5, 7, 10, 9, 17}); - int[] inorderDatas = binaryTree.traversal(BinaryTree.INORDER); - Assert.assertArrayEquals(inorderDatas, new int[]{1, 2, 3, 4, 5, 7, 9, 9, 10, 17}); - int[] postorderDatas = binaryTree.traversal(BinaryTree.POSTORDER); - Assert.assertArrayEquals(postorderDatas, new int[]{3, 2, 1, 7, 5, 4, 9, 17, 10, 9}); - int[] hierarchicalDatas = binaryTree.traversal(BinaryTree.HIERARCHICAL); - Assert.assertArrayEquals(hierarchicalDatas, new int[]{9, 4, 10, 1, 5, 9, 17, 2, 7, 3}); - } - - @Test - public void testSearch() { - BinaryTree.BinaryTreeNode node1 = binaryTree.search(5, BinaryTree.RECURSION); - Assert.assertTrue(node1.getData() == 5); - BinaryTree.BinaryTreeNode node2 = binaryTree.search(17, BinaryTree.RECURSION); - Assert.assertTrue(node2.getData() == 17); - BinaryTree.BinaryTreeNode node3 = binaryTree.search(100, BinaryTree.RECURSION); - Assert.assertTrue(node3 == null); - } - - @Test - public void testMin() { - BinaryTree.BinaryTreeNode min = binaryTree.min(); - Assert.assertTrue(min.getData() == 1); - } - - @Test - public void testMax() { - BinaryTree.BinaryTreeNode max = binaryTree.max(); - Assert.assertTrue(max.getData() == 17); - } - - @Test - public void testDelete() { - buildTree(new int[]{50, 25, 12, 11, 40, 14, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88}); - // 删除叶子节点 - binaryTree.delete(11); - int[] preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88}); - binaryTree.delete(88); - preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82}); - - // 删除一个子节点的节点 - binaryTree.delete(70); - preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 80, 85, 82}); - binaryTree.delete(80); - preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 85, 82}); - - // 删除两个子节点的节点 - binaryTree.delete(40); - preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new int[]{50, 25, 12, 14, 42, 35, 45, 44, 43, 75, 55, 60, 65, 63, 61, 90, 85, 82}); - binaryTree.delete(50); - preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new int[]{55, 25, 12, 14, 42, 35, 45, 44, 43, 75, 60, 65, 63, 61, 90, 85, 82}); - } - - private void buildTree(int[] datas) { - binaryTree = new BinaryTree(); - for (int data : datas) { - binaryTree.add(data); - } - } -} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java deleted file mode 100644 index b690c69c94..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.aaront.execrise.basic; - -import com.aaront.exercise.basic.Iterator; -import com.aaront.exercise.basic.LinkedList; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author tonyhui - * @since 17/2/21 - */ -public class LinkListTest { - - private LinkedList linkedList = new LinkedList(); - - @Before - public void init() { - linkedList.add(1); - linkedList.add(2); - linkedList.add(3); - } - - @Test - public void testAdd() { - Assert.assertArrayEquals(linkedList.toArray(), new Object[]{1, 2, 3}); - } - - @Test - public void testAddIndex() { - linkedList.add(1, 10); - linkedList.add(0, 8); - Assert.assertArrayEquals(linkedList.toArray(), new Object[]{8, 1, 10, 2, 3}); - } - - @Test - public void testAddFirst() { - linkedList.addFirst(-1); - Assert.assertArrayEquals(linkedList.toArray(), new Object[]{-1, 1, 2, 3}); - } - - @Test - public void testAddLast() { - linkedList.addLast(99); - Assert.assertArrayEquals(linkedList.toArray(), new Object[]{1, 2, 3, 99}); - } - - @Test - public void testRemove() { - testAddIndex(); - linkedList.remove(1); - linkedList.remove(2); - linkedList.add(3, 3); - linkedList.add(1, 2); - Assert.assertArrayEquals(linkedList.toArray(), new Object[]{8, 2, 10, 3, 3}); - } - - @Test - public void testRemoveFirst() { - linkedList.removeFirst(); - linkedList.removeFirst(); - Assert.assertArrayEquals(linkedList.toArray(), new Object[]{3}); - } - - @Test - public void testRemoveLast() { - linkedList.removeLast(); - linkedList.removeLast(); - Assert.assertArrayEquals(linkedList.toArray(), new Object[]{1}); - } - - @Test - public void testIterator() { - Iterator iterator = linkedList.iterator(); - while (iterator.hasNext()) { - iterator.next(); - iterator.remove(); - } - Assert.assertArrayEquals(linkedList.toArray(), new Object[]{}); - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java deleted file mode 100644 index 0035a353ec..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.aaront.execrise.basic; - -import com.aaront.exercise.basic.Queue; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author tonyhui - * @since 17/2/21 - */ -public class QueueTest { - private Queue queue = new Queue(); - - @Before - public void init() { - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - } - - @Test - public void testEnqueue() { - Assert.assertArrayEquals(queue.toArray(), new Object[]{1, 2, 3}); - } - - @Test - public void testDequeue() { - queue.deQueue(); - queue.deQueue(); - Assert.assertArrayEquals(queue.toArray(), new Object[]{3}); - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java deleted file mode 100644 index 3add6bcfdf..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.aaront.execrise.basic; - -import com.aaront.exercise.basic.Stack; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author tonyhui - * @since 17/2/21 - */ -public class StackTest { - - private Stack stack = new Stack(); - - @Before - public void init() { - stack.push(1); - stack.push(2); - stack.push(3); - } - - @Test - public void testPush() { - Assert.assertArrayEquals(stack.toArray(), new Object[]{1, 2, 3}); - } - - @Test - public void testPop() { - Object element1 = stack.pop(); - Assert.assertEquals(element1, 3); - Object element2 = stack.pop(); - Assert.assertEquals(element2, 2); - Assert.assertArrayEquals(stack.toArray(), new Object[]{1}); - } - - @Test - public void testPeek() { - Object element1 = stack.peek(); - Assert.assertEquals(element1, 3); - Object element2 = stack.peek(); - Assert.assertEquals(element2, 3); - Assert.assertArrayEquals(stack.toArray(), new Object[]{1, 2, 3}); - } - -} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericAllTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericAllTest.java deleted file mode 100644 index 66c071cf5c..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericAllTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.aaront.execrise.generic; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -/** - * @author tonyhui - * @since 17/2/22 - */ -@RunWith(Suite.class) -@Suite.SuiteClasses({ - GenericArrayListTest.class, - GenericLinkedListTest.class, - GenericQueueTest.class, - GenericStackTest.class, - GenericBinaryTreeTest.class -}) -public class GenericAllTest { -} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java deleted file mode 100644 index 8f97cbd3ea..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.aaront.execrise.generic; - -import com.aaront.exercise.generic.GenericArrayList; -import com.aaront.exercise.generic.GenericIterator; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author tonyhui - * @since 17/2/22 - */ -public class GenericArrayListTest { - - private GenericArrayList arrayList = new GenericArrayList<>(); - - @Before - public void init() { - arrayList.add("1"); - arrayList.add("2"); - arrayList.add("3"); - } - - - @Test - public void testAdd() { - Assert.assertEquals(arrayList.get(0), "1"); - Assert.assertEquals(arrayList.get(1), "2"); - Assert.assertEquals(arrayList.get(2), "3"); - Assert.assertEquals(arrayList.size(), 3); - } - - @Test - public void testAddIndex() { - arrayList.add(1, "4"); - arrayList.add(2, "5"); - Assert.assertArrayEquals(arrayList.toArray(), new String[]{"1", "4", "5", "2", "3"}); - } - - @Test - public void testToArray() { - Assert.assertArrayEquals(arrayList.toArray(), new String[]{"1", "2", "3"}); - } - - @Test - public void testToGenericArray() { - Assert.assertArrayEquals(arrayList.toArray(new String[0]), new String[]{"1", "2", "3"}); - } - - @Test - public void testGet() { - Assert.assertEquals(arrayList.get(2), "3"); - Assert.assertEquals(arrayList.get(0), "1"); - Assert.assertEquals(arrayList.get(1), "2"); - } - - @Test - public void testRemove() { - testAddIndex(); - arrayList.remove(2); - arrayList.add(4, "10"); - arrayList.add(3, "9"); - Assert.assertArrayEquals(arrayList.toArray(), new String[]{"1", "4", "2", "9", "3", "10"}); - } - - @Test - public void testIterator() { - GenericIterator genericIterator = arrayList.iterator(); - while (genericIterator.hasNext()) { - genericIterator.next(); - genericIterator.remove(); - } - Assert.assertArrayEquals(arrayList.toArray(), new String[]{}); - } - -} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java deleted file mode 100644 index 41adbf6706..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.aaront.execrise.generic; - -import com.aaront.exercise.generic.GenericBinaryTree; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author tonyhui - * @since 17/2/20 - */ -public class GenericBinaryTreeTest { - - @Before - public void init() { - String[] datas = new String[]{"9", "4", "5", "7", "1", "2", "3", "10", "17", "9"}; - GenericBinaryTree binaryTree = new GenericBinaryTree<>(); - for (String data : datas) { - binaryTree.add(data); - } - } - - @Test - public void testAdd() { - String[] datas = new String[]{"9", "4", "5", "7", "1", "2", "3", "10", "17", "9"}; - GenericBinaryTree binaryTree = new GenericBinaryTree<>(); - for (String data : datas) { - binaryTree.add(data); - } - String[] preorderDatas = binaryTree.traversal(GenericBinaryTree.PREORDER, new String[0]); - Assert.assertArrayEquals(preorderDatas, new String[]{"9", "4", "1", "2", "10", "17", "3", "5", "7", "9" }); - String[] inorderDatas = binaryTree.traversal(GenericBinaryTree.INORDER, new String[0]); - Assert.assertArrayEquals(inorderDatas, new String[]{"1", "10", "17", "2", "3", "4", "5", "7", "9", "9" }); - String[] postorderDatas = binaryTree.traversal(GenericBinaryTree.POSTORDER, new String[0]); - Assert.assertArrayEquals(postorderDatas, new String[]{"17", "10", "3", "2", "1", "7", "5", "4", "9", "9" }); - String[] hierarchicalDatas = binaryTree.traversal(GenericBinaryTree.HIERARCHICAL, new String[0]); - Assert.assertArrayEquals(hierarchicalDatas, new String[]{"9", "4", "9", "1", "5", "2", "7", "10", "3", "17" }); - } - - @Test - public void testDelete() { - GenericBinaryTree binaryTree = buildTree(new int[]{50, 25, 12, 11, 40, 14, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88}); - // 删除叶子节点 - binaryTree.delete(11); - Object[] preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88}); - binaryTree.delete(88); - preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82}); - - // 删除一个子节点的节点 - binaryTree.delete(70); - preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 80, 85, 82}); - binaryTree.delete(80); - preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 85, 82}); - - // 删除两个子节点的节点 - binaryTree.delete(40); - preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new Object[]{50, 25, 12, 14, 42, 35, 45, 44, 43, 75, 55, 60, 65, 63, 61, 90, 85, 82}); - binaryTree.delete(50); - preOrderDatas = binaryTree.traversal(); - Assert.assertArrayEquals(preOrderDatas, new Object[]{55, 25, 12, 14, 42, 35, 45, 44, 43, 75, 60, 65, 63, 61, 90, 85, 82}); - } - - private GenericBinaryTree buildTree(int[] datas) { - GenericBinaryTree binaryTree = new GenericBinaryTree<>(); - for (int data : datas) { - binaryTree.add(data); - } - return binaryTree; - } -} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java deleted file mode 100644 index 513119fa6e..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.aaront.execrise.generic; - -import com.aaront.exercise.generic.GenericLinkedList; -import com.aaront.exercise.generic.GenericIterator; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author tonyhui - * @since 17/2/22 - */ -public class GenericLinkedListTest { - private GenericLinkedList linkedList = new GenericLinkedList<>(); - - @Before - public void init() { - linkedList.add("1"); - linkedList.add("2"); - linkedList.add("3"); - } - - @Test - public void testAdd() { - Assert.assertArrayEquals(linkedList.toArray(), new String[]{"1", "2", "3"}); - } - - @Test - public void testAddIndex() { - linkedList.add(1, "10"); - linkedList.add(0, "8"); - Assert.assertArrayEquals(linkedList.toArray(), new String[]{"8", "1", "10", "2", "3"}); - } - - @Test - public void testAddFirst() { - linkedList.addFirst("-1"); - Assert.assertArrayEquals(linkedList.toArray(), new String[]{"-1", "1", "2", "3"}); - } - - @Test - public void testAddLast() { - linkedList.addLast("99"); - Assert.assertArrayEquals(linkedList.toArray(), new String[]{"1", "2", "3", "99"}); - } - - @Test - public void testRemove() { - testAddIndex(); - linkedList.remove(1); - linkedList.remove(2); - linkedList.add(3, "3"); - linkedList.add(1, "2"); - Assert.assertArrayEquals(linkedList.toArray(), new String[]{"8", "2", "10", "3", "3"}); - } - - @Test - public void testRemoveFirst() { - linkedList.removeFirst(); - linkedList.removeFirst(); - Assert.assertArrayEquals(linkedList.toArray(), new String[]{"3"}); - } - - @Test - public void testRemoveLast() { - linkedList.removeLast(); - linkedList.removeLast(); - Assert.assertArrayEquals(linkedList.toArray(), new String[]{"1"}); - } - - @Test - public void testToArray() { - Assert.assertArrayEquals(linkedList.toArray(), new String[]{"1", "2", "3"}); - } - - @Test - public void testToGenericArray() { - Assert.assertArrayEquals(linkedList.toArray(new String[0]), new String[]{"1", "2", "3"}); - } - - @Test - public void testIterator() { - GenericIterator genericIterator = linkedList.iterator(); - while (genericIterator.hasNext()) { - genericIterator.next(); - genericIterator.remove(); - } - Assert.assertArrayEquals(linkedList.toArray(), new String[]{}); - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java deleted file mode 100644 index 6b33a4b3e0..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.aaront.execrise.generic; - -import com.aaront.exercise.generic.GenericQueue; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author tonyhui - * @since 17/2/21 - */ -public class GenericQueueTest { - private GenericQueue queue = new GenericQueue<>(); - - @Before - public void init() { - queue.enQueue("1"); - queue.enQueue("2"); - queue.enQueue("3"); - } - - @Test - public void testEnqueue() { - Assert.assertArrayEquals(queue.toArray(), new String[]{"1", "2", "3"}); - } - - @Test - public void testDequeue() { - queue.deQueue(); - queue.deQueue(); - Assert.assertArrayEquals(queue.toArray(), new String[]{"3"}); - } -} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java deleted file mode 100644 index 0b4b587704..0000000000 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.aaront.execrise.generic; - -import com.aaront.exercise.generic.GenericStack; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @author tonyhui - * @since 17/2/21 - */ -public class GenericStackTest { - - private GenericStack stack = new GenericStack<>(); - - @Before - public void init() { - stack.push("1"); - stack.push("2"); - stack.push("3"); - } - - @Test - public void testPush() { - Assert.assertArrayEquals(stack.toArray(), new String[]{"1", "2", "3"}); - } - - @Test - public void testPop() { - String element1 = stack.pop(); - Assert.assertEquals(element1, "3"); - String element2 = stack.pop(); - Assert.assertEquals(element2, "2"); - Assert.assertArrayEquals(stack.toArray(), new String[]{"1"}); - } - - @Test - public void testPeek() { - String element1 = stack.peek(); - Assert.assertEquals(element1, "3"); - String element2 = stack.peek(); - Assert.assertEquals(element2, "3"); - Assert.assertArrayEquals(stack.toArray(), new String[]{"1", "2", "3"}); - } - -} diff --git a/group01/group01.md b/group01/group01.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group01/group01.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/ArrayList.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/ArrayList.java deleted file mode 100644 index 59ca0d34ee..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.github.Ven13.coding2017.basic; - -public class ArrayList implements List { - - //ؼϴС - private int size = 0; - - //ȸһΪ10 - Object[] elementData = new Object[100]; - - @Override - //̬Ԫ - public void add(Object o) { - //жǷ - if(size == elementData.length) { - Object[] newObjects = new Object[elementData.length * 2]; - System.arraycopy(elementData, 0, newObjects, 0, elementData.length); - elementData = newObjects; - } - - //ΪӵԪָ± - elementData[size] = o; - size++; - } - - @Override - public void add(int index, Object o) { - //жǷ - if(size == elementData.length) { - Object[] newObjects = elementData; - this.elementData = new Object[elementData.length * 2]; - for(int j = 0; j < newObjects.length; j++) { - this.elementData[j] = newObjects[j]; - } - } - - for(int i = size - 1; i >= index; i--) { - elementData[i+1] = elementData[i]; - } - - elementData[index] = o; - size++; - } - - @Override - public Object get(int index) { - return elementData[index]; - } - - @Override - public Object remove(int index) { - if (index > size) { - return null; - }; - - int moveSize = size - index - 1; - - if (moveSize > 0) { - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - } - elementData[--size] = null; - - //for(int i = index; i < elementData.length; i++) { - // elementData[i] = elementData[i+1]; - //} - - return elementData; - } - - @Override - public int size() { - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator { - - private int currentIndex = 0; - - @Override - public boolean hasNext() { - if(currentIndex >= size) return false; - else return true; - } - - @Override - public Object next() { - Object o = elementData[currentIndex]; - currentIndex ++; - return o; - } - } - -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/BinaryTreeNode.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index 354b2ba7a0..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.github.Ven13.coding2017.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Iterator.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Iterator.java deleted file mode 100644 index 3cf6540e5e..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.Ven13.coding2017.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/LinkedList.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/LinkedList.java deleted file mode 100644 index adf30d89c2..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.github.Ven13.coding2017.basic; - -public class LinkedList implements List { - - //ʾij - private int size; - - //ͷԪ - private Node head; - //βԪ - private Node tail; - - //ʹڲʵÿһڵ㣬ÿڵһָһԪصnextԼdata - private static class Node { - public Object data; - public Node next; - - public Node(Object data) { - this.data = data; - } - } - - //Ĺ췽 - public LinkedList() { - } - - @Override - public void add(Object o) { - add(size, o); - } - - @Override - public void add(int index, Object o) { - if(index == 0) { - addFirst(o); - } else { - if(index >= size) { - addLast(o); - } else { - Node node = head; - for (int i = 1; i < index; i++) { - head = head.next; - } - Node nextNode = node.next; - Node temp = new Node(o); - node.next = temp; - temp.next = nextNode; - size++; - } - } - } - - //ǰ - public void addFirst(Object o) { - Node newNode = new Node(o); - newNode.next = head; - head = newNode; - size++; - if(tail == null) { - tail = head; - } - } - - //Ӻ - public void addLast(Object o) { - if(tail == null) { - tail = head = new Node(o); - } else { - Node newNode = new Node(o); - tail.next = newNode; - tail = tail.next; - } - size++; - } - - - @Override - public Object get(int index) { - Node node = head; - for(int i = 0; i < index; i++) { - node = node.next; - } - return node.data; - } - - @Override - public Object remove(int index) { - if(size == 0) { - throw new java.util.NoSuchElementException(); - } - if(index == 0) { - Node node = head; - Node temp = node.next; - head = temp; - size--; - return node.data; - } else { - if(index >= size) { - throw new java.util.NoSuchElementException(); - } else { - Node node = head; - for(int i = 1; i < index; i++) { - node = node.next; - } - Node temp = node.next; - node.next = temp.next; - size--; - return node.data; - } - } - - } - - @Override - public int size() { - return size; - } - - public Object removeFirst() { - //ͨͷָ봴ͷڵ - Node hNode = head; - if (hNode == null) { - throw new java.util.NoSuchElementException(); - } - Node nNode = hNode.next; - Object element = hNode.data; - - //Ƴ - hNode.data = null; - hNode.next = null; - head = nNode; - //жǷΪβڵ - if (nNode == null) { - tail = null; - }else { - nNode = null; - } - size --; - return element; - } - - public Object removeLast() { - return remove(size - 1); - } - - public Iterator iterator() { - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator { - - private Node node = head.next; - - @Override - public boolean hasNext() { - return node != tail; - } - - @Override - public Object next() { - - if(!hasNext()) { - throw new java.util.NoSuchElementException(); - } - Object nextData = node.data; - node = node.next; - return nextData; - } - - } - - -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/List.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/List.java deleted file mode 100644 index 02e4297a33..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/List.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.Ven13.coding2017.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - - public Iterator iterator(); -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Queue.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Queue.java deleted file mode 100644 index 112299b5e9..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Queue.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.Ven13.coding2017.basic; - -public class Queue { - - private LinkedList list = new LinkedList(); - private int size = 0; - - public void enQueue(Object o){ - size++; - list.addLast(o); - } - - public Object deQueue(){ - size--; - return list.removeFirst(); - } - - public boolean isEmpty(){ - if(size == 0) { - return true; - } else { - return false; - } - } - - public int size(){ - return size; - } - -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Stack.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Stack.java deleted file mode 100644 index c0a2658bb3..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Stack.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.Ven13.coding2017.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - - elementData.add(o); - } - - public Object pop(){ - Object o = null; - if(elementData.size() > 0) { - o = elementData.get(elementData.size() - 1); - elementData.remove(elementData.size() - 1); - } - return o; - } - - public Object peek(){ - return elementData.get(0); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } - -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ArrayListTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ArrayListTest.java deleted file mode 100644 index 7f3f179f3b..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ArrayListTest.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.Ven13.coding2017.basic.test; - -import org.junit.Before; - -import com.github.Ven13.coding2017.basic.*; - -public class ArrayListTest extends ListTest{ - - - -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/LinkedListTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/LinkedListTest.java deleted file mode 100644 index c6bc65698c..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/LinkedListTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.github.Ven13.coding2017.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.github.Ven13.coding2017.basic.ArrayList; -import com.github.Ven13.coding2017.basic.LinkedList; -import com.github.Ven13.coding2017.basic.List; - -public class LinkedListTest extends ListTest { - -private LinkedList aLinkedList; - - @Before - public void setUpLinkedList() { - List aList = new ArrayList(); - aList = new LinkedList(); - aLinkedList = new LinkedList(); - } - - @Test - public void testAddFirst() { - aLinkedList.addFirst(5); - assertEquals(5, aLinkedList.get(0)); - - aLinkedList.addFirst(6); - assertEquals(6, aLinkedList.get(0)); - assertEquals(5, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - - @Test - public void testAddLast() { - aLinkedList.addLast("hello"); - assertEquals("hello", aLinkedList.get(0)); - - aLinkedList.addLast("world"); - assertEquals("hello", aLinkedList.get(0)); - assertEquals("world", aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - - @Test - public void testRemoveFirst() { - aLinkedList.addLast("hello"); - aLinkedList.addLast("world"); - - aLinkedList.removeFirst(); - assertEquals("world", aLinkedList.get(0)); - assertEquals(1, aLinkedList.size()); - - aLinkedList.removeFirst(); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testRemoveLast() { - aLinkedList.addFirst("world"); - aLinkedList.addFirst("hello"); - - aLinkedList.removeLast(); - //assertEquals("hello", aLinkedList.get(0)); - assertEquals(1, aLinkedList.size()); - - aLinkedList.removeLast(); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testLinkedListFunctional() { - for (int i = 1; i < 4; i++) { - aLinkedList.add(i); // [1,2,3] - } - aLinkedList.remove(1); // [1,3] - - aLinkedList.add(1, 0); // [1,0,3] - for (int i=4; i<6; i++) { - aLinkedList.addFirst(i); // [5, 4, 1, 0, 3] - } - assertEquals(5, aLinkedList.size()); - assertEquals(5, aLinkedList.get(0)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(0, aLinkedList.get(3)); - - - aLinkedList.remove(3); // [5, 4, 1, 3] - assertEquals(3, aLinkedList.get(aLinkedList.size()-1)); - aLinkedList.removeLast(); // [5, 4, 1] - assertEquals(1, aLinkedList.get(aLinkedList.size()-1)); - aLinkedList.removeFirst(); // [4,1] - - assertEquals(4, aLinkedList.get(0)); - assertEquals(1, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - - } - -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ListTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ListTest.java deleted file mode 100644 index 6959da0421..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ListTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.github.Ven13.coding2017.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.*; - -import com.github.Ven13.coding2017.basic.ArrayList; -import com.github.Ven13.coding2017.basic.Iterator; -import com.github.Ven13.coding2017.basic.List; - -public class ListTest { - - //protected static List aList; - - @Test - public void testFunctional() { - - List aList = new ArrayList(); - - aList.add(1); - aList.add(2); - assertEquals(1, aList.get(0)); - assertEquals(2, aList.get(1)); - - aList.add(3); - aList.add(0, 5); - aList.add(2, 11); - assertEquals(5, aList.get(0)); - assertEquals(11, aList.get(2)); - - aList.add("hi"); - assertEquals("hi", aList.get(5)); - assertEquals(6, aList.size()); - - aList.remove(1); - assertEquals(11, aList.get(1)); - assertEquals(2, aList.get(2)); - - assertEquals(5, aList.size()); - } - - @Test - public void testAdd() { - - List aList = new ArrayList(); - - for (int i = 0; i < 100; i++) { - aList.add(i); - } - - assertEquals(0, aList.get(0)); - assertEquals(99, aList.get(99)); - assertEquals(44, aList.get(44)); - } - - @Test - public void testRemove() { - - List aList = new ArrayList(); - - aList.add(1); - aList.add(2); - aList.add(3); - aList.remove(3); - assertEquals(2, aList.size()); - - } - - @Test - public void testSize() { - - List aList = new ArrayList(); - - for (int i = 0; i < 10; i++) { - aList.add(i * 2); - } - - assertEquals(10, aList.size()); - } - - @Rule - public ExpectedException expectedEx = ExpectedException.none(); - - @Test - public void testException() { - - List aList = new ArrayList(); - - expectedEx.expect(Exception.class); - - aList.remove(1); - aList.add(3); - aList.add(2, 5); - } - - @Test - public void testIterator() { - - List aList = new ArrayList(); - - Iterator it = aList.iterator(); - - assertEquals(false, it.hasNext()); - - aList.add(1); - aList.add(2); - aList.add(3); - - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(2, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - aList.remove(1); - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - expectedEx.expect(Exception.class); - it.next(); - } - -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/QueueTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/QueueTest.java deleted file mode 100644 index 965610cdce..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/QueueTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.github.Ven13.coding2017.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.github.Ven13.coding2017.basic.Queue; - -public class QueueTest { - -private Queue queue; - - @Before - public void setUpQueue() { - queue = new Queue(); - } - - @Test - public void testQueueFunctional() { - assertEquals(true, queue.isEmpty()); - queue.enQueue(4); - queue.enQueue(2); - assertEquals(2, queue.size()); - assertEquals(false, queue.isEmpty()); - - int i = (Integer)queue.deQueue(); - assertEquals(4, i); - i = (Integer)queue.deQueue(); - assertEquals(2, i); - - assertEquals(0, queue.size()); - assertEquals(true, queue.isEmpty()); - } - -} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/StackTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/StackTest.java deleted file mode 100644 index 9bbf41914f..0000000000 --- a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/StackTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.Ven13.coding2017.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.github.Ven13.coding2017.basic.Stack; - -public class StackTest { - -private Stack stack; - - @Before - public void setUpStack() { - stack = new Stack(); - } - - @Test - public void testStackFunctional() { - assertEquals(true, stack.isEmpty()); - stack.push(4); - stack.push(2); - assertEquals(2, stack.size()); - assertEquals(false, stack.isEmpty()); - - int i = (Integer)stack.pop(); - assertEquals(2, i); - - i = (Integer)stack.peek(); - assertEquals(4, i); - - i = (Integer)stack.pop(); - assertEquals(4, i); - - assertEquals(0, stack.size()); - assertEquals(true, stack.isEmpty()); - } - -} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/ArrayList.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/ArrayList.java deleted file mode 100644 index 133db97491..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.github.FelixCJF.coding2017.basic; - - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - //容量增加 - ensureCapacity(size + 1); - //添加 - elementData[size ++] = o; - } - - public void add(int index, Object o){ - - //检查是否越界 - rangeCheck(index); - // 进行扩容检查 - ensureCapacity(size + 1); - // 对数组进行复制处理,目的就是空出index的位置插入element,并将index后的元素位移一个位置 - System. arraycopy(elementData, index, elementData, index + 1, - size - index); - // 将指定的index位置赋值为Object o - elementData[index] = o; - // 自增一位长度 - size++; - } - - public Object get(int index){ - rangeCheck(index); - return elementData[index]; - } - - public Object remove(int index){ - // 数组越界检查 - rangeCheck(index); - // 取出要删除位置的元素,供返回使用 - Object oldValue = elementData[index]; - // 计算数组要复制的数量 - int numMoved = size - index - 1; - // 数组复制,就是将index之后的元素往前移动一个位置 - if (numMoved > 0) - System. arraycopy(elementData, index+1, elementData, index, - numMoved); - // 将数组最后一个元素置空(因为删除了一个元素,然后index后面的元素都向前移动了,所以最后一个就没用了),好让gc尽快回收 - // 不要忘了size减一 - elementData[--size] = null; - return oldValue; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - //内部类,实现Iterator - private class ArrayListIterator implements Iterator{ - - private int currentIndex = 0; //当前索引 - - public boolean hasNext() { - if (currentIndex >= size) { - return false; - } - return true; - } - - public Object next() { - Object object = elementData[currentIndex]; - currentIndex ++ ; - return object; - } - } - //扩容 - public void ensureCapacity( int minCapacity) { - // 当前数组的长度 - int oldCapacity = elementData .length; - // 最小需要的容量大于当前数组的长度则进行扩容 - if (minCapacity > oldCapacity) { - // 扩容 - int newCapacity = oldCapacity + (oldCapacity >> 1); - // 如果新扩容的数组长度还是比最小需要的容量小,则以最小需要的容量为长度进行扩容 - if (newCapacity < minCapacity) - newCapacity = minCapacity; - //数组复制 - Object[] elementData2 = new Object[newCapacity]; - for (int i = 0; i < oldCapacity; i++) { - elementData2[i] = elementData[i]; - } - elementData = elementData2; - } - } - //检查是否越界 - private void rangeCheck(int index){ - if (index < 0 || index >= this.size) { - throw new IndexOutOfBoundsException("index :" + index + "size :" + size); - } - } -} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/BinaryTreeNode.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index 6dccc25dcb..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.github.FelixCJF.coding2017.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} \ No newline at end of file diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Iterator.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Iterator.java deleted file mode 100644 index 3a1b9abf8c..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.github.FelixCJF.coding2017.basic; - -public interface Iterator { - - public boolean hasNext(); - public Object next(); - -} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/LinkedList.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/LinkedList.java deleted file mode 100644 index d86e970b8a..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,214 +0,0 @@ -package com.github.FelixCJF.coding2017.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head;//头指针 - private Node last;//尾指针 - private int size = 0; - - public void add(Object o){ - addLast(o); - } - - public void add(int index , Object o){ - //检查是否越界 - checkIndex(index); - - Node indexNode = node(index); - - if (index == size) { - addLast(o); - } else { - final Node pred = indexNode.prv; - - final Node newNode = new Node(); - newNode.data = o; - newNode.next = indexNode; - newNode.prv = pred; - - indexNode.prv = newNode; - - if (pred == null) { - head = newNode; - } else { - pred.next = newNode; - } - } - size ++; - } - public Object get(int index){ - //检查是否越界 - checkIndex(index); - - Node indexNode = node(index); - - return indexNode.data; - } - public Object remove(int index){ - //检查是否越界 - checkIndex(index); - - Node indexNode = node(index); - Object element = indexNode.data; - Node pre = indexNode.prv; - Node next = indexNode.next; - - if (pre == null) { - head = next; - } else { - pre.next = next; - indexNode.prv = null; - } - - if (next == null) { - last = pre; - } else { - next.prv = pre; - indexNode.next = null; - } - - indexNode.data = null; - - size --; - - return element; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - //节点变量存放原来的头指针 - final Node oldHead = head; - //创建新的节点对象 - final Node newNode = new Node(); - newNode.data = o; - newNode.next = head; - newNode.prv = null; - //判断oldhead是否为null - if (oldHead == null) { - last = newNode; - }else { - //头指针指向新创建的节点对象 - oldHead.prv = newNode; - } - //将newNode变为头指针 - head = newNode; - size ++; - } - public void addLast(Object o){ - //节点新变量放原先的尾指针 - final Node oldLast = last; - //创建新节点,加入要添加的对象 - final Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - newNode.prv = oldLast; - if (oldLast == null) { - head = newNode; - } else { - //尾指针指向新创建的节点 - oldLast.next = newNode; - } - //newNode变为尾指针 - last = newNode; - size++; - } - public Object removeFirst(){ - //通过头指针创建头节点 - final Node hNode = head; - if (hNode == null) { - throw new NoSuchElementException(); - } - final Node next = hNode.next; - final Object element = hNode.data; - - //移除 - hNode.data = null; - hNode.next = null; - head = next; - //判断是否为尾节点 - if (next == null) { - last = null; - }else { - next.prv = null; - } - size --; - return element; - } - public Object removeLast(){ - //通过尾指针创建节点 - final Node lastNode = last; - if (lastNode == null) { - throw new NoSuchElementException(); - } - final Object element = lastNode.data; - final Node prve = lastNode.prv; - - //移除 - lastNode.data = null; - lastNode.prv = null; - last = prve; - - if (prve == null) { - head = null; - } else { - prve.next = null; - } - size --; - return element; - } - public Iterator iterator(){ - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator{ - - private Node currentNode = head;//当前节点 - - public boolean hasNext() { - if (currentNode == null) { - return false; - } - return true; - } - - public Object next() { - Object element = currentNode.data; - currentNode = currentNode.next; - return element; - } - - } - - //查找index节点,并返回该节点 - Node node(int index) { - // assert isElementIndex(index); - - if (index < (size >> 1)) { - Node x = head; - for (int i = 0; i < index; i++) - x = x.next; - return x; - } else { - Node x = last; - for (int i = size - 1; i > index; i--) - x = x.prv; - return x; - } - } - //检查索引 - private void checkIndex(int index){ - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - } - private static class Node{ - Object data; - Node next; - Node prv; - } -} \ No newline at end of file diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/List.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/List.java deleted file mode 100644 index ecbb657597..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/List.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.FelixCJF.coding2017.basic; - - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - public Iterator iterator(); -} \ No newline at end of file diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Queue.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Queue.java deleted file mode 100644 index c2661ce35f..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Queue.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.github.FelixCJF.coding2017.basic; - - -public class Queue { - - private Node head;//头节点 - private Node last;//尾节点 - private int size;//记录节点 - - public void enQueue(Object o){ - //设置一个节点变量存放原先的尾节点 - final Node oldLast = last; - //创建一个新的节点 - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - //添加到队列 - if (isEmpty()) { - head = newNode; - } else { - oldLast.next = newNode; - } - //新节点变为尾节点 - last = newNode; - size ++; - } - - public Object deQueue(){ - - Object object = head.data; - - head = head.next; - - if (isEmpty()) { - last = null; - } - size --; - return object; - } - - public boolean isEmpty(){ - return head == null; - } - - public int size(){ - return size; - } - - private static class Node{ - Object data; - Node next; - } -} \ No newline at end of file diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Stack.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Stack.java deleted file mode 100644 index 16684f7d92..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Stack.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.FelixCJF.coding2017.basic; - -import java.util.EmptyStackException; - -public class Stack { - - //存放栈内元素的容器 - private ArrayList elementData = new ArrayList(); - //记录栈内元素个数 - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (isEmpty()) { - throw new EmptyStackException(); - } - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - if (isEmpty()) { - throw new EmptyStackException(); - } - return elementData.get(elementData.size() - 1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ArrayListTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ArrayListTest.java deleted file mode 100644 index 9484ce1527..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ArrayListTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.FelixCJF.coding2017.basic.test; - -import org.junit.Before; - -import com.github.FelixCJF.coding2017.basic.ArrayList; - -public class ArrayListTest extends ListTest { - -/* @Before - public void setUpArrayList() { - aList = new ArrayList(); - }*/ - -} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/LinkedListTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/LinkedListTest.java deleted file mode 100644 index ce0c0d1c0d..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/LinkedListTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.github.FelixCJF.coding2017.basic.test; - - - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.github.FelixCJF.coding2017.basic.ArrayList; -import com.github.FelixCJF.coding2017.basic.LinkedList; -import com.github.FelixCJF.coding2017.basic.List; - -public class LinkedListTest extends ListTest{ - - private LinkedList aLinkedList; - - @Before - public void setUpLinkedList() { - List aList = new ArrayList(); - aList = new LinkedList(); - aLinkedList = new LinkedList(); - } - - @Test - public void testAddFirst() { - aLinkedList.addFirst(5); - assertEquals(5, aLinkedList.get(0)); - - aLinkedList.addFirst(6); - assertEquals(6, aLinkedList.get(0)); - assertEquals(5, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - - @Test - public void testAddLast() { - aLinkedList.addLast("hello"); - assertEquals("hello", aLinkedList.get(0)); - - aLinkedList.addLast("world"); - assertEquals("hello", aLinkedList.get(0)); - assertEquals("world", aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - - @Test - public void testRemoveFirst() { - aLinkedList.addLast("hello"); - aLinkedList.addLast("world"); - - aLinkedList.removeFirst(); - assertEquals("world", aLinkedList.get(0)); - assertEquals(1, aLinkedList.size()); - - aLinkedList.removeFirst(); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testRemoveLast() { - aLinkedList.addFirst("world"); - aLinkedList.addFirst("hello"); - - aLinkedList.removeLast(); - assertEquals("hello", aLinkedList.get(0)); - assertEquals(1, aLinkedList.size()); - - aLinkedList.removeLast(); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testLinkedListFunctional() { - for (int i=1; i<4; i++) { - aLinkedList.add(i); // [1,2,3] - } - aLinkedList.remove(1); // [1,3] - - aLinkedList.add(1, 0); // [1,0,3] - for (int i=4; i<6; i++) { - aLinkedList.addFirst(i); // [5, 4, 1, 0, 3] - } - assertEquals(5, aLinkedList.size()); - assertEquals(5, aLinkedList.get(0)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(0, aLinkedList.get(3)); - - aLinkedList.remove(3); // [5, 4, 1, 3] - assertEquals(3, aLinkedList.get(aLinkedList.size()-1)); - aLinkedList.removeLast(); // [5, 4, 1] - assertEquals(1, aLinkedList.get(aLinkedList.size()-1)); - aLinkedList.removeFirst(); // [4,1] - - assertEquals(4, aLinkedList.get(0)); - assertEquals(1, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - -} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ListTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ListTest.java deleted file mode 100644 index b970372bbe..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ListTest.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.github.FelixCJF.coding2017.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import com.github.FelixCJF.coding2017.basic.ArrayList; -import com.github.FelixCJF.coding2017.basic.Iterator; -import com.github.FelixCJF.coding2017.basic.List; - -public class ListTest { - - - //protected static List aList = new ArrayList(); - - @Test - public void testFunctional() { - List aList = new ArrayList(); - aList.add(1); - aList.add(2); - assertEquals(1, aList.get(0)); - assertEquals(2, aList.get(1)); - - aList.add(3); - aList.add(0, 5); - aList.add(2, 11); - assertEquals(5, aList.get(0)); - assertEquals(11, aList.get(2)); - - aList.add("hi"); - assertEquals("hi", aList.get(5)); - assertEquals(6, aList.size()); - - aList.remove(1); - assertEquals(11, aList.get(1)); - assertEquals(2, aList.get(2)); - - assertEquals(5, aList.size()); - } - - @Test - public void testAdd() { - List aList = new ArrayList(); - for (int i=0; i<100; i++) - aList.add(i); - assertEquals(0, aList.get(0)); - assertEquals(99, aList.get(99)); - assertEquals(44, aList.get(44)); - } - - @Test - public void testRemove() { - List aList = new ArrayList(); - aList.add(1); - aList.add(2); - aList.add(3); - int u = (Integer)aList.remove(2); - assertEquals(3, u); - assertEquals(2, aList.size()); - - aList.add(1, 5); - u = (Integer)aList.remove(0); - assertEquals(1, u); - assertEquals(5, aList.get(0)); - assertEquals(2, aList.get(1)); - assertEquals(2, aList.size()); - - aList.remove(0); - aList.remove(0); - assertEquals(0, aList.size()); - - - } - - @Test - public void testSize() { - List aList = new ArrayList(); - for (int i=0; i<10; i++) - aList.add(i*2); - assertEquals(10, aList.size()); - } - - @Rule - public ExpectedException expectedEx = ExpectedException.none(); - - @Test - public void testException() { - List aList = new ArrayList(); - expectedEx.expect(Exception.class); - - aList.remove(1); - aList.add(3); - aList.add(2, 5); - expectedEx.expect(Exception.class); - } - - @Test - public void testIterator() { - List aList = new ArrayList(); - Iterator it = aList.iterator(); - assertEquals(false, it.hasNext()); - - aList.add(1); - aList.add(2); - aList.add(3); - - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(2, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - aList.remove(1); - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - } - -} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/QueueTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/QueueTest.java deleted file mode 100644 index 49506c2b35..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/QueueTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.FelixCJF.coding2017.basic.test; - -import static org.junit.Assert.*; -import org.junit.Before; -import org.junit.Test; - -import com.github.FelixCJF.coding2017.basic.Queue; - -public class QueueTest { - private Queue queue; - - @Before - public void setUpQueue() { - queue = new Queue(); - } - - @Test - public void testQueueFunctional() { - assertEquals(true, queue.isEmpty()); - queue.enQueue(4); - queue.enQueue(2); - assertEquals(2, queue.size()); - assertEquals(false, queue.isEmpty()); - - int i = (Integer)queue.deQueue(); - assertEquals(4, i); - i = (Integer)queue.deQueue(); - assertEquals(2, i); - - assertEquals(0, queue.size()); - assertEquals(true, queue.isEmpty()); - } - -} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/StackTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/StackTest.java deleted file mode 100644 index 6bb53571a5..0000000000 --- a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/StackTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.github.FelixCJF.coding2017.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.github.FelixCJF.coding2017.basic.Stack; - - -public class StackTest { - - private Stack stack; - - @Before - public void setUpStack() { - stack = new Stack(); - } - - @Test - public void testStackFunctional() { - assertEquals(true, stack.isEmpty()); - stack.push(4); - stack.push(2); - assertEquals(2, stack.size()); - assertEquals(false, stack.isEmpty()); - - int i = (Integer)stack.pop(); - assertEquals(2, i); - - i = (Integer)stack.peek(); - assertEquals(4, i); - - i = (Integer)stack.pop(); - assertEquals(4, i); - - assertEquals(0, stack.size()); - assertEquals(true, stack.isEmpty()); - } - -} diff --git a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyArrayList.java b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyArrayList.java deleted file mode 100644 index 03f6710788..0000000000 --- a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyArrayList.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.github.lhpmatlab.coding2017.basic; - -/** - * Created by andy on 2017/2/18. - */ -public class MyArrayList { - - private Object[] initialArray = {}; - private Object[] dataArray; - private int initSize = 10; - private int arraySize; - public MyArrayList() { - dataArray = initialArray; - } - - public MyArrayList(int init) { - dataArray = new Object[init]; - } - - public void ensureCapacity(int newCapacity) { - if (newCapacity < arraySize) - return; - - Object[] old = dataArray; - dataArray = new Object[newCapacity]; - for (int i = 0; i < size(); i++) { - dataArray[i] = old[i]; - } - } - - public void add(T element) { - add(size(), element); - } - - public void add(int index, T element) { - if (size() == dataArray.length) { - ensureCapacity(size()*2 + 1); - } - for(int i=arraySize;i>index;i--) { - dataArray[i] = dataArray[i - 1]; - } - dataArray[index] = element; - arraySize++; - } - - public T delete(int index) { - if (index < 0 || index > arraySize) { - throw new ArrayIndexOutOfBoundsException(); - } - T removeElement = (T)dataArray[index]; - for (int i = index; i < size() -1; i++) { - dataArray[i] = dataArray[i + 1]; - } - arraySize--; - return removeElement; - } - - public T get(int index) { - if (index < 0 || index > arraySize) { - throw new ArrayIndexOutOfBoundsException(); - } - return (T)dataArray[index]; - } - - public T set(int index, T newElement) { - if (index < 0 || index > arraySize) { - throw new ArrayIndexOutOfBoundsException(); - } - T oldElement = (T) dataArray[index]; - dataArray[index] = newElement; - - return oldElement; - } - - public int size() { - return arraySize; - } - - public boolean isEmpty() { - return size() == 0; - } - -} diff --git a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyLinkedList.java b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyLinkedList.java deleted file mode 100644 index 9e7eab3401..0000000000 --- a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyLinkedList.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.github.lhpmatlab.coding2017.basic; - -/** - * Created by andy on 2017/2/18. - */ -public class MyLinkedList { - private class Node { - public Node pre; - public Node next; - public T data; - - public Node(Node pre,Node next,T data) { - this.pre = pre; - this.next = next; - this.data = data; - } - } - - private int dataSize; - - private Node head; - private Node tail; - - public MyLinkedList() { - head = new Node(null,null,null); - tail = new Node(head, null, null); - head.next = tail; - dataSize = 0; - } - - public void add(T t) { -// add(size(), t); - Node newNode = new Node<>(null, tail, t); - newNode.pre = tail.pre; - tail.pre.next = newNode; - tail.pre = newNode; - dataSize++; - - } - - /** - * 根据索引添加没有实现 - * @param index - * @param element - */ - public void add(int index,T element) { - //TODO 根据索引添加元素 -// addBefore(getNode(index,0,size()-1),element); -// if (index == dataSize) { -// add(element); -// } else { - // -// } - } - - public T get(int index) { - return getNode(index).data; - } - - public T set(int index, T newValue) { - Node node = getNode(index); - T oldData = node.data; - node.data = newValue; - return oldData; - } - - public T remove(int index) { - Node node = getNode(index); - node.next.pre = node.pre; - node.pre.next = node.next; - dataSize--; - - return node.data; - - } - - private void addBefore(Node node, T element) { -// newNode.pre.next = newNode; -// node.pre = newNode; - Node pre = node.pre; - Node newNode = new Node<>(node.pre, node, element); - node.pre = newNode; - pre.next = newNode; - - dataSize++; - } - - private Node getNode(int index) { - return getNode(index, 0, size()); - } - - private Node getNode(int index, int lower, int upper) { - Node p; - if (index < lower || index > upper) { - throw new IndexOutOfBoundsException(); - } - - if (index < size() / 2) { - p = head.next; - for (int i = 0; i < index; i++) { - p = p.next; - } - } else { - p = tail.pre; - for (int i = size()-1; i > index; i--) { - p = p.pre; - } - } - return p; - } - - public int size() { - return dataSize; - } - - public boolean isEmpty() { - return size() == 0; - } -} diff --git a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyQueue.java b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyQueue.java deleted file mode 100644 index 6d0c970b65..0000000000 --- a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyQueue.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.lhpmatlab.coding2017.basic; - -/** - * Created by andy on 2017/2/22. - */ -public class MyQueue { - private MyLinkedList link = new MyLinkedList<>(); - - public void enQueue(T t) { - link.add(t); - } - - public T deQueue() { - if (size() <= 0) { - return null; - } - T t = link.get(0); - link.remove(0); - return t; - } - - public boolean isEmpty() { - return size() == 0; - } - - public int size() { - return link.size(); - } -} diff --git a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyStack.java b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyStack.java deleted file mode 100644 index 3fd9d2f5c2..0000000000 --- a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyStack.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.lhpmatlab.coding2017.basic; - -/** - * Created by andy on 2017/2/22. - */ -public class MyStack { - private MyArrayList list = new MyArrayList<>(); - - public void push(T t) { - list.add(t); - } - - public T pop() { - if (size() <= 0) { - throw new IndexOutOfBoundsException(); - } - return list.delete(size() - 1); - } - - public T peek() { - return list.get(size() - 1); - } - - public boolean isEmpty() { - return list.size() == 0; - } - public int size() { - return list.size(); - } -} diff --git a/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyArrayListTest.java b/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyArrayListTest.java deleted file mode 100644 index e29d41feac..0000000000 --- a/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyArrayListTest.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.github.lhpmatlab.coding2017.basic; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; - -public class MyArrayListTest { - private MyArrayList list; - - @Before - public void init(){ - list = new MyArrayList<>(); - } - - @Test - public void testEnsureCapacity() { - assertEquals("init list size is 0 ", list.size(), 0); - list.add("1"); - list.ensureCapacity(10); - assertEquals("ensureCapacity size is 10 ", list.size(),1); - } - - /** - * 在列表的末尾添加元素 - */ - @Test - public void testAddT() { - assertEquals("init list size is 0 ", list.size(), 0); - list.add("1"); - list.add("2"); - assertEquals("add list size ", list.size(), 2); - for (int i=0; i -* @since
���� 26, 2017
-* @version 1.0 -*/ -public class MyLinkedListTest { - private MyLinkedList linkedList; - - @Before - public void before() throws Exception { - linkedList = new MyLinkedList<>(); - } - - @After - public void after() throws Exception { - } - - /** - * - * Method: add(T t) - * - */ - @Test - public void testAddT() throws Exception { - assertEquals("init list size is 0 ", linkedList.size(), 0); - linkedList.add("1"); - linkedList.add("2"); - assertEquals("add list size ", linkedList.size(), 2); - for (int i=0; i -* @since
���� 26, 2017
-* @version 1.0 -*/ -public class MyQueueTest { - private MyQueue queue; - - @Before - public void init() throws Exception { - queue = new MyQueue<>(); - } - - /** - * - * Method: enQueue(T t) - * - */ - @Test - public void testEnQueue() throws Exception { - queue.enQueue("1"); - assertEquals("size ", queue.size(), 1); - } - - /** - * - * Method: deQueue() - * - */ - @Test - public void testDeQueue() throws Exception { - queue.enQueue("1"); - queue.enQueue("2"); -// queue.deQueue(); - assertEquals("dequeue element ",queue.deQueue(),"1"); - assertEquals("size ", queue.size(), 1); - - } - - /** - * - * Method: isEmpty() - * - */ - @Test - public void testIsEmpty() throws Exception { - assertEquals("isEmpty method",queue.isEmpty(),true); - } - - /** - * - * Method: size() - * - */ - @Test - public void testSize() throws Exception { - queue.enQueue("1"); - queue.enQueue("2"); - assertEquals("size method", queue.size(),2); - } - - -} diff --git a/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyStackTest.java b/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyStackTest.java deleted file mode 100644 index a90af5d720..0000000000 --- a/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyStackTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.github.lhpmatlab.coding2017.basic; - -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import static org.junit.Assert.*; - -/** -* MyStack Tester. -* -* @author -* @since
���� 26, 2017
-* @version 1.0 -*/ -public class MyStackTest { - - MyStack stack; - - - @Before - public void init() throws Exception { - stack = new MyStack<>(); - } - - @After - public void after() throws Exception { - } - - /** - * - * Method: push(T t) - * - */ - @Test - public void testPush() throws Exception { - assertEquals("init stack ", stack.size(), 0); - stack.push("1"); - assertEquals("pust stack ", stack.size(),1); - } - - /** - * - * Method: pop() - * - */ - @Test - public void testPop() throws Exception { - assertEquals("init stack ", stack.size(), 0); - stack.push("1"); - stack.push("2"); - stack.pop(); - assertEquals("after pop ",stack.size(),1); - } - - /** - * - * Method: peek() - * - */ - @Test - public void testPeek() throws Exception { - assertEquals("init stack ", stack.size(), 0); - stack.push("1"); - stack.push("2"); - assertEquals("peek ", stack.peek(),"2"); - } - - /** - *测试判空方法 - * Method: isEmpty() - * - */ - @Test - public void testIsEmpty() throws Exception { - assertEquals("stack is empty ", stack.isEmpty(), true); - } - - /** - *测试判空方法,不为空的情况 - * Method: isEmpty() - * - */ - @Test - public void testIsNotEmpty() throws Exception { - stack.push("1"); - assertEquals("stack is empty ", stack.isEmpty(), false); - } - - /** - * - * Method: size() - * - */ - @Test - public void testSize() throws Exception { - assertEquals("init stack ", stack.size(), 0); - stack.push("1"); - stack.push("2"); - assertEquals("size is 2", stack.size(), 2); - } - - -} diff --git a/group02/527705641/.gitignore b/group02/527705641/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group02/527705641/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayList.java b/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayList.java deleted file mode 100644 index 855e25b257..0000000000 --- a/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.github.fei9009.coding2017.basic; - -public class ArrayList implements List { - - private int size = 0; - private int capacity; - - private Object[] elementData = new Object[100]; - - public ArrayList() { - this.capacity = 20; - } - - private void extend() { - Object[] updatedElementData = new Object[this.elementData.length + this.capacity]; - System.arraycopy(this.elementData, 0, updatedElementData, 0, this.elementData.length); - this.elementData = updatedElementData; - } - - public void add(Object o){ - if (this.size == elementData.length) { - extend(); - } - elementData[size] = o; - this.size++; - } - - public void add(int index, Object o){ - if (this.size == elementData.length) { - extend(); - } - int i; - for (i = this.size - 1; i >= index; i--) { - this.elementData[i + 1] = this.elementData[i]; - } - this.elementData[i + 1] = o; - this.size++; - } - - public Object get(int index){ - if (index >= 0 && index < this.size) { - return this.elementData[index]; - }else { - return null; - } - } - - public Object remove(int index){ - if (index >= 0 && index < this.size) { - int i = 0; - Object deletedElement = this.elementData[index]; - for (i = index + 1; i < this.size; i++) { - this.elementData[i - 1] = this.elementData[i]; - } - this.elementData[i] = null; - this.size--; - return deletedElement; - }else { - return null; - } - } - - public int size(){ - return this.size; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayListTest.java b/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayListTest.java deleted file mode 100644 index d623dd05e0..0000000000 --- a/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayListTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.github.fei9009.coding2017.basic; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -public class ArrayListTest { - - private static ArrayList testArray = new ArrayList(); - @Before - public void setUp() throws Exception { - //testArray.clear(); - } - - @Test - public void testArrayList() { - //fail("Not yet implemented"); - } - - @Test - public void testAddObject() { - testArray.add(10); - assertEquals(10, testArray.get(0)); - //fail("Not yet implemented"); - } - - @Test - public void testAddIntObject() { - testArray.add(10); - testArray.add(0, 3); - testArray.add(0, 2); - assertEquals(3, testArray.get(1)); - assertEquals(2, testArray.get(0)); - //fail("Not yet implemented"); - } - - @Test - public void testGet() { - testArray.add(10); - assertEquals(10, testArray.get(0)); - //fail("Not yet implemented"); - } - - @Test - public void testRemove() { - fail("Not yet implemented"); - } - - @Test - public void testSize() { - fail("Not yet implemented"); - } - -} diff --git a/group02/527705641/src/com/github/fei9009/coding2017/basic/BinaryTreeNode.java b/group02/527705641/src/com/github/fei9009/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index 6dbc7ee012..0000000000 --- a/group02/527705641/src/com/github/fei9009/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.github.fei9009.coding2017.basic; - -public class BinaryTreeNode > { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Object o) { - data = o; - left = null; - right = null; - } - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - BinaryTreeNode node = new BinaryTreeNode(o); - boolean left = true; - BinaryTreeNode cur = this; - BinaryTreeNode pre = null; - while (cur != null) { - pre = cur; - if (node.getData().compareTo(cur.getData()) <= 0) { - cur = cur.left; - left = true; - } else { - cur = cur.right; - left = false; - } - } - if(left) { - pre.left = node; - } else { - pre.right = node; - } - return node; - } - -} diff --git a/group02/527705641/src/com/github/fei9009/coding2017/basic/Iterator.java b/group02/527705641/src/com/github/fei9009/coding2017/basic/Iterator.java deleted file mode 100644 index e2f03b8247..0000000000 --- a/group02/527705641/src/com/github/fei9009/coding2017/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.fei9009.coding2017.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group02/527705641/src/com/github/fei9009/coding2017/basic/LinkedList.java b/group02/527705641/src/com/github/fei9009/coding2017/basic/LinkedList.java deleted file mode 100644 index 1ed5923ee9..0000000000 --- a/group02/527705641/src/com/github/fei9009/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.github.fei9009.coding2017.basic; - -public class LinkedList implements List { - - private Node head; - private int size; - - public void add(Object o){ - add(size, o); - } - - public void add(int index , Object o){ - if (index > this.size || index < 0) { - throw new IndexOutOfBoundsException("index " + index + "beyond the size " + size ); - } - Node dummy = node(index); - Node newNode = new Node(o); - newNode.next = dummy; - if (index == 0) { - head = newNode; - } - else { - Node before = node(index-1); - before.next = newNode; - } - this.size++; - - } - - public Object get(int index){ - if (index >= this.size || index < 0) { - throw new IndexOutOfBoundsException("index " + index + "beyond the size " + size ); - } - Node node = node(index); - return node.data; - - } - public Object remove(int index){ - if (index >= this.size || index < 0) { - throw new IndexOutOfBoundsException("index " + index + "beyond the size " + size ); - } - Node delNode = node(index); - if (index == 0) - head = delNode.next; - else { - Node before = node(index-1); - before.next = delNode.next; - } - size--; - return delNode.data; - } - - public int size(){ - return this.size; - } - - public void addFirst(Object o){ - add(0, o); - } - public void addLast(Object o){ - add(o); - } - public Object removeFirst(){ - return remove(0); - } - - public Object removeLast(){ - return remove(this.size -1); - } - public Iterator iterator(){ - return null; - } - - Node node(int index) { - Node x = head; - for (int i=0; ielementData.length) - grow(elementData,size); - Object temp = null; - int len=elementData.length; - for (int i=0;iindex){ - temp=elementData[i]; - elementData[i]=old; //[4]=c - old=temp; - } - } - } - - public Object get(int index){ - return elementData[index]; - } - - public Object remove(int index){ - if (index==elementData.length-1){ //ɾһԪֵ - elementData[index]=null; - }else{ - elementData[index]=null; - int len=elementData.length; - for (int i=0;iindex){ - if(i+1!=len){ - elementData[i]=elementData[i+1]; - }else{ //Ǽ 0-3ô鳤43+1==4elementData[i+1]ᱨ - elementData[i]=null; - } - } - } - } - return null; - } - - public int size(){ - size=0; - for (int i=0;i "); - c=c.next; - } - System.out.println(); - } - public Iterator iterator(){ - LinkedList l = new LinkedList(); - l.head=this.head; - return l; - } - - public boolean hasNext(){ - current = head; - if (current!=null){ - head = current.next; - return true; - } - return false; - } - - public Object next(){ - return current.data; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/List.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/List.java deleted file mode 100644 index 129333b4da..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.orajavac.coding2017.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/Queue.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/Queue.java deleted file mode 100644 index 772806e391..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/Queue.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.orajavac.coding2017.basic; - -public class Queue { - -private ArrayList elementData = new ArrayList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - Object obj = elementData.get(0); - elementData.remove(0); - return obj; - } - - public ArrayList getElementData() { - return elementData; - } - - public void setElementData(ArrayList elementData) { - this.elementData = elementData; - } - - public boolean isEmpty(){ - if (elementData.size()>0) - return true; - return false; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/Stack.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/Stack.java deleted file mode 100644 index 62d9f2e278..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/Stack.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.github.orajavac.coding2017.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - int s=elementData.size(); - Object obj = null; - for (int i=s-1;i>=0;i--){ - if(elementData.get(i)!=null){ - obj = elementData.get(i); - elementData.remove(i); - break; - } - } - return obj; - } - - public Object peek(){ - int s=elementData.size(); - Object obj = null; - for (int i=s-1;i>=0;i--){ - if(elementData.get(i)!=null){ - obj = elementData.get(i); - break; - } - } - return obj; - } - public boolean isEmpty(){ - if (elementData.size()>0) - return true; - return false; - } - public int size(){ - return elementData.size(); - } - public ArrayList getElementData() { - return elementData; - } - - public void setElementData(ArrayList elementData) { - this.elementData = elementData; - } -} diff --git a/group02/609990377/DataStructure/.gitignore b/group02/609990377/DataStructure/.gitignore deleted file mode 100644 index fa968c2f2b..0000000000 --- a/group02/609990377/DataStructure/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/bin/ -.classpath -.project diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/ArrayList.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/ArrayList.java deleted file mode 100644 index af4588763e..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.github.congcongcong250.coding2017.basic; - -import java.util.Arrays; -import java.util.InputMismatchException; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[10]; - - public void add(Object o){ - - //check size limit - if(size + 1 > elementData.length){ - int newlength = elementData.length * 3 / 2 + 1; - elementData = Arrays.copyOf(elementData, newlength); - } - - elementData[size++] = o; - } - - public void add(int index, Object o){ - //index Check - checkIndex(index); - - //check size limit - if(size + 1 > elementData.length){ - int newlength = elementData.length * 3 / 2 + 1; - elementData = Arrays.copyOf(elementData, newlength); - } - - for(int i = ++size; i >= index; i-- ){ - elementData[i] = elementData[i-1]; - } - - elementData[index] = o; - - - } - - public Object get(int index){ - //index Check - checkIndex(index); - - return elementData[index]; - } - - public Object remove(int index){ - //index Check - checkIndex(index); - - Object old = elementData[index]; - for(int i = index; i < size-1 ; i++ ){ - elementData[i] = elementData[i+1]; - } - elementData[--size] = null; - return old; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new Itr(); - } - - public void clear(){ - elementData = new Object[10]; - size = 0; - } - - private void checkIndex(int index){ - if(index >= size || index < 0){ - throw new IndexOutOfBoundsException("Index:"+index+" Size:"+size); - } - } - - - private class Itr implements Iterator{ - //index for next element to visit - private int cursor = 0; - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public Object next() { - if(cursor >= size){ - throw new NoSuchElementException(); - } - return elementData[cursor++]; - } - - @Override - public void remove() { - //Check bound - if(cursor == 0){ - throw new NoSuchElementException(); - } - - ArrayList.this.remove(--cursor); - - } - } - - - -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/BinaryTreeNode.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index 9e0e5aa10e..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.github.congcongcong250.coding2017.basic; - -public class BinaryTreeNode >{ - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(){ - data = null; - left = null; - right = null; - } - - public BinaryTreeNode(Object obj){ - data = obj; - left = null; - right = null; - } - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public void destroy(){ - this.data = null; - this.left = null; - this.right = null; - } - - public BinaryTreeNode insert(Object o){ - //If is empty root - if(data == null){ - data = o; - return this; - } - - //If it is a normal root - BinaryTreeNode in; - - if(o.compareTo(data) <= 0){ - if(left == null){ - in = new BinaryTreeNode(o); - left = in; - }else{ - in = left.insert(o); - } - }else{ - if(right == null){ - in = new BinaryTreeNode(o); - right = in; - }else{ - in = right.insert(o); - } - } - - assert (in == null):"Insert error"; - return in; - } - - - -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Iterator.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Iterator.java deleted file mode 100644 index 9033ad33be..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.github.congcongcong250.coding2017.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - public void remove(); - -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/LinkedList.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/LinkedList.java deleted file mode 100644 index 640d9ec974..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,182 +0,0 @@ -package com.github.congcongcong250.coding2017.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - private int size; - - public LinkedList(){ - head = new Node(); - size = 0; - } - - public void add(Object o){ - addLast(o); - } - - public void add(int index , Object o){ - //Check bound - checkIndex(index); - - Node nx = this.find(index); - Node pr = nx.previous; - Node in = new Node(o,pr,nx); - nx.previous = in; - pr.next = in; - size++; - } - - public Object get(int index){ - //Check bound - checkIndex(index); - - return this.find(index).data; - } - - public Object remove(int index){ - //Check bound - checkIndex(index); - Node rem = this.find(index); - - Node pr = rem.previous; - Node nx = rem.next; - pr.next = nx; - nx.previous = pr; - - Object ret = rem.data; - rem.previous = null; - rem.next = null; - rem.data = null; - size--; - return ret; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node nx = head.next; - Node in = new Node(o,head, nx); - head.next = in; - nx.previous = in; - size++; - } - - public void addLast(Object o){ - Node last = head.previous; - Node in = new Node(o,last,head); - last.next = in; - head.previous = in; - - size++; - } - public Object removeFirst(){ - return remove(0); - } - public Object removeLast(){ - return remove(size-1); - } - public Iterator iterator(){ - return new ListItr(); - } - public void clear(){ - for (Node x = head; x != null; ) { - Node next = x.next; - x.data = null; - x.next = null; - x.previous = null; - x = next; - } - } - - private void checkIndex(int index){ - if(index >= size || index < 0){ - throw new IndexOutOfBoundsException("Index:"+index+" Size:"+size); - } - } - - private Node find(int index){ - Node tra = head; - - //If index < size/2 - if( index < (size >> 1)){ - for(int i = 0; i <= index; i++){ - tra = tra.next; - } - }else{ - for(int i = size; i > index; i--){ - tra = tra.previous; - } - } - return tra; - } - - private static class Node{ - Object data; - Node next; - Node previous; - - public Node(){ - data = null; - next = this; - previous = this; - } - - public Node(Object obj,Node pre, Node nx){ - data = obj; - next = nx; - previous = pre; - } - - - } - - private class ListItr implements Iterator{ - //Point to next node - Node cursor; - int nextIndex; - - public ListItr(){ - cursor = head.next; - nextIndex = 0; - } - - @Override - public boolean hasNext() { - return nextIndex < size; - } - - @Override - public Object next() { - checkBound(); - Node re = cursor; - cursor = cursor.next; - nextIndex++; - return re.data; - } - - public Object previous() { - Node re = cursor.previous.previous; - cursor = cursor.previous; - nextIndex--; - return re.data; - } - - @Override - public void remove() { - //Check bound - checkBound(); - LinkedList.this.remove(--nextIndex); - - } - - private void checkBound(){ - if(nextIndex >= size){ - throw new NoSuchElementException("Iterates to the end"); - } - } - } -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/List.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/List.java deleted file mode 100644 index fe05e60f37..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.congcongcong250.coding2017.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Queue.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Queue.java deleted file mode 100644 index 0381c65fd8..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Queue.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.congcongcong250.coding2017.basic; - -public class Queue { - private LinkedList elementData; - - public Queue(){ - elementData = new LinkedList(); - } - - public void enQueue(Object o){ - elementData.addFirst(o); - } - - public Object deQueue(){ - Object ret = elementData.removeLast(); - return ret; - } - - public Object peek(){ - return elementData.get(elementData.size()-1); - } - - public boolean isEmpty(){ - return (elementData.size() == 0); - } - - public int size(){ - return elementData.size(); - } - - public void clear(){ - elementData.clear(); - } -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Stack.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Stack.java deleted file mode 100644 index 3e411cb0be..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/Stack.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.github.congcongcong250.coding2017.basic; - -public class Stack { - private LinkedList elementData = new LinkedList(); - - public Stack(){ - elementData = new LinkedList(); - } - - public void push(Object o){ - elementData.addLast(o); - } - - public Object pop(){ - Object ret = elementData.removeLast(); - return ret; - } - - public Object peek(){ - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return (elementData.size() == 0); - } - public int size(){ - return elementData.size(); - } - - public void clear(){ - elementData.clear(); - } -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/ArrayListTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/ArrayListTest.java deleted file mode 100644 index 647a0e9c4e..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/ArrayListTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.github.congcongcong250.coding2017.basicTest; - -import static org.junit.Assert.*; - -import java.util.NoSuchElementException; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.congcongcong250.coding2017.basic.ArrayList; -import com.github.congcongcong250.coding2017.basic.Iterator; - -public class ArrayListTest implements testCase { - - ArrayList testlist = new ArrayList(); - - @Override - @Before - public void setUp() { - - for(int i = 0; i < 30; i++){ - testlist.add(i); - } - } - - @Override - @After - public void tearDown() { - testlist.clear(); - } - - @Override - @Test - public void testAdd() { - - assertEquals(0,testlist.get(0)); - assertEquals(11,testlist.get(11)); - assertEquals(20,testlist.get(20)); - assertEquals(29,testlist.get(29)); - assertEquals(30,testlist.size()); - - testlist.add(20, 100); - assertEquals(100,testlist.get(20)); - assertEquals(20,testlist.get(21)); - assertEquals(29,testlist.get(30)); - assertEquals(31,testlist.size()); - - } - - @Override - @Test - public void testRemove() { - - - assertEquals(6,testlist.get(6)); - assertEquals(30,testlist.size()); - testlist.remove(6); - assertEquals(7,testlist.get(6)); - assertEquals(29,testlist.size()); - assertEquals(21,testlist.get(20)); - assertEquals(5,testlist.get(5)); - } - - - @Test(expected=IndexOutOfBoundsException.class) - public void testgetneg(){ - - ArrayList emptyList = new ArrayList(); - Object o = emptyList.get(-1); - } - - @Test(expected=IndexOutOfBoundsException.class) - public void testgetout(){ - - Object o = testlist.get(31); - } - - @Test(expected=IndexOutOfBoundsException.class) - public void testremoveExp(){ - Object o = testlist.remove(31); - } - - @Override - @Test - public void testFunctional() { - Iterator itr = testlist.iterator(); - assertTrue(itr.hasNext()); - for(int i = 0; i < 20; i++){ - assertEquals(i, itr.next()); - } - itr.remove(); - - assertTrue(itr.hasNext()); - assertEquals(20, itr.next()); - assertEquals(29, testlist.size()); - - for(int i = 21; i < 30; i++){ - assertEquals(i, itr.next()); - } - assertFalse(itr.hasNext()); - - boolean hasExp = false; - try{ - itr.next(); - }catch (NoSuchElementException e){ - hasExp = true; - } - assertTrue(hasExp); - } - - - - -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/BinaryTreeNodeTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/BinaryTreeNodeTest.java deleted file mode 100644 index f0e7e59ee3..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/BinaryTreeNodeTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.github.congcongcong250.coding2017.basicTest; - -import static org.junit.Assert.*; - -import java.util.NoSuchElementException; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.congcongcong250.coding2017.basic.BinaryTreeNode; - -public class BinaryTreeNodeTest implements testCase { - - BinaryTreeNode node = new BinaryTreeNode(); - - @Override - @Before - public void setUp() { - node.insert(10); - - } - - @Override - @After - public void tearDown() { - node.destroy(); - } - - @Override - @Test - public void testAdd() { - assertEquals(10,node.getData()); - node.insert(5); - assertEquals(5,node.getLeft().getData()); - node.insert(1); - node.insert(2); - node.insert(6); - node.insert(19); - node.insert(18); - /* - * 10 - * 5 19 - * 1 6 18 - * 2 - * - * */ - assertEquals(1,node.getLeft().getLeft().getData()); - assertEquals(2,node.getLeft().getLeft().getRight().getData()); - assertEquals(6,node.getLeft().getRight().getData()); - assertEquals(19,node.getRight().getData()); - assertEquals(18,node.getRight().getLeft().getData()); - } - - @Override - @Test - public void testRemove() { - // TODO Auto-generated method stub - - } - - @Override - @Test - public void testFunctional() { - // TODO Auto-generated method stub - - } - -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/LinkedListTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/LinkedListTest.java deleted file mode 100644 index 701bd54402..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/LinkedListTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.github.congcongcong250.coding2017.basicTest; - -import static org.junit.Assert.*; - -import java.util.NoSuchElementException; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.congcongcong250.coding2017.basic.ArrayList; -import com.github.congcongcong250.coding2017.basic.LinkedList; -import com.github.congcongcong250.coding2017.basic.Iterator; - -public class LinkedListTest implements testCase { - - LinkedList testlist = new LinkedList(); - - @Override - @Before - public void setUp() { - for(int i = 0; i < 20;i++){ - testlist.add(i); - } - } - - @Override - @After - public void tearDown() { - testlist.clear(); - } - - @Override - @Test - public void testAdd() { - assertEquals(20,testlist.size()); - assertEquals(0,testlist.get(0)); - assertEquals(19,testlist.get(19)); - - testlist.add(11, 100); - assertEquals(21,testlist.size()); - assertEquals(5,testlist.get(5)); - assertEquals(100,testlist.get(11)); - assertEquals(18,testlist.get(19)); - - testlist.addFirst(200); - assertEquals(22,testlist.size()); - assertEquals(200,testlist.get(0)); - assertEquals(4,testlist.get(5)); - assertEquals(100,testlist.get(12)); - assertEquals(17,testlist.get(19)); - - testlist.addLast(300); - assertEquals(23,testlist.size()); - assertEquals(200,testlist.get(0)); - assertEquals(4,testlist.get(5)); - assertEquals(100,testlist.get(12)); - assertEquals(17,testlist.get(19)); - assertEquals(300,testlist.get(22)); - - } - - @Override - @Test - public void testRemove() { - assertEquals(20,testlist.size()); - assertEquals(0,testlist.get(0)); - assertEquals(19,testlist.get(19)); - - testlist.remove(10); - assertEquals(19,testlist.size()); - assertEquals(4,testlist.get(4)); - assertEquals(9,testlist.get(9)); - assertEquals(11,testlist.get(10)); - assertEquals(19,testlist.get(18)); - - testlist.removeFirst(); - assertEquals(18,testlist.size()); - assertEquals(1,testlist.get(0)); - assertEquals(12,testlist.get(10)); - assertEquals(19,testlist.get(17)); - - testlist.removeLast(); - assertEquals(17,testlist.size()); - assertEquals(1,testlist.get(0)); - assertEquals(12,testlist.get(10)); - assertEquals(18,testlist.get(16)); - - } - - @Test(expected=IndexOutOfBoundsException.class) - public void testgetneg(){ - - LinkedList emptyList = new LinkedList(); - Object o = emptyList.get(-2); - } - - @Test(expected=IndexOutOfBoundsException.class) - public void testgetout(){ - - Object o = testlist.get(31); - } - - @Test(expected=IndexOutOfBoundsException.class) - public void testremoveExp(){ - - Object o = testlist.remove(31); - } - - @Override - @Test - public void testFunctional() { - Iterator itr = testlist.iterator(); - - assertTrue(itr.hasNext()); - for(int i = 0; i < 12; i++){ - assertEquals(i, itr.next()); - } - - //previous() function not yet defined in interface - - itr.remove(); - - assertTrue(itr.hasNext()); - assertEquals(12, itr.next()); - assertEquals(19, testlist.size()); - - for(int i = 13; i < 20; i++){ - assertEquals(i, itr.next()); - } - assertFalse(itr.hasNext()); - - boolean hasExp = false; - try{ - itr.next(); - }catch (NoSuchElementException e){ - hasExp = true; - } - assertTrue(hasExp); - - } - -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/QueueTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/QueueTest.java deleted file mode 100644 index a176a44f2c..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/QueueTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.github.congcongcong250.coding2017.basicTest; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.congcongcong250.coding2017.basic.Queue; - -public class QueueTest implements testCase { - - Queue testqueue = new Queue(); - - @Override - @Before - public void setUp() { - - for(int i = 0; i < 20; i++){ - testqueue.enQueue(i); - } - } - - @Override - @After - public void tearDown() { - testqueue.clear(); - } - - - @Override - @Test - public void testAdd() { - assertEquals(20,testqueue.size()); - assertEquals(0,testqueue.peek()); - assertEquals(20,testqueue.size()); - assertFalse(testqueue.isEmpty()); - } - - @Override - @Test - public void testRemove() { - assertEquals(20,testqueue.size()); - assertEquals(0,testqueue.deQueue()); - assertEquals(19,testqueue.size()); - assertEquals(1,testqueue.peek()); - assertFalse(testqueue.isEmpty()); - } - - @Override - @Test - public void testFunctional() { - for(int i = 0; i < 20; i++){ - testqueue.deQueue(); - } - assertTrue(testqueue.isEmpty()); - testqueue.enQueue(100); - testqueue.enQueue(200); - assertEquals(100,testqueue.deQueue()); - testqueue.enQueue(400); - assertEquals(200,testqueue.deQueue()); - assertFalse(testqueue.isEmpty()); - assertEquals(400,testqueue.deQueue()); - - boolean hasExp = false; - try{ - testqueue.deQueue(); - }catch (IndexOutOfBoundsException e){ - hasExp = true; - } - assertTrue(hasExp); - } - -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/StackTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/StackTest.java deleted file mode 100644 index 9d6085ab03..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/StackTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.github.congcongcong250.coding2017.basicTest; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.congcongcong250.coding2017.basic.Stack; - -public class StackTest implements testCase { - - Stack teststack = new Stack(); - - @Override - @Before - public void setUp() { - - for(int i = 0; i < 20; i++){ - teststack.push(i); - } - } - - @Override - @After - public void tearDown() { - teststack.clear(); - } - - - @Override - @Test - public void testAdd() { - assertEquals(20,teststack.size()); - assertEquals(19,teststack.peek()); - assertEquals(20,teststack.size()); - assertFalse(teststack.isEmpty()); - } - - @Override - @Test - public void testRemove() { - assertEquals(20,teststack.size()); - assertEquals(19,teststack.pop()); - assertEquals(19,teststack.size()); - assertEquals(18,teststack.peek()); - assertFalse(teststack.isEmpty()); - } - - @Override - @Test - public void testFunctional() { - for(int i = 0; i < 20; i++){ - teststack.pop(); - } - assertTrue(teststack.isEmpty()); - teststack.push(100); - teststack.push(200); - assertEquals(200,teststack.pop()); - teststack.push(400); - assertEquals(400,teststack.pop()); - assertFalse(teststack.isEmpty()); - assertEquals(100,teststack.pop()); - - - boolean hasExp = false; - try{ - teststack.pop(); - }catch (IndexOutOfBoundsException e){ - hasExp = true; - } - assertTrue(hasExp); - } - -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/TestRunner.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/TestRunner.java deleted file mode 100644 index c9a623e402..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/TestRunner.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.github.congcongcong250.coding2017.basicTest; - - -import org.junit.runner.JUnitCore; -import org.junit.runner.Result; -import org.junit.runner.notification.Failure; - -public class TestRunner { - - public static void main(String[] args){ - ArrayListTest ALT = new ArrayListTest(); - test(ALT); - - LinkedListTest LLT = new LinkedListTest(); - test(LLT); - - StackTest STT = new StackTest(); - test(STT); - - QueueTest QT = new QueueTest(); - test(QT); - - BinaryTreeNodeTest BTNT = new BinaryTreeNodeTest(); - test(BTNT); - - } - - private static Result test(testCase tc){ - - Result result = JUnitCore.runClasses(tc.getClass()); - for (Failure failure : result.getFailures()) { - System.out.println(failure.toString()); - } - System.out.println(tc.getClass().toString()+ "\n>>> Test status: "+result.wasSuccessful()); - - return result; - } -} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/testCase.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/testCase.java deleted file mode 100644 index 17df6ee30e..0000000000 --- a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/testCase.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.github.congcongcong250.coding2017.basicTest; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public interface testCase { - @Before - public void setUp(); - - @After - public void tearDown(); - - @Test - public void testAdd(); - - @Test - public void testRemove(); - - @Test - public void testFunctional(); -} diff --git a/group02/727171008/.classpath b/group02/727171008/.classpath deleted file mode 100644 index 3e0fb272a8..0000000000 --- a/group02/727171008/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group02/727171008/.gitignore b/group02/727171008/.gitignore deleted file mode 100644 index 0cfebaa908..0000000000 --- a/group02/727171008/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -/bin/ -.idea/workspace.xml -.idea/dictionaries/myj.xml -.idea/ -.DS_Store -*.classpath -*.project -.settings -.project -.target -.classpath -**/.settings -**/.classpath -**/.eclipse -**/target/ -target/ -bin/ -.svn -*.iml \ No newline at end of file diff --git a/group02/727171008/.project b/group02/727171008/.project deleted file mode 100644 index 0d10c0ccb2..0000000000 --- a/group02/727171008/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 727171008Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/ArrayListTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/ArrayListTest.java deleted file mode 100644 index 0f22f6ba80..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/ArrayListTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.github.HarryHook.coding2017.basic; - -import org.junit.Before; -import com.github.HarryHook.coding2017.basic.MyArrayList; - - -public class ArrayListTest extends ListTest { - - @Before - public void setUpArrayList() - { - aList = new MyArrayList(); - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/BinaryTreeNode.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index b93790894f..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Created by Harry 2017-2-23 10:50:39 - * 实现二叉树,并按二叉查找树插入节点 - * - */ -package com.github.HarryHook.coding2017.basic; - -public class BinaryTreeNode -{ - private Integer data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - //中序遍历二叉树 - public void inOrder(BinaryTreeNode node) - { - if(node != null) - { - inOrder(node.left); - System.out.print(" " + node.data); - inOrder(node.right); - } - } - - //获取给节点的值 - public Integer getData() - { - return data; - } - //给一个节点赋值 - public void setData(Integer data) - { - this.data = data; - } - //获取左节点 - public BinaryTreeNode getLeft() - { - return left; - } - //指定左节点 - public void setLeft(BinaryTreeNode left) - { - this.left = left; - } - - //获取右节点 - public BinaryTreeNode getRight() - { - return right; - } - //指定右节点 - public void setRight(BinaryTreeNode right) - { - this.right = right; - } - - //在二叉树中插入一个节点,需要判断 - public BinaryTreeNode insert(Integer obj) - { - // 新增节点 - BinaryTreeNode newNode = new BinaryTreeNode(); - // 当前节点,保留根的值 - BinaryTreeNode current = this; - // 上个节点 - BinaryTreeNode parent = null; - // 如果根节点为空 - if (current.data == null) - { - newNode.setData(obj); - newNode.setLeft(null); - newNode.setRight(null); - return newNode; - }else - { - while (true) - { - parent = current; - if (obj < current.data) - { - current = current.left; - if (current == null) - { - newNode.setData(obj); - newNode.setLeft(null); - newNode.setRight(null); - parent.left = newNode; - return newNode; - } - } else - { - current = current.right; - if (current == null) - { - newNode.setData(obj); - newNode.setLeft(null); - newNode.setRight(null); - parent.right = newNode; - return newNode; - } - } - } - } - } - - public static void main(String[] args) - { - BinaryTreeNode BTN = new BinaryTreeNode(); - - BTN = BTN.insert(5); - System.out.print(BTN.getData() + " "); - System.out.print(BTN.insert(2).getData() + " "); - System.out.print(BTN.insert(1).getData() + " "); - System.out.print(BTN.insert(4).getData() + " "); - System.out.print(BTN.insert(6).getData() + " "); - System.out.print(BTN.insert(8).getData() + " "); - System.out.println(""); - System.out.println("中序遍历二叉树: "); - BTN.inOrder(BTN); - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/BinaryTreeNodeTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/BinaryTreeNodeTest.java deleted file mode 100644 index 60d1979713..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/BinaryTreeNodeTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.HarryHook.coding2017.basic; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; - -import com.github.HarryHook.coding2017.basic.BinaryTreeNode; - -public class BinaryTreeNodeTest -{ - - BinaryTreeNode binaryTreeNode; - - @Before - public void setUpBinaryTreeNode() - { - binaryTreeNode = new BinaryTreeNode(); - } - - @Test - public void testBinaryTreeNodeFunctional() - { - binaryTreeNode = binaryTreeNode.insert(4); - binaryTreeNode.insert(1); - binaryTreeNode.insert(3); - binaryTreeNode.insert(5); - binaryTreeNode.insert(2); - - assertEquals(true, 4 == binaryTreeNode.getData()); - assertEquals(true, 1 == binaryTreeNode.getLeft().getData()); - assertEquals(true, 5 == binaryTreeNode.getRight().getData()); - assertEquals(true, 3 == binaryTreeNode.getLeft().getRight().getData()); - assertEquals(true, 2 == binaryTreeNode.getLeft().getRight().getLeft().getData()); - - //节点为空 说明值没有插进去 - binaryTreeNode.inOrder(binaryTreeNode); - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/Iterator.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/Iterator.java deleted file mode 100644 index 3fae84a22f..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.HarryHook.coding2017.basic; - -public interface Iterator -{ - public boolean hasNext(); - public Object next(); -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/LinkedListTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/LinkedListTest.java deleted file mode 100644 index 7c754e37af..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/LinkedListTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.github.HarryHook.coding2017.basic; - -import static org.junit.Assert.*; -import org.junit.Before; -import org.junit.Test; -import com.github.HarryHook.coding2017.basic.MyLinkedList; - -public class LinkedListTest extends ListTest{ - - private MyLinkedList aLinkedList; - - @Before - public void setUpLinkedList() { - aList = new MyLinkedList(); - aLinkedList = new MyLinkedList(); - } - - @Test - public void testAddFirst() { - aLinkedList.addFirst(5); - assertEquals(5, aLinkedList.get(0)); - - aLinkedList.addFirst(6); - assertEquals(6, aLinkedList.get(0)); - assertEquals(5, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - - @Test - public void testAddLast() { - aLinkedList.addLast("hello"); - assertEquals("hello", aLinkedList.get(0)); - - aLinkedList.addLast("world"); - assertEquals("hello", aLinkedList.get(0)); - assertEquals("world", aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - - @Test - public void testRemoveFirst() { - aLinkedList.addLast("hello"); - aLinkedList.addLast("world"); - - aLinkedList.removeFirst(); - assertEquals("world", aLinkedList.get(0)); - assertEquals(1, aLinkedList.size()); - - aLinkedList.removeFirst(); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testRemoveLast() { - aLinkedList.addFirst("world"); - aLinkedList.addFirst("hello"); - - aLinkedList.removeLast(); - assertEquals("hello", aLinkedList.get(0)); - assertEquals(1, aLinkedList.size()); - - aLinkedList.removeLast(); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testLinkedListFunctional() { - for (int i=1; i<4; i++) { - aLinkedList.add(i); // [1,2,3] - } - aLinkedList.remove(1); // [1,3] - - aLinkedList.add(1, 0); // [1,0,3] - for (int i=4; i<6; i++) { - aLinkedList.addFirst(i); // [5, 4, 1, 0, 3] - } - assertEquals(5, aLinkedList.size()); - assertEquals(5, aLinkedList.get(0)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(0, aLinkedList.get(3)); - - aLinkedList.remove(3); // [5, 4, 1, 3] - assertEquals(3, aLinkedList.get(aLinkedList.size()-1)); - aLinkedList.removeLast(); // [5, 4, 1] - assertEquals(1, aLinkedList.get(aLinkedList.size()-1)); - aLinkedList.removeFirst(); // [4,1] - - assertEquals(4, aLinkedList.get(0)); - assertEquals(1, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java deleted file mode 100644 index f2299e8e83..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.HarryHook.coding2017.basic; - - -public interface List -{ - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - - public Iterator iterator(); -} - diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java deleted file mode 100644 index 92f84b687c..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.github.HarryHook.coding2017.basic; - -import static org.junit.Assert.*; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import com.github.HarryHook.coding2017.basic.Iterator; -import com.github.HarryHook.coding2017.basic.List; - -public class ListTest { - - protected static List aList; - - @Test - public void testFunctional() { - aList.add(1); - aList.add(2); - assertEquals(1, aList.get(0)); - assertEquals(2, aList.get(1)); - - aList.add(3); - aList.add(0, 5); - aList.add(2, 11); - assertEquals(5, aList.get(0)); - assertEquals(11, aList.get(2)); - - aList.add("hi"); - assertEquals("hi", aList.get(5)); - assertEquals(6, aList.size()); - - aList.remove(1); - assertEquals(11, aList.get(1)); - assertEquals(2, aList.get(2)); - - assertEquals(5, aList.size()); - } - - @Test - public void testAdd() { - for (int i=0; i<100; i++) - aList.add(i); - assertEquals(0, aList.get(0)); - assertEquals(99, aList.get(99)); - assertEquals(44, aList.get(44)); - } - - @Test - public void testRemove() { - aList.add(1); - aList.add(2); - aList.add(3); - int u = (Integer)aList.remove(2); - assertEquals(3, u); - assertEquals(2, aList.size()); - - aList.add(1, 5); - u = (Integer)aList.remove(0); - assertEquals(1, u); - assertEquals(5, aList.get(0)); - assertEquals(2, aList.get(1)); - assertEquals(2, aList.size()); - - aList.remove(0); - aList.remove(0); - assertEquals(0, aList.size()); - - - } - - @Test - public void testSize() { - for (int i=0; i<10; i++) - aList.add(i*2); - assertEquals(10, aList.size()); - } - - @Rule - public ExpectedException expectedEx = ExpectedException.none(); - - @Test - public void testException() { - expectedEx.expect(Exception.class); - aList.remove(1); - aList.add(3); - aList.add(2, 5); - expectedEx.expect(Exception.class); - } - - @Test - - public void testIterator() - { - Iterator it = aList.iterator(); - assertEquals(false, it.hasNext()); - - aList.add(1); - aList.add(2); - aList.add(3); - - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(2, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - aList.remove(1); - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - expectedEx.expect(Exception.class); - it.next(); - - } - - - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java deleted file mode 100644 index dbfd8aae19..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * created by Harry 2017-2-20 18:53:38 - * 实现简单的ArrayList,具有基本的增删改查功能 - */ -package com.github.HarryHook.coding2017.basic; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -public class MyArrayList implements List -{ - private int size = 0; //数组元素个数 - - private Object[] elementData = new Object[10]; //初始化数组大小为10 - - //将元素添加到数组尾部 - public void add(Object o) - { //需要判断数组空间是否够用 - ensureCapacity(size + 1); - elementData[size++] = o; - } - //在指定位置添加元素 - public void add(int index, Object o) - { - //判断下标记是否越界 - if (index > size || index < 0) - throw new IndexOutOfBoundsException( - "Index: " + index + ", Size: " + size); - ensureCapacity(size + 1); - //判断当前位置是否有元素,没有元素添加到当前位置;若有,当前元素及之后元素向右移 - if(elementData[index] == null) - { - elementData[index] = o; - } - else - { - for(int i=elementData.length-1; i>index; i--) - { - elementData[i] = elementData[i-1]; - } - elementData[index] = o; - } - size++; - - /* - //判断索引位置是否正确 - if (index > size || index < 0) - throw new IndexOutOfBoundsException( - "Index: " + index + ", Size: " + size); - //扩容检测 - ensureCapacity(size+1); - /* - * 对源数组进行复制处理(位移),从index + 1到size-index。 - * 主要目的就是空出index位置供数据插入, - * 即向右移动当前位于该位置的元素以及所有后续元素。 - - System.arraycopy(elementData, index, elementData, index + 1, - size - index); - //在指定位置赋值 - elementData[index] = 0; - size++; - - */ - } - - public Object get(int index) - { - //若index超出size应该抛出异常 - if(index >= size) - throw new IndexOutOfBoundsException( "Index: " + index + ", Size: " + size); - return elementData[index]; - - } - - public Object remove(int index) - { //涉及到元素移位 - Object oldValue = elementData[index]; - for(int i=index; i oldCapacity) - { - //Object oldData[] = elementData; //防止copyof()执行的过程中新内存或者其他进程分配内存时占用旧内存 - int newCapacity = (oldCapacity * 3)/2 + 1; //增加50%+1 - if (newCapacity < minCapacity) - newCapacity = minCapacity; - // minCapacity is usually close to size, so this is a win: - elementData = Arrays.copyOf(elementData, newCapacity); - } - } - - //返回数组的大小 - public int size() - { - return size; - } - - public Iterator iterator() - { - return new MyArrayListIterator(); - } - - private class MyArrayListIterator implements Iterator - { - private int cursor = 0; //记录索引位置 - public boolean hasNext() - { - return cursor != size; - } - public Object next() - { - try { - Object next = get(cursor); - cursor++; - return next; - - } catch (IndexOutOfBoundsException e) - { - throw new NoSuchElementException(); - } - - } - } - - public static void main(String[] args) - { - MyArrayList myArrays = new MyArrayList(); - myArrays.add(3); - myArrays.add(0, 11); - myArrays.add(1, 2); - myArrays.add(3, 5); - myArrays.add(2, 1); - myArrays.add(7); - Print(myArrays); - - for(int i = 0; i < 19; i++) - myArrays.add(i, 55); - - System.out.println("获取指定位置元素: " + myArrays.get(2)); - System.out.println("删除指定位置元素: " + myArrays.remove(1)); - System.out.println("当前元素个数:" + myArrays.size()); - - Print(myArrays); - - } - public static void Print(MyArrayList myArrays) - { - Iterator it = myArrays.iterator(); - System.out.println("对链表中的元素进行打印:"); - while(it.hasNext()) - System.out.print(it.next() + " "); - System.out.println(""); - System.out.println("当前元素个数: " + myArrays.size()); - - } - -} - diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java deleted file mode 100644 index 5aeab57496..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * created by Harry 2017-2-21 14:43:41 - * 实现简单的LinkedList - */ - -package com.github.HarryHook.coding2017.basic; - -public class MyLinkedList implements List -{ - private Node head = null; //头指针 - private int size = 0; - private static class Node - { - Object data; - Node next; - } - public void add(Object o) - { - addLast(o); - } - //在指定位置添加元素 - public void add(int index , Object o) - { - - if (index > size || index < 0) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - //存在插入头结点的情况 - if(index == 0) - addFirst(o); - else - { //即 index != 0 的情况 - // p保存待插入节点的前一节点,x指向要插入的节点 - Node x = head; - Node p = null; - int i = 0; - while(i < index) - { - p = x; - x = x.next; - i++; - } - Node n = new Node(); - p.next = n; - n.next = x; - n.data = o; - size++; - } - - } - //返回指定位置元素 - public Object get(int index) - { - Node x = head; - int i = 0; - while(i < index && x != null) - { - x = x.next; - i++; - } - return x.data; - } - - //移除指定位置节点 - public Object remove(int index) - { - if (index > size || index < 0) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - //先判断是否是头节点 - if( index == 0) - { - return removeFirst(); - } - else - { - Node x = head; - Node pre = null; - int i = 0; - while(i < index) - { - pre = x; - x = x.next; - i++; - } - Object Data = pre.next.data; - pre.next = x.next; - x = null; - size--; - return Data; - } - - } - //头部添加节点 - public void addFirst(Object o) - { - Node n = new Node(); - n.next = head; - head = n; - n.data = o; - size++; - } - //尾部添加节点 - public void addLast(Object o) - { - if (head == null) - { - head = new Node(); - head.data = o; - } - else - { - Node x = head; - while(x.next != null) - { - x = x.next; - } - Node n = new Node(); - x.next = n; - n.next = null; - n.data = o; - } - size++; - } - //移除第一个节点 - public Object removeFirst() - { - Node n = head; - Object Data = n.data; - head = head.next; - n = null; - size--; - return Data; - } - - //移除最后一个节点 - //removeLast()方法存在bug - public Object removeLast() - { - Node x = head; - Node p = null; - if(x.next == null) - { - return removeFirst(); - } - else - { - while(x.next != null) - { - p = x; - x = x.next; - } - Object Data = x.data; - p.next = null; - x = null; //删除最后一个节点 - size--; - return Data; - } - } - public int size(){ - return size; - } - public Iterator iterator() - { - return new MyLinkedListIterator(); - } - private class MyLinkedListIterator implements Iterator - { - private int cursor = 0; //记录索引位置 - public boolean hasNext() - { - return cursor != size; - } - public Object next() - { - Object next = get(cursor); - cursor ++; - return next; - } - } - public static void main(String[] args) - { - MyLinkedList myList = new MyLinkedList(); - myList.add(3); - myList.add(5); - myList.add(0, 4); - myList.add(2, 7); - myList.addFirst(1); - myList.addLast(6); - - Print(myList); - - System.out.println("当前指定位置元素: " + myList.get(1)); - System.out.println("移除指定位置元素: " + myList.remove(4)); - Print(myList); - - System.out.println("移除第一个节点元素: " + myList.removeLast()); - Print(myList); - System.out.println("移除最后一个节点元素: " + myList.removeLast()); - Print(myList); - System.out.println("移除最后一个节点元素: " + myList.removeLast()); - Print(myList); - System.out.println("移除最后一个节点元素: " + myList.removeLast()); - Print(myList); - System.out.println("移除最后一个节点元素: " + myList.removeLast()); - Print(myList); - - } - public static void Print(MyLinkedList myList) - { - Iterator it = myList.iterator(); - System.out.println("对链表中的元素进行打印:"); - while(it.hasNext()) - System.out.print(it.next() + " "); - System.out.println(""); - System.out.println("当前元素个数: " + myList.size()); - System.out.println(""); - } - - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java deleted file mode 100644 index 9b713eaea9..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * created by Harry 2017-2-22 13:06:43 - * 实现简单的队列 - */ -package com.github.HarryHook.coding2017.basic; -import java.util.*; -public class MyQueue -{ - private MyArrayList elementData = new MyArrayList(); - private int size = 0; - //入队 - public void enQueue(Object o) - { - elementData.add(o); - size++; - } - //出队 - public Object deQueue() - { - if(isEmpty()) - throw new NoSuchElementException(); - Object Data = elementData.remove(0); - size--; - return Data; - } - //判断队列是否为空 - public boolean isEmpty() - { - return size() == 0; - } - //队列中元素个数 - public int size() - { - return size; - } - public static void main(String[] args) - { - MyQueue mq = new MyQueue(); - mq.enQueue(1); - mq.enQueue(2); - mq.enQueue(3); - mq.enQueue(4); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - //System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - //System.out.println("队列中元素个数: " + mq.size()); - } -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java deleted file mode 100644 index c7f87c04e6..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * created by Harry 2017-2-22 10:48:34 - * 实现简单的Stack - */ -package com.github.HarryHook.coding2017.basic; - -import java.util.*; - -public class MyStack -{ - private MyArrayList elementData = new MyArrayList(); - private int size = 0; - - //入栈操作 - public void push(Object o) - { - elementData.add(o); - size++; - } - //出栈操作 - public Object pop() - { - Object obj = peek(); - elementData.remove(size() - 1); - size--; - return obj; - } - //获取当前栈顶元素,不用出栈 - public Object peek() - { - if(isEmpty()) - throw new EmptyStackException(); - return elementData.get(size() - 1); - } - //判断栈是否为空 - public boolean isEmpty() - { - return size() == 0; - } - //返回栈内元素个数 - public int size(){ - return size; - } - - public static void main(String[] args) - { - MyStack ms = new MyStack(); - - ms.push(1); - ms.push(2); - ms.push(13); - System.out.println("当前栈顶元素是: " + ms.peek()); - System.out.println("出栈元素是: " + ms.pop()); - System.out.println("出栈元素是: " + ms.pop()); - ms.push(12); - System.out.println("出栈元素是: " + ms.pop()); - System.out.println("当前栈顶元素是: " + ms.peek()); - } -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java deleted file mode 100644 index 340f79d240..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.github.HarryHook.coding2017.basic; - -import static org.junit.Assert.*; -import org.junit.Before; -import org.junit.Test; -import com.github.HarryHook.coding2017.basic.MyQueue; - -public class QueueTest { - private MyQueue queue; - - @Before - public void setUpQueue() { - queue = new MyQueue(); - } - - @Test - public void testQueueFunctional() { - assertEquals(true, queue.isEmpty()); - queue.enQueue(4); - queue.enQueue(2); - assertEquals(2, queue.size()); - assertEquals(false, queue.isEmpty()); - - int i = (Integer)queue.deQueue(); - assertEquals(4, i); - i = (Integer)queue.deQueue(); - assertEquals(2, i); - - assertEquals(0, queue.size()); - assertEquals(true, queue.isEmpty()); - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java deleted file mode 100644 index 26160faef6..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.HarryHook.coding2017.basic; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.github.HarryHook.coding2017.basic.MyStack; - -public class StackTest { - - private MyStack stack; - - @Before - public void setUpStack() { - stack = new MyStack(); - } - - @Test - public void testStackFunctional() { - assertEquals(true, stack.isEmpty()); - stack.push(4); - stack.push(2); - assertEquals(2, stack.size()); - assertEquals(false, stack.isEmpty()); - - int i = (Integer)stack.pop(); - assertEquals(2, i); - - i = (Integer)stack.peek(); - assertEquals(4, i); - - i = (Integer)stack.pop(); - assertEquals(4, i); - - assertEquals(0, stack.size()); - assertEquals(true, stack.isEmpty()); - } - -} diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Iterator.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Iterator.java deleted file mode 100644 index 34d062b327..0000000000 --- a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.ZhoufeifeiJAVA.coding2017.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/List.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/List.java deleted file mode 100644 index 7a13f14c83..0000000000 --- a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.ZhoufeifeiJAVA.coding2017.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyArrayList.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyArrayList.java deleted file mode 100644 index 0666530694..0000000000 --- a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyArrayList.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.github.ZhoufeifeiJAVA.coding2017.basic; - -public class MyArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[10]; - - public void add(Object o){ - if(size == elementData.length){ - elementData = arrayGrow(elementData,size/2); - } - elementData[size] = o; - size ++; - } - public void add(int index, Object o)throws RuntimeException{ - if(index > size) - throw new RuntimeException("index is bigger than the size of MyArrayList"); - if(size == elementData.length){ - elementData = arrayGrow(elementData,size/2); - } - if(index == size) - add(o); - else{ - for(int i=size;i>index;i--){ - elementData[i] = elementData[i-1]; - } - elementData[index] = o; - } - size ++; - } - private Object[] arrayGrow(Object[] src,int size){ - Object[] target = new Object[src.length+size]; - System.arraycopy(src, 0, target, 0, src.length); - return target; - } - public Object get(int index){ - if(index >= size) - return null; - else - return elementData[index]; - } - - public Object remove(int index)throws IndexOutOfBoundsException{ - if(index>=size || index<0) - throw new IndexOutOfBoundsException("index is bigger than the size of MyArrayList"); - Object removeObject = elementData[index]; - for(int i=index;isize || index<0) - throw new IndexOutOfBoundsException("the index is bigger than the size of MyLinkedList"); - Node newNode = new Node(); - newNode.data = o; - if(index == 0){ - newNode.next = head; - head = newNode; - } - else{ - int i = 0; - Node pointer = head; - while(isize-1) - return null; - Node pointer = head; - while(index>0){ - pointer = pointer.next; - index --; - } - return pointer.data; - - } - public Object remove(int index)throws IndexOutOfBoundsException{ - if(index<0 || index>size-1) - throw new IndexOutOfBoundsException("the index is not legal"); - Node pointer = head; - if(index == 0){ - head = head.next; - size --; - return pointer.data; - } - else{ - while(index>1){ - pointer = pointer.next; - index --; - } - Node temp = pointer.next; - pointer.next = pointer.next.next; - size --; - return temp.data; - } - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - add(0,o); - } - public void addLast(Object o){ - add(size,o); - } - public Object removeFirst(){ - return remove(0); - } - public Object removeLast(){ - return remove(size-1); - } - - private static class Node{ - Object data; - Node next; - } - private class MyLinkedListIterator implements Iterator{ - private Node pointer; - MyLinkedListIterator(){ - pointer = head; - } - public boolean hasNext() { - if(pointer.next != null) - return true; - else - return false; - } - public Object next() { - Node temp = pointer; - pointer = pointer.next; - return temp.data; - } - } - public Iterator iterator(){ - return new MyLinkedListIterator(); - } - //public void showData(int index){ - // System.out.println("the data of "+index+" is "+get(index).data); - //} -} - - - - - - - diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyLinkedListTest.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyLinkedListTest.java deleted file mode 100644 index 6d5ca14e70..0000000000 --- a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyLinkedListTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.ZhoufeifeiJAVA.coding2017.basic; -public class MyLinkedListTest{ - public static void main(String[] args){ - MyLinkedList al = new MyLinkedList(); - al.add("string0"); - al.add("string1"); - al.add("string2"); - al.add("string3"); - al.add("string4"); - al.add("string5"); - al.add("string6"); - al.add("string7"); - al.add("string8"); - al.add("string9"); - al.add("string10"); - al.add("string11"); - al.add("string12"); - al.add("string13"); - al.add("string14"); - al.add(11,"string10.5"); - sop(al.remove(4)); - sop(al.get(10)); - sop(al.get(11)); - sop(al.get(12)); - sop("the size of al is "+al.size()); - sop("the iterator method used,so the result is as follows:"); - for(Iterator it = al.iterator();it.hasNext();){ - sop(it.next()); - } - } - public static void sop(Object o){ - System.out.println(o); - } -} \ No newline at end of file diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Queue.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Queue.java deleted file mode 100644 index 0ce735f150..0000000000 --- a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Queue.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.ZhoufeifeiJAVA.coding2017.basic; - -public class Queue { - private MyLinkedList llist = null; - Queue(){ - llist = new MyLinkedList(); - } - public void enQueue(Object o){ - llist.add(o); - } - - public Object deQueue(){ - return llist.removeFirst(); - } - - public boolean isEmpty(){ - if(llist.size() != 0) - return true; - else - return false; - } - - public int size(){ - return llist.size(); - } -} diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/QueueTest.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/QueueTest.java deleted file mode 100644 index 95cc5117ff..0000000000 --- a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/QueueTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.ZhoufeifeiJAVA.coding2017.basic; -public class QueueTest{ - public static void sop(Object o){ - System.out.println(o); - } - public static void main(String[] args){ - Queue q = new Queue(); - q.enQueue("String0"); - q.enQueue("String1"); - q.enQueue("String2"); - sop("the queue is not empty "+q.isEmpty()); - sop("the size of queue is "+q.size()); - sop("out queue "+q.deQueue()); - sop("out queue "+q.deQueue()); - sop("the size of queue is "+q.size()); - } -} \ No newline at end of file diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Stack.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Stack.java deleted file mode 100644 index 3992f89f86..0000000000 --- a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Stack.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.ZhoufeifeiJAVA.coding2017.basic; - -public class Stack { - private MyLinkedList llist = null; - Stack(){ - llist = new MyLinkedList(); - } - public void push(Object o){ - llist.add(o); - } - - public Object pop(){ - return llist.removeLast(); - } - - public Object peek(){ - return llist.get(llist.size()-1); - } - public boolean isEmpty(){ - if(llist.size() != 0) - return true; - else - return false; - } - public int size(){ - return llist.size(); - } -} \ No newline at end of file diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/StackTest.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/StackTest.java deleted file mode 100644 index 4bcb60e35d..0000000000 --- a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/StackTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.ZhoufeifeiJAVA.coding2017.basic; -public class StackTest{ - public static void sop(Object o){ - System.out.println(o); - } - public static void main(String[] args){ - Stack s = new Stack(); - s.push("String0"); - s.push("String1"); - s.push("String2"); - sop("the queue is not empty "+s.isEmpty()); - sop("the size of queue is "+s.size()); - sop("out queue "+s.pop()); - sop("just watch queue,not delete "+s.peek()); - sop("the size of queue is "+s.size()); - } -} \ No newline at end of file diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore deleted file mode 100644 index c24866af6d..0000000000 --- a/group02/812350401/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/bin/ -/lib/ -/src/java_training diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/ArrayList.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/ArrayList.java deleted file mode 100644 index e6bd69b5d8..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.github.miniyk2012.coding2017.basic; - -import java.util.Arrays; - - -public class ArrayList implements List { - - private int size = 0; - private int DEFAULT_LENGTH = 10; - - private Object[] elementData = new Object[DEFAULT_LENGTH]; - - public void add(Object o){ - ensureCapcacity(); - elementData[size++] = o; - } - public void add(int index, Object o){ - ensurnPosition(index); - ensureCapcacity(); - System.arraycopy(elementData, index, elementData, index + 1, - size - index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - ensureIndex(index); - return elementData[index]; - } - - public Object remove(int index){ - ensureIndex(index); - Object temp = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, - size - index); - size--; - return temp; - } - - public void clear() { - elementData = new Object[DEFAULT_LENGTH]; - size = 0; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - Iterator iterator = new IteratorImp(this); - return iterator; - } - - private void ensureCapcacity() { - int oldLength = elementData.length; - if (size+1 > oldLength) { - elementData = Arrays.copyOf(elementData, 2*oldLength); - } - } - - private void ensureIndex(int index) { - if (index >= size || index < 0) - throw new ArrayIndexOutOfBoundsException(String.format("index %d out of bounds [0-%d)", index, size)); - } - - private void ensurnPosition(int index) { - if (index <0 || index>size) - throw new ArrayIndexOutOfBoundsException(String.format("position %d out of position [0-%d)", index, size)); - } - - @Override - public String toString() { - Object[] tempArray = Arrays.copyOf(elementData, size); - return Arrays.toString(tempArray); - } - -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/BinaryTreeNode.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index 5b1f17342b..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.github.miniyk2012.coding2017.basic; - -public class BinaryTreeNode > { - private E data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(E x) { - data = x; - } - public E getData() { - return data; - } - public void setData(E data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(E o){ - BinaryTreeNode node = new BinaryTreeNode(o); - boolean left = true; - BinaryTreeNode currentNode = this; - BinaryTreeNode previousNode = null; - - while (currentNode != null) { - previousNode = currentNode; - int compareTo = node.getData().compareTo(currentNode.getData()); - if (compareTo <= 0) { // 小于,往左插入 - currentNode = currentNode.left; - left = true; - } else { - currentNode = currentNode.right; - left = false; - } - } - if (left) { - previousNode.left = node; - } else { - previousNode.right = node; - } - return node; - } - -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Iterator.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Iterator.java deleted file mode 100644 index 229ba41b05..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.github.miniyk2012.coding2017.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/IteratorImp.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/IteratorImp.java deleted file mode 100644 index cfca8eaac7..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/IteratorImp.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.miniyk2012.coding2017.basic; - -public class IteratorImp implements Iterator { - - private List aList; - private int cursor = 0; - - @Override - public boolean hasNext() { - return cursor != aList.size(); - } - - @Override - public Object next() { - int i = cursor; - Object next = aList.get(i); - cursor = i+1; - return next; - } - - public IteratorImp(List aList) { - this.aList = aList; - } -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/LinkedList.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/LinkedList.java deleted file mode 100644 index e34d76001b..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.github.miniyk2012.coding2017.basic; - -public class LinkedList implements List { - - private Node head; - private int size = 0; - - /** - * node接收的index一定是范围内的值,不可能越界 - * @param index - * @return a Node - */ - Node node(int index) { - Node x = head; - for (int i=0; i= size) - throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); - } - - private void checkPositionIndex(int index) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); - } -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/List.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/List.java deleted file mode 100644 index ff6718f462..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.github.miniyk2012.coding2017.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - public Iterator iterator(); -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Queue.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Queue.java deleted file mode 100644 index bcb9d0f9e4..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Queue.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.miniyk2012.coding2017.basic; - -public class Queue { - - // 队列入口 -》1,2,3,4 -》队列出口 - private LinkedList aList = new LinkedList(); - - public void enQueue(Object o){ - aList.addFirst(o); - } - - public Object deQueue(){ - return aList.removeLast(); - } - - public boolean isEmpty(){ - return aList.size() == 0; - } - - public int size(){ - return aList.size(); - } -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Stack.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Stack.java deleted file mode 100644 index ddfe76f774..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.github.miniyk2012.coding2017.basic; - -public class Stack { - - // 栈顶 《-》 1,2,3,4 栈底 - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(0, o); - } - - public Object pop(){ - return elementData.remove(0); - } - - public Object peek(){ - return elementData.get(0); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ArrayListTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ArrayListTest.java deleted file mode 100644 index b308c6bfef..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ArrayListTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.test; - -import org.junit.Before; -import com.github.miniyk2012.coding2017.basic.ArrayList; - - -public class ArrayListTest extends ListTest { - - @Before - public void setUpArrayList() { - aList = new ArrayList(); - } - -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/BinaryTreeNodeTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/BinaryTreeNodeTest.java deleted file mode 100644 index 57be8bbfef..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/BinaryTreeNodeTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.test; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import com.github.miniyk2012.coding2017.basic.BinaryTreeNode; - -public class BinaryTreeNodeTest { - - private BinaryTreeNode binaryTreeNode; - - /** - // 4 - // 1 5 - // 2 3 - */ - @Before - public void setUpBinaryTreeNode() { - binaryTreeNode = new BinaryTreeNode(4); - binaryTreeNode.insert(1); - binaryTreeNode.insert(3); - binaryTreeNode.insert(5); - binaryTreeNode.insert(2); - } - - @Test - public void testBinaryTreeNodeFunctional1() { - assertEquals(new Integer(4), binaryTreeNode.getData()); - assertEquals(new Integer(1), binaryTreeNode.getLeft().getData()); - assertEquals(new Integer(5), binaryTreeNode.getRight().getData()); - assertEquals(new Integer(3), binaryTreeNode.getLeft().getRight().getData()); - assertEquals(new Integer(2), binaryTreeNode.getLeft().getRight().getLeft().getData()); - } - - @Test - public void testBinaryTreeFunctional2() { - BinaryTreeNode node1 = binaryTreeNode.getLeft(); - assertEquals(new Integer(1), node1.getData()); - assertEquals(new Integer(3), node1.getRight().getData()); - assertEquals(new Integer(5), binaryTreeNode.getRight().getData()); - } - - @Rule - public ExpectedException expectedEx = ExpectedException.none(); - - @Test - public void testBinaryTreeFunctional3() - { - BinaryTreeNode treeNode = new BinaryTreeNode(100); - treeNode.insert(10); - binaryTreeNode.setRight(treeNode); - // 4 - // 1 100 - // 2 3 10 - assertEquals(new Integer(4), binaryTreeNode.getData()); - assertEquals(new Integer(1), binaryTreeNode.getLeft().getData()); - assertEquals(new Integer(3), binaryTreeNode.getLeft().getRight().getData()); - assertEquals(new Integer(2), binaryTreeNode.getLeft().getRight().getLeft().getData()); - assertEquals(new Integer(100), binaryTreeNode.getRight().getData()); - assertEquals(new Integer(10), binaryTreeNode.getRight().getLeft().getData()); - - expectedEx.expect(Exception.class); - binaryTreeNode.getRight().getRight().getRight(); // null exception - binaryTreeNode.getRight().getRight().getLeft(); // null exception - } -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/LinkedListTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/LinkedListTest.java deleted file mode 100644 index 487fd2ee00..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/LinkedListTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.test; - -import static org.junit.Assert.*; -import org.junit.Before; -import org.junit.Test; -import com.github.miniyk2012.coding2017.basic.LinkedList; - -public class LinkedListTest extends ListTest{ - - private LinkedList aLinkedList; - - @Before - public void setUpLinkedList() { - aList = new LinkedList(); - aLinkedList = new LinkedList(); - } - - @Test - public void testAddFirst() { - aLinkedList.addFirst(5); - assertEquals(5, aLinkedList.get(0)); - - aLinkedList.addFirst(6); - assertEquals(6, aLinkedList.get(0)); - assertEquals(5, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - - @Test - public void testAddLast() { - aLinkedList.addLast("hello"); - assertEquals("hello", aLinkedList.get(0)); - - aLinkedList.addLast("world"); - assertEquals("hello", aLinkedList.get(0)); - assertEquals("world", aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - - @Test - public void testRemoveFirst() { - aLinkedList.addLast("hello"); - aLinkedList.addLast("world"); - - aLinkedList.removeFirst(); - assertEquals("world", aLinkedList.get(0)); - assertEquals(1, aLinkedList.size()); - - aLinkedList.removeFirst(); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testRemoveLast() { - aLinkedList.addFirst("world"); - aLinkedList.addFirst("hello"); - - aLinkedList.removeLast(); - assertEquals("hello", aLinkedList.get(0)); - assertEquals(1, aLinkedList.size()); - - aLinkedList.removeLast(); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testLinkedListFunctional() { - for (int i=1; i<4; i++) { - aLinkedList.add(i); // [1,2,3] - } - aLinkedList.remove(1); // [1,3] - - aLinkedList.add(1, 0); // [1,0,3] - for (int i=4; i<6; i++) { - aLinkedList.addFirst(i); // [5, 4, 1, 0, 3] - } - assertEquals(5, aLinkedList.size()); - assertEquals(5, aLinkedList.get(0)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(0, aLinkedList.get(3)); - - aLinkedList.remove(3); // [5, 4, 1, 3] - assertEquals(3, aLinkedList.get(aLinkedList.size()-1)); - aLinkedList.removeLast(); // [5, 4, 1] - assertEquals(1, aLinkedList.get(aLinkedList.size()-1)); - aLinkedList.removeFirst(); // [4,1] - - assertEquals(4, aLinkedList.get(0)); - assertEquals(1, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ListTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ListTest.java deleted file mode 100644 index 587bf17f4d..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ListTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import com.github.miniyk2012.coding2017.basic.Iterator; -import com.github.miniyk2012.coding2017.basic.List;; - -public class ListTest { - - protected static List aList; - - @Test - public void testFunctional() { - aList.add(1); - aList.add(2); - assertEquals(1, aList.get(0)); - assertEquals(2, aList.get(1)); - - aList.add(3); - aList.add(0, 5); - aList.add(2, 11); - assertEquals(5, aList.get(0)); - assertEquals(11, aList.get(2)); - - aList.add("hi"); - assertEquals("hi", aList.get(5)); - assertEquals(6, aList.size()); - - aList.remove(1); - assertEquals(11, aList.get(1)); - assertEquals(2, aList.get(2)); - - assertEquals(5, aList.size()); - } - - @Test - public void testAdd() { - for (int i=0; i<100; i++) - aList.add(i); - assertEquals(0, aList.get(0)); - assertEquals(99, aList.get(99)); - assertEquals(44, aList.get(44)); - } - - @Test - public void testRemove() { - aList.add(1); - aList.add(2); - aList.add(3); - int u = (Integer)aList.remove(2); - assertEquals(3, u); - assertEquals(2, aList.size()); - - aList.add(1, 5); - u = (Integer)aList.remove(0); - assertEquals(1, u); - assertEquals(5, aList.get(0)); - assertEquals(2, aList.get(1)); - assertEquals(2, aList.size()); - - aList.remove(0); - aList.remove(0); - assertEquals(0, aList.size()); - - - } - - @Test - public void testSize() { - for (int i=0; i<10; i++) - aList.add(i*2); - assertEquals(10, aList.size()); - } - - @Rule - public ExpectedException expectedEx = ExpectedException.none(); - - @Test - public void testException() { - expectedEx.expect(Exception.class); - - aList.remove(1); - aList.add(3); - aList.add(2, 5); - } - - @Test - public void testIterator() { - Iterator it = aList.iterator(); - assertEquals(false, it.hasNext()); - - aList.add(1); - aList.add(2); - aList.add(3); - - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(2, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - aList.remove(1); - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - expectedEx.expect(Exception.class); - it.next(); - } - -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/QueueTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/QueueTest.java deleted file mode 100644 index 67035c1dcf..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/QueueTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.test; - -import static org.junit.Assert.*; -import org.junit.Before; -import org.junit.Test; -import com.github.miniyk2012.coding2017.basic.Queue; - -public class QueueTest { - private Queue queue; - - @Before - public void setUpQueue() { - queue = new Queue(); - } - - @Test - public void testQueueFunctional() { - assertEquals(true, queue.isEmpty()); - queue.enQueue(4); - queue.enQueue(2); - assertEquals(2, queue.size()); - assertEquals(false, queue.isEmpty()); - - int i = (Integer)queue.deQueue(); - assertEquals(4, i); - i = (Integer)queue.deQueue(); - assertEquals(2, i); - - assertEquals(0, queue.size()); - assertEquals(true, queue.isEmpty()); - } - -} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/StackTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/StackTest.java deleted file mode 100644 index a9b4e14afd..0000000000 --- a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/StackTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.github.miniyk2012.coding2017.basic.Stack; - -public class StackTest { - - private Stack stack; - - @Before - public void setUpStack() { - stack = new Stack(); - } - - @Test - public void testStackFunctional() { - assertEquals(true, stack.isEmpty()); - stack.push(4); - stack.push(2); - assertEquals(2, stack.size()); - assertEquals(false, stack.isEmpty()); - - int i = (Integer)stack.pop(); - assertEquals(2, i); - - i = (Integer)stack.peek(); - assertEquals(4, i); - - i = (Integer)stack.pop(); - assertEquals(4, i); - - assertEquals(0, stack.size()); - assertEquals(true, stack.isEmpty()); - } - -} diff --git a/group02/851113375/.gitignore b/group02/851113375/.gitignore deleted file mode 100644 index fa968c2f2b..0000000000 --- a/group02/851113375/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/bin/ -.classpath -.project diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/ArrayList.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/ArrayList.java deleted file mode 100644 index 1aa396ce37..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,91 +0,0 @@ - -package com.github.eloiseSJTU.coding2017.basic; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - ensureCapacity(size + 1); - - elementData[size++] = o; - } - - public void add(int index, Object o) { - checkBoundsForAdd(index); - - ensureCapacity(size + 1); - - if (index < size) { - System.arraycopy(elementData, index, elementData, index + 1, size - index); - } - elementData[index] = o; - size++; - } - - public Object get(int index) { - checkBounds(index); - - return elementData[index]; - } - - public Object remove(int index) { - checkBounds(index); - - Object o = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - elementData[--size] = null; - return o; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new Itr(); - } - - private class Itr implements Iterator { - - private int cur; - - @Override - public boolean hasNext() { - return cur != size; - } - - @Override - public Object next() { - if (cur >= size) { - throw new NoSuchElementException(); - } - return elementData[cur++]; - } - - } - - private void ensureCapacity(int capacity) { - if (capacity > elementData.length) { - capacity = elementData.length << 1; - elementData = Arrays.copyOf(elementData, capacity); - } - } - - private void checkBounds(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - } - - private void checkBoundsForAdd(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - } -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/BinaryTreeNode.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index 9aa88f2155..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic; - -public class BinaryTreeNode { - - private Integer data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode() {} - - public BinaryTreeNode(Integer data, BinaryTreeNode left, BinaryTreeNode right) { - this.data = data; - this.left = left; - this.right = right; - } - - public Integer getData() { - return data; - } - - public void setData(Integer data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Integer o) { - if (data == null) { - data = o; - } else { - if (o < data) { - if (left == null) { - left = new BinaryTreeNode(o, null, null); - } else { - left = left.insert(o); - } - } else { - if (right == null) { - right = new BinaryTreeNode(o, null, null); - } else { - right = right.insert(o); - } - } - } - return this; - } - - public void print() { - if (left != null) { - left.print(); - } - System.out.println(data); - if (right != null) { - right.print(); - } - } - -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Iterator.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Iterator.java deleted file mode 100644 index c37495db66..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/LinkedList.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/LinkedList.java deleted file mode 100644 index 19833b1853..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private int size = 0; - - private Node head; - - public void add(Object o) { - addLast(o); - } - - public void add(int index, Object o) { - checkBoundsForAdd(index); - - if (index == 0) { - addFirst(o); - } else if (index == size) { - addLast(o); - } else { - Node cur = head; - while (--index > 0) { - cur = cur.next; - } - Node newNode = new Node(o, cur.next); - cur.next = newNode; - size++; - } - } - - public Object get(int index) { - checkBounds(index); - - Node cur = head; - while (index-- > 0) { - cur = cur.next; - } - return cur.data; - } - - public Object remove(int index) { - checkBounds(index); - - if (index == 0) { - return removeFirst(); - } else if (index == size - 1) { - return removeLast(); - } else { - Node cur = head; - int i = 0; - while (++i < index) { - cur = cur.next; - } - Node node = cur.next; - Object o = node.data; - cur.next = node.next; - node.data = null; - node.next = null; - size--; - return o; - } - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node newNode = new Node(o, head); - head = newNode; - size++; - } - - public void addLast(Object o) { - Node newNode = new Node(o, null); - if (head == null) { - head = newNode; - } else { - Node cur = head; - while (cur.next != null) { - cur = cur.next; - } - cur.next = newNode; - } - size++; - } - - public Object removeFirst() { - if (head == null) { - throw new NoSuchElementException(); - } - - Object o = head.data; - Node node = head.next; - head.data = null; - head.next = null; - head = node; - size--; - return o; - } - - public Object removeLast() { - if (head == null) { - throw new NoSuchElementException(); - } - - if (head.next == null) { - return removeFirst(); - } - - Node cur = head; - int index = 0; - while (++index < size - 1) { - cur = cur.next; - } - Object o = cur.next.data; - cur.next.data = null; - cur.next = null; - size--; - return o; - } - - public Iterator iterator() { - return new Itr(); - } - - private class Itr implements Iterator { - - private Node cur = head; - - @Override - public boolean hasNext() { - return cur != null; - } - - @Override - public Object next() { - if (cur == null) { - throw new NoSuchElementException(); - } - Object o = cur.data; - cur = cur.next; - return o; - } - - } - - private static class Node { - Object data; - Node next; - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } - - private void checkBounds(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - } - - private void checkBoundsForAdd(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - } -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/List.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/List.java deleted file mode 100644 index 2f6bdcc950..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/List.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); - - public Iterator iterator(); -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Queue.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Queue.java deleted file mode 100644 index 96e6547548..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Queue.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic; - -public class Queue { - - private int size = 0; - - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o) { - elementData.addLast(o); - size++; - } - - public Object deQueue() { - Object o = elementData.get(0); - elementData.removeFirst(); - size--; - return o; - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Stack.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Stack.java deleted file mode 100644 index 22b5117842..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Stack.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic; - -public class Stack { - - private int size = 0; - - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - size++; - } - - public Object pop() { - Object o = elementData.get(--size); - elementData.remove(size); - return o; - } - - public Object peek() { - return elementData.get(size - 1); - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ArrayListTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ArrayListTest.java deleted file mode 100644 index a2bd0cad69..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ArrayListTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic.test; - -import org.junit.Before; - -import com.github.eloiseSJTU.coding2017.basic.ArrayList; - - -public class ArrayListTest extends ListTest { - - @Before - public void setUpArrayList() { - aList = new ArrayList(); - } - -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/BinaryTreeNodeTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/BinaryTreeNodeTest.java deleted file mode 100644 index 3da3cf3fa0..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/BinaryTreeNodeTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic.test; - -import static org.junit.Assert.assertEquals; - -import org.junit.Before; -import org.junit.Test; - -import com.github.eloiseSJTU.coding2017.basic.BinaryTreeNode; - -public class BinaryTreeNodeTest { - - private BinaryTreeNode binaryTreeNode; - - @Before - public void setUpBinaryTreeNode() { - binaryTreeNode = new BinaryTreeNode(); - } - - @Test - public void testBinaryTreeNodeFunctional() { - binaryTreeNode.insert(4); - binaryTreeNode.insert(1); - binaryTreeNode.insert(3); - binaryTreeNode.insert(5); - binaryTreeNode.insert(2); - assertEquals(true, 4 == binaryTreeNode.getData()); - assertEquals(true, 1 == binaryTreeNode.getLeft().getData()); - assertEquals(true, 5 == binaryTreeNode.getRight().getData()); - assertEquals(true, 3 == binaryTreeNode.getLeft().getRight().getData()); - assertEquals(true, 2 == binaryTreeNode.getLeft().getRight().getLeft().getData()); - binaryTreeNode.print(); - } - -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/LinkedListTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/LinkedListTest.java deleted file mode 100644 index 0ad905694c..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/LinkedListTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic.test; - -import static org.junit.Assert.*; -import org.junit.Before; -import org.junit.Test; -import com.github.eloiseSJTU.coding2017.basic.LinkedList; - -public class LinkedListTest extends ListTest{ - - private LinkedList aLinkedList; - - @Before - public void setUpLinkedList() { - aList = new LinkedList(); - aLinkedList = new LinkedList(); - } - - @Test - public void testAddFirst() { - aLinkedList.addFirst(5); - assertEquals(5, aLinkedList.get(0)); - - aLinkedList.addFirst(6); - assertEquals(6, aLinkedList.get(0)); - assertEquals(5, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - - @Test - public void testAddLast() { - aLinkedList.addLast("hello"); - assertEquals("hello", aLinkedList.get(0)); - - aLinkedList.addLast("world"); - assertEquals("hello", aLinkedList.get(0)); - assertEquals("world", aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - - @Test - public void testRemoveFirst() { - aLinkedList.addLast("hello"); - aLinkedList.addLast("world"); - - aLinkedList.removeFirst(); - assertEquals("world", aLinkedList.get(0)); - assertEquals(1, aLinkedList.size()); - - aLinkedList.removeFirst(); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testRemoveLast() { - aLinkedList.addFirst("world"); - aLinkedList.addFirst("hello"); - - aLinkedList.removeLast(); - assertEquals("hello", aLinkedList.get(0)); - assertEquals(1, aLinkedList.size()); - - aLinkedList.removeLast(); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testLinkedListFunctional() { - for (int i=1; i<4; i++) { - aLinkedList.add(i); // [1,2,3] - } - aLinkedList.remove(1); // [1,3] - - aLinkedList.add(1, 0); // [1,0,3] - for (int i=4; i<6; i++) { - aLinkedList.addFirst(i); // [5, 4, 1, 0, 3] - } - assertEquals(5, aLinkedList.size()); - assertEquals(5, aLinkedList.get(0)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(0, aLinkedList.get(3)); - - aLinkedList.remove(3); // [5, 4, 1, 3] - assertEquals(3, aLinkedList.get(aLinkedList.size()-1)); - aLinkedList.removeLast(); // [5, 4, 1] - assertEquals(1, aLinkedList.get(aLinkedList.size()-1)); - aLinkedList.removeFirst(); // [4,1] - - assertEquals(4, aLinkedList.get(0)); - assertEquals(1, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - } - -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ListTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ListTest.java deleted file mode 100644 index 956ecb9167..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ListTest.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic.test; - -import static org.junit.Assert.assertEquals; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import com.github.eloiseSJTU.coding2017.basic.Iterator; -import com.github.eloiseSJTU.coding2017.basic.List;; - -public class ListTest { - - protected static List aList; - - @Test - public void testFunctional() { - aList.add(1); - aList.add(2); - assertEquals(1, aList.get(0)); - assertEquals(2, aList.get(1)); - - aList.add(3); - aList.add(0, 5); - aList.add(2, 11); - assertEquals(5, aList.get(0)); - assertEquals(11, aList.get(2)); - - aList.add("hi"); - assertEquals("hi", aList.get(5)); - assertEquals(6, aList.size()); - - aList.remove(1); - assertEquals(11, aList.get(1)); - assertEquals(2, aList.get(2)); - - assertEquals(5, aList.size()); - } - - @Test - public void testAdd() { - for (int i = 0; i < 1000; i++) - aList.add(i); - assertEquals(0, aList.get(0)); - assertEquals(100, aList.get(100)); - assertEquals(999, aList.get(999)); - } - - @Test - public void testRemove() { - aList.add(1); - aList.add(2); - aList.add(3); - int u = (Integer)aList.remove(2); - assertEquals(3, u); - assertEquals(2, aList.size()); - - aList.add(1, 5); - u = (Integer)aList.remove(0); - assertEquals(1, u); - assertEquals(5, aList.get(0)); - assertEquals(2, aList.get(1)); - assertEquals(2, aList.size()); - - aList.remove(0); - aList.remove(0); - assertEquals(0, aList.size()); - - - } - - @Test - public void testSize() { - for (int i = 0; i < 10; i++) - aList.add(i * 2); - assertEquals(10, aList.size()); - } - - @Rule - public ExpectedException expectedEx = ExpectedException.none(); - - @Test - public void testException() { - expectedEx.expect(Exception.class); - aList.remove(1); - - aList.add(3); - - expectedEx.expect(Exception.class); - aList.add(2, 5); - } - - @Test - public void testIterator() { - Iterator it = aList.iterator(); - assertEquals(false, it.hasNext()); - - aList.add(1); - aList.add(2); - aList.add(3); - - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(2, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - aList.remove(1); - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - expectedEx.expect(Exception.class); - it.next(); - } - -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/QueueTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/QueueTest.java deleted file mode 100644 index 39023e8aaa..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/QueueTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic.test; - -import static org.junit.Assert.*; -import org.junit.Before; -import org.junit.Test; -import com.github.eloiseSJTU.coding2017.basic.Queue; - -public class QueueTest { - private Queue queue; - - @Before - public void setUpQueue() { - queue = new Queue(); - } - - @Test - public void testQueueFunctional() { - assertEquals(true, queue.isEmpty()); - queue.enQueue(4); - queue.enQueue(2); - assertEquals(2, queue.size()); - assertEquals(false, queue.isEmpty()); - - int i = (Integer)queue.deQueue(); - assertEquals(4, i); - i = (Integer)queue.deQueue(); - assertEquals(2, i); - - assertEquals(0, queue.size()); - assertEquals(true, queue.isEmpty()); - } - -} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/StackTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/StackTest.java deleted file mode 100644 index 98d2bd9de9..0000000000 --- a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/StackTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.eloiseSJTU.coding2017.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.github.eloiseSJTU.coding2017.basic.Stack; - -public class StackTest { - - private Stack stack; - - @Before - public void setUpStack() { - stack = new Stack(); - } - - @Test - public void testStackFunctional() { - assertEquals(true, stack.isEmpty()); - stack.push(4); - stack.push(2); - assertEquals(2, stack.size()); - assertEquals(false, stack.isEmpty()); - - int i = (Integer)stack.pop(); - assertEquals(2, i); - - i = (Integer)stack.peek(); - assertEquals(4, i); - - i = (Integer)stack.pop(); - assertEquals(4, i); - - assertEquals(0, stack.size()); - assertEquals(true, stack.isEmpty()); - } - -} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayList.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayList.java deleted file mode 100644 index 286c039e06..0000000000 --- a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.github.lqingchenl.coding2017.basic; - -import java.util.Arrays; - - -public class ArrayList implements List { - private int size = 0; - - private Object[] elementData = new Object[3]; - - /** - * 添加一个元素 - * - * @param o - */ - public void add(Object o) { - elementData[size] = o; - size = size + 1; - if (size >= elementData.length) { - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - } - - /** - * 往固定位置添加一个元素 - * - * @param index - * @param o - */ - public void add(int index, Object o) { - if (get(index - 1) == null) { //原来为空,添加到指定位置 - add(o); - return; - } - size++; - if (size >= elementData.length) { - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - } - - /** - * 获取元素 - * - * @param index - * @return - */ - public Object get(int index) { - - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("索引越界"); - } - return elementData[index]; - } - - /** - * 移除元素 - * - * @param index - * @return - */ - public Object remove(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("索引越界"); - } - Object deleteData = elementData[index]; - if (index == size - 1) { - elementData[index] = null; - } else { - int movedCount = size - index; - System.arraycopy(elementData, index + 1, elementData, index, movedCount); - } - size--; - return deleteData; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return null; - } - -} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayListTest.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayListTest.java deleted file mode 100644 index ebf29cf406..0000000000 --- a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayListTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.github.lqingchenl.coding2017.basic; - -import com.github.lqingchenl.coding2017.basic.ArrayList; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import static org.junit.Assert.assertEquals; - -/** - * ArrayList Tester. - */ -public class ArrayListTest { - - private static ArrayList testArray = new ArrayList(); - - /** - * Method: add(Object o) - */ - @Test - public void testAddO() throws Exception { - testArray.add(1); - testArray.add(2); - assertEquals(1, testArray.get(0)); - assertEquals(2, testArray.get(1)); - } - - /** - * Method: add(int index, Object o) - */ - @Test - public void testAddForIndexO() throws Exception { - testArray.add(1, 1); - testArray.add(2, 2); - assertEquals(1, testArray.get(0)); - assertEquals(2, testArray.get(1)); - } - - /** - * Method: get(int index) - */ - @Test - public void testGet() throws Exception { - testArray.add(1); - assertEquals(1, testArray.get(0)); - } - - /** - * Method: remove(int index) - */ - @Test - public void testRemove() throws Exception { - testArray.add(1); - testArray.add(2); - assertEquals(1, testArray.remove(0)); - assertEquals(2, testArray.remove(0)); - } - - /** - * Method: size() - */ - @Test - public void testSize() throws Exception { - testArray.add(1); - testArray.add(2); - assertEquals(2, testArray.size()); - } - -} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Iterator.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Iterator.java deleted file mode 100644 index 086e1cd342..0000000000 --- a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.lqingchenl.coding2017.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedList.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedList.java deleted file mode 100644 index 316cad2ee5..0000000000 --- a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.github.lqingchenl.coding2017.basic; - -public class LinkedList implements List { - - private int size = 0; - - private Node head; - - public void add(Object o) { - if (head == null) { - head = new Node(o); - } else { - Node nextNode = head; - while (nextNode.next != null) { - nextNode = nextNode.next; - } - nextNode.next = new Node(o); - } - size++; - } - - public void add(int index, Object o) { - if (index == 0) { - addFirst(o); - return; - } - Node oldNode = getNode(index - 1); - Node newNode = new Node(o); - newNode.next = oldNode.next; - oldNode.next = newNode; - size++; - } - - public Object get(int index) { - Node node = head; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node.data; - } - - public Node getNode(int index) { - Node node = head; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - } - - public Object remove(int index) { - if (index == 1) { - return removeFirst(); - } - Node fatherNode = getNode(index - 2); - Node oldNode = getNode(index - 1); - fatherNode.next = oldNode.next; - size--; - - return oldNode.data; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node newNode = new Node(o); - newNode.next = head; - head = newNode; - size++; - } - - public void addLast(Object o) { - if (head == null) { - addFirst(o); - return; - } - Node newNode = new Node(o); - Node lastNode = getNode(size - 1); - lastNode.next = newNode; - size++; - } - - public Object removeFirst() { - Node oldHead = head; - Node secondNode = head.next; - head = secondNode; - size--; - return oldHead.data; - } - - public Object removeLast() { - if (size == 1) { - return removeFirst(); - } - Object data = get(size - 1); - Node oldNode = getNode(size - 2); - oldNode.next = null; - size--; - return data; - } - - public Iterator iterator() { - return null; - } - - - private static class Node { - Object data; - Node next; - - public Node(Object data) { - this.data = data; - } - - } - -} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedListTest.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedListTest.java deleted file mode 100644 index 0ef6290d28..0000000000 --- a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedListTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.github.lqingchenl.coding2017.basic; - -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class LinkedListTest { - - private static LinkedList testLinkedList = new LinkedList(); - - /** - * Method: add(Object o) - */ - @Test - public void testAdd() throws Exception { - testLinkedList.add(1); - testLinkedList.add(2); - assertEquals(1, testLinkedList.get(0)); - assertEquals(2, testLinkedList.get(1)); - } - - /** - * Method: add(int index, Object o) - */ - @Test - public void testAddForIndex() throws Exception { - testLinkedList.add(0, 0); - testLinkedList.add(1, 1); - testLinkedList.add(2, 2); - assertEquals(0, testLinkedList.get(0)); - assertEquals(1, testLinkedList.get(1)); - assertEquals(2, testLinkedList.get(2)); - } - - /** - * Method: get(int index) - */ - @Test - public void testGet() throws Exception { - testLinkedList.add(1); - testLinkedList.add(2); - assertEquals(1, testLinkedList.get(0)); - assertEquals(2, testLinkedList.get(1)); - } - - /** - * Method: getNode(int index) - */ - @Test - public void testGetNode() throws Exception { - testLinkedList.add(1); - testLinkedList.add(2); - assertNotNull(testLinkedList.get(0)); - } - - /** - * Method: remove(int index) - */ - @Test - public void testRemove() throws Exception { - testLinkedList.add(1); - testLinkedList.add(2); - assertEquals(1, testLinkedList.get(0)); - } - - /** - * Method: size() - */ - @Test - public void testSize() throws Exception { - testLinkedList.add(1); - testLinkedList.add(2); - assertEquals(2, testLinkedList.size()); - } - - /** - * Method: addFirst(Object o) - */ - @Test - public void testAddFirst() throws Exception { - testLinkedList.addFirst(1); - assertEquals(1, testLinkedList.get(0)); - } - - /** - * Method: addLast(Object o) - */ - @Test - public void testAddLast() throws Exception { - testLinkedList.addLast(1); - assertEquals(1, testLinkedList.get(0)); - } - - /** - * Method: removeFirst() - */ - @Test - public void testRemoveFirst() throws Exception { - testLinkedList.addFirst(1); - testLinkedList.addFirst(2); - assertEquals(2, testLinkedList.removeFirst()); - assertEquals(1, testLinkedList.removeFirst()); - } - - /** - * Method: removeLast() - */ - @Test - public void testRemoveLast() throws Exception { - testLinkedList.addFirst(1); - assertEquals(1, testLinkedList.removeLast()); - } - - /** - * Method: iterator() - */ - @Test - public void testIterator() throws Exception { - } - - -} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/List.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/List.java deleted file mode 100644 index d993812b9a..0000000000 --- a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.lqingchenl.coding2017.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Queue.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Queue.java deleted file mode 100644 index eb7f7e3cb0..0000000000 --- a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Queue.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.lqingchenl.coding2017.basic; - -public class Queue { - private LinkedList queue = new LinkedList(); - private int size; - - public void enQueue(Object o) { - queue.addLast(o); - size++; - } - - public Object deQueue() { - Object o = queue.removeFirst(); - size--; - return o; - } - - public boolean isEmpty() { - if (queue.size() == 0) - return true; - return false; - } - - public int size() { - return size; - } - -} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/QueueTest.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/QueueTest.java deleted file mode 100644 index 9b26b3cdcf..0000000000 --- a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/QueueTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.github.lqingchenl.coding2017.basic; - -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import static org.junit.Assert.assertEquals; - -/** - * Queue Tester. - */ -public class QueueTest { - - private static Queue testQueue = new Queue(); - - /** - * Method: enQueue(Object o) - */ - @Test - public void testEnQueue() throws Exception { - testQueue.enQueue(1); - assertEquals(1, testQueue.deQueue()); - } - - /** - * Method: deQueue() - */ - @Test - public void testDeQueue() throws Exception { - testQueue.enQueue(1); - testQueue.enQueue(2); - assertEquals(1, testQueue.deQueue()); - assertEquals(2, testQueue.deQueue()); - } - - /** - * Method: isEmpty() - */ - @Test - public void testIsEmpty() throws Exception { - testQueue.enQueue(1); - assertEquals(1, testQueue.deQueue()); - assertEquals(true, testQueue.isEmpty()); - } - - /** - * Method: size() - */ - @Test - public void testSize() throws Exception { - testQueue.enQueue(1); - testQueue.enQueue(2); - assertEquals(2, testQueue.size()); - } - - -} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Stack.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Stack.java deleted file mode 100644 index 8b25283b40..0000000000 --- a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Stack.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.github.lqingchenl.coding2017.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - private int size = 0; - - public void push(Object o) { - elementData.add(o); - size++; - } - - public Object pop() { - Object o = elementData.get(size - 1); - elementData.remove(size - 1); - size--; - return o; - } - - public Object peek() { - return elementData.get(size - 1); - } - - public boolean isEmpty() { - if (elementData.size() == 0) - return true; - return false; - } - - public int size() { - return size; - } - -} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/StackTest.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/StackTest.java deleted file mode 100644 index b2d4935c4e..0000000000 --- a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/StackTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.github.lqingchenl.coding2017.basic; - -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import static org.junit.Assert.assertEquals; - -/** - * Stack Tester. - */ -public class StackTest { - - private static Stack testStack = new Stack(); - - /** - * Method: push(Object o) - */ - @Test - public void testPush() throws Exception { - testStack.push(1); - assertEquals(1, testStack.peek()); - } - - /** - * Method: pop() - */ - @Test - public void testPop() throws Exception { - testStack.push(1); - assertEquals(1, testStack.pop()); - } - - /** - * Method: peek() - */ - @Test - public void testPeek() throws Exception { - testStack.push(1); - assertEquals(1, testStack.peek()); - testStack.push(2); - assertEquals(2, testStack.peek()); - } - - /** - * Method: isEmpty() - */ - @Test - public void testIsEmpty() throws Exception { - testStack.push(1); - assertEquals(false, testStack.isEmpty()); - } - - /** - * Method: size() - */ - @Test - public void testSize() throws Exception { - testStack.push(1); - testStack.push(2); - assertEquals(2, testStack.size()); - } - -} diff --git a/group02/group02.md b/group02/group02.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group02/group02.md +++ /dev/null @@ -1 +0,0 @@ - diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayList.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayList.java" deleted file mode 100644 index 4a68cd276b..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayList.java" +++ /dev/null @@ -1,102 +0,0 @@ -package com.byhieg.coding2017; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - - public void add(Object o) { - isCapacityEnough(size + 1); - elementData[size++] = o; - } - - public void add(int index, Object o) { - checkForAdd(index); - isCapacityEnough(size + 1); - System.arraycopy(elementData,index,elementData,index + 1,size - index); - elementData[index] = o; - size++; - } - - private void checkForAdd(int index){ - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("index不在指定范围内"); - } - - } - private void isCapacityEnough(int size) { - if (size > 100) { - explicitCapacity(size); - } - if (size < 0) { - throw new OutOfMemoryError(); - } - } - - private final static int MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8; - - public void explicitCapacity(int size) { - int newLength = elementData.length * 2; - if (newLength > (MAX_ARRAY_LENGTH)){ - newLength = (size > MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH); - } - elementData = Arrays.copyOf(elementData, newLength); - - } - - - public Object get(int index) { - checkRange(index); - return elementData[index]; - } - - private void checkRange(int index){ - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException("index不在范围内"); - } - } - - public Object remove(int index) { - Object o = get(index); - //要保证后面的 index + 1是有效的 - int moveSize = size - index - 1; - if (moveSize > 0) { - System.arraycopy(elementData,index + 1,elementData,index, size - index); - } - elementData[--size] = null; - return o; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new MyIterator(); - } - - private class MyIterator implements Iterator { - - private int cursor = 0; - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public Object next() { - if (cursor >= size) { - throw new NoSuchElementException(); - } - return elementData[cursor++]; - } - } - - -} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTree.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTree.java" deleted file mode 100644 index 26407d749a..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTree.java" +++ /dev/null @@ -1,66 +0,0 @@ -package com.byhieg.coding2017; - -/** - * Created by byhieg on 17/2/22. - * Mail to byhieg@gmail.com - */ - -public class BinaryTree { - - private BinaryTreeNode root = new BinaryTreeNode(); - - public BinaryTree(Object rootData){ - root = root.insert(rootData); - } - - - //左边的值小于等于父节点的值,右边的值大于父节点的值 - private void insertNode(BinaryTreeNode root, BinaryTreeNode node) { - int value = (int)node.getData(); - int rootValue = (int)root.getData(); - if (value <= rootValue){ - insertLeft(root,node); - }else { - insertRight(root,node); - } - } - - - public void insert(Object o) { - BinaryTreeNode node = new BinaryTreeNode(); - node = node.insert(o); - insertNode(root,node); - } - - private void insertLeft(BinaryTreeNode father, BinaryTreeNode node) { - if (father.getLeft() == null) { - father.setLeft(node); - }else{ - insertNode(father.getLeft(),node); - } - } - - private void insertRight(BinaryTreeNode father, BinaryTreeNode node) { - if (father.getRight() == null) { - father.setRight(node); - } else { - insertNode(father.getRight(),node); - } - } - - //前序遍历输出书 - private void preOrder(BinaryTreeNode node) { - if (node != null) { - System.out.println(node.getData()); - preOrder(node.getLeft()); - preOrder(node.getRight()); - } - } - - - //打印树 - public void printTree(){ - preOrder(root); - } - -} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTreeNode.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTreeNode.java" deleted file mode 100644 index 67f70bb696..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTreeNode.java" +++ /dev/null @@ -1,42 +0,0 @@ -package com.byhieg.coding2017; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o) { - BinaryTreeNode node = new BinaryTreeNode(); - int value = (int)o; - node.setData(value); - node.setRight(null); - node.setLeft(null); - return node; - } - -} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Iterator.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Iterator.java" deleted file mode 100644 index beef5b5554..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Iterator.java" +++ /dev/null @@ -1,7 +0,0 @@ -package com.byhieg.coding2017; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/LinkedList.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/LinkedList.java" deleted file mode 100644 index 04b3f9f027..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/LinkedList.java" +++ /dev/null @@ -1,152 +0,0 @@ -package com.byhieg.coding2017; - -import javax.swing.text.html.HTMLDocument; - -public class LinkedList implements List { - - private Node head; - int size = 0; - - public void add(Object o) { - addLast(o); - } - - public void add(int index, Object o) { - checkRangeForAdd(index); - if (index == size) { - addLast(o); - } - Node nextNode = node(index); - Node newNode = new Node(o, nextNode); - - Node prevNode; - if (index == 0) { - prevNode = null; - } else { - prevNode = node(index); - } - - - if (prevNode == null) { - head = newNode; - }else{ - prevNode.next = newNode; - } - - size++; - } - - - private Node node(int index) { - Node cursor = head; - for (int i = 0; i < index; i++) { - cursor = cursor.next; - } - return cursor; - } - - private void checkRangeForAdd(int index) { - if (index > size || index < 0) { - throw new IndexOutOfBoundsException("指定的index超过界限"); - } - } - - public Object get(int index) { - checkRange(index); - return node(index).data; - } - - private void checkRange(int index) { - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException("指定index超过界限"); - } - } - - public Object remove(int index) { - checkRange(index); - Node targetNode = node(index); - Object o = targetNode.data; - Node prevNode ; - Node nextNode = targetNode.next; - - if (index == 0) { - prevNode = null; - }else{ - prevNode = node(index - 1); - } - if (prevNode == null) { - head = nextNode; - targetNode.next = null; - }else { - prevNode.next = nextNode; - targetNode.next = null; - } - - targetNode.data = null; - size --; - return o; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node nextNode = head; - Node newNode = new Node(o, nextNode); - head = newNode; - size++; - } - - public void addLast(Object o) { - Node newNode = new Node(o, null); - if (size == 0) { - head = newNode; - }else{ - Node lastNode = node(size - 1); - lastNode.next = newNode; - } - size++; - } - - public Object removeFirst() { - return remove(0); - } - - public Object removeLast() { - return remove(size() - 1); - } - - public Iterator iterator() { - - return new MyIterator(); - } - - private class MyIterator implements Iterator { - - public Node cursor = head; - @Override - public boolean hasNext() { - return cursor != null; - } - - @Override - public Object next() { - Object o = cursor.data; - cursor = cursor.next; - return o; - } - } - - - - private static class Node { - Object data; - Node next; - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } -} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/List.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/List.java" deleted file mode 100644 index 15c27c8cf2..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/List.java" +++ /dev/null @@ -1,13 +0,0 @@ -package com.byhieg.coding2017; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Queue.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Queue.java" deleted file mode 100644 index f83ad337e7..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Queue.java" +++ /dev/null @@ -1,23 +0,0 @@ -package com.byhieg.coding2017; - -public class Queue { - - private LinkedList list = new LinkedList(); - public void enQueue(Object o){ - list.addLast(o); - } - - public Object deQueue() { - Object value = list.get(0); - list.removeFirst(); - return value; - } - - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return list.size(); - } -} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Stack.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Stack.java" deleted file mode 100644 index 45b8530a8f..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Stack.java" +++ /dev/null @@ -1,36 +0,0 @@ -package com.byhieg.coding2017; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (size() == 0) { - throw new EmptyStackException(); - } - Object value = elementData.get(size() - 1); - elementData.remove(size() - 1); - return value; - } - - public Object peek(){ - if (size() == 0) { - throw new EmptyStackException(); - } - return elementData.get(size() - 1); - } - - public boolean isEmpty(){ - return size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayListTest.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayListTest.java" deleted file mode 100644 index b0b3b6704d..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayListTest.java" +++ /dev/null @@ -1,81 +0,0 @@ -package com.byhieg.coding2017test; - -import com.byhieg.coding2017.ArrayList; -import com.byhieg.coding2017.Iterator; -import junit.framework.TestCase; - -/** - * Created by byhieg on 17/2/22. - * Mail to byhieg@gmail.com - */ -public class ArrayListTest extends TestCase { - ArrayList arrayList = new ArrayList(); - - public void testAdd() throws Exception { - arrayList.add(1); - arrayList.add(null); - arrayList.add(-1); - arrayList.add("1"); - arrayList.add(true); - arrayList.add(Integer.MAX_VALUE); - arrayList.add(Integer.MIN_VALUE); - - - } - - public void testAdd1() throws Exception { -// arrayList.add(-1,0); -// arrayList.add(100,0); - arrayList.add(0,2); - arrayList.add(1,10); - arrayList.add(2,111); - } - - public void testGet() throws Exception { - for (int i = 0; i < 10 ; i++) { - arrayList.add(i); - } - - for (int i = 0 ; i < 10 ; i++) { - System.out.println(arrayList.get(i)); - } - } - - public void testRemove() throws Exception { - for (int i = 0; i < 10 ; i++) { - arrayList.add(i); - } - - for (int i = 0 ; i < 10 ; i++) { - System.out.println(arrayList.get(i)); - } - - for (int i = 0 ; i < 10 ; i++) { - arrayList.remove(9 - i); - } - - for (int i = 0 ; i < arrayList.size() ; i++) { - System.out.println(arrayList.get(i)); - } - } - - public void testSize() throws Exception { - for (int i = 0; i < 10 ; i++) { - arrayList.add(i); - } - System.out.println(arrayList.size()); - } - - public void testIterator() throws Exception { - for (int i = 0; i < 10 ; i++) { - arrayList.add(i); - } - - System.out.println("开始测试Iterator"); - Iterator iterator = arrayList.iterator(); - while (iterator.hasNext()) { - System.out.println(iterator.next()); - } - } - -} \ No newline at end of file diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/BinaryTreeTest.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/BinaryTreeTest.java" deleted file mode 100644 index 1945f2c695..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/BinaryTreeTest.java" +++ /dev/null @@ -1,24 +0,0 @@ -package com.byhieg.coding2017test; - -import com.byhieg.coding2017.BinaryTree; -import com.byhieg.coding2017.BinaryTreeNode; -import junit.framework.TestCase; - -/** - * Created by byhieg on 17/2/22. - * Mail to byhieg@gmail.com - */ -public class BinaryTreeTest extends TestCase { - - public void testPrintTree() throws Exception { - BinaryTree tree = new BinaryTree(5); - tree.insert(2); - tree.insert(7); - tree.insert(1); - tree.insert(6); - tree.insert(4); - tree.insert(8); - tree.printTree(); - } - -} \ No newline at end of file diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/LinkedListTest.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/LinkedListTest.java" deleted file mode 100644 index 61a78e150a..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/LinkedListTest.java" +++ /dev/null @@ -1,122 +0,0 @@ -package com.byhieg.coding2017test; - -import com.byhieg.coding2017.Iterator; -import com.byhieg.coding2017.LinkedList; -import com.sun.org.apache.bcel.internal.generic.INEG; -import junit.framework.TestCase; - -/** - * Created by byhieg on 17/2/22. - * Mail to byhieg@gmail.com - */ -public class LinkedListTest extends TestCase { - private LinkedList list = new LinkedList(); - public void testAdd() throws Exception { - list.add(null); - list.add(-1); - list.add(-2); - list.add(0x5); - list.add(true); - list.add("123"); - list.add(Integer.MAX_VALUE + 100000); - - } - - public void testAdd1() throws Exception { -// list.add(-1,100); -// list.add(20,111); - list.add(0,11); - list.add(1,"sad"); - list.add(2,"fas"); - - } - - public void testGet() throws Exception { - for (int i = 0 ; i < 10 ; i++) { - list.add(i,i + ""); - } - - for (int i = 0 ;i < list.size();i++) { - System.out.println(list.get(i)); - } - } - - public void testRemove() throws Exception { - for (int i = 0 ; i < 10 ; i++) { - list.add(i,i + ""); - } - - for (int i = 0 ; i < list.size() ; i++) { - list.remove(i); - } - - for (int i = 0 ;i < list.size();i++) { - System.out.println(list.get(i)); - } - } - - - public void testAddFirst() throws Exception { - list.addFirst("byhieg"); - list.addFirst("123412"); - list.addFirst("byhaieg"); - list.addFirst("byhfadas12ieg"); - list.addFirst("fas"); - for (int i = 0 ; i < list.size();i++) { - System.out.println(list.get(i)); - } - } - - public void testAddLast() throws Exception { - list.addLast("asga"); - list.addLast("124"); - list.addLast("fasd"); - list.addLast("fas"); - list.addLast("gasd2"); - - for (int i = 0 ; i < list.size();i++) { - System.out.println(list.get(i)); - } - - } - - public void testRemoveFirst() throws Exception { - list.addFirst("byhieg"); - list.addFirst("123412"); - list.addFirst("byhaieg"); - list.addFirst("byhfadas12ieg"); - list.addFirst("fas"); - for (int i = 0 ; i < list.size();i++) { - list.removeLast(); - } - - System.out.println(list.size()); - } - - public void testRemoveLast() throws Exception { - list.addLast("asga"); - list.addLast("124"); - list.addLast("fasd"); - list.addLast("fas"); - list.addLast("gasd2"); - for (int i = 0 ; i < list.size();i++) { - list.removeFirst(); - } - - System.out.println(list.size()); - } - - public void testIterator() throws Exception { - list.addLast("asga"); - list.addLast("124"); - list.addLast("fasd"); - list.addLast("fas"); - list.addLast("gasd2"); - - Iterator iterator = list.iterator(); - while (iterator.hasNext()) { - System.out.println(iterator.next()); - } - } - -} \ No newline at end of file diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/QueueTest.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/QueueTest.java" deleted file mode 100644 index 82d0fe2349..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/QueueTest.java" +++ /dev/null @@ -1,34 +0,0 @@ -package com.byhieg.coding2017test; - -import com.byhieg.coding2017.Queue; -import junit.framework.TestCase; - -/** - * Created by byhieg on 17/2/22. - * Mail to byhieg@gmail.com - */ -public class QueueTest extends TestCase { - Queue queue = new Queue(); - - public void testEnQueue() throws Exception { - queue.enQueue(1); - queue.enQueue("true"); - queue.enQueue(true); - queue.enQueue(null); - queue.enQueue(-12341); - queue.enQueue(Integer.MIN_VALUE - 10000); - - } - - public void testDeQueue() throws Exception { - for (int i = 0 ; i < 10 ; i++) { - queue.enQueue(i); - } - - while (!queue.isEmpty()) { - System.out.println(queue.deQueue()); - } - } - - -} \ No newline at end of file diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/StackTest.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/StackTest.java" deleted file mode 100644 index a81484251c..0000000000 --- "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/StackTest.java" +++ /dev/null @@ -1,52 +0,0 @@ -package com.byhieg.coding2017test; - -import com.byhieg.coding2017.Stack; -import junit.framework.TestCase; - -/** - * Created by byhieg on 17/2/22. - * Mail to byhieg@gmail.com - */ -public class StackTest extends TestCase { - Stack stack = new Stack(); - - public void testPush() throws Exception { - stack.push(1); - stack.push("31231"); - stack.push(null); - stack.push(Integer.MAX_VALUE + 1000); - stack.push(Integer.MIN_VALUE - 1000000); - stack.push(true); - stack.push('a'); - } - - public void testPop() throws Exception { - int a = 1; - for (int i = 0; i < 10; i++) { - stack.push(a + i); - } - int size = stack.size(); - while (!stack.isEmpty()){ - System.out.println(stack.pop()); - } - } - - public void testPeek() throws Exception { - char a = 'a'; - for (int i = 0; i < 10; i++) { - stack.push(a + i); - } - - System.out.println("size的大小是" + stack.size()); - System.out.println(stack.peek()); - } - - public void testIsEmpty() throws Exception { - System.out.println(stack.isEmpty()); - stack.push(1); - System.out.println(stack.isEmpty()); - - } - - -} \ No newline at end of file diff --git a/group03/1196051822/README b/group03/1196051822/README deleted file mode 100644 index c7b21c2ef0..0000000000 --- a/group03/1196051822/README +++ /dev/null @@ -1,2 +0,0 @@ -# 作业文件夹说明 -src文件夹存放是的作业源码的文件,test文件夹存放的是源码相应的测试文件 diff --git a/group03/1360464792/.gitignore b/group03/1360464792/.gitignore deleted file mode 100644 index b3c9df97d1..0000000000 --- a/group03/1360464792/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -### Java template -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### maven -target \ No newline at end of file diff --git a/group03/1360464792/pom.xml b/group03/1360464792/pom.xml deleted file mode 100644 index 5fed7b15ab..0000000000 --- a/group03/1360464792/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - 4.0.0 - - rui.study - coding2017 - 0.0.1-SNAPSHOT - - 学习数据结构 - - - 1.6 - UTF-8 - - - - - junit - junit - 4.12 - - - - - - coding2017 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - ${java.version} - ${java.version} - ${encoding} - - - - - \ No newline at end of file diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/ArrayList.java b/group03/1360464792/src/main/java/rui/study/coding2017/ArrayList.java deleted file mode 100644 index 4040049ed8..0000000000 --- a/group03/1360464792/src/main/java/rui/study/coding2017/ArrayList.java +++ /dev/null @@ -1,142 +0,0 @@ -package rui.study.coding2017; - - -import java.util.Arrays; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size; - - private Object[] elementData; - - private static Object[] emptyObjects={}; - - private static int defaultCapacity=10; - - public void add(Object o){ - ensureCapacity(this.size+1); - elementData[size++]=o; - } - - public void add(int index, Object o){ - rangeCheckForAdd(index); - if(elementData[index]!=null){ - ensureCapacity(this.size+1); - //执行数组拷贝 - System.arraycopy(elementData,index,elementData,index+1,size-index); - size++; - } - elementData[index]=o; - } - - public Object get(int index){ - rangeCheck(index); - return elementData[index]; - } - - public Object remove(int index){ - rangeCheck(index); - Object object=elementData[index]; - - int numMoved=size-index-1; - //如果是最后一位remove ,无需进行数组拷贝 - if(numMoved>0){ - System.arraycopy(elementData, index+1, elementData, index,numMoved); - } - elementData[--size]=null; - return object; - } - - public int size(){ - return this.size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - public ArrayList(){ - this.size=0; - this.elementData=emptyObjects; - } - - public ArrayList(int size){ - this.size=size; - if(size>0){ - this.elementData=new Object[size]; - }else if(size==0){ - this.elementData=emptyObjects; - }else{ - throw new IllegalArgumentException("非法容器大小 "+size); - } - - } - - /** - * 判断索引是否合法 - * @param index 索引 - */ - private void rangeCheckForAdd(int index) { - if(index>size||index<0)throw new IndexOutOfBoundsException("索引为"+index+",但是当前数组长度为:"+size); - } - - /** - * 判断索引是否合法 , - * @param index 索引 - */ - private void rangeCheck(int index) { - if(index>=size||index<0)throw new IndexOutOfBoundsException("索引为"+index+",但是当前数组长度为:"+size); - } - - - /** - * 确保当前数组能够长度能够容纳新的对象,如果不够,就自行增长 - * @param needLength 需要的数组长度 - */ - private void ensureCapacity(int needLength) { - if(elementData==emptyObjects){ - needLength = Math.max(defaultCapacity, needLength); - } - - if(needLength-elementData.length>0){ - this.grow(needLength); - } - } - - /** - * 数组扩容 - * @param needLength 需要的长度 - */ - private void grow(int needLength) { - int elementLength=elementData.length; - //扩容1.5倍 - int newLength=elementLength+(elementLength>>1); - - if(needLength-newLength>0){ - newLength=needLength; - } - this.elementData= Arrays.copyOf(this.elementData,newLength); - } - - private class ArrayListIterator implements Iterator{ - //游标,当前迭代器执行到何处了 - private int cursor=0; - - @Override - public boolean hasNext() { - return cursor!=size; - } - - @Override - public Object next() { - if (cursor >= size)throw new NoSuchElementException(); - Object[] elementData = ArrayList.this.elementData; - return elementData[cursor++]; - } - } - - - - -} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTree.java b/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTree.java deleted file mode 100644 index 7d63153ffb..0000000000 --- a/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTree.java +++ /dev/null @@ -1,93 +0,0 @@ -package rui.study.coding2017; - -/** - * 二叉树 - * Created by 赵睿 on 2017/2/25. - */ -public class BinaryTree { - private BinaryTreeNode root; - - private int size; - - public void insert(Comparable comparable){ - BinaryTreeNode binaryTreeNode=new BinaryTreeNode(comparable); - - if(this.root==null){ - this.root=binaryTreeNode; - }else { - boolean flag=false; - BinaryTreeNode cursorNode=root; - while(!flag){ - if(comparable.compareTo(cursorNode.getData())<0){ - if(cursorNode.getLeft()==null){ - cursorNode.setLeft(binaryTreeNode); - flag=true; - }else{ - cursorNode=cursorNode.getLeft(); - } - }else { - if(cursorNode.getRight()==null){ - cursorNode.setRight(binaryTreeNode); - flag=true; - }else{ - cursorNode=cursorNode.getRight(); - } - } - - } - } - size++; - } - - public LinkedList inorder(){ - LinkedList linkedList=new LinkedList(); - sortLeft(linkedList,root); - sortRight(linkedList,root); - return linkedList; - } - - private void sortRight(LinkedList linkedList,BinaryTreeNode binaryTreeNode){ - Queue queue=getRightList(binaryTreeNode); - while(!queue.isEmpty()){ - BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue(); - sortLeft(linkedList,queueNode); - } - - } - - private void sortLeft(LinkedList linkedList,BinaryTreeNode binaryTreeNode){ - Stack stack=getLeftList(binaryTreeNode); - while(!stack.isEmpty()) { - BinaryTreeNode stackNode = (BinaryTreeNode) stack.pop(); - linkedList.add(stackNode.getData()); - Queue queue = getRightList(stackNode); - while (!queue.isEmpty()) { - BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue(); - sortLeft(linkedList,queueNode); - } - } - linkedList.add(binaryTreeNode.getData()); - } - - - private Stack getLeftList(BinaryTreeNode binaryTreeNode){ - Stack stack=new Stack(); - while(binaryTreeNode.getLeft()!=null){ - binaryTreeNode=binaryTreeNode.getLeft(); - stack.push(binaryTreeNode); - } - return stack; - } - - private Queue getRightList(BinaryTreeNode binaryTreeNode){ - Queue queue=new Queue(); - while(binaryTreeNode.getRight()!=null){ - binaryTreeNode=binaryTreeNode.getRight(); - queue.enQueue(binaryTreeNode); - } - return queue; - } - - - -} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTreeNode.java b/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTreeNode.java deleted file mode 100644 index 3895133f17..0000000000 --- a/group03/1360464792/src/main/java/rui/study/coding2017/BinaryTreeNode.java +++ /dev/null @@ -1,40 +0,0 @@ -package rui.study.coding2017; - -public class BinaryTreeNode { - - private Comparable data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Comparable getData() { - return data; - } - public void setData(Comparable data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode() { - } - - public BinaryTreeNode(Comparable data) { - this.data = data; - } - - public BinaryTreeNode(Comparable data, BinaryTreeNode left, BinaryTreeNode right) { - this.data = data; - this.left = left; - this.right = right; - } -} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/Iterator.java b/group03/1360464792/src/main/java/rui/study/coding2017/Iterator.java deleted file mode 100644 index dddde983c6..0000000000 --- a/group03/1360464792/src/main/java/rui/study/coding2017/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package rui.study.coding2017; - - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/LinkedList.java b/group03/1360464792/src/main/java/rui/study/coding2017/LinkedList.java deleted file mode 100644 index f0a04cd32f..0000000000 --- a/group03/1360464792/src/main/java/rui/study/coding2017/LinkedList.java +++ /dev/null @@ -1,156 +0,0 @@ -package rui.study.coding2017; - -/** - * 单向链表 - */ -public class LinkedList { - private Node head; - - private Node current; - - private int size; - - public LinkedList(){ - } - - public int size(){ - return size; - } - - public void add(Object o){ - Node newNode=new Node(o,null); - if(size==0){ - head=current=newNode; - } - current.next=newNode; - current=newNode; - size++; - } - - public void add(int index , Object o){ - checkIndexForAdd(index); - if(index==size){ - add(o); - }else{ - Node newNode=new Node(o,null); - if(index==0){ - newNode.next=head; - head=newNode; - }else{ - Node after=getIndexNode(index); - Node before=getIndexNode(index-1); - before.next=newNode; - newNode.next=after; - } - size++; - } - } - - - public Object get(int index){ - return getIndexNode(index).data; - } - - public void addFirst(Object obj){ - add(0,obj); - } - public void addLast(Object obj){ - if(size==0){ - add(obj); - }else { - add(size,obj); - } - } - - public Object remove(int index){ - checkIndex(index); - Node needRemove; - if(index==0){ - needRemove=head; - if(size==1){ - head=null; - }else{ - head=head.next; - } - }else{ - needRemove=getIndexNode(index); - Node before=getIndexNode(index-1); - before.next=needRemove.next; - if(index==size-1){ - current=before; - } - } - size--; - return needRemove.data; - } - public Object removeFirst(){ - return remove(0); - } - public Object removeLast(){ - return remove(size-1); - } - public Iterator iterator(){ - return new LinkedListIterator(); - } - - - public class LinkedListIterator implements Iterator{ - - private int cursor=0; - - private Node cursorNode=head; - - @Override - public boolean hasNext() { - return cursor!=size; - } - - @Override - public Object next() { - Object object=cursorNode.data; - cursorNode=cursorNode.next; - cursor++; - return object; - } - } - - private void checkIndexForAdd(int index){ - if(!(index>=0&&index<=size)){ - throw new IndexOutOfBoundsException("索引"+index+"越界!"); - } - } - private void checkIndex(int index){ - if(!(index>=0&&index>>>>>>>>>>>>>>>>>>>>>>>>>"); - Iterator iterator=linkedList.iterator(); - while (iterator.hasNext()){ - System.out.println(iterator.next()); - } - } - - - @Test - public void addFirst() throws Exception { - LinkedList linkedList=new LinkedList(); - linkedList.add(0,0); - linkedList.add(1,1); - linkedList.addFirst(-1); - - System.out.println(linkedList.size()); - - Iterator iterator=linkedList.iterator(); - while (iterator.hasNext()){ - System.out.println(iterator.next()); - } - } - - @Test - public void addLast() throws Exception { - LinkedList linkedList=new LinkedList(); - linkedList.add(0,0); - linkedList.add(1,1); - linkedList.addLast(2); - System.out.println(linkedList.size()); - - Iterator iterator=linkedList.iterator(); - while (iterator.hasNext()){ - System.out.println(iterator.next()); - } - - - } - - @Test - public void remove() throws Exception { - LinkedList linkedList=new LinkedList(); - linkedList.add(0,0); - linkedList.add(1,1); - System.out.println(linkedList.size()); - try { - linkedList.remove(2); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - linkedList.remove(1); - System.out.println(linkedList.size()); - linkedList.remove(0); - System.out.println(linkedList.size()); - try { - linkedList.remove(0); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - } - - @Test - public void removeFirst() throws Exception { - LinkedList linkedList=new LinkedList(); - try { - linkedList.removeFirst(); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - linkedList.add(0,0); - linkedList.add(1,1); - linkedList.removeFirst(); - System.out.println(linkedList.size()); - - } - - @Test - public void removeLast() throws Exception { - LinkedList linkedList=new LinkedList(); - try { - linkedList.removeLast(); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - - linkedList.add(0,0); - linkedList.add(1,1); - linkedList.removeLast(); - System.out.println(linkedList.size()); - - } -} \ No newline at end of file diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/QueueTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/QueueTest.java deleted file mode 100644 index baff49411c..0000000000 --- a/group03/1360464792/src/test/java/rui/study/coding2017/QueueTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package rui.study.coding2017; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * 测试队列 - * Created by 赵睿 on 2017/2/25. - */ -public class QueueTest { - @Test - public void enQueue() throws Exception { - Queue queue=new Queue(); - queue.enQueue(1); - queue.enQueue(2); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - } - - - @Test - public void isEmpty() throws Exception { - Queue queue=new Queue(); - System.out.println(queue.isEmpty()); - queue.enQueue(1); - System.out.println(queue.isEmpty()); - } - - @Test - public void size() throws Exception { - Queue queue=new Queue(); - System.out.println(queue.size()); - queue.enQueue(1); - System.out.println(queue.size()); - } - -} \ No newline at end of file diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/StackTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/StackTest.java deleted file mode 100644 index 115a16f1fc..0000000000 --- a/group03/1360464792/src/test/java/rui/study/coding2017/StackTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package rui.study.coding2017; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * 测试栈 - * Created by 赵睿 on 2017/2/25. - */ -public class StackTest { - @Test - public void push() throws Exception { - Stack stack=new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - - } - - @Test - public void peek() throws Exception { - Stack stack=new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - System.out.println(stack.peek()); - System.out.println(stack.peek()); - - - } - - @Test - public void isEmpty() throws Exception { - Stack stack=new Stack(); - System.out.println(stack.isEmpty()); - stack.push(1); - System.out.println(stack.isEmpty()); - - } - - @Test - public void size() throws Exception { - Stack stack=new Stack(); - System.out.println(stack.size()); - stack.push(1); - System.out.println(stack.size()); - } - -} \ No newline at end of file diff --git a/group03/172487938/Iterator.java b/group03/172487938/Iterator.java deleted file mode 100644 index e6187ad2fd..0000000000 --- a/group03/172487938/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package 基本数据结构; - -public interface Iterator { - public boolean hasNext(); - public E next(); - public void remove(); -} diff --git a/group03/172487938/MyArrayList.java b/group03/172487938/MyArrayList.java deleted file mode 100644 index 0c00a277ff..0000000000 --- a/group03/172487938/MyArrayList.java +++ /dev/null @@ -1,186 +0,0 @@ -package 基本数据结构; - - -/** - * Created by LIANG on 2017/2/24. - */ -public class MyArrayList implements MyList -{ - public static final int INITIAL_CAPACITTY = 16; - private E[] data = (E[]) new Object[INITIAL_CAPACITTY]; - private static int size = 0; - - public MyArrayList(E[] objects) - { - - for (int i = 0; i < objects.length; i++) - { - add(objects[i]); - size++; - } - } - - public MyArrayList() {} - - ; - - public void ensureCapicity() - { - if (size >= data.length) - { - E[] newData = (E[]) new Object[size * 2]; - System.arraycopy(data, 0, newData, 0, data.length); - data = newData; - } - } - -// public boolean add(E e) -// { -// ensureCapicity(); -// if(e != null) -// data[size++] = e; -// return true; -// } - - public void add(E e) - { - add(size, e); - } - - @Override - public void add(int index, E e) - { - ensureCapicity(); - for (int i = size - 1; i >= index; i--) - { - data[i + 1] = data[i]; - } - data[index] = e; - size++; - } - - @Override - public E get(int index) - { - return data[index]; - } - - @Override - public E remove(int index) - { - checkIndex(index); - E e = data[index]; - for (int i = index; i < data.length - 1; i++) - data[i] = data[i + 1]; - - data[size - 1] = null; - size--; - return e; - - } - - private void checkIndex(int index) - { - if (index < 0 || index >= size) - throw new IndexOutOfBoundsException("输入下标有误"); - } - - @Override - public int size() - { - return size; - } - - @Override - public void clear() - { - data = (E[]) new Object[INITIAL_CAPACITTY]; - size = 0; - } - - @Override - public int indexOf(E e) - { - for (int i = 0; i < size; i++) - { - if (e.equals(data[i])) - return i; - } - return -1; - } - - - @Override - public boolean isEmpty() - { - return size == 0; - } - - @Override - public E set(int index, E e) - { - checkIndex(index); - E temp = data[index]; - data[index] = e; - return temp; - } - - @Override - public boolean contains(E e) - { - for (int i = 0; i < size; i++) - { - if(data[i].equals(e)) - return true; - } - return false; - } - - public void trimToSize() - { - if (size != data.length) - { - E[] newData = (E[]) new Object[size]; - System.arraycopy(data, 0, newData, 0, size); - data = newData; - } - } - - @Override - public String toString() - { - StringBuilder result = new StringBuilder("["); - - for (int i = 0; i < size; i++) - { - result.append(data[i]); - if (i < size - 1) - result.append(","); - } - return result.toString() + "]"; - } - - private class ArrayListIterator implements Iterator - { - private int current = 0; - - @Override - public boolean hasNext() - { - return (current < size); - } - - @Override - public E next() - { - return data[current++]; - } - - @Override - public void remove() - { - MyArrayList.this.remove(current); - } - } - -} diff --git a/group03/172487938/MyLinkedList.java b/group03/172487938/MyLinkedList.java deleted file mode 100644 index 609ab8c81d..0000000000 --- a/group03/172487938/MyLinkedList.java +++ /dev/null @@ -1,274 +0,0 @@ -package 基本数据结构; - -public class MyLinkedList implements MyList -{ - private Node head, tail; - private int size; - - public MyLinkedList() {} - - public MyLinkedList(E[] objects) - { - for (int i = 0; i < objects.length; i++) - { - add(objects[i]); -// size++; - } - } - - public E getFirst() - { - if (size == 0) - return null; - else - return head.element; - } - - public E getLast() - { - if (size == 0) - return null; - else - return tail.element; - } - - public void addFirst(E e) - { - Node newNode = new Node<>(e); - newNode.next = head; - head = newNode; - size++; - - if (tail == null) - tail = head; - } - - public void addLast(E e) - { - Node newNode = new Node<>(e); - - if (tail == null) - head = tail = newNode; - else - { - tail.next = newNode; - tail = tail.next; - } - size++; - } - - public void add(E e) - { - add(size, e); - } - - @Override - public void add(int index, E e) - { - if (index == 0) - { - addFirst(e); - } else if (index >= size) - { - addLast(e); - } else - { - Node current = head; - for (int i = 1; i < index; i++) - { - current = current.next; - } - Node temp = current.next; - current.next = new Node(e); - (current.next).next = temp; - size++; - } - } - - @Override - public E get(int index) - { - if (index < 0 || index > size - 1) - return null; - - Node current = head; - for (int i = 0; i < index; i++) - current = current.next; - - return current.element; - } - - @Override - public E remove(int index) - { - if (index < 0 || index >= size) - return null; - else if (index == 0) - { - E e = removeFirst(); - return e; - } else if (index == size - 1) - return removeLast(); - else - { - Node previous = head; - - for (int i = 1; i < index; i++) - { - previous = previous.next; - } - - Node current = previous.next; - previous.next = current.next; - size--; - return current.element; - } - } - - public E removeFirst() - { - if (size == 0) - return null; - else - { - Node temp = head; - head = head.next; - size--; - if (head == null) - tail = null; - return temp.element; - } - } - - public E removeLast() - { - if (size == 0) - return null; - else if (size == 1) - { - Node temp = head; - head = tail = null; - size = 0; - return temp.element; - } else - { - Node current = head; - - for (int i = 0; i < size - 2; i++) - current = current.next; - - Node temp = tail; - tail = current; - tail.next = null; - size--; - return temp.element; - } - } - - @Override - public int size() - { - return size; - } - - @Override - public void clear() - { - size = 0; - head = tail = null; - } - - @Override - public int indexOf(E e) - { - Node current = head; - for (int i = 0; i < size; i++) - { - if (current.element.equals(e)) - return i; - current = current.next; - } - return -1; - } - - @Override - public boolean isEmpty() - { - if (size != 0) - return false; - else - return true; - } - - @Override - public E set(int index, E e) - { - if (index < 0 || index > size - 1) - return null; - - Node current = head; - for (int i = 0; i < index; i++) - current = current.next; - - E temp = current.element; - current.element = e; - - return temp; - } - - @Override - public boolean contains(E e) - { - Node current = head; - for (int i = 0; i < size; i++) - { - if (current.element.equals(e)) - return true; - current = current.next; - } - return false; - } - - @Override - public String toString() - { - StringBuilder result = new StringBuilder("["); - - if (size == 0) - return null; - else - { - Node current = head; - for (int i = 0; i < size; i++) - { - try - { - result.append(current.element); - } catch (Exception e) - { - e.printStackTrace(); - } - current = current.next; - if (current != null) - { - result.append(", "); - } else - { - result.append("]"); - } - } - return result.toString(); - } - } - - public static class Node - { - E element; - Node next; - - public Node(E e) - { - this.element = e; - } - } -} \ No newline at end of file diff --git a/group03/172487938/MyList.java b/group03/172487938/MyList.java deleted file mode 100644 index 5d16147855..0000000000 --- a/group03/172487938/MyList.java +++ /dev/null @@ -1,27 +0,0 @@ -package 基本数据结构; - -/** - * Created by LIANG on 2017/2/24. - */ -public interface MyList -{ - - public void add(int index, E e); - - public E get(int index); - - public E remove(int index); - - public int size(); - - public void clear(); - - - public int indexOf(E e); - - public boolean isEmpty(); - - public E set(int index, E e); - - public boolean contains(E e); -} diff --git a/group03/172487938/Queue.java b/group03/172487938/Queue.java deleted file mode 100644 index af335f5274..0000000000 --- a/group03/172487938/Queue.java +++ /dev/null @@ -1,32 +0,0 @@ -package 基本数据结构; - -import java.util.LinkedList; - -public class Queue -{ - - private LinkedList list = new LinkedList(); - - public void enQueue(Object o) - { - list.addLast(o); - } - - public Object deQueue() - { - return list.removeFirst(); - } - - public boolean isEmpty() - { - if(list.size() != 0) - return true; - else - return false; - } - - public int size() - { - return list.size(); - } -} diff --git a/group03/172487938/Stack.java b/group03/172487938/Stack.java deleted file mode 100644 index f1b67822b1..0000000000 --- a/group03/172487938/Stack.java +++ /dev/null @@ -1,37 +0,0 @@ -package 基本数据结构; - -import java.util.ArrayList; - -public class Stack -{ - private ArrayList elementData = new ArrayList(); - - public void push(Object o) - { - elementData.add(o); - } - - public Object pop() - { - Object popElement = elementData.remove(elementData.size() - 1); - return popElement; - } - - public Object peek() - { - Object peekElement = elementData.get(size() - 1); - return peekElement; - } - - public boolean isEmpty() - { - if(elementData.size() != 0) - return false; - return true; - } - - public int size() - { - return elementData.size(); - } -} diff --git a/group03/172487938/TestMyArrayList.java b/group03/172487938/TestMyArrayList.java deleted file mode 100644 index dbf8b610e1..0000000000 --- a/group03/172487938/TestMyArrayList.java +++ /dev/null @@ -1,36 +0,0 @@ -package 基本数据结构; - -/** - * Created by LIANG on 2017/2/24. - */ -public class TestMyArrayList -{ - public static void main(String[] args) - { - MyArrayList list = new MyArrayList<>(); - list.add("America"); - System.out.println(list); - - list.add("Canada"); - System.out.println(list); - - list.add("Tokoy"); - System.out.println(list); - - list.add("Shanghai"); - - - int size = list.size(); - System.out.println(size); - list.add(0,"China"); - System.out.println(list); - String[] str = {"Japan","England","France","HonKong","BeiJing"}; - for(String s:str) - list.add(s); - System.out.println(list); - - list.remove(3); - System.out.println(list); - - } -} diff --git a/group03/172487938/TestMyLinkedList.java b/group03/172487938/TestMyLinkedList.java deleted file mode 100644 index cd412ef646..0000000000 --- a/group03/172487938/TestMyLinkedList.java +++ /dev/null @@ -1,19 +0,0 @@ -package 基本数据结构; - -/** - * Created by LIANG on 2017/2/25. - */ -public class TestMyLinkedList -{ - public static void main(String[] args) - { - String[] name = {"Tom", "George", "Peter", "Jean", "George", "Jane"}; - MyList list = new MyLinkedList(name); - - System.out.println(list.contains("George")); - System.out.println(list.get(3)); - System.out.println(list.indexOf("George")); - list.set(4, "Michael"); - System.out.println(list); - } -} diff --git a/group03/1753176091/bin/.gitignore b/group03/1753176091/bin/.gitignore deleted file mode 100644 index c2d9872a16..0000000000 --- a/group03/1753176091/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/com/ diff --git a/group03/1753176091/src/com/coding/basic/ArrayList.java b/group03/1753176091/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 88e9ec8ce0..0000000000 --- a/group03/1753176091/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - ensureCapacity(size + 1); - elementData[size++] = o; - } - - private void ensureCapacity(int minCapacity) { - if (minCapacity > 100) { - grow(elementData); - } - } - - private void grow(Object[] elementData) { - int oldLength = elementData.length; - int newLength = oldLength * 2; - Arrays.copyOf(elementData, newLength); - } - - public void add(int index, Object o) { - ensureCapacity(size + 1); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - } - - public Object get(int index) { - if (index < 0 || index > elementData.length) { - throw new IndexOutOfBoundsException(); - } - return (Object) elementData[index]; - } - - public Object remove(int index) { - int lowLength = size - index - 1; - System.arraycopy(elementData, index + 1, elementData, index, lowLength); - elementData[--size] = null; - return (Object) elementData[index]; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return null; - } - -} diff --git a/group03/1753176091/src/com/coding/basic/BinaryTreeNode.java b/group03/1753176091/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group03/1753176091/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group03/1753176091/src/com/coding/basic/FileUtil.java b/group03/1753176091/src/com/coding/basic/FileUtil.java deleted file mode 100644 index 856abf7249..0000000000 --- a/group03/1753176091/src/com/coding/basic/FileUtil.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.coding.basic; - - - -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - -public class FileUtil { - - public static String byteToHexString(byte[] codes ){ - - StringBuffer buffer = new StringBuffer(); - - for(int i=0;i= size || index < 0) { - throw new IndexOutOfBoundsException(); - } - Node newHead = new Node(o, null); - Node f = head; - for (int i = 0; i < index - 1; i++) { - f = f.next; - } - newHead.next = f.next; - f.next = newHead; - size++; - } - - public Object get(int index) { - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(); - } - Node f = head; - for (int i = 0; i < index; i++) { - f = f.next; - } - return f.data; - } - - public Object remove(int index) { - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(); - } - Node f = head; - for (int i = 0; i < index - 1; i++) { - f = f.next; - } - f.next = f.next.next; - final Node d = f.next; - final Object element = d.data; - d.data = null; - d.next = null; - size--; - return element; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node newHead = new Node(o, head); - head = newHead; - size++; - } - - public void addLast(Object o) { - Node newHead = new Node(o, null); - Node f = head; - for (int i = 0; i < size - 1; i++) { - f = f.next; - } - f.next = newHead; - size++; - } - - public Object removeFirst() { - final Node f = head; - if (f == null) - throw new NoSuchElementException(); - final Object element = f.data; - head = f.next; - f.data = null; - f.next = null; - size--; - return element; - } - - public Object removeLast() { - Node f = head; - for (int i = 0; i < size - 2; i++) { - f = f.next; - } - Object element = f.next; - f.next = null; - size--; - return element; - } - - public Iterator iterator() { - return null; - } - - private static class Node { - Object data; - Node next; - - private Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } -} diff --git a/group03/1753176091/src/com/coding/basic/List.java b/group03/1753176091/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group03/1753176091/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group03/1753176091/src/com/coding/basic/Queue.java b/group03/1753176091/src/com/coding/basic/Queue.java deleted file mode 100644 index b5440dbade..0000000000 --- a/group03/1753176091/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private int size; - LinkedList elementData = new LinkedList(); - - public void enQueue(Object o) { - elementData.addLast(o); - size++; - } - - public Object deQueue() { - size--; - return elementData.removeFirst(); - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group03/1753176091/src/com/coding/basic/Stack.java b/group03/1753176091/src/com/coding/basic/Stack.java deleted file mode 100644 index 0ca338f666..0000000000 --- a/group03/1753176091/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - private int size = 0; - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - if (size > 0) - return elementData.remove(size); - return null; - } - - public Object peek() { - return elementData.get(size); - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group03/2864885311/DS/.classpath b/group03/2864885311/DS/.classpath deleted file mode 100644 index 6177796265..0000000000 --- a/group03/2864885311/DS/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/group03/2864885311/DS/.gitignore b/group03/2864885311/DS/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group03/2864885311/DS/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group03/2864885311/DS/.project b/group03/2864885311/DS/.project deleted file mode 100644 index fab8d7f04c..0000000000 --- a/group03/2864885311/DS/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group03/2864885311/DS/.settings/org.eclipse.jdt.core.prefs b/group03/2864885311/DS/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group03/2864885311/DS/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group03/2864885311/DS/src/com/coding/basic/ArrayList.java b/group03/2864885311/DS/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 31bc2649db..0000000000 --- a/group03/2864885311/DS/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.coding.basic; -//import java.util.Iterator; - -//import java.util.List; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - //int int_inarry = 10; - grow(o); - - } - public void add(int index, Object o){ - - - - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - - private void grow(Object nbradd){ - - if (this.size>this.elementData.length){ - Object[] arrayRefVar = new Object[this.elementData.length+1]; - growcopy(nbradd,arrayRefVar); - }else{ - Object[] arrayRefVar = new Object[this.elementData.length]; - growcopy(nbradd,arrayRefVar); - } - } - private void growcopy(Object nbraddcopy,Object[] arrayRefVarcopy){ - System.arraycopy(this.elementData, 0, arrayRefVarcopy, 0, this.elementData.length); - this.elementData[0]=nbraddcopy; - System.arraycopy(arrayRefVarcopy, 0, this.elementData, 1, this.size+1); - this.size++; - } - private void instrgrow(int nbrindex,Object[] arraynbo,Object ino){ - - //Object[] arrayRefVar2 = new Object[nbrindex]; - Object[] arrayRefVar3 = new Object[this.size-nbrindex]; - - - System.arraycopy(this.elementData, nbrindex, arrayRefVar3, nbrindex, this.size); - this.elementData[nbrindex]=ino; - System.arraycopy(arrayRefVar3, 0, this.elementData, nbrindex+1, this.size); - - - } -} diff --git a/group03/2864885311/DS/src/com/coding/basic/BinaryTreeNode.java b/group03/2864885311/DS/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group03/2864885311/DS/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group03/2864885311/DS/src/com/coding/basic/Iterator.java b/group03/2864885311/DS/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group03/2864885311/DS/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group03/2864885311/DS/src/com/coding/basic/LinkedList.java b/group03/2864885311/DS/src/com/coding/basic/LinkedList.java deleted file mode 100644 index e2c4e5e795..0000000000 --- a/group03/2864885311/DS/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group03/2864885311/DS/src/com/coding/basic/List.java b/group03/2864885311/DS/src/com/coding/basic/List.java deleted file mode 100644 index d47df585d9..0000000000 --- a/group03/2864885311/DS/src/com/coding/basic/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic; - -public interface List { - - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group03/2864885311/DS/src/com/coding/basic/Queue.java b/group03/2864885311/DS/src/com/coding/basic/Queue.java deleted file mode 100644 index 36e516e266..0000000000 --- a/group03/2864885311/DS/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group03/2864885311/DS/src/com/coding/basic/Stack.java b/group03/2864885311/DS/src/com/coding/basic/Stack.java deleted file mode 100644 index a5a04de76d..0000000000 --- a/group03/2864885311/DS/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/ArrayList.java b/group03/345943980/2017Learning/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 023a1686ae..0000000000 --- a/group03/345943980/2017Learning/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.coding.basic; - -//import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; // 记录数组当前长度 - - private Object[] elementData = new Object[10]; // 初始长度 - - /* - * (non-Javadoc) - * - * @see com.coding.basic.List#add(java.lang.Object) - */ - public void add(Object o) { - if (size > elementData.length) { // size大于数组初始长度,需要对原数组进行扩容 - grow(elementData, 10); - } - this.elementData[size++] = o; - } - - /* - * 在指定下标位置插入元素 (non-Javadoc) - * - * @see com.coding.basic.List#add(int, java.lang.Object) - */ - public void add(int index, Object o) { - if (size > elementData.length) { // size大于数组初始长度,需要对原数组进行扩容 - grow(elementData, 10); - } - if (index > size || index < 0) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index) { - // 1、先要判断index所在处有无值,没有则返回null - Object o = elementData[index]; - if (null == o) - throw new IndexOutOfBoundsException(); - return o; - } - - public Object remove(int index) { - Object oldVal = elementData[index]; // 保留要删除的元素 - int numMoved = size - index - 1; - if (numMoved > 0) { - System.arraycopy(elementData, index + 1, elementData, index, numMoved);// 讲移除位置之后的元素向前 挪动 - } - elementData[--size] = null; // 将数组末尾元素置为空 - return oldVal; - } - - /** - * 获取数组元素个数 - */ - public int size() { - return this.size; - } - - public Object[] grow(Object[] src, int size) { - // Arrays.copyOf(src, src.length+size); - Object[] target = new Object[src.length + size]; - System.arraycopy(src, 0, target, 0, src.length); - return target; - } - - public Iterator iterator() { - - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator { - - private int cursor=0; - @Override - public boolean hasNext() { - return size != cursor; - } - - @Override - public Object next() { - return elementData[cursor++]; - } - - } - -} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/BinaryTree.java b/group03/345943980/2017Learning/src/com/coding/basic/BinaryTree.java deleted file mode 100644 index 2bc37a07e6..0000000000 --- a/group03/345943980/2017Learning/src/com/coding/basic/BinaryTree.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.coding.basic; - -/** - * 二叉树 - * - * @author cm - */ -public class BinaryTree { - - private BinaryTreeNode root; - - public BinaryTreeNode insert(Object o) { - BinaryTreeNode binaryTreeNode = new BinaryTreeNode(o); - if (null == root) { - root = new BinaryTreeNode(o); - } else { - boolean flag = false; - BinaryTreeNode cursorNode = root; - while (!flag) { - if (binaryTreeNode.compareTo(cursorNode) < 0) { - if (cursorNode.getLeft() == null) { - cursorNode.setLeft(binaryTreeNode); - flag = true; - } else { - cursorNode = cursorNode.getLeft(); - } - } else { - if (cursorNode.getRight() == null) { - cursorNode.setRight(binaryTreeNode); - flag = true; - } else { - cursorNode = cursorNode.getRight(); - } - } - } - } - return binaryTreeNode; - } - - public LinkedList inOrder() { - LinkedList linkedList = new LinkedList(); - sortLeft(linkedList, root); - sortRight(linkedList, root); - return linkedList; - } - - private void sortRight(LinkedList linkedList, BinaryTreeNode binaryTreeNode) { - Queue queue = getRightList(binaryTreeNode); - while (!queue.isEmpty()) { - BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue(); - sortLeft(linkedList, queueNode); - } - } - - private void sortLeft(LinkedList linkedList, BinaryTreeNode binaryTreeNode) { - Stack stack = getLeftList(binaryTreeNode); - while (!stack.isEmpty()) { - BinaryTreeNode stackNode = (BinaryTreeNode) stack.pop(); - linkedList.add(stackNode.getData()); - Queue queue = getRightList(stackNode); - while (!queue.isEmpty()) { - BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue(); - sortLeft(linkedList, queueNode); - } - } - linkedList.add(binaryTreeNode.getData()); - } - - private Stack getLeftList(BinaryTreeNode binaryTreeNode) { - Stack stack = new Stack(); - while (binaryTreeNode.getLeft() != null) { - binaryTreeNode = binaryTreeNode.getLeft(); - stack.push(binaryTreeNode); - } - return stack; - } - - private Queue getRightList(BinaryTreeNode binaryTreeNode) { - Queue queue = new Queue(); - while (binaryTreeNode.getRight() != null) { - binaryTreeNode = binaryTreeNode.getRight(); - queue.enQueue(binaryTreeNode); - } - return queue; - } - - private class BinaryTreeNode implements Comparable { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode(Object o) { - setData(o); - } - - @Override - public int compareTo(BinaryTreeNode binaryTreeNode) { - Integer currVal = (Integer) root.getData(); - Integer compVal = (Integer) binaryTreeNode.getData(); - if (currVal < compVal) - return -1; - else if (currVal == compVal) - return 0; - else - return 1; - } - } -} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/Iterator.java b/group03/345943980/2017Learning/src/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/group03/345943980/2017Learning/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/LinkedList.java b/group03/345943980/2017Learning/src/com/coding/basic/LinkedList.java deleted file mode 100644 index b31c724a2f..0000000000 --- a/group03/345943980/2017Learning/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.coding.basic; - -/** - * 单向链表 - * - * @author Administrator - * - */ -public class LinkedList implements List { - - private Node head = new Node(null, null); - private int size = 0; - - public LinkedList() { - head.next = head; - } - - public void add(Object o) { - addLast(o); - } - - public void add(int index, Object o) { - // 1、检查是否在合理范围内 - if (index > size || index < 0) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - Node currNode = findNodeByIndex(index); - Node newNode = new Node(o, currNode); - if (index == 0) { // 直接插入到第一个位置 - head = newNode; - } else { - Node preNode = findNodeByIndex(index - 1); - preNode.next = newNode; - } - size++; - } - - public Object get(int index) { - return findNodeByIndex(index).data; - } - - public Object remove(int index) { - if (index > size || index < 0) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - Node targetNode = this.findNodeByIndex(index); - Object obj = targetNode.data; - if (index == 0) { - targetNode.data = null; - head = targetNode.next; - } else { - Node preNode = findNodeByIndex(index - 1); - preNode.next = targetNode.next; - } - // targetNode.data = null; - size--; - return obj; - } - - public int size() { - return this.size; - } - - public void addFirst(Object o) { - Node nextNode = head; - Node newNode = new Node(o, nextNode); - head = newNode; - size++; - } - - public void addLast(Object o) { - Node subNode = new Node(o, null); - if (size == 0) { - head = subNode; - } else { - Node lastNode = findNodeByIndex(size - 1); - lastNode.next = subNode; - } - size++; - } - - public Object removeFirst() { - return this.remove(0); - } - - public Object removeLast() { - return this.remove(size - 1); - } - - private Node findNodeByIndex(int index) { - Node lastNode = head; - for (int i = 0; i < index; i++) { - lastNode = lastNode.next; - } - return lastNode; - } - - public Iterator iterator() { - return new LinkedListIterator(); - } - - private static class Node { - Object data; - Node next; - - Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } - - private class LinkedListIterator implements Iterator { - - private int cursor = 0; - private Node cursorNode = head; - - @Override - public boolean hasNext() { - return size != cursor; - } - - @Override - public Object next() { - Object obj = cursorNode.data; - cursorNode = cursorNode.next; - cursor++; - return obj; - } - - } -} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/List.java b/group03/345943980/2017Learning/src/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/group03/345943980/2017Learning/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/Queue.java b/group03/345943980/2017Learning/src/com/coding/basic/Queue.java deleted file mode 100644 index 6abba1993b..0000000000 --- a/group03/345943980/2017Learning/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coding.basic; - -/** - * 队列(堆):特点,先进先出 - * - * @author Administrator - * - */ -public class Queue { - - private LinkedList linkedList = new LinkedList(); - private int size = 0; - - /** - * 入队列 - * - * @param o - */ - public void enQueue(Object obj) { - linkedList.add(obj); - size++; - } - - /** - * 出队列 - * - * @return - */ - public Object deQueue() { - Object obj = linkedList.remove(0); - size--; - return obj; - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/Stack.java b/group03/345943980/2017Learning/src/com/coding/basic/Stack.java deleted file mode 100644 index 1dd8b15f59..0000000000 --- a/group03/345943980/2017Learning/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.coding.basic; - -/** - * 栈(堆栈),特点先进后出的特点 - * - * @author Administrator - * - */ -public class Stack { - private ArrayList elementData = new ArrayList(); - private int size = 0; - - /** - * 在堆栈顶部中添加一个元素 - * - * @param o - */ - public void push(Object o) { - elementData.add(o); - size++; - } - - /** - * 在堆栈顶部移去一个元素 - * - * @return - */ - public Object pop() { - Object o = elementData.remove(size - 1); - size--; - return o; - - } - - /** - * 总是返回栈顶的元素 - * - * @return - */ - public Object peek() { - return elementData.get(size - 1); - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group03/345943980/2017Learning/src/com/coding/test/ArrayListTest.java b/group03/345943980/2017Learning/src/com/coding/test/ArrayListTest.java deleted file mode 100644 index 8d812b9f71..0000000000 --- a/group03/345943980/2017Learning/src/com/coding/test/ArrayListTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coding.test; - -import org.junit.Test; - -import com.coding.basic.ArrayList; - -public class ArrayListTest { - - @Test - public void test01(){ - ArrayList arrayList = new ArrayList(); - arrayList.add(1); - arrayList.add(100); - arrayList.add(0, 1000); - System.out.println(arrayList.size()); - for(int i =0;i array = new java.util.ArrayList(); - array.add(1); - array.add(1, 20); - System.out.println(array.size()); - for(Object o:array){ - System.out.println(o.toString()); - } - //System.out.println(array.get(100)); - } - - -} diff --git a/group03/345943980/2017Learning/src/com/coding/test/BinaryTreeTest.java b/group03/345943980/2017Learning/src/com/coding/test/BinaryTreeTest.java deleted file mode 100644 index 68962223c7..0000000000 --- a/group03/345943980/2017Learning/src/com/coding/test/BinaryTreeTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.test; - -import org.junit.Test; - -import com.coding.basic.BinaryTree; -import com.coding.basic.LinkedList; - -public class BinaryTreeTest { - - @Test - public void test01(){ - BinaryTree binaryTree = new BinaryTree(); - binaryTree.insert(5); - binaryTree.insert(2); - binaryTree.insert(7); - binaryTree.insert(1); - binaryTree.insert(4); - binaryTree.insert(6); - binaryTree.insert(8); - LinkedList linkedList=binaryTree.inOrder(); - for(int i=0;i 0) { - grow(capacity); - } - } - - /** - * 扩容,扩容规则为:oldCapacity + oldCapacity/2 - * - * @param capacity - */ - private void grow(int capacity) { - int oldCapacity = elementData.length; - int newCapacity = oldCapacity + oldCapacity / 2; - elementData = Arrays.copyOf(elementData, newCapacity); - } - - public Object get(int index) throws Exception { - checkSize(index); - return elementData[index]; - } - - public Object remove(int index) throws Exception { - modCount++; - checkSize(index); - Object oldValue = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - //回收多出来的内存。 - elementData[size--] = null; - return oldValue; - } - - /** - * 验证给定的数组下标是否小于数组的长度。 - * - * @param index - * @return - */ - private void checkSize(int index) throws Exception { - if (index > size) { - // 数组下标越界异常。 - throw new IndexOutOfBoundsException(); - } - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new Itr(); - } - - private class Itr implements Iterator { - int cursor;//记录下一个元素的索引 - int lastReturn = -1;//记录最后一个元素的索引 - int expectCount = modCount; - - @Override - public boolean hasNext() { - return (cursor != size); - } - - @Override - public Object next() { - checkForComodification(); - int i = cursor; - Object[] elementData = ArrayList.this.elementData; - cursor = i+ 1; - return elementData[lastReturn = i]; - } - - /** - * 核心方法, 这里remove可以避免fail-fast快速失败原则。 - * @throws Exception - */ - public void remove() throws Exception { - checkForComodification(); - ArrayList.this.remove(lastReturn); - cursor = lastReturn; - lastReturn = -1; - expectCount = modCount; - } - - /** - * 验证fail-fast规则。 - */ - final void checkForComodification() { - if (modCount != expectCount) - throw new ConcurrentModificationException(); - } - } -} diff --git a/group03/510782645/src/com/coding/basic/BinaryTreeNode.java b/group03/510782645/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 1e279dd56a..0000000000 --- a/group03/510782645/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - static class Node { - Integer data; - Node parent; - Node left; - Node right; - - public Node(Integer data, Node parent, Node left, Node right) { - this.data = data; - this.parent = parent; - this.left = left; - this.right = right; - } - - public String toString(){ - return "[data=" + data + "]"; - } - - public boolean equals(Object obj){ - if(this == obj){ - return true; - } - - if(obj.getClass() == Node.class){ - Node target = (Node) obj; - return data.equals(target.data) && left == target.left - && right == target.right && parent == target.parent; - } - - return false; - } - } - private Node root; - - BinaryTreeNode() { - root = null; - } - - BinaryTreeNode(Integer data) { - root = new Node(data, null, null, null); - } - - /** - * 暂且使用Intenger作为节点数据。 - * @param o - */ - public void insert(Integer o) { - if (root == null) { - root = new Node(o, null, null, null); - } else { - Node current = root; - Node parent = null; - int cmp; - - //搜索合适的叶子节点,以该叶子节点为父节点添加新节点 - do { - parent = current; - cmp = o.compareTo(current.data); - - //如果新节点的值大于当前节点的值 - if (cmp > 0) { - //以当前节点的右子节点作为当前节点 - current = current.right; - } else { - current = current.left; - } - } while (current != null); - - //创建新节点 - Node newNode = new Node(o, parent, null, null); - - //如果新节点的值大于父节点的值 - if (cmp > 0) { - parent.right = newNode; - } else { - parent.left = newNode; - } - } - } -} diff --git a/group03/510782645/src/com/coding/basic/Iterator.java b/group03/510782645/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group03/510782645/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group03/510782645/src/com/coding/basic/LinkedList.java b/group03/510782645/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 2019f5c703..0000000000 --- a/group03/510782645/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - //链表的长度 - int size = 0; - private Node first; - private Node last; - - public void add(Object o){ - linkLast(o); - size++; - } - - /** - * 按照索引添加 - * @param index - * @param o - */ - public void add(int index , Object o){ - if (index == size) - linkLast(o); - else - linkBefore(o, node(index)); - } - - /** - * 向链表的最后添加元素 - * @param o - */ - private void linkLast(Object o) { - final Node l = last; - final Node newNode = new Node(o, l, null); - last = newNode; - if (l == null) - //如果只有一个元素, 那么设置链表的first为newNode - first = newNode; - else - l.next = newNode; - size++; - } - - /** - * 向链表指定位置添加元素 - * @param o - * @param node - */ - private void linkBefore(Object o, Node node) { - final Node pred = node.prev; - final Node newNode = new Node(o, pred, node); - node.prev = newNode; - if (pred == null) - first = newNode; - else - pred.next = newNode; - size++; - } - - /** - * 将元素添加到起始位置。 - * @param o - */ - private void linkFirst(Object o) { - final Node f = first; - final Node newNode = new Node(o, null, f); - first = newNode; - if (f == null) - last = newNode; - else - f.prev = newNode; - size++; - } - - /** - * 这里查找index节点时, 通过index与size/2的距离来判断是从前往后找还是从后往前找。 - * @param index - * @return - */ - Node node(int index) { - if (index < (size >> 1)) { - Node x = first; - for (int i = 0; i < index; i++) - x = x.next; - return x; - } else { - Node x = last; - for (int i = size - 1; i > index; i--) - x = x.prev; - return x; - } - } - - /** - * 直接调用node方法即可。 - * @param index - * @return - */ - public Object get(int index){ - return node(index); - } - - /** - * 根据下标删除 - * @param index - * @return - */ - public Object remove(int index){ - Node node = node(index); - return remove(node); - } - - /** - * 根据节点的data值来remove - * @param o - * @return - */ - public Object remove(Object o) { - if (o == null) { - for (Node x = first; x != null; x = x.next) { - if (x.data == null) { - return remove(x); - } - } - } else { - for (Node x = first; x != null; x = x.next) { - if (o.equals(x.data)) { - return remove(x); - } - } - } - return null; - } - - private Object remove(Node node){ - final Object obj = node.data; - final Node next = node.next; - final Node prev = node.prev; - //判断临界的地方,index为第一个元素, index为第二个元素 - if (node == first) { - first = next; - } else if (node == last) { - last = prev; - } else { - prev.next = next; - next.prev = prev; - - node.next = null; - node.prev = null; - } - - node.data = null; - size--; - return obj; - } - - public int size(){ - return -size; - } - - public void addFirst(Object o){ - linkFirst(o); - } - public void addLast(Object o){ - linkLast(o); - } - public Object removeFirst(){ - return remove(first); - } - - /** - * 获取但不删除栈顶元素,失败则抛出异常 - * @return - */ - public Object peekFirst() { - final Node f = first; - return (f == null) ? null : f.data; - } - - public Object removeLast(){ - return remove(last); - } - public Iterator iterator(){ - return null; - } - - /** - * Node内部实现类 - */ - private static class Node{ - Object data; - Node prev; - Node next; - - /** - * 使用内部类来实现链表的每一个节点,每个节点有一个指向下一个元素的next,指向上一个元素的prev,以及自身的data - */ - public Node(Object data, Node prev, Node next) { - this.data = data; - this.next = next; - this.prev = prev; - } - } -} diff --git a/group03/510782645/src/com/coding/basic/List.java b/group03/510782645/src/com/coding/basic/List.java deleted file mode 100644 index 6aa2551499..0000000000 --- a/group03/510782645/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index) throws Exception; - public Object remove(int index) throws Exception; - public int size(); -} diff --git a/group03/510782645/src/com/coding/basic/Queue.java b/group03/510782645/src/com/coding/basic/Queue.java deleted file mode 100644 index 4ea6bf2fb3..0000000000 --- a/group03/510782645/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -/** - * Queue的常用方法: - * add(Object o):向队尾插入元素,失败则抛出异常 - * offer(Object o):向队尾插入元素,失败则返回false - * remove():获取并删除队首元素,失败则抛出异常 - * poll():获取并删除队首元素,失败则返回null - * element():获取但不删除队首元素,失败则抛出异常 - * peek():获取但不删除队首元素,失败则返回null - */ -public class Queue { - /** - * Queue中存储的元素 - */ - private Object[] data; - /** - * head指向首端第一个有效元素 - */ - private int head; - /** - * tail指向尾端第一个可以插入元素的空位。 - */ - private int tail; - - /** - * 进队列 - */ - public void enQueue(Object o) { - addLast(o); - } - - /** - * 向队列的尾部添加元素 - */ - public void addLast(Object o) { - if (o == null) - throw new NullPointerException(); - data[tail] = o; - //这里可以避免数组是否越界。 - if ((tail = (tail + 1) & (data.length - 1)) == head) - doubleCapacity(); - } - - /** - * 检查是否要扩容。 - */ - private void doubleCapacity() { - assert head == tail; - int p = head; - int n = data.length; - int r = n - p; // head右边元素的个数 - int newCapacity = n << 1;//原空间的2倍 - if (newCapacity < 0) - throw new IllegalStateException("Sorry, deque too big"); - Object[] a = new Object[newCapacity]; - System.arraycopy(data, p, a, 0, r);//复制右半部分 - System.arraycopy(data, 0, a, r, p);//复制左半部分 - data = (Object[]) a; - head = 0; - tail = n; - } - - /** - * 出队列 - */ - public Object deQueue() { - return removeFirst(); - } - - /** - * 移除第一个元素 - */ - public Object removeFirst() { - Object x = pollFirst(); - if (x == null) - throw new NoSuchElementException(); - return x; - } - - public Object pollFirst() { - int h = head; - Object result = data[h]; // Element is null if deque empty - if (result == null) - return null; - data[h] = null; // Must null out slot - head = (h + 1) & (data.length - 1); - return result; - } - - public boolean isEmpty() { - return head == tail; - } - - public int size() { - return (tail - head) & (data.length - 1); - } -} diff --git a/group03/510782645/src/com/coding/basic/Stack.java b/group03/510782645/src/com/coding/basic/Stack.java deleted file mode 100644 index 6c9384ab67..0000000000 --- a/group03/510782645/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coding.basic; - -/** - * 堆栈是先进后出的结构。 - */ -public class Stack { - protected int elementCount; - private LinkedList elementData = new LinkedList(); - - /** - * 向栈顶插入元素,失败则抛出异常。同LikedList中的addFirst(); - * @param o - */ - public void push(Object o){ - elementData.addFirst(o); - } - - /** - * 获取并删除栈顶元素,失败则抛出异常。同LikedList中的removeFirst(); - * @return - */ - public Object pop(){ - return elementData.removeFirst(); - } - - /** - * 获取但不删除栈顶元素,失败则抛出异常. 同LinkedList中的peekFirst(); - * @return - */ - public Object peek(){ - return elementData.peekFirst(); - } - public boolean isEmpty(){ - return size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group03/569045298/pom.xml b/group03/569045298/pom.xml deleted file mode 100644 index 338f3870aa..0000000000 --- a/group03/569045298/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - 4.0.0 - com.ztc - JavaLevelUp - war - 1.0-SNAPSHOT - JavaLevelUp Maven Webapp - http://maven.apache.org - - - - junit - junit - 3.8.1 - test - - - org.junit.jupiter - junit-jupiter-api - RELEASE - - - junit - junit - 4.12 - - - - - JavaLevelUp - - - diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java b/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java deleted file mode 100644 index dee00342d2..0000000000 --- a/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.coding.basic.datastructure; - - -/** - * Created by zt on 2017/2/19. - */ -public class ArrayList implements List { - - private static final int DEFAULT_CAPACITY = 10; - private int size = 0; - private Object[] elementData = null; - - public ArrayList() { - elementData = new Object[DEFAULT_CAPACITY]; - } - - public ArrayList(int initialCapacity) { - if (initialCapacity < 0) { - throw new RuntimeException("initialCapacity is smaller than zero"); - } - elementData = new Object[initialCapacity]; - } - - @Override - public void add(Object o) { - checkCapacity(size + 1); - elementData[size] = o; - size++; - } - - @Override - public void add(int index, Object o) { - checkCapacity(size + 1); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - @Override - public Object get(int index) { - checkRange(index); - return elementData[index]; - } - - @Override - public Object remove(int index) { - Object removedObject = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, elementData.length - index - 1); - elementData[--size] = null; - return removedObject; - } - - @Override - public int size() { - return size; - } - - private void checkRange(int index) { - if (index < 0 || index > elementData.length) { - throw new IndexOutOfBoundsException(); - } - } - - private void checkCapacity(int size) { - if (size > elementData.length) { - int newLength = elementData.length * 2; - Object[] newObject = new Object[newLength]; - System.arraycopy(elementData, 0, newObject, 0, elementData.length); - elementData = newObject; - } - } - - public Iterator iterator() { - return new ArrayListIterator(this); - } - - private class ArrayListIterator implements Iterator { - - ArrayList arrayList = null; - int pos = 0; - - private ArrayListIterator(ArrayList arrayList) { - this.arrayList = arrayList; - } - - @Override - public boolean hasNext() { - // TODO - pos++; - if (pos > size) { - return false; - } - return true; - } - - @Override - public Object next() { - // TODO - return elementData[pos]; - } - - @Override - public Object remove() { - // TODO - return null; - } - } -} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/BinaryTreeNode.java b/group03/569045298/src/main/com/coding/basic/datastructure/BinaryTreeNode.java deleted file mode 100644 index b69f8932ed..0000000000 --- a/group03/569045298/src/main/com/coding/basic/datastructure/BinaryTreeNode.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic.datastructure; - -/** - * Created by zt on 2017/2/19. - */ -public class BinaryTreeNode { - - private Object data; - - private BinaryTreeNode left; - - private BinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object object) { - return null; - } -} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/Iterator.java b/group03/569045298/src/main/com/coding/basic/datastructure/Iterator.java deleted file mode 100644 index 8bf2ae7ed5..0000000000 --- a/group03/569045298/src/main/com/coding/basic/datastructure/Iterator.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding.basic.datastructure; - -/** - * Created by zt on 2017/2/19. - */ -public interface Iterator { - - boolean hasNext(); - - Object next(); - - Object remove(); -} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java b/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java deleted file mode 100644 index 8814ea82e8..0000000000 --- a/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.coding.basic.datastructure; - -/** - * Created by zt on 2017/2/19. - */ -public class LinkedList implements List { - - private Node head; - - private Node tail; - - private int size = 0; - - public LinkedList() { - - } - - @Override - public void add(Object object) { - if (null == head) { - head = new Node(object); - head.next = null; - tail = head; - size++; - } else { - // 尾插法 - Node newNode = new Node(object); - tail.next = newNode; - tail = newNode; - tail.next = null; - size++; - } - } - - @Override - public void add(int index, Object object) { - checkRange(index); - if (null == head) { - add(object); - return; - } - if (index == 0) { - addFirst(object); - return; - } - Node pre = node(index - 1); - Node newNode = new Node(object); - newNode.next = pre.next; - pre.next = newNode; - size++; - } - - @Override - public Object get(int index) { - checkRange(index); - checkNodeNotNull(); - Node node = node(index); - return node.data; - } - - @Override - public Object remove(int index) { - checkRange(index); - checkNodeNotNull(); - if (index == 0) { - removeFirst(); - return head; - } - Node pre = node(index - 1); - pre.next = pre.next.next; - size--; - return head; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object object) { - if (null == head) { - head = new Node(object); - head.next = null; - size++; - } else { - Node firstNode = new Node(object); - firstNode.next = head; - head = firstNode; - size++; - } - } - - public Object removeFirst() { - checkNodeNotNull(); - head = head.next; - size--; - return head; - } - - public Object removeLast() { - checkNodeNotNull(); - if (size == 1) { - head = null; - } - Node pre = node(size() - 2); - pre.next = null; - size--; - return head; - } - - private void checkRange(int index) { - if (index > size - 1 || index < 0) { - throw new IndexOutOfBoundsException(); - } - } - - private void checkNodeNotNull() { - if (null == head) { - throw new NullPointerException(); - } - } - - private Node node(int index) { - Node node = head; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - } - - private static class Node { - Node next; - private Object data; - - public Node() { - - } - - public Node(Object data) { - this.data = data; - } - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - - public Node(Object data, Node next, Node prev) { - this.data = data; - this.next = next; - } - } - - /*@Override - public void add(Object object) { - if (null == head) { - head = new Node(object); - head.next = null; - } else { - // 头插法 - Node nextNode = new Node(object); - nextNode.next = head.next; - head.next = nextNode; - } - }*/ - -} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/List.java b/group03/569045298/src/main/com/coding/basic/datastructure/List.java deleted file mode 100644 index 4d9292f156..0000000000 --- a/group03/569045298/src/main/com/coding/basic/datastructure/List.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coding.basic.datastructure; - -/** - * Created by zt on 2017/2/19. - */ -public interface List { - - void add(Object o); - - void add(int index, Object o); - - Object get(int index); - - Object remove(int index); - - int size(); -} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/Queue.java b/group03/569045298/src/main/com/coding/basic/datastructure/Queue.java deleted file mode 100644 index d3d4ebfbab..0000000000 --- a/group03/569045298/src/main/com/coding/basic/datastructure/Queue.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coding.basic.datastructure; - - -/** - * Created by zt on 2017/2/19. - */ -public class Queue { - - private ArrayList elementData; - - private int size; - - public Queue() { - elementData = new ArrayList(); - } - - public void enQueue(Object object) { - elementData.add(object); - size++; - } - - public Object deQueue() { - checkIsEmpty(); - Object object = elementData.get(0); - elementData.remove(0); - size--; - return object; - } - - private void checkIsEmpty() { - if (elementData.size() == 0) { - throw new RuntimeException("queue is empty"); - } - } - - public boolean isEmpty() { - return size() == 0; - } - - public int size() { - return size; - } -} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/Stack.java b/group03/569045298/src/main/com/coding/basic/datastructure/Stack.java deleted file mode 100644 index c8dbc6b3af..0000000000 --- a/group03/569045298/src/main/com/coding/basic/datastructure/Stack.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coding.basic.datastructure; - -/** - * Created by zt on 2017/2/19. - */ -public class Stack { - - private ArrayList elementData = null; - - private int size = 0; - - public Stack() { - elementData = new ArrayList(); - } - - public void push(Object object) { - elementData.add(object); - size++; - } - - public Object pop() { - checkIsEmpty(); - Object peekObject = peek(); - elementData.remove(size - 1); - size--; - return peekObject; - } - - public Object peek() { - checkIsEmpty(); - return elementData.get(size - 1); - } - - private void checkIsEmpty() { - if (isEmpty()) { - throw new RuntimeException("stack is empty"); - } - } - - public boolean isEmpty() { - return size() == 0; - } - - public int size() { - return size; - } -} diff --git a/group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java b/group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java deleted file mode 100644 index 9f90242595..0000000000 --- a/group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.coding.basic.datastructure; - -import org.junit.Test; - -/** - * Created by zt on 2017/2/19. - */ -public class TestDataStructure { - - @Test - public void testLinedList() { - LinkedList list = new LinkedList(); - for (int i = 0; i < 5; i++) { - list.add(i); - } - list.add(0, -1); - list.remove(1); - list.removeLast(); - list.addFirst(999); - list.removeFirst(); - System.out.println("list size : " + list.size()); - for (int i = 0; i < list.size(); i++) { - System.out.println(list.get(i)); - } - java.util.LinkedList list1 = new java.util.LinkedList(); - list1.add(0, 2); - System.out.print(list1.get(0)); - } - - @Test - public void testStack() { - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - stack.pop(); - System.out.println(stack.size()); - Object obj = stack.peek(); - } - - @Test - public void testQueue() { - Queue queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - Object object = queue.deQueue(); - System.out.println("dqueue object : " + object); - System.out.println(queue.isEmpty()); - System.out.println(queue.size()); - } - - @Test - public void testArrayList() { - List arrayList = new ArrayList(); - for (int i = 0; i < 30; i++) { - arrayList.add(i); - } - arrayList.add(0, -2); - arrayList.add(1, -1); - System.out.println(arrayList.remove(1)); - System.out.println("ArrayList size : " + arrayList.size()); - for (int i = 0; i < arrayList.size(); i++) { - System.out.println(arrayList.get(i)); - } - } -} diff --git a/group03/617187912/Learning02/.classpath b/group03/617187912/Learning02/.classpath deleted file mode 100644 index fceb4801b5..0000000000 --- a/group03/617187912/Learning02/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group03/617187912/Learning02/.gitignore b/group03/617187912/Learning02/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group03/617187912/Learning02/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group03/617187912/Learning02/.project b/group03/617187912/Learning02/.project deleted file mode 100644 index 12dfa1118c..0000000000 --- a/group03/617187912/Learning02/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 617187912Learning02 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group03/617187912/Learning02/.settings/org.eclipse.core.resources.prefs b/group03/617187912/Learning02/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0203..0000000000 --- a/group03/617187912/Learning02/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/group03/617187912/Learning02/.settings/org.eclipse.jdt.core.prefs b/group03/617187912/Learning02/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group03/617187912/Learning02/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group03/617187912/Learning02/src/com/coding/basic/ArrayList.java b/group03/617187912/Learning02/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 9e22bd0c0b..0000000000 --- a/group03/617187912/Learning02/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.coding.basic; - - -import java.util.Arrays; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData; - - public ArrayList(){ - this(64); - } - - public ArrayList(int intSize) { - elementData = new Object[intSize]; - } - - public void add(Object o) { - checkMaxSize(); - elementData[size] = o; - size++; - } - - public void add(int index, Object o) { - checkMaxSize(); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - private void checkIndexRange(int index) { - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException("index超出数组界限?"); - } - } - - private void checkMaxSize() { - if (size >= elementData.length) { - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - } - - public Object get(int index) { - checkIndexRange(index); - return elementData[index]; - } - - public Object remove(int index) { - Object o = get(index); - if (index == size - 1) { - elementData[index] = null; - } else { - System.arraycopy(elementData, index + 1, elementData, index, size - index); - } - size--; - return o; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new MyIterator(); - } - - private class MyIterator implements Iterator { - - private int current = 0; - - @Override - public boolean hasNext() { - return current != size; - } - - @Override - public Object next() { - if (current >= size) { - throw new NoSuchElementException(); - } - return elementData[current++]; - } - } - - public static void main(String[] args) { - ArrayList arrayList = new ArrayList(5); - arrayList.add(1); - arrayList.add(2); - arrayList.add(3); - arrayList.add(4); - arrayList.add(5); - arrayList.add(6); - System.out.println(arrayList.get(1)); - arrayList.add(1, 100); - System.out.println(arrayList.get(1)); - System.out.println(arrayList.size); - System.out.println(arrayList.remove(2)); - System.out.println(arrayList.get(2)); - - - ArrayList mixArraylist = new ArrayList(5); - mixArraylist.add("String"); - mixArraylist.add(100); - mixArraylist.add('f'); - mixArraylist.add(3.1f); - mixArraylist.add(4L); - System.out.println(mixArraylist.get(1)); - mixArraylist.add(1, 101); - System.out.println(mixArraylist.get(1)); - System.out.println(mixArraylist.size); - System.out.println(mixArraylist.remove(2)); - System.out.println(mixArraylist.get(2)); - } -} \ No newline at end of file diff --git a/group03/617187912/Learning02/src/com/coding/basic/BinaryTreeNode.java b/group03/617187912/Learning02/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 7b6479d535..0000000000 --- a/group03/617187912/Learning02/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.coding.basic; - - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group03/617187912/Learning02/src/com/coding/basic/Iterator.java b/group03/617187912/Learning02/src/com/coding/basic/Iterator.java deleted file mode 100644 index 017cbc4240..0000000000 --- a/group03/617187912/Learning02/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic; - - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group03/617187912/Learning02/src/com/coding/basic/LinkedList.java b/group03/617187912/Learning02/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 88a4c6c31b..0000000000 --- a/group03/617187912/Learning02/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - private int size; - - public void add(Object o) { - addLast(o); - } - - public void add(int index, Object o) { - checkIndexRange(index); - if (index == 0) { - head = new Node(o, head); - size++; - } else { - Node nd = getNode(index-1); - nd.next = new Node(o, nd.next); - size++; - } - } - - public Object get(int index) { - return getNode(index).data; - } - - private Node getNode(int index) { - Node nd = head; - for (int i = 0; i < index; i++) { - nd = nd.next; - } - return nd; - } - - public Object remove(int index) { - if (size == 0) { - throw new NoSuchElementException(); - } - checkIndexRange(index); - if (index == 0) { - Object o = head.data; - head = head.next; - size--; - return o; - } else { - Node nd = getNode(index - 1); - Object o = nd.next.data; - nd.next = nd.next.next; - size--; - return o; - } - } - - private void checkIndexRange(int index) { - if (index > size || index < 0) { - throw new IndexOutOfBoundsException("index超出数组界限?"); - } - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - add(0, o); - } - - public void addLast(Object o) { - if (size == 0) { - addFirst(o); - } else { - add(size, o); - } - } - - public Object removeFirst() { - return remove(0); - } - - public Object removeLast() { - return remove(size - 1); - } - - public Iterator iterator() { - return new MyIterator(); - } - - private class MyIterator implements Iterator { - - public Node current = head; - - @Override - public boolean hasNext() { - return current != null; - } - - @Override - public Object next() { - Object o = current.data; - current = current.next; - return o; - } - } - - private static class Node { - Object data; - Node next; - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } - - public static void main(String[] args) { - LinkedList list = new LinkedList(); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - for (int i = 0; i < list.size; i++) { - System.out.println(list.get(i)); - } - System.out.println(list.get(2)); - list.add(2, 100); - System.out.println(list.get(2)); - list.addFirst(10); - System.out.println(list.get(2)); - list.addLast(100); - System.out.println(list.remove(1)); - System.out.println(list.removeFirst()); - System.out.println(list.removeLast()); - } -} diff --git a/group03/617187912/Learning02/src/com/coding/basic/List.java b/group03/617187912/Learning02/src/com/coding/basic/List.java deleted file mode 100644 index cd5130be3b..0000000000 --- a/group03/617187912/Learning02/src/com/coding/basic/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic; - - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group03/617187912/Learning02/src/com/coding/basic/Queue.java b/group03/617187912/Learning02/src/com/coding/basic/Queue.java deleted file mode 100644 index 39e1a8b60b..0000000000 --- a/group03/617187912/Learning02/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.coding.basic; - - -public class Queue { - private LinkedList linkedList = new LinkedList(); - - public void enQueue(Object o) { - linkedList.add(o); - } - - public Object deQueue() { - return linkedList.removeFirst(); - } - - public boolean isEmpty() { - return linkedList.size() ==0; - } - - public int size() { - return linkedList.size(); - } - public static void main(String[] args) { - Queue que = new Queue(); - que.enQueue(10); - que.enQueue(11); - que.enQueue(12); - System.out.println(que.deQueue()); - System.out.println(que.isEmpty()); - que.deQueue(); - que.deQueue(); - System.out.println(que.isEmpty()); - } -} diff --git a/group03/617187912/Learning02/src/com/coding/basic/Stack.java b/group03/617187912/Learning02/src/com/coding/basic/Stack.java deleted file mode 100644 index 1ee047ba4a..0000000000 --- a/group03/617187912/Learning02/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coding.basic; - - -import java.util.EmptyStackException; - -import javax.lang.model.element.QualifiedNameable; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - checkIsEmpty(); - return elementData.remove(size()-1); - } - - private void checkIsEmpty() { - if (isEmpty()){ - throw new EmptyStackException(); - } - } - - public Object peek(){ - checkIsEmpty(); - return elementData.get(size()-1); - } - public boolean isEmpty(){ - return elementData.size()==0; - } - public int size(){ - return elementData.size(); - } - public static void main(String[] args) { - Stack que = new Stack(); - que.push(10); - que.push(11); - que.push(12); - System.out.println(que.peek()); - System.out.println(que.isEmpty()); - System.out.println(que.pop()); - System.out.println(que.pop()); - que.pop(); - System.out.println(que.isEmpty()); - } -} diff --git a/group03/617187912/Learning201702/.classpath b/group03/617187912/Learning201702/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group03/617187912/Learning201702/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group03/617187912/Learning201702/.gitignore b/group03/617187912/Learning201702/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group03/617187912/Learning201702/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group03/617187912/Learning201702/.project b/group03/617187912/Learning201702/.project deleted file mode 100644 index b3dfe82232..0000000000 --- a/group03/617187912/Learning201702/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 617187912Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group03/617187912/Learning201702/.settings/org.eclipse.core.resources.prefs b/group03/617187912/Learning201702/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0203..0000000000 --- a/group03/617187912/Learning201702/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/group03/617187912/Learning201702/src/com/coding/basic/ArrayList.java b/group03/617187912/Learning201702/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 517f614f71..0000000000 --- a/group03/617187912/Learning201702/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - if (size>=elementData.length){ - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - elementData[size] = o; - size+=1; - } - public void add(int index, Object o){ - if (size>=elementData.length){ - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - System.arraycopy(elementData, index, - elementData, index+1, size-index); - elementData[index]=o; - size+=1; - } - - public Object get(int index){ - return elementData[index]; - } - - public Object remove(int index){ - System.arraycopy(elementData, index+1, - elementData, index, size-index); - size-=1; - return elementData; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return null; - } - -} \ No newline at end of file diff --git a/group03/617187912/Learning201702/src/com/coding/basic/BinaryTreeNode.java b/group03/617187912/Learning201702/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group03/617187912/Learning201702/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group03/617187912/Learning201702/src/com/coding/basic/Iterator.java b/group03/617187912/Learning201702/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group03/617187912/Learning201702/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group03/617187912/Learning201702/src/com/coding/basic/LinkedList.java b/group03/617187912/Learning201702/src/com/coding/basic/LinkedList.java deleted file mode 100644 index e2c4e5e795..0000000000 --- a/group03/617187912/Learning201702/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group03/617187912/Learning201702/src/com/coding/basic/List.java b/group03/617187912/Learning201702/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group03/617187912/Learning201702/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group03/617187912/Learning201702/src/com/coding/basic/Queue.java b/group03/617187912/Learning201702/src/com/coding/basic/Queue.java deleted file mode 100644 index 36e516e266..0000000000 --- a/group03/617187912/Learning201702/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group03/617187912/Learning201702/src/com/coding/basic/Stack.java b/group03/617187912/Learning201702/src/com/coding/basic/Stack.java deleted file mode 100644 index a5a04de76d..0000000000 --- a/group03/617187912/Learning201702/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group03/619224754/.classpath b/group03/619224754/.classpath deleted file mode 100644 index 373dce4005..0000000000 --- a/group03/619224754/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group03/619224754/.gitignore b/group03/619224754/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group03/619224754/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group03/619224754/.project b/group03/619224754/.project deleted file mode 100644 index fab8d7f04c..0000000000 --- a/group03/619224754/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group03/619224754/.settings/org.eclipse.jdt.core.prefs b/group03/619224754/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group03/619224754/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group03/619224754/src/Main/Main.java b/group03/619224754/src/Main/Main.java deleted file mode 100644 index 2419e8fa45..0000000000 --- a/group03/619224754/src/Main/Main.java +++ /dev/null @@ -1,5 +0,0 @@ -package Main; - -public class Main { - -} diff --git a/group03/619224754/src/com/coding/basic/ArrayList.java b/group03/619224754/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 05fc412f93..0000000000 --- a/group03/619224754/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - if(elementData.length == size) { - Object[] arrTaget = new Object[size * 2]; - System.arraycopy(elementData, 0, arrTaget, 0, size); - this.elementData = arrTaget; - } - - elementData[size++] = o; - } - - public void add(int index, Object o){ - if(index < 0 || index > size){ - throw new IndexOutOfBoundsException("Index out of bound"); - } - Object[] arrTarget = new Object[size - index]; - System.arraycopy(elementData, index, arrTarget, 0, size - index); - elementData[index] = o; - System.arraycopy(arrTarget, 0, elementData, index + 1, size - index); - } - - public Object get(int index){ - return elementData[index]; - } - - public Object remove(int index){ - Object retObj = elementData[index]; - - if(index < 0 || index > size){ - throw new IndexOutOfBoundsException("Index out of bound"); - } - else if(index == size) { - elementData[index] = null; - } - else { - System.arraycopy(elementData, index + 1, elementData, index, size - index); - } - - size--; - return retObj; - } - - public int size(){ - return this.size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator{ - - private int cursor = 0; - - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return this.cursor != size; - } - - @Override - public Object next() { - // TODO Auto-generated method stub - return elementData[this.cursor++]; - } - } - -} diff --git a/group03/619224754/src/com/coding/basic/BinaryTreeNode.java b/group03/619224754/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 58005fb1b4..0000000000 --- a/group03/619224754/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.coding.basic; - -import java.util.Comparator; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - BinaryTreeNode treeNode = new BinaryTreeNode(); - treeNode.data = o; - int intO = Integer.parseInt(o.toString()); - int intData = Integer.parseInt(this.data.toString()); - if(intO > intData){ - if(this.right == null){ - this.right = treeNode; - } - else { - this.right.insert(o); - } - } - else { - if(this.left == null) { - this.left = treeNode; - } - else { - this.left.insert(o); - } - } - return treeNode; - } - - private class MyComparator implements Comparator { - - @Override - public int compare(BinaryTreeNode arg0, BinaryTreeNode arg1) { - // TODO Auto-generated method stub - int int0 = Integer.parseInt(arg0.data.toString()); - int int1 = Integer.parseInt(arg1.data.toString()); - if(int0 > int1) { - return 1; - } - else if(int0 < int1){ - return -1; - } - - return 0; - - } - - - } - -} diff --git a/group03/619224754/src/com/coding/basic/Iterator.java b/group03/619224754/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group03/619224754/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group03/619224754/src/com/coding/basic/LinkedList.java b/group03/619224754/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 8ca8159baf..0000000000 --- a/group03/619224754/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,182 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o) { - if(head == null) { - head = new Node(); - head.data = o; - } - else { - Node newNode = new Node(); - newNode.data = o; - Node lastNode = head; - while(head.next != null) { - lastNode = head.next; - } - lastNode.next = newNode; - } - } - - public void add(int index , Object o) { - if(index >= this.size()) - throw new IndexOutOfBoundsException("Index out of bound"); - - Node newNode = new Node(); - newNode.data = o; - if(index == 0) { - newNode.next = this.head; - this.head = newNode; - } - else if(index == this.size()) { - Node curNode = this.head; - while(curNode.next != null){ - curNode = curNode.next; - } - curNode.next = newNode; - } - else { - Node beforeNode = this.head; - Node afterNode = null; - for(int i = 1; i < index; i++) { - beforeNode = head.next; - } - afterNode = beforeNode.next; - newNode.next = afterNode; - beforeNode.next = newNode; - } - } - - public Object get(int index){ - Node retNode = this.head; - - if(index < 0){ - throw new IndexOutOfBoundsException("Index out of bound"); - } - - if(index != 0) { - for(int i = 0; i < index; i++) { - retNode = retNode.next; - } - } - - return retNode.data; - } - - public Object remove(int index){ - Node beforeNode = null; - Node afterNode = null; - Node removedNode = null; - if(index == 0) { - removedNode = this.head; - this.head = this.head.next; - } - else { - for(int i = 1; i < index; i++) { - beforeNode = head.next; - } - removedNode = beforeNode.next; - afterNode = removedNode.next; - beforeNode.next = afterNode; - } - - - return removedNode.data; - } - - public int size(){ - int i = 0; - if(this.head == null) - return 0; - - Node curNode = this.head; - while(curNode != null){ - curNode = curNode.next; - i++; - } - return i; - } - - public void addFirst(Object o){ - Node firstNode = new Node(); - firstNode.data = o; - firstNode.next = this.head; - this.head = firstNode; - } - - public void addLast(Object o){ - Node newNode = new Node(); - newNode.data = o; - if(this.size() == 0){ - this.head = newNode; - } - - Node curNode = this.head; - while(curNode.next != null) { - curNode = curNode.next; - } - curNode.next = newNode; - } - - public Object removeFirst() { - Node retNode = this.head; - this.head = this.head.next; - - return retNode; - } - - public Object removeLast() { - Node curNode = null; - if(this.size() == 0) { - curNode = null; - } - else if(this.size() == 1) { - curNode = this.head; - this.head = null; - return curNode; - } - else { - Node beforeNode = this.head; - for (int i = 1; i < this.size() - 1; i++) { - beforeNode = beforeNode.next; - } - curNode = beforeNode.next; - beforeNode.next = null; - } - - return curNode; - } - - public Iterator iterator(){ - return null; - } - - private class LinkedListIterator implements Iterator { - - private Node curNode = head; - - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return this.curNode.next != null; - } - - @Override - public Object next() { - // TODO Auto-generated method stub - return this.curNode.next; - } - - - - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group03/619224754/src/com/coding/basic/List.java b/group03/619224754/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group03/619224754/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group03/619224754/src/com/coding/basic/Queue.java b/group03/619224754/src/com/coding/basic/Queue.java deleted file mode 100644 index de53482312..0000000000 --- a/group03/619224754/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList list = new LinkedList(); - - public void enQueue(Object o){ - list.addLast(o); - } - - public Object deQueue(){ - Object ret = list.removeFirst(); - return ret; - } - - public boolean isEmpty(){ - return list.size() == 0; - } - - public int size(){ - return list.size(); - } -} diff --git a/group03/619224754/src/com/coding/basic/Stack.java b/group03/619224754/src/com/coding/basic/Stack.java deleted file mode 100644 index cf10ecc1b3..0000000000 --- a/group03/619224754/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - this.elementData.add(o); - } - - public Object pop(){ - Object ret = this.elementData.remove(this.elementData.size() - 1); - return ret; - } - - public Object peek(){ - Object ret = this.elementData.get(this.elementData.size() - 1); - return null; - } - public boolean isEmpty(){ - return this.elementData.size() == 0; - } - public int size(){ - return this.elementData.size(); - } -} diff --git a/group03/619224754/src/test/ArrayListTest.java b/group03/619224754/src/test/ArrayListTest.java deleted file mode 100644 index 9d9e014379..0000000000 --- a/group03/619224754/src/test/ArrayListTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package test; - -import static org.junit.Assert.*; - -import org.junit.Assert; -import org.junit.Test; - -import com.coding.basic.ArrayList; -import com.coding.basic.Iterator; - - - -public class ArrayListTest { - - @Test - public void testAdd() { - ArrayList array = new ArrayList(); - for (int i = 0; i < 105; i++) { - array.add(i); - } - - Assert.assertEquals("Shoule be the same", 105, array.size()); - } - - @Test - public void testAddIndex() { - ArrayList array = new ArrayList(); - for (int i = 0; i < 105; i++) { - array.add(i); - } - - array.add(100, 100); - Assert.assertEquals("Shoule be the same", 100, array.get(100)); - Assert.assertEquals("Shoule be the same", 100, array.get(101)); - } - - @Test - public void testRemove() { - ArrayList array = new ArrayList(); - for (int i = 0; i < 105; i++) { - array.add(i); - } - - Assert.assertEquals("Shoule be the same", 100, array.remove(100)); - Assert.assertEquals("Shoule be the same", 104, array.size()); - } - - @Test - public void testIterator() { - ArrayList array = new ArrayList(); - for (int i = 0; i < 105; i++) { - array.add(i); - } - Iterator iterator = array.iterator(); - int j = 0; - while(iterator.hasNext()){ - Assert.assertEquals("Shoule be the same", iterator.next(), array.get(j)); - j++; - } - } - -} diff --git a/group03/664269713/DataStructure/.gitignore b/group03/664269713/DataStructure/.gitignore deleted file mode 100644 index fb921cf6e9..0000000000 --- a/group03/664269713/DataStructure/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/bin/ -/.classpath -/.project \ No newline at end of file diff --git a/group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java b/group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java deleted file mode 100644 index a529faef7b..0000000000 --- a/group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.ace.coding; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - checkArrayLength(); - elementData[size++] = o; - } - - private void checkArrayLength(){ - if(elementData.length < size() + 1){ - // expand the origin length of the array - int newLength = size * 2 + 1; - elementData = Arrays.copyOf(elementData, newLength); - } - } - - private void checkIndex(int index){ - if(index < 0 || index >= size()){ - throw new IndexOutOfBoundsException("Index " + index + " is invalid."); - } - } - - public void add(int index, Object o){ - checkIndex(index); - checkArrayLength(); - System.arraycopy(elementData, index, elementData, index+1, size() - index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - checkIndex(index); - return elementData[index]; - } - - public Object remove(int index){ - checkIndex(index); - Object obj = elementData[index]; - if(index == size() - 1){ - elementData[index] = null; - } else { - System.arraycopy(elementData, index + 1, elementData, index, size() - index - 1); - } - size--; - return obj; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return null; -// return new ListIterator(); - } - - /*private class ListIterator implements Iterator{ - private int index = 0; - - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return index != size; - } - - @Override - public Object next() { - // TODO Auto-generated method stub - if(index >= size){ - throw new IndexOutOfBoundsException("There's no next element."); - } - return elementData[index++]; - } - - }*/ - -} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/BinaryTreeNode.java b/group03/664269713/DataStructure/src/com/ace/coding/BinaryTreeNode.java deleted file mode 100644 index e6253b221c..0000000000 --- a/group03/664269713/DataStructure/src/com/ace/coding/BinaryTreeNode.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.ace.coding; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private BinaryTreeNode rootNode; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - BinaryTreeNode newNode = new BinaryTreeNode(); - newNode.setData(o); - - if(rootNode == null){ - rootNode = newNode; - rootNode.data = data; - left = null; - right = null; - } else { - BinaryTreeNode currentNode = rootNode; - while(true){ - BinaryTreeNode pNode = currentNode; - if((int)newNode.getData() > (int)currentNode.getData()){ - currentNode = currentNode.right; - if(currentNode.right == null){ - pNode.right = newNode; - return newNode; - } - } else { - currentNode = currentNode.left; - if(currentNode.left == null){ - pNode.left = newNode; - return newNode; - } - } - } - - } - return newNode; - } - -} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/Iterator.java b/group03/664269713/DataStructure/src/com/ace/coding/Iterator.java deleted file mode 100644 index 09c5442076..0000000000 --- a/group03/664269713/DataStructure/src/com/ace/coding/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.ace.coding; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/LinkedList.java b/group03/664269713/DataStructure/src/com/ace/coding/LinkedList.java deleted file mode 100644 index 351a6a8277..0000000000 --- a/group03/664269713/DataStructure/src/com/ace/coding/LinkedList.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.ace.coding; - -public class LinkedList implements List { - private Node head = null; - private int size = 0; - - public void add(Object o){ - Node newNode = new Node(); - newNode.data = o; - if(head == null){ - head = newNode; - } else { - Node pNode = head; - while(pNode.next != null){ - pNode = pNode.next; - } - pNode.next = newNode; - } - size++; - } - - public void add(int index , Object o){ - checkLinkedListIndex(index); - - Node newNode = new Node(); - newNode.data = o; - Node pNode = getNode(index); - newNode.next = pNode.next; - pNode.next = newNode; - - size++; - } - - private Node getNode(int index){ - Node pNode = head; - for(int i = 0; i < index; i++){ - pNode = pNode.next; - } - return pNode; - } - - public Object get(int index){ - Node pNode = getNode(index); - return pNode.data; - } - public Object remove(int index){ - checkLinkedListIndex(index); - - Node pNode = head; - for(int i = 0; i < index - 1; i++){ - pNode = pNode.next; - } - Node tempNode = getNode(index); - pNode.next = tempNode.next; - size--; - return tempNode.data; - } - - - public void addFirst(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = head; - head = newNode; - size++; - } - public void addLast(Object o){ - Node newNode = new Node(); - newNode.data = o; - Node pNode = getNode(size() - 1); - pNode.next = newNode; - size++; - } - public Object removeFirst(){ - Node pNode = head; - head = pNode.next; - size--; - return pNode.data; - } - public Object removeLast(){ - Object obj = remove(size() - 1); - return obj; - } - - public int size(){ - return size; - } - - private void checkLinkedListIndex(int index){ - if(index < 0 || index >= size()){ - throw new IndexOutOfBoundsException("The index " + index + " is invalid."); - } - } - - public Iterator iterator(){ - return null; -// return new ListIterator(); - } - - /*private class ListIterator implements Iterator{ - private Node pNode = head; - - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return pNode.next != null; - } - - @Override - public Object next() { - // TODO Auto-generated method stub - Object obj = pNode.data; - pNode = pNode.next; - return obj; - } - - }*/ - - private static class Node{ - Object data; - Node next; - } -} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/List.java b/group03/664269713/DataStructure/src/com/ace/coding/List.java deleted file mode 100644 index 33bddf1899..0000000000 --- a/group03/664269713/DataStructure/src/com/ace/coding/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.ace.coding; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/Queue.java b/group03/664269713/DataStructure/src/com/ace/coding/Queue.java deleted file mode 100644 index 15bcf5d497..0000000000 --- a/group03/664269713/DataStructure/src/com/ace/coding/Queue.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ace.coding; - -public class Queue { - private ArrayList arrayList = new ArrayList(); - private int size = 0; - - public void enQueue(Object data){ - arrayList.add(size(), data); - size++; - } - - public Object deQueue(){ - if(isEmpty()){ - throw new IndexOutOfBoundsException("The Queue is Empty."); - } - size--; - return arrayList.remove(0); - } - - public boolean isEmpty(){ - return size()>0; - } - - public int size(){ - return size; - } -} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/Stack.java b/group03/664269713/DataStructure/src/com/ace/coding/Stack.java deleted file mode 100644 index 4ef1f68084..0000000000 --- a/group03/664269713/DataStructure/src/com/ace/coding/Stack.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ace.coding; - -public class Stack { - private ArrayList elementData = new ArrayList(); - private int size = 0; - - public void push(Object o){ - elementData.add(o); - size++; - } - - public Object pop(){ - checkStack(); - Object obj = elementData.remove(size()-1); - size--; - return obj; - } - - public Object peek(){ - checkStack(); - return elementData.get(size()-1); - } - - private void checkStack(){ - if(isEmpty()){ - throw new IndexOutOfBoundsException("This stack is empty"); - } - } - - public boolean isEmpty(){ - return size == 0; - } - public int size(){ - return size; - } -} diff --git a/group03/763878069/.classpath b/group03/763878069/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group03/763878069/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group03/763878069/.gitignore b/group03/763878069/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group03/763878069/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group03/763878069/.project b/group03/763878069/.project deleted file mode 100644 index 14ea6baea5..0000000000 --- a/group03/763878069/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - SimpleDataStructure - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group03/763878069/src/cmj/datastructure/list/ArrayList.java b/group03/763878069/src/cmj/datastructure/list/ArrayList.java deleted file mode 100644 index 21286512d0..0000000000 --- a/group03/763878069/src/cmj/datastructure/list/ArrayList.java +++ /dev/null @@ -1,154 +0,0 @@ -package cmj.datastructure.list; - -import java.util.Arrays; -import java.util.Collection; - -public class ArrayList implements List { - private transient Object[] elementData; - private int size; - - /** - * ArrayList初始化无参数构造函数 - */ - public ArrayList() { - this(10); - } - - /** - * ArrayList带容量的构造函数 - * - * @param initialCapacity初始化容量 - */ - public ArrayList(int initialCapacity) { - super(); - if (initialCapacity < 0) - throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); - // 新建一个数组 - this.elementData = new Object[initialCapacity]; - } - - /** - * 检查数组的容量 - * - * @param neededMinCapacity所需最小的容量 - */ - public void ensureCapacity(int neededMinCapacity) { - int currCapacity = elementData.length;// 获取当前数据的全部容量 - // 需要扩容的情况 - if (neededMinCapacity > currCapacity) { - int newCapacity = (currCapacity * 3) / 2 + 1;// 计算新的容量 - elementData = Arrays.copyOf(elementData, newCapacity); - } - } - - /** - * 添加数据 - * - * @param o要添加的元素 - * @return 是否添加成功 - */ - public void add(Object o) { - // 确定ArrayList的容量大小 - ensureCapacity(size + 1); // Increments modCount!! - // 添加o到ArrayList中 - elementData[size++] = o; - } - - /** - * 就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。 - * - * @param index要用于检查的索引 - */ - private void RangeCheck(int index) { - if (index > size || index < 0) - throw new IndexOutOfBoundsException("Index: " + index + " 超出访问范围"); - } - - /** - * 向指定的位置添加元素 - * - * @param index - * @param o - */ - public void add(int index, Object o) { - RangeCheck(index); - ensureCapacity(size + 1);// 检查容量 - - /* 将原数组从第index个位置复制到原数组第index+1个位置上,一共移动size-index(也就是后面剩下的)个元素 */ - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public boolean addAll(Collection c) { - Object[] a = c.toArray(); - int growthNum = a.length; - ensureCapacity(size + growthNum); // Increments modCount - System.arraycopy(a, 0, elementData, size, growthNum); - size += growthNum; - return growthNum != 0; - } - - public Object get(int index) { - RangeCheck(index); - return elementData[index]; - - } - - public Object remove(int index) { - RangeCheck(index); - int numMoved = size - index - 1;// 删除后需要移动的对象 - Object RemovedValue = elementData[index]; - if (numMoved > 0) - System.arraycopy(elementData, index + 1, elementData, index, numMoved); - elementData[--size] = null; - return RemovedValue; - } - - public int size() { - return size; - } - - @Override - public String toString() { - String arraylist = "["; - for (int i = 0; i < size; i++) { - if (i == size - 1) { - arraylist += elementData[i].toString() + "]"; - } else { - arraylist += elementData[i].toString() + " ,"; - } - } - return arraylist; - } - - public static void main(String[] args) { - ArrayList arrayList = new ArrayList(5); - arrayList.add(1); - arrayList.add(2); - arrayList.add(3); - arrayList.add(4); - arrayList.add(5); - arrayList.add(6); - System.out.println(arrayList); - arrayList.add(1, 1234); - System.out.println(arrayList); - arrayList.remove(1); - System.out.println(arrayList); - System.out.println(arrayList.get(5)); - - ArrayList stringArraylist = new ArrayList(3); - stringArraylist.add("Hello "); - stringArraylist.add("string "); - stringArraylist.add("arraylist"); - System.out.println(stringArraylist); - - ArrayList mixArraylist = new ArrayList(5); - mixArraylist.add("String"); - mixArraylist.add(1); - mixArraylist.add('f'); - mixArraylist.add(3.1f); - mixArraylist.add(4L); - System.out.println(mixArraylist); - } -} diff --git a/group03/763878069/src/cmj/datastructure/list/LinkedList.java b/group03/763878069/src/cmj/datastructure/list/LinkedList.java deleted file mode 100644 index c36197b360..0000000000 --- a/group03/763878069/src/cmj/datastructure/list/LinkedList.java +++ /dev/null @@ -1,208 +0,0 @@ -package cmj.datastructure.list; - -public class LinkedList implements List { - - private Node head;// 头结点 - private Node current;// 尾结点 - private int size; - - public LinkedList() { - // 头指针和尾指针都指向头结点 - head = new Node(null, null); - current = head; - } - - /** - * 添加元素 - * - * @param o——用于添加的元素 - */ - public void add(Object o) { - Node node = new Node(o, null);// 新建一个结点 - current.next = node;// 尾指针指向它 - current = current.next;// 尾指针指向最后一个元素 - size++; - } - - /** - * 在第index个位置插入元素 - * - * @param index——要插入的位置 - * @param o——用于插入的对象 - */ - public void add(int index, Object o) { - Node node = new Node(o, null);// 新建一个结点 - if (index == 0) { - addFirst(o); - } else { - Node curr = (Node) this.get(index - 1);// 获得前一个结点 - Node behind = (Node) this.get(index);// 获得后一个结点 - // 在这两个结点之间插入新的元素,修改引用指向 - curr.next = node; - node.next = behind; - size++; - } - - } - - /** - * 随机访问index位置上的元素 - * - * @param index——元素的位置 - * @return——对应的元素 - */ - public Object get(int index) { - RangeCheck(index);// 检查索引是否越界 - Node curr = head;// 得到头结点的引用 - // 从头结点开始遍历到第index个元素 - for (int i = 0; i <= index; i++) - curr = curr.next; - return curr; - } - - /** - * 删除第index个位置上的元素 - * - * @param index - * @return - */ - public Object remove(int index) { - RangeCheck(index);// 检查索引是否越界 - if (0 == index) { - return removeFirst(); - } else { - Node toRemove = (Node) this.get(index);// 获得要删除的结点 - Node preRemove = (Node) this.get(index - 1);// 获得前一个结点 - preRemove.next = toRemove.next;// 将前一个结点指向要删除的结点的下一个结点 - size--; - return toRemove; - } - - } - - /** - * 获取元素的大小 - * - * @return - */ - public int size() { - return size; - } - - /** - * 在链表头部增加元素 - * - * @param o——要增加的元素 - */ - public void addFirst(Object o) { - Node node = new Node(o, null);// 新建一个结点 - node.next = head.next;// 结点指向第一个元素 - head.next = node;// 将头结点指向它 - size++; - } - - /** - * 在链表末尾添加元素 - * - * @param o——要添加的元素 - */ - public void addLast(Object o) { - Node node = new Node(o, null);// 新建一个结点 - current.next.next = node;// 尾结点的next指向新建的结点 - current.next = node;// 尾结点引用指向向新结点 - size++; - } - - /** - * 移除第一个元素 - * - * @return——移除元素 - */ - public Object removeFirst() { - Node curr = head.next;// 新建一个引用记录第一个结点 - head.next = curr.next;// 头指针移动到原第二个元素上 - size--; - return curr; - } - - /** - * 移除最后一个元素 - * - * @return——移除元素 - */ - public Object removeLast() { - Node remove = current.next; - Node pre = (Node) this.get(size - 2);// 获得倒数第二个结点 - current.next = pre; - pre.next = null; - size--; - return remove; - } - - /** - * 就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。 - * - * @param index要用于检查的索引 - */ - private void RangeCheck(int index) { - if (index > size || index < 0) - throw new IndexOutOfBoundsException("Index: " + index + " 超出访问范围"); - } - - /** - * 重写toString()方法 - */ - @Override - public String toString() { - String linkedlist = "["; - Node visit = head; - while (visit.next != null) { - visit = visit.next; - if (visit.next == null) { - linkedlist += visit.data.toString() + "]"; - } else { - linkedlist += visit.data.toString() + "--->"; - } - } - return linkedlist; - } - - /** - * 结点内部类,主要要声明为static的 - * - * @author think - * - */ - private static class Node { - Object data; - Node next; - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - - } - - public static void main(String[] args) { - LinkedList list = new LinkedList(); - list.add("a"); - list.add("b"); - list.add("c"); - list.add("d"); - System.out.println(list); - System.out.println(((Node) list.get(3)).data); - list.add(4, "4"); - System.out.println(list); - list.add(0, "0"); - System.out.println(list); - list.addLast("last"); - System.out.println(list); - System.out.println("Removed:" + ((Node) list.remove(1)).data); - System.out.println(list); - System.out.println("Removed:" + ((Node) list.removeFirst()).data); - System.out.println(list); - System.out.println("Removed:" + ((Node) list.removeLast()).data); - System.out.println(list); - } -} diff --git a/group03/763878069/src/cmj/datastructure/list/List.java b/group03/763878069/src/cmj/datastructure/list/List.java deleted file mode 100644 index 8e58ed10f4..0000000000 --- a/group03/763878069/src/cmj/datastructure/list/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package cmj.datastructure.list; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} \ No newline at end of file diff --git a/group03/763878069/src/cmj/datastructure/list/Queue.java b/group03/763878069/src/cmj/datastructure/list/Queue.java deleted file mode 100644 index 88d8a32e38..0000000000 --- a/group03/763878069/src/cmj/datastructure/list/Queue.java +++ /dev/null @@ -1,128 +0,0 @@ -package cmj.datastructure.list; - -import java.util.Arrays; - -public class Queue { - - private transient Object[] elementData; - private int size; - - /** 数组的头部,即 下次删除数据的 index */ - private int head; - /** 数组的尾部,即 下次插入数据的 index */ - private int tail; - - /** - * Queue 初始化无参数构造函数 - */ - public Queue() { - this(10); - } - - /** - * Queue带容量的构造函数 - * - * @param initialCapacity初始化容量 - */ - public Queue(int initialCapacity) { - super(); - if (initialCapacity < 0) - throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); - // 新建一个数组 - this.elementData = new Object[initialCapacity]; - this.head = 0; - this.tail = 0; - this.size = 0; - - } - - /** - * 检查数组的容量 - * - * @param neededMinCapacity所需最小的容量 - */ - public void ensureCapacity(int neededMinCapacity) { - int currCapacity = elementData.length;// 获取当前数据的全部容量 - // 需要扩容的情况 - if (neededMinCapacity > currCapacity) { - int newCapacity = (currCapacity * 3) / 2 + 1;// 计算新的容量 - elementData = Arrays.copyOf(elementData, newCapacity); - } - } - - /** - * 添加数据到尾部 - * - * @param o——要添加的数据 - */ - public void enQueue(Object o) { - // 确定ArrayList的容量大小 - ensureCapacity(size + 1); // Increments modCount!! - // 添加o到ArrayList中 - elementData[tail] = o; - size++; - tail++; - } - - /** - * 删除数据 从头部 - * - * @return——被删除的数据 - */ - public Object deQueue() { - if (isEmpty()) { - throw new RuntimeException("队列为空"); - } - Object deleted = (Object) elementData[head]; - elementData[head] = null; - size--; - head++; - return deleted; - } - - public boolean isEmpty() { - return size <= 0 ? true : false; - } - - public int size() { - return size; - } - - @Override - public String toString() { - if (isEmpty()) { - return "[空队列]"; - } - String arraylist = "["; - for (int i = head; i < tail; i++) { - if (i == tail - 1) { - arraylist += elementData[i].toString() + "]"; - } else { - arraylist += elementData[i].toString() + "--->"; - } - } - return arraylist; - } - - public static void main(String[] args) { - Queue queue = new Queue(4); - queue.enQueue("one"); - queue.enQueue("two"); - queue.enQueue("three"); - queue.enQueue("four"); - queue.enQueue("five"); - System.out.println(queue); - queue.deQueue(); - System.out.println(queue); - queue.deQueue(); - System.out.println(queue); - queue.deQueue(); - System.out.println(queue); - queue.deQueue(); - System.out.println(queue); - queue.deQueue(); - System.out.println(queue); - - } - -} \ No newline at end of file diff --git a/group03/763878069/src/cmj/datastructure/list/Stack.java b/group03/763878069/src/cmj/datastructure/list/Stack.java deleted file mode 100644 index bc16af0203..0000000000 --- a/group03/763878069/src/cmj/datastructure/list/Stack.java +++ /dev/null @@ -1,58 +0,0 @@ -package cmj.datastructure.list; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - private int size; - - public void push(Object o) { - elementData.add(o); - size++; - } - - public Object pop() { - Object pop = elementData.get(elementData.size()); - elementData.remove(size - 1); - size--; - return pop; - } - - public Object peek() { - if (size == 0) { - throw new RuntimeException("栈为空"); - } - return elementData.get(size - 1); - } - - public boolean isEmpty() { - return size <= 0 ? true : false; - } - - public int size() { - return size; - } - - @Override - public String toString() { - return "Stack [elementData=" + elementData + ", size=" + size + "]"; - } - - public static void main(String[] args) { - Stack stack = new Stack(); - stack.push("a"); - stack.push("b"); - stack.push("c"); - stack.push("d"); - stack.push("e"); - System.out.println(stack); - - stack.pop(); - System.out.println(stack); - stack.pop(); - System.out.println(stack); - stack.pop(); - System.out.println(stack); - - } - -} \ No newline at end of file diff --git a/group03/763878069/src/cmj/datastructure/tree/BSTree.java b/group03/763878069/src/cmj/datastructure/tree/BSTree.java deleted file mode 100644 index 25a822a1a1..0000000000 --- a/group03/763878069/src/cmj/datastructure/tree/BSTree.java +++ /dev/null @@ -1,191 +0,0 @@ -package cmj.datastructure.tree; - -/** - * 二叉搜索树 - * - * @author think - * - */ -public class BSTree { - private Node root;// 根结点 - - public BSTree() { - root = null; - } - - public void insert(Node node, int data) { - if (null == root) { - root = new Node(data); - } else { - if (data < node.data) { - if (null == node.left) { - - node.left = new Node(data); - } else { - insert(node.left, data); - } - } else { - if (node.right == null) { - node.right = new Node(data); - } else { - insert(node.right, data); - } - } - } - } - - /** - * 前序遍历 - * - * @param node - */ - public void preOrder(Node node) { - if (node != null) { - System.out.println(node.data); - preOrder(node.left); - preOrder(node.right); - } - } - - /** - * 中序遍历 - * - * @param node - */ - public void inOrder(Node node) { - if (node != null) { - inOrder(node.left); - System.out.println(node.data); - inOrder(node.right); - } - } - - /** - * 后序遍历 - * - * @param node - */ - public void postOrder(Node node) { - if (node != null) { - postOrder(node.left); - postOrder(node.right); - System.out.println(node.data); - } - } - - // 删除节点分三种方式删除节点 - // 1、删除没有子节点的节点,直接让该节点的父节点的左节点或右节点指向空 - // 2、删除有一个子节点的节点,直接让该节点的父节点指向被删除节点的剩余节点 - // 3、删除有三个节点的子节点,找到要删除节点的后继节点, 用该节点替代删除的节点 - public boolean delete(int data) { - // 首先查找节点,并记录该节点的父节点引用 - Node current = root; - Node parent = root; - boolean isLeftNode = true; - while (current.data != data) { - parent = current; - if (data < current.data) { - isLeftNode = true; - current = current.left; - } else { - isLeftNode = false; - current = current.right; - } - } - if (current == null) { - System.out.println("没有找到要删除的节点!"); - return false; - } - // 下面分三种情况删除节点 - if (current.left == null && current.right == null) { // 要删除的节点没有子节点 - if (current == root) { // 根节点就删除整棵树 - root = null; - } else if (isLeftNode) { // 如果是左节点,做节点指向空 - parent.left = null; - } else { // 如果是右节点,右节点指向空 - parent.right = null; - } - } else if (current.left == null) { // 要删除的节点只有右节点 - if (current == root) { - root = current.right; - } else if (isLeftNode) { - parent.left = current.right; - } else { - parent.right = current.right; - } - } else if (current.right == null) { // 要删除的节点只有左节点 - if (current == root) { - root = current.left; - } else if (isLeftNode) { - parent.left = current.left; - } else { - parent.right = current.left; - } - } else { // 要删除的节点有两个节点 - Node successor = findSuccessor(current); - if (current == root) { - root = successor; - } else if (isLeftNode) { - parent.left = successor; - } else { - parent.right = successor; - } - successor.left = current.left; - } - return true; - } - - /** - * 找结点(x)的后继结点。即,查找"二叉树中数据值大于该结点"的"最小结点"。 - * - * @param delNode——要删除的结点 - * @return - */ - private Node findSuccessor(Node delNode) { - Node parent = delNode; - Node successor = delNode; - Node current = delNode.right; - /* 找到要删除结点的右子树的最左叶子结点,就是比要删除的数据大的最小结点 */ - while (current != null) { - parent = successor; - successor = current; - current = current.left; - } - - if (successor != delNode.right) { - parent.left = successor.right; - successor.right = delNode.right; - } - return successor; - } - - /** - * 内部结点类 - * - * @author think - * - */ - private class Node { - private Node left; - private Node right; - private int data; - - public Node(int data) { - this.left = null; - this.right = null; - this.data = data; - } - } - - public static void main(String[] args) { - int[] a = { 2, 4, 12, 45, 21, 6, 111, 1, 23, 45 }; - BSTree bTree = new BSTree(); - for (int i = 0; i < a.length; i++) { - bTree.insert(bTree.root, a[i]); - } - bTree.preOrder(bTree.root); - bTree.inOrder(bTree.root); - bTree.postOrder(bTree.root); - } - -} diff --git a/group03/763878069/src/cmj/datastructure/tree/BinaryTree.java b/group03/763878069/src/cmj/datastructure/tree/BinaryTree.java deleted file mode 100644 index 421d342f36..0000000000 --- a/group03/763878069/src/cmj/datastructure/tree/BinaryTree.java +++ /dev/null @@ -1,185 +0,0 @@ -package cmj.datastructure.tree; - -public class BinaryTree { - private Node root;// 根结点 - - public BinaryTree() { - root = null; - } - - public void insert(Node node, int data) { - if (null == root) { - root = new Node(data); - } else { - if (data < node.data) { - if (null == node.left) { - - node.left = new Node(data); - } else { - insert(node.left, data); - } - } else { - if (node.right == null) { - node.right = new Node(data); - } else { - insert(node.right, data); - } - } - } - } - - /** - * 前序遍历 - * - * @param node - */ - public void preOrder(Node node) { - if (node != null) { - System.out.println(node.data); - preOrder(node.left); - preOrder(node.right); - } - } - - /** - * 中序遍历 - * - * @param node - */ - public void inOrder(Node node) { - if (node != null) { - inOrder(node.left); - System.out.println(node.data); - inOrder(node.right); - } - } - - /** - * 后序遍历 - * - * @param node - */ - public void postOrder(Node node) { - if (node != null) { - postOrder(node.left); - postOrder(node.right); - System.out.println(node.data); - } - } - - // 删除节点分三种方式删除节点 - // 1、删除没有子节点的节点,直接让该节点的父节点的左节点或右节点指向空 - // 2、删除有一个子节点的节点,直接让该节点的父节点指向被删除节点的剩余节点 - // 3、删除有三个节点的子节点,找到要删除节点的后继节点, 用该节点替代删除的节点 - public boolean delete(int data) { - // 首先查找节点,并记录该节点的父节点引用 - Node current = root; - Node parent = root; - boolean isLeftNode = true; - while (current.data != data) { - parent = current; - if (data < current.data) { - isLeftNode = true; - current = current.left; - } else { - isLeftNode = false; - current = current.right; - } - } - if (current == null) { - System.out.println("没有找到要删除的节点!"); - return false; - } - // 下面分三种情况删除节点 - if (current.left == null && current.right == null) { // 要删除的节点没有子节点 - if (current == root) { // 根节点就删除整棵树 - root = null; - } else if (isLeftNode) { // 如果是左节点,做节点指向空 - parent.left = null; - } else { // 如果是右节点,右节点指向空 - parent.right = null; - } - } else if (current.left == null) { // 要删除的节点只有右节点 - if (current == root) { - root = current.right; - } else if (isLeftNode) { - parent.left = current.right; - } else { - parent.right = current.right; - } - } else if (current.right == null) { // 要删除的节点只有左节点 - if (current == root) { - root = current.left; - } else if (isLeftNode) { - parent.left = current.left; - } else { - parent.right = current.left; - } - } else { // 要删除的节点有两个节点 - Node successor = findSuccessor(current); - if (current == root) { - root = successor; - } else if (isLeftNode) { - parent.left = successor; - } else { - parent.right = successor; - } - successor.left = current.left; - } - return true; - } - - /** - * 找结点(x)的后继结点。即,查找"二叉树中数据值大于该结点"的"最小结点"。 - * - * @param delNode——要删除的结点 - * @return - */ - private Node findSuccessor(Node delNode) { - Node parent = delNode; - Node successor = delNode; - Node current = delNode.right; - /* 找到要删除结点的右子树的最左叶子结点,就是比要删除的数据大的最小结点 */ - while (current != null) { - parent = successor; - successor = current; - current = current.left; - } - - if (successor != delNode.right) { - parent.left = successor.right; - successor.right = delNode.right; - } - return successor; - } - - /** - * 内部结点类 - * - * @author think - * - */ - private class Node { - private Node left; - private Node right; - private int data; - - public Node(int data) { - this.left = null; - this.right = null; - this.data = data; - } - } - - public static void main(String[] args) { - int[] a = { 2, 4, 12, 45, 21, 6, 111 }; - BinaryTree bTree = new BinaryTree(); - for (int i = 0; i < a.length; i++) { - bTree.insert(bTree.root, a[i]); - } - bTree.preOrder(bTree.root); - bTree.inOrder(bTree.root); - bTree.postOrder(bTree.root); - } - -} diff --git a/group03/894844916/coding2017-01/.classpath b/group03/894844916/coding2017-01/.classpath deleted file mode 100644 index 63b7e892d1..0000000000 --- a/group03/894844916/coding2017-01/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group03/894844916/coding2017-01/.project b/group03/894844916/coding2017-01/.project deleted file mode 100644 index 34cd5ea671..0000000000 --- a/group03/894844916/coding2017-01/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - coding2017-01 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group03/894844916/coding2017-01/.settings/org.eclipse.jdt.core.prefs b/group03/894844916/coding2017-01/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a87..0000000000 --- a/group03/894844916/coding2017-01/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group03/894844916/coding2017-01/src/com/coding/basic/ArrayList.java b/group03/894844916/coding2017-01/src/com/coding/basic/ArrayList.java deleted file mode 100644 index f245739d4c..0000000000 --- a/group03/894844916/coding2017-01/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,149 +0,0 @@ -/** - * - */ -package com.coding.basic; - -/** - * @author patchouli - * - */ -public class ArrayList implements List { - - /** - * 数组列表初始默认容量100. - */ - private static final int DEFAULT_CAPACITY=100; - - /** - * 数组列表中元素的数量。 - */ - private int size = 0; - - /** - * 数组列表当前容量 - */ - private int capacity; - - /** - * 存放元素的数组。 - */ - private Object[] elementData; - - /** - * 默认构造函数,构造一个初始容量为100的数组列表 - */ - public ArrayList() { - capacity=DEFAULT_CAPACITY; - elementData=new Object[DEFAULT_CAPACITY]; - } - - /* - * (non-Javadoc) - * - * @see nusub.coding2017.basic.List#add(java.lang.Object) - */ - @Override - public void add(Object o) { - expand(); - elementData[size]=o; - size=size++; - } - - /* - * (non-Javadoc) - * - * @see nusub.coding2017.basic.List#add(int, java.lang.Object) - */ - @Override - public void add(int index, Object o) throws ListIndexException { - if (index==size) { - add(o); - return; - } - if (0<=index&&indexindex; i--) { - elementData[i]=elementData[i-1]; - } - elementData[index]=o; - return; - } - throw new ListIndexException("index不在[0,size]之间"); - } - - /** - * index在[0,size)之间返回通过数组下标访问的方式获取位置index处的元素,index超出这个范围抛出ListIndexException。 - * @param index 元素的位置 - * @return 获取的对象 - * @throws ListIndexException - */ - @Override - public Object get(int index) throws ListIndexException { - if (0<=index&&index - * - */ -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(){} - - public BinaryTreeNode(Object data){ - this.data=data; - left=null; - right=null; - } - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o) { - if (o.toString().compareTo(data.toString())<0) { - if (left==null) { - left=new BinaryTreeNode(o); - return left; - } - insert(o); - } - else { - if (right==null) { - right=new BinaryTreeNode(o); - return right; - } - insert(o); - } - return null; - } - -} diff --git a/group03/894844916/coding2017-01/src/com/coding/basic/Iterator.java b/group03/894844916/coding2017-01/src/com/coding/basic/Iterator.java deleted file mode 100644 index 75a1ffaf3e..0000000000 --- a/group03/894844916/coding2017-01/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * - */ -package com.coding.basic; - -/** - * @author patchouli - * - */ -public interface Iterator { - /** - * 集合中存在下一个元素返回true,不存在下一个元素返回false。 - * @return - */ - public boolean hasNext(); - - /** - * 返回集合中下一个元素 - * @return - */ - public Object next(); -} diff --git a/group03/894844916/coding2017-01/src/com/coding/basic/LinkedList.java b/group03/894844916/coding2017-01/src/com/coding/basic/LinkedList.java deleted file mode 100644 index e811536093..0000000000 --- a/group03/894844916/coding2017-01/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,168 +0,0 @@ -/** - * - */ -package com.coding.basic; - -/** - * @author patchouli - * - */ -public class LinkedList implements List, Iterator { - - private Node head; - private Node current=head; - private int size=0; - - /* (non-Javadoc) - * @see nusub.coding2017.basic.Iterator#hasNext() - */ - @Override - public boolean hasNext() { - if (current.next==null) { - return false; - } - return true; - } - - /* (non-Javadoc) - * @see nusub.coding2017.basic.Iterator#next() - */ - @Override - public Object next() { - current=current.next; - return current; - } - - /** - * 从头结点遍历,找到最后一个节点,最后一个节点引用下一个元素。最后把current指向头结点。 - * @param o 要添加的对象 - */ - @Override - public void add(Object o) { - Node node=new LinkedList.Node(); - node.data=o; - if (head==null) { - head=node; - current=head; - size++; - return; - } - while (hasNext()) { - next(); - } - current.next=node; - current=head; - size++; - } - - /** - * 在指定的位置插入一个元素,并把当前节点指向head。 - * @throws ListIndexException - */ - @Override - public void add(int index, Object o) throws ListIndexException { - if (index<0||index>size) { - throw new ListIndexException("index必须在[0,size]之间"); - } - Node node=new LinkedList.Node(); - node.data=o; - if (index==0) { - node.next=current; - head=node; - current=node; - } - else{ - int i=0; - while (i=size) { - throw new ListIndexException("index必须在[0,size)之间"); - } - if (index==0) { - return current; - } - int i=0; - while (i=size) { - throw new ListIndexException("index必须在[0,size)之间"); - } - if (size==0) { - return null; - } - Node node=null; - if (index==0) { - node=current; - current=current.next; - } - else if (index - - - - - - diff --git a/group04/1020483199/1020483199Learning/.gitignore b/group04/1020483199/1020483199Learning/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group04/1020483199/1020483199Learning/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group04/1020483199/1020483199Learning/.project b/group04/1020483199/1020483199Learning/.project deleted file mode 100644 index 1ee8060dd3..0000000000 --- a/group04/1020483199/1020483199Learning/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 1020483199Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group04/1020483199/1020483199Learning/.settings/org.eclipse.core.resources.prefs b/group04/1020483199/1020483199Learning/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index f7e195b54e..0000000000 --- a/group04/1020483199/1020483199Learning/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,3 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/com/coding/basic=UTF-8 -encoding/=UTF-8 diff --git a/group04/1020483199/1020483199Learning/.settings/org.eclipse.jdt.core.prefs b/group04/1020483199/1020483199Learning/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group04/1020483199/1020483199Learning/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/ArrayList.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/ArrayList.java deleted file mode 100644 index a61325db63..0000000000 --- a/group04/1020483199/1020483199Learning/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; -import java.util.ConcurrentModificationException; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - - private int size = 0; - - private transient Object[] elementData = new Object[100]; - /** - * 向数组中添加某个元素 - */ - public void add(Object o){ - /** - * 数组扩容判断 - */ - ensureSize(size+1); - elementData[size++] = o; - } - /** - * 向指定位置数组中添加某个元素 - */ - public void add(int index, Object o){ - if(index<0||index>size){ - throw new IndexOutOfBoundsException("数组越界"); - } - ensureSize(size+1); - System.arraycopy(elementData, index, elementData, index+1, size-index); - elementData[index] = o; - } - /** - * 获取数组中某个位置元素 - */ - public Object get(int index){ - if(index<0||index>elementData.length){ - return null; - }else{ - return elementData[index]; - } - - } - /** - * 移除数组中指定位置元素 - */ - public Object remove(int index){ - if(index<0||index>elementData.length){ - return null; - }else{ - int newLength = size-index-1; - if (newLength>0) - System.arraycopy(elementData, index+1, elementData, index, size-index-1); - elementData[--size] = null; - return elementData; - } - } - /** - * 获取当前数组的大小 - */ - public int size(){ - if(size>0){ - return this.size; - }else{ - return 0; - } - } - /** - * 利用arraylist实现迭代器 - * @return - */ - public Iterator iterator(){ - - return new ArrayListIterator(); - } - private class ArrayListIterator implements Iterator{ - int cursor; - int lastReset = -1; - @Override - public boolean hasNext() { - return size!=cursor; - } - - @Override - public Object next() { - //标记索引当前位置 - int i = cursor; - if(i>size){ - throw new NoSuchElementException(); - } - Object[] newData = elementData; - if(i>newData.length){ - throw new ConcurrentModificationException(); - } - cursor = i + 1; - return newData[lastReset = i]; - } - - } - - - /** - * @author sulei - * @param minCapcity - */ - public void ensureSize(int minCapcity){ - if(minCapcity>elementData.length){ - grow(minCapcity); - } - } - - /** - * @author sulei - * @param autoCapcity - */ - public void grow(int autoCapcity){ - int oldLength = elementData.length; - if(autoCapcity>oldLength){ - Object[] oldData = elementData; - int newLength = (oldLength * 3)/2 + 1; - if(autoCapcity>newLength){ - newLength=autoCapcity; - } - elementData = Arrays.copyOf(elementData, newLength); - } - } -} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/BinaryTreeNode.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 48026be26c..0000000000 --- a/group04/1020483199/1020483199Learning/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - //存放当前树 - private BinaryTreeNode primary; - - public BinaryTreeNode getPrimary() { - return primary; - } - - public void setPrimary(BinaryTreeNode primary) { - this.primary = primary; - } - - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - /** - * 在二叉树中插入 - * @param o - * @return - */ - public BinaryTreeNode insert(Object o){ - if(o==null){ - throw new IllegalArgumentException("二叉树的元素不能为空!"); - } - //新建要插入的节点 - BinaryTreeNode bt = new BinaryTreeNode(); - bt.setData(o); - int value = (int)o; - //当原始二叉树为空时 - if(primary==null){ - primary = bt; - }else{ - BinaryTreeNode bi = primary; - while(true){ - if(value<(int)bi.data){ - if(bi.left==null){ - bi.setLeft(bt); - break; - }else{ - bi=bi.left; - } - }else if(value>(int)bi.data){ - if(bi.right==null){ - bi.setRight(bt); - break; - }else{ - bi=bi.right; - } - - }else{ - System.out.println("当前元素在二叉树已存在"); - break; - } - } - } - - return bt; - } - -} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/Iterator.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group04/1020483199/1020483199Learning/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/LinkedList.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/LinkedList.java deleted file mode 100644 index a85c311f72..0000000000 --- a/group04/1020483199/1020483199Learning/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.coding.basic; - -import java.util.ConcurrentModificationException; -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - /** - * 当前节点的大小 - */ - private int size; - /** - * 头节点 - */ - private Node header; - /** - * 尾节点 - */ - private Node end; - - - - public void add(Object o){ - if(header==null){ - header = new Node(); - header.data = o; - end = header; - }else{ - Node n = new Node(); - n.data = o; - end.next = n; - n.previous=end; - end = n; - } - size++; - } - public void add(int index,Object o){ - judge(index); - Node n = new Node(); - n.data = o; - Node temp = header; - for(int i = 0;isize){ - throw new NoSuchElementException(); - } - Node n = header; - for(int j = 0;j < i;j ++){ - n = n.next; - } - cursor = i + 1; - lastReset = i; - return n.data; - } - - } - - - /** - * 判断数组是否越界方法 - */ - public void judge(int index){ - if(index<0||index>=size){ - throw new IndexOutOfBoundsException("数组越界"); - } - } - /** - * @author sulei - */ - private static class Node{ - Object data;//当前节点数据 - Node next;//下一个节点 - Node previous;//上一个节点 - } -} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/List.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group04/1020483199/1020483199Learning/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/Queue.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/Queue.java deleted file mode 100644 index b9a26bb40e..0000000000 --- a/group04/1020483199/1020483199Learning/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class Queue { - /** - * 队列长度 - */ - private int size; - - private LinkedList elementData = new LinkedList(); - /** - * 入队操作[向栈尾插入] - * @param o - */ - public void enQueue(Object o){ - elementData.add(o); - size++; - } - - public Object deQueue(){ - Object obj = elementData.removeFirst(); - size--; - return obj; - } - - public boolean isEmpty(){ - if(size==0){ - return true; - }else{ - return false; - } - - } - - public int size(){ - return size; - } - -} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/Stack.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/Stack.java deleted file mode 100644 index 535922bb35..0000000000 --- a/group04/1020483199/1020483199Learning/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.coding.basic; - -public class Stack { - /** - * 当前栈的大小 - */ - private int size; - - private ArrayList elementData = new ArrayList(); - /** - * 压栈 - * @param o - */ - public void push(Object o){ - elementData.add(o); - size++; - } - /** - * 出栈 - * @return - */ - public Object pop(){ - return elementData.remove(--size); - } - /** - * 返回栈顶元素 - * @return - */ - public Object peek(){ - return elementData.get(size-1); - } - public boolean isEmpty(){ - return size==0; - } - public int size(){ - return size; - } -} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/test/JavaTest.java b/group04/1020483199/1020483199Learning/src/com/coding/test/JavaTest.java deleted file mode 100644 index 045e3d7a48..0000000000 --- a/group04/1020483199/1020483199Learning/src/com/coding/test/JavaTest.java +++ /dev/null @@ -1,223 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import java.math.BigDecimal; - -import org.junit.Test; - -import com.coding.basic.ArrayList; -import com.coding.basic.BinaryTreeNode; -import com.coding.basic.Iterator; -import com.coding.basic.LinkedList; -import com.coding.basic.List; -import com.coding.basic.Queue; -import com.coding.basic.Stack; - - - -public class JavaTest { - /** - * List集合单元测试内容 - */ - @Test - public void test() { - List list = new ArrayList(); - list.add(0, "aa"); - } - - @Test - public void test1() { - List list = new ArrayList(); - list.add("aa"); - System.out.println(list.get(0)); - } - - @Test - public void test2() { - List list = new ArrayList(); - list.add("aa"); - System.out.println(list.get(0)); - list.remove(0); - System.out.println(list.get(0)); - } - - @Test - public void test3() { - List list = new ArrayList(); - list.add("aa"); - System.out.println(list.size()); - list.add("aa"); - System.out.println(list.size()); - } - - @Test - public void test4() { - ArrayList list = new ArrayList(); - Integer [] str={11,22}; - list.add(str); - Iterator it = list.iterator(); - while(it.hasNext()){ - System.out.println(it.next()); - - } - LinkedList ll = new LinkedList(); - } - - /** - * LinkedList测试 - */ - @Test - public void test5() { - List list = new LinkedList(); - list.add("aa"); - list.add("bb"); - list.add("cc"); - System.out.println(list.get(1)); - } - - @Test - public void test6() { - List list = new LinkedList(); - list.add("aa"); - list.add("bb"); - list.add("cc"); - list.add(2, "ff"); - System.out.println(list.get(3)); - } - - @Test - public void test7() { - List list = new LinkedList(); - list.add("aa"); - list.add("bb"); - list.add("cc"); - list.remove(2); - System.out.println(list.get(0)+"----"+list.get(1)); - } - - @Test - public void test8() { - LinkedList list = new LinkedList(); - list.add("aa"); - list.add("bb"); - list.add("cc"); - System.out.println(list.get(0)); - list.addFirst("haha"); - System.out.println(list.get(0)); - } - - @Test - public void test9() { - LinkedList list = new LinkedList(); - list.add("aa"); - list.add("bb"); - list.add("cc"); - list.addLast("haha"); - System.out.println(list.get(3)); - } - - @Test - public void test10() { - LinkedList list = new LinkedList(); - list.add("aa"); - list.add("bb"); - list.add("cc"); - list.removeFirst(); - System.out.println(list.get(0)); - } - - @Test - public void test11() { - LinkedList list = new LinkedList(); - list.add("aa"); - list.add("bb"); - list.add("cc"); - list.removeLast(); - System.out.println(list.get(2)); - } - - @Test - public void test12() { - LinkedList list = new LinkedList(); - list.add("aa"); - list.add("bb"); - list.add("cc"); - Iterator it = list.iterator(); - while(it!=null&&it.hasNext()){ - System.out.println(it.next()); - } - } - - /** - * Queue集合测试 - */ - @Test - public void test13() { - Queue q = new Queue(); - System.out.println(q.size()+"------"+q.isEmpty()); - q.enQueue("aaa"); - q.enQueue("bbb"); - q.enQueue("ccc"); - System.out.println(q.size()+"------"+q.isEmpty()); - q.deQueue(); - System.out.println(q.size()+"------"+q.isEmpty()); - } - - /** - * Stack集合测试 - */ - @Test - public void test14() { - Stack q = new Stack(); - System.out.println(q.isEmpty()); - System.out.println(q.size()); - q.push("aa"); - q.push("bb"); - q.push("cc"); - q.push("dd"); - System.out.println(q.size()); - q.pop(); - System.out.println(q.size()); - System.out.println(q.peek()); - q.pop(); - System.out.println(q.size()); - System.out.println(q.peek()); - System.out.println(q.isEmpty()); - } - - /** - * BinaryTree测试 - */ - @Test - public void test15(){ - BinaryTreeNode bt = new BinaryTreeNode(); - Integer[] data={3,2,5,4,6,8}; - for(Integer i=0;i=1;i--){ - if(y%i==0&&x%i==0){ - maxValue = i; - break; - } - } - System.out.println(x/maxValue+"比"+y/maxValue); - - } - - - -} diff --git a/group04/1020483199/RemoteSystemsTempFiles/.project b/group04/1020483199/RemoteSystemsTempFiles/.project deleted file mode 100644 index 5447a64fa9..0000000000 --- a/group04/1020483199/RemoteSystemsTempFiles/.project +++ /dev/null @@ -1,12 +0,0 @@ - - - RemoteSystemsTempFiles - - - - - - - org.eclipse.rse.ui.remoteSystemsTempNature - - diff --git a/group04/120549547/base/buil.bat b/group04/120549547/base/buil.bat deleted file mode 100644 index 7164a42ac0..0000000000 --- a/group04/120549547/base/buil.bat +++ /dev/null @@ -1,5 +0,0 @@ -javac -sourcepath src -d classes -encoding utf-8 src\com\coding\basic\*.java - -java -cp classes com.coding.basic.Main - -pause \ No newline at end of file diff --git a/group04/120549547/base/src/com/coding/basic/ArrayList.java b/group04/120549547/base/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 56e7aa4c26..0000000000 --- a/group04/120549547/base/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.coding.basic; -import java.util.Arrays; - -public class ArrayList implements List { - /*默认数组容量*/ - public static final int DEFAULT_CAPCATITY = 10; - - /*数组元素个数*/ - private int size; - - private Object[] elementData; - - public ArrayList(){ - this(DEFAULT_CAPCATITY); - } - - public ArrayList(int capacity){ - if (capacity<0 || capacity>Integer.MAX_VALUE) - throw new IllegalArgumentException("非法容量: " + capacity); - elementData = new Object[capacity]; - } - - - public void add(Object o){ - /*判断是否需要扩容*/ - ensureCapacity(size + 1); - elementData[size++] = o; - } - - public void add(int index, Object o){ - checkIndex(index); - /*判断是否需要扩容*/ - ensureCapacity(size + 1); - /*将index->size的元素依次向右移一个位置*/ - System.arraycopy(elementData, index, elementData, index+1, size-index); - /*插入o的值*/ - elementData[index] = o; - size++; - } - - - public Object get(int index){ - - checkIndex(index); - return elementData[index]; - } - - public Object remove(int index){ - - checkIndex(index); - Object value = elementData[index]; - /*将index+1 -> size的元素依次向左移一个位置*/ - System.arraycopy(elementData,index+1, elementData, index, size-index-1); - elementData[--size]=null; //释放最后一个元素,同时size减一; - return value; - } - - public int size(){ - return this.size; - } - - public Iterator iterator(){ - return null; - } - /* 确认容量是否足够,也可以直接调用手动扩容*/ - public void ensureCapacity(int minCapacity){ - int oldCapacity = elementData.length; - /*容量不足需要扩容*/ - if(oldCapacity < minCapacity){ - int newCapacity = oldCapacity * 2; //扩大2倍 - if (newCapacity < minCapacity){ - newCapacity = minCapacity; //扩容后仍不足,取最大值 - } - System.out.println("数据扩容至: " + newCapacity); - elementData = Arrays.copyOf(elementData, newCapacity); - } - - } - - private void checkIndex(int index){ - if (index<0 || index>= size) - throw new IndexOutOfBoundsException ("index非法: " + index); - } - @Override - public String toString(){ - - StringBuffer sb = new StringBuffer(""); - for(int i=0; i "); - } - return sb.toString(); - } -} diff --git a/group04/120549547/base/src/com/coding/basic/BinaryTreeNode.java b/group04/120549547/base/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group04/120549547/base/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group04/120549547/base/src/com/coding/basic/Iterator.java b/group04/120549547/base/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group04/120549547/base/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group04/120549547/base/src/com/coding/basic/LinkedList.java b/group04/120549547/base/src/com/coding/basic/LinkedList.java deleted file mode 100644 index edfbcc1007..0000000000 --- a/group04/120549547/base/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private int size; - /*创建一个带头节点的单链表*/ - public LinkedList(){ - head = new Node(null); - } - - /*添加一个元素(尾插法)*/ - public void add(Object o){ - - Node node = new Node(o); - Node pos = head; - //找到最后一个元素位置 - while(pos.next != null){ - pos = pos.next; - } - pos.next = node; - size++; - - } - - /*在index位置插入*/ - public void add(int index , Object o){ - //判断索引是否合法 - checkIndex(index); - Node node = new Node(o); - Node pos = head; - //找到插入位置 - while(index-- != 0){ - pos = pos.next; - } - node.next = pos.next; - pos.next = node; - size++; - - } - public Object get(int index){ - checkIndex(index); - if(this.isEmpty()){ - throw new IllegalArgumentException ("链表为空"); - } - Node pos = head.next; //pos指向要获取的节点 - while(index-- !=0){ - pos = pos.next; - } - - return pos.data; - } - public Object remove(int index){ - checkIndex(index); - if(this.isEmpty()){ - throw new IllegalArgumentException ("链表为空"); - } - - Node pos = head; //pos指向要删除的前一个结点 - while(index-- != 0){ - pos = pos.next; - } - Node value = pos.next; //要删除的节点 - pos.next = value.next; - size--; - return value.data; - - - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - this.add(o); - } - public Object removeFirst(){ - if(this.isEmpty()){ - throw new IllegalArgumentException ("链表为空"); - } - return remove(0); - } - public Object removeLast(){ - if(this.isEmpty()){ - throw new IllegalArgumentException ("链表为空"); - } - return remove(size-1); - } - - public boolean isEmpty(){ - return size == 0; - } - public Iterator iterator(){ - return null; - } - - private void checkIndex(int index){ - if (index<0 || index>=size ){ - throw new IllegalArgumentException ("index不合法: " + index ); - } - } - - @Override - public String toString(){ - - StringBuffer sb = new StringBuffer(""); - for(int i=0; i "); - } - return sb.toString(); - } - - private static class Node{ - public Object data; - public Node next; - - public Node(Object data){ - this.data = data; - this.next = null; - } - - } -} diff --git a/group04/120549547/base/src/com/coding/basic/List.java b/group04/120549547/base/src/com/coding/basic/List.java deleted file mode 100644 index d47df585d9..0000000000 --- a/group04/120549547/base/src/com/coding/basic/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic; - -public interface List { - - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group04/120549547/base/src/com/coding/basic/Main.java b/group04/120549547/base/src/com/coding/basic/Main.java deleted file mode 100644 index de8a0b0990..0000000000 --- a/group04/120549547/base/src/com/coding/basic/Main.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.coding.basic; -import com.coding.basic.*; - -class Main{ - - public static void main(String[] args){ - System.out.println("数组测试开始"); - ArrayListTest(); - System.out.println("----------------分割线----------------"); - System.out.println("链表测试开始"); - LinkedListTest(); - System.out.println("----------------分割线----------------"); - System.out.println("栈测试开始"); - StatckTest(); - System.out.println("----------------分割线----------------"); - System.out.println("队测试开始"); - QueueTest(); - } - - public static void ArrayListTest(){ - ArrayList list = new ArrayList(2); - list.add("HelloBobi0"); - list.add("HelloBobi1"); - list.add("HelloBobi2"); - list.add("HelloBobi3"); - list.add("HelloBobi4"); - list.add("HelloBobi5"); - System.out.println((String)list.get(0)); - System.out.println((String)list.get(4)); - list.add(3, "Hei Man"); - list.remove(5); - System.out.println(list); - System.out.println("size:=" + list.size()); - } - - public static void LinkedListTest(){ - LinkedList ll = new LinkedList(); - - - ll.add("SingleDog0"); - ll.add("SingleDog1"); - ll.add("SingleDog2"); - ll.add("SingleDog3"); - ll.add("SingleDog4"); - ll.add("SingleDog5"); - - System.out.println((String)(ll.get(1))); - System.out.println(ll); - System.out.println("size:=" + ll.size()); - ll.remove(0); - ll.removeFirst(); - ll.removeLast(); - System.out.println(ll); - } - - public static void StatckTest(){ - Stack stack = new Stack(); - stack.push("虾师傅0"); - stack.push("虾师傅1"); - stack.push("虾师傅2"); - stack.push("虾师傅3"); - stack.push("虾师傅4"); - - stack.pop(); - System.out.println(stack.peek()); - System.out.println(stack); - - } - public static void QueueTest(){ - Queue queue = new Queue(); - queue.enQueue("龙师傅0"); - queue.enQueue("龙师傅1"); - queue.enQueue("龙师傅2"); - queue.enQueue("龙师傅3"); - queue.enQueue("龙师傅4"); - - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - System.out.println(queue.size()); - - - } -} \ No newline at end of file diff --git a/group04/120549547/base/src/com/coding/basic/Queue.java b/group04/120549547/base/src/com/coding/basic/Queue.java deleted file mode 100644 index 8f86f7492c..0000000000 --- a/group04/120549547/base/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coding.basic; -import com.coding.basic.*; -public class Queue { - private LinkedList list; - - public Queue(){ - list = new LinkedList(); - } - /*入队*/ - public void enQueue(Object o){ - list.addLast(o); - } - - /*出队*/ - public Object deQueue(){ - if (isEmpty()){ - System.out.println("队空"); - } - return list.removeFirst(); - } - - public boolean isEmpty(){ - return list.isEmpty(); - } - - public int size(){ - return list.size(); - } -} diff --git a/group04/120549547/base/src/com/coding/basic/Stack.java b/group04/120549547/base/src/com/coding/basic/Stack.java deleted file mode 100644 index f7d3bba3db..0000000000 --- a/group04/120549547/base/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coding.basic; -import com.coding.basic.LinkedList; - -public class Stack { - private LinkedList list; - - public Stack(){ - list = new LinkedList(); - } - - public void push(Object o){ - list.addLast(o); - } - - public Object pop(){ - if(isEmpty()){ - System.out.println("栈空"); - } - return list.removeLast(); - - } - - public Object peek(){ - return list.get(list.size()-1); - } - public boolean isEmpty(){ - return list.isEmpty(); - } - public int size(){ - return list.size(); - } - - @Override - public String toString(){ - return list.toString(); - } -} diff --git a/group04/120549547/my.txt b/group04/120549547/my.txt deleted file mode 100644 index 3da1ec26e9..0000000000 --- a/group04/120549547/my.txt +++ /dev/null @@ -1 +0,0 @@ -HelloWorld diff --git a/group04/120549547/shell.sh b/group04/120549547/shell.sh deleted file mode 100644 index ab61214ddd..0000000000 --- a/group04/120549547/shell.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -git remote -v -read anykey -echo "抓取上游代码" -git fetch upstream -echo "代码合并" -git merge upstream/master -read anykey -echo "添加代码" -git add -A . -read anykey -git commit -m "bobi" - -echo "推送到githup" -read anykey -git push origin master -read anykey diff --git a/group04/1299310140/src/com/coding/basic/ArrayList.java b/group04/1299310140/src/com/coding/basic/ArrayList.java deleted file mode 100644 index afc073293a..0000000000 --- a/group04/1299310140/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - private Object[] elementData = new Object[10]; - - public void add(Object o){ - if(size < this.elementData.length){//加至末尾,size+1 - this.elementData[size] = o; - size++; - }else{//扩张数组,然后加至末尾,size+1 - this.elementData = grow(this.elementData,10); - this.elementData[size] = o; - size++; - } - } - - public void add(int index, Object o){//-1 this.size){//index小于0or大于size,参数错误 - return; - } - if(size >= this.elementData.length){//当前数组容量已满,需扩张 - this.elementData = grow(this.elementData, 10); - } - - //此时只需考虑将o加至index处(0= index;i--){ - this.elementData[i] = this.elementData[i-1]; - } - this.elementData[index] = o; - this.size++; - }else{//直接插入o,size+1 - this.elementData[index] = o; - this.size++; - } - - } - - public Object get(int index){//-1= this.size){//index小于0or大于等于size,参数错误 - return null; - } - return this.elementData[index]; - } - - public Object remove(int index){//-1= this.size){//index小于0or大于等于size,参数错误 - return null; - } - - Object o = this.elementData[index];//o保存被移除的值 - //此时只需考虑将index处的o移除 - for(int i = index;i < this.size-1;i++){ - this.elementData[i] = this.elementData[i+1]; - } - this.size--; - return o; - } - - public int size(){ - return this.size; - } - - public Iterator iterator(){ - return new ArrayListIterator(this); - } - - public static class ArrayListIterator implements Iterator{ - private ArrayList list; - private int pres; - - public ArrayListIterator(ArrayList list) { - super(); - this.list = list; - this.pres = 0; - } - - @Override - public boolean hasNext() { - if(this.pres < this.list.size()){ - return true; - }else{ - return false; - } - } - - @Override - public Object next() { - Object o = this.list.get(this.pres); - this.pres++; - return o; - } - - } - - /* - * 说明:扩张数组 - * 参数:被扩张的原数组,扩张的增加数(扩张后数组的大小为原数组的长度+增加数) - * 返回值:扩张后的数组 - */ - private static Object[] grow(Object[] src,int size){ -// return Arrays.copyOf(src, src.length + size); - Object[] target = new Object[src.length + size]; - System.arraycopy(src, 0, target, 0, src.length); - return target; - } - - public String toString(){ - String result = "["; - if(this.size == 0){ - result = result + "]"; - return result; - }else{ - for(int i = 0;i < size;i++){ - result = result + this.elementData[i] + ","; - } - result = result.substring(0,result.length()-1); - result = result + "]"; - return result; - } - } - -} diff --git a/group04/1299310140/src/com/coding/basic/BinaryTreeNode.java b/group04/1299310140/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index dd539df626..0000000000 --- a/group04/1299310140/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - if(this.data == null){//根节点为空 - this.data = o; - }else{//根节点非空 - BinaryTreeNode pres = this; - BinaryTreeNode insertNode = new BinaryTreeNode(); - insertNode.setData(o); - while(pres != null){ - if((int)o < (int)pres.data){//插入值<当前值,pres向左移动,或者将插入节点挂在当前节点左边 - if(pres.left == null){ - pres.left = insertNode; - break; - } - pres = pres.left; - }else{//插入值>=当前值,pres向右移动,或者将插入节点挂在当前节点右边 - if(pres.right == null){ - pres.right = insertNode; - break; - } - pres = pres.right; - } - } - } - return null; - } - - public void print(){ - if(this.data == null){ - return; - }else{ - if(this.left !=null){ - this.left.print(); - } - System.out.print(this.data); - System.out.print(" "); - if(this.right != null){ - this.right.print(); - } - } - } -} diff --git a/group04/1299310140/src/com/coding/basic/LinkedList.java b/group04/1299310140/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 4636bbd279..0000000000 --- a/group04/1299310140/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,211 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private int size = 0; - - public void add(Object o){ - if(this.size == 0){//size为0,给head赋值 - this.head = new Node(o); - size++; - }else{//将o加至链表末尾 - Node Last = new Node(o); - Node pres = this.head; - while(pres.next != null){ - pres = pres.next; - } - pres.next = Last; - size++; - } - } - - public void add(int index , Object o){//index:0~size - if(index < 0 || index > this.size){//index小于0or大于size,参数错误 - return; - } - if(index == 0){//将o加至链表头部 - //size为0时,index必为0,执行该分支 - Node first = new Node(o); - first.next = this.head; - this.head = first; - size++; - }else if(index == size){//将o加至链表末尾 - //index == size != 0时,执行该分支 - Node Last = new Node(o); - Node pres = this.head; - while(pres.next != null){ - pres = pres.next; - } - pres.next = Last; - size++; - }else{ - //0= this.size){//index小于0or大于等于size,参数错误 - return null; - } - - Node pres = this.head;//pres指向0 - for(int i = 0;i < index;i++){ - pres = pres.next; - } - //此时pres指向index - return pres.data; - } - - public Object remove(int index){//index:0~size-1 - if(index < 0 || index >= this.size){//index小于0or大于等于size,参数错误 - return null; - } - - Object o = null; - if(index == 0){//删除头节点 - o = this.head.data; - this.head = this.head.next; - size--; - }else{//删除头节点以外的其他节点 - Node pres = this.head;//pres指向0 - for(int i = 0;i < index-1;i++){ - pres = pres.next; - } - - //此时pres指向index-1 - o = pres.next.data; - pres.next = pres.next.next; - size--; - } - return o; - } - - public int size(){ - return this.size; - } - - public void addFirst(Object o){//同add(int 0 , Object o) - Node first = new Node(o); - first.next = this.head; - this.head = first; - size++; - } - - public void addLast(Object o){//同add(int size , Object o) - if(this.size == 0){ - this.head = new Node(o); - size++; - }else{//size>=1 - Node Last = new Node(o); - Node pres = this.head; - while(pres.next != null){ - pres = pres.next; - } - pres.next = Last; - size++; - } - } - - public Object removeFirst(){//同remove(int 0) - if(this.size == 0){ - return null; - } - - Object o = this.head.data; - this.head = this.head.next; - size--; - return o; - } - - public Object removeLast(){ - if(this.size == 0){ - return null; - } - - Object o = null; - if(this.size == 1){//size==1 - o = this.head.data; - this.head = null; - this.size--; - }else{//size>=2 - Node pres = this.head; - while(pres.next.next != null){ - pres = pres.next; - } - o = pres.next.data; - pres.next = null; - size--; - } - return o; - } - - public Iterator iterator(){ - return new LinkedListIterator(this); - } - - private static class LinkedListIterator implements Iterator{ -// private LinkedList list; - private Node pres; - - public LinkedListIterator(LinkedList list) { - super(); -// this.list = list; - this.pres = list.head; - } - - @Override - public boolean hasNext() { - if(this.pres != null){ - return true; - }else{ - return false; - } - } - - @Override - public Object next() { - Object o = this.pres.data; - pres = pres.next; - return o; - } - - } - - private static class Node{ - Object data; - Node next; - - public Node(Object data) { - super(); - this.data = data; - } - } - - public String toString(){ - String result = "["; - if(this.size == 0){ - result = result + "]"; - return result; - }else{ - Node pres = this.head; - while(pres != null){ - result = result + pres.data + ","; - pres = pres.next; - } - result = result.substring(0,result.length()-1); - result = result + "]"; - return result; - } - } -} diff --git a/group04/1299310140/src/com/coding/basic/Queue.java b/group04/1299310140/src/com/coding/basic/Queue.java deleted file mode 100644 index 181f0cfcb0..0000000000 --- a/group04/1299310140/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - this.elementData.addLast(o); - } - - public Object deQueue(){ - return this.elementData.removeFirst(); - } - - public boolean isEmpty(){ - if(this.elementData.size() == 0){ - return true; - }else{ - return false; - } - } - - public int size(){ - return this.elementData.size(); - } - - public String toString(){ - return this.elementData.toString(); - } -} diff --git a/group04/1299310140/src/com/coding/basic/Stack.java b/group04/1299310140/src/com/coding/basic/Stack.java deleted file mode 100644 index c0a3adac8e..0000000000 --- a/group04/1299310140/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - this.elementData.add(o); - } - - public Object pop(){ - return this.elementData.remove(this.elementData.size()-1); - } - - public Object peek(){ - return this.elementData.get(this.elementData.size()-1); - } - - public boolean isEmpty(){ - if(this.elementData.size() == 0){ - return true; - }else{ - return false; - } - } - - public int size(){ - return this.elementData.size(); - } - - public String toString(){ - return this.elementData.toString(); - } - -} diff --git a/group04/1751801281/.classpath b/group04/1751801281/.classpath deleted file mode 100644 index e72ef7c0d4..0000000000 --- a/group04/1751801281/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/group04/1751801281/.gitignore b/group04/1751801281/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group04/1751801281/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group04/1751801281/.project b/group04/1751801281/.project deleted file mode 100644 index 767083b86b..0000000000 --- a/group04/1751801281/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 1751801281Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group04/1751801281/src/com/coding/basic/ArrayList.java b/group04/1751801281/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 68bc111bc4..0000000000 --- a/group04/1751801281/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; -import java.util.ConcurrentModificationException; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[10]; - - public void add(Object o) { - // 进行扩容检查 - ensureCapacity(size + 1); - elementData[size++] = o; - } - - public void add(int index, Object o) { - if (index > size || index < 0) - throw new IndexOutOfBoundsException("数组越界异常"); - ensureCapacity(size + 1); - // 对数组进行复制处理,目的就是空出index的位置插入o,并将index后的元素位移一个位置 - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index) { - if (index < 0 || index > elementData.length) { - return null; - } else if (index > size && index < elementData.length) { - return null; - } else { - return elementData[index]; - } - } - - public Object remove(int index) { - if (index < 0 || index > elementData.length) { - return null; - } else { - int numMoved = size - index - 1; - if (numMoved > 0) - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - elementData[--size] = null; - return elementData[index]; - } - } - - public int size() { - return size; - } - - public void ensureCapacity(int minCapacity) { - if (minCapacity > elementData.length) { - grow(minCapacity); - } - } - - public void grow(int minCapacity) { - // 当前数组的长度 - int oldCapacity = elementData.length; - // 最小需要的容量大于当前数组的长度则进行扩容 - if (minCapacity > oldCapacity) { - Object oldData[] = elementData; - // 新扩容的数组长度为旧容量的1.5倍+1 - int newCapacity = (oldCapacity * 3) / 2 + 1; - // 如果新扩容的数组长度还是比最小需要的容量小,则以最小需要的容量为长度进行扩容 - if (newCapacity < minCapacity) - newCapacity = minCapacity; - // 进行数据拷贝,Arrays.copyOf底层实现是System.arrayCopy() - elementData = Arrays.copyOf(elementData, newCapacity); - } - } - - public Iterator iterator() { - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator { - int cursor; // index of next element to return - int lastRet = -1; // index of last element returned; -1 if no such - - public boolean hasNext() { - return cursor != size; - } - - public Object next() { - int i = cursor; - if (i >= size) - throw new NoSuchElementException(); - Object[] elementData = ArrayList.this.elementData; - if (i >= elementData.length) - throw new ConcurrentModificationException(); - cursor = i + 1; - return elementData[lastRet = i]; - } - } -} diff --git a/group04/1751801281/src/com/coding/basic/Iterator.java b/group04/1751801281/src/com/coding/basic/Iterator.java deleted file mode 100644 index e7cbd474ec..0000000000 --- a/group04/1751801281/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group04/1751801281/src/com/coding/basic/LinkedList.java b/group04/1751801281/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 3fca710056..0000000000 --- a/group04/1751801281/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - private Node tail; - private int size; - - private static class Node { - Object data; - Node next; - Node previous; - } - - public void add(Object o) { - if (head == null) { - head = new Node(); - head.data = o; - tail = head; - } else { - Node oldtail = tail; - tail = new Node(); - tail.data = o; - tail.next = null; - tail.previous = oldtail; - oldtail.next = tail; - } - size++; - } - - public void add(int index, Object o) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException("数组越界异常"); - } else if (index == size) { - Node oldtail = tail; - tail = new Node(); - tail.data = o; - tail.previous = oldtail; - oldtail.next = tail; - size++; - } else { - - } - size++; - } - - public Object get(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException("数组越界异常"); - } - for (int i = 0; i < index; i++) { - head = head.next; - } - return head.data; - } - - public Object remove(int index) { - - return null; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node oldhead = head; - head = new Node(); - head.data = o; - head.next = oldhead; - head.previous = null; - oldhead.previous = head; - size++; - } - - public void addLast(Object o) { - Node oldtail = tail; - tail = new Node(); - tail.data = o; - tail.previous = oldtail; - tail.next = null; - oldtail.next = tail; - size++; - } - - public Object removeFirst() { - Object data = head.data; - head = head.next; - head.previous = null; - size--; - return data; - } - - public Object removeLast() { - Object data = tail.data; - tail = tail.previous; - tail.next = null; - size--; - return data; - } - - public Iterator iterator() { - - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator { - int cursor; - int lastReset = -1; - - @Override - public boolean hasNext() { - return size != cursor; - } - - @Override - public Object next() { - int i = cursor; - if (i > size) { - throw new NoSuchElementException(); - } - Node n = head; - for (int j = 0; j < i; j++) { - n = n.next; - } - cursor = i + 1; - lastReset = i; - return n.data; - } - } -} \ No newline at end of file diff --git a/group04/1751801281/src/com/coding/basic/List.java b/group04/1751801281/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group04/1751801281/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group04/1751801281/src/com/coding/basic/Queue.java b/group04/1751801281/src/com/coding/basic/Queue.java deleted file mode 100644 index 2c513f5b6b..0000000000 --- a/group04/1751801281/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private int size; - - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o) { - elementData.add(o); - size++; - } - - public Object deQueue() { - size--; - return elementData.removeFirst(); - - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group04/1751801281/src/com/coding/basic/Stack.java b/group04/1751801281/src/com/coding/basic/Stack.java deleted file mode 100644 index 28852147e8..0000000000 --- a/group04/1751801281/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coding.basic; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - - private int size; - - public void push(Object o) { - elementData.add(o); - size++; - } - - public Object pop() { - return elementData.remove(--size); - } - - public Object peek() { - return elementData.get(size - 1); - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group04/1751801281/test/com/coding/basic/ArrayListTest.java b/group04/1751801281/test/com/coding/basic/ArrayListTest.java deleted file mode 100644 index ed7c6549ed..0000000000 --- a/group04/1751801281/test/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -import org.junit.Test; - -public class ArrayListTest { - - @Test - public void testArrayList(){ - ArrayList list = new ArrayList(); - list.add("0"); - list.add("1"); - list.add("2"); - list.add("3"); - list.add("4"); - list.add("5"); - list.add("6"); - list.add("7"); - list.add("8"); - list.add(2,"9"); - list.add("10"); - list.add(3,"11"); - System.out.println(list.get(3)); - System.out.println("======"); - Iterator it = list.iterator(); - while(it.hasNext()){ - System.out.print(it.next()+" "); - } - - } -} diff --git a/group04/1751801281/test/com/coding/basic/LinkedListTeat.java b/group04/1751801281/test/com/coding/basic/LinkedListTeat.java deleted file mode 100644 index ac1b0c118e..0000000000 --- a/group04/1751801281/test/com/coding/basic/LinkedListTeat.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coding.basic; - -import org.junit.Test; - -public class LinkedListTeat { - - @Test - public void testLinkedList(){ - LinkedList list = new LinkedList(); - list.add("0"); - list.add("1"); - list.add("2"); - list.add(1, "3"); - list.addFirst("4"); - list.addLast("5"); - list.removeFirst(); - list.removeLast(); - System.out.println(list.get(0)); - System.out.println(list.get(1)); - System.out.println(list.get(2)); - System.out.println(list.get(1)); - System.out.println("========"); - - Iterator it = list.iterator(); - while(it.hasNext()){ - System.out.print(it.next()+" "); - } - } -} diff --git a/group04/1751801281/test/com/coding/basic/QueueTest.java b/group04/1751801281/test/com/coding/basic/QueueTest.java deleted file mode 100644 index ba2be4262b..0000000000 --- a/group04/1751801281/test/com/coding/basic/QueueTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.coding.basic; - -import org.junit.Test; - -public class QueueTest { - - @Test - public void testQueue(){ - Queue q = new Queue(); - q.enQueue("a"); - q.enQueue("b"); - q.enQueue("c"); - q.deQueue(); - System.out.println(q.size()); - } -} diff --git a/group04/1751801281/test/com/coding/basic/StackTest.java b/group04/1751801281/test/com/coding/basic/StackTest.java deleted file mode 100644 index a133f0ec1f..0000000000 --- a/group04/1751801281/test/com/coding/basic/StackTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -import org.junit.Test; - -public class StackTest { - - @Test - public void testStack() { - Stack s = new Stack(); - s.push("0"); - s.push("1"); - s.push("2"); - s.push("3"); - s.push("4"); - System.out.println(s.pop()); - System.out.println(s.peek()); - - } -} diff --git a/group04/1796244932/.gitignore b/group04/1796244932/.gitignore deleted file mode 100644 index b241c62e19..0000000000 --- a/group04/1796244932/.gitignore +++ /dev/null @@ -1,138 +0,0 @@ -.metadata/ -RemoteSystemsTempFiles/ -.recommenders/ - -*.iml - -# Created by https://www.gitignore.io/api/eclipse,intellij,java - -### Eclipse ### - -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath -.recommenders - -# Eclipse Core -.project - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# PyDev specific (Python IDE for Eclipse) -*.pydevproject - -# CDT-specific (C/C++ Development Tooling) -.cproject - -# JDT-specific (Eclipse Java Development Tools) -.classpath - -# Java annotation processor (APT) -.factorypath - -# PDT-specific (PHP Development Tools) -.buildpath - -# sbteclipse plugin -.target - -# Tern plugin -.tern-project - -# TeXlipse plugin -.texlipse - -# STS (Spring Tool Suite) -.springBeans - -# Code Recommenders -.recommenders/ - -### Intellij ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff: -.idea/**/workspace.xml -.idea/**/tasks.xml -*/.idea/ -# Sensitive or high-churn files: -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.xml -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml - -# Gradle: -.idea/**/gradle.xml -.idea/**/libraries - -# Mongo Explorer plugin: -.idea/**/mongoSettings.xml - -## File-based project format: -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -### Intellij Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -# *.iml -# modules.xml -# .idea/misc.xml -# *.ipr - -### Java ### -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -# End of https://www.gitignore.io/api/eclipse,intellij,java diff --git a/group04/1796244932/learn01/.gitignore b/group04/1796244932/learn01/.gitignore deleted file mode 100644 index 83ef0e8099..0000000000 --- a/group04/1796244932/learn01/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.settings/ -/target/ -.classpath -.project -/bin/ - diff --git a/group04/1796244932/learn01/pom.xml b/group04/1796244932/learn01/pom.xml deleted file mode 100644 index 5a00c4d139..0000000000 --- a/group04/1796244932/learn01/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - 4.0.0 - - com.dudy - learn01 - 0.0.1-SNAPSHOT - jar - - learn01 - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 4.11 - test - - - - - - - - jdk-1.8 - - true - 1.8 - - - 1.8 - 1.8 - 1.8 - - - - diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java deleted file mode 100644 index 5a8e82aaaf..0000000000 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.dudy.learn01.base; - -import java.util.Arrays; - -public class MyArrayList implements MyList { - - private int size = 0; - - private Object[] elementData = new Object[16]; - - /** - * 增加元素: ①数组没满之前,直接添加到最后,满了扩容添加 - */ - public void add(Object o) { - // 检查是否需要扩容 - this.checkGrow(size + 1); - elementData[size++] = o; - } - - /** - * 检查是否需要扩容 - * - * @param newSize - */ - private void checkGrow(int newSize) { - if (newSize > elementData.length) { - this.grow(elementData); - } - } - - /** - * 扩容 - * - * @param oldElementData - */ - private void grow(Object[] oldElementData) { - int lenth = (int) (oldElementData.length * 1.5); - elementData = Arrays.copyOf(oldElementData, lenth); - } - - /** - * 根据索引添加:①同 add ② 可能会出现 index 超出当前位置的情况 ③往 中间插入时需要移位 - */ - public void add(int index, Object o) { - // 检查是否需要扩容 - if (index > size || index < 0) { - throw new RuntimeException("Index: " + index + ", Size: " + size); - } - this.checkGrow(size + 1); - // 循环移位 - int tmp = size; - for (int i = 0; i < size - index; i++) { - elementData[tmp] = elementData[tmp - 1]; - tmp--; - } - // 索引位置赋值 - elementData[index] = o; - size++; - } - - /** - * 直接返回相应数组下标就好 - */ - public Object get(int index) { - return elementData[index]; - } - - /** - * 删除元素:①注意移位 - */ - public Object remove(int index) { - // 检查是否需要扩容 - if (index > size || index < 0) { - throw new RuntimeException("Index: " + index + ", Size: " + size); - } - Object desc = elementData[index]; - - for (int i = 0; i < size - index; i++) { - elementData[index] = elementData[index+1]; - index++; - } - size--; - return desc; - } - - public int size() { - return this.size; - } - - public MyIterator iterator() { - - - return new MyItr(); - } - - public class MyItr implements MyIterator{ - - int cursor; - - - - public boolean hasNext() { - return cursor != size; - } - - public Object next() { - - return elementData[cursor++]; - } - } - - - - @Override - public String toString() { - StringBuffer str = new StringBuffer(); - str.append("["); - for (int i = 0; i < size; i++) { - str.append(elementData[i]+","); - } - str.append("]"); - return str.toString(); - } -} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java deleted file mode 100644 index cfc06bc0d2..0000000000 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.dudy.learn01.base; - -public class MyBinaryTree { - - private Node root; - - public Node getRoot() { - return root; - } - - static class Node { - private int data; - private Node left; - private Node right; - - public Node(int data) { - this.data = data; - } - - } - - public Node insert(int o) { - Node newNode = new Node(o); - - if (root == null) { - root = newNode; - return newNode; - } - Node currentNode = root; - - while (true) { - // System.out.println("currentNode: " + currentNode.data ); - if (o <= currentNode.data) { // left - - if (currentNode.left != null) { - currentNode = currentNode.left; - } else { - currentNode.left = newNode; - // System.out.println("left return ..."); - // System.out.println(""); - return newNode; - } - } else { // right - if (currentNode.right != null) { - currentNode = currentNode.right; - } else { - currentNode.right = newNode; - // System.out.println("right return ..."); - // System.out.println(""); - return newNode; - } - } - - } - - } - - public void display(Node root) { - - System.out.print(root.data + " "); - if (root.left != null) { - display(root.left); - } - if (root.right != null) { - display(root.right); - } - } - - - -} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyIterator.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyIterator.java deleted file mode 100644 index e53306fa03..0000000000 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyIterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.dudy.learn01.base; -public interface MyIterator { - public boolean hasNext(); - public Object next(); - -} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java deleted file mode 100644 index 60254997aa..0000000000 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.dudy.learn01.base; - - -public class MyLinkedList implements MyList { - - private int size = 0; - - private Node head; - - public void add(Object o) { - Node newNode = new Node(o); - newNode.next = head;// next --> head - head = newNode; // head --> newNode - size++; - } - - public void add(int index, Object o) { - checkRange(index); - Node current = getCurrentNode(index); - Node newNode = new Node(o); - newNode.next = current.next;//new next --> next - current.next = newNode; // next -->new - size++; - } - - private Node getCurrentNode(int index) {// 获取当前节点 - Node current = head; - for(int i = 0; i< size-index -1; i++){ - current = current.next; - } - return current; - } - - private void checkRange(int index) { - if(index > size || index < 0){ - throw new RuntimeException("indexOutOfException:" + "Index: " + index + ", Size: " + size); - } - } - - public Object get(int index) { - checkRange(index); - Node node = getCurrentNode(index); - return node.data; - } - - public Object remove(int index) { - if(size < 1){// ①没有元素的情况 - throw new RuntimeException("NoSuchElementException: size= " + size); - } - if(index == 0) return removeFirst(); - if(index == size - 1) return removeLast(); - - Node node = getCurrentNode(index+1); - node.next = node.next.next; - size--; - return node.data; - } - - public int size() { - return size; - } - - public void addLast(Object o) { - add(o); - } - - public void addFirst(Object o) { - Node current = head; - while(current.next != null){// 找到最后一个节点 - current = current.next; - } - Node newNode = new Node(o); - current.next = newNode; - size++; - } - - public Object removeFirst() { - Node currentNode = getCurrentNode(1); - Node tmp = currentNode.next; - currentNode.next = null; - size--; - return tmp ==null? currentNode.data:tmp.data;// 可能只有一个数据 - } - - public Object removeLast() { - Node tmp = head; - head = head.next; - size--; - return tmp.data; - } - - public MyIterator iterator() { - return new MyLinkedListItr(); - } - - - public class MyLinkedListItr implements MyIterator { - - int cursor; - - public boolean hasNext() { - return cursor != size; - } - - public Object next() { - Node currentNode = getCurrentNode(cursor++); - return currentNode.data; - } - } - - private static class Node { - Object data; - Node next; - public Node() { - } - public Node(Object data) { - this.data = data; - } - } - - - private void displayLink() {// 自己调试使用 - Node current = head; - while(current != null){ - System.out.print(current.data); - current = current.next; - } - System.out.println(""); - } - - -} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyList.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyList.java deleted file mode 100644 index 455727381d..0000000000 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyList.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dudy.learn01.base; -public interface MyList { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java deleted file mode 100644 index 25b9da93f2..0000000000 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dudy.learn01.base; -public class MyQueue { - - private MyLinkedList elementData = new MyLinkedList(); - - public void enQueue(Object o){ - elementData.addLast(o); - } - - public Object deQueue(){ - - return elementData.removeFirst(); - } - - public boolean isEmpty(){ - return elementData.size() == 0 ; - } - - public int size(){ - return elementData.size(); - } -} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java deleted file mode 100644 index e59c366e0a..0000000000 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dudy.learn01.base; -public class MyStack { - private MyArrayList elementData = new MyArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - - Object o = elementData.get(elementData.size()-1); - elementData.remove(elementData.size()); - return o; - } - - public Object peek(){ - - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java deleted file mode 100644 index 5c6edd8fec..0000000000 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.dudy.learn01.base; - -import org.junit.Test; - -import java.util.ArrayList; -import java.util.Iterator; - -public class MyArrayListTest { - - - - @Test - public void iteraterTest(){ - MyArrayList list = new MyArrayList(); - for (int i = 0; i < 20; i++) { - list.add(i); - } - - - for(MyIterator it = list.iterator(); it.hasNext();){ - System.out.print(it.next() + " "); - } - - - } - - @Test - public void myArrayListTest() { - MyArrayList list = new MyArrayList(); - for (int i = 0; i < 20; i++) { - list.add(i); - } - - list.add(1, "s"); - list.add(21, 21); - System.out.println("--" + list.size()); - System.out.println(list); - - Object remove = list.remove(3); - System.out.println("remove:" + remove); - System.out.println("--" + list.size()); - System.out.println(list); - } - - @Test - public void arrayListTest(){ - - ArrayList list = new ArrayList(); - list.add("1"); - list.add("2"); - - for (Iterator it = list.iterator(); it.hasNext();){ - System.out.println(it.next()); - } - - } - - -} diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyBinaryTreeTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyBinaryTreeTest.java deleted file mode 100644 index 65bee44580..0000000000 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyBinaryTreeTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dudy.learn01.base; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by dudy on 2017/2/21. - */ -public class MyBinaryTreeTest { - - - /** - * 5 - * 2 7 - * 1 4 6 8 - * - */ - @Test - public void insert() throws Exception { - - - MyBinaryTree tree = new MyBinaryTree(); - tree.insert(5); - tree.insert(2); - tree.insert(1); - tree.insert(7); - tree.insert(8); - tree.insert(4); - tree.insert(6); - - - tree.display(tree.getRoot()); - - } - - @Test - public void display() throws Exception { - - } - -} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyLinkedListTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyLinkedListTest.java deleted file mode 100644 index c6ebb096ec..0000000000 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyLinkedListTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.dudy.learn01.base; - -import java.util.LinkedList; - -import org.junit.Test; - -public class MyLinkedListTest { - - - - @Test - public void iteraterTest(){ - MyLinkedList list = new MyLinkedList(); - for (int i = 0; i < 10; i++) { - list.add(i); - } - - - for(MyIterator it = list.iterator(); it.hasNext();){ - System.out.print(it.next() + " "); - } - - - } - - @Test - public void removeTest(){ - MyLinkedList list = new MyLinkedList(); - list.add(1); - list.add(2); - list.add(3); - //list.remove(0); - //list.remove(1); - list.remove(2); - System.out.println("--" + list.size()); - for (int i = 0; i < list.size(); i++) { - System.out.print(list.get(i) + ","); - } - } - - - - @Test - public void removeLastTest() { - MyLinkedList list = new MyLinkedList(); - list.add(1); - //list.add(2); - list.removeLast(); - System.out.println("--" + list.size()); - for (int i = 0; i < list.size(); i++) { - System.out.print(list.get(i) + ","); - } - } - - @Test - public void removeFirstTest() { - MyLinkedList list = new MyLinkedList(); - list.add(1); - list.add(2); - Object first = list.removeFirst(); - System.out.println("--" + list.size() + ",first = " + first); - for (int i = 0; i < list.size(); i++) { - System.out.print(list.get(i) + ","); - } - } - - @Test - public void baseTest() { - - MyLinkedList list = new MyLinkedList(); - list.add(1); - list.add(2); - list.add(3); - list.addFirst(0); - list.addLast("last"); - list.add(3, "s");// 0 1 2 s 3 last - System.out.println(list.size()); - for (int i = 0; i < list.size(); i++) { - System.out.print(list.get(i) + ","); - } - } - - public static void main(String[] args) { - LinkedList list = new LinkedList(); - Integer first = list.removeFirst(); - } - -} diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java deleted file mode 100644 index de8d683abe..0000000000 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dudy.learn01.base; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by dudy on 2017/2/20. - */ -public class MyQueueTest { - @Test - public void enQueue() throws Exception { - - - MyQueue queue = new MyQueue(); - queue.enQueue("1"); -// queue.enQueue("2"); -// -// queue.enQueue("3"); - - while (queue.size() > 0){ - System.out.println(queue.deQueue()); - } - - } - -} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java deleted file mode 100644 index 51175953b0..0000000000 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.dudy.learn01.base; - -import org.junit.Test; - -import java.util.Stack; - -import static org.junit.Assert.*; - -/** - * Created by dudy on 2017/2/20. - */ -public class MyStackTest { - @Test - public void push() throws Exception { - - MyStack stack = new MyStack(); - stack.push("1"); - stack.push("2"); - stack.push("3"); - - Object pop = stack.pop(); - System.out.println( "size :" + stack.size() + "pop:" + pop); - Object peek = stack.peek(); - System.out.println( "size :" + stack.size() + "peek: " + peek); - } - - @Test - public void pop() throws Exception { - - } - - @Test - public void peek() throws Exception { - - } - - @Test - public void isEmpty() throws Exception { - - } - - @Test - public void size() throws Exception { - - } - - @Test - public void stackTest(){ - Stack stack = new Stack(); - stack.push("1"); - stack.push("2"); - stack.peek(); - stack.pop(); - System.out.println(stack.size()); - - } - -} \ No newline at end of file diff --git a/group04/1906242834/.classpath b/group04/1906242834/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group04/1906242834/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group04/1906242834/.gitignore b/group04/1906242834/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group04/1906242834/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group04/1906242834/.project b/group04/1906242834/.project deleted file mode 100644 index a30533712f..0000000000 --- a/group04/1906242834/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 1906242834Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group04/1906242834/src/com/coding/basic/ArrayList.java b/group04/1906242834/src/com/coding/basic/ArrayList.java deleted file mode 100644 index a4baff2fae..0000000000 --- a/group04/1906242834/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - //若插入元素后会溢出,则对数组进行扩容,在这里只把空间加1 - if ((size()+1)>elementData.length) { - System.arraycopy(elementData, 0, elementData, 0, elementData.length+1); - elementData[size] = o; - }else { - //若插入元素后不出现溢出,则直接添加在末尾 - elementData[size] = o; - } - } - //index在length范围之内正常插入,若index大于length则抛出异常 - public void add(int index, Object o){ - Object temp; - if (index index; i--) { - elementData[i-1] = elementData[i-2]; - } - elementData[index] = o; - }else if (index==elementData.length) { - add(o); - }else{ - System.out.println("ArrayIndexOutOfBoundsException"); - } - } - - public Object get(int index){ - if (index<=elementData.length-1) { - return elementData[index]; - }else { - System.out.println("ArrayIndexOutOfBoundsException"); - } - return elementData; - } - - public Object remove(int index){ - if (index - - - - - diff --git a/group04/1972376180/.gitignore b/group04/1972376180/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group04/1972376180/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group04/1972376180/.project b/group04/1972376180/.project deleted file mode 100644 index 53a0e6ab9c..0000000000 --- a/group04/1972376180/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - Coding2017 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group04/1972376180/src/tong/java/one/MyArrayList.java b/group04/1972376180/src/tong/java/one/MyArrayList.java deleted file mode 100644 index abb00f61b9..0000000000 --- a/group04/1972376180/src/tong/java/one/MyArrayList.java +++ /dev/null @@ -1,76 +0,0 @@ -package tong.java.one; - -import java.util.Arrays; - -/** - * 自定义ArrayList - * - * @author tong - * - */ -public class MyArrayList { - private Object[] datas = new Object[10]; - private int size; - - // 默认在集合末尾添加元素 - public void add(Object o) { - if (datas[0] == null) { - datas[0] = o; - } else { - if (size < datas.length) { - datas[size] = o; - } else { - datas = grow(5); - datas[size] = o; - } - } - size++; - } - - // 指定索引处添加元素 - public void add(int index, Object o) { - if (index > size - 1) { - throw new ArrayIndexOutOfBoundsException(); - } else { - if (size + 1 > datas.length) { - datas = grow(5); - } - datas[index] = o; - for (int i = index + 1; i < size - 1; i++) { - datas[i] = datas[i + 1]; - } - size++; - } - } - - // 获取指定索引处的的元素 - public Object get(int index) { - if (index > size - 1) { - throw new ArrayIndexOutOfBoundsException(); - } else { - return datas[index]; - } - } - - // 删除指定索引处的元素 - public Object remove(int index) { - if (index > size - 1) { - throw new ArrayIndexOutOfBoundsException(); - } else { - Object removeData = datas[index]; - for (int i = index; i < size - 1; i++) { - datas[index] = datas[index + 1]; - } - size--; - return removeData; - } - } - - public int size() { - return size; - } - - private Object[] grow(int length) { - return Arrays.copyOf(datas, datas.length + length); - } -} diff --git a/group04/1972376180/src/tong/java/one/MyLinkedList.java b/group04/1972376180/src/tong/java/one/MyLinkedList.java deleted file mode 100644 index e238642bba..0000000000 --- a/group04/1972376180/src/tong/java/one/MyLinkedList.java +++ /dev/null @@ -1,127 +0,0 @@ -package tong.java.one; - -/** - * 自定义LinkedList - * - * @author 仝闯 - * - */ -public class MyLinkedList { - private Node head; - private int size; - - // 默认在链表的结尾添加元素 - public void add(Object o) { - Node newNode = new Node(o); - if (size == 0) { - head = newNode; - } else if (size == 1) { - Node oldHead = head; - head = newNode; - head.next = oldHead; - } else { - getNode(size - 1).next = newNode; - } - size++; - } - - // 在指定索引出添加元素 - public void add(int index, Object o) { - Node newNode = new Node(o); - if (size == 0) { - head = newNode; - } else if (size == 1) { - Node oldHead = head; - head = newNode; - head.next = oldHead; - } else { - if (index == 0) { - Node oldHead = head; - head = newNode; - head.next = oldHead; - } else if (index == size - 1) { - getNode(size - 1).next = newNode; - } else { - for (int i = 1; i < index; i++) { - getNode(index - 1).next = newNode; - newNode.next = getNode(index); - } - } - } - size++; - } - - // 添加元素到首位 - public void addFirst(Object o) { - Node oldHead = head; - head = new Node(o); - head.next = oldHead; - size++; - } - - // 获取指定索引处的元素 - public Object get(int index) { - return getNode(index).data; - } - - private Node getNode(int index) { - Node x = head; - if (index == 0) { - return head; - } else { - for (int i = 0; i < index; i++) { - x = x.next; - } - return x; - } - - } - - // 删除指定索引处的元素 - public Object remove(int index) { - if (index < 0 || index > size - 1) { - throw new RuntimeException(); - } else { - if (0 < index && index < size - 1) { - getNode(index - 1).next = getNode(index + 1); - size--; - return getNode(index); - } else if (index == 0) { - Node removeNode = head; - removeNode.next = null; - head = getNode(1); - size--; - return removeNode; - } else { - getNode(index - 1).next = null; - size--; - return getNode(index); - } - } - - } - - // 删除首位元素 - public Object removeFirst() { - return remove(0); - } - - // 删除末位元素 - public Object removeLast() { - return remove(size - 1); - } - - public int size() { - return size; - } - - class Node { - Object data; - Node next; - - public Node(Object data) { - this.data = data; - } - } - -} diff --git a/group04/1972376180/src/tong/java/one/MyQueue.java b/group04/1972376180/src/tong/java/one/MyQueue.java deleted file mode 100644 index 3ad96a0854..0000000000 --- a/group04/1972376180/src/tong/java/one/MyQueue.java +++ /dev/null @@ -1,34 +0,0 @@ -package tong.java.one; -/** - * 自定义队列 - * @author tong - * - */ -public class MyQueue { - private MyLinkedList datas = new MyLinkedList(); - private int size; - - - public void enqueue(Object o) { - datas.add(o); - size++; - } - - public Object dequeue() { - Object firstData = datas.removeFirst(); - size--; - return firstData; - } - - public boolean isEmpty() { - if (size == 0) { - return true; - } else { - return false; - } - } - - public int size() { - return size; - } -} diff --git a/group04/1972376180/src/tong/java/one/MyStack.java b/group04/1972376180/src/tong/java/one/MyStack.java deleted file mode 100644 index e01e92f581..0000000000 --- a/group04/1972376180/src/tong/java/one/MyStack.java +++ /dev/null @@ -1,38 +0,0 @@ -package tong.java.one; -/** - * 自定义栈 - * @author tong - * - */ -public class MyStack { - private MyArrayList datas = new MyArrayList(); - private int size; - //入栈 - public void push(Object o){ - datas.add(o); - size++; - } - //出栈 - public Object pop(){ - Object topData = datas.remove(size-1); - size--; - return topData; - } - - public Object peek(){ - return datas.get(size-1); - } - - public boolean isEmpty(){ - if(size==0){ - return true; - }else{ - return false; - } - } - - public int size(){ - return size; - } - -} diff --git a/group04/2082945465/.gitignore b/group04/2082945465/.gitignore deleted file mode 100644 index 3f016d5a8c..0000000000 --- a/group04/2082945465/.gitignore +++ /dev/null @@ -1,138 +0,0 @@ -.metadata/ -RemoteSystemsTempFiles/ -.recommenders/ - -*.iml - -# Created by https://www.gitignore.io/api/eclipse,intellij,java - -### Eclipse ### - -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath -.recommenders - -# Eclipse Core -.project - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# PyDev specific (Python IDE for Eclipse) -*.pydevproject - -# CDT-specific (C/C++ Development Tooling) -.cproject - -# JDT-specific (Eclipse Java Development Tools) -.classpath - -# Java annotation processor (APT) -.factorypath - -# PDT-specific (PHP Development Tools) -.buildpath - -# sbteclipse plugin -.target - -# Tern plugin -.tern-project - -# TeXlipse plugin -.texlipse - -# STS (Spring Tool Suite) -.springBeans - -# Code Recommenders -.recommenders/ - -### Intellij ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff: -.idea/**/workspace.xml -.idea/**/tasks.xml -*/.idea/ -# Sensitive or high-churn files: -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.xml -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml - -# Gradle: -.idea/**/gradle.xml -.idea/**/libraries - -# Mongo Explorer plugin: -.idea/**/mongoSettings.xml - -## File-based project format: -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -### Intellij Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -*.iml -modules.xml -.idea/misc.xml -# *.ipr - -### Java ### -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -# End of https://www.gitignore.io/api/eclipse,intellij,java diff --git a/group04/2082945465/week01/src/Hello.java b/group04/2082945465/week01/src/Hello.java deleted file mode 100644 index ac6e67463e..0000000000 --- a/group04/2082945465/week01/src/Hello.java +++ /dev/null @@ -1,7 +0,0 @@ -package src; - -public class Hello { - public static void main(String[] args) { - System.out.println("Hello! World!"); - } -} diff --git a/group04/2082945465/week01/src/MyArrayList.java b/group04/2082945465/week01/src/MyArrayList.java deleted file mode 100644 index 798475771c..0000000000 --- a/group04/2082945465/week01/src/MyArrayList.java +++ /dev/null @@ -1,79 +0,0 @@ -package src; - -import java.util.Arrays; - -/** - * Created by Yang on 2/25/2017. - */ -public class MyArrayList implements MyList { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - @Override - public void add(Object obj) { - this.checkCapacity(size+1); - elementData[size++] = obj; - } - - @Override - public void add(int index, Object obj) { - this.validIndex(index); - this.checkCapacity(size+1); - if(index < size){ - for(int i = size; i > index; i--){ - this.elementData[i] = this.elementData[i-1]; - } - }else{ - this.elementData[index] = obj; - } - this.size++; - } - - @Override - public Object get(int index) { - this.validIndex(index); - return this.elementData[index]; - } - - @Override - public Object remove(int index) { - this.validIndex(index); - Object o = this.elementData[index]; - for(int i = index; i < this.size-1; i++){ - this.elementData[i] = this.elementData[i+1]; - } - this.size--; - return o; - } - - @Override - public int size() { - return this.size; - } - - private void checkCapacity(int newSize) { - if(newSize > elementData.length){ - this.extend(elementData); - } - } - - private void extend(Object[] oldElementData) { - int newLength = (int) (oldElementData.length * 1.5); - elementData = Arrays.copyOf(oldElementData, newLength); - } - - private void validIndex(int inputIndex) { - if(inputIndex > size || inputIndex < 0){ - throw new RuntimeException("Index: " + inputIndex + " out of bounds( " + size +" )"); - } - } - - public boolean isEmpty() { - if (size() == 0){ - return false; - } - return true; - } -} diff --git a/group04/2082945465/week01/src/MyIterator.java b/group04/2082945465/week01/src/MyIterator.java deleted file mode 100644 index 245fa82be8..0000000000 --- a/group04/2082945465/week01/src/MyIterator.java +++ /dev/null @@ -1,9 +0,0 @@ -package src; - -/** - * Created by Yang on 2/25/2017. - */ -public interface MyIterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group04/2082945465/week01/src/MyLinkedList.java b/group04/2082945465/week01/src/MyLinkedList.java deleted file mode 100644 index 69f518ba0f..0000000000 --- a/group04/2082945465/week01/src/MyLinkedList.java +++ /dev/null @@ -1,111 +0,0 @@ -package src; - -/** - * Created by Yang on 2/25/2017. - */ -public class MyLinkedList implements MyList { - - private int size = 0; - - private Node header; - - @Override - public void add(Object obj) { - Node newNode = new Node(obj); - newNode.next = header; - header = newNode; - size++; - } - - @Override - public void add(int index, Object obj) { - this.validIndex(index); - Node current = this.getCurrentNode(index); - Node newNode = new Node(obj); - newNode.next = current.next; - current.next = newNode; - size++; - } - - @Override - public Object get(int index) { - this.validIndex(index); - Node node = getCurrentNode(index); - return node.data; - } - - @Override - public Object remove(int index) { - this.validIndex(index); - - if(index == 0) return removeFirst(); - if(index == size -1) return removeLast(); - - Node node = getCurrentNode(index+1); - node.next = node.next.next; - size--; - return node.data; - } - - @Override - public int size() { - return size; - } - - private static class Node { - Object data; - Node next; - public Node(){ - } - public Node(Object data) { - this.data = data; - } - } - - private void validIndex(int inputIndex) { - if(inputIndex > size || inputIndex < 0){ - throw new RuntimeException("Index: " + inputIndex + " out of bounds( " + size +" )"); - } - } - - private Node getCurrentNode(int index) { - Node current = header; - for(int i = 0; i < size-index -1; i++){ - current = current.next; - } - return current; - } - - public Object removeFirst() { - Node temp = new Node(); - temp.next = header; - temp.next = header.next; - return temp.next; - } - - private Object removeLast() { - Node preNode = new Node(); - while (preNode.next.next != null) { - preNode = preNode.next; - } - Node lastNode = preNode.next.next; - preNode.next = null; - return lastNode; - } - - public void addLast(Object o){ - Node preNode = new Node(); - while (preNode.next != null){ - preNode = preNode.next; - } - Node lastNode = new Node(o); - preNode.next = lastNode; - } - - public boolean isEmpty() { - if (size() == 0){ - return false; - } - return true; - } -} diff --git a/group04/2082945465/week01/src/MyList.java b/group04/2082945465/week01/src/MyList.java deleted file mode 100644 index 578c86b803..0000000000 --- a/group04/2082945465/week01/src/MyList.java +++ /dev/null @@ -1,12 +0,0 @@ -package src; - -/** - * Created by Yang on 2/25/2017. - */ -public interface MyList { - public void add(Object obj); - public void add(int index, Object obj); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group04/2082945465/week01/src/MyQueue.java b/group04/2082945465/week01/src/MyQueue.java deleted file mode 100644 index 87dc900c79..0000000000 --- a/group04/2082945465/week01/src/MyQueue.java +++ /dev/null @@ -1,20 +0,0 @@ -package src; - -/** - * Created by Yang on 2/25/2017. - */ -public class MyQueue { - private MyLinkedList queue = new MyLinkedList(); - - public void enQuee(Object obj){ - queue.addLast(obj); - } - - public Object deQuee(Object obj){ - return queue.removeFirst(); - } - - public boolean isEmpty() { - return queue.isEmpty(); - } -} diff --git a/group04/2082945465/week01/src/MyStack.java b/group04/2082945465/week01/src/MyStack.java deleted file mode 100644 index 3427d86e93..0000000000 --- a/group04/2082945465/week01/src/MyStack.java +++ /dev/null @@ -1,26 +0,0 @@ -package src; - -import java.util.EmptyStackException; - -/** - * Created by Yang on 2/25/2017. - */ -public class MyStack { - - private MyArrayList stack = new MyArrayList(); - - public void push(Object obj){ - stack.add(obj); - } - - public Object pop(){ - if (stack.size()==0){ - throw new EmptyStackException(); - } - return stack.remove(stack.size()-1); - } - - public boolean isEmpty(){ - return stack.isEmpty(); - } -} diff --git a/group04/24658892/.classpath b/group04/24658892/.classpath deleted file mode 100644 index fceb4801b5..0000000000 --- a/group04/24658892/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group04/24658892/.project b/group04/24658892/.project deleted file mode 100644 index fab8d7f04c..0000000000 --- a/group04/24658892/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group04/24658892/.settings/org.eclipse.jdt.core.prefs b/group04/24658892/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group04/24658892/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group04/24658892/learnjava/build.gradle b/group04/24658892/learnjava/build.gradle deleted file mode 100644 index ffde26b681..0000000000 --- a/group04/24658892/learnjava/build.gradle +++ /dev/null @@ -1,14 +0,0 @@ -group 'com.learnjava' -version '1.0-SNAPSHOT' - -apply plugin: 'java' - -sourceCompatibility = 1.5 - -repositories { - mavenCentral() -} - -dependencies { - testCompile group: 'junit', name: 'junit', version: '4.11' -} diff --git a/group04/24658892/learnjava/gradle/wrapper/gradle-wrapper.properties b/group04/24658892/learnjava/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 7d38f8e3be..0000000000 --- a/group04/24658892/learnjava/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Sat Feb 25 00:50:00 CST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip diff --git a/group04/24658892/learnjava/gradlew b/group04/24658892/learnjava/gradlew deleted file mode 100755 index 9aa616c273..0000000000 --- a/group04/24658892/learnjava/gradlew +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/group04/24658892/learnjava/gradlew.bat b/group04/24658892/learnjava/gradlew.bat deleted file mode 100644 index f9553162f1..0000000000 --- a/group04/24658892/learnjava/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/group04/24658892/learnjava/settings.gradle b/group04/24658892/learnjava/settings.gradle deleted file mode 100644 index 5c0663e14b..0000000000 --- a/group04/24658892/learnjava/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'learnjava' - diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/ArrayList.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/ArrayList.java deleted file mode 100644 index afd9f2a3c8..0000000000 --- a/group04/24658892/learnjava/src/main/java/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - int len = size + 1; - if (len == elementData.length) { - expandArray(); - } - elementData[size++] = o; - } - - public void add(int index, Object o) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - int remain = elementData.length - size; - if (remain == 0 || index == elementData.length) { - expandArray(); - } - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - private void expandArray() { - int len = elementData.length; - Object[] temp = new Object[len * 2]; - System.arraycopy(elementData, 0, temp, 0, len); - elementData = temp; - } - - public Object get(int index) { - if (index < 0) { - throw new IndexOutOfBoundsException(); - } - return elementData[index]; - } - - public Object remove(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - Object removed = elementData[index]; - int len = size - index - 1; - if (len > 0) { - System.arraycopy(elementData, index + 1, elementData, index, len); - } - elementData[--size] = null; - return removed; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator { - - private int cursor; - - public boolean hasNext() { - return cursor + 1 < size; - } - - public Object next() { - return elementData[++cursor]; - } - } -} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/BinaryTreeNode.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group04/24658892/learnjava/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/Iterator.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group04/24658892/learnjava/src/main/java/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java deleted file mode 100644 index e2c4e5e795..0000000000 --- a/group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/List.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group04/24658892/learnjava/src/main/java/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java deleted file mode 100644 index 4c87d9cb16..0000000000 --- a/group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private ArrayList elementData = new ArrayList(); - private int size = 0; - - public void enQueue(Object o) { - elementData.add(o); - size++; - } - - public Object deQueue() { - return elementData.remove(0); - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/Stack.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/Stack.java deleted file mode 100644 index 4c6a362da2..0000000000 --- a/group04/24658892/learnjava/src/main/java/com/coding/basic/Stack.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.coding.basic; - -import java.util.EmptyStackException; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - private int size = 0; - - public void push(Object o) { - elementData.add(o); - size++; - } - - public Object pop() { - if (isEmpty()) { - throw new EmptyStackException(); - } - return elementData.remove(--size); - } - - public Object peek() { - if (this.isEmpty()) { - throw new EmptyStackException(); - } - return elementData.get(size - 1); - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group04/24658892/learnjava/src/test/java/com/coding/basic/ArrayListTest.java b/group04/24658892/learnjava/src/test/java/com/coding/basic/ArrayListTest.java deleted file mode 100644 index 73fce0f7f8..0000000000 --- a/group04/24658892/learnjava/src/test/java/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.coding.basic; - -import org.junit.Assert; -import org.junit.Test; - -public class ArrayListTest { - - @Test - public void add() throws Exception { - ArrayList data; - int size; - //size < 100 - data = new ArrayList(); - size = 33; - for (int i = 0; i < size; i++) { - data.add(i); - } - for (int i = 0; i < size; i++) { - Assert.assertEquals(i, data.get(i)); - } - //size > 100 - data = new ArrayList(); - size = 333; - for (int i = 0; i < size; i++) { - data.add(i); - } - for (int i = 0; i < size; i++) { - Assert.assertEquals(i, data.get(i)); - } - //size = 100 - data = new ArrayList(); - size = 100; - for (int i = 0; i < size; i++) { - data.add(i); - } - for (int i = 0; i < size; i++) { - Assert.assertEquals(i, data.get(i)); - } - } - - @Test - public void add1() throws Exception { - ArrayList data; - int size; - int index; - boolean b; - // size < 100; - data = new ArrayList(); - size = 5; - index = 2; - b = false; - for (int i = 0; i < size; i++) { - data.add(i); - } - data.add(index, index + 10000); - for (int i = 0; i < data.size(); i++) { - if (i == index) { - b = true; - Assert.assertEquals(index + 10000, data.get(i)); - } - else { - if (b) { - Assert.assertEquals(i - 1, data.get(i)); - } - else { - Assert.assertEquals(i, data.get(i)); - } - } - } - } - - @Test - public void get() throws Exception { - ArrayList data = new ArrayList(); - data.add(1); - data.add(2); - data.add(3); - Assert.assertEquals(2, data.get(1)); - } - - @Test - public void remove() throws Exception { - ArrayList data = new ArrayList(); - data.add(1); - data.add(2); - data.add(3); - data.remove(1); - Assert.assertEquals(2, data.size()); - Assert.assertEquals(1, data.get(0)); - Assert.assertEquals(3, data.get(1)); - } - - @Test - public void size() throws Exception { - ArrayList data = new ArrayList(); - data.add(1); - data.add(1); - data.add(1); - Assert.assertEquals(3, data.size()); - } - - @Test - public void iterator() throws Exception { - ArrayList data = new ArrayList(); - data.add(0); - data.add(1); - data.add(2); - Iterator iterator = data.iterator(); - int i = 0; - while (iterator.hasNext()) { - Assert.assertEquals(++i, iterator.next()); - } - } -} \ No newline at end of file diff --git a/group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java b/group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java deleted file mode 100644 index 6acbb70d37..0000000000 --- a/group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic; - -import org.junit.Test; - -public class LinkedListTest { - - @Test - public void add() throws Exception { - - } - - @Test - public void add1() throws Exception { - - } - - @Test - public void get() throws Exception { - - } - - @Test - public void remove() throws Exception { - - } - - @Test - public void size() throws Exception { - - } - - @Test - public void addFirst() throws Exception { - - } - - @Test - public void addLast() throws Exception { - - } - - @Test - public void removeFirst() throws Exception { - - } - - @Test - public void removeLast() throws Exception { - - } - - @Test - public void iterator() throws Exception { - - } - -} \ No newline at end of file diff --git a/group04/274407594/226/.classpath b/group04/274407594/226/.classpath deleted file mode 100644 index fb565a588d..0000000000 --- a/group04/274407594/226/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group04/274407594/226/.gitignore b/group04/274407594/226/.gitignore deleted file mode 100644 index 5e56e040ec..0000000000 --- a/group04/274407594/226/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin diff --git a/group04/274407594/226/.project b/group04/274407594/226/.project deleted file mode 100644 index 1f70b883ee..0000000000 --- a/group04/274407594/226/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 226 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group04/274407594/226/.settings/org.eclipse.jdt.core.prefs b/group04/274407594/226/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab1683..0000000000 --- a/group04/274407594/226/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git "a/group04/312816708/blog/blog01/CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\343\200\201\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" "b/group04/312816708/blog/blog01/CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\343\200\201\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" deleted file mode 100644 index 68542a9e7b..0000000000 --- "a/group04/312816708/blog/blog01/CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\343\200\201\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" +++ /dev/null @@ -1,29 +0,0 @@ -# CPU、内存、硬盘、指令之间的关系 - -## 1、简介 - -### 1.1 CPU -> CPU,中央处理器,是一个超大规模的集成电路,是一台计算机的运算核心和控制核心。它的主要功能是解释计算机指令以及处理计算机软件中的数据。 - -### 1.2 内存 -> 内存是计算机中重要的部件之一,它是与CPU沟通的桥梁。计算机中所有的程序都是在内存中运行的。其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换数据。 - -### 1.3 硬盘 -> 硬盘是计算机主要的存储媒介之一。硬盘分为固态硬盘(SSD 盘,新式硬盘)、机械硬盘(HDD 硬盘)、混合硬盘(HHD 一块基于传统机械硬盘诞生出来的新硬盘)。 - -### 1.4 指令 -> 指挥计算机工作的指示命令。程序是一系列按一定顺序排列的,执行程序的过程就是计算机的工作过程。 - -## 2、关系 -计算机在运行时,**CPU** 从**内存** 中获取第一条 **指令** ,然后内存再从硬盘中读取所需的数据。然后CPU再取出第二条指令,一直到指令结束。 - -## 3、参考资料 -[中央处理器 —— 百度百科](http://baike.baidu.com/item/%E4%B8%AD%E5%A4%AE%E5%A4%84%E7%90%86%E5%99%A8/284033?sefr=cr&fromtitle=CPU&fromid=120556) - -[内存 —— 百度百科](http://baike.baidu.com/item/%E5%86%85%E5%AD%98?sefr=enterbtn) - -[硬盘 —— 百度百科](http://baike.baidu.com/item/%E7%A1%AC%E7%9B%98?sefr=enterbtn) - -[计算机指令 —— 百度百科](http://baike.baidu.com/item/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%8C%87%E4%BB%A4) - - diff --git a/group04/312816708/coding/coding01/.gitignore b/group04/312816708/coding/coding01/.gitignore deleted file mode 100644 index 22cb2e1fb7..0000000000 --- a/group04/312816708/coding/coding01/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# IntelliJ IDEA - -target/ -*.iml -*.ipr -*.iws -.idea/ \ No newline at end of file diff --git a/group04/312816708/coding/coding01/pom.xml b/group04/312816708/coding/coding01/pom.xml deleted file mode 100644 index 9f29c935ae..0000000000 --- a/group04/312816708/coding/coding01/pom.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - 4.0.0 - - com.kevin - coding01 - 1.0-SNAPSHOT - - - \ No newline at end of file diff --git a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyArrayList.java b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyArrayList.java deleted file mode 100644 index 5e4c1bdd2e..0000000000 --- a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyArrayList.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.kevin.coding01.basic; - -import java.util.ArrayList; -import java.util.Arrays; - -/** - * Created by YinWenBing on 2017/2/25. - */ -public class MyArrayList implements MyList { - private int size = 0; - private Object[] elementData = new Object[10]; - - /** - * 添加 - * 判断数组空间是否足够,不够则扩容,将元素放在数组末尾 - * - * @param e - */ - public void add(E e) { - isGrow(size + 1);//判断是否需要扩容 - elementData[size++] = e; - } - - /** - * 是否需要扩容 - * - * @param size - */ - private void isGrow(int size) { - if (size > elementData.length) { - grow(size); - } - } - - /** - * 扩容 - * - * @param minCapacity - */ - private void grow(int minCapacity) { - int oldCapacity = elementData.length; - int newCapacity = oldCapacity + (oldCapacity >> 1);//>>将oldCapacity向右移一位,右移一位代表除2,右移n位代表除以2的n次方。左移则是乘 - if (newCapacity - minCapacity < 0) { - newCapacity = minCapacity; - } else if (newCapacity - (Integer.MAX_VALUE - 8) > 0) { - newCapacity = hugeCapacity(minCapacity); - } - elementData = Arrays.copyOf(elementData, newCapacity); - } - - private int hugeCapacity(int minCapacity) { - if (minCapacity < 0) { - throw new OutOfMemoryError(); - } - return (minCapacity > (Integer.MAX_VALUE)) ? Integer.MAX_VALUE : Integer.MAX_VALUE - 8; - } - - /** - * 添加指定索引的元素 - * 判断索引是否小于0或大于size - * - * @param index - * @param e - */ - public void add(int index, E e) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); - } - isGrow(index); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = e; - size++; - } - - /** - * 根据索引获取数组中的元素 - * - * @param index - * @return - */ - public E get(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); - } - return (E) elementData[index]; - } - - /** - * 根据索引移除数组中的元素,如果移除中间的元素,后面的元素要往前移 - * - * @param index - * @return - */ - public E remove(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); - } - E oldValue = (E) elementData[index]; - - int numMoved = size - index - 1; - if (numMoved > 0) { - System.arraycopy(elementData, index + 1, elementData, index, numMoved); - elementData[--size] = null; - size--; - } - return oldValue; - } - - /** - * 获取数组中存放值得数量 - * - * @return - */ - public int size() { - return size; - } -} diff --git a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyLinkedList.java b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyLinkedList.java deleted file mode 100644 index 4aa55cb9b9..0000000000 --- a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyLinkedList.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.kevin.coding01.basic; - -/** - * Created by YinWenBing on 2017/2/25. - */ -public class MyLinkedList implements MyList { - private Node first;//头节点 - private int size = 0;//默认大小为0 - - public void add(E e) { - if (size == 0) { - first = new Node(); - first.element = e; - size++; - } else { - Node head = first; - for (int i = 0; i < size - 1; i++) { - head = head.next; - } - - Node add = new Node(); - add.element = e; - head.next = add; - size++; - } - } - - - public void add(int index, E e) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("index:" + index + ";size:" + size); - } - Node prev = getNode(index - 1);//当前索引指向的节点的上一节点 - Node next = getNode(index);//当前索引指向的节点成为添加节点的next - Node add = new Node(); - add.element = e; - prev.next = add; - add.next = next; - size++; - } - - private Node getNode(int index) { - Node node = first; - - for (int i = 0; i < index; i++) { - node = first.next; - } - - return node; - } - - public E get(int index) { - if (index < 0 || index > size - 1) { - throw new IndexOutOfBoundsException("index:" + index + ";size:" + size); - } - - if (size == 0) { - return null; - } - - return getNode(index).element; - } - - public E remove(int index) { - if (index < 0 || index > size - 1) { - throw new IndexOutOfBoundsException("index:" + index + ";size:" + size); - } - - Node prev = getNode(index - 1); - Node next = getNode(index + 1); - - prev.next = next; - return getNode(index).element; - } - - public int size() { - return size; - } - - public void addFirst(E e) { - if (size == 0) { - first = new Node(); - first.element = e; - size++; - } else { - Node add = new Node(); - add.element = e; - add.next = first; - first = add; - size++; - } - } - - public void addLast(E e) { - Node oldLast = getNode(size - 1); - Node add = new Node(); - add.element = e; - oldLast.next = add; - size++; - } - - public E removeFirst() { - Node oldFirst = first; - if (first.next != null) { - first = first.next; - size--; - return (E) oldFirst.element; - } else {//只有一个节点或者一个节点也没有 - first = null; - return null; - } - } - - public E removeLast() { - Node last = getNode(size - 1); - if (last != null) { - E element = (E) last.element; - Node newLast = getNode(size - 2); - newLast.next = null; - size--; - return element; - } else { //一个节点都不存在 - return null; - } - } - - /** - * 静态内部类 - */ - private static class Node { - E element;//节点数据 - Node next;//下一节点 - } - -} diff --git a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyList.java b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyList.java deleted file mode 100644 index 15758bd837..0000000000 --- a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyList.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.kevin.coding01.basic; - -/** - * Created by YinWenBing on 2017/2/25. - */ -public interface MyList { - - void add(E e); - - void add(int index, E e); - - E get(int index); - - E remove(int index); - - int size(); -} diff --git a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyQueue.java b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyQueue.java deleted file mode 100644 index feff484d76..0000000000 --- a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyQueue.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.kevin.coding01.basic; - -/** - * 队列:先进先出 - * Created by YinWenBing on 2017/2/25. - */ -public class MyQueue { - private MyLinkedList elementDate = new MyLinkedList(); - - //入队列 - public void enQueue(E e) { - elementDate.addLast(e); - } - - //出队列 - public E deQueue() { - return elementDate.removeFirst(); - } - - public boolean isEmpty() { - return elementDate.size() == 0 ? true : false; - } - - public int size() { - return elementDate.size(); - } - - public static void main(String[] args) { - MyQueue queue = new MyQueue(); - queue.enQueue(1); - queue.enQueue(2); - - System.out.println(queue.deQueue());//1 - } -} diff --git a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyStack.java b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyStack.java deleted file mode 100644 index 10d115d052..0000000000 --- a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyStack.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.kevin.coding01.basic; - -/** - * 栈 先进后出 - * Created by YinWenBing on 2017/2/25. - */ -public class MyStack { - private MyArrayList elementData = new MyArrayList(); - - /** - * 往栈中添加元素 - * - * @param e - */ - public void push(E e) { - elementData.add(e); - } - - /** - * 删除栈顶元素 - * - * @return - */ - public E pop() { - return elementData.remove(elementData.size() - 1); - } - - /** - * 返回栈顶元素 - * - * @return - */ - public E peek() { - return elementData.get(elementData.size() - 1); - } - - /** - * 是否为空 - * - * @return - */ - public boolean isEmpty() { - return elementData.size() == 0 ? true : false; - } - - /** - * 返回栈中元素的数量 - * - * @return - */ - public int size() { - return elementData.size(); - } - - - public static void main(String[] args) { - MyStack myStack = new MyStack(); - myStack.push("A"); - myStack.push("B"); - myStack.push("C"); - - System.out.println(myStack.peek()); - System.out.println(myStack.pop()); - System.out.println(myStack.peek()); - System.out.println(myStack.size()); - } -} diff --git "a/group04/349184132/post/CPU\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.docx" "b/group04/349184132/post/CPU\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.docx" deleted file mode 100644 index 72f97352ac6772fc4dfa42578b3bdf2bcab88e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11099 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 XA} size-1) - throw new IllegalArgumentException(); - } - public void add(int index, Object o){ - rangeCheck(index); - System.arraycopy(elementData,index,elementData,index+1,size-index); - elementData[index] = o; - size++; - } - - - public Object get(int index){ - rangeCheck(index); - return elementData[index]; - } - - public Object remove(int index){ - rangeCheck(index); - Object oldElement = elementData[index]; - System.arraycopy(elementData,index+1,elementData,index,size-index-1); - size--; - return oldElement; - } - - public int size(){ - return size; - } - public boolean isEmpty(){ return size==0; } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator{ - private int pos = 0; - @Override - public boolean hasNext() { - return possize) - throw new IllegalArgumentException(); - return elementData[pos++]; - } - - } - - public static void main(String[] args) { - ArrayList list = new ArrayList(); - list.add(1); - list.add("str"); - list.add(new Date()); - - - - Iterator iter = list.iterator(); - while(iter.hasNext()){ - System.out.println(iter.next()); - } - list.add(2,123); - list.add(0,15); - Iterator iter2 = list.iterator(); - while(iter2.hasNext()){ - System.out.println(iter2.next()); - } - - - - } - - -} diff --git a/group04/349184132/src/Collection/Onehomework/BinaryTreeNode.java b/group04/349184132/src/Collection/Onehomework/BinaryTreeNode.java deleted file mode 100644 index d57fee396f..0000000000 --- a/group04/349184132/src/Collection/Onehomework/BinaryTreeNode.java +++ /dev/null @@ -1,79 +0,0 @@ -package Collection.Onehomework; - - - - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - private BinaryTreeNode root; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - - public BinaryTreeNode insert(Object o){ - BinaryTreeNode newNode =null; - if(o==null) - throw new NullPointerException("数据不能为空"); - - if(root==null){ - root = new BinaryTreeNode(); - root.setData(o); - }else { - newNode = new BinaryTreeNode(); - BinaryTreeNode nowNode = root; - int val = (int)root.getData(); - nowNode.setData(o); - while(true) { - - if ((int)newNode.getData()< val) { - if(nowNode.left==null){ - nowNode.setLeft(newNode); - break; - } else { - nowNode = nowNode.left; - } - } else if((int)newNode.getData()> val){ - if (nowNode.right==null ) { - nowNode.setRight(newNode); - break; - } else{ - nowNode = newNode.right; - - } - }else { - - throw new IllegalArgumentException("已存在元素结点"); - } - } - } - return newNode; - } - - public static void main(String[] args) { - - } - - - -} diff --git a/group04/349184132/src/Collection/Onehomework/Iterator.java b/group04/349184132/src/Collection/Onehomework/Iterator.java deleted file mode 100644 index e7c8a4f6d2..0000000000 --- a/group04/349184132/src/Collection/Onehomework/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package Collection.Onehomework; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group04/349184132/src/Collection/Onehomework/LinkedList.java b/group04/349184132/src/Collection/Onehomework/LinkedList.java deleted file mode 100644 index e2cb4ca4b1..0000000000 --- a/group04/349184132/src/Collection/Onehomework/LinkedList.java +++ /dev/null @@ -1,170 +0,0 @@ -package Collection.Onehomework; - -public class LinkedList implements List { - - private Node head; - private Node now ; - private int size = 0; - public void add(Object o){ - if(head == null) { - head = new Node(o, null); - now = head; - } - else{ - - Node node = new Node(o,null); - now.next = node; - now = node; - } - size++; - - } - private void rangeCheck(int index) { - if (index < 0 || index > size - 1) - throw new IllegalArgumentException(); - } - public void add(int index , Object o){ - rangeCheck(index); - - if(index==0){ - addFirst(o); - }else { - Node node = new Node(o,null); - Node now = head; - Node next = head; - for (int i = 1; i <= index; i++) { - next = next.next; - if (i == index) { - node.next = next; - now.next = node; - } - now = now.next; - } - size++; - } - } - - public Object get(int index){ - Node indexNode = head; - if(index==0) - return indexNode.data; - else { - - for (int i = 1; i <= index; i++) { - indexNode = indexNode.next; - if (i == index) - return indexNode.data; - } - } - return null; - } - public Object remove(int index){ - rangeCheck(index); - - if(index == 0){ - return removeFirst(); - }else { - Node pre = head; - Node now = head; - for (int i = 1; i <= index; i++) { - now = now.next; - if (i == index) { - pre.next = now.next; - } - pre = pre.next; - } - size--; - return now.data; - } - } - - public int size(){ - return size ; - } - - public boolean isEmpty(){ return size==0; } - - public void addFirst(Object o){ - Node oldhead = head; - Node newhead = new Node(o,oldhead); - head = newhead; - size++; - } - public void addLast(Object o){ - Node node = head; - while(node !=null){ - node = node.next; - if(node==null){ - Node lastnode = new Node(o,null); - node.next = lastnode; - } - } - size++; - } - public Object removeFirst(){ - Node oldhead = head; - Node newhead = head.next; - oldhead.next = null; - head = newhead; - size--; - return oldhead.data; - } - public Object removeLast(){ - Node node = head; - Node prev = head; - while(node !=null){ - node = node.next; - if(node==null){ - prev.next = null; - } - prev = prev.next; - } - size--; - return node.data; - } - public Iterator iterator(){ - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator{ - int pos = 0; - @Override - public boolean hasNext() { - return possize) - throw new IllegalArgumentException(); - return get(pos++); - } - } - private static class Node{ - Object data; - Node next; - private Node(Object data,Node next){ - this.data = data; - this.next = next; - - } - - - } - - public static void main(String[] args) { - LinkedList list = new LinkedList(); - list.add(1); - list.add(2); - list.add(3); - list.add(0,15); - list.add(1,14); - list.removeLast(); - list.addFirst(1); - list.removeFirst(); - Iterator iter = list.iterator(); - while(iter.hasNext()){ - System.out.println(iter.next()); - } - } -} diff --git a/group04/349184132/src/Collection/Onehomework/List.java b/group04/349184132/src/Collection/Onehomework/List.java deleted file mode 100644 index 015dd06102..0000000000 --- a/group04/349184132/src/Collection/Onehomework/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package Collection.Onehomework; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group04/349184132/src/Collection/Onehomework/Queue.java b/group04/349184132/src/Collection/Onehomework/Queue.java deleted file mode 100644 index 341adeeec6..0000000000 --- a/group04/349184132/src/Collection/Onehomework/Queue.java +++ /dev/null @@ -1,29 +0,0 @@ -package Collection.Onehomework; - -public class Queue { - private LinkedList elementData = new LinkedList(); - private int size = 0; - public void enQueue(Object o){ - elementData.addLast(o); - size++; - } - - public Object deQueue(){ - if(isEmpty()) - try { - throw new IllegalAccessException(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - size--; - return elementData.removeFirst(); - } - - public boolean isEmpty(){ - return size==0; - } - - public int size(){ - return size; - } -} diff --git a/group04/349184132/src/Collection/Onehomework/Stack.java b/group04/349184132/src/Collection/Onehomework/Stack.java deleted file mode 100644 index a6a488cb05..0000000000 --- a/group04/349184132/src/Collection/Onehomework/Stack.java +++ /dev/null @@ -1,34 +0,0 @@ -package Collection.Onehomework; - -public class Stack { - private ArrayList elementData = new ArrayList(); - private int size = 0; - public void push(Object o){ - elementData.add(o); - size++; - } - - - public Object pop(){ - if(isEmpty()){ - try { - throw new IllegalAccessException(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - return elementData.get(--size); - } - - public Object peek(){ - return elementData.get(size-1); - } - - public boolean isEmpty(){ - return size==0; - } - - public int size(){ - return size; - } -} diff --git a/group04/351121278/351121278/src/com/coding/basic/ArrayList.java b/group04/351121278/351121278/src/com/coding/basic/ArrayList.java deleted file mode 100644 index fd80c89662..0000000000 --- a/group04/351121278/351121278/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - //容量检查 - checkCapacity(size + 1); - elementData[size++] = o; - - } - - //对elementData数组进行容量检查 - private void checkCapacity(int minSize) { - //取得当前数组的长度 - int elementDataLength = elementData.length; - //如果最小长度大于当前数组的长度,则进行扩容 - if (minSize > elementDataLength) { - //ArrayList类扩容的长度是原来数组长度的1.5倍+1,此处参考ArrayList的长度进行扩容 - int newSize = (elementDataLength * 3) / 2 + 1; - //如果扩张后的长度还是比最小需要的长度小,则取需要的长度 - if (newSize < minSize) { - newSize = minSize; - } - //进行数据的拷贝 - elementData = Arrays.copyOf(elementData, newSize); - } - } - - public void add(int index, Object o){ - //对容量进行检查 - checkCapacity(size + 1); - //对数组进行复制,将指定索引位置空出 - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - return elementData[index]; - } - - public Object remove(int index){ - if (index > size) { - throw new IllegalArgumentException("参数不对"); - } - //size - index - Object o = elementData[index]; - int moverNum = size - index - 1; - if (moverNum > 0) { - System.arraycopy(elementData, index+1, elementData, index, moverNum); - } - //将数组最后一个元素置为null - elementData[--size] = null; - return o; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return null; - } - - -} - diff --git a/group04/351121278/351121278/src/com/coding/basic/Iterator.java b/group04/351121278/351121278/src/com/coding/basic/Iterator.java deleted file mode 100644 index 095e38e85b..0000000000 --- a/group04/351121278/351121278/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - - -public interface Iterator { - boolean hasNext(); - - Object next(); - -} \ No newline at end of file diff --git a/group04/351121278/351121278/src/com/coding/basic/LinkedList.java b/group04/351121278/351121278/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 5428802926..0000000000 --- a/group04/351121278/351121278/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - private int size = 0; - - public void add(Object o){ - addLast(o); - } - public void add(int index , Object o){ - - for (int i = 0; i <= index; i++) { - head = head.next; - } - Node head = this.head; - Node node = new Node(); - this.head.next = node; - node.data = o; - node.next = head.next; - size++; - } - public Object get(int index){ - for (int i = 0; i <= index; i++) { - head = head.next; - } - return head.data; - } - public Object remove(int index){ - for (int i = 0; i < index; i++) { - head = head.next; - } - Node head = this.head; - Object data = head.next.data; - Node next = this.head.next.next; - head.next = next; - return data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node node = new Node(); - node.next = head; - node.data = o; - size++; - } - public void addLast(Object o){ - Node node = new Node(); - head.next = node; - node.data = o; - node.next = null; - size++; - } - public Object removeFirst(){ - Object data = head.data; - head.next = null; - return data; - } - public Object removeLast(){ - for (int i = 0; i < size; i++) { - head = head.next; - } - Object data = head.next.data; - head.next = null; - return data; - } - public Iterator iterator(){ - return null; - } - - private static class Node{ - Object data; - Node next; - } -} \ No newline at end of file diff --git a/group04/351121278/351121278/src/com/coding/basic/List.java b/group04/351121278/351121278/src/com/coding/basic/List.java deleted file mode 100644 index ee8ab69781..0000000000 --- a/group04/351121278/351121278/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} \ No newline at end of file diff --git a/group04/351121278/351121278/src/com/coding/basic/Queue.java b/group04/351121278/351121278/src/com/coding/basic/Queue.java deleted file mode 100644 index 25737e5206..0000000000 --- a/group04/351121278/351121278/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private ArrayList elementData = new ArrayList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - Object remove = elementData.remove(0); - return remove; - } - - public boolean isEmpty(){ - return elementData.size() == 0; - } - - public int size(){ - return elementData.size(); - } -} \ No newline at end of file diff --git a/group04/351121278/351121278/src/com/coding/basic/Stack.java b/group04/351121278/351121278/src/com/coding/basic/Stack.java deleted file mode 100644 index fd3548a241..0000000000 --- a/group04/351121278/351121278/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - Object remove = elementData.remove(elementData.size() - 1); - return remove; - } - - public Object peek(){ - return elementData.get(elementData.size() - 1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} \ No newline at end of file diff --git a/group04/474772605/.classpath b/group04/474772605/.classpath deleted file mode 100644 index 28e2b79383..0000000000 --- a/group04/474772605/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group04/474772605/.gitignore b/group04/474772605/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group04/474772605/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group04/474772605/.project b/group04/474772605/.project deleted file mode 100644 index fab8d7f04c..0000000000 --- a/group04/474772605/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group04/474772605/.settings/org.eclipse.jdt.core.prefs b/group04/474772605/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 416f4fb696..0000000000 --- a/group04/474772605/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/group04/474772605/src/com/coding/basic/ArrayList.java b/group04/474772605/src/com/coding/basic/ArrayList.java deleted file mode 100644 index de945501c2..0000000000 --- a/group04/474772605/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - private int length = 1; - - private Object[] elementData = new Object[length]; - - public void add(Object o){ - System.out.println("进行add方法"); - capacity(size+1); - System.out.println(elementData.length); - elementData[size++] = o; - //size++; - } - public void add(int index, Object o){ - capacity(size+1); - System.arraycopy(elementData, index, elementData, index+1, size-index); - elementData[index] = o ; - } - - public Object get(int index){ - System.out.println("进行get方法"); - return elementData[index]; - } - - public Object remove(int index){ - System.out.println("进行remove方法"); - if(index>size){ - return elementData; - } - System.arraycopy(elementData, index+1, elementData, index, size-index-1); - elementData[--size]=null; - System.out.println(size); - return elementData; - } - - public int size(){ - return this.size; - } - - public Iterator iterator(){ - return new Iterarorimp(this.elementData); - } - - public class Iterarorimp implements Iterator{ - - int index; - Object[] data = null; - - public Iterarorimp(Object[] data){ - this.data = data; - } - - - public boolean hasNext() { - if(index>=data.length){ - return false; - } - return true; - } - - - public Object next() { - - return this.data[index++]; - } - - - } - - - - public void capacity(int newlength) { - System.out.println("进行扩容方法"); - if(newlength>length){ - Object[] newelementData = new Object[length*2]; - System.arraycopy(elementData, 0, newelementData, 0, size); - this.elementData = newelementData; - length = length*2; - } - } - -} diff --git a/group04/474772605/src/com/coding/basic/BinaryTreeNode.java b/group04/474772605/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group04/474772605/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group04/474772605/src/com/coding/basic/Dinkedlist.java b/group04/474772605/src/com/coding/basic/Dinkedlist.java deleted file mode 100644 index f3b9de03f2..0000000000 --- a/group04/474772605/src/com/coding/basic/Dinkedlist.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Dinkedlist { -public static void main(String[] args) { - LinkedList linkedlist = new LinkedList(); - String o = "1234"; - String a = "aaaaaaaa"; - String v = "vvvvvvvv"; - linkedlist.add(o); - linkedlist.add(1,a); - linkedlist.add(2,v); - linkedlist.removeLast(); - for(int i =0 ; iindex){ - Node newnode = new Node(); - newnode.data = o; - Node nodefirst = new Node(); - Node nodelast = new Node(); - int amount =1; - Node first = head; - while(first.next !=null){ - if(amount+1 == index){ - nodefirst.next = newnode; - nodelast = first.next; - newnode.next = nodelast; - size++; - } - first = first.next; - amount++; - } - } - if(size==index){ - - Node node = new Node(); - node.data = o; - last.next =node; - last = node; - size++; - - } - } - public Object get(int index){ - int amount = 0; - Node newnode = head; - while(newnode.next !=null){ - if(amount==index){ - return newnode.data; - } - amount++; - newnode = newnode.next; - } - return newnode.data; - } - public Object remove(int index){ - - if(index ==0){ - removeFirst(); - } - int amount =0; - Node first = head; - Node remove = new Node(); - while(first.next!=null){ - if(amount+1==index){ - remove = first.next; - first.next = remove.next; - size--; - return remove.data; - } - first = first.next; - amount++; - } - return null; - } - - public int size(){ - return this.size; - } - - public void addFirst(Object o){ - Node newhead =new Node(); - newhead.data=o; - newhead.next = head; - head = newhead; - size++; - - } - public void addLast(Object o){ - add(o); - - } - public Object removeFirst(){ - Object removedata = new Object(); - removedata = head.data; - head = head.next; - size--; - return removedata; - - } - public Object removeLast(){ - Node last = head; - Node cache =new Node(); - while(last.next !=null){ - cache = last; - last = last.next; - } - cache.next =null; - size--; - return last.data; - - } - public Iterator iterator(){ - return new Iteratorimp(this.head); - } - public class Iteratorimp implements Iterator{ - Node newnode = new Node(); - public Iteratorimp(Node node){ - this.newnode = node; - } - - public boolean hasNext() { - if(newnode.next ==null){ - return false; - } - return true; - } - - public Object next() { - newnode = newnode.next; - return newnode.data; - } - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group04/474772605/src/com/coding/basic/List.java b/group04/474772605/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group04/474772605/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group04/474772605/src/com/coding/basic/Queue.java b/group04/474772605/src/com/coding/basic/Queue.java deleted file mode 100644 index 29ea3f95ff..0000000000 --- a/group04/474772605/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class Queue { - Object[] elementData; - int maxsize; - int size =0; - int head=0; - int last=-1; - public Queue(int i){ - maxsize = i; - elementData = new Object[maxsize]; - } - - public void enQueue(Object o){ - - if(size == maxsize){ - throw new IllegalStateException("Queue full"); - } - elementData[size++]=o; - last=size; - - } - - public Object deQueue(){ - - return null; - } - - public boolean isEmpty(){ - if(this.size==0){ - return true; - } - - return false; - } - - public int size(){ - return this.size; - } -} diff --git a/group04/474772605/src/com/coding/basic/Stack.java b/group04/474772605/src/com/coding/basic/Stack.java deleted file mode 100644 index 7a5a56bdf0..0000000000 --- a/group04/474772605/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - int size =0; - - public void push(Object o){ //入栈 - elementData.add(o); - size++; - } - - public Object pop(){ //移走栈顶对象,将该对象作为函数值返回 - Object top = elementData.get(size); - elementData.remove(size); - size--; - return top; - } - - public Object peek(){//查找栈顶对象,而不从栈中移走 - return elementData.get(size); - } - public boolean isEmpty(){ - if(this.size ==0){ - return true; - } - return false; - } - public int size(){ - return this.size; - } -} diff --git a/group04/474772605/src/com/coding/basic/testarraylist.java b/group04/474772605/src/com/coding/basic/testarraylist.java deleted file mode 100644 index df5e814ccf..0000000000 --- a/group04/474772605/src/com/coding/basic/testarraylist.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class testarraylist { - public static void main(String[] args) { - ArrayList abc = new ArrayList(); - String i = "aaa"; - String y = "bbb"; - Object o = new Object(); - - - abc.add(i); - System.out.println(abc.get(0)); - // System.out.println(abc.get(1)); - abc.add(y); - System.out.println(abc.get(0)); - System.out.println(abc.get(1)); - abc.remove(1); - System.out.println(abc.get(0)); - System.out.println(abc.get(1)); - } - -} diff --git a/group04/498654356/one/.classpath b/group04/498654356/one/.classpath deleted file mode 100644 index ebfd4f69f3..0000000000 --- a/group04/498654356/one/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/group04/498654356/one/.gitignore b/group04/498654356/one/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group04/498654356/one/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group04/498654356/one/.project b/group04/498654356/one/.project deleted file mode 100644 index 3cad565ebc..0000000000 --- a/group04/498654356/one/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 498654356Learning_one - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group04/498654356/one/src/org/coding/one/ArrayList.java b/group04/498654356/one/src/org/coding/one/ArrayList.java deleted file mode 100644 index a68026101b..0000000000 --- a/group04/498654356/one/src/org/coding/one/ArrayList.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.coding.one; - -import java.util.Arrays; - -public class ArrayList implements List { - - /** - * 用于存放数据的数组 - */ - private Object[] elementData; - - /** - * 记录 ArrayList 中存放元素的个数 - */ - private int size; - - /** - * ArrayList 的默认的初始容量值 - */ - private static final int DEFAULT_CAPACITY = 10; - - public ArrayList() { - this.elementData = new Object[DEFAULT_CAPACITY]; - } - - @Override - public void add(Object o) { - ensureGrow(); - this.elementData[size++] = o; - } - - private void grow(int capacity) { - this.elementData = Arrays.copyOf(this.elementData, capacity); - } - - @Override - public void add(int index, Object o) { - checkRangeIndex(index); - ensureGrow(); - System.arraycopy(this.elementData, index, this.elementData, index + 1, this.size - index); - this.elementData[index] = o; - this.size ++; - } - - private void ensureGrow() { - if(this.size == this.elementData.length) { //扩容 - grow(this.size + 1); - } - } - - @Override - public Object get(int index) { - checkGetValIndex(index); - return this.elementData[index]; - } - - private void checkGetValIndex(int index) { - if(index < 0 || index >= this.size) { //越界 - throw new IndexOutOfBoundsException("Index: "+index+", Size: "+ this.size); - } - - } - - private void checkRangeIndex(int index) { - if(index < 0 || index > this.size) { //越界 - throw new IndexOutOfBoundsException("Index: "+index+", Size: "+ this.size); - } - } - - @Override - public Object remove(int index) { - checkGetValIndex(index); - Object oldVal = this.elementData[index]; - this.elementData[index] = null; //释放引用 - System.arraycopy(this.elementData, index + 1, this.elementData, index, this.size - index -1); - this.size--; - return oldVal; - } - - @Override - public int size() { - return this.size; - } - - @Override - public boolean isEmpty() { - return this.size == 0; - } - - @Override - public String toString() { - return "ArrayList [elementData=" + Arrays.toString(elementData) + ", size=" + size + "]"; - } - -} diff --git a/group04/498654356/one/src/org/coding/one/BinaryTreeNode.java b/group04/498654356/one/src/org/coding/one/BinaryTreeNode.java deleted file mode 100644 index 3e2f9c149b..0000000000 --- a/group04/498654356/one/src/org/coding/one/BinaryTreeNode.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.coding.one; - -@SuppressWarnings( {"unchecked", "rawtypes"}) -public class BinaryTreeNode { - - private Comparable data; - private BinaryTreeNode left; - private BinaryTreeNode right; - public BinaryTreeNode(Comparable data, BinaryTreeNode left, BinaryTreeNode right) { - super(); - this.data = data; - this.left = left; - this.right = right; - } - public Object getData() { - return data; - } - public void setData(Comparable data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Comparable val){ - return doInsert(this, val); - } - - private BinaryTreeNode doInsert(BinaryTreeNode node, Comparable val) { - if(node == null) { - return null; - } - if(val.compareTo(node.data) == 0) { - return node; - } - if(val.compareTo(node.data) > 0) { - if(node.right == null) { - BinaryTreeNode rightNode = new BinaryTreeNode(val, null, null); - node.right = rightNode; - return rightNode; - } - return doInsert(node.right, val); - } else { - if(node.left == null) { - BinaryTreeNode leftNode = new BinaryTreeNode(val, null, null); - node.left = leftNode; - return leftNode; - } - return doInsert(node.left, val); - } - } - -} diff --git a/group04/498654356/one/src/org/coding/one/LinkedList.java b/group04/498654356/one/src/org/coding/one/LinkedList.java deleted file mode 100644 index 183f634418..0000000000 --- a/group04/498654356/one/src/org/coding/one/LinkedList.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.coding.one; - -public class LinkedList implements List { - - private Node first; - - private Node last; - - private int size = 0; - - @Override - public void add(Object o) { - Node newNode = new Node(o, null); - if(this.last != null) { - this.last.next = newNode; - this.last = newNode; - } else { - this.first = newNode; - this.last = newNode; - } - this.size++; - } - - @Override - public void add(int index, Object o) { - checkIndex(index); - if(index == 0) { //first - Node newNode = new Node(o, this.first); - this.first = newNode; - if(this.last == null) { //通过该方法放入第一个元素时 - this.last = newNode; - } - this.size++; - } else if (index == this.size) { //last - add(o); - } else { - Node preNode = findNode(index - 1); - Node nextNode = preNode.next; - Node newNode = new Node(o, nextNode); - preNode.next = newNode; - this.size++; - } - } - - /** - * 通过角标获取对应的 Node 对象 - * @param index (0 <= index < size) - * @return - */ - private Node findNode(int index) { - Node node = this.first; - for(int i = 1; i <= index ; i++) { - node = node.next; - } - - return node; - } - - /** - * 0 <= index <= size - * @param index - */ - private void checkIndex(int index) { - if(index < 0 || index > this.size) { - throw new IndexOutOfBoundsException("Index: "+index+", Size: "+ this.size); - } - } - - @Override - public Object get(int index) { - checkRangeIndex(index); - return findNode(index).data; - } - - /** - * 0 <= index < size - * @param index - */ - private void checkRangeIndex(int index) { - if(index < 0 || index > this.size - 1) { - throw new IndexOutOfBoundsException("Index: "+index+", Size: "+ this.size); - } - } - - @Override - public Object remove(int index) { - checkRangeIndex(index); - Node oldNode = null; - if(index == 0) { - oldNode = this.first; - this.first = oldNode.next; - } else { - Node preNode = findNode(index - 1); - oldNode = preNode.next; - preNode.next = oldNode.next; - } - oldNode.next = null; - this.size--; - return oldNode.data; - } - - @Override - public int size() { - return this.size; - } - - @Override - public boolean isEmpty() { - return this.size == 0; - } - - public void addFirst(Object o){ - add(0, o); - } - - public void addLast(Object o){ - add(this.size, o); - } - - public Object removeFirst(){ - return remove(0); - } - - public Object removeLast(){ - return remove(size - 1); - - } - - private static class Node { - private Object data; - private Node next; - public Node(Object data, Node next) { - super(); - this.data = data; - this.next = next; - } - } -} diff --git a/group04/498654356/one/src/org/coding/one/List.java b/group04/498654356/one/src/org/coding/one/List.java deleted file mode 100644 index 6c558a2f64..0000000000 --- a/group04/498654356/one/src/org/coding/one/List.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.coding.one; - -public interface List { - - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); - - public boolean isEmpty(); -} diff --git a/group04/498654356/one/src/org/coding/one/Queue.java b/group04/498654356/one/src/org/coding/one/Queue.java deleted file mode 100644 index 82b9848d67..0000000000 --- a/group04/498654356/one/src/org/coding/one/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.coding.one; - -public class Queue { - - private LinkedList dataElement = new LinkedList(); - - public void enQueue(Object o){ - dataElement.addLast(o); - } - - public Object deQueue(){ - return dataElement.removeFirst(); - } - - public boolean isEmpty(){ - return dataElement.isEmpty(); - } - - public int size(){ - return dataElement.size(); - } -} diff --git a/group04/498654356/one/src/org/coding/one/Stack.java b/group04/498654356/one/src/org/coding/one/Stack.java deleted file mode 100644 index e66d6fe7be..0000000000 --- a/group04/498654356/one/src/org/coding/one/Stack.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.coding.one; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(0, o); - } - - public Object pop(){ - return elementData.remove(0); - } - - public Object peek(){ - return elementData.get(0); - } - - public boolean isEmpty(){ - return elementData.isEmpty(); - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group04/498654356/one/test/org/coding/one/AllTests.java b/group04/498654356/one/test/org/coding/one/AllTests.java deleted file mode 100644 index 316e8a4143..0000000000 --- a/group04/498654356/one/test/org/coding/one/AllTests.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.coding.one; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@SuiteClasses({ ArrayListTest.class, BinaryTreeNodeTest.class, LinkedListTest.class, QueueTest.class, StackTest.class }) -public class AllTests { - -} diff --git a/group04/498654356/one/test/org/coding/one/ArrayListTest.java b/group04/498654356/one/test/org/coding/one/ArrayListTest.java deleted file mode 100644 index 1a33b95fa3..0000000000 --- a/group04/498654356/one/test/org/coding/one/ArrayListTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.coding.one; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class ArrayListTest { - - private ArrayList target; - private int size = 15; - - @Before - public void setUp() throws Exception { - this.target = new ArrayList(); - } - - @After - public void tearDown() throws Exception { - this.target = null; - } - - @Test - public void testAddObject() { - addElement(size); - Assert.assertFalse(target.isEmpty()); - Assert.assertEquals(size, target.size()); - for(int i = 0; i < size; i++) { - Assert.assertEquals(i, ((Integer)target.get(i)).intValue()); - } -// System.out.println(target); - } - - private void addElement(int size) { - for(int i = 0; i < size; i++) { - target.add(i); - } - } - - @Test - public void testAddIntObject() { - addElement(size); - int destIndex = 1; - int destVal = 11; - target.add(destIndex, destVal); - Assert.assertEquals(destVal, target.get(destIndex)); - Assert.assertEquals(size + 1, target.size()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testAddIntObjectException() { - target.add(1, 5); - } - - @Test - public void testGet() { - addElement(size); - Assert.assertEquals(1, ((Integer)target.get(1)).intValue()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testGetException() { - addElement(size); - target.get(size); - } - - @Test - public void testRemove() { - addElement(size); - int val = (int) target.remove(0); - Assert.assertEquals(0, val); - Assert.assertEquals(size -1, target.size()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testRemoveException() { - addElement(size); - target.remove(size); - } - - @Test - public void testSize() { - Assert.assertEquals(0, target.size()); - addElement(size); - Assert.assertEquals(size, target.size()); - } - - @Test - public void testIsEmpty() { - Assert.assertTrue(target.isEmpty()); - addElement(size); - Assert.assertFalse(target.isEmpty()); - } - -} diff --git a/group04/498654356/one/test/org/coding/one/BinaryTreeNodeTest.java b/group04/498654356/one/test/org/coding/one/BinaryTreeNodeTest.java deleted file mode 100644 index a1f9670329..0000000000 --- a/group04/498654356/one/test/org/coding/one/BinaryTreeNodeTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.coding.one; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class BinaryTreeNodeTest { - - private BinaryTreeNode target; - - @Before - public void setUp() throws Exception { - target = new BinaryTreeNode(100, null, null); - } - - @After - public void tearDown() throws Exception { - target = null; - } - - @Test - public void testInsert() { - target.insert(70); - target.insert(60); - target.insert(80); - - target.insert(120); - target.insert(110); - target.insert(130); - - BinaryTreeNode left = target.getLeft(); - Assert.assertEquals(70, left.getData()); - Assert.assertEquals(60, left.getLeft().getData()); - Assert.assertEquals(80, left.getRight().getData()); - - BinaryTreeNode right = target.getRight(); - Assert.assertEquals(120, right.getData()); - Assert.assertEquals(110, right.getLeft().getData()); - Assert.assertEquals(130, right.getRight().getData()); - - } - -} diff --git a/group04/498654356/one/test/org/coding/one/LinkedListTest.java b/group04/498654356/one/test/org/coding/one/LinkedListTest.java deleted file mode 100644 index 2ba9f1c6e5..0000000000 --- a/group04/498654356/one/test/org/coding/one/LinkedListTest.java +++ /dev/null @@ -1,194 +0,0 @@ -package org.coding.one; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class LinkedListTest { - - private LinkedList target; - private int size = 5; - - @Before - public void setUp() throws Exception { - this.target = new LinkedList(); - } - - @After - public void tearDown() throws Exception { - this.target = null; - } - - @Test - public void testAddObject() { - target.add(1); - Assert.assertEquals(1, ((Integer)target.get(0)).intValue()); - Assert.assertEquals(1, target.size()); - } - - @Test - public void testAddIntObjectFirst() { - target.add(0, 1); - Assert.assertEquals(1, ((Integer)target.get(0)).intValue()); - Assert.assertEquals(1, target.size()); - } - - @Test - public void testAddIntObject() { - addElement(); - target.add(2, 22); - Assert.assertEquals(22, ((Integer)target.get(2)).intValue()); - Assert.assertEquals(size + 1, target.size()); - } - - private void addElement() { - for(int i = 0; i < size; i++) { - target.add(i); - } - } - - @Test - public void testAddIntObjectLast() { - addElement(); - target.add(size, 100); - Assert.assertEquals(100, ((Integer)target.get(size)).intValue()); - Assert.assertEquals(size + 1, target.size()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testAddIntObjectException() { - target.add(-1, 3); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testAddIntObjectException2() { - addElement(); - target.add(size + 1, 100); - } - - - @Test - public void testGet() { - addElement(); - Assert.assertEquals(4, target.get(4)); - } - - @Test - public void testGetFirst() { - addElement(); - Assert.assertEquals(0, target.get(0)); - } - - - @Test(expected = IndexOutOfBoundsException.class) - public void testGetException() { - addElement(); - target.get(size); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testGetException2() { - addElement(); - target.get(-1); - } - - @Test - public void testRemove() { - addElement(); - int dest = (int) target.remove(2); - Assert.assertEquals(2, dest); - Assert.assertEquals(4, target.size()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testEmptyObjRemove() { - target.remove(0); - } - - @Test - public void testRemoveFirst2() { - addElement(); - int dest = (int) target.remove(0); - Assert.assertEquals(0, dest); - Assert.assertEquals(4, target.size()); - } - - @Test - public void testRemoveLast2() { - addElement(); - int dest = (int) target.remove(size - 1); - Assert.assertEquals(4, dest); - Assert.assertEquals(4, target.size()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testRemoveException() { - addElement(); - target.remove( - 1); - } - - - @Test(expected = IndexOutOfBoundsException.class) - public void testRemoveException2() { - addElement(); - target.remove(size); - } - - @Test - public void testSize() { - Assert.assertEquals(0, target.size()); - addElement(); - Assert.assertEquals(size, target.size()); - } - - @Test - public void testIsEmpty() { - Assert.assertTrue(target.isEmpty()); - addElement(); - Assert.assertFalse(target.isEmpty()); - } - - @Test - public void testAddFirst() { - addElement(); - target.addFirst(100); - Assert.assertEquals(100, target.get(0)); - } - - @Test - public void testAddLast() { - addElement(); - target.addLast(100); - Assert.assertEquals(100, target.get(size)); - } - - @Test - public void testRemoveFirst() { - addElement(); - int dest = (int) target.removeFirst(); - Assert.assertEquals(0, dest); - Assert.assertEquals(size - 1 , target.size()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testRemoveFirstException() { - target.removeFirst(); - } - - @Test - public void testRemoveLast() { - addElement(); - int dest = (int) target.removeLast(); - Assert.assertEquals(4, dest); - Assert.assertEquals(size - 1, target.size()); - } - - @Test - public void testRemoveLast_one() { - target.add(4); - int dest = (int) target.removeLast(); - Assert.assertEquals(4, dest); - Assert.assertEquals(0, target.size()); - } -} diff --git a/group04/498654356/one/test/org/coding/one/QueueTest.java b/group04/498654356/one/test/org/coding/one/QueueTest.java deleted file mode 100644 index 9549bab245..0000000000 --- a/group04/498654356/one/test/org/coding/one/QueueTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.coding.one; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class QueueTest { - - private Queue target; - - @Before - public void setUp() throws Exception { - target = new Queue(); - } - - @After - public void tearDown() throws Exception { - target = null; - } - - @Test - public void testEnQueue() { - Assert.assertEquals(0, target.size()); - target.enQueue(1); - target.enQueue(2); - Assert.assertEquals(2, target.size()); - } - - @Test - public void testDeQueue() { - Assert.assertEquals(0, target.size()); - target.enQueue(1); - target.enQueue(2); - Assert.assertEquals(2, target.size()); - Assert.assertEquals(1, target.deQueue()); - Assert.assertEquals(2, target.deQueue()); - Assert.assertEquals(0, target.size()); - } - - @Test - public void testIsEmpty() { - Assert.assertTrue(target.isEmpty()); - target.enQueue(1); - Assert.assertFalse(target.isEmpty()); - target.deQueue(); - Assert.assertTrue(target.isEmpty()); - } - - @Test - public void testSize() { - Assert.assertEquals(0, target.size()); - target.enQueue(1); - Assert.assertEquals(1, target.size()); - target.deQueue(); - Assert.assertEquals(0, target.size()); - } - -} diff --git a/group04/498654356/one/test/org/coding/one/StackTest.java b/group04/498654356/one/test/org/coding/one/StackTest.java deleted file mode 100644 index ec8886ace0..0000000000 --- a/group04/498654356/one/test/org/coding/one/StackTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.coding.one; - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class StackTest { - - private Stack target; - - @Before - public void setUp() throws Exception { - target = new Stack(); - } - - @After - public void tearDown() throws Exception { - target = null; - } - - @Test - public void testPush() { - Assert.assertEquals(0, target.size()); - target.push(1); - Assert.assertEquals(1, target.peek()); - Assert.assertEquals(1, target.size()); - } - - @Test - public void testPop() { - target.push(1); - target.push(2); - Assert.assertEquals(2, target.pop()); - Assert.assertEquals(1, target.size()); - Assert.assertEquals(1, target.pop()); - Assert.assertEquals(0, target.size()); - } - - @Test - public void testPeek() { - target.push(1); - target.push(2); - Assert.assertEquals(2, target.peek()); - Assert.assertEquals(2, target.size()); - Assert.assertEquals(2, target.peek()); - Assert.assertEquals(2, target.size()); - } - - @Test - public void testIsEmpty() { - Assert.assertTrue(target.isEmpty()); - target.push(1); - Assert.assertFalse(target.isEmpty()); - target.pop(); - Assert.assertTrue(target.isEmpty()); - } - - @Test - public void testSize() { - Assert.assertEquals(0, target.size()); - target.push(1); - Assert.assertEquals(1, target.size()); - target.pop(); - Assert.assertEquals(0, target.size()); - } - -} diff --git a/group04/564451732/.classpath b/group04/564451732/.classpath deleted file mode 100644 index 2bdfdc1bf0..0000000000 --- a/group04/564451732/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group04/564451732/.gitignore b/group04/564451732/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group04/564451732/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group04/564451732/.project b/group04/564451732/.project deleted file mode 100644 index 23af4c7791..0000000000 --- a/group04/564451732/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 564451732 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group04/564451732/src/DataStructureTest.java b/group04/564451732/src/DataStructureTest.java deleted file mode 100644 index 2f5cc27a94..0000000000 --- a/group04/564451732/src/DataStructureTest.java +++ /dev/null @@ -1,114 +0,0 @@ -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - -import hw1.ArrayListImpl; -import hw1.BinaryTreeNode; -import hw1.LinkedList; -import hw1.QueueImpl; -import hw1.StackImpl; - -public class DataStructureTest { - - @Test - public void ArrayListTest() { - ArrayListImpl al = new ArrayListImpl(); - Object o1 = new Object(); - Object o2 = new Object(); - Object o3 = new Object(); - al.add(new Object()); - al.add(new Object()); - assertTrue(al.size() == 2); - al.add(5); - assertFalse(al.size() == 2); - assertTrue(al.size() == 3); - al.add(2, 3); - //System.out.println((int)al.get(2)); - assertTrue((int)al.get(2) == 3); - assertTrue((int)al.get(3) == 5); - } - - @Test - public void LinkedListTest() { - LinkedList ll = new LinkedList(); - Object o1 = new Object(); - Object o2 = new Object(); - Object o3 = new Object(); - Object o4 = new Object(); - Object o5 = new Object(); - Object o6 = new Object(); - ll.add(o1); - ll.add(o2); - //System.out.println(ll.size()); - assertTrue(ll.size() == 2); - ll.add(o3); - ll.add(1,1); - assertTrue((int)ll.get(1) == 1); - assertTrue(ll.size() == 4); - ll.addFirst(2); - ll.addLast(4); - assertTrue((int)ll.get(0) == 2); - assertTrue((int)ll.get(ll.size() - 1) == 4); - assertTrue((int)ll.get(2) == 1); - ll.remove(2); - assertTrue(ll.get(2) == o2); - //System.out.print((int)ll.remove(2)); - //System.out.println((int)ll.get(2)); - //assertFalse((int)ll.get(2) == 1); - assertTrue(ll.size() == 5); - assertTrue((int)ll.removeFirst() == 2); - assertTrue(ll.size() == 4); - assertTrue((int)ll.removeLast() == 4); - assertTrue(ll.size() == 3); - } - - @Test - public void QueueTest(){ - QueueImpl qi = new QueueImpl(); - assertTrue(qi.isEmpty()); - qi.enQueue(1); - qi.enQueue(2); - qi.enQueue(3); - assertTrue(qi.size() == 3); - assertTrue((int)qi.deQueue() == 1); - assertTrue(qi.size() == 2); - assertFalse(qi.isEmpty()); - } - - @Test - public void StackTest() { - StackImpl stack = new StackImpl(); - assertTrue(stack.isEmpty()); - stack.push(1); - stack.push(2); - stack.push(3); - assertTrue(stack.size() == 3); - assertTrue((int)stack.pop() == 3); - assertTrue(stack.size() == 2); - assertTrue((int)stack.peek() == 2); - assertFalse(stack.isEmpty()); - } - - @Test - public void BinaryTreeTest() { - BinaryTreeNode bt = new BinaryTreeNode(); - Integer i1 = 1; - Integer i2 = 3; - Integer i3 = 4; - Integer i4 = 6; - Integer i5 = -1; - bt.insert(i3); - bt.insert(i1); - bt.insert(i4); - bt.insert(i2); - bt.insert(i5); - assertTrue((int)bt.getRoot().getData() == 4); - assertTrue((int)bt.getRoot().getLeft().getData() == 1); - assertTrue((int)bt.getRoot().getRight().getData() == 6); - assertTrue((int)bt.getRoot().getLeft().getLeft().getData() == -1); - assertTrue((int)bt.getRoot().getLeft().getRight().getData() == 3); - - } - -} diff --git a/group04/564451732/src/Test.java b/group04/564451732/src/Test.java deleted file mode 100644 index 3335242a80..0000000000 --- a/group04/564451732/src/Test.java +++ /dev/null @@ -1,8 +0,0 @@ - -public class Test { - - public static void main(String[] args) { - - } - -} diff --git a/group04/564451732/src/hw1/ArrayListImpl.java b/group04/564451732/src/hw1/ArrayListImpl.java deleted file mode 100644 index fe42bfc4f7..0000000000 --- a/group04/564451732/src/hw1/ArrayListImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -package hw1; - -//import java.util.ArrayList; -import java.util.Iterator; -//import java.util.List; - -import com.sun.xml.internal.ws.api.pipe.ThrowableContainerPropertySet; - -public class ArrayListImpl implements List { - -private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - //size++; - try{ - if (size < elementData.length) { - elementData[size] = o; - } else { - elementData = grow(elementData, elementData.length); - elementData[size] = o; - } - size++; - } catch (IndexOutOfBoundsException e) { - System.out.println("The added index is out of bound"); - } - } - public void add(int index, Object o){ - if (index < 0) { - throw new IndexOutOfBoundsException("Index cannot be less than 0"); - } - while (index >= elementData.length) { - elementData = grow(elementData, elementData.length); - } - if (index >= size) { - elementData[index] = o; - size++; - } else { - if (size + 1 >= elementData.length) { - elementData = grow(elementData, elementData.length); - } - for (int i = size-1; i >= index;i--) { - elementData[i+1] = elementData[i]; - } - elementData[index] = o; - size++; - - } - } - - public Object get(int index){ - if (index >= size ||index < 0) { - throw new IndexOutOfBoundsException("Index entered is out of bounds"); - } else { - return elementData[index]; - } - - } - - public Object remove(int index){ - if (index >= size ||index < 0) { - throw new IndexOutOfBoundsException("Index entered is out of bounds"); - } else { - Object result = elementData[index]; - for (int i = index; i < size - 1; i++) { - elementData[i] = elementData[i+1]; - } - elementData[size - 1] = 0; - size--; - return result; - } - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return null; - } - - private Object[] grow (Object[] src, int increase) { - Object[] target = new Object[src.length + increase]; - System.arraycopy(src, 0, target, 0, src.length); - return target; - } -} diff --git a/group04/564451732/src/hw1/BinaryTreeNode.java b/group04/564451732/src/hw1/BinaryTreeNode.java deleted file mode 100644 index 4b0367f13c..0000000000 --- a/group04/564451732/src/hw1/BinaryTreeNode.java +++ /dev/null @@ -1,71 +0,0 @@ -package hw1; - -public class BinaryTreeNode { - private Comparable data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private BinaryTreeNode root; - - public BinaryTreeNode (Comparable data) { - this.data = data; - } - public BinaryTreeNode () { - - } - public Object getData() { - return data; - } - public void setData(Comparable data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - return; - } - - - - public BinaryTreeNode getRoot() { - return root; - } - public void setRoot(BinaryTreeNode root) { - this.root = root; - } - public BinaryTreeNode insert(Comparable o){ - BinaryTreeNode result = new BinaryTreeNode(o); - if (root == null) { - root = result; - } else { - BinaryTreeNode dummy = root; - insertHelper(o,dummy); - - } - return result; - } - - private void insertHelper (Comparable o, BinaryTreeNode root) { - if (o.compareTo(root.data) < 0) { - if (root.left == null) { - root.left = new BinaryTreeNode(o); - } else { - insertHelper (o, root.left); - } - } else { - if (root.right == null) { - root.right = new BinaryTreeNode(o); - - } else { - insertHelper (o, root.right); - } - } - } -} diff --git a/group04/564451732/src/hw1/Iterator.java b/group04/564451732/src/hw1/Iterator.java deleted file mode 100644 index 93e22e9377..0000000000 --- a/group04/564451732/src/hw1/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package hw1; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group04/564451732/src/hw1/LinkedList.java b/group04/564451732/src/hw1/LinkedList.java deleted file mode 100644 index 793f7c66d6..0000000000 --- a/group04/564451732/src/hw1/LinkedList.java +++ /dev/null @@ -1,117 +0,0 @@ -package hw1; - -import java.util.Iterator; - -public class LinkedList implements List { -private Node head; -private Node tail; - - public void add(Object o){ - if (head != null) { - Node dummy = new Node(new Object()); - dummy.next = head; - Node nextNode = head; - - while (nextNode != null) { - dummy = dummy.next; - nextNode = nextNode.next; - } - dummy.next = new Node(o); - tail = dummy.next; - } else { - head = new Node(o); - tail = head; - } - - } - public void add(int index , Object o){ - if (index < 0 || index > size()) { - throw new IndexOutOfBoundsException("Index entered is out of bounds"); - } - Node dummy = head; - for (int i = 1; i < index; i++) { - dummy = dummy.next; - } - Node temp = dummy.next; - dummy.next = new Node(o); - dummy.next.next = temp; - if (index == size()) { - tail = dummy.next; - } - } - public Object get(int index){ - if (index < 0 || index >= size()) { - throw new IndexOutOfBoundsException("Index entered is out of bounds"); - } - Node dummy = head; - for (int i = 0; i < index;i++) { - dummy = dummy.next; - } - return dummy.data; - } - public Object remove(int index){ - if (index < 0 || index >= size()) { - throw new IndexOutOfBoundsException("Index entered is out of bounds"); - } - Node dummy = head; - for (int i = 1; i < index;i++) { - dummy = dummy.next; - } - Node result = dummy.next; - dummy.next = dummy.next.next; - if (dummy.next == null) { - tail = dummy; - } - return result.data; - } - - public int size(){ - Node dummy = head; - int size = 0; - while (dummy != null) { - dummy = dummy.next; - size++; - } - - return size; - } - - public void addFirst(Object o){ - Node first = new Node(o); - first.next = head; - head = first; - } - public void addLast(Object o){ - tail.next = new Node(o); - tail = tail.next; - } - public Object removeFirst(){ - Node temp = head; - head = head.next; - return temp.data; - } - public Object removeLast(){ - Node dummy = head; - for (int i = 1; i < size()-1; i++) { - dummy = dummy.next; - } - Node result = dummy.next; - tail = dummy; - dummy.next = null; - return result.data; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - public Node(Object data) { - this.data = data; - } - - } -} diff --git a/group04/564451732/src/hw1/List.java b/group04/564451732/src/hw1/List.java deleted file mode 100644 index a976c82204..0000000000 --- a/group04/564451732/src/hw1/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package hw1; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group04/564451732/src/hw1/QueueImpl.java b/group04/564451732/src/hw1/QueueImpl.java deleted file mode 100644 index 30c73585ff..0000000000 --- a/group04/564451732/src/hw1/QueueImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package hw1; - -public class QueueImpl { - LinkedList queueList = new LinkedList(); - - public void enQueue(Object o){ - queueList.add(o); - } - - public Object deQueue(){ - return queueList.removeFirst(); - } - - public boolean isEmpty(){ - return queueList.size() == 0; - } - - public int size(){ - return queueList.size(); - } -} diff --git a/group04/564451732/src/hw1/StackImpl.java b/group04/564451732/src/hw1/StackImpl.java deleted file mode 100644 index 3ae23593fa..0000000000 --- a/group04/564451732/src/hw1/StackImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package hw1; - -public class StackImpl { -private ArrayListImpl elementData = new ArrayListImpl(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - return elementData.get(elementData.size() - 1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group04/821655640/learning_projects/project_basic_001/.gitignore b/group04/821655640/learning_projects/project_basic_001/.gitignore deleted file mode 100644 index 39d13906de..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/.gitignore +++ /dev/null @@ -1,44 +0,0 @@ - -# Created by https://www.gitignore.io/api/eclipse,intellij,java - -### Eclipse ### -target/ -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath -.recommenders - -# Eclipse Core -.project - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# PyDev specific (Python IDE for Eclipse) -*.pydevproject - -# CDT-specific (C/C++ Development Tooling) -.cproject - -# JDT-specific (Eclipse Java Development Tools) -.classpath - -# Java annotation processor (APT) -.factorypath - -# PDT-specific (PHP Development Tools) -.buildpath - -# sbteclipse plugin -.target - diff --git a/group04/821655640/learning_projects/project_basic_001/pom.xml b/group04/821655640/learning_projects/project_basic_001/pom.xml deleted file mode 100644 index 6675a5d76d..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - 4.0.0 - - com.sunline - project_basic_001 - 0.0.1-SNAPSHOT - jar - - project_basic_001 - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 4.10 - test - - - diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/ArrayList.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/ArrayList.java deleted file mode 100644 index c168b5efa8..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.coding.basic; - -/** - * @ClassName: ArrayList - * @Description: 自增长数组 - * @author: tangxp - * @date: 2017年2月23日 下午10:43:03 - */ -public class ArrayList implements List { - - private final int step = 10; - private Object elementData[] = new Object[100]; - private int size = 0 ; - - - /** - * @Title: add - * @Description: TODO - * @param o , elements of this ArrayList - * @see com.coding.basic.List#add(java.lang.Object) - */ - public void add(Object o) { - add(size,o); - } - - - /** - * @Title: add - * @Description: TODO - * @param index - * @param o - * @see com.coding.basic.List#add(int, java.lang.Object) - */ - public void add(int index, Object o) { - if(index < 0 || index> size) { - throw new IllegalArgumentException("下标越界"); - } - - if(null == o) { - throw new IllegalArgumentException("元素不能为空"); - } - - if(this.checkOutOfBounds()) { - this.autoGrow(this.step); - } - - int i = size; - while(i>index) { - elementData[i] = elementData[--i]; - } - addDriect(i, o); - } - - - public Object get(int index) { - if(index < 0 || index>= size) { - throw new IllegalArgumentException("下标越界"); - } - - return elementData[index]; - } - - public Object remove(int index) { - if(index < 0 || index>= size) { - throw new IllegalArgumentException("下标越界"); - } - - Object o = elementData[index]; - while (indexthis.size) { - return; - } - Object newElementData[] = new Object[elementData.length+growSize]; - System.arraycopy(elementData, 0, newElementData, 0, elementData.length); - elementData = newElementData; - return; - } - - private void addDriect(int index, Object o) { - elementData[index] = o; - this.size++; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder("["); - for(int i =0;ithis.size) { - return false; - }else { - return true; - } - } -} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/BinaryTreeNode.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 6587275b48..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.coding.basic; - - -public class BinaryTreeNode > { - - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public T getData() { - return data; - } - public void setData(T data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(T o){ - return insert(this,o); - } - - - public BinaryTreeNode insert(BinaryTreeNode bt, T o) { - BinaryTreeNode insertedNode = null; - if(null == this.data) { - this.data = o; - return this; - } - - if(-1 == o.compareTo(bt.data)) { - if(null == bt.left) { - insertedNode = new BinaryTreeNode(); - insertedNode.data = o; - bt.left = insertedNode; - return insertedNode; - } - return insert(bt.left,o); - }else { - if(null == bt.right) { - insertedNode = new BinaryTreeNode(); - insertedNode.data = o; - bt.right = insertedNode; - return insertedNode; - } - - return insert(bt.right,o); - } - } - - @Override - public String toString() { - StringBuilder space = new StringBuilder(""); - return getString(this,space,0).toString(); - } - - private StringBuilder getString(BinaryTreeNode head,StringBuilder space,int deepth) { - StringBuilder spaceTemp = new StringBuilder(space.toString()); - if (null == head) { - return new StringBuilder(" null , "); - } else { - StringBuilder tempStr = new StringBuilder(" {").append(spaceTemp.append(head.data.toString()) - .append(new StringBuilder(space)).append("} ")); - deepth++; - return getString(head.left, space, deepth).append(deepth) - .append(tempStr).append(deepth).append("\n") - .append(getString(head.right, space, deepth)); - } - - } - - - -} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Iterator.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/LinkedList.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/LinkedList.java deleted file mode 100644 index a824ad9372..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.coding.basic; - - -/** - * @ClassName: LinkedList - * @Description: 带头结点的单向列表. - * @author: tangxp - * @date: 2017年2月23日 下午9:14:28 - */ -public class LinkedList implements List { - - private Node head = new Node(); - private int size ; - - public void add(Object o){ - add(size,o); - } - - public void add(int index , Object o){ - if(index<0 || index>size) { - throw new IllegalArgumentException("目前链表长度不够!"); - } - Node tempHead = head; - int i = 0; - while(i++ < index) { - tempHead = tempHead.next; - } - addDriect(getNode(o),tempHead); - } - - - /** - * @Title: get - * @Description: TODO - * @param index - * @return - * @see com.coding.basic.List#get(int) - */ - public Object get(int index){ - if(index<0|| index>=size) { - throw new IllegalArgumentException("下标超出链表范围!"); - } - Node tempHead = head; - int i = 0; - while(i++ < index) { - tempHead = tempHead.next; - } - return tempHead.next.data; - } - - public Object remove(int index){ - if(index<0 || index>=size) { - throw new IllegalArgumentException("下标超出链表范围!"); - } - Node tempHead = head; - int i = 0; - while(i++ < index) { - tempHead = tempHead.next; - } - - Node removingNode = tempHead.next; - tempHead.next = removingNode.next; - removingNode.next = null; - size--; - return removingNode.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - add(0,o); - } - public void addLast(Object o){ - add(o); - } - public Object removeFirst(){ - return remove(0); - } - - public Object removeLast(){ - return remove(size-1); - } - - public Iterator iterator(){ - return null; - } - - private void addDriect(Node n,Node before) { - Node temp = before.next; - n.next = temp; - before.next = n; - size++; - } - - private Node getNode(Object o) { - - if(null == o) { - throw new IllegalArgumentException("节点值不能为空"); - } - - Node n = new Node(); - n.data = o; - return n; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder("size: "+size+" {null | ---}--->"); - if(null == head.next) { - return sb.toString(); - } - - Node tempHead = head; - while(null != tempHead.next ) { - sb.append(tempHead.next.toString()); - tempHead = tempHead.next; - } - sb.append("null"); - return sb.toString(); - } - - private static class Node{ - Object data; - Node next; - - @Override - public String toString() { - return "{" + this.data +" |---}--->"; - } - - } -} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/List.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Queue.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Queue.java deleted file mode 100644 index 3ae10dc5c7..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Queue.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList elements = new LinkedList(); - - public void enQueue(Object o){ - elements.addFirst(o); - } - - public Object deQueue(){ - return elements.removeLast(); - } - - public boolean isEmpty(){ - return 0==elements.size(); - } - - public int size(){ - return elements.size(); - } - - @Override - public String toString() { - return elements.toString(); - } -} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Stack.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Stack.java deleted file mode 100644 index 4638daf558..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Stack.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - return elementData.remove(elementData.size()-1); - } - - public Object peek(){ - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return 0 == elementData.size(); - } - public int size(){ - return elementData.size(); - } - - @Override - public String toString() { - return elementData.toString(); - } -} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/sunline/project_basic_001/App.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/sunline/project_basic_001/App.java deleted file mode 100644 index 48b5e72dc2..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/sunline/project_basic_001/App.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sunline.project_basic_001; - -import javax.swing.tree.TreeNode; - - -/** - * Hello world! - * - */ -public class App { - public static void main(String[] args) { - System.out.println("Hello World!"); - TreeNode a; - } -} diff --git a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coding/basic/TestBasic.java b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coding/basic/TestBasic.java deleted file mode 100644 index de5eaf51ed..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coding/basic/TestBasic.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.coding.basic; - - -import org.junit.Test; - -public class TestBasic { - - @Test - public void testBinaryTree() { - BinaryTreeNode bt = new BinaryTreeNode(); - bt.insert(10); - for (int i = 0; i < 5; i++) { - bt.insert(i); - } - System.out.println(bt); - - } - - @Test - public void testStack() { - Stack stack = new Stack(); - System.out.println(stack.isEmpty()); - for (int i = 0; i < 5; i++) { - stack.push(i); - } - - System.out.println(stack); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack); - System.out.println(stack.peek()); - System.out.println(stack); - System.out.println(stack.isEmpty()); - System.out.println(stack.size()); - - } - - @Test - public void testQueue() { - Queue queue = new Queue(); - System.out.println(queue.isEmpty()); - for (int i = 0; i < 5; i++) { - queue.enQueue(i); - } - System.out.println(queue.isEmpty()); - System.out.println(queue); - queue.deQueue(); - queue.deQueue(); - System.out.println(queue); - System.out.println(queue.size()); - - } - - - - @Test - public void testLinkedList() { - LinkedList link = new LinkedList(); - for(int i=0;i<3;i++) { - link.add(i); - } - System.out.println(link); - link.add(123); - link.addFirst("first"); - link.addLast("last"); - System.out.println(link); - link.removeFirst(); - link.removeLast(); - System.out.println(link); - //link.remove(12); - System.out.println(link.get(2)); - - } - - @Test - public void testArrayList(){ - ArrayList a = new ArrayList(); - for (int i = 0; i <130; i++) { - a.add(i); - } - System.out.println(a); - a.add(3,"abc"); - System.out.println(a); - a.remove(0); - System.out.println(a); - System.out.println(a.get(2)); - a.add("tttttttt"); - System.out.println(a); - - } - -} diff --git a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/sunline/project_basic_001/AppTest.java b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/sunline/project_basic_001/AppTest.java deleted file mode 100644 index 57fc7ea596..0000000000 --- a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/sunline/project_basic_001/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.sunline.project_basic_001; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/group04/844028312/.gitignore b/group04/844028312/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group04/844028312/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group04/844028312/one/.classpath b/group04/844028312/one/.classpath deleted file mode 100644 index 3e0fb272a8..0000000000 --- a/group04/844028312/one/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group04/844028312/one/.gitignore b/group04/844028312/one/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group04/844028312/one/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group04/844028312/one/.project b/group04/844028312/one/.project deleted file mode 100644 index d674d0dad5..0000000000 --- a/group04/844028312/one/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - one - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group04/844028312/one/src/com/coding/basic/ArrayList.java b/group04/844028312/one/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 947b34ed7c..0000000000 --- a/group04/844028312/one/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - private static final int DEFAULT_CAPACITY = 10; - private Object[] elementData = new Object[100]; - /** - * Ԫ - */ - public void add(Object o){ - - if(size=0 && index<=size){ //ж indexǷsizeΧ 1 2 3 4 - if(size+1=insertData && left==null){ //жϲСһڵ,left==null - left=new BinaryTreeNode(); - left.data=o; - left.left=null; - left.right=null; - } - else if(insertData>nowData && right==null){ //жϲһڵ,==null - right=new BinaryTreeNode(); - right.data=o; - right.left=null; - right.right=null; - } - else{ - BinaryTreeNode treeNode=null; //¼ȽϽڵ - if(nowData>=insertData ){ //ǰڵݴ - treeNode=left; //ȽϽڵΪڵ - } - else{ - treeNode=right; //Ϊҽڵ - } - BinaryTreeNode tempNode=null; //ʱڵ㣬ڼ¼ȽϽڵڵҽڵΪʱ¼ȽϽڵ - while(treeNode!=null){ - nowData=(int) treeNode.data; //ĵǰֵ - if(insertData<=nowData){ //ǰڵݴ - tempNode=treeNode.left; //ʱڵΪڵ - } - else{ - tempNode=treeNode.right; //Ϊҽڵ - } - if(tempNode==null){ - tempNode=treeNode; //¼ȽϽڵ - if(insertData<=nowData){ //ǰڵݴ - treeNode=treeNode.left; //ȽϽڵΪڵ - } - else{ - treeNode=treeNode.right; //Ϊҽڵ - } - } - else{ - treeNode=tempNode; //ʱڵ㲻ΪʱȽϽڵ㸳ֵΪʱڵ - } - } - if(treeNode==null){ //ȽϽڵΪʱ - treeNode=new BinaryTreeNode(); //½ڵ - treeNode.data=o; - treeNode.left=null; - treeNode.right=null; - int upData=(int) tempNode.data; - if(insertData<=upData){ //һڵݴڲڵʱ - tempNode.left=treeNode; //һڵڵ㸳ڵ - } - else{ - tempNode.right=treeNode; - } - } - } - } - else{ //left!=null&&right!=null - BinaryTreeNode treeNode=null; //жһ - if(nowData>=insertData ){ - treeNode=left; - } - else{ - treeNode=right; - } - BinaryTreeNode tempNode=null; - while(treeNode!=null){ - nowData=(int) treeNode.data; - if(insertData<=nowData){ - tempNode=treeNode.left; - } - else{ - tempNode=treeNode.right; - } - if(tempNode==null){ - tempNode=treeNode; - if(insertData<=nowData){ - treeNode=treeNode.left; - } - else{ - treeNode=treeNode.right; - } - } - else{ - treeNode=tempNode; - } - } - if(treeNode==null){ - treeNode=new BinaryTreeNode(); - treeNode.data=o; - treeNode.left=null; - treeNode.right=null; - int upData=(int) tempNode.data; - if(insertData<=upData){ - tempNode.left=treeNode; - } - else{ - tempNode.right=treeNode; - } - } - } - } - return this; - } - - - -} diff --git a/group04/844028312/one/src/com/coding/basic/Iterator.java b/group04/844028312/one/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group04/844028312/one/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group04/844028312/one/src/com/coding/basic/JavaTest.java b/group04/844028312/one/src/com/coding/basic/JavaTest.java deleted file mode 100644 index 2d424110a1..0000000000 --- a/group04/844028312/one/src/com/coding/basic/JavaTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.coding.basic; - -//import java.util.ArrayList; -//import java.util.Iterator; -public class JavaTest { - public static void main(String[] args){ -// ArrayList a=new ArrayList(); -// for(int i=0;i<5;i++){ -// a.add(i); -// } -// Iterator i=a.iterator(); -// while(i.hasNext()){ -// int c=(int) i.next(); -// System.out.println(c); -// } - - -// a.add(0, "aa"); -// a.add(100, "bb"); -// a.add(200, "cc"); -// long start=System.currentTimeMillis(); -// System.out.println("1start:"+start); -// System.out.println(a.remove(40)); -// long end=System.currentTimeMillis(); -// System.out.println("1end:"+end); -// System.out.println("1:"+(end-start)); -// LinkedList l=new LinkedList(); -// for(int i=0;i<5;i++){ -// l.add(i); -// } -// Iterator i=l.iterator(); -// while(i.hasNext()){ -// Object c=i.next(); -// System.out.println(c); -// } - -// long start2=System.currentTimeMillis(); -// System.out.println("start2:"+start2); -//// System.out.println(l.remove(40)); -//// long end2=System.currentTimeMillis(); -// System.out.println("end2:"+end2); -// System.out.println("2:"+(end2-start2)); -// a.add(1000, "a"); -// Stack s=new Stack(); -// for(int i=0;i<100;i++){ -// s.push(i); -// } -// Object o=s.pop(); -// Object o2=s.peek(); -// System.out.println(o2); -// LinkedList l=new LinkedList(); -// for(int i=0;i<5;i++){ -// l.add(i); -// } -// System.out.println(l.remove(90)); -// l.add(90, "a"); -// System.out.println(l.get(90)); -// System.out.println(l.get(89)); -// System.out.println(l.get(91)); -// System.out.println("a"+l.size()); -// l.addFirst("bb"); -// System.out.println("b"+l.size()); -// //System.out.println(l.get(0)); -// l.addLast("cc"); -// -// System.out.println(l.get(l.size()-1)); -// System.out.println(l.size()); -// l.removeFirst(); -// l.removeLast(); -// System.out.println(l.size()); -// Queue q=new Queue(); -// for(int i=0;i<5;i++){ -// q.enQueue(i); -// } -// q.size(); -// q.isEmpty(); -// q.deQueue(); -// System.out.println(q); -// ArrayList a=new ArrayList(); - BinaryTreeNode btn=new BinaryTreeNode(); - - btn.insert(2); - btn.insert(3); - btn.insert(1); - btn.insert(6); - btn.insert(8); - System.out.println(btn); - } -} diff --git a/group04/844028312/one/src/com/coding/basic/LinkedList.java b/group04/844028312/one/src/com/coding/basic/LinkedList.java deleted file mode 100644 index e8eb9fc4ca..0000000000 --- a/group04/844028312/one/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - if(head==null){ //headΪ - head=new Node(); //½һڵ - head.data=o; // - head.next=null; //һڵΪ - } - else{ - Node node=head.next; - Node temp = null; - while(node!=null){ - temp=node.next; - if(temp==null){ - temp=node; - node=temp.next; - } - else{ - node=temp; - } - } - if(node==null&&temp==null){ - node=new Node(); - node.data=o; - node.next=null; - head.next=node; - } - else{ - node=new Node(); - node.data=o; - node.next=null; - temp.next=node; - } - } - } - public void add(int index , Object o){ - int size=size(); - if(index0&&size>0){ - Node node=(Node) getNode(index-1); - Node newNode=new Node(); - newNode.data=o; - newNode.next=(Node) getNode(index); - node.next=newNode; - } - else if(index==size&&size>0){ - Node node=(Node) getNode(size-1); - Node newNode=new Node(); - newNode.data=o; - newNode.next=null; - node.next=newNode; - } - else if(index==0&&size!=0){ - Node temp=new Node(); - temp.next=head.next; - temp.data=head.data; - head.data=o; - //head.next=temp; - head.next=temp; - } - else if(index==0&&size==0){ - head=new Node(); - head.data=o; - head.next=null; - } - else{ - System.out.println("±곬Χ"); - } - } - public Object get(int index){ - if(index==0){ - return head.data; - } - else{ - int i=1; - Node node=head.next;//1 2 3 4 5 - while(node!=null){ - if(i==index){ - return node.data; - } - node=node.next; - i++; - } - } - return null; - } - public Object getNode(int index){ - if(index==0){ - return head; - } - else{ - int i=1; - Node node=head.next;//1 2 3 4 5 - while(node!=null){ - if(i==index){ - return node; - } - node=node.next; - i++; - } - } - return null; - } - public Object remove(int index){ - if(index==0){ - Node node=head.next; - Node temp=head; - head=node; - return temp.data; - } - else{ - Node temp=(Node) getNode(index); - Node node=(Node) getNode(index-1); - node.next=(Node) getNode(index+1); - return temp.data; - } - - } - - public int size(){ - if(head==null){ - return 0; - } - else{ - Node node=head.next; - if(node==null){ - return 1; - } - else{ - int i=1; - while(node!=null){ - node=node.next; - i++; - } - return i; - } - } - } - - public void addFirst(Object o){ - add(0,o); - } - public void addLast(Object o){ - add(size(),o); - } - public Object removeFirst(){ - Object temp = null; - if(size()>0){ - temp=remove(0); - } - - return temp; - } - public Object removeLast(){ - Object temp = null; - if(size()>0){ - temp=remove(size()-1); - } - return temp; - } - public Iterator iterator(){ - return new Ir(); - } - - - private static class Node{ - Object data; - Node next; - - } - private class Ir implements Iterator{ - private int cursor; - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return cursor!=size(); - } - - @Override - public Object next() { - // TODO Auto-generated method stub - int i=cursor; - if(cursor0){ - return false; - } - return true; - } - - public int size(){ - return linkedList.size(); - } -} diff --git a/group04/844028312/one/src/com/coding/basic/Stack.java b/group04/844028312/one/src/com/coding/basic/Stack.java deleted file mode 100644 index 79733597ca..0000000000 --- a/group04/844028312/one/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); //ջѹԪ - } - - public Object pop(){ - Object o=elementData.get(elementData.size()-1); //ջԪأΪջȽ - elementData.remove(elementData.size()-1); //ƳջԪ - return o; - } - - public Object peek(){ - return elementData.get(elementData.size()-1); //ȡջԪ - } - public boolean isEmpty(){ - if(elementData.size()==0){ //elementData.sizeжǷΪ - return true; - } - return false; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group04/844028312/one/src/com/coding/test/ArrayListTest.java b/group04/844028312/one/src/com/coding/test/ArrayListTest.java deleted file mode 100644 index 6edc5205cd..0000000000 --- a/group04/844028312/one/src/com/coding/test/ArrayListTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; -import junit.framework.Assert; - -import org.junit.Before; -import org.junit.BeforeClass; - -import com.coding.basic.ArrayList; -import com.coding.basic.Iterator; - -public class ArrayListTest { - private ArrayList arrayList; - @BeforeClass - public static void setUpBeforeClass() throws Exception { - } - - @Before - public void setUp() throws Exception { - arrayList=new ArrayList(); - for(int i=0;i<10;i++){ - arrayList.add(i); - } - } - - - @org.junit.Test - public void addAndGet(){ - for(int i=0;i<10;i++){ - Assert.assertEquals(i, (int)arrayList.get(i)); - } - } - @org.junit.Test - public void addWithIndex(){ - arrayList.add(4, "a"); - Assert.assertEquals("a", arrayList.get(4)); - } - - @org.junit.Test - public void remove(){ - Object before=arrayList.get(4); - Object reMove=arrayList.remove(4); - Assert.assertEquals(before, reMove); - - } - @org.junit.Test - public void size(){ - Assert.assertEquals(10, arrayList.size()); - } - @org.junit.Test - public void iterator(){ - Iterator it=arrayList.iterator(); - int i=0; - while(it.hasNext()){ - Assert.assertEquals(it.next(),arrayList.get(i)); - i++; - } - } - -} diff --git a/group04/844028312/one/src/com/coding/test/BinaryTreeNodeTest.java b/group04/844028312/one/src/com/coding/test/BinaryTreeNodeTest.java deleted file mode 100644 index 2fb70cf976..0000000000 --- a/group04/844028312/one/src/com/coding/test/BinaryTreeNodeTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.BinaryTreeNode; - -public class BinaryTreeNodeTest { - private BinaryTreeNode btn; - @Before - public void setUp() throws Exception { - btn=new BinaryTreeNode(); - - } - - @Test - public void test() { - btn.insert(3); - btn.insert(5); - btn.insert(2); - btn.insert(10); - btn.insert(4); - - } - -} diff --git a/group04/844028312/one/src/com/coding/test/LinkedListTest.java b/group04/844028312/one/src/com/coding/test/LinkedListTest.java deleted file mode 100644 index c7e0479736..0000000000 --- a/group04/844028312/one/src/com/coding/test/LinkedListTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.Iterator; -import com.coding.basic.LinkedList; -import com.coding.basic.Stack; - -public class LinkedListTest { - private LinkedList linkedList; - @Before - public void setUp() throws Exception { - linkedList =new LinkedList(); - for(int i=0;i<10;i++){ - linkedList.add(i); - } - } - @Test - public void addWithIndex() { - linkedList.add(4, "a"); - Object o=linkedList.get(4); - Assert.assertEquals("a",o); - } - @Test - public void get() { - Assert.assertEquals(1,linkedList.get(1)); - } - @Test - public void size() { - Assert.assertEquals(10,linkedList.size()); - } - @Test - public void addFirst() { - linkedList.addFirst("one"); - Object o=linkedList.get(0); - Assert.assertEquals("one",o); - } - @Test - public void addLast() { - linkedList.addLast("last"); - Object o=linkedList.get(10); - Assert.assertEquals("last",o); - } - @Test - public void removeFirst() { - Assert.assertEquals(0,linkedList.removeFirst()); - } - @Test - public void removeLast() { - Assert.assertEquals(9,linkedList.removeLast()); - } - @Test - public void iterator() { - Iterator it=linkedList.iterator(); - int i=0; - while(it.hasNext()){ - Assert.assertEquals(it.next(),linkedList.get(i)); - i++; - } - } - -} diff --git a/group04/844028312/one/src/com/coding/test/QueueTest.java b/group04/844028312/one/src/com/coding/test/QueueTest.java deleted file mode 100644 index 0859b73de6..0000000000 --- a/group04/844028312/one/src/com/coding/test/QueueTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; -import junit.framework.Assert; - -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.ArrayList; -import com.coding.basic.Queue; - -public class QueueTest { - private Queue queue; - @Before - public void setUp() throws Exception { - queue=new Queue(); - for(int i=0;i<10;i++){ - queue.enQueue(i); - } - } - - @Test - public void deQueue() { - Assert.assertEquals(0,queue.deQueue() ); - } - @Test - public void isEmpty() { - Assert.assertEquals(false,queue.isEmpty() ); - } - @Test - public void size() { - Assert.assertEquals(10,queue.size()); - } - -} diff --git a/group04/844028312/one/src/com/coding/test/StackTest.java b/group04/844028312/one/src/com/coding/test/StackTest.java deleted file mode 100644 index efebbdd80d..0000000000 --- a/group04/844028312/one/src/com/coding/test/StackTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; -import junit.framework.Assert; - -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.ArrayList; -import com.coding.basic.Stack; - -public class StackTest { - private Stack stack; - @Before - public void setUp() throws Exception { - stack=new Stack(); - for(int i=0;i<10;i++){ - stack.push(i); - } - } - - @Test - public void pushAndpop() { - Assert.assertEquals(9, stack.pop()); - } - @Test - public void peek() { - Assert.assertEquals(9, stack.peek()); - Assert.assertEquals(9, stack.peek()); - } - @Test - public void isEmpty() { - Assert.assertEquals(false,stack.isEmpty()); - } - @Test - public void size(){ - Assert.assertEquals(10,stack.size()); - } - -} diff --git a/group04/916758663/learn01/.gitignore b/group04/916758663/learn01/.gitignore deleted file mode 100644 index 45026a9caf..0000000000 --- a/group04/916758663/learn01/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -# Eclipse project files -.classpath -.project -.settings/ - - -# Intellij project files -*.iml -.idea/ -*.iws - -# maven -target/ -logs/ -.DS_Store - -# Mac -.DS_Store - -# -*.log diff --git a/group04/916758663/learn01/learn01.iml b/group04/916758663/learn01/learn01.iml deleted file mode 100644 index 6e0c17c683..0000000000 --- a/group04/916758663/learn01/learn01.iml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group04/916758663/learn01/pom.xml b/group04/916758663/learn01/pom.xml deleted file mode 100644 index e40157b3bf..0000000000 --- a/group04/916758663/learn01/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - 4.0.0 - - com.coding - basic - 1.0-SNAPSHOT - jar - - basic - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 4.12 - test - - - - org.assertj - assertj-core - 3.6.2 - test - - - diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/ArrayList.java b/group04/916758663/learn01/src/main/java/com/coding/basic/ArrayList.java deleted file mode 100644 index 0c9e702951..0000000000 --- a/group04/916758663/learn01/src/main/java/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[3]; - - public void add(Object o){ - add(size,o); - } - public void add(int index, Object o){ - if (index > size){ - throw new IndexOutOfBoundsException(); - } - // 扩容 - if (size == elementData.length || index + 1 > elementData.length) { - int newLength = index + 1 > size * 2 ? index + 1 :size * 2; - elementData = Arrays.copyOf(elementData, newLength); - } - // 移动元素 - System.arraycopy(elementData,index,elementData,index + 1 ,size-index); - elementData[index] = o; - size ++ ; - } - - public Object get(int index){ - checkIndex(index); - return elementData[index]; - } - - public Object remove(int index){ - checkIndex(index); - Object removed = elementData[index]; - System.arraycopy(elementData,index + 1,elementData,index,size-1 - index); - size --; - return removed; - } - - private void checkIndex(int index) { - if (index > size-1){ - throw new IndexOutOfBoundsException(); - } - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator { - - private int currentIndex = 0; - - @Override - public boolean hasNext() { - return currentIndex < size(); - } - - @Override - public Object next() { - Object o = get(currentIndex); - currentIndex ++ ; - return o; - } - } - -} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/BinaryTreeNode.java b/group04/916758663/learn01/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group04/916758663/learn01/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/Iterator.java b/group04/916758663/learn01/src/main/java/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group04/916758663/learn01/src/main/java/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/LinkedList.java b/group04/916758663/learn01/src/main/java/com/coding/basic/LinkedList.java deleted file mode 100644 index cba0879ac4..0000000000 --- a/group04/916758663/learn01/src/main/java/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - Node node = new Node(o, null); - if (head == null){ - head = node; - }else { - Node current = head; - while (current.getNext() != null) { - current = current.getNext(); - } - current.setNext(node); - } - } - - public void add(int index , Object o){ - Node current = head; - for (int i = 0; i < index-1; i++) { - current = current.getNext(); - if (current == null){ - throw new IndexOutOfBoundsException(); - } - } - Node right = current.getNext(); - current.setNext(new Node(o,right)); - } - - public Object get(int index){ - if (head == null){ - return null; - } - Node current = head; - for (int i = 0; i < index; i++) { - current = current.getNext(); - if (current == null){ - throw new IndexOutOfBoundsException(); - } - } - return current.getData(); - } - - public Object remove(int index){ - Node current = head; - for (int i = 0; i < index - 1; i++) { - current = current.getNext(); - if (current == null){ - throw new IndexOutOfBoundsException(); - } - } - if (current.getNext() == null){ - throw new IndexOutOfBoundsException(); - } - Object removed = current.getNext().getData(); - current.setNext(current.getNext().getNext()); - return removed; - } - - public int size(){ - if (head == null){ - return 0; - } - int n = 1; - Node current = head; - while (current.getNext() != null) { - n ++; - current = current.getNext(); - } - return n; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public Node getNext() { - return next; - } - - public void setNext(Node next) { - this.next = next; - } - } -} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/List.java b/group04/916758663/learn01/src/main/java/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group04/916758663/learn01/src/main/java/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/Queue.java b/group04/916758663/learn01/src/main/java/com/coding/basic/Queue.java deleted file mode 100644 index 4e23a01d17..0000000000 --- a/group04/916758663/learn01/src/main/java/com/coding/basic/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private ArrayList elementData = new ArrayList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - return elementData.remove(0); - } - - public boolean isEmpty(){ - return elementData.size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/Stack.java b/group04/916758663/learn01/src/main/java/com/coding/basic/Stack.java deleted file mode 100644 index 83896e5dc5..0000000000 --- a/group04/916758663/learn01/src/main/java/com/coding/basic/Stack.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - return elementData.get(elementData.size() - 1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group04/916758663/learn01/src/test/java/com/coding/basic/ArrayListTest.java b/group04/916758663/learn01/src/test/java/com/coding/basic/ArrayListTest.java deleted file mode 100644 index 8793adf11f..0000000000 --- a/group04/916758663/learn01/src/test/java/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.coding.basic; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.Test; - -/** - * Created by qilei on 17/2/24. - */ -public class ArrayListTest { - - @Test - public void add() throws Exception { - ArrayList l = new ArrayList(); - l.add(1); - l.add(2); - l.add(3); - l.add(4); - assertThat(l.size()).isEqualTo(4); - } - - @Test - public void insert() throws Exception { - ArrayList l = new ArrayList(); - l.add(1); - l.add(2); - l.add(3); - l.add(1,4); - assertThat(l.size()).isEqualTo(4); - assertThat(l.get(1)).isEqualTo(4); - } - - @Test - public void remove() throws Exception { - ArrayList l = new ArrayList(); - l.add(1); - l.add(2); - l.add(3); - Object removed = l.remove(1); - assertThat(l.size()).isEqualTo(2); - assertThat(removed).isEqualTo(2); - } - - @Test - public void get() throws Exception { - - } - - @Test - public void size() throws Exception { - - } - - @Test - public void iterator() throws Exception { - ArrayList l = new ArrayList(); - l.add(1); - l.add(2); - l.add(3); - Iterator iterator = l.iterator(); - while (iterator.hasNext()) { - Object next = iterator.next(); - System.out.println(next); - } - - } - -} \ No newline at end of file diff --git a/group04/916758663/learn01/src/test/java/com/coding/basic/JavaArrayListTest.java b/group04/916758663/learn01/src/test/java/com/coding/basic/JavaArrayListTest.java deleted file mode 100644 index 348f7e9a66..0000000000 --- a/group04/916758663/learn01/src/test/java/com/coding/basic/JavaArrayListTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coding.basic; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; - -/** - * Created by qilei on 17/2/25. - */ -public class JavaArrayListTest { - - @Test - public void add() throws Exception { - java.util.ArrayList l = new java.util.ArrayList(); - l.add(1); - l.add(2); - l.add(3,3); - assertThat(l.size()).isEqualTo(3); - } - -} diff --git a/group04/916758663/learn01/src/test/java/com/coding/basic/LinkedListTest.java b/group04/916758663/learn01/src/test/java/com/coding/basic/LinkedListTest.java deleted file mode 100644 index 29a5a3d90e..0000000000 --- a/group04/916758663/learn01/src/test/java/com/coding/basic/LinkedListTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.coding.basic; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.Test; - -/** - * Created by qilei on 17/2/25. - */ -public class LinkedListTest { - - @Test - public void add() throws Exception { - LinkedList l = new LinkedList(); - l.add(1); - l.add(2); - l.add(3); - assertThat(l.size()).isEqualTo(3); - assertThat(l.get(1)).isEqualTo(2); - } - - @Test - public void insert() throws Exception { - LinkedList l = new LinkedList(); - l.add(1); - l.add(2); - l.add(3); - l.add(1,4); - assertThat(l.size()).isEqualTo(4); - assertThat(l.get(1)).isEqualTo(4); - } - - @Test - public void remove() throws Exception { - LinkedList l = new LinkedList(); - l.add(1); - l.add(2); - l.add(3); - Object removed = l.remove(1); - assertThat(l.size()).isEqualTo(2); - assertThat(removed).isEqualTo(2); - } - - @Test - public void addFirst() throws Exception { - - } - - @Test - public void addLast() throws Exception { - - } - - @Test - public void removeFirst() throws Exception { - - } - - @Test - public void removeLast() throws Exception { - - } - -} \ No newline at end of file diff --git a/group04/916758663/learn01/src/test/java/com/coding/basic/QueueTest.java b/group04/916758663/learn01/src/test/java/com/coding/basic/QueueTest.java deleted file mode 100644 index 1e451c045c..0000000000 --- a/group04/916758663/learn01/src/test/java/com/coding/basic/QueueTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coding.basic; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.Test; - -/** - * Created by qilei on 17/2/25. - */ -public class QueueTest { - - @Test - public void enQueue() throws Exception { - Queue q = new Queue(); - q.enQueue("a"); - assertThat(q.size()).isEqualTo(1); - } - - @Test - public void deQueue() throws Exception { - Queue q = new Queue(); - q.enQueue("a"); - q.enQueue("b"); - Object o = q.deQueue(); - assertThat(q.size()).isEqualTo(1); - assertThat(o).isEqualTo("a"); - } - -} \ No newline at end of file diff --git a/group04/916758663/learn01/src/test/java/com/coding/basic/StackTest.java b/group04/916758663/learn01/src/test/java/com/coding/basic/StackTest.java deleted file mode 100644 index 1c25b17007..0000000000 --- a/group04/916758663/learn01/src/test/java/com/coding/basic/StackTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coding.basic; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.Test; - -/** - * Created by qilei on 17/2/25. - */ -public class StackTest { - - @Test - public void push() throws Exception { - Stack s = new Stack(); - s.push("a"); - assertThat(s.size()).isEqualTo(1); - assertThat(s.peek()).isEqualTo("a"); - } - - @Test - public void pop() throws Exception { - Stack s = new Stack(); - s.push("a"); - s.push("b"); - Object pop = s.pop(); - assertThat(pop).isEqualTo("b"); - } - -} \ No newline at end of file diff --git a/group04/group04.md b/group04/group04.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group04/group04.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group05/1026626960/.classpath b/group05/1026626960/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group05/1026626960/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group05/1026626960/.gitignore b/group05/1026626960/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group05/1026626960/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group05/1026626960/.project b/group05/1026626960/.project deleted file mode 100644 index a8522c9339..0000000000 --- a/group05/1026626960/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 1026626960Coding - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group05/1026626960/src/cn/study1/myIterator.java b/group05/1026626960/src/cn/study1/myIterator.java deleted file mode 100644 index a5e5528559..0000000000 --- a/group05/1026626960/src/cn/study1/myIterator.java +++ /dev/null @@ -1,5 +0,0 @@ -package cn.study1; - -public class myIterator { - // -} diff --git a/group05/1026626960/src/cn/study1/myQueue.java b/group05/1026626960/src/cn/study1/myQueue.java deleted file mode 100644 index cfb5e061d7..0000000000 --- a/group05/1026626960/src/cn/study1/myQueue.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.study1; - -public class myQueue { - private class Node{ - T t; - Node next; - } - private Node first; - private Node last; - private int N; - public boolean isEmpty(){ - return N==0; - } - public int size(){ - return N; - } - public void enqueue(T t){ - Node oldlast = last; - last = new Node(); - last.t = t; - last.next = null; - if(isEmpty()){ - first = last; - }else{ - oldlast.next = last; - } - N++; - } - public T dequeue(){ - T t = first.t; - first = first.next; - if(isEmpty()){ - last = null; - } - N--; - return t; - } -} diff --git a/group05/1026626960/src/cn/study1/myStack.java b/group05/1026626960/src/cn/study1/myStack.java deleted file mode 100644 index 8364401c45..0000000000 --- a/group05/1026626960/src/cn/study1/myStack.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.study1; - -public class myStack { - private class Node{ - T t; - Node next; - } - private Node first; - private int N; - public boolean isEmpty(){ - return N==0; - } - public int size(){ - return N; - } - public void push(T t){ - Node oldfirst = first; - first = new Node(); - first.t = t; - first.next = oldfirst; - N++; - } - public T pop(){ - T t = first.t; - first = first.next; - N--; - return t; - } -} diff --git a/group05/1094051862/test01/.classpath b/group05/1094051862/test01/.classpath deleted file mode 100644 index 04cc82dc42..0000000000 --- a/group05/1094051862/test01/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group05/1094051862/test01/.gitignore b/group05/1094051862/test01/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group05/1094051862/test01/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group05/1094051862/test01/.project b/group05/1094051862/test01/.project deleted file mode 100644 index 1dfd9165c6..0000000000 --- a/group05/1094051862/test01/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - test01 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group05/1094051862/test01/.settings/org.eclipse.jdt.core.prefs b/group05/1094051862/test01/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index d17b6724d1..0000000000 --- a/group05/1094051862/test01/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group05/1094051862/test01/src/com/coding/basic/.gitignore b/group05/1094051862/test01/src/com/coding/basic/.gitignore deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/group05/1094051862/test01/src/com/coding/basic/ArrayList.java b/group05/1094051862/test01/src/com/coding/basic/ArrayList.java deleted file mode 100644 index af757a217e..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[10]; - - private int increaseSize = 3; - private void increaseArray() { - Object[] newData = Arrays.copyOf(elementData, elementData.length + increaseSize); - elementData = newData; - } - public void add(Object o){ - if (size == elementData.length) { - increaseArray(); - elementData[size++] = o; - } else { - elementData[size++] = o; - } - } - public void add(int index, Object o){ - if (index < 0 || index > size) { - System.out.println("错误提示:index > size || index < 0"); - return; - } - Object temp; - for (int i = index; i < size; i++) { - temp = elementData[i]; - elementData[i] = o; - o = temp; - } - elementData[size ++] = o; - } - - public Object get(int index){ - if (index < 0 || index > size ){ - return null; - } - return elementData[index]; - } - - public Object remove(int index){ - if (index < 0 || index > size ){ - return null; - } - Object result = elementData[index]; - for (int i = index; i < size-1; i++) { - elementData[i] = elementData[i + 1]; - } - elementData[size-1] = null; - size --; - return result; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new Iterator() { - private int cusor = 0; - @Override - public Object next() { - if (!hasNext()) { - System.out.println("next: !hasNext"); - return null; - } - return elementData[cusor ++]; - } - @Override - public boolean hasNext() { - return cusor < size; - } - }; - } -} diff --git a/group05/1094051862/test01/src/com/coding/basic/ArrayListTest.java b/group05/1094051862/test01/src/com/coding/basic/ArrayListTest.java deleted file mode 100644 index 8a5875427e..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coding.basic; - -import org.junit.Assert; -import org.junit.Test; - -public class ArrayListTest { - - @Test - public void test() { - List list = new ArrayList(); - for(int i = 0; i < 10; i++) { - list.add(i); - } - Assert.assertEquals(10, list.size()); - list.add(11); - list.add(3,99); - Assert.assertEquals(99, list.get(3)); - Assert.assertEquals(12, list.size()); - Assert.assertEquals(99, list.remove(3)); - Assert.assertEquals(11, list.size()); - Iterator iterator = list.iterator(); - for (int i = 0; i< list.size(); i++) { - System.out.println(list.get(i)); - } - System.out.println("======"); - while (iterator.hasNext()) { - System.out.println(iterator.next()); - } - } - -} diff --git a/group05/1094051862/test01/src/com/coding/basic/BinaryTreeNode.java b/group05/1094051862/test01/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group05/1094051862/test01/src/com/coding/basic/Iterator.java b/group05/1094051862/test01/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group05/1094051862/test01/src/com/coding/basic/LinkedList.java b/group05/1094051862/test01/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 4ef910fc16..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private Node last; - private int size = 0; - - public void add(Object o){ - if (head == null) { - head = new Node(o, null); - size ++; - return; - } - Node n = new Node(o, null); - if (last == null) { - last = n; - head.next = last; - } - last.next = n; - last = n; - size ++; - } - public void add(int index , Object o){ - if (index < 0 || index > size) { - System.out.println("linkedList.add: index < 0 || index > size"); - return; - } - if (index == size) { - add(o); - return; - } - if (index == 0) { - addFirst(o); - return; - } - Node pre = head; - for (int i = 1; i < index; i++) { - pre = pre.next; - } - Node post = pre.next; - Node n = new Node(o,post); - pre.next = n; - size ++; - } - public Object get(int index){ - if (index == 0) { - return head.data; - } - Node n = head; - for (int i = 1; i <= index; i++) { - n = n.next; - } - return n.data; - } - public Object remove(int index){ - if (index < 0 || index >= size) { - System.out.println("remove :index < 0 || index >= size"); - return null; - } - if (index == 0) { - return removeFirst(); - } - if (index == size - 1) { - return removeLast(); - } - Node pre = head; - for (int i = 1; i < index; i++) { - pre = pre.next; - } - Node n = pre.next; - Node post = n.next; - n.next = null; - pre.next = post; - size --; - return n.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node n = new Node(o,head); - head = n; - size ++; - return; - } - public void addLast(Object o){ - Node n = new Node(o,null); - last.next = n; - last = n; - size ++; - return; - } - public Object removeFirst(){ - Object o = head.data; - Node n = head.next; - head.next = null; - head = n; - size --; - return o; - } - public Object removeLast(){ - Node preLast = head; - for (int i = 1; i < size; i++) { - preLast = preLast.next; - } - preLast.next = null; - Object o = last.data; - last = preLast; - size --; - return o; - } - public Iterator iterator(){ - return new Iterator() { - int cusor = 0; - Node current = head; - @Override - public Object next() { - if (!hasNext()) { - System.out.println("next : !hasNext"); - return null; - } - Object o = current.data; - current = current.next; - cusor ++; - return o; - } - - @Override - public boolean hasNext() { - return cusor < size; - } - }; - } - - - private static class Node { - - Object data; - Node next; - - public Node (Object data, Node next) { - this.data = data; - this.next = next; - } - } -} diff --git a/group05/1094051862/test01/src/com/coding/basic/LinkedListTest.java b/group05/1094051862/test01/src/com/coding/basic/LinkedListTest.java deleted file mode 100644 index ca269f7d9f..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/LinkedListTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.coding.basic; - -import junit.framework.Assert; - -import org.junit.Test; - -public class LinkedListTest extends LinkedList { - - @Test - public void test() { - List list = new LinkedList(); - list.add(0); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - list.add(3, 33); - list.add(0, 100); - list.add(8,800); - Assert.assertEquals(9, list.size()); - Assert.assertEquals(100, list.get(0)); - Assert.assertEquals(0, list.get(1)); - Assert.assertEquals(1, list.get(2)); - Assert.assertEquals(2, list.get(3)); - Assert.assertEquals(33, list.get(4)); - Assert.assertEquals(3, list.get(5)); - Assert.assertEquals(4, list.get(6)); - Assert.assertEquals(800, list.get(8)); - Iterator iterator = list.iterator(); - while (iterator.hasNext()) { - System.out.println(iterator.next()); - } - } - -} diff --git a/group05/1094051862/test01/src/com/coding/basic/List.java b/group05/1094051862/test01/src/com/coding/basic/List.java deleted file mode 100644 index ef939ae2cc..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - public Iterator iterator(); -} diff --git a/group05/1094051862/test01/src/com/coding/basic/Queue.java b/group05/1094051862/test01/src/com/coding/basic/Queue.java deleted file mode 100644 index b65d01ab8e..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.basic; - -public class Queue { - private List list = new ArrayList(); - private int size = 0; - public void enQueue(Object o){ - list.add(o); - size ++; - } - - public Object deQueue(){ - if (size == 0) - return null; - size --; - return list.remove(0); - } - - public boolean isEmpty(){ - return size == 0; - } - - public int size(){ - return size; - } -} diff --git a/group05/1094051862/test01/src/com/coding/basic/QueueTest.java b/group05/1094051862/test01/src/com/coding/basic/QueueTest.java deleted file mode 100644 index f75beb397f..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/QueueTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coding.basic; - -import static org.junit.Assert.*; -import junit.framework.Assert; - -import org.junit.Test; - -import sun.org.mozilla.javascript.internal.ast.NewExpression; - -public class QueueTest { - - @Test - public void test() { - Queue queue = new Queue(); - for (int i = 0; i < 100; i++) { - queue.enQueue(i); - } - Assert.assertEquals(100, queue.size()); - for (int i = 0; i < 100; i++) { - Assert.assertEquals(i, queue.deQueue()); - } - Assert.assertEquals(0, queue.size()); - - } - -} diff --git a/group05/1094051862/test01/src/com/coding/basic/Stack.java b/group05/1094051862/test01/src/com/coding/basic/Stack.java deleted file mode 100644 index 7fabb3494f..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.basic; - -public class Stack { - private List elementData = new ArrayList(); - private int size = 0; - public void push(Object o){ - elementData.add(o); - size ++; - } - - public Object pop(){ - if (size == 0) - return null; - return elementData.remove(--size); - } - - public Object peek(){ - if (size == 0) - return null; - return elementData.get(size - 1); - } - public boolean isEmpty(){ - return size == 0; - } - public int size(){ - return size; - } -} diff --git a/group05/1094051862/test01/src/com/coding/basic/StackTest.java b/group05/1094051862/test01/src/com/coding/basic/StackTest.java deleted file mode 100644 index adcb2c6522..0000000000 --- a/group05/1094051862/test01/src/com/coding/basic/StackTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coding.basic; - -import static org.junit.Assert.*; -import junit.framework.Assert; - -import org.junit.BeforeClass; -import org.junit.Test; - -public class StackTest { - - @Test - public void test() { - Stack stack = new Stack(); - for (int i = 0; i < 100; i++) { - stack.push(i); - } - Assert.assertEquals(100, stack.size()); - Assert.assertEquals(99, stack.pop()); - for (int i = 98; i >= 0; i--) { - Assert.assertEquals(i, stack.peek()); - Assert.assertEquals(i, stack.pop()); - } - Assert.assertEquals(0, stack.size()); - } - -} diff --git a/group05/1377699408/.gitignore b/group05/1377699408/.gitignore deleted file mode 100644 index 5deea7e781..0000000000 --- a/group05/1377699408/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/bin -.classpath -.project -.settings/ diff --git "a/group05/1377699408/\344\275\234\344\270\232/20170226/src/list/ArrayList.java" "b/group05/1377699408/\344\275\234\344\270\232/20170226/src/list/ArrayList.java" deleted file mode 100644 index f015ad8623..0000000000 --- "a/group05/1377699408/\344\275\234\344\270\232/20170226/src/list/ArrayList.java" +++ /dev/null @@ -1,54 +0,0 @@ -package list; - -import java.util.Arrays; - -public class ArrayList { - private transient static int INITIAL_SIZE = 10; - private transient int arrayLength; - private transient int size; - private transient E[] array; - public ArrayList(){ - array = (E[]) new Object[INITIAL_SIZE]; - arrayLength = INITIAL_SIZE; - } - public ArrayList(int size){ - if(size<=0){ - throw new IllegalArgumentException("参数不可以小于0"); - } - array = (E[])new Object[size]; - arrayLength = array.length; - ensureCapacity(size); - this.size = size; - } - public int size(){ - return size; - } - public void add(E e){ - ensureCapacity(size+1); - array[size] = e; - size++; - } - public E get(int index){ - if(index<0 || index > size){ - throw new IllegalArgumentException("索引越界"); - } - return array[index]; - - } - public E set(int index, E e){ - if(index<0 || index>size){ - throw new IllegalArgumentException("索引越界"); - } - E result = array[index]; - array[index] = e; - return result; - } - private void ensureCapacity(int size){ - E[] oldArray = array; - int oldSize = arrayLength; - while(size>arrayLength){ - arrayLength = arrayLength + (arrayLength >> 1); - array = Arrays.copyOf(oldArray, arrayLength); - } - } -} diff --git "a/group05/1377699408/\344\275\234\344\270\232/20170226/src/test/ArrayListTest.java" "b/group05/1377699408/\344\275\234\344\270\232/20170226/src/test/ArrayListTest.java" deleted file mode 100644 index e0d277eb10..0000000000 --- "a/group05/1377699408/\344\275\234\344\270\232/20170226/src/test/ArrayListTest.java" +++ /dev/null @@ -1,59 +0,0 @@ -package test; - -import junit.framework.TestCase; -import list.ArrayList; - -public class ArrayListTest extends TestCase { - - protected void setUp() throws Exception { - super.setUp(); - } - - protected void tearDown() throws Exception { - super.tearDown(); - } - - public void testArrayList() { - ArrayList a = new ArrayList(); - assertEquals(a.size(), 0); - } - - public void testArrayListInt() { - ArrayList a = new ArrayList(9); - assertEquals(a.size(), 9); - } - - public void testSize() { - ArrayList a = new ArrayList(9); - assertEquals(a.size(), 9); - ArrayList a2 = new ArrayList(100); - assertEquals(a2.size(), 100); - } - - public void testAdd() { - ArrayList a = new ArrayList(); - for (int i = 0; i < 1000; i++) { - a.add(5); - assertEquals(a.size(), i+1); - assertEquals(a.get(i), new Integer(5)); - } - } - - public void testGet() { - ArrayList a = new ArrayList(); - a.add(6); - assertEquals(a.get(0), new Integer(6)); - - } - - public void testSet() { - ArrayList a = new ArrayList(); - for (int i = 0; i < 100; i++) { - a.add(56); - } - a.set(5, 66); - assertEquals(a.get(5), new Integer(66)); - assertEquals(a.get(7), new Integer(56)); - } - -} diff --git a/group05/183127807/HomeWork0226/.idea/misc.xml b/group05/183127807/HomeWork0226/.idea/misc.xml deleted file mode 100644 index 2e47c90c3c..0000000000 --- a/group05/183127807/HomeWork0226/.idea/misc.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - 1.8 - - - - - - - - \ No newline at end of file diff --git a/group05/183127807/HomeWork0226/.idea/modules.xml b/group05/183127807/HomeWork0226/.idea/modules.xml deleted file mode 100644 index e8f27e7b12..0000000000 --- a/group05/183127807/HomeWork0226/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/group05/183127807/HomeWork0226/.idea/vcs.xml b/group05/183127807/HomeWork0226/.idea/vcs.xml deleted file mode 100644 index c2365ab11f..0000000000 --- a/group05/183127807/HomeWork0226/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/group05/183127807/HomeWork0226/.idea/workspace.xml b/group05/183127807/HomeWork0226/.idea/workspace.xml deleted file mode 100644 index bea69f9904..0000000000 --- a/group05/183127807/HomeWork0226/.idea/workspace.xml +++ /dev/null @@ -1,1056 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - DEFINITION_ORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1487584408499 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group05/183127807/HomeWork0226/HomeWork0226.iml b/group05/183127807/HomeWork0226/HomeWork0226.iml deleted file mode 100644 index c90834f2d6..0000000000 --- a/group05/183127807/HomeWork0226/HomeWork0226.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/group05/183127807/HomeWork0226/src/com/coding/basic/ArrayList.java b/group05/183127807/HomeWork0226/src/com/coding/basic/ArrayList.java deleted file mode 100644 index d8609f5ca3..0000000000 --- a/group05/183127807/HomeWork0226/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private static final int DEFAULT_CAPACITY = 100; - - private int size = 0; - - private Object[] elementData = new Object[DEFAULT_CAPACITY]; - - public void add(Object o){ - ensureCapacity(size+1); - elementData[size] = o; - size++; - } - public void add(int index, Object o){ - if (index > size || index < 0) { - throw new ArrayIndexOutOfBoundsException(); - } - ensureCapacity(size+1); - for (int i = size;i>index;i--) { - elementData[i] = elementData[i - 1]; - } - elementData[index] = o; - size++; - } - - public Object get(int index){ - if (index > size || index < 0) { - throw new ArrayIndexOutOfBoundsException(); - } - return elementData[index]; - } - - - public Object remove(int index){ - Object[] removeData = (Object[]) elementData[index]; - for (int i =index;i elementData.length) { - - elementData = Arrays.copyOf(elementData, minCapacity + DEFAULT_CAPACITY); - } - } - -} diff --git a/group05/183127807/HomeWork0226/src/com/coding/basic/BinaryTreeNode.java b/group05/183127807/HomeWork0226/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group05/183127807/HomeWork0226/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group05/183127807/HomeWork0226/src/com/coding/basic/Iterator.java b/group05/183127807/HomeWork0226/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group05/183127807/HomeWork0226/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group05/183127807/HomeWork0226/src/com/coding/basic/LinkedList.java b/group05/183127807/HomeWork0226/src/com/coding/basic/LinkedList.java deleted file mode 100644 index a1bbcad9db..0000000000 --- a/group05/183127807/HomeWork0226/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - private int size ; - - private Node current = head; - public LinkedList() { - head = null; - size = 0; - } - - public void add(Object o){ - Node newNode = new Node(); - newNode.data = o; - if (current.next == null) - { - current.next = newNode; - } - - while (current.next != null){ - current = current.next; - } - current.next = newNode; - size++; - - } - public void add(int index , Object o){ - - Node newNode = new Node(); - newNode.data = o; - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - for (int i = 0; i < index - 2; i++) { - - current = current.next; - } - - newNode.next = current.next; - current.next = newNode; - size++; - } - public Object get(int index){ - - - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } else if (index == 0) { - return head; - } - for (int i = 0;i elementData.length) { - elementData = grow(elementData, 1); - } - } - - public Object[] grow(Object[] src, int step) { - Object[] target = new Object[src.length + step]; - System.arraycopy(src, 0, target, 0, src.length); - return target; - } - - public void rangeCheck(int index){ - if (index > size || index < 0) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - } - - private class ArrayListIterator implements Iterator { - ArrayList arrayList = null; - int current = 0; - - private ArrayListIterator(ArrayList arrayList) { - this.arrayList = arrayList; - } - - @Override - public boolean hasNext() { - current++; - return current > arrayList.size() ? false : true; - } - - @Override - public Object next() { - return elementData[current]; - } - - } - - public static void main(String[] args) { - ArrayList arrayList = new ArrayList(); - arrayList.add("s1"); - arrayList.add("s2"); - arrayList.add("s3"); - arrayList.add("s4"); - arrayList.add(3, "s33"); - arrayList.add("s5"); - - System.out.println(arrayList.size()); - - System.out.println(arrayList.get(2)); - - arrayList.remove(3); - - System.out.println(arrayList.size()); - - arrayList.add("s1"); - System.out.println(arrayList.size()); - arrayList.remove(5); - System.out.println(arrayList.size()); - - Iterator it = arrayList.iterator(); - while(it.hasNext()){ - System.out.print(it.next() + " "); - } - System.out.println(); - } - -} diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java b/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index 772f30c092..0000000000 --- a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.github.zhanglifeng.coding2017.basic; - -public class BinaryTreeNode { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Object data) { - this.data = data; - left = null; - right = null; - } - - public Object getData() { - return this.data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return this.left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return this.right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Iterator.java b/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Iterator.java deleted file mode 100644 index 288204f51f..0000000000 --- a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.zhanglifeng.coding2017.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java b/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java deleted file mode 100644 index c93a677bfd..0000000000 --- a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,168 +0,0 @@ -package com.github.zhanglifeng.coding2017.basic; - -import java.util.NoSuchElementException; - -/** - * 功能:实现LinkedList. - * @author zhanglifeng. - */ -public class LinkedList implements List { - private Node head, tail; - private int size; - - private Node getNodeByIndex(int index) { - if (index < 0 || index > size - 1) { - throw new IndexOutOfBoundsException("线性表索引越界"); - } - Node current = head; - for (int i = 0; i < size && current != null; i++, current = current.next) { - if (i == index) { - return current; - } - } - return null; - } - - public void add(Object o) { - addLast(o); - } - - public void add(int index, Object o) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("线性表索引越界"); - } - - if (0 == index) { - addFirst(o); - }else{ - Node node = getNodeByIndex(index - 1); - node.next = new Node(o, node.next); - size ++; - } - } - - public Object get(int index) { - return getNodeByIndex(index).data; - } - - public Object remove(int index) { - if (index < 0 || index > size - 1) { - throw new IndexOutOfBoundsException("线性表索引越界"); - } - - if(0 == index){ - return removeFirst(); - }else if(size - 1 == index){ - return removeLast(); - }else{ - Node node = getNodeByIndex(index); - Node preNode = getNodeByIndex(index - 1); - preNode.next = node.next; - size --; - return node.data; - } - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node currentHead = head; - Node newNode = new Node(o, currentHead); - head = newNode; - if(currentHead == null){ - tail = newNode; - } - - size++; - } - - public void addLast(Object o) { - Node currentTail = tail; - Node newNode = new Node(o, null); - tail = newNode; - if(currentTail == null){ - head = newNode; - }else { - currentTail.next = newNode; - } - size++; - } - - public Object removeFirst() { - if(head == null){ - throw new NoSuchElementException(); - } - Node node = new Node(head.data, null); - head = head.next; - size --; - return node.data; - } - - public Object removeLast() { - if(tail == null){ - throw new NoSuchElementException(); - } - Node node = getNodeByIndex(size - 1); - node.next = null; - size --; - return node.data; - } - - public Iterator iterator() { - return new LinkedListIterator(this); - } - - private static class Node { - Object data; - Node next; - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } - - private class LinkedListIterator implements Iterator { - LinkedList linkedList = null; - private int current = 0; - - public LinkedListIterator(LinkedList linkedList) { - this.linkedList = linkedList; - } - - @Override - public boolean hasNext() { - return current < size; - } - - @Override - public Object next() { - return linkedList.get(current ++); - } - } - - public static void main(String[] args) { - LinkedList linkedList = new LinkedList(); - linkedList.add("s1"); - linkedList.add("s2"); - linkedList.add("s3"); - linkedList.addFirst("s0"); - linkedList.addLast("s4"); - - Iterator it = linkedList.iterator(); - while(it.hasNext()){ - System.out.print(it.next() + " "); - } - System.out.println(); - System.out.println("第3个元素:" + linkedList.get(3)); - - System.out.println(linkedList.removeFirst()); - System.out.println(linkedList.size()); - System.out.println("Last element:" + linkedList.removeLast()); - System.out.println(linkedList.size()); - System.out.println("第2个元素:" + linkedList.remove(2)); - System.out.println(linkedList.size()); - } -} diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/List.java b/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/List.java deleted file mode 100644 index e6f5743399..0000000000 --- a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.zhanglifeng.coding2017.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Queue.java b/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Queue.java deleted file mode 100644 index 42ef512321..0000000000 --- a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Queue.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.github.zhanglifeng.coding2017.basic; - -import java.util.EmptyStackException; - -public class Queue { - private LinkedList elementData = new LinkedList(); - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - if (elementData.size() == 0) { - throw new EmptyStackException(); - } - return elementData.removeFirst(); - } - - public boolean isEmpty(){ - return elementData.size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Stack.java b/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Stack.java deleted file mode 100644 index 0761bdd9e7..0000000000 --- a/group05/284422826/src/com/github/zhanglifeng/coding2017/basic/Stack.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.github.zhanglifeng.coding2017.basic; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(0); - } - - public Object pop(){ - if (elementData.size() == 0) { - throw new EmptyStackException(); - } - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - if (elementData.size() == 0) { - throw new EmptyStackException(); - } - return elementData.get(elementData.size() - 1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group05/371492887/task_01/.classpath b/group05/371492887/task_01/.classpath deleted file mode 100644 index 2d7497573f..0000000000 --- a/group05/371492887/task_01/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group05/371492887/task_01/.gitignore b/group05/371492887/task_01/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group05/371492887/task_01/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group05/371492887/task_01/.project b/group05/371492887/task_01/.project deleted file mode 100644 index eca593c703..0000000000 --- a/group05/371492887/task_01/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - task_01 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group05/371492887/task_01/src/com/nitasty/test/ArrayListTest.java b/group05/371492887/task_01/src/com/nitasty/test/ArrayListTest.java deleted file mode 100644 index 848b4fafe9..0000000000 --- a/group05/371492887/task_01/src/com/nitasty/test/ArrayListTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.nitasty.test; - -import static org.junit.Assert.*; -import junit.framework.Assert; - -import org.junit.Before; -import org.junit.Test; - -import com.nitasty.util.ArrayList; -import com.nitasty.util.Iterator; - -public class ArrayListTest { - - private ArrayList list; - - @Before - public void init(){ - list=new ArrayList(); - for (int i = 0; i < 100; i++) { - list.add(i); - } - } - - @Test - public void testAddObject() { - list.add(100); - Assert.assertEquals(101, list.size()); - } - - @Test - public void testAddIntObject() { - list.add(3,"test"); - Assert.assertEquals("test", list.get(3)); - } - - @Test - public void testRemoveInt() { - list.add(3,"test"); - list.remove(3); - Assert.assertEquals(3, list.get(3)); - } - - @Test - public void testRemoveObject() { - list.add(0,"test"); - list.remove("test"); - Assert.assertEquals(0, list.get(0)); - } - - - @Test - public void testIsEmpty() { - list.clear(); - Assert.assertEquals(true, list.isEmpty()); - } - - @Test - public void testContains() { - Assert.assertEquals(false, list.contains("test")); - list.add("test"); - Assert.assertEquals(true, list.contains("test")); - } - - - - @Test - public void testSet() { - Assert.assertEquals(true, list.contains(3)); - list.set(3, "test"); - Assert.assertEquals(true, list.contains("test")); - Assert.assertEquals(false, list.contains(3)); - } - - @Test - public void testIndexOf() { - list.set(3, "test"); - Assert.assertEquals(3, list.indexOf("test")); - } - - @Test - public void testLastIndexOf() { - list.set(3, "test"); - list.set(33, "test"); - Assert.assertEquals(33, list.lastIndexOf("test")); - } - - @Test - public void testHasNext(){ - int i=0; - for(Iterator it=list.iterator();it.hasNext();i++){ - Assert.assertEquals(i, it.next()); -// System.out.println(it.next()); - } - } -} diff --git a/group05/371492887/task_01/src/com/nitasty/test/BinaryTreeTest.java b/group05/371492887/task_01/src/com/nitasty/test/BinaryTreeTest.java deleted file mode 100644 index abb27b5691..0000000000 --- a/group05/371492887/task_01/src/com/nitasty/test/BinaryTreeTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.nitasty.test; - -import static org.junit.Assert.*; -import junit.framework.Assert; - -import org.junit.Before; -import org.junit.Test; - -import com.nitasty.util.BinaryTree; - -public class BinaryTreeTest { - - BinaryTree tree; - - @Before - public void init(){ - tree=new BinaryTree(); - tree.insert(5); - tree.insert(3); - tree.insert(8); - tree.insert(2); - tree.insert(7); - tree.insert(9); - tree.insert(1); - tree.insert(4); - tree.insert(10); - tree.insert(6); - } - - @Test - public void testMakeEmpty() { - tree.makeEmpty(); - Assert.assertEquals(true, tree.isEmpty()); - } - - @Test - public void testGetHeight() { - Assert.assertEquals(3, tree.getHeight()); - } - - @Test - public void testContains() { - for (int i = 1; i < 11; i++) { - Assert.assertEquals(true, tree.contains(i)); - } - } - - @Test - public void testFindMin() { - Assert.assertEquals(1, tree.findMin()); - } - - @Test - public void testFindMax() { - Assert.assertEquals(10, tree.findMax()); - } - - - @Test - public void testRemove() { - tree.remove(3); - Assert.assertEquals(false, tree.contains(3)); - } - - -} diff --git a/group05/371492887/task_01/src/com/nitasty/test/LinkedListTest.java b/group05/371492887/task_01/src/com/nitasty/test/LinkedListTest.java deleted file mode 100644 index dcbe6353c3..0000000000 --- a/group05/371492887/task_01/src/com/nitasty/test/LinkedListTest.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.nitasty.test; - -import static org.junit.Assert.*; -import junit.framework.Assert; - -import org.junit.Before; -import org.junit.Test; - -import com.nitasty.util.ArrayList; -import com.nitasty.util.Iterator; -import com.nitasty.util.LinkedList; - -public class LinkedListTest { - - private LinkedList list; - - @Before - public void init(){ - list=new LinkedList(); - for (int i = 0; i < 100; i++) { - list.add(i); - } - } - - @Test - public void testGet() { - IndexOutOfBoundsException tx=null; - for (int i = 0; i < 100; i++) { - Assert.assertEquals(i, list.get(i)); - } - - try { - list.get(100); - } catch (IndexOutOfBoundsException e) { - tx=e; - } - Assert.assertEquals(IndexOutOfBoundsException.class,tx.getClass()); - } - - @Test - public void testRemoveInt() { - for (int i = 99; i >= 0; i--) { - Assert.assertEquals(i, list.remove(i)); - } - } - - @Test - public void testSize() { - Assert.assertEquals(100, list.size()); - } - - @Test - public void testAddFirst() { - list.addFirst(-1); - for (int i = 0; i < 101; i++) { - Assert.assertEquals(i-1, list.get(i)); - } - } - - @Test - public void testAddLast() { - - for (int i = 100; i < 1000; i++) { - list.addLast(i); - } - - for (int i = 0; i < 1000; i++) { - Assert.assertEquals(i, list.get(i)); - } - } - - @Test - public void testAddBefore() { - list.addBefore(66,list.node(3)); - Assert.assertEquals(66, list.get(3)); - } - - @Test - public void testAddAfter() { - list.addAfter(66,list.node(3)); - Assert.assertEquals(66, list.get(4)); - } - - @Test - public void testIsEmpty() { - list.clear(); - Assert.assertEquals(true, list.isEmpty()); - } - - @Test - public void testContains() { - for (int i = 0; i < 100; i++) { - Assert.assertEquals(true, list.contains(i)); - Assert.assertEquals(false, list.contains(i+100)); - } - } - - - @Test - public void testAddIntObject() { - list.add(20,"test"); - Assert.assertEquals("test", list.get(20)); - } - - @Test - public void testRemoveObject() { - list.remove(30); - Assert.assertEquals(31, list.get(30)); - } - - @Test - public void testSet() { - for (int i = 0; i < 100; i++) { - list.set(i, i+100); - Assert.assertEquals(i+100, list.get(i)); - } - } - - @Test - public void testIndexOf() { - list.set(3, "test"); - Assert.assertEquals(3, list.indexOf("test")); - } - - @Test - public void testLastIndexOf() { - list.set(3, "test"); - list.set(33, "test"); - Assert.assertEquals(33, list.lastIndexOf("test")); - } - - @Test - public void testHasNext(){ - int i=0; - - for(Iterator it=list.iterator();it.hasNext();i++){ - Assert.assertEquals(i, it.next()); -// System.out.println(it.next()); - } - } - -} diff --git a/group05/371492887/task_01/src/com/nitasty/test/QueueTest.java b/group05/371492887/task_01/src/com/nitasty/test/QueueTest.java deleted file mode 100644 index fa17263108..0000000000 --- a/group05/371492887/task_01/src/com/nitasty/test/QueueTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.nitasty.test; - -import static org.junit.Assert.*; -import junit.framework.Assert; - -import org.junit.Before; -import org.junit.Test; - -import com.nitasty.util.LinkedList; -import com.nitasty.util.Queue; - -public class QueueTest { - - Queue queue; - - @Before - public void init(){ - queue=new Queue(); - for (int i = 0; i < 100; i++) { - queue.enQueue(i); - } - } - - @Test - public void testDeQueue() { - for(int i=0; i<100;i++){ - Assert.assertEquals(i, queue.deQueue()); - } - } - - @Test - public void testIsEmpty() { - for(int i=0; i<100;i++){ - queue.deQueue(); - if(i<99) - Assert.assertEquals(false, queue.isEmpty()); - } - Assert.assertEquals(true, queue.isEmpty()); - } - - @Test - public void testSize() { - for(int i=99; i>0;i--){ - queue.deQueue(); - Assert.assertEquals(i, queue.size()); - } - } - -} diff --git a/group05/371492887/task_01/src/com/nitasty/test/StackTest.java b/group05/371492887/task_01/src/com/nitasty/test/StackTest.java deleted file mode 100644 index 3ecd59219a..0000000000 --- a/group05/371492887/task_01/src/com/nitasty/test/StackTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.nitasty.test; - -import static org.junit.Assert.*; -import junit.framework.Assert; - -import org.junit.Before; -import org.junit.Test; - -import com.nitasty.util.LinkedList; -import com.nitasty.util.Stack; - -public class StackTest { - - Stack stack; - - @Before - public void init(){ - stack=new Stack(); - for (int i = 0; i < 100; i++) { - stack.push(i); - } - } - - @Test - public void testPop() { - for (int i = 99; i >=0; i--) { - Assert.assertEquals(i, stack.pop()); - } - } - - @Test - public void testPeek() { - for (int i = 99; i >=0; i--) { - Assert.assertEquals(99, stack.peek()); - } - } - - @Test - public void testIsEmpty() { - for (int i = 99; i >=0; i--) { - stack.pop(); - } - Assert.assertEquals(true,stack.isEmpty()); - } - - @Test - public void testSize() { - Assert.assertEquals(100,stack.size()); - } - -} diff --git a/group05/371492887/task_01/src/com/nitasty/util/ArrayList.java b/group05/371492887/task_01/src/com/nitasty/util/ArrayList.java deleted file mode 100644 index 88ef682cf9..0000000000 --- a/group05/371492887/task_01/src/com/nitasty/util/ArrayList.java +++ /dev/null @@ -1,307 +0,0 @@ -package com.nitasty.util; - -import java.util.Arrays; -import java.util.Objects; - -public class ArrayList implements List { - - // ڲ - private static final int DEFAULT_CAPACITY = 10; - - private static final Object[] EMPTY_ELEMENTDATA = {}; - - private int size; - - private Object[] elementData; - - /** - * - * ޲γʼΪ飬ʡռ - */ - public ArrayList() { - this.elementData = EMPTY_ELEMENTDATA; - } - - /** - * - * @param initCapacity - */ - public ArrayList(int initCapacity) { - if (initCapacity > 0) { - elementData = new Object[initCapacity]; - } else if (initCapacity == 0) { - elementData = EMPTY_ELEMENTDATA; - } else { - throw new IllegalArgumentException("Ƿʼ" + initCapacity); - } - - } - - // TODO - public ArrayList(List list) { - list.toArray(); - - } - - /** - * У - * - * @param minCapacity - */ - private void ensureCapacity(int minCapacity) { - - if (elementData.length < minCapacity) { - grow(minCapacity); - } - - } - - /** - * - * - * @param minCapacity - * @return - */ - private void grow(int minCapacity) { - // - int oldCapacity = this.elementData.length; - // Ϊ1.5 - int newCapacity = oldCapacity + oldCapacity >> 1; - // СȽ - if (newCapacity < minCapacity) { - newCapacity = minCapacity; - } - // ܴintֵ - if (newCapacity > Integer.MAX_VALUE) { - newCapacity = Integer.MAX_VALUE; - } - elementData = Arrays.copyOf(elementData, newCapacity); - - } - - @Override - public int size() { - return size; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - @Override - public boolean contains(Object o) { - return indexOf(o) >= 0; //д=ֵbug - } - - @Override - public boolean add(Object o) { - - ensureCapacity(size + 1); - - elementData[size++] = o;// sizeindex1 - - return true; - } - - private void rangeCheck(int index) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - - private String outOfBoundsMsg(int index) { - return "index:" + index + ", size:" + size; - } - - @Override - public boolean add(int index, Object o) { - - rangeCheck(index); - ensureCapacity(size + 1); - System.arraycopy(elementData, index, elementData, index + 1, size - - index);// sizeը - elementData[index] = o; - return true; - } - - @Override - public boolean addAll(Object[] o) { - int numNew = o.length; - ensureCapacity(size + numNew); - System.arraycopy(o, 0, elementData, size, numNew); - size += numNew;// size - return numNew != 0; - } - - @Override - public boolean addAll(int index, Object[] o) { - rangeCheck(index); - int numNew = o.length; - ensureCapacity(size + numNew); - - int numMoved = size - index;// rangeCheckindex϶Сsize - if (numMoved > 0) - System.arraycopy(elementData, index, elementData, size + numNew, - numNew);// ԭԪƵ - System.arraycopy(o, 0, elementData, index, numNew);// ƽҪӵԪ - - size += numNew;// Ҫ˰ - return numNew != 0; - } - - @Override - public Object remove(int index) { - rangeCheck(index); - Object oldValue = elementData[index]; - - int numMoved = size - index - 1; - if (numMoved > 0) - System.arraycopy(elementData, index+1, elementData, index, - numMoved); - elementData[--size] = null;// Clear to let gc do its work - - return oldValue; - } - - @Override - public boolean remove(Object o) { - int index=this.indexOf(o); - if(index==-1){ - return false; - }else{ - this.remove(index); - return true; - } - } - - @Override - /** - * ɾlist - */ - public boolean removeAll(List list) { - Objects.requireNonNull(list); - return batchRemove(list,false); - } - - /** - * ʵremoveALlretainAll - * @param list - * @param complement - * @return - */ - private boolean batchRemove(List list, boolean complement) { - final Object[] elementData=this.elementData; - int r=0,w=0; - boolean modified=false; - try{ - for(;r= 0; i--) { - if (elementData[i] == null) { - return i; - } - } - } else { - for (int i = size-1; i >= 0; i--) { - if (o.equals(elementData[i])) { - return i; - } - } - } - return -1;// ûҵ - } - - @Override - public Iterator iterator() { - return new Itr(); - } - - @Override - public Object[] toArray() { - return Arrays.copyOf(elementData, size);//ҪֱӷelementData - } - - @Override - public void clear() { - for(int i=0; i ʵComparable - */ -public class BinaryTree> { - - private BinaryNode root; - - public BinaryTree(){ - this.root=null; - } - - public BinaryTree(BinaryNode root) { - this.root = root; - } - - public void makeEmpty(){ - root=null; - } - - public boolean isEmpty(){ - return root==null; - } - - public int getHeight(){ - return height(root); - } - - public boolean contains(E x){ - return contains(x,root); - } - - - public E findMin(){ - if(isEmpty()) - throw new NullPointerException();//׸ʲôأTODO - return (E) findMin(root).data; //ΪʲôҪתͣ - } - - - - public E findMax(){ - if(isEmpty()) - throw new NullPointerException();//׸ʲôأTODO - return (E) findMax(root).data;//ΪʲôҪתͣ - } - - public void insert(E x){ - root=insert(x,root);//ΪɶҪrootӷֵΪⷽǵݹ - } - - public void remove(E x){ - root=remove(x,root);//ΪɶҪrootӷֵΪⷽǵݹ - } - - //ӡdata - public void printTree(){ - if(isEmpty()) - System.out.println("Empty tree"); - else - printTree(root); - } - - public void printTreeStructure(){ - if(isEmpty()) - System.out.println("Empty tree"); - else - printTreeStructure(root,0); - } - - private void printTreeStructure(BinaryNode t,int i) { - StringBuffer buff=new StringBuffer(); - if(t!=null){ - for(int j=0;j= 0 && index < size; - } - - private boolean isPositionIndex(int index) { - return index >= 0 && index <= size; // postionӵ - } - - @Override - public boolean remove(Object o) { - - return false; - } - - @Override - public boolean removeAll(List list) { - // TODO Auto-generated method stub - return false; - } - - @Override - public Object set(int index, Object o) { - checkElementIndex(index); - Node node=node(index); - Object oldValue=node.data; - node.data=o; - return oldValue; - } - - @Override - public int indexOf(Object o) { - int index = 0; - if (o == null) { - for (Node x = first; x != null; x = x.next) { // µѭʽ - if (x.data == null) - return index; - index++; - } - } else { - for (Node x = first; x != null; x = x.next) { // µѭʽ - if (o.equals(x.data)) - return index; - index++; - } - } - return -1; - } - - @Override - public int lastIndexOf(Object o) { - int index = size-1; - if (o == null) { - for (Node x = last; x != null; x = x.prev) { // µѭʽ - if (x.data == null) - return index; - index--; - } - } else { - for (Node x = last; x != null; x = x.prev) { // µѭʽ - if (o.equals(x.data)) - return index; - index--; - } - } - return -1; - } - - @Override - public Object[] toArray() { - Object[] elementData = new Object[size]; - int i = 0; - for (Node x = first; x != null; x = x.next) { - elementData[i++] = x.data; - } - return elementData; - } - - @Override - public void clear() { - // bugը - // for(Node x=first;x!=null;x=x.next){ - // x=null; - // } - - for (Node x = first; x != null;) { - Node next = x.next; - x.prev = null; - x.data = null; - x.next = null; - x = next; - } - size = 0; - first = last = null; - } - - public Iterator iterator(){ - return new Itr(); - } - - private class Itr implements Iterator{ - private Node lastRetured; - private Node next; - int cursor; - - @Override - public boolean hasNext() { - return cursor - - - - - - diff --git a/group05/399258474/.gitignore b/group05/399258474/.gitignore deleted file mode 100644 index 3e2fcc7171..0000000000 --- a/group05/399258474/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group05/399258474/.project b/group05/399258474/.project deleted file mode 100644 index 2858b5b710..0000000000 --- a/group05/399258474/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group05/399258474/.settings/org.eclipse.jdt.core.prefs b/group05/399258474/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a87..0000000000 --- a/group05/399258474/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group05/399258474/src/com/coding/basic/ArrayList.java b/group05/399258474/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 5030b8d001..0000000000 --- a/group05/399258474/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[2]; - - public void add(Object o){ - int len = elementData.length; - if(size >= len){ - Object[] new_elmentData = new Object[len*2]; - System.arraycopy(elementData, 0, new_elmentData, 0, size); - elementData = new_elmentData; - } - elementData[size] = o; - size ++; - } - public void add(int index, Object o){ - if(index >= size){ - throw new RuntimeException("下标越界"); - } - Object[] new_elementData = new Object[size+1]; - System.arraycopy(elementData, 0, new_elementData, 0, index); - System.arraycopy(elementData, index, new_elementData, index+1, size-index); - new_elementData[index] = o; - elementData = new_elementData; - size++; - } - - public Object get(int index){ - if(index >= size){ - throw new RuntimeException("下标越界"); - } - return elementData[index]; - } - - public Object remove(int index){ - if(index >= size){ - throw new RuntimeException("下标越界"); - } - Object oldElement = elementData[index]; - if((index+1) != size){ - System.arraycopy(elementData, index+1, elementData, index, size-index-1); - } - elementData[size-1] = null; - size --; - return oldElement; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return null; - } - - @Override - public String toString() { - String s = "{"; - for (int i = 0; i < size; i++) { - if(i == (size -1)){ - s += elementData[i] + "}"; - }else{ - s += elementData[i]+","; - } - } - return s; - } -} diff --git a/group05/399258474/src/com/coding/basic/BinaryTreeNode.java b/group05/399258474/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 266eff3d56..0000000000 --- a/group05/399258474/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group05/399258474/src/com/coding/basic/Iterator.java b/group05/399258474/src/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/group05/399258474/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group05/399258474/src/com/coding/basic/LinkedList.java b/group05/399258474/src/com/coding/basic/LinkedList.java deleted file mode 100644 index ff69d8d341..0000000000 --- a/group05/399258474/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private int size; - - public LinkedList(){ - head = new Node(new Object(),null,null); - } - - public void add(Object o){ - Node last = head; - for (int i = 0; i < size; i++) { - last = last.next; - } - Node newNode = new Node(o,null,last); - last.next = newNode; - size++; - } - public void add(int index , Object o){ - Node oldNode = getNode(index); - Node newNode = new Node(o, oldNode, oldNode.prev); - oldNode.prev.next = newNode; - oldNode.prev = newNode; - size ++; - } - public Object get(int index){ - Node node = getNode(index); - return node.data; - } - - private Node getNode(int index){ - Node n = head.next; - for (int i = 0; i < index; i++) { - n = n.next; - } - return n; - } - - public Object remove(int index){ - Node node = getNode(index); - Object o =node.data; - Node prevNode = node.prev; - Node nextNode = node.next; - prevNode.next = nextNode; - nextNode.prev = prevNode; - node.next = node.prev =null; - node.data = null; - size --; - return o; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - add(0,o); - } - public void addLast(Object o){ - add(o); - } - public Object removeFirst(){ - Object o = remove(0); - return o; - } - public Object removeLast(){ - Object o = remove(size); - return o; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - Node prev; - - public Node(Object o,Node next,Node prev){ - this.data = o; - this.next = next; - this.prev = prev; - } - } - - @Override - public String toString() { - String s = "{"; - Node n = head; - for (int i = 0; i < size; i++) { - n = n.next; - if(i == (size -1)){ - s += n.data; - }else{ - s += n.data + ","; - } - } - s += "}"; - return s; - } -} diff --git a/group05/399258474/src/com/coding/basic/List.java b/group05/399258474/src/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/group05/399258474/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group05/399258474/src/com/coding/basic/Queue.java b/group05/399258474/src/com/coding/basic/Queue.java deleted file mode 100644 index a0bb03e6f2..0000000000 --- a/group05/399258474/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList list = new LinkedList(); - - public void enQueue(Object o){ - list.add(o); - } - - public Object deQueue(){ - if(isEmpty()){ - throw new RuntimeException("已为空"); - } - Object o = list.get(0); - list.remove(0); - return o; - } - - public boolean isEmpty(){ - if(size() == 0){ - return true; - }else{ - return false; - } - } - - public int size(){ - return list.size(); - } - - @Override - public String toString() { - return list.toString(); - } -} diff --git a/group05/399258474/src/com/coding/basic/Stack.java b/group05/399258474/src/com/coding/basic/Stack.java deleted file mode 100644 index 4d137996b6..0000000000 --- a/group05/399258474/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if(isEmpty()){ - throw new RuntimeException("已为空"); - } - Object o = elementData.get(elementData.size()-1); - elementData.remove(elementData.size()-1); - return o; - } - - public Object peek(){ - Object o = elementData.get(elementData.size()-1); - return o; - } - public boolean isEmpty(){ - int size = elementData.size(); - if(size == 0){ - return true; - }else{ - return false; - } - } - public int size(){ - return elementData.size(); - } - - @Override - public String toString() { - return elementData.toString(); - } -} diff --git a/group05/399258474/src/test/BasicTest.java b/group05/399258474/src/test/BasicTest.java deleted file mode 100644 index 7339881525..0000000000 --- a/group05/399258474/src/test/BasicTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package test; - -import org.junit.Test; - -import com.coding.basic.ArrayList; -import com.coding.basic.LinkedList; -import com.coding.basic.Queue; -import com.coding.basic.Stack; - -public class BasicTest { - - @Test - public void ArrayListTest() { - ArrayList list = new ArrayList(); - list.add(1); - list.add(2); - list.add(3); - System.out.println(list); - list.add(1, 99); - System.out.println(list); - list.remove(1); - System.out.println(list); - } - - @Test - public void LinkedListTest(){ - LinkedList l = new LinkedList(); - l.add(1); - l.add(2); - l.add(3); - System.out.println(l); - l.add(1, 99); - System.out.println(l); - l.remove(1); - System.out.println(l); - System.out.println(l.size()); - } - - @Test - public void StackTest(){ - Stack s = new Stack(); - s.push(1); - s.push(2); - System.out.println(s); - if(s.isEmpty()){ - System.out.println("空"); - }else{ - System.out.println("非空"); - - } - System.out.println(s.peek()); - s.pop(); - System.out.println(s); - s.pop(); - System.out.println(s); - if(s.isEmpty()){ - System.out.println("空"); - }else{ - System.out.println("非空"); - - } - s.pop(); - } - - @Test - public void QueueTest(){ - Queue q = new Queue(); - q.enQueue(1); - q.enQueue(2); - System.out.println(q); - q.deQueue(); - System.out.println(q); - q.enQueue(3); - System.out.println(q); - System.out.println(q.size()); - } - -} diff --git a/group05/441517454/work1/.classpath b/group05/441517454/work1/.classpath deleted file mode 100644 index fceb4801b5..0000000000 --- a/group05/441517454/work1/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group05/441517454/work1/.gitignore b/group05/441517454/work1/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group05/441517454/work1/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group05/441517454/work1/.project b/group05/441517454/work1/.project deleted file mode 100644 index 49a7fabffd..0000000000 --- a/group05/441517454/work1/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - work1 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group05/441517454/work1/.settings/org.eclipse.jdt.core.prefs b/group05/441517454/work1/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group05/441517454/work1/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group05/441517454/work1/src/com/coding/basic/ArrayList.java b/group05/441517454/work1/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 01671f55d8..0000000000 --- a/group05/441517454/work1/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - if(sizeindex;i--){ - elementData[i]=elementData[i-1]; - } - elementData[index] = o; - this.size++; - } - else if(index<(this.size)&&this.size==elementData.length) - { - elementData = grow(elementData,1); - elementData[index] = o; - this.size++; - } - else{ - System.out.println("index/>sizeʧ"); - - } - - - } - - public Object get(int index){ - - if(this.size>0&&index<(this.size)) - return elementData[index]; - else{ - return null; - } - } - - public Object remove(int index){ - - if(this.size>0&&index<(this.size)) - { Object o= elementData[index]; - for(int i=index;iarrayList.size){ - return false; - }else - return true; - } - - @Override - public Object next() { - - return arrayList.get(pos-1); - }} -} diff --git a/group05/441517454/work1/src/com/coding/basic/BinaryTreeNode.java b/group05/441517454/work1/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group05/441517454/work1/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group05/441517454/work1/src/com/coding/basic/Iterator.java b/group05/441517454/work1/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group05/441517454/work1/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group05/441517454/work1/src/com/coding/basic/LinkedList.java b/group05/441517454/work1/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 5eefddce8b..0000000000 --- a/group05/441517454/work1/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.coding.basic; - - - -public class LinkedList implements List { - - private Node head; - private Node body; - //private Node body1; - private int size = 0; - - - public void add(Object o){ - if(null == head){ - head = new Node(); - head.data = o; - head.next = null; - size++; - } -// else if(head.next == null){ -// -// head.next =new Node(); -// head.next.data = o; -// head.next.next = null; -// body=head.next; -// size++; -// } - else { - body=head; - while(!(body.next ==null)) - {body =body.next;} - body.next =new Node(); - body.next.data =o; - body.next.next =null; - size++; - } - - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - if (index1) - {body=head; - for (int i=0;ilinkedList.size){ - return false; - }else - return true; - } - - @Override - public Object next() { - - return linkedList.get(pos-1); - }} -} diff --git a/group05/441517454/work1/src/com/coding/basic/List.java b/group05/441517454/work1/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group05/441517454/work1/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group05/441517454/work1/src/com/coding/basic/Queue.java b/group05/441517454/work1/src/com/coding/basic/Queue.java deleted file mode 100644 index cae520dbce..0000000000 --- a/group05/441517454/work1/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -public class Queue { - private ArrayList elementData = new ArrayList(); - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - - if(elementData.size()>0) - - { - elementData.remove(0); - return elementData.remove(0); - } - else return null; - } - - public boolean isEmpty(){ - if(elementData.size()>0) - return false; - else return true; - - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group05/441517454/work1/src/com/coding/basic/Stack.java b/group05/441517454/work1/src/com/coding/basic/Stack.java deleted file mode 100644 index 40e8518b24..0000000000 --- a/group05/441517454/work1/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if(elementData.size()>0) - - { int size =elementData.size(); - elementData.remove(size-1); - return elementData.remove(size-1);} - else return null; - } - - public Object peek(){ - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - if(elementData.size()>0) - return false; - else return true; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group05/441517454/work1/src/com/coding/basic/Test1.java b/group05/441517454/work1/src/com/coding/basic/Test1.java deleted file mode 100644 index b7f644c95d..0000000000 --- a/group05/441517454/work1/src/com/coding/basic/Test1.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coding.basic; - -public class Test1 { - public static void main (String[] args){ -// ArrayList arr = new ArrayList(); -// arr.add(1); -// arr.add(2); -// arr.add(3); -// arr.add(4); -// arr.remove(3); -// arr.add(6); -// arr.add(7); -// System.out.println(arr.size()+"_"); -// Iterator it =arr.iterator(); -// while(it.hasNext()){ -// System.out.println(it.next()); -// } -// LinkedList link = new LinkedList(); -// link.add(0); -// link.add(1); -// link.add(2); -// link.add(3); -// link.add(4); -// link.add(5); -// link.remove(2); -// link.addFirst(100); -// link.addLast(200); -// //link.removeFirst(); -// //link.removeLast(); -//// System.out.println(link.size()+"_"); -//// System.out.println(link.get(0)); -//// System.out.println(link.get(link.size()-1)); -//// -// -// Iterator it =link.iterator(); -// while(it.hasNext()){ -// System.out.println(it.next()); -// } - Stack st = new Stack(); - st.push(0); - st.push(1); - st.push(2); - st.push(4); - st.push(5); - st.pop(); - System.out.println(st.peek()); - } -} \ No newline at end of file diff --git a/group05/515505513/RemoteSystemsTempFiles/.project b/group05/515505513/RemoteSystemsTempFiles/.project deleted file mode 100644 index 5447a64fa9..0000000000 --- a/group05/515505513/RemoteSystemsTempFiles/.project +++ /dev/null @@ -1,12 +0,0 @@ - - - RemoteSystemsTempFiles - - - - - - - org.eclipse.rse.ui.remoteSystemsTempNature - - diff --git a/group05/515505513/Task01/.classpath b/group05/515505513/Task01/.classpath deleted file mode 100644 index fceb4801b5..0000000000 --- a/group05/515505513/Task01/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group05/515505513/Task01/.gitignore b/group05/515505513/Task01/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group05/515505513/Task01/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group05/515505513/Task01/.project b/group05/515505513/Task01/.project deleted file mode 100644 index cf494f7a91..0000000000 --- a/group05/515505513/Task01/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - Task01 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group05/515505513/Task01/.settings/org.eclipse.jdt.core.prefs b/group05/515505513/Task01/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group05/515505513/Task01/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group05/515505513/Task01/src/com/coding/basic/ArrayList.java b/group05/515505513/Task01/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 29fc9b98cb..0000000000 --- a/group05/515505513/Task01/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - - private int size = 0; - private static final int DEFAULT_SIZE = 100; - private Object[] elementData = new Object[DEFAULT_SIZE]; - - //添加元素 - public void add(Object o){ - add(size(),o); - } - - - public void add(int index, Object o){ - if(elementData.length==size()){ - ensureCapacity(size()*2 + 1); - } - for (int i = size; i > index; i--) - elementData[i]=elementData[i-1]; - elementData[index] = o; - size++; - } - //扩容 - public void ensureCapacity(int newCapacity){ - if(newCapacity < size){ - return; - } - Object[] oldElements = elementData; - elementData = new Object[newCapacity]; - for (int i = 0; i < size; i++) { - elementData[i] = oldElements[i]; - } - } - //返回固定下标的元素 - public Object get(int index){ - if(index<0 || index >=size){ - throw new ArrayIndexOutOfBoundsException("指定的index超过界限"); - } - return elementData[index]; - } - //删除指定位置的元素 - public Object remove(int index){ - Object removeElement = elementData[index]; - for (int i = index; i < size; i++) { - elementData[i] = elementData[i+1]; - } - size--; - return removeElement; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator{ - private int current = 0; - @Override - public boolean hasNext() { - return current < size; - } - @Override - public Object next() { - if(!hasNext()){ - throw new NoSuchElementException(); - } - return elementData[current+1]; - } - } - -} diff --git a/group05/515505513/Task01/src/com/coding/basic/BinaryTreeNode.java b/group05/515505513/Task01/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group05/515505513/Task01/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group05/515505513/Task01/src/com/coding/basic/Iterator.java b/group05/515505513/Task01/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group05/515505513/Task01/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group05/515505513/Task01/src/com/coding/basic/LinkedList.java b/group05/515505513/Task01/src/com/coding/basic/LinkedList.java deleted file mode 100644 index ea3d6a07f3..0000000000 --- a/group05/515505513/Task01/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head;//指针 - private Object element;//元素 - //添加一个元素 - public void add(Object o){ - - } - //在index处添加一个元素 - public void add(int index , Object o){ - - } - - public Object get(int index){ - return null; - } - //清除一个元素 - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - private static class Node{ - Object data;//元素 - Node next;//指针 - } -} diff --git a/group05/515505513/Task01/src/com/coding/basic/List.java b/group05/515505513/Task01/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group05/515505513/Task01/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group05/515505513/Task01/src/com/coding/basic/Queue.java b/group05/515505513/Task01/src/com/coding/basic/Queue.java deleted file mode 100644 index fd316ac7bf..0000000000 --- a/group05/515505513/Task01/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.coding.basic; - -public class Queue { - private int maxSize;//队列容量 - private Object[] queue;//队列 - private int head;//队列头,可以删除 - private int tail;//队列尾,可以插入 - - - public Queue() { - this(10); - } - - public Queue(int maxSize) { - if(maxSize >=0){ - this.maxSize = maxSize; - this.queue = new Object[maxSize]; - head = tail = 0; - }else { - throw new RuntimeException("初始化大小不能小于0"); - } - } - - public void enQueue(Object o){ - if(tail == maxSize){ - throw new RuntimeException("队列已满,无法插入新的元素!"); - }else { - queue[tail++] = o; - } - } - - public Object deQueue(){ - if(isEmpty()){ - throw new RuntimeException("空队列异常!"); - }else { - Object value = queue[head]; - queue[head++] = null; - return value; - } - } - //队列是否为空 - public boolean isEmpty(){ - return head==tail?true:false; - } - - public int size(){ - return tail-head; - } -} diff --git a/group05/515505513/Task01/src/com/coding/basic/Stack.java b/group05/515505513/Task01/src/com/coding/basic/Stack.java deleted file mode 100644 index a85cfed9d2..0000000000 --- a/group05/515505513/Task01/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.coding.basic; - -public class Stack { - private Object[] data; - private int capacity; - private int size; - public Stack(){ - capacity = 16; - size = 0; - data = new Object[capacity]; - } - public void push(Object o){ - if(size < capacity){ - data[size++] = o; - }else { - ensureCapacity(); - data[size++] = o; - } - } - - private void ensureCapacity() { - capacity = capacity*2; - } - public Object pop(){ - if(size > 0){ - System.out.println(data[size-1]); - //data[size--] = null; - }else { - System.out.println("Empty stack"); - } - size--; - return data[size]; - } - - public Object peek(){ - if(size>0){ - return data[size-1]; - }else { - return null; - } - } - public boolean isEmpty(){ - - return size==0; - } - public int size(){ - return size; - } -} diff --git a/group05/515505513/Task01/src/com/coding/basic/TestExample.java b/group05/515505513/Task01/src/com/coding/basic/TestExample.java deleted file mode 100644 index 59bfa47a3c..0000000000 --- a/group05/515505513/Task01/src/com/coding/basic/TestExample.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coding.basic; - -public class TestExample { - - public static void main(String[] args) { - /*Stack mystack = new Stack(); - for (int i = 0; i < 10; i++) { - mystack.push(i); - } - for (int i = 0; i < 10; i++) { - mystack.pop(); - System.out.println("==="+mystack.peek()); - }*/ - - /*Test Queue - Queue myQqueue = new Queue(10); - for (int i = 0; i < 10; i++) { - myQqueue.enQueue(i); - } - for (int i = 0; i < 10; i++) { - System.out.println(myQqueue.deQueue()); - }*/ - - - } - -} diff --git a/group05/578505552/.gitignore b/group05/578505552/.gitignore deleted file mode 100644 index 05ba5e4384..0000000000 --- a/group05/578505552/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -#ide config -.metadata -.recommenders -.idea/ diff --git a/group05/578505552/578505552.iml b/group05/578505552/578505552.iml deleted file mode 100644 index 95e7551d7a..0000000000 --- a/group05/578505552/578505552.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group05/578505552/pom.xml b/group05/578505552/pom.xml deleted file mode 100644 index 3e841624e0..0000000000 --- a/group05/578505552/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - 4.0.0 - - com.coding2017.yang - basic - 1.0-SNAPSHOT - jar - - basic - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 4.12 - - - diff --git a/group05/578505552/src/main/java/com/coding/basic/ArrayList.java b/group05/578505552/src/main/java/com/coding/basic/ArrayList.java deleted file mode 100644 index 54d8f05f02..0000000000 --- a/group05/578505552/src/main/java/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -/** - * Created by songbao.yang on 2017/2/21. - * - */ -public class ArrayList implements List { - - private int size = 0; - private Object[] elementData; - private static final int MIN_CAPACITY = 10; - - public ArrayList(int size) { - if (size < 0){ - throw new IllegalArgumentException("illega size: " + size); - } - this.elementData = new Object[size]; - } - - public ArrayList() { - this.elementData = new Object[0]; - } - - public void add(Object o){ - ensureCapacity(size + 1); - elementData[size++] = o; - } - - private void ensureCapacity(int minCapacity){ - if (minCapacity < 0 ){ - throw new OutOfMemoryError(); - } - - int newCapcity = size; - if(minCapacity < MIN_CAPACITY){ - newCapcity = MIN_CAPACITY; - } else if(minCapacity > elementData.length){ - int tmp = elementData.length << 1; - newCapcity = tmp > elementData.length ? tmp : Integer.MAX_VALUE; - } - - newCapcity = minCapacity; - Object[] newData = new Object[newCapcity]; - System.arraycopy(elementData, 0, newData, 0, size); - elementData = newData; - } - - public void add(int index, Object o){ - indexCheck(index); - ensureCapacity(size+1); - System.arraycopy(elementData, index, elementData, index+1, size-index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - indexCheck(index); - return elementData[index]; - } - - private void indexCheck(int index){ - if(index < 0){ - throw new IllegalArgumentException("illegal index: " + index); - } - if(index >= size){ - throw new IndexOutOfBoundsException(); - } - } - - public Object remove(int index){ - indexCheck(index); - Object rm = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, size-index-1); - size--; - return rm; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new Itr(); - } - - //静态内部类的访问权限不同有何区别?? - private class Itr implements Iterator{ - private int cursor = 0; - - public boolean hasNext() { - return cursor != size; - } - - public Object next() { - if (hasNext()){ - return elementData[cursor++]; - } - throw new NoSuchElementException(); - } - } -} diff --git a/group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java b/group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 0610a542b5..0000000000 --- a/group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic; - -/** - * Created by songbao.yang on 2017/2/21. - * - */ -public class BinaryTreeNode { - - private Integer data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Integer data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Integer o){ - - BinaryTreeNode newNode = new BinaryTreeNode(); - newNode.data = o; - newNode.left = null; - newNode.right = null; - - BinaryTreeNode cursor = this; - BinaryTreeNode pre = cursor; - while (cursor != null){ - pre = cursor; - if (o.compareTo(cursor.data) < 0){ - cursor = cursor.left; - } else { - cursor = cursor.right; - } - } - - if (o.compareTo(pre.data) < 0){ - pre.left = newNode; - } else { - pre.right = newNode; - } - return this; - } -} diff --git a/group05/578505552/src/main/java/com/coding/basic/Iterator.java b/group05/578505552/src/main/java/com/coding/basic/Iterator.java deleted file mode 100644 index 6765eae519..0000000000 --- a/group05/578505552/src/main/java/com/coding/basic/Iterator.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.coding.basic; - -/** - * Created by songbao.yang on 2017/2/21. - * - */ -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group05/578505552/src/main/java/com/coding/basic/LinkedList.java b/group05/578505552/src/main/java/com/coding/basic/LinkedList.java deleted file mode 100644 index 58accde4d8..0000000000 --- a/group05/578505552/src/main/java/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -/** - * Created by songbao.yang on 2017/2/21. - * - */ -public class LinkedList implements List { - - private Node head; - private int elementCount; - - //head作为一个节点,其next的值指向List中真正的第一个节点 - public LinkedList() { - Node head = new Node(); - head.next = null; - head.data = null; - elementCount = 0; - } - - public void add(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - - Node cursor = head; - while (cursor.next != null){ - cursor = cursor.next; - } - cursor.next = newNode; - elementCount++; - } - - - public void add(int index , Object o){ - indexRangeCheck(index); - Node newNode = new Node(); - newNode.data = o; - - Node cursor = head; - for (int i = 0; i < index; i++) { - cursor = cursor.next; //将cursor移动到index-1节点处; - } - - newNode.next = cursor.next; //将新节点指向原index处的节点 - cursor.next = newNode;//将原index-1处的节点指向新节点 - elementCount++; - } - - private void indexRangeCheck(int index){ - if (index < 0 || index >= size()){ - throw new IndexOutOfBoundsException(); - } - } - - public Object get(int index){ - indexRangeCheck(index); - Node cursor = head; - for (int i = 0; i < index; i++) { - cursor = cursor.next; - } - return cursor.next; - } - - public Object remove(int index){ - indexRangeCheck(index); - Node cursor = head; - for (int i = 0; i < index; i++) { - cursor = cursor.next; - } - Node indexNode = cursor.next; - cursor.next = indexNode.next; - elementCount--; - return indexNode; - } - - public int size(){ - return elementCount; - } - - public void addFirst(Object o){ - Node node = new Node(); - node.data = o; - node.next = head.next; - head.next = node; - elementCount++; - } - - public void addLast(Object o){ - - Node cursor = head; - while (cursor.next != null){ - cursor = cursor.next; - } - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - cursor.next = newNode; - elementCount++; - } - - public Object removeFirst(){ - - if (size() == 0){ - throw new RuntimeException("no element in list"); - } - Node firstNode = head.next; - head.next = head.next.next; - elementCount--; - return firstNode; - } - - public Object removeLast(){ - if (size() == 0){ - throw new RuntimeException("no element in list"); - } - - Node cursor = head; - for (int i = 0; i < size() - 1; i++) { - cursor = cursor.next; - } - - Node lastNode = cursor.next; - cursor.next = null; - elementCount--; - - return lastNode; - } - - public Iterator iterator(){ - return new Itr(); - } - - private class Itr implements Iterator { - - private Node itrCursor = head; - - public boolean hasNext() { - - return itrCursor.next != null; - } - - public Object next() { - if (hasNext()){ - return itrCursor.next; - } - throw new NoSuchElementException(); - } - } - - private static class Node{ - Object data; - Node next; - } -} diff --git a/group05/578505552/src/main/java/com/coding/basic/List.java b/group05/578505552/src/main/java/com/coding/basic/List.java deleted file mode 100644 index a979b2fdb9..0000000000 --- a/group05/578505552/src/main/java/com/coding/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding.basic; - -/** - * Created by songbao.yang on 2017/2/21. - * - */ -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group05/578505552/src/main/java/com/coding/basic/Queue.java b/group05/578505552/src/main/java/com/coding/basic/Queue.java deleted file mode 100644 index ec31573ee7..0000000000 --- a/group05/578505552/src/main/java/com/coding/basic/Queue.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -/** - * Created by songbao.yang on 2017/2/22. - * - */ -public class Queue { - - private Object[] elementData; - private int head; //对头的位置 - private int tail; //队尾的位置 - private int size; //队列中元素的个数 - private static final int MIN_INITIAL_CAPACITY = 10; - - public Queue() { - this.elementData = new Object[MIN_INITIAL_CAPACITY]; - this.head = 0; - this.tail = 0; - this.size = 0; - } - - public Queue(int initCapcacity) { - if (initCapcacity < MIN_INITIAL_CAPACITY){ - initCapcacity = MIN_INITIAL_CAPACITY; - } - this.elementData = new Object[initCapcacity]; - this.head = 0; - this.tail = 0; - this.size = 0; - } - - public void enQueue(Object o){ - ensureCapacity(size+1); - if(size != 0){ - tail++; - } - if(tail == elementData.length){ - tail = 0; - } - elementData[tail] = o; - size++; - } - - private void ensureCapacity(int minCapcacity){ - if(minCapcacity <= elementData.length){ - return; - } - - int newCapcacity = elementData.length << 1; - if (newCapcacity < elementData.length){ - newCapcacity = Integer.MAX_VALUE; - } - - Object[] newData = new Object[newCapcacity]; - if(size != 0){ - if(tail >= head){ - System.arraycopy(elementData, head, newData, 0, size); - } else { - System.arraycopy(elementData, head, newData, 0, elementData.length - head); - System.arraycopy(elementData, 0, newData, elementData.length - head, tail + 1); - } - elementData = newData; - head = 0; - tail = this.size - 1; - } - } - - public Object deQueue(){ - if (isEmpty()){ - throw new NoSuchElementException("empty queue"); - } - Object ele = elementData[head]; - size--; - head++; - if(head == elementData.length){ - head = 0; - } - return ele; - } - - public boolean isEmpty(){ - return size == 0; - } - - public int size(){ - return size; - } -} diff --git a/group05/578505552/src/main/java/com/coding/basic/Stack.java b/group05/578505552/src/main/java/com/coding/basic/Stack.java deleted file mode 100644 index ffc4915bef..0000000000 --- a/group05/578505552/src/main/java/com/coding/basic/Stack.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.coding.basic; - - -import java.util.EmptyStackException; - -/** - * Created by songbao.yang on 2017/2/22. - * - */ -public class Stack { - - private Object[] elementData; - private static final int MIN_INITIAL_CAPACITY = 10; - private int cursor; - - public Stack() { - elementData = new Object[MIN_INITIAL_CAPACITY]; - cursor = -1; - } - - public void push(Object o){ - ensureCapacity(size() + 1); - cursor++; - elementData[cursor] = o; - } - - private void ensureCapacity(int minCapacity){ - if(minCapacity <= elementData.length){ - return; - } - - int newSize = elementData.length << 1; - if (newSize < elementData.length){ - newSize = Integer.MAX_VALUE; - } - - Object[] newDataArray = new Object[newSize]; - System.arraycopy(elementData, 0, newDataArray, 0, size()); - elementData = newDataArray; - } - - - public Object pop(){ - Object ele = peek(); - cursor--; - return ele; - } - - public Object peek(){ - if (isEmpty()){ - throw new EmptyStackException(); - } - return elementData[cursor]; - } - - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return cursor + 1; - } -} diff --git a/group05/578505552/src/test/java/JavaTest.java b/group05/578505552/src/test/java/JavaTest.java deleted file mode 100644 index 26d2197ffe..0000000000 --- a/group05/578505552/src/test/java/JavaTest.java +++ /dev/null @@ -1,25 +0,0 @@ -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Queue; -import java.util.Stack; - -/** - * Created by songbao.yang on 2017/2/21. - */ -public class JavaTest { - - public static void main(String[] args) { - - ArrayList ss = new ArrayList(); - ss.add("a"); - ss.add("b"); - ss.add("c"); - ss.add("d"); - - System.out.println(ss.size()); - ss.remove(0); - System.out.println(ss.size()); - - - } -} diff --git a/group05/578505552/src/test/java/com/coding/basic/ArrayListTest.java b/group05/578505552/src/test/java/com/coding/basic/ArrayListTest.java deleted file mode 100644 index 87b9906c29..0000000000 --- a/group05/578505552/src/test/java/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by songbao.yang on 2017/2/21. - * - */ -public class ArrayListTest { - - private ArrayList list; - - public static final int SIZE = 10000; - - @Before - public void setUp() throws Exception { - - list = new ArrayList(); - } - - @After - public void tearDown() throws Exception { - - } - - @Test - public void add() throws Exception { - - for (int i = 0; i < SIZE; i++) { - list.add(i); - Assert.assertEquals(i+1, list.size()); - } - } - - @Test - public void add1() throws Exception { - - add(); - for (int i = 0; i < 1000; i++) { - int oldSize = list.size(); - int randomIndex = (int)Math.floor(Math.random() * oldSize); - - list.add(randomIndex, randomIndex); - int newSize = list.size(); - - Assert.assertEquals(newSize, oldSize+1); - Assert.assertEquals(list.get(randomIndex), randomIndex); - } - } - - @Test - public void get() throws Exception { - - add(); - for (int i = 0; i < SIZE * 100; i++) { - int randomIndex = (int)Math.floor(Math.random() * list.size()); - if(randomIndex < 0 || randomIndex >= SIZE){ - System.out.println("illegal index: " + randomIndex); - throw new RuntimeException(); - } - int o = (Integer) list.get(randomIndex); - Assert.assertEquals(randomIndex, o); - } - } - - @Test - public void remove() throws Exception { - - add(); - for (int i = 0; i < SIZE; i++) { - System.out.println("remove: " + i); - list.remove(0); - } - - } - - @Test - public void size() throws Exception { - - } - - @Test - public void iterator() throws Exception { - add(); - Iterator iterator1 = list.iterator(); - int i = 0; - while (iterator1.hasNext()){ - Object next = iterator1.next(); - Assert.assertEquals(i, next); - i++; - } - } - -} \ No newline at end of file diff --git a/group05/578505552/src/test/java/com/coding/basic/QueueTest.java b/group05/578505552/src/test/java/com/coding/basic/QueueTest.java deleted file mode 100644 index 905054670d..0000000000 --- a/group05/578505552/src/test/java/com/coding/basic/QueueTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by songbao.yang on 2017/2/24. - */ -public class QueueTest { - - private static final int SIZE = 2000; - private Queue queue; - - @Before - public void setUp() throws Exception { - queue = new Queue(); - } - - @After - public void tearDown() throws Exception { - - } - - @Test - public void enQueue() throws Exception { - for (int i = 0; i < SIZE; i++) { - queue.enQueue(i); - Assert.assertEquals(i+1, queue.size()); - } - } - - @Test - public void deQueue1() throws Exception { - enQueue(); - - int i = 0; - int startSize = queue.size(); - while (!queue.isEmpty()) { - Assert.assertEquals(startSize - i, queue.size()); - Object o = queue.deQueue(); - Assert.assertEquals(SIZE - i - 1, queue.size()); - Assert.assertEquals(i, o); - i++; - } - } - - @Test - public void deQueue2() throws Exception { - enQueue(); - int startSize = queue.size(); - - for (int i = 0; i < startSize; i++) { - queue.deQueue(); - Assert.assertEquals(startSize - 1, queue.size()); - queue.enQueue(i+1000); - Assert.assertEquals(startSize, queue.size()); - } - - } - - @Test - public void isEmpty() throws Exception { - - } - - @Test - public void size() throws Exception { - - } - -} \ No newline at end of file diff --git a/group05/578505552/src/test/java/com/coding/basic/StackTest.java b/group05/578505552/src/test/java/com/coding/basic/StackTest.java deleted file mode 100644 index b65d446c97..0000000000 --- a/group05/578505552/src/test/java/com/coding/basic/StackTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by songbao.yang on 2017/2/24. - * - */ -public class StackTest { - - private Stack stack; - - public static final int SIZE = 100; - - @Before - public void setUp() throws Exception { - stack = new Stack(); - } - - @After - public void tearDown() throws Exception { - - } - - @Test - public void push() throws Exception { - for (int i = 0; i < SIZE; i++) { - stack.push(i); - Assert.assertEquals(i+1, stack.size()); - } - System.out.println(); - } - - @Test - public void pop() throws Exception { - push(); - int beginSize = stack.size(); - for (int i = 0; i < beginSize; i++) { - Object ele = stack.pop(); - Assert.assertEquals(beginSize-i-1, stack.size()); - Assert.assertEquals(beginSize-i-1, ele); - } - } - - @Test - public void peek() throws Exception { - - } - - @Test - public void isEmpty() throws Exception { - - } - - @Test - public void size() throws Exception { - - } - -} \ No newline at end of file diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/.gitignore b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/.gitignore deleted file mode 100644 index dd9d181eaa..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/vendor -/node_modules -Homestead.yaml -Homestead.json -.env -.idea -.xml diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/job_2017_02_19_data_structure.iml b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/job_2017_02_19_data_structure.iml deleted file mode 100644 index 3a8ffcf1f5..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/job_2017_02_19_data_structure.iml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/ArrayListImpl.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/ArrayListImpl.java deleted file mode 100644 index 27ee61ce66..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/ArrayListImpl.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.java.xiaoqin.impl; - -import com.java.xiaoqin.interfaces.IIterator; -import com.java.xiaoqin.interfaces.IList; - -/** - * Created by xiaoqin on 17-2-25. - */ -public class ArrayListImpl implements IList { - - private static final int DEFAULT_INIT_SIZE = 20; - - private T[] data; - - private int size = 0; - - public ArrayListImpl() { - this(DEFAULT_INIT_SIZE); - } - - public ArrayListImpl(int capacity) { - if (capacity < 0) { - throw new IllegalArgumentException("无效的capacity:" + capacity); - } - if (0 == capacity) { - capacity = DEFAULT_INIT_SIZE; - } - data = (T[]) new Object[capacity]; - } - - @Override - public void add(T t) { - group(size); - data[size++] = t; - } - - @Override - public void add(int index, T t) { - if (index < 0) { - throw new IllegalArgumentException("index < 0,index:" + index); - } - if (index > size) { - throw new IndexOutOfBoundsException("index >= size。index:" + index + "\tsize:" + size); - } - group(size); - T[] temp = (T[]) new Object[size - index]; - System.arraycopy(data, index, temp, 0, temp.length); - data[index] = t; - size++; - System.arraycopy(temp, 0, data, index + 1, temp.length); - } - - @Override - public T get(int index) { - if (index < data.length) { - return data[index]; - } else { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - @Override - public T remove(int index) { - if (index < 0 || index >= size) { - throw new IllegalArgumentException("index invalid!!!index:" + index); - } - T[] temp = (T[]) new Object[size - index - 1]; - System.arraycopy(data, index + 1, temp, 0, temp.length); - T result = data[index]; - System.arraycopy(temp, 0, data, index, temp.length); - data[--size] = null; - return result; - } - - @Override - public int size() { - return size; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - @Override - public IIterator iterator() { - return new ArrayIteratorImpl<>(); - } - - @Override - public String toString() { - StringBuilder sbToString = new StringBuilder(); - for (T t : - data) { - sbToString.append(t).append("\t"); - } - return sbToString.toString(); - } - - private void group(int minSize) { - if (minSize >= data.length) { - T[] temp = (T[]) new Object[size]; - System.arraycopy(data, 0, temp, 0, size); - int groupSize = (size >> 1) + size; - data = (T[]) new Object[Math.max(groupSize, minSize)]; - System.arraycopy(temp, 0, data, 0, size); - } - } - - private class ArrayIteratorImpl implements IIterator { - - private int index = 0; - - @Override - public boolean hasNext() { - return index < size; - } - - @Override - public T next() { - if (index >= size) { - throw new ArrayIndexOutOfBoundsException("index out"); - } - return (T) data[index++]; - } - } -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/BinaryTreeNode.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/BinaryTreeNode.java deleted file mode 100644 index 664468d901..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/BinaryTreeNode.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.java.xiaoqin.impl; - -/** - * Created by xiaoqin on 17-2-26. - */ -public class BinaryTreeNode { - private T data; - private BinaryTreeNode leftChild; - private BinaryTreeNode rightChild; - - public T getData() { - return data; - } - - public void setData(T data) { - this.data = data; - } - - public BinaryTreeNode getLeftChild() { - return leftChild; - } - - public void setLeftChild(BinaryTreeNode leftChild) { - this.leftChild = leftChild; - } - - public BinaryTreeNode getRightChild() { - return rightChild; - } - - public void setRightChild(BinaryTreeNode rightChild) { - this.rightChild = rightChild; - } - - public BinaryTreeNode insert(T o) { - if (data == null) { - data = o; - return this; - } else { - return insert(this, o); - } - } - - private BinaryTreeNode insert(BinaryTreeNode node, T o) { - if (o instanceof Integer) { - if ((Integer) node.data > (Integer) o) { - if (null == node.leftChild) { - node.leftChild = new BinaryTreeNode(); - node.leftChild.data = o; - return node.leftChild; - } else { - return insert(node.leftChild, o); - } - } else if ((Integer) node.data < (Integer) o) { - if (null == node.rightChild) { - node.rightChild = new BinaryTreeNode(); - node.rightChild.data = o; - return node.rightChild; - } else { - return insert(node.rightChild, o); - } - } else { - return node; - } - } else { - return null; - } - } - - @Override - public String toString() { - StringBuilder sbToString = new StringBuilder(); - sbToString.append("data:").append(data); - if (null != leftChild) { - sbToString.append("\t").append(data).append("left:").append(leftChild.toString()); - } - if (null != rightChild) { - sbToString.append("\t").append(data).append("right:").append(rightChild.toString()); - } - return sbToString.toString(); - } -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/LinkedListImpl.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/LinkedListImpl.java deleted file mode 100644 index 7d8ad60419..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/LinkedListImpl.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.java.xiaoqin.impl; - -import com.java.xiaoqin.interfaces.IIterator; -import com.java.xiaoqin.interfaces.IList; -import com.java.xiaoqin.interfaces.IQueue; - -/** - * Created by xiaoqin on 17-2-26. - */ -public class LinkedListImpl implements IList, IQueue { - - private Node head; - private Node last; - private int size = 0; - - public LinkedListImpl() { - } - - @Override - public void add(T t) { - if (size == 0) { - head = new Node<>(); - head.data = t; - head.index = size++; - last = head; - } else { - last.right = new Node<>(); - last.right.left = last; - last = last.right; - last.data = t; - last.index = size++; - } - } - - @Override - public void add(int index, T t) { - Node node = findNodeByIndex(index); - if (node.index == 0) { - node.left = new Node<>(); - node.left.right = node; - node.left.index = 0; - node.left.data = t; - head = node.left; - } else { - node.left.right = new Node<>(); - node.left.right.index = node.index; - node.left.right.right = node; - node.left.right.data = t; - node.left = node.left.right; - } - while (node != null) { - node.index++; - node = node.right; - } - size++; - } - - private Node findNodeByIndex(int index) { - if (index >= size) { - throw new ArrayIndexOutOfBoundsException("index:" + index); - } - Node resultNode = null; - Node origin = null; - int half = size >> 1; - if (index > half) { - origin = last; - while (origin.index != index) { - origin = origin.left; - } - } else { - origin = head; - while (origin.index != index) { - origin = origin.right; - } - } - return origin; - } - - @Override - public T get(int index) { - return findNodeByIndex(index).data; - } - - @Override - public T remove(int index) { - Node node = findNodeByIndex(index); - if (null != node.left) { - node.left.right = node.right; - } else { - node.right.left = null; - head = node.right; - } - if (null != node.right) { - node.right.left = node.left; - while (node.right == null) { - node.right.index--; - } - } else { - node.left.right = null; - last = node.left; - } - size--; - return node.data; - } - - @Override - public int size() { - return size; - } - - @Override - public void enQueue(T t) { - add(t); - } - - @Override - public T deQueue() { - if (0 >= size) { - throw new NullPointerException("remove is null"); - } - T t = null; - Node node = findNodeByIndex(0); - if (null != node) { - t = node.data; - if (null != node.right) { - node.right.left = null; - Node right = node.right; - head = right; - while (right != null) { - right.index--; - right = right.right; - } - size--; - } else { - head = last = null; - size = 0; - } - } - return t; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - @Override - public IIterator iterator() { - return new LinkedIteratorImpl<>(); - } - - @Override - public String toString() { - StringBuilder sbToString = new StringBuilder(); - Node temp = head; - while (null != temp){ - sbToString.append(temp.toString()).append("\n"); - temp = temp.right; - } - return sbToString.toString(); - } - - private static class Node { - private T data = null; - private Node left = null; - private Node right = null; - private int index = 0; - - @Override - public String toString() { - return "Node{" + - "data=" + data + - ", index=" + index + - '}'; - } - } - - private class LinkedIteratorImpl implements IIterator { - - private int index = 0; - private Node next; - - @Override - public boolean hasNext() { - return index < size; - } - - @Override - public T next() { - if (0 == index) { - next = (Node) head; - } - if (null == next) { - throw new ArrayIndexOutOfBoundsException("next is null"); - } - Node result = next; - next = next.right; - index++; - return result.data; - } - } -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/StackImpl.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/StackImpl.java deleted file mode 100644 index 0a585ab904..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/StackImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.java.xiaoqin.impl; - -/** - * Created by xiaoqin on 17-2-26. - */ -public class StackImpl extends ArrayListImpl { - - /** - * 把数据压住栈 - * - * @param t - */ - public void push(T t) { - add(t); - } - - /** - * 返回栈顶数据,并移除出栈 - * - * @return - */ - public T pop() { - if (0 >= size()) { - throw new NullPointerException("size is 0"); - } - return remove(size() - 1); - } - - /** - * 返回栈顶数据 - * - * @return - */ - public T peek() { - if (0 >= size()) { - throw new NullPointerException("size is 0"); - } - return get(size() - 1); - } - - /** - * 是否为null - * - * @return - */ - @Override - public boolean isEmpty() { - return super.isEmpty(); - } - - /** - * 大小 - * - * @return - */ - @Override - public int size() { - return super.size(); - } -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IIterator.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IIterator.java deleted file mode 100644 index bd83985af4..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IIterator.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.java.xiaoqin.interfaces; - -/** - * Created by xiaoqin on 17-2-25. - */ -public interface IIterator { - - /** - * 是否有下一个 - * @return - */ - boolean hasNext(); - - /** - * 取出下一个的元素 - * @return - */ - T next(); -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IList.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IList.java deleted file mode 100644 index 7c08a46293..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IList.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.java.xiaoqin.interfaces; - -/** - * Created by xiaoqin on 17-2-19. - */ -public interface IList { - - /** - * 添加元素 - * @param t - */ - void add(T t); - - /** - * 添加元素在第几个 - * @param index - * @param t - */ - void add(int index,T t); - - /** - * 获取第index个的元素 - * @param index - * @return - */ - T get(int index); - - /** - * 移除第index个的元素 - * @param index - * @return - */ - T remove(int index); - - /** - * 返回List的大小 - * @return - */ - int size(); - - /** - * 是否为empty - * @return - */ - boolean isEmpty(); - - /** - * 返回迭代器 - * @return - */ - IIterator iterator(); - -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IQueue.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IQueue.java deleted file mode 100644 index 4ae4b7d785..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IQueue.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.java.xiaoqin.interfaces; - -/** - * Created by xiaoqin on 17-2-26. - */ -public interface IQueue { - - void enQueue(T t); - - T deQueue(); - - boolean isEmpty(); - - int size(); -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/ArrayListImplTest.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/ArrayListImplTest.java deleted file mode 100644 index ce6d903ff2..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/ArrayListImplTest.java +++ /dev/null @@ -1,107 +0,0 @@ -package test.com.java.xiaoqin.impl; - -import com.java.xiaoqin.impl.ArrayListImpl; -import com.java.xiaoqin.interfaces.IIterator; -import com.java.xiaoqin.interfaces.IList; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * ArrayListImpl Tester. - * - * @author - * @version 1.0 - * @since
二月 26, 2017
- */ -public class ArrayListImplTest { - - private IList mList; - - @Before - public void before() throws Exception { - mList = new ArrayListImpl<>(); - } - - @After - public void after() throws Exception { - mList = null; - } - - private void addTen() { - for (int i = 0; i < 10; i++) { - mList.add(i); - } - } - - /** - * Method: add(T t) - */ - @Test - public void testAddT() throws Exception { - addTen(); - System.out.println(mList.toString()); - } - - /** - * Method: add(int index, T t) - */ - @Test - public void testAddForIndexT() throws Exception { - addTen(); - mList.add(4, 50); - mList.add(8, 150); - System.out.println(mList.toString()); - } - - /** - * Method: get(int index) - */ - @Test - public void testGet() throws Exception { - addTen(); - Assert.assertEquals(mList.get(5), (Integer) 5); - } - - /** - * Method: remove(int index) - */ - @Test - public void testRemove() throws Exception { - addTen(); - Assert.assertEquals(mList.remove(4), (Integer) 4); - System.out.println(mList); - } - - /** - * Method: size() - */ - @Test - public void testSize() throws Exception { - addTen(); - Assert.assertEquals(mList.size(), 10); - } - - /** - * Method: isEmpty() - */ - @Test - public void testIsEmpty() throws Exception { - System.out.println(mList.isEmpty()); - addTen(); - System.out.println(mList.isEmpty()); - } - - /** - * Method: iterator() - */ - @Test - public void testIterator() throws Exception { - addTen(); - IIterator iterator = mList.iterator(); - while (iterator.hasNext()) { - System.out.println(iterator.next()); - } - } -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/BinaryTreeNodeTest.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/BinaryTreeNodeTest.java deleted file mode 100644 index fa28cdf0d9..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/BinaryTreeNodeTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package test.com.java.xiaoqin.impl; - -import com.java.xiaoqin.impl.BinaryTreeNode; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * BinaryTreeNode Tester. - * - * @author - * @version 1.0 - * @since
二月 27, 2017
- */ -public class BinaryTreeNodeTest { - - private BinaryTreeNode binaryTreeNode; - - - @Before - public void before() throws Exception { - binaryTreeNode = new BinaryTreeNode<>(); - } - - @After - public void after() throws Exception { - binaryTreeNode = null; - } - - /** - * Method: insert(T o) - */ - @Test - public void testInsert() throws Exception { - binaryTreeNode.insert(5); - binaryTreeNode.insert(2); - binaryTreeNode.insert(7); - binaryTreeNode.insert(1); - binaryTreeNode.insert(6); - System.out.println(binaryTreeNode.toString()); - binaryTreeNode.insert(4); - binaryTreeNode.insert(8); - System.out.println(binaryTreeNode.toString()); - } - -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IQueueImplTest.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IQueueImplTest.java deleted file mode 100644 index 14bbcac149..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IQueueImplTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package test.com.java.xiaoqin.impl; - -import com.java.xiaoqin.impl.LinkedListImpl; -import com.java.xiaoqin.interfaces.IQueue; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * IQueueImplTest Tester. - * - * @author - * @version 1.0 - * @since
二月 26, 2017
- */ -public class IQueueImplTest { - - private IQueue mQueue; - - @Before - public void before() throws Exception { - mQueue = new LinkedListImpl<>(); - } - - @After - public void after() throws Exception { - mQueue = null; - } - - /** - * Method: enQueue(T t) - */ - @Test - public void enQueueT() throws Exception { - for (int i = 0; i < 10; i++) { - mQueue.enQueue(i); - } - System.out.println(mQueue.toString()); - } - - /** - * Method: deQueue - */ - @Test - public void deQueue() throws Exception { - for (int i = 0; i < 10; i++) { - mQueue.enQueue(i); - } - Assert.assertEquals(mQueue.deQueue(), (Integer) 0); - Assert.assertEquals(mQueue.deQueue(), (Integer) 1); - } - - /** - * Method: isEmpty - */ - @Test - public void isEmpty() throws Exception { - Assert.assertEquals(true, mQueue.isEmpty()); - for (int i = 0; i < 10; i++) { - mQueue.enQueue(i); - } - Assert.assertEquals(false, mQueue.isEmpty()); - } - - /** - * Method: size(); - */ - @Test - public void size() throws Exception { - for (int i = 0; i < 10; i++) { - mQueue.enQueue(i); - } - Assert.assertEquals(10, mQueue.size()); - } - -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IStackImplTest.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IStackImplTest.java deleted file mode 100644 index a55667aadb..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IStackImplTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package test.com.java.xiaoqin.impl; - -import com.java.xiaoqin.impl.StackImpl; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * IQueueImplTest Tester. - * - * @author - * @version 1.0 - * @since
二月 26, 2017
- */ -public class IStackImplTest { - - private StackImpl mStack; - - @Before - public void before() throws Exception { - mStack = new StackImpl<>(); - } - - @After - public void after() throws Exception { - mStack = null; - } - - /** - * Method: push(T t) - */ - @Test - public void pushT() throws Exception { - for (int i = 0; i < 10; i++) { - mStack.push(i); - } - System.out.println(mStack.toString()); - } - - /** - * Method: pop - */ - @Test - public void pop() throws Exception { - for (int i = 0; i < 10; i++) { - mStack.push(i); - } - Assert.assertEquals(mStack.pop(), (Integer) 9); - Assert.assertEquals(mStack.pop(), (Integer) 8); - } - - /** - * Method: peek - */ - @Test - public void peek() throws Exception { - Assert.assertEquals(true, mStack.isEmpty()); - for (int i = 0; i < 10; i++) { - mStack.push(i); - } - Assert.assertEquals(mStack.peek(), (Integer) 9); - Assert.assertEquals(mStack.peek(), (Integer) 9); - Assert.assertEquals(mStack.peek(), (Integer) 9); - } - - /** - * Method: isEmpty - */ - @Test - public void isEmpty() throws Exception { - Assert.assertEquals(true, mStack.isEmpty()); - for (int i = 0; i < 10; i++) { - mStack.push(i); - } - Assert.assertEquals(false, mStack.isEmpty()); - } - - /** - * Method: size(); - */ - @Test - public void size() throws Exception { - for (int i = 0; i < 10; i++) { - mStack.push(i); - } - Assert.assertEquals(10, mStack.size()); - } - -} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/LinkedListImplTest.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/LinkedListImplTest.java deleted file mode 100644 index 669f88d9b1..0000000000 --- a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/LinkedListImplTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package test.com.java.xiaoqin.impl; - -import com.java.xiaoqin.impl.LinkedListImpl; -import com.java.xiaoqin.interfaces.IIterator; -import com.java.xiaoqin.interfaces.IList; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * LinkedListImpl Tester. - * - * @author - * @version 1.0 - * @since
二月 26, 2017
- */ -public class LinkedListImplTest { - - private IList mList; - - @Before - public void before() throws Exception { - mList = new LinkedListImpl<>(); - } - - @After - public void after() throws Exception { - mList = null; - } - - private void addTen() { - for (int i = 0; i < 10; i++) { - mList.add(i); - } - } - - /** - * Method: add(T t) - */ - @Test - public void testAddT() throws Exception { - addTen(); - System.out.println(mList.toString()); - } - - /** - * Method: add(int index, T t) - */ - @Test - public void testAddForIndexT() throws Exception { - addTen(); - mList.add(4, 50); - mList.add(8, 150); - System.out.println(mList.toString()); - } - - /** - * Method: get(int index) - */ - @Test - public void testGet() throws Exception { - addTen(); - Assert.assertEquals(mList.get(5), (Integer) 5); - } - - /** - * Method: remove(int index) - */ - @Test - public void testRemove() throws Exception { - addTen(); - Assert.assertEquals(mList.remove(4), (Integer) 4); - System.out.println(mList); - } - - /** - * Method: size() - */ - @Test - public void testSize() throws Exception { - addTen(); - Assert.assertEquals(mList.size(), 10); - } - - /** - * Method: isEmpty() - */ - @Test - public void testIsEmpty() throws Exception { - System.out.println(mList.isEmpty()); - addTen(); - System.out.println(mList.isEmpty()); - } - - /** - * Method: iterator() - */ - @Test - public void testIterator() throws Exception { - addTen(); - IIterator iterator = mList.iterator(); - while (iterator.hasNext()) { - System.out.println(iterator.next()); - } - } - -} diff --git a/group05/810574652/.classpath b/group05/810574652/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group05/810574652/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group05/810574652/.gitignore b/group05/810574652/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group05/810574652/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group05/810574652/.project b/group05/810574652/.project deleted file mode 100644 index 292266f147..0000000000 --- a/group05/810574652/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 810574652HomeWork - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/basic/ArrayList.java b/group05/810574652/src/com/github/PingPi357/coding2017/basic/ArrayList.java deleted file mode 100644 index 2fb0968eb5..0000000000 --- a/group05/810574652/src/com/github/PingPi357/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.github.PingPi357.coding2017.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - private static final int DEFAULT_CAPACITY = 100; // 定义静态final类型, - // final在一个对象类唯一, - // static - // final在多个对象中都唯一,如果作为常量用的话,只是final的话就得在别的类引用的时候要创建对象,会占用不必要的空间,而加上static的话在编译的时候占用一个空间,其他时候就不会再占用空间了。所以常量一般用static修饰,其他时候看你自己的需要 - // 理解:比如我是一个维修工人....public相当于我接任何活,static相当于10分钟之内赶到,final相当于就我一家. - // reference: http://bbs.itheima.com/thread-162971-1-1.html - - int size = 0; // 如果是中文分号,报错:Syntax error on token "invalid Character", ; - // excepted; - - private Object[] elementData = new Object[DEFAULT_CAPACITY]; // new - // Object后面接的是中括号 - - @Override - public void add(Object o) { - // TODO Auto-generated method stub - ensureCapacity(++size); // size自加操作 - elementData[size - 1] = o; - } - - private void ensureCapacity(int minCapacity) { - // TODO Auto-generated method stub - if (minCapacity <= elementData.length) { // 当满足小于等于的情况 ??? - return; - } else { - elementData = Arrays.copyOf(elementData, minCapacity); // elementData写错为elementDta,导致报错 elementDta - // cannot be - // resolved - // as a - // variable - // 这里为什么不直接是minCapacity 而要加上原始elementData.length???? - } - } - - @Override - public void add(int index, Object o) { - // TODO Auto-generated method stub - if (index > size || index < 0) { - throw new ArrayIndexOutOfBoundsException(); - } - ensureCapacity(++size); // size自加操作 - for (int i = size - 2; i > index - 1; i--) { // for中用';'号隔开; - // ???i应该从size-2开始赋值 - // ???终止条件为i>index-1 - elementData[i + 1] = elementData[i]; - } - elementData[index] = o; // 插入元素 - } - - @Override - public Object remove(int index) { - if (this.size > 0 && index < (this.size)) { - Object o = elementData[index]; - for (int i = index; i < this.size; i++) { - elementData[i] = elementData[i + 1]; - } - this.size--; - return o; - } else { - return null; - } - } - - @Override - public Object get(int index) { - // TODO Auto-generated method stub - return elementData[index]; // 必须进行角标越界检查吗??? - } - - @Override - public int size() { - // TODO Auto-generated method stub - return this.size; - } - -} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/basic/LinkedList.java b/group05/810574652/src/com/github/PingPi357/coding2017/basic/LinkedList.java deleted file mode 100644 index 4e1ebda327..0000000000 --- a/group05/810574652/src/com/github/PingPi357/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.github.PingPi357.coding2017.basic; - - -//实现单向单端列表 -public class LinkedList implements List { - private Node head = new Node(); // 定义链表的头节点 - private Node current; - private int size; - - public LinkedList() { - head = null; - size = 0; - } - - @Override - public void add(Object o) { - if (null == head) { // 头结点为空,直接放在头结点上 - head.data = o; - head.next = null; - size++; - } else { - current = head; - while (!(current.next == null)) { // 找到链表的末尾节点,在其后增加 - current = current.next; - } - current.next = new Node(); - current.next.data = o; - current.next.next = null; - size++; - } - } - - public void addFirst(Object o) { - if (null == head) { - head.data = o; - head.next = null; - size++; - } else { - current = new Node(); - current.data = o; - current.next = head; - head = current; - size++; - } - } - - public void addLast(Object o) { - if (!(head == null)) { - current = head; - while (!(current.next == null)) { - current = current.next; - } - current.next = new Node(); - current.next.data = o; - current.next.next = current.next; - size++; - } - } - - @Override - public void add(int index, Object o) { - // TODO Auto-generated method stub - - } - - @Override - public Object remove(int index) { - // TODO Auto-generated method stub - if (index < size && index > 1) { // 为什么index>1??? - current = head; - for (int i = 0; i < index - 1; i++) { - current = current.next; // 遍历到指定到index的上一个节点 - } - current.next = current.next.next; - size--; - } - return null; - } - - public Object removeFirst() { - if (!(head == null)) { - Node removeHead = head; - head.next = head.next.next; - size--; - return removeHead; - } else - return null; - } - - public Object removeLast() { - if (!(head == null)) { - Node theNext = current.next; - Node oldLast; - while (theNext.next != null) { - current = theNext; - theNext = theNext.next; - } - oldLast = current.next; - current.next = theNext.next; - - size--; - return oldLast; - } else - return null; - - } - - @Override - public Object get(int index) { - // TODO Auto-generated method stub - if (index < size) { - current = head; - for (int i = 0; i < index; i++) { - current = current.next; - } - return current.data; - } else - return null; - } - - @Override - public int size() { - return this.size; - } - - private static class Node { // 创建Node类,定义Node类的两个属性 - Object data; - Node next; - } - -} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/basic/List.java b/group05/810574652/src/com/github/PingPi357/coding2017/basic/List.java deleted file mode 100644 index d9cbdec7b4..0000000000 --- a/group05/810574652/src/com/github/PingPi357/coding2017/basic/List.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.PingPi357.coding2017.basic; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); // Object 首字母大写,不然会出现"object" can not - // be resolved a type错误 - - public Object remove(int index); - - public Object get(int index); - - public int size(); // 获取List的实际大小,而length定义的是总的容量 - /* - * public void change(int index, Object o); 实现改变特定index处的值 - */ -} \ No newline at end of file diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/basic/Queue.java b/group05/810574652/src/com/github/PingPi357/coding2017/basic/Queue.java deleted file mode 100644 index 709d0f4059..0000000000 --- a/group05/810574652/src/com/github/PingPi357/coding2017/basic/Queue.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.github.PingPi357.coding2017.basic; - -public class Queue { - private LinkedList linkedList = new LinkedList(); - - public void enQueue(Object o) { - linkedList.addLast(o); - } - - public Object deQueue() { - Object removeQueue = linkedList.removeFirst(); - return removeQueue; - } - - public int size() { - return linkedList.size(); - } -} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/basic/Stack.java b/group05/810574652/src/com/github/PingPi357/coding2017/basic/Stack.java deleted file mode 100644 index 2267cd05d4..0000000000 --- a/group05/810574652/src/com/github/PingPi357/coding2017/basic/Stack.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.github.PingPi357.coding2017.basic; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - int size = 0; - - public void push(Object o){ - elementData.add(o); - size++; - } - - public Object pop(){ - if(this.isEmpty()==true) - { - throw new EmptyStackException(); - } - ArrayList popData = (ArrayList) elementData.remove(elementData.size()-1); - size--; - return popData; - } - - public Object peek(){ - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return elementData.size()==0; - } - public int size(){ - return this.size; - } -} diff --git "a/group05/810574652/src/com/github/PingPi357/coding2017/basic/\350\257\264\346\230\216" "b/group05/810574652/src/com/github/PingPi357/coding2017/basic/\350\257\264\346\230\216" deleted file mode 100644 index 8fd2d3fbb1..0000000000 --- "a/group05/810574652/src/com/github/PingPi357/coding2017/basic/\350\257\264\346\230\216" +++ /dev/null @@ -1,2 +0,0 @@ -代码实现主要参考了waking2017(441517454)和C-Bobo(183127807)两位的代码完成, -自己仿照敲了一遍,加了些注释,同时在此基础上改了些 diff --git a/group05/group05.md b/group05/group05.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group05/group05.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group06/group06.md b/group06/group06.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group06/group06.md +++ /dev/null @@ -1 +0,0 @@ - diff --git "a/group07/1046545622/git\345\221\275\344\273\244.txt" "b/group07/1046545622/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/1046545622/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/1058267830/git\345\221\275\344\273\244.txt" "b/group07/1058267830/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/1058267830/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/1070440331/git\345\221\275\344\273\244.txt" "b/group07/1070440331/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/1070440331/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/1280157271/git\345\221\275\344\273\244.txt" "b/group07/1280157271/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/1280157271/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/1448276993/git\345\221\275\344\273\244.txt" "b/group07/1448276993/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/1448276993/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/1519504320/git\345\221\275\344\273\244.txt" "b/group07/1519504320/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/1519504320/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/1520332119/git\345\221\275\344\273\244.txt" "b/group07/1520332119/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/1520332119/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git a/group07/1536161030/.classpath b/group07/1536161030/.classpath deleted file mode 100644 index d171cd4c12..0000000000 --- a/group07/1536161030/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group07/1536161030/.gitignore b/group07/1536161030/.gitignore deleted file mode 100644 index be00f4a4de..0000000000 --- a/group07/1536161030/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* \ No newline at end of file diff --git a/group07/1536161030/.project b/group07/1536161030/.project deleted file mode 100644 index 11a1957bfe..0000000000 --- a/group07/1536161030/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - homework - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group07/1536161030/.settings/org.eclipse.core.resources.prefs b/group07/1536161030/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 4824b80263..0000000000 --- a/group07/1536161030/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git "a/group07/1536161030/CPU,\345\206\205\345\255\230,\347\241\254\347\233\230,\346\214\207\344\273\244.txt" "b/group07/1536161030/CPU,\345\206\205\345\255\230,\347\241\254\347\233\230,\346\214\207\344\273\244.txt" deleted file mode 100644 index 32d83cd08b..0000000000 --- "a/group07/1536161030/CPU,\345\206\205\345\255\230,\347\241\254\347\233\230,\346\214\207\344\273\244.txt" +++ /dev/null @@ -1,12 +0,0 @@ -ڲҪCPUڴ棬Ӳָ̣ -CPUҲд˿˼ԿCPU㡣CPUҪͿƵIJ֣˼壬ǿƵԪ㵥Ԫ֣˵ĴԽмһ -ԵļһģÿܵԪǷֹȷġпƵԪݳָͨ㵥ԪóȻƴ洢Ԫ洢мĽ -ڴǴ洢CPUҪϣҪУϵͳеʱݣӲ̶ȡݣṩCPUʹá -ӲǸ洢Ҫô洢ݣǵijݣŵǷdz̶׼ȷԴ洢Ϣʱ -ڴȡݵٶȱӲ̵Ĵȡٶȿ10 ijЩܻ -CPUٶȱڴ治֪ҪٱǰѳӲ̷ŵڴԺCPUֱڴгCPUֱӲгҪܶࡣ -ڴһCPUй죬Ӳݴȡ̫⡣ ǵĵԵٶȡ -гʱCPUȽܵǵ֮CPUǸӲ̣Ҫ洢ijAѳA͵ڴȥCPUڴ˵Ӳ̰ѳA͵ˣ㱣һ¡ ȳA͵ڴ֮CPUͿʼִгACPU㣬ȡδ洢ݣζйͨҪָˡ -ָҲǻԵһ䣬൱CPUڴ棬Ӳ֮ԡָӼݵ㣬߼㣬ݴͣĿƣָȡ - - diff --git "a/group07/1536161030/git\345\221\275\344\273\244.txt" "b/group07/1536161030/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/1536161030/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git a/group07/1536161030/src/com/coding/basic/ArrayList.java b/group07/1536161030/src/com/coding/basic/ArrayList.java deleted file mode 100644 index dfad793392..0000000000 --- a/group07/1536161030/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List{ - - private int size = 0; - - private Object[] elementData; - - public ArrayList(int size) { - this.elementData = new Object[size]; - } - - public ArrayList() { - this.elementData = new Object[10]; - } - - public void add(Object o) { - if(isFull()) - resize(); - elementData[size++] = o; - } - - public void add(int index, Object o) { - rangeCheckForAdd(index); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index) { - rangeCheckForAdd(index); - return elementData[index]; - } - - public Object remove(int index) { - rangeCheckForAdd(index); - Object o = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index); - elementData[--size] = null; - return o; - } - - public int size() { - return elementData.length; - } - - public com.coding.basic.Iterator iterator() { - return new Itr(); - } - - private class Itr implements com.coding.basic.Iterator { - int cursor; - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public Object next() { - int i = cursor; - if (i < elementData.length) { - cursor = i + 1; - return elementData[i]; - } - return null; - } - } - - //檢查下表越界 - public void rangeCheckForAdd(int index) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("下标越界"); - } - - //数组是否满 - public boolean isFull(){ - return size == elementData.length; - } - - //扩容 - public void resize(){ - Object[] newElementData = new Object[elementData.length * 2]; - System.arraycopy(elementData, 0, newElementData, 0, size); - this.elementData = newElementData; - newElementData = null; - } - - // - public boolean isEmpty() { - return size == 0; - } - - -} diff --git a/group07/1536161030/src/com/coding/basic/BinaryTreeNode.java b/group07/1536161030/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index b1143e1a74..0000000000 --- a/group07/1536161030/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode > { - - private Object data; - - private BinaryTreeNode left; - - private BinaryTreeNode right; - - public BinaryTreeNode(Object data){ - this.data = data; - this.left=null; - this.right =null; - } - - public BinaryTreeNode root; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - /* - * 二叉树 b 插入对象 o 父节点 pnode - * 若b为空树,插入节点作为根 - * o 等于根节点 直接返回 - * o 小于根节点 pnode = 左子树 - * else pnode = 右子树 - * - */ - public BinaryTreeNode insert(Object o) { - BinaryTreeNode current = root; - - if(current == null){ - return new BinaryTreeNode(o); - } - if (o.compareTo((Object) current.data)<0){ - if(current.left !=null){ - current = current.left; - }else{ - current.left = new BinaryTreeNode(o); - return current; - } - }else if(o.compareTo((Object) current.data)==0){ - return current; - }else{ - if(current.right !=null){ - current = current.right; - }else{ - current.right = new BinaryTreeNode(o); - return current; - } - } - return current; - } -} diff --git a/group07/1536161030/src/com/coding/basic/Iterator.java b/group07/1536161030/src/com/coding/basic/Iterator.java deleted file mode 100644 index 2ab5f039d5..0000000000 --- a/group07/1536161030/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - boolean hasNext(); - - Object next(); - -} diff --git a/group07/1536161030/src/com/coding/basic/LinkedList.java b/group07/1536161030/src/com/coding/basic/LinkedList.java deleted file mode 100644 index fc3ed5afaf..0000000000 --- a/group07/1536161030/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private int size; - - public LinkedList(){ - this.head = null; - this.size = 0; - } - - public void add(Object o) { - Node newNode = new Node(o); - if(isEmpty()){ - head = newNode; - } - else{ - newNode.next = head; - head = newNode; - } - size++; - } - - public void add(int index, Object o) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("下标越界"); - - Node indexNode = node(index); - - Node newNode = new Node(o); - if(isEmpty()){ - head = newNode; - }else { - newNode.next = indexNode; - indexNode = newNode; - } - size++; - } - - public Object get(int index) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("下标越界"); - return node(index).data; - } - - public Object remove(int index) { - Node indexNode = node(index); - Node preNode = node(index); - preNode.next = indexNode.next; - indexNode.next = null; - size--; - return indexNode.data; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - if(o == null){ - throw new RuntimeException("不能加入null元素"); - } - Node newNode = new Node(o); - newNode.next = head; - size++; - } - - public void addLast(Object o) { - Node newNode = new Node(o); - Node last = node(size); - - newNode.next = last.next; - last.next = newNode; - size++; - } - - public Object removeFirst() { - Node oldNode = head; - head = head.next; - head.next = null; - size--; - return oldNode.data; - } - - public Object removeLast() { - Node oldNode = node(size); - Node preNode = node(size - 1); - preNode.next = null; - size--; - return oldNode.data; - } - - public Iterator iterator(int index) { - return new Itr(index); - } - - // TODO: 2017/2/24 - private class Itr implements com.coding.basic.Iterator { - private int nextIndex; - - public Itr(int index) { - this.nextIndex = index; - } - - @Override - public boolean hasNext() { - return nextIndex < size; - } - - @Override - public Object next() { - return null; - } - } - - - private static class Node { - public Object data; - public Node next; - - public Node(Object data) { - this.data = data; - this.next = null; - } - } - - Node node(int index) { - Node x = head; - for (int i = 0; i < index; i++) - x = x.next; - return x; - } - - // - public boolean isEmpty() { - return head ==null; - } -} diff --git a/group07/1536161030/src/com/coding/basic/List.java b/group07/1536161030/src/com/coding/basic/List.java deleted file mode 100644 index df30cc6e07..0000000000 --- a/group07/1536161030/src/com/coding/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group07/1536161030/src/com/coding/basic/Queue.java b/group07/1536161030/src/com/coding/basic/Queue.java deleted file mode 100644 index 70f99dfd3e..0000000000 --- a/group07/1536161030/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.coding.basic; - -public class Queue { - private int size; - - //头标志位 - private int head; - - //尾标志位 - private int tail; - - private Object[] queue; - - public Queue() { - this.queue = new Object[10]; - this.size = 0 ; - this.head = 0; - this.tail = 0; - } - - public void enQueue(Object o) { - if(isFull()){ - resize(); - head=0; - } - int newtail = (head + size )% queue.length; - queue[newtail]=o; - size ++; - } - - public Object deQueue() { - if(isEmpty()) - throw new IndexOutOfBoundsException("队列为空!"); - Object old = queue[head]; - queue[head] =null; - head = (head + 1)% queue.length; - size --; - return old; - - } - - public Object getHead(){ - return head; - } - - public Object getTail(){ - return tail; - } - - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - int diff = tail - head; - return diff; - } - - // - public boolean isFull(){ - return size == queue.length; - } - - //扩容 - public void resize(){ - Object[] newQueue = new Object[queue.length * 2]; - System.arraycopy(queue, 0, newQueue, 0, size); - this.queue = newQueue; - newQueue = null; - } -} diff --git a/group07/1536161030/src/com/coding/basic/Stack.java b/group07/1536161030/src/com/coding/basic/Stack.java deleted file mode 100644 index 233723755b..0000000000 --- a/group07/1536161030/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coding.basic; - -import java.util.EmptyStackException; - - -public class Stack { - private Object[] elementData; - private int size; - - public Stack() { - this.size = 0; - this.elementData = new Object[10]; - } - - public void push(Object o) { - if (o == null) - throw new RuntimeException("元素不可为NULL"); - size++; - elementData[size -1]= o ; - } - - public Object pop() { - if (isEmpty()) - throw new EmptyStackException(); - Object old = elementData[size - 1]; - elementData[size] = null; - size--; - return old; - } - - public Object peek() { - if (isEmpty()) - throw new EmptyStackException(); - return elementData[size -1]; - } - - public boolean isEmpty() { - return size < 1; - } - - // - public int size() { - return size; - } -} - - diff --git a/group07/1536161030/src/com/coding/test/ArrayListTest.java b/group07/1536161030/src/com/coding/test/ArrayListTest.java deleted file mode 100644 index 482fe53cd8..0000000000 --- a/group07/1536161030/src/com/coding/test/ArrayListTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import org.junit.Test; - -import com.coding.basic.ArrayList; - -// -public class ArrayListTest { - - @Test - public void testAddObject() { - ArrayList al = new ArrayList(); - assertEquals(10, al.size()); - al.add(new Integer(1)); - System.out.print(al.get(0)); - } - - @Test - public void testAddIntObject() { - ArrayList al = new ArrayList(); - al.add(0, new Integer(1)); - assertEquals(10, al.size()); - int tmp = 0; - try { - al.add(4, new Integer(4)); - } catch (IndexOutOfBoundsException e) { - tmp = 1; - assertEquals(tmp, 1); - } - - } - - @Test - public void testGet() { - ArrayList al = new ArrayList(); - al.add(new Integer(1)); - assertEquals((Integer)al.get(0),new Integer(1)); - int tmp = 0; - try { - al.get(4); - } catch (IndexOutOfBoundsException e) { - tmp = 1; - assertEquals(tmp, 1); - } - } - - @Test - public void testRemove() { - ArrayList al = new ArrayList(); - al.add(new Integer(1)); - assertEquals((Integer)al.get(0),new Integer(1)); - assertEquals(al.size(),10); - } - - @Test - public void testSize() { - ArrayList al = new ArrayList(); - assertEquals(10, al.size()); - } - - @Test - public void testIsEmpty() { - ArrayList al = new ArrayList(); - assertTrue(al.isEmpty()); - al.add(new Integer(1)); - assertFalse(al.isEmpty()); - } -} diff --git a/group07/1536161030/src/com/coding/test/BinaryTreeNodeTest.java b/group07/1536161030/src/com/coding/test/BinaryTreeNodeTest.java deleted file mode 100644 index dd2cde39b7..0000000000 --- a/group07/1536161030/src/com/coding/test/BinaryTreeNodeTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.test; - -// -import static org.junit.Assert.*; - -import org.junit.Test; - -import com.coding.basic.BinaryTreeNode; -import com.coding.basic.LinkedList; - -public class BinaryTreeNodeTest { - - @Test - public void testAddObject() { - BinaryTreeNode bt = new BinaryTreeNode(null); - bt.insert(new Integer(1)); - assertNotNull(bt); - } -} diff --git a/group07/1536161030/src/com/coding/test/LinkedListTest.java b/group07/1536161030/src/com/coding/test/LinkedListTest.java deleted file mode 100644 index fb0ed303ed..0000000000 --- a/group07/1536161030/src/com/coding/test/LinkedListTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import org.junit.Test; - -import com.coding.basic.LinkedList; - -// -public class LinkedListTest{ - @Test - public void testAddObject() { - LinkedList list = new LinkedList(); - assertEquals(0, list.size()); - list.add(new Integer(1)); - assertEquals(1, list.size()); - } - - @Test - public void testAddIntObject() { - LinkedList list = new LinkedList(); - list.add(0, new Integer(1)); - assertEquals(1, list.size()); - int tmp = 0; - try { - list.add(4, new Integer(4)); - } catch (IndexOutOfBoundsException e) { - tmp = 1; - assertEquals(tmp, 1); - } - } - - @Test - public void testGet() { - LinkedList list = new LinkedList(); - list.add(new Object()); - assertNotNull(list.get(0)); - int tmp = 0; - try { - list.get(4); - } catch (IndexOutOfBoundsException e) { - tmp = 1; - assertEquals(tmp, 1); - } - } - - @Test - public void testRemove() { - LinkedList list = new LinkedList(); - list.add(new Object()); - list.remove(0); - assertEquals(list.size(),0); - } - - @Test - public void testSize() { - LinkedList list = new LinkedList(); - assertEquals(0, list.size()); - } - - @Test - public void testIsEmpty() { - LinkedList list = new LinkedList(); - assertTrue(list.isEmpty()); - list.add(new Object()); - assertFalse(list.isEmpty()); -} -} diff --git a/group07/1536161030/src/com/coding/test/QueueTest.java b/group07/1536161030/src/com/coding/test/QueueTest.java deleted file mode 100644 index 3130dbc808..0000000000 --- a/group07/1536161030/src/com/coding/test/QueueTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import org.junit.Test; - -import com.coding.basic.Queue; - -// -public class QueueTest { - - @Test - public void testEnQueue() { - Queue queue = new Queue(); - assertEquals(queue.size(), 0); - System.out.print(queue.getHead()); - } - - @Test - public void testDeQueue() { - Queue queue = new Queue(); - int tmp = 0; - try { - queue.deQueue(); - } catch (IndexOutOfBoundsException e) { - tmp = 1; - assertEquals(tmp, 1); - } - queue.enQueue(new Object()); - assertNotNull(queue.deQueue()); - } - - @Test - public void testIsEmpty() { - Queue queue = new Queue(); - assertTrue(queue.isEmpty()); - queue.enQueue(new Object()); - assertFalse(queue.isEmpty()); - } - - @Test - public void testSize() { - Queue queue = new Queue(); - assertEquals(queue.size(), 0); - } - -} diff --git a/group07/1536161030/src/com/coding/test/StackTest.java b/group07/1536161030/src/com/coding/test/StackTest.java deleted file mode 100644 index 3622e0cb68..0000000000 --- a/group07/1536161030/src/com/coding/test/StackTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import java.util.EmptyStackException; - -import org.junit.Test; - -import com.coding.basic.Stack; - -// -public class StackTest { - - @Test - public void testPush() { - Stack stack = new Stack(); - assertEquals(0, stack.size()); - stack.push(new Object()); - assertEquals(1, stack.size()); - } - - @Test - public void testPop() { - Stack stack = new Stack(); - stack.push(new Object()); - assertNotNull(stack.pop()); - assertEquals(0, stack.size()); - } - - @Test - public void testPeek() { - Stack stack = new Stack(); - int tmp = 0; - try { - stack.peek(); - } catch (EmptyStackException e) { - tmp = 1; - assertEquals(1, tmp); - } - stack.push(new Object()); - assertNotNull(stack.peek()); - assertEquals(1, stack.size()); - } - - @Test - public void testIsEmpty() { - Stack stack = new Stack(); - assertTrue(stack.isEmpty()); - stack.push(new Object()); - assertFalse(stack.isEmpty()); - } - - @Test - public void testSize() { - Stack stack = new Stack(); - assertEquals(0, stack.size()); - } -} diff --git "a/group07/178007127/git\345\221\275\344\273\244.txt" "b/group07/178007127/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/178007127/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/20409287/git\345\221\275\344\273\244.txt" "b/group07/20409287/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/20409287/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/2306826375/git\345\221\275\344\273\244.txt" "b/group07/2306826375/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/2306826375/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git a/group07/2306826375/txt b/group07/2306826375/txt deleted file mode 100644 index d6459e0054..0000000000 --- a/group07/2306826375/txt +++ /dev/null @@ -1 +0,0 @@ -xxx diff --git "a/group07/2708094737/git\345\221\275\344\273\244.txt" "b/group07/2708094737/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/2708094737/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/2915553181/git\345\221\275\344\273\244.txt" "b/group07/2915553181/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/2915553181/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/328536398/git\345\221\275\344\273\244.txt" "b/group07/328536398/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/328536398/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/396868934/git\345\221\275\344\273\244.txt" "b/group07/396868934/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/396868934/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/43819473/git\345\221\275\344\273\244.txt" "b/group07/43819473/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/43819473/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/466199956/git\345\221\275\344\273\244.txt" "b/group07/466199956/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/466199956/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git a/group07/476770768/MyDataStructure/.classpath b/group07/476770768/MyDataStructure/.classpath deleted file mode 100644 index 63b7e892d1..0000000000 --- a/group07/476770768/MyDataStructure/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group07/476770768/MyDataStructure/.gitignore b/group07/476770768/MyDataStructure/.gitignore deleted file mode 100644 index c910559f7f..0000000000 --- a/group07/476770768/MyDataStructure/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -#ide config -.metadata -.recommenders -/bin/ diff --git a/group07/476770768/MyDataStructure/.project b/group07/476770768/MyDataStructure/.project deleted file mode 100644 index b2d0b8054f..0000000000 --- a/group07/476770768/MyDataStructure/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - MyDataStructure - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group07/476770768/MyDataStructure/.settings/org.eclipse.jdt.core.prefs b/group07/476770768/MyDataStructure/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a87..0000000000 --- a/group07/476770768/MyDataStructure/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/BinaryTreeNode.java b/group07/476770768/MyDataStructure/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 6cc4ecb4df..0000000000 --- a/group07/476770768/MyDataStructure/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public void insert(BinaryTreeNode node) { - if (this.data == null) { - // empty binary tree - this.data = node.data; - this.left = node.left; - this.right = node.right; - } else if (((Integer) this.data).intValue() >= ((Integer) node.data).intValue()) { - this.left.insert(node); - }else{ - this.right.insert(node); - } - } - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } -} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyArrayList.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyArrayList.java deleted file mode 100644 index f0c1b3608c..0000000000 --- a/group07/476770768/MyDataStructure/src/com/coding/basic/MyArrayList.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class MyArrayList implements MyList{ - - private int size = 0; - - private Object[] elementData = new Object[5]; - - @Override - /** - * add an element to the end - */ - public void add(Object o) { - int index = size; - if(isFull()){ - extendLength(); - } - elementData[index] = o; - size++; - } - - @Override - /** - * add an element to certain index - */ - public void add(int index, Object o) { - checkBounds(index); - if(isFull()){ - extendLength(); - } - for(int i=size; i>=index; i--){ - elementData[i+1] = elementData[i]; - } - elementData[index] = o; - size++; - } - - @Override - /** - * get an element - */ - public Object get(int index) { - checkBoundsForGet(index); - if(index >= size){ - return null; - } - return elementData[index]; - } - - @Override - /** - * remove an element - */ - public Object remove(int index) { - checkBounds(index); - Object res = elementData[index]; - for(int i=index+1; i<=size; i++){ - elementData[i-1] = elementData[i]; - } - size--; - return res; - } - - @Override - public int size() { - return size; - } - - /** - * extends the length - */ - public void extendLength(){ - elementData = Arrays.copyOf(elementData, elementData.length * 2); - //System.out.println("add extend "+elementData.length); - } - - public boolean isEmpty(){ - return size == 0; - } - - public boolean isFull(){ - int len = elementData.length; - if(size >= len-1){ - return true; - } - return false; - } - - public void checkBounds(int index){ - if(index >= size || index < 0){ - //System.out.println("From MyArrayList: Index out of bounds"); - throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); - } - } - - /** - * for get() - * @param index - */ - public void checkBoundsForGet(int index){ - if(index >= elementData.length || index < 0){ - //System.out.println("From MyArrayList: Index out of bounds"); - throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); - } - } - - public String OutOfBoundsMsg(int index){ - return "Index: "+index+", Size: "+size; - } - - @Override - public String toString() { - String s = ""; - for(int i=0; i size - 1) { - // System.out.println("From MyLinkedList: Index out of bounds"); - throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); - } - } - - /** - * the index should be within 0~size - * - * @param index - */ - public void checkBoundsForAdd(int index) { - if (index < 0 || index > size) { - // System.out.println("From MyLinkedList: Index out of bounds"); - throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); - } - } - - public String OutOfBoundsMsg(int index) { - return "Index: " + index + ", Size: " + size; - } - - /** - * find the position of index - * - * @param index - * @return - */ - public Node findIndexPosition(int index) { - Node pos = head; - for (int i = 0; i < index; i++) { - pos = pos.next; - } - return pos; - } - - @Override - public String toString() { - String s = ""; - Node tmp = head; - while (tmp != null) { - s += tmp.data + " "; - tmp = tmp.next; - } - return s; - } - - private static class Node { - public Object data; - public Node prov; - public Node next; - - public Node() { - } - - public Node(Object o) { - this.data = o; - this.prov = null; - this.next = null; - } - } - - public MyIterator iterator() { - return new LinkedListIterator(this); - } - - private class LinkedListIterator implements MyIterator{ - - private MyLinkedList eleIterator; - private Node pos; - - private LinkedListIterator(MyLinkedList mll){ - this.eleIterator = mll; - this.pos = eleIterator.get(0); - } - - @Override - public boolean hasNext() { - return pos != null; - } - - @Override - public Object next() { - Node res = pos; - pos = pos.next; - return res; - } - - } - -} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyList.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyList.java deleted file mode 100644 index 9089e106db..0000000000 --- a/group07/476770768/MyDataStructure/src/com/coding/basic/MyList.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface MyList { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyQueue.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyQueue.java deleted file mode 100644 index 717c67bd4b..0000000000 --- a/group07/476770768/MyDataStructure/src/com/coding/basic/MyQueue.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -public class MyQueue { - - private MyLinkedList elementData = new MyLinkedList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - //if queue is empty, element.size()-1 = -1 - //MyLinkedList will throw exception - Object tmp = elementData.remove(elementData.size()-1); - return tmp; - } - - public boolean isEmpty(){ - return elementData.isEmpty(); - } - - public int size(){ - return elementData.size(); - } - - public MyIterator iterator() { - return elementData.iterator(); - } - -} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyStack.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyStack.java deleted file mode 100644 index 3d9e1ef9a0..0000000000 --- a/group07/476770768/MyDataStructure/src/com/coding/basic/MyStack.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.coding.basic; - -import java.util.EmptyStackException; - -public class MyStack { - private MyArrayList elementData = new MyArrayList(); - int top = -1;//always points to top element - - public void push(Object o){ - elementData.add(o); - top++; - } - - public Object pop(){ - if(isEmpty()){ - throw new EmptyStackException(); - }else{ - Object tmp = elementData.remove(top); - top--; - return tmp; - } - } - - public Object peek(){ - if(isEmpty()){ - throw new EmptyStackException(); - }else{ - Object tmp = elementData.get(top); - return tmp; - } - } - - public boolean isEmpty(){ - return top >= 0; - } - - public int size(){ - return top + 1; - } - - public MyIterator iterator() { - return elementData.iterator(); - } -} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/testFile.java b/group07/476770768/MyDataStructure/src/com/coding/basic/testFile.java deleted file mode 100644 index 1ccabfc977..0000000000 --- a/group07/476770768/MyDataStructure/src/com/coding/basic/testFile.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.basic; - -public class testFile { - - public static void main(String[] args) { - MyLinkedList mll = new MyLinkedList(); - mll.add(new Integer(5)); - mll.add(new Integer(2)); - mll.add(new Integer(3)); - mll.add(new Integer(4)); - System.out.println(mll); - MyIterator mIt = mll.iterator(); - while(mIt.hasNext()){ - System.out.println(mIt.next()); - } - mll.remove(3); - System.out.println(mll); - - - - } - -} diff --git "a/group07/476770768/git\345\221\275\344\273\244.txt" "b/group07/476770768/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/476770768/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/515372252/git\345\221\275\344\273\244.txt" "b/group07/515372252/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/515372252/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/562247675/git\345\221\275\344\273\244.txt" "b/group07/562247675/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/562247675/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git a/group07/562247675/homework/.gitignore b/group07/562247675/homework/.gitignore deleted file mode 100644 index df3ade545c..0000000000 --- a/group07/562247675/homework/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -rebel.xml -.idea/ -*.iml -target/ -*.class -*.jar -*.war -*.ear -hs_err_pid* -*.DS_Store -._* -.Trashes -.TemporaryItems -desktop.ini -Thumbs.db -$RECYCLE.BIN/ -*.lnk -.metadata -.settings -.classpath -.mymetadata -.project \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/pom.xml b/group07/562247675/homework/homework-0226/pom.xml deleted file mode 100644 index f6a6002f6d..0000000000 --- a/group07/562247675/homework/homework-0226/pom.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - com.coding2017.group7 - homework - 1.0-SNAPSHOT - - 4.0.0 - - com.coding2017.group7 - homework-0226 - - - junit - junit - - - - \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayList.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayList.java deleted file mode 100644 index 05d3d80d49..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayList.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -import java.util.Arrays; - -public class MyArrayList implements MyList { - - private int size = 0; - - private Object[] elementData = new Object[10]; - - @Override - public void add(Object o) { - if (isFull()) { - increase(); - } - elementData[size++] = o; - } - - @Override - public void add(int index, Object o) { - checkRangeAdd(index); - if (isFull()) { - increase(); - } - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - @Override - public Object get(int index) { - checkRangeGet(index); - return elementData[index]; - } - - @Override - public Object remove(int index) { - checkRangeGet(index); - Object element = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - (index + 1)); - elementData[--size] = null; - return element; - } - - @Override - public int size() { - return size; - } - - public MyIterator iterator() { - return new MyArrayListIterator(); - } - - private boolean isFull() { - return size >= elementData.length; - } - - private void checkRangeGet(int index) { - boolean outOfRange = index < 0 || index >= size; - if (outOfRange) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - } - - private void checkRangeAdd(int index) { - boolean outOfRange = index < 0 || index > size; - if (outOfRange) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - } - - private void increase() { - Object[] target = new Object[elementData.length * 2]; - System.arraycopy(elementData, 0, target, 0, elementData.length); - elementData = target; - } - - @Override - public String toString() { - return Arrays.toString(elementData); - } - - private class MyArrayListIterator implements MyIterator { - - private int index = 0; - - @Override - public boolean hasNext() { - return index < size; - } - - @Override - public Object next() { - checkRangeGet(index); - return elementData[index++]; - } - } -} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayListTest.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayListTest.java deleted file mode 100644 index 7523092985..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayListTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class MyArrayListTest { - - private MyArrayList myList = new MyArrayList(); - private Object[] elements = new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; - private final int mySize = elements.length; - - @Before - public void setUp() throws Exception { - for (int i = 0; i < mySize; i++) { - myList.add(i, i + 1); - } - } - - @After - public void tearDown() throws Exception { - for (int i = myList.size(); i > 0; i--) { - myList.remove(i - 1); - } - myList = null; - } - - @Test - public void addLast() throws Exception { - int element = -1; - myList.add(element); - Assert.assertEquals(myList.size(), mySize + 1); - Assert.assertTrue(myList.get(myList.size() - 1).equals(element)); - } - - @Test - public void addIndex() throws Exception { - int index = mySize / 2; - int element = -1; - myList.add(index, element); - Assert.assertTrue(myList.get(index).equals(element)); - Assert.assertEquals(myList.size(), mySize + 1); - } - - @Test - public void remove() throws Exception { - int index = mySize / 2; - Object before = myList.get(index + 1); - Object element = myList.remove(index); - Object after = myList.get(index); - Assert.assertTrue(before.equals(after)); - Assert.assertEquals(myList.size(), mySize - 1); - - } - - @Test - public void iterator() throws Exception { - MyIterator iterator = myList.iterator(); - int count = 0; - while (iterator.hasNext()) { - iterator.next(); - count++; - } - Assert.assertEquals(mySize, count); - } - -} \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNode.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNode.java deleted file mode 100644 index 334dcd06de..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNode.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -public class MyBinaryTreeNode { - - private Comparable data; - private MyBinaryTreeNode left; - private MyBinaryTreeNode right; - - public Comparable getData() { - return data; - } - - public void setData(Comparable data) { - this.data = data; - } - - public MyBinaryTreeNode getLeft() { - return left; - } - - public void setLeft(MyBinaryTreeNode left) { - this.left = left; - } - - public MyBinaryTreeNode getRight() { - return right; - } - - public void setRight(MyBinaryTreeNode right) { - this.right = right; - } - - public MyBinaryTreeNode insert(Comparable o) { - if (data == null) { - data = o; - } - int compare = o.compareTo(data); - if (compare < 0) { - if (left == null) { - left = new MyBinaryTreeNode(); - } - left.insert(o); - } else if (compare > 0) { - if (right == null) { - right = new MyBinaryTreeNode(); - } - right.insert(o); - } - return this; - } - -} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNodeTest.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNodeTest.java deleted file mode 100644 index 9766b03947..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNodeTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -import org.junit.Assert; -import org.junit.Test; - -public class MyBinaryTreeNodeTest { - - - @Test - public void insert() throws Exception { - MyBinaryTreeNode node = new MyBinaryTreeNode(); - node.insert(5) - .insert(2) - .insert(7) - .insert(1) - .insert(6) - .insert(4) - .insert(8) - .insert(3); - Comparable data1 = node.getLeft().getLeft().getData(); - Comparable data4 = node.getLeft().getRight().getData(); - Comparable data6 = node.getRight().getLeft().getData(); - Comparable data8 = node.getRight().getRight().getData(); - Comparable data3 = node.getLeft().getRight().getLeft().getData(); - Assert.assertEquals(1, data1); - Assert.assertEquals(4, data4); - Assert.assertEquals(6, data6); - Assert.assertEquals(8, data8); - Assert.assertEquals(3, data3); - - } - - -} \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyIterator.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyIterator.java deleted file mode 100644 index 9ecc4d3a7f..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyIterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -public interface MyIterator { - public boolean hasNext(); - - public Object next(); - -} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedList.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedList.java deleted file mode 100644 index 6b8a9ed197..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedList.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -public class MyLinkedList implements MyList { - - private Node head = new Node(); - private int size = 0; - - @Override - public void add(Object o) { - Node node = new Node(); - node.data = o; - Node last = find(size - 1); - last.next = node; - size++; - } - - @Override - public void add(int index, Object o) { - checkRangeAdd(index); - Node insert = find(index); - Node before = find(index - 1); - Node node = new Node(); - node.data = o; - node.next = insert; - before.next = node; - size++; - } - - @Override - public Object get(int index) { - checkRangeGet(index); - return find(index).data; - } - - @Override - public Object remove(int index) { - checkRangeGet(index); - Node before = find(index - 1); - Node remove = find(index); - Node after = find(index + 1); - before.next = after; - size--; - return remove.data; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object o) { - Node node = new Node(); - node.data = o; - node.next = find(0); - head.next = node; - size++; - } - - public void addLast(Object o) { - Node last = find(size - 1); - Node node = new Node(); - node.data = o; - last.next = node; - size++; - } - - public Object removeFirst() { - checkRangeGet(size - 1); - Node remove = find(0); - head.next = find(1); - size--; - return remove.data; - } - - public Object removeLast() { - checkRangeGet(size - 1); - Node remove = find(size - 1); - Node before = find(size - 2); - before.next = null; - size--; - return remove.data; - } - - public MyIterator iterator() { - return new MyLinkedListIterator(); - } - - private void checkRangeGet(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size); - } - } - - private void checkRangeAdd(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size); - } - } - private Node find(int index) { - Node node = head; - int pos = -1; - while (pos < index) { - node = node.next; - pos++; - } - return node; - } - - @Override - public String toString() { - Node node = head; - StringBuilder sBuilder = new StringBuilder(); - while (node.next != null) { - node = node.next; - sBuilder.append(node.data).append(", "); - } - int length = sBuilder.length(); - if (length > 0) { - sBuilder.delete(length - 2, length); - } - return "[" + sBuilder.toString() + "]"; - } - - private static class Node { - Object data; - Node next; - - } - - - private class MyLinkedListIterator implements MyIterator { - - - private Node node = head; - private int size = 0; - - @Override - public boolean hasNext() { - return node.next != null; - } - - @Override - public Object next() { - checkRangeGet(size); - node = node.next; - size++; - return node.data; - } - } -} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedListTest.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedListTest.java deleted file mode 100644 index fe7d9ba28b..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedListTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class MyLinkedListTest { - - private MyLinkedList myList = new MyLinkedList(); - private Object[] elements = new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; - private final int mySize = elements.length; - - @Before - public void setUp() throws Exception { - for (int i = 0; i < mySize; i++) { - myList.add(i, i + 1); - } - } - - @After - public void tearDown() throws Exception { - for (int i = myList.size(); i > 0; i--) { - myList.remove(i - 1); - } - myList = null; - } - - @Test - public void add() throws Exception { - myList.add(-1); - Assert.assertEquals(myList.size(), mySize + 1); - } - - @Test - public void addIndex() throws Exception { - int pos = mySize / 2; - Object before = myList.get(pos); - myList.add(pos, -1); - Object after = myList.get(pos + 1); - Assert.assertEquals(myList.size(), mySize + 1); - Assert.assertEquals(before, after); - } - - @Test - public void remove() throws Exception { - myList.remove(0); - myList.remove(myList.size() - 1); - myList.remove(myList.size() / 2); - Assert.assertEquals(myList.size(), mySize - 3); - } - - @Test - public void addFirst() throws Exception { - myList.addFirst(-1); - myList.addFirst(-1); - myList.addFirst(-1); - Object o1 = myList.get(0); - Object o2 = myList.get(1); - Object o3 = myList.get(2); - Assert.assertTrue(o1.equals(o2)); - Assert.assertTrue(o2.equals(o3)); - Assert.assertTrue(o3.equals(-1)); - Assert.assertEquals(myList.size(), mySize + 3); - } - - @Test - public void addLast() throws Exception { - myList.addLast(-1); - myList.addLast(-1); - myList.addLast(-1); - Object o1 = myList.get(myList.size() - 1); - Object o2 = myList.get(myList.size() - 2); - Object o3 = myList.get(myList.size() - 3); - Assert.assertTrue(o1.equals(o2)); - Assert.assertTrue(o2.equals(o3)); - Assert.assertTrue(o3.equals(-1)); - Assert.assertEquals(myList.size(), mySize + 3); - } - - @Test - public void removeFirst() throws Exception { - myList.addFirst(-1); - Object o = myList.removeFirst(); - Assert.assertTrue(o.equals(-1)); - Assert.assertEquals(myList.size(), mySize); - } - - @Test - public void removeLast() throws Exception { - myList.addLast(-1); - Object o = myList.removeLast(); - Assert.assertTrue(o.equals(-1)); - Assert.assertEquals(myList.size(), mySize); - } - - @Test - public void iterator() throws Exception { - MyIterator iterator = myList.iterator(); - int count = 0; - while (iterator.hasNext()) { - System.out.println(iterator.next()); - count++; - } - Assert.assertEquals(mySize, count); - } - -} \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyList.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyList.java deleted file mode 100644 index 7532313b89..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyList.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -public interface MyList { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueue.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueue.java deleted file mode 100644 index c701c032b8..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueue.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -import java.util.EmptyStackException; - -public class MyQueue { - - private MyLinkedList myLinkedList = new MyLinkedList(); - - public void enQueue(Object o) { - myLinkedList.add(0, o); - } - - public Object deQueue() { - if (isEmpty()) { - throw new EmptyQueueException(); - } - return myLinkedList.removeLast(); - } - - public boolean isEmpty() { - return myLinkedList.size() <= 0; - } - - public int size() { - return myLinkedList.size(); - } - - private static class EmptyQueueException extends EmptyStackException { - } - - @Override - public String toString() { - return myLinkedList.toString(); - } -} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueueTest.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueueTest.java deleted file mode 100644 index 6bcae88530..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueueTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class MyQueueTest { - - private MyQueue myQueue = new MyQueue(); - private final Object[] elements = {1, 2, 3}; - private final int mySize = elements.length; - - @Before - public void setUp() throws Exception { - for (int i = 0; i < mySize; i++) { - myQueue.enQueue(i + 1); - } - } - - @After - public void tearDown() throws Exception { - for (int i = myQueue.size(); i > 0; i--) { - myQueue.deQueue(); - } - } - - @Test - public void enQueue() throws Exception { - myQueue.enQueue(-1); - Object o = 0; - for (int i = myQueue.size(); i > 0; i--) { - o = myQueue.deQueue(); - } - Assert.assertTrue(o.equals(-1)); - } - - @Test - public void deQueue() throws Exception { - myQueue.enQueue(-1); - Object o = myQueue.deQueue(); - Assert.assertTrue(o.equals(elements[0])); - } - -} \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStack.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStack.java deleted file mode 100644 index 18c10704a7..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStack.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -import java.util.EmptyStackException; - -public class MyStack { - private MyArrayList elementData = new MyArrayList(); - private final int first = 0; - - public void push(Object o) { - - elementData.add(first, o); - } - - public Object pop() { - if (isEmpty()) { - throw new EmptyStackException(); - } - return elementData.remove(first); - } - - public Object peek() { - if (isEmpty()) { - throw new EmptyStackException(); - } - return elementData.get(first); - } - - public boolean isEmpty() { - return elementData.size() <= 0; - } - - public int size() { - return elementData.size(); - } - - @Override - public String toString() { - return elementData.toString(); - } -} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStackTest.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStackTest.java deleted file mode 100644 index d29031be60..0000000000 --- a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStackTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coding2017.group7.homework.c0226; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class MyStackTest { - private MyStack myStack = new MyStack(); - private Object[] elements = new Object[]{1}; - private final int mySize = elements.length; - - @Before - public void setUp() throws Exception { - for (int i = 0; i < mySize; i++) { - myStack.push(i + 1); - } - } - - @After - public void tearDown() throws Exception { - for (int i = myStack.size(); i > 0; i--) { - myStack.pop(); - } - } - - @Test - public void push() throws Exception { - myStack.push(-1); - Assert.assertTrue(myStack.pop().equals(-1)); - } - - @Test - public void pop() throws Exception { - for (int i = myStack.size(); i > 0; i--) { - myStack.pop(); - } - Assert.assertEquals(myStack.size(), 0); - } - - @Test - public void peek() throws Exception { - for (int i = 0; i < myStack.size(); i++) { - Object peek = myStack.peek(); - Assert.assertTrue(peek.equals(elements[i])); - } - Assert.assertEquals(myStack.size(), mySize); - } - -} \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/resources/readme.md b/group07/562247675/homework/homework-0226/src/main/resources/readme.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/group07/562247675/homework/homework-0226/src/test/resources/readme.md b/group07/562247675/homework/homework-0226/src/test/resources/readme.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/group07/562247675/homework/pom.xml b/group07/562247675/homework/pom.xml deleted file mode 100644 index 17a2c5f0fd..0000000000 --- a/group07/562247675/homework/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - 4.0.0 - - com.coding2017.group7 - homework - 1.0-SNAPSHOT - - - homework-0226 - - - pom - - UTF-8 - 1.6 - 1.6 - - - - - junit - junit - 4.12 - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${maven.compiler.source} - ${maven.compiler.target} - ${project.build.sourceEncoding} - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - diff --git a/group07/562247675/homework/readme.md b/group07/562247675/homework/readme.md deleted file mode 100644 index 2a54b7ef9a..0000000000 --- a/group07/562247675/homework/readme.md +++ /dev/null @@ -1 +0,0 @@ -# Homework \ No newline at end of file diff --git a/group07/562247675/notebook/readme.md b/group07/562247675/notebook/readme.md deleted file mode 100644 index d36f4b9c53..0000000000 --- a/group07/562247675/notebook/readme.md +++ /dev/null @@ -1 +0,0 @@ -# Notebook \ No newline at end of file diff --git "a/group07/598812995/git\345\221\275\344\273\244.txt" "b/group07/598812995/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/598812995/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/603622009/git\345\221\275\344\273\244.txt" "b/group07/603622009/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/603622009/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/724319952/git\345\221\275\344\273\244.txt" "b/group07/724319952/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/724319952/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git "a/group07/752262774/git\345\221\275\344\273\244.txt" "b/group07/752262774/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/752262774/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git a/group07/764189149/.classpath b/group07/764189149/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group07/764189149/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group07/764189149/.gitignore b/group07/764189149/.gitignore deleted file mode 100644 index 8d9372e204..0000000000 --- a/group07/764189149/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -/bin/ diff --git a/group07/764189149/.project b/group07/764189149/.project deleted file mode 100644 index 2076c6b51c..0000000000 --- a/group07/764189149/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 764189149Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group07/764189149/src/firstHomeWork/util/ArrayList.java b/group07/764189149/src/firstHomeWork/util/ArrayList.java deleted file mode 100644 index 88b97d828f..0000000000 --- a/group07/764189149/src/firstHomeWork/util/ArrayList.java +++ /dev/null @@ -1,197 +0,0 @@ -package firstHomeWork.util; - -import java.util.NoSuchElementException; - -/** - * @Description: 基于数组的列表 - * @author: leijing - * @date: 2017年2月21日 下午9:03:17 - * @param - */ -public class ArrayList implements List { - private static int initialCapacity = 10 ;//数组默认初始容量 - Object[] elements;//元素的数组 - private int size;//元素的个数 - - public ArrayList(){ - this(initialCapacity); - } - public ArrayList(int capacity){ - elements = new Object[capacity]; - } - private void ensureCapacity(int minCapacity){ - if(minCapacity > 0){ - - } - } - @Override - public boolean add(E e) { - ensureCapacity(size + 1); - elements[size++] = e; - return true; - } - - @Override - public E remove(int index) { - rangeCheck(index); - E oldElement = (E) elements[index]; - //将其后的元素前移 - int needMovedNum = size - index - 1; - move(elements, index+1, elements,index, needMovedNum); - size--; - return oldElement; - } - - /** - * @Description: 移动数组中的元素 - * @param src 原数组 - * @param from 复制元素起始下标 - * @param dest 目标元素数组 - * @param num 要复制的元素个数 - * @return: void - * @author: leijing - * @date: 2017年2月22日 下午7:54:08 - */ - private void move(Object[] src , int srcPosition , Object[] dest , int destPosition, int num){ - for(int i = 0 ; i < num ; i ++){ - dest[destPosition++] = src[srcPosition++]; - } - } - - /** - * @Description: 检查下标是否正确,如果越界抛出异常 - * @param index - * @return: void - * @author: leijing - * @date: 2017年2月22日 下午7:52:59 - */ - private void rangeCheck(int index){ - if(index < 0 || index > size){ - throw new IndexOutOfBoundsException(); - } - } - - @Override - public boolean remove(Object o) { - if(o == null){ - for (int index = 0; index < size; index++) { - if(elements[index] == null){ - remove(index); - return true; - } - } - }else{ - for (int index = 0; index < size; index++) { - if(o.equals(elements[index])){ - remove(index); - return true; - } - } - } - return false; - } - - @Override - public int size() { - return size; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - @Override - public E get(int index) { - rangeCheck(index); - return (E) elements[index]; - } - - @Override - public E set(int index, E e) { - rangeCheck(index); - E oldElement = (E) elements[index]; - elements[index] = e; - return oldElement; - } - - @Override - public boolean contains(Object o) { - return indexOf(o) >= 0; - } - - private int indexOf(Object o){ - if(o == null){ - for (int index = 0; index < size; index++) { - if(elements[index] == null){ - return index; - } - } - }else{ - for (int index = 0; index < size; index++) { - if(o.equals(elements[index])){ - return index; - } - } - } - return -1; - } - - @Override - public void clear() { - for (int index = 0; index < size; index++) { - elements[index] = null; - } - size = 0; - } - - @Override - public Iterator iterator() { - return new ArraylistIterator(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - for (int index = 0; index < size; index++) { - if(index == size -1){ - sb.append(elements[index]); - }else{ - sb.append(elements[index]).append(","); - } - - } - return sb.toString(); - } - private class ArraylistIterator implements Iterator{ - private int position; - - @Override - public boolean hasNext() { - return position != size; - } - - @Override - public E next() { - Object[] elements = ArrayList.this.elements; - int i = position; - if(i >= size){ - throw new NoSuchElementException(); - } - position = i + 1; - return (E) elements[i+1]; - } - - @Override - public void remove() { - if(position > size){ - throw new NoSuchElementException(); - } - ArrayList.this.remove(position); - } - - } - - - -} diff --git a/group07/764189149/src/firstHomeWork/util/BinaryTreeNode.java b/group07/764189149/src/firstHomeWork/util/BinaryTreeNode.java deleted file mode 100644 index c7e85d4915..0000000000 --- a/group07/764189149/src/firstHomeWork/util/BinaryTreeNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package firstHomeWork.util; -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group07/764189149/src/firstHomeWork/util/DoubleLinkedList.java b/group07/764189149/src/firstHomeWork/util/DoubleLinkedList.java deleted file mode 100644 index 9e83297a46..0000000000 --- a/group07/764189149/src/firstHomeWork/util/DoubleLinkedList.java +++ /dev/null @@ -1,335 +0,0 @@ -package firstHomeWork.util; - -import java.util.NoSuchElementException; - -/** - * @Description: 双向链表 - * @author: leijing - * @date: 2017年2月24日 上午11:37:58 - * @param - */ -public class DoubleLinkedList { - - private int size;//节点个数 - private Node head;//头节点 - private Node tail;//尾节点 - - public Node getHead() { - return head; - } - public void setHead(Node head) { - this.head = head; - } - public Node getTail() { - return tail; - } - public void setTail(Node tail) { - this.tail = tail; - } - /** - * @Description: 添加元素到头部 - * @param e - * @return: boolean - * @author: leijing - * @date: 2017年2月24日 上午11:38:20 - */ - public boolean addFirst(E e) { - Node node = new Node(e); - if(null == head){ - node.prev = null; - head = node; - tail = head; - }else{ - node.next = head; - head.prev = node; - head = node; - } - size++; - return true; - } - /** - * @Description: 添加元素到尾部 - * @param e - * @return: boolean - * @author: leijing - * @date: 2017年2月24日 上午11:38:20 - */ - public boolean addLast(E e) { - Node node = new Node(e); - if(null == tail){ - tail.next = null; - tail = node; - head = tail; - }else{ - tail.next = node; - node.prev = tail; - tail = node; - } - size++; - return true; - } - - public boolean remove(E o) throws Exception { - if(isEmpty()){ - throw new Exception("链表为空,没有元素可以删除"); - } - Node current = head;//从头节点开始删 - if(o == null){ - while(current != null){ - if(current.data == null){ - current.prev.next = current.next;//将当前节点的前驱节点的后继节点改为当前节点的后继 - current.next.prev = current.prev;//将当前节点后继节点的前驱节点改为当前节点的前驱节点 - current.next = null;//当前节点的前驱改为null - current.prev = null;//当前节点的后继改为null - size--; - return true; - } - current = current.next; - } - }else{ - while(current != null){ - if(o.equals(current.data)){ - current.prev.next = current.next;//将当前节点的前驱节点的后继节点改为当前节点的后继 - current.next.prev = current.prev;//将当前节点后继节点的前驱节点改为当前节点的前驱节点 - current.next = null;//当前节点的前驱改为null - current.prev = null;//当前节点的后继改为null - size--; - return true; - } - current = current.next; - } - } - - return false; - } - - /** - * @Description: 返回元素个数 - * @return: int - * @author: leijing - * @date: 2017年2月24日 上午11:38:20 - */ - public int size() { - return size; - } - /** - * @Description: 是否空链表 - * @return: boolean - * @author: leijing - * @date: 2017年2月24日 上午11:38:20 - */ - public boolean isEmpty() { - return size == 0; - } - /** - * @Description: 检查下标有效性 - * @param index - * @return: void - * @author: leijing - * @date: 2017年2月24日 上午11:40:15 - */ - private void rangeCheck(int index){ - if(index < 0 || index > size){ - throw new IndexOutOfBoundsException(); - } - } - public E get(int index) { - rangeCheck(index); - Node current = head;//从头节点开始 - int i = 0; - while(current != null){ - if(i == index){ - return current.data; - } - current = current.next; - i++; - } - return null; - } - public Node node(int index) { - rangeCheck(index); - if(index < size >> 1){//小于元素大小的二分之一,从头节点开始遍历 - Node current = head;//从头节点开始 - for(int i = 0 ; i < index ; i++){ - current = current.next; - } - return (Node)current; - }else{//从尾节点开始遍历 - Node current = tail;//从尾节点开始 - for(int i = 0 ; i < index ; i++){ - current = current.prev; - } - return (Node)current; - } - } - /** - * @Description: 设置某个位置的元素 - * @param index - * @param data - * @return: E - * @author: leijing - * @date: 2017年2月24日 上午11:58:32 - */ - public E set(int index, E data) { - rangeCheck(index); - Node current = head;//从头节点开始 - int i = 0; - while(current != null){ - if(i == index){ - Node node = new Node(data); - Node prev = current.prev; - prev.next = node; - node.prev = prev; - node.next = current; - current.prev = node; - size++; - return data; - } - current = current.next; - i++; - } - return null; - } - /** - * @Description: 判断是否包含某个元素 - * @param o - * @throws Exception - * @return: boolean - * @author: leijing - * @date: 2017年2月24日 上午11:57:35 - */ - public boolean contains(Object o) throws Exception { - if(isEmpty()){ - throw new Exception("链表为空,没有任何元素"); - } - Node current = head;//从头节点开始找 - if(o == null){ - while(current != null){ - if(current.data == null){ - return true; - } - current = current.next; - } - }else{ - while(current != null){ - if(o.equals(current.data)){ - return true; - } - current = current.next; - } - } - return false; - } - /** - * @Description: 清空链表,删除所有元素 - * @return: void - * @author: leijing - * @date: 2017年2月24日 下午4:41:56 - */ - public void clear() { - Node current = head;//从头节点开始遍历 - while(current != null){ - Node tmp = current; - current = current.next; - tmp.prev = null; - tmp.next = null; - } - size = 0; - } - - public Iterator iterator() { - return new ListItr(0); - } - private class ListItr implements Iterator{ - private Node lastReturned = null;//当前的节点 - private Node next;//下一个节点 - private int nextIndex;//当前索引的下标 - - public ListItr(int nextIndex){ - next = (nextIndex == size) ? null : node(nextIndex); - } - - @Override - public boolean hasNext() { - return nextIndex < size; - } - - @Override - public E next() { - if (!hasNext()){ - throw new NoSuchElementException(); - } - - lastReturned = next; - next = next.next; - nextIndex++; - return lastReturned.data; - } - - @Override - public void remove() { - if (lastReturned == null){ - throw new IllegalStateException(); - } - - if(lastReturned == next){//tail node - lastReturned.prev.next = null; - lastReturned.prev = null; - }else{ - lastReturned.prev.next = lastReturned.next; - lastReturned.next.prev = lastReturned.prev; - lastReturned.next = null; - lastReturned.prev = null; - } - nextIndex--; - } - - public boolean hasPrev(){ - return nextIndex > 0; - } - - public E prev(){ - if(!hasPrev()){ - throw new NoSuchElementException(); - } - next = lastReturned = (next == null ) ? tail : next.prev;//如果是头节点,前一个指向尾节点 - nextIndex--; - return lastReturned.data; - } - - } - - static class Node{ - private E data; - private Node prev;//前驱节点 - private Node next;//后继节点 - - public Node(E data){ - this.data = data; - } - - public E getData() { - return data; - } - - public void setData(E data) { - this.data = data; - } - - public Node getPrev() { - return prev; - } - - public void setPrev(Node prev) { - this.prev = prev; - } - - public Node getNext() { - return next; - } - - public void setNext(Node next) { - this.next = next; - } - } -} diff --git a/group07/764189149/src/firstHomeWork/util/Iterator.java b/group07/764189149/src/firstHomeWork/util/Iterator.java deleted file mode 100644 index ecbf3015e0..0000000000 --- a/group07/764189149/src/firstHomeWork/util/Iterator.java +++ /dev/null @@ -1,30 +0,0 @@ -package firstHomeWork.util; - -/** - * @Description: 迭代器 - * @author: leijing - * @date: 2017年2月21日 下午8:49:10 - * @param - */ -public interface Iterator { - /** - * @Description: 返回迭代器中是否有下一个元素 - * @return: boolean - * @author: leijing - * @date: 2017年2月21日 下午8:49:52 - */ - boolean hasNext(); - /** - * @Description: 返回迭代器中的下一个元素 - * @return: E - * @author: leijing - * @date: 2017年2月21日 下午8:50:35 - */ - E next(); - /** - * @Description: 删除迭代器中的当前元素 - * @author: leijing - * @date: 2017年2月21日 下午8:51:07 - */ - void remove(); -} diff --git a/group07/764189149/src/firstHomeWork/util/List.java b/group07/764189149/src/firstHomeWork/util/List.java deleted file mode 100644 index fac6efa0cc..0000000000 --- a/group07/764189149/src/firstHomeWork/util/List.java +++ /dev/null @@ -1,87 +0,0 @@ -package firstHomeWork.util; - -/** - * @Description: 定义一组操作有序列表的接口 - * @author: leijing - * @date: 2017年2月21日 下午8:53:52 - * @param - */ -public interface List { - /** - * @Description: 添加元素 - * @param e - * @return: boolean - * @author: leijing - * @date: 2017年2月21日 下午8:55:32 - */ - boolean add(E e); - /** - * @Description: 删除指定索引的元素 - * @param index - * @return: E - * @author: leijing - * @date: 2017年2月21日 下午8:56:08 - */ - E remove(int index); - /** - * @Description: 删除元素 - * @param o - * @return: boolean - * @author: leijing - * @date: 2017年2月21日 下午8:56:28 - */ - boolean remove(Object o); - /** - * @Description: 返回元素个数 - * @return: int - * @author: leijing - * @date: 2017年2月21日 下午8:57:25 - */ - int size(); - /** - * @Description: 判断集合是否为空 - * @return: boolean - * @author: leijing - * @date: 2017年2月21日 下午8:57:51 - */ - boolean isEmpty(); - /** - * @Description: 获取指定位置的元素 - * @param index - * @return: E - * @author: leijing - * @date: 2017年2月21日 下午8:58:27 - */ - E get(int index); - /** - * @Description: 设置指定位置的元素 - * @param index - * @param e - * @return: E - * @author: leijing - * @date: 2017年2月21日 下午8:58:58 - */ - E set(int index , E e); - /** - * @Description: 判断集合是否包含某个元素 - * @param o - * @return: boolean - * @author: leijing - * @date: 2017年2月21日 下午8:59:32 - */ - boolean contains(Object o); - /** - * @Description: 清空集合 - * @return: void - * @author: leijing - * @date: 2017年2月21日 下午9:00:12 - */ - void clear(); - /** - * @Description: 获取集合的迭代器 - * @return: Iterator - * @author: leijing - * @date: 2017年2月21日 下午9:00:47 - */ - Iterator iterator(); -} diff --git a/group07/764189149/src/firstHomeWork/util/Queue.java b/group07/764189149/src/firstHomeWork/util/Queue.java deleted file mode 100644 index 78185c3ae8..0000000000 --- a/group07/764189149/src/firstHomeWork/util/Queue.java +++ /dev/null @@ -1,59 +0,0 @@ -package firstHomeWork.util; - -/** - * @Description: 循环队列 - * @author: leijing - * @date: 2017年2月24日 下午9:00:30 - * @param - */ -public class Queue { - private Object[] queue; - private int capacity; - private static int INITIAL_CAPACITY = 10; - private int front; //队头 - private int rear; //队尾 - - public Queue(int capacity){ - this.capacity = capacity; - this.front = 0; - this.rear = 0; - queue = new Object[capacity]; - } - public Queue(){ - this(INITIAL_CAPACITY); - } - - public boolean enQueue(E e) throws Exception{ - if(isFull()){ - return false; - } - if(rear == capacity - 1){//循环利用 - rear = 0; - } - queue[rear++] = e; - return true; - } - - public E deQueue(){ - if(isEmpty()){ - return null; - } - if(front == capacity - 1){ - front = 0; - } - - return (E) queue[front++]; - } - - public boolean isEmpty(){ - return front == rear; - } - - public int size(){ - return Math.abs(rear - front) + 1; - } - - public boolean isFull(){ - return (rear + 1) % capacity == front; - } -} diff --git a/group07/764189149/src/firstHomeWork/util/Stack.java b/group07/764189149/src/firstHomeWork/util/Stack.java deleted file mode 100644 index 00dc784170..0000000000 --- a/group07/764189149/src/firstHomeWork/util/Stack.java +++ /dev/null @@ -1,23 +0,0 @@ -package firstHomeWork.util; - -import java.util.Queue; - -public class Stack { - private ArrayList elementData = new ArrayList(); - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git "a/group07/770164810/git\345\221\275\344\273\244.txt" "b/group07/770164810/git\345\221\275\344\273\244.txt" deleted file mode 100644 index 8bcf2ffa0f..0000000000 --- "a/group07/770164810/git\345\221\275\344\273\244.txt" +++ /dev/null @@ -1,11 +0,0 @@ -װgit guigit bash -1.¡ -git clone git@github.com:leijing1992/coding2017.git -2.޸ĵļ -git add -A -3.ύݴ -git commit -m "ύ***" -4.master -git pull origin master -5.ύmaster -git push origin master \ No newline at end of file diff --git a/group07/770164810/test.txt b/group07/770164810/test.txt deleted file mode 100644 index 7c4a013e52..0000000000 --- a/group07/770164810/test.txt +++ /dev/null @@ -1 +0,0 @@ -aaa \ No newline at end of file diff --git a/group07/group07.md b/group07/group07.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group07/group07.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group08/108621969/2-26/com/coding/basic/ArrayList.java b/group08/108621969/2-26/com/coding/basic/ArrayList.java deleted file mode 100644 index a06488acb9..0000000000 --- a/group08/108621969/2-26/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -/** - * Created by zhangjiatao on 2017/2/25. - */ -public class ArrayList implements List { - private int size = 0; - private Object[] elementData = new Object[100]; - - @Override - public void add(Object o) { - if(isFull()) { - elementData = expandArray(elementData); - } - elementData[size++] = o; - } - - @Override - public void add(int index, Object o) { - ifOutOfBounds(index); - if(isFull()) { - elementData = expandArray(elementData); - } - System.arraycopy(elementData,index,elementData,index+1,size++); - elementData[index] = o; - } - - @Override - public Object get(int index) { - ifOutOfBounds(index); - return elementData[index]; - } - - @Override - public Object remove(int index) { - ifOutOfBounds(index); - Object delData = elementData[index]; - System.arraycopy(elementData,index+1,elementData,index,size-index); - size--; - return index; - } - - @Override - public int size() { - return size; - } - - @Override - public String toString() { - String str = ""; - for(int i=0; i<=size-1; i++){ - str += elementData[i] + " "; - } - return str; - } - - private boolean isFull() { - if(size >= elementData.length-1){ - return true; - } - return false; - } - - public boolean isEmpty() { - if(size == 0) { - return true; - } - return false; - } - - private void ifOutOfBounds(int index) { - if(index >= size || index < 0) { - throw new IndexOutOfBoundsException(); - } - } - - private Object[] expandArray(Object[] arr) { - return Arrays.copyOf(arr, arr.length+10); - } - - public Iterator iterator = new ArrayListIterator(this); - - private class ArrayListIterator implements Iterator{ - - private ArrayList arrList; - int position = 0,length; - - private ArrayListIterator(ArrayList arrList){ - this.arrList = arrList; - this.length = arrList.size(); - } - - @Override - public boolean hasNext() { - return position < length; - } - - @Override - public Object next() { - return arrList.get(position++); - } - - } - - public static void main(String[] args) { - ArrayList arr = new ArrayList(); - arr.add(1); - arr.add(2); - arr.add(3); - arr.add(1,4); - arr.remove(2); - System.out.println(arr.toString()); - System.out.println(arr.size()); - System.out.println(arr.iterator.next()); - System.out.println(arr.iterator.next()); - } -} diff --git a/group08/108621969/2-26/com/coding/basic/BinaryTreeNode.java b/group08/108621969/2-26/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index f86efd62f5..0000000000 --- a/group08/108621969/2-26/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.coding.basic; - -/** - * Created by zhangjiatao on 2017/2/25. - */ -public class BinaryTreeNode { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Object o) { - this.data = o; - this.left = null; - this.right = null; - } - - public int getData() { - return (int) data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o) { - BinaryTreeNode newNode = new BinaryTreeNode(o); - insertInto(this, newNode); - return this; - } - - private void insertInto(BinaryTreeNode tree, BinaryTreeNode o) { - if (o.getData() <= tree.getData()) { - if (tree.getLeft() != null) insertInto(tree.getLeft(), o); - else tree.setLeft(o); - } else { - if (tree.getRight() != null) insertInto(tree.getRight(), o); - else tree.setRight(o); - } - } -} diff --git a/group08/108621969/2-26/com/coding/basic/Iterator.java b/group08/108621969/2-26/com/coding/basic/Iterator.java deleted file mode 100644 index ae5e36f464..0000000000 --- a/group08/108621969/2-26/com/coding/basic/Iterator.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -/** - * Created by zhangjiatao on 2017/2/25. - */ -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group08/108621969/2-26/com/coding/basic/LinkedList.java b/group08/108621969/2-26/com/coding/basic/LinkedList.java deleted file mode 100644 index dadf8caeaf..0000000000 --- a/group08/108621969/2-26/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.coding.basic; - -import java.util.Objects; - -/** - * Created by zhangjiatao on 2017/2/25. - */ -public class LinkedList implements List { - private Node head = null,tail = null; - private int size=0; - private LinkedListIterator iterator = null; - - @Override - public void add(Object o) { - Node newNode = new Node(o); - if(tail == null) { - head = tail = newNode; - }else { - tail.next = newNode; - tail = newNode; - } - size++; - } - - @Override - public void add(int index, Object o) { - ifOutOfBounds(index); - Node temp = head,previousNode = head; - Node newNode = new Node(o); - if(index == 0) { - newNode.next = head; - head = newNode; - return ; - } - while(index-- > 0) { - previousNode = temp; - temp = temp.next; - } - previousNode.next = newNode; - newNode.next = temp; - size++; - } - - @Override - public Object get(int index) { - ifOutOfBounds(index); - Node temp = head; - while(index-- > 0) { - temp = temp.next; - } - return temp; - } - - @Override - public Object remove(int index) { - ifOutOfBounds(index); - Node temp = head,previousNode = head; - if(head == tail) { - head = tail = null; - return temp; - } - while(index-- > 0) { - previousNode = temp; - temp = temp.next; - } - if(tail == temp) { - tail = previousNode; - } - previousNode.next = temp.next; - size--; - return temp; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object o) { - add(0,o); - } - - public void addLast(Object o) { - add(o); - } - - public Object removeFirst() { - return remove(0); - } - - public Object removeLast() { - return remove(size()-1); - } - - public LinkedListIterator Iterator() { - if(iterator ==null) { - iterator = new LinkedListIterator(this); - } - return iterator; - } - - private void ifOutOfBounds(int index) { - if(index >= size || index < 0) { - throw new IndexOutOfBoundsException(); - } - } - - private boolean isEmpty() { - return size==0; - } - - public String toString() { - String str = ""; - Node temp = head; - while(temp!=tail) { - str = str + temp.data + " "; - temp = temp.next; - } - return str + tail.data; - } - - private static class Node { - Object data; - Node next; - public Node(Object o) { - this.data = o; - this.next = null; - } - } - - private class LinkedListIterator implements Iterator { - private LinkedList linkedList = null; - private Node currentNode = null; - - public LinkedListIterator(LinkedList linkedList) { - this.linkedList = linkedList; - this.currentNode = this.linkedList.head; - } - - @Override - public boolean hasNext() { - if(linkedList.isEmpty()) return false; - return currentNode.next != null; - } - - @Override - public Object next() { - Object data = currentNode.data; - if(hasNext()) { - currentNode = currentNode.next; - } - return data; - } - } - - public static void main(String[] args) { - LinkedList arr = new LinkedList(); - arr.add(1); - arr.add(2); - arr.add(3); - arr.add(5); - arr.add(1,4); - arr.remove(2); - arr.removeLast(); - arr.addFirst(5); - System.out.println(arr.toString()); - System.out.println(arr.size()); - System.out.println(arr.Iterator().hasNext()); - System.out.println(arr.Iterator().next()); - System.out.println(arr.Iterator().next()); - System.out.println(arr.Iterator().next()); - System.out.println(arr.Iterator().next()); - } -} diff --git a/group08/108621969/2-26/com/coding/basic/List.java b/group08/108621969/2-26/com/coding/basic/List.java deleted file mode 100644 index 30a4b4e7cb..0000000000 --- a/group08/108621969/2-26/com/coding/basic/List.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.coding.basic; - -/** - * Created by zhangjiatao on 2017/2/25. - */ -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group08/108621969/2-26/com/coding/basic/Queue.java b/group08/108621969/2-26/com/coding/basic/Queue.java deleted file mode 100644 index fd087cbd9b..0000000000 --- a/group08/108621969/2-26/com/coding/basic/Queue.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.coding.basic; - -/** - * Created by zhangjiatao on 2017/2/25. - */ -public class Queue { - private ArrayList elementData = new ArrayList(); - - public void enQueue(Object o) { - elementData.add(0, o); - } - - public Object deQueue() { - return elementData.remove(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.isEmpty(); - } - - public int size() { - return elementData.size(); - } - - public static void main(String[] args) { - Queue queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - System.out.println(queue.deQueue()); - System.out.println(queue.toString()); - } -} diff --git a/group08/108621969/2-26/com/coding/basic/Stack.java b/group08/108621969/2-26/com/coding/basic/Stack.java deleted file mode 100644 index d600d86fe5..0000000000 --- a/group08/108621969/2-26/com/coding/basic/Stack.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coding.basic; - -import java.util.ArrayList; - - -/** - * Created by zhangjiatao on 2017/2/25. - */ -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(elementData.size(), o); - } - - public Object pop() { - return elementData.remove(elementData.size() - 1); - } - - public Object peek() { - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.isEmpty(); - } - - public int size() { - return elementData.size(); - } - - public static void main(String[] args) { - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - System.out.println(stack.pop()); - System.out.println(stack.toString()); - } -} diff --git a/group08/108621969/README.md b/group08/108621969/README.md deleted file mode 100644 index 413f53e93a..0000000000 --- a/group08/108621969/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# About Me -1. 姓名: 张加涛 -2. 性别: 男 -3. 状态: 实习 -4. 年龄: 22 -5. 职业: web前端 -6. 坐标: 上海浦东 diff --git a/group08/108621969/article/Comp-Units-Relations(2-16).md b/group08/108621969/article/Comp-Units-Relations(2-16).md deleted file mode 100644 index b3fdcbb61b..0000000000 --- a/group08/108621969/article/Comp-Units-Relations(2-16).md +++ /dev/null @@ -1,14 +0,0 @@ -# CPU -由寄存器、运算器、控制器组成 -还有一级缓存、二级缓存等 -# 内存 -我们所说的内存都是系统内存,是SDRAM,动态随机存储器 -速度快容量小 -# 硬盘 -容量大速度慢 -# 指令 -程序在计算机中被分解为一条条的指令 -# 关系 -程序文件在硬盘中,当调用时,从硬盘载入内存, -控制器从内存中读取程序的第一条指令,指令通知运算器读取内存中的数据的地址, -运算器结合寄存器计算出结果,读取下一条指令,直到指令结束。 diff --git a/group08/1144989424/Readme.md b/group08/1144989424/Readme.md deleted file mode 100644 index 3a515bb88b..0000000000 --- a/group08/1144989424/Readme.md +++ /dev/null @@ -1,3 +0,0 @@ -### 目录说明 - -个人目录,他人勿动 diff --git a/group08/1144989424/firstPractice/readme.md b/group08/1144989424/firstPractice/readme.md deleted file mode 100644 index ac4feb57b8..0000000000 --- a/group08/1144989424/firstPractice/readme.md +++ /dev/null @@ -1,4 +0,0 @@ -### 第一次作业: -1. 实现ArrayList, LinkedList, Queue, Stack -2. 有余力的同学可以实现 BinaryTree 和Iterator -3. 写一篇文章,建议: 描述CPU,内存, 硬盘,指令之间的关系。 \ No newline at end of file diff --git a/group08/1144989424/firstPractice/src/basic/BinaryTreeNode.java b/group08/1144989424/firstPractice/src/basic/BinaryTreeNode.java deleted file mode 100644 index 6300e92259..0000000000 --- a/group08/1144989424/firstPractice/src/basic/BinaryTreeNode.java +++ /dev/null @@ -1,49 +0,0 @@ -package basic; - -/** - * 二叉树的数据结构 - * @author Wayss - * 2017-02-25 - */ - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(){ - - } - - public BinaryTreeNode(Integer val){ - data = val; - left = null; - right = null; - } - - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group08/1144989424/firstPractice/src/basic/MyArrayList.java b/group08/1144989424/firstPractice/src/basic/MyArrayList.java deleted file mode 100644 index f9cf5b1b80..0000000000 --- a/group08/1144989424/firstPractice/src/basic/MyArrayList.java +++ /dev/null @@ -1,97 +0,0 @@ -package basic; - -/** - * 我的ArrayList实现 - * @author Wayss - * 2017-02-22 - */ - -public class MyArrayList implements MyList { - - private int size = 0; - - private Object[] elementData = new Object[10]; - - /** - * 往集合中添加一个元素 - */ - public void add(Object o){ - int length = elementData.length; - //1.比较元素个数和数组大小,判断是否需要扩大数组 - if(size == length){ - expandArray(); - } - //2.直接赋值给size,即最后一个元素 - elementData[size] = o; - size++; - } - - /** - * 往集合指定位置添加一个元素,该位置和其之后的元素向后移动一位。 - * 位置不合法时,抛出异常。 - */ - public void add(int index, Object o){ - int length = elementData.length; - //0.先对index的值进行判断,小于0,或者,大于size,越界 - if(index < 0 || index > size){ - throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); - } - //1.比较元素个数和数组大小,判断是否需要扩大数组 - if(size == length){ - expandArray(); - } - //2.移动index之后的数组元素 - for(int i = size; i > index; i--){ - elementData[i] = elementData[i-1]; - } - elementData[index] = o; - size++; - } - - public Object get(int index){ - int length = elementData.length; - //0.先对index的值进行判断,小于0,或者,大于等于size,便越界 - if(index < 0 || index >= size){ - throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); - } - //2.拿出index位置的值, - Object o = elementData[index]; - - return o; - } - - public Object remove(int index){ - //remove 前两步的逻辑和get方法相同 - int length = elementData.length; - //0.先对index的值进行判断,小于0,或者,大于等于size,便越界 - if(index < 0 || index >= size){ - throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); - } - //2.拿出index位置的值, - Object o = elementData[index]; - - //3.删除index位置的值,之后的值,向前移动。 - for(int i = index; i < size-1; i++){ - elementData[i] = elementData[i+1]; - } - size--; - return null; - } - - public int size(){ - return size; - } - - public MyIterator iterator(){ - return null; - } - - private void expandArray(){ - int length = elementData.length; - Object [] newArr = new Object[length * 2]; - for(int i = 0; i < length; i++){ - newArr[i] = elementData[i]; - } - elementData = newArr; - } -} diff --git a/group08/1144989424/firstPractice/src/basic/MyIterator.java b/group08/1144989424/firstPractice/src/basic/MyIterator.java deleted file mode 100644 index 2aa1de62c4..0000000000 --- a/group08/1144989424/firstPractice/src/basic/MyIterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package basic; - -public interface MyIterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group08/1144989424/firstPractice/src/basic/MyLinkedList.java b/group08/1144989424/firstPractice/src/basic/MyLinkedList.java deleted file mode 100644 index 3894884373..0000000000 --- a/group08/1144989424/firstPractice/src/basic/MyLinkedList.java +++ /dev/null @@ -1,113 +0,0 @@ -package basic; - -/** - * 实现LinkedList基本功能 - * @author Wayss - * 2017-02-23 - */ - -public class MyLinkedList implements MyList { - - private Node head; - private int size = 0; - - public void add(Object o){ - Node n = new Node(o); - head.next = n; - size++; - } - public void add(int index , Object o){ - //1.index校验 - if(index < 0 || index > size){ - throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); - } - //2. 查找index位置的前一个节点 - //tempNode为当前链表的第一个节点 - Node tempNode = head.next; - for(int i = 0; i < index - 1 ; i++){ - tempNode = tempNode.next; - } - Node behindNode = tempNode.next; - Node insertNode = new Node(o); - tempNode.next = insertNode; - insertNode.next = behindNode; - size++; - } - public Object get(int index){ - //1.index校验 - if(index < 0 || index > size){ - throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); - } - //2. 查找当前节点 - Node tempNode = head.next; - for(int i = 0; i < index; i++){ - tempNode = tempNode.next; - } - return tempNode.data; - } - public Object remove(int index){ - //1.index校验 - if(index < 0 || index > size){ - throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); - } - //2. 查找当前节点的上一个节点 - Node tempNode = head.next; - for(int i = 0; i < index - 1; i++){ - tempNode = tempNode.next; - } - Node deleteNode = tempNode.next; - Node behideNode = tempNode.next.next; - tempNode.next = behideNode; - size--; - return deleteNode.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node insertNode = new Node(o); - insertNode.next = head.next; - head.next = insertNode; - size++; - } - public void addLast(Object o){ - Node insertNode = new Node(o); - Node tempNode = head.next; - for(int i = 0; i < size; i++){ - tempNode = tempNode.next; - } - tempNode.next = insertNode; - size++; - } - public Object removeFirst(){ - Node firstNode = head.next; - head = firstNode.next; - size--; - return firstNode; - } - public Object removeLast(){ - Node tempNode = head.next; - //1.移除需要找到最后一个点的前一个点 - for(int i = 0; i < size - 1; i++){ - tempNode = tempNode.next; - } - Node deleteNode = tempNode.next; - tempNode.next = null; - size--; - return deleteNode; - } - public MyIterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - public Node(Object data){ - this.data = data; - } - } -} diff --git a/group08/1144989424/firstPractice/src/basic/MyList.java b/group08/1144989424/firstPractice/src/basic/MyList.java deleted file mode 100644 index c017431b22..0000000000 --- a/group08/1144989424/firstPractice/src/basic/MyList.java +++ /dev/null @@ -1,9 +0,0 @@ -package basic; - -public interface MyList { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group08/1144989424/firstPractice/src/basic/MyQueue.java b/group08/1144989424/firstPractice/src/basic/MyQueue.java deleted file mode 100644 index 31fab53105..0000000000 --- a/group08/1144989424/firstPractice/src/basic/MyQueue.java +++ /dev/null @@ -1,31 +0,0 @@ -package basic; - -/** - * 实现队列 - * @author Wayss - * 2017-02-25 - */ - -public class MyQueue { - - MyLinkedList linkList = new MyLinkedList(); - - public void enQueue(Object o){ - linkList.addLast(o); - } - - public Object deQueue(){ - return linkList.removeFirst(); - } - - public boolean isEmpty(){ - if(linkList.size() == 0){ - return true; - } - return false; - } - - public int size(){ - return linkList.size(); - } -} diff --git a/group08/1144989424/firstPractice/src/basic/MySortBinaryTree.java b/group08/1144989424/firstPractice/src/basic/MySortBinaryTree.java deleted file mode 100644 index a4579217e5..0000000000 --- a/group08/1144989424/firstPractice/src/basic/MySortBinaryTree.java +++ /dev/null @@ -1,81 +0,0 @@ -package basic; - -import java.util.Comparator; - -/** - * 实现二叉排序树,使左节点的值,始终父节点小,右节点的值,始终比父节点大 - * @author Wayss - * 2017-02-25 - */ - -public class MySortBinaryTree { - - public BinaryTreeNode root = new BinaryTreeNode(); - - /** - * 1. 添加时,先判断与root节点值的大小 - * 2. insert的值小于root的值,则插入到root的左边。 - * 3. insert的值大于root的值,则插入到root的右边。 - * PS:目前只支持Integer类型的对象插入 - * @param val - */ - public void add(Integer val){ - BinaryTreeNode treeNode = new BinaryTreeNode(val); - insert(root, treeNode); - } - - private void insert(BinaryTreeNode node, BinaryTreeNode insertNode){ - - int result = compare((Integer)insertNode.getData(),(Integer)node.getData()); - - if(0 == result){ - //相等的话,当重复数据,不插了.呵呵 - } - //insert的值小于root的值,则插入到root的左边。 - //如果左节点有值,则递归 - if(-1 == result){ - if(node.getLeft() != null){ - insert(node.getLeft(), insertNode); - }else{ - node.setLeft(insertNode); - } - } - //insert的值大于root的值,则插入到root的右边。 - if(1 == result){ - if(node.getRight() != null){ - insert(node.getRight(), insertNode); - }else{ - node.setRight(insertNode); - } - } - } - - public MyArrayList getValue(){ - MyArrayList malist = new MyArrayList(); - getTreeValue(root,malist); - return malist; - } - - private void getTreeValue(BinaryTreeNode node,MyArrayList list){ - //遍历左子数 - if(node.getLeft() != null){ - getTreeValue(node.getLeft(),list); - } - list.add(node.getData()); - //遍历右子数 - if(node.getRight() != null){ - getTreeValue(node.getRight(),list); - } - } - - public static int compare(Integer i1, Integer i2){ - if(i1 < i2){ - return -1; - }else if(i1 == i2){ - return 0; - }else { - return 1; - } - } - -} diff --git a/group08/1144989424/firstPractice/src/basic/MyStack.java b/group08/1144989424/firstPractice/src/basic/MyStack.java deleted file mode 100644 index c8e8e0d2fd..0000000000 --- a/group08/1144989424/firstPractice/src/basic/MyStack.java +++ /dev/null @@ -1,33 +0,0 @@ -package basic; - -/** - * 栈实现 - * @author Wayss - * 2017-02-25 - */ - -public class MyStack { - private MyArrayList arrList = new MyArrayList(); - - public void push(Object o){ - arrList.add(o); - } - - public Object pop(){ - //elementData.size()-1是当前数组的最后一个元素的下标 - return arrList.remove(arrList.size() - 1); - } - - public Object peek(){ - return arrList.get(arrList.size() - 1); - } - public boolean isEmpty(){ - if(arrList.size() == 0){ - return true; - } - return false; - } - public int size(){ - return arrList.size(); - } -} diff --git "a/group08/121027265/0226/cpu_\345\206\205\345\255\230_\347\241\254\347\233\230_\346\214\207\344\273\244\344\271\213\351\227\264\345\205\263\347\263\273.md" "b/group08/121027265/0226/cpu_\345\206\205\345\255\230_\347\241\254\347\233\230_\346\214\207\344\273\244\344\271\213\351\227\264\345\205\263\347\263\273.md" deleted file mode 100644 index b0d1b7c0cf..0000000000 --- "a/group08/121027265/0226/cpu_\345\206\205\345\255\230_\347\241\254\347\233\230_\346\214\207\344\273\244\344\271\213\351\227\264\345\205\263\347\263\273.md" +++ /dev/null @@ -1,8 +0,0 @@ -## cpu 内存 硬盘 指令之间的关系 -> 计算机整体分为软件和硬件。 -> 软件是由指令和数据组成的程序,硬件包含主板、CPU、内存、硬盘等 - - -指令指的是计算机可以识别的机器语言,每个操作系统都有内置的指令集,计算机可根据不同的指令来驱动计算机工作或是相应的输出。指令是以二进制的形式存储在硬盘中,当CPU执行某个指令的时候,需要将指令先从硬盘加载到内存,CPU从内存中获取执行解释执行。 - -CPU是计算的核心部件,相当于人类的大脑。CPU执行指令的时候其实不关心也不知道指令的意思,只是按照指令执行。由于硬盘读写性能比较差,CPU从硬盘中直接读取数据的时候比较费时,就有的内存的存在。内存比硬盘读写速度快很多,CPU要执行程序时,先将程序加载到内存中在执行。 \ No newline at end of file diff --git a/group08/121027265/0226/src/com/my/list/ArrayList.java b/group08/121027265/0226/src/com/my/list/ArrayList.java deleted file mode 100644 index b9ca5a31d9..0000000000 --- a/group08/121027265/0226/src/com/my/list/ArrayList.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.my.list; - -/** - * 实现ArrayList - * - */ -public class ArrayList { - //初始化容量 - private static final int INIT = 5; - //增长因子 - private static final double GROWTH = 0.5; - - //初始化数组 - Object[] baseArr = new Object[INIT]; - //当前下标 - int currentIndex = 0; - //最大下标 - int maxIndex = INIT-1; - - /** - * 添加元素 - * @param obj - * @return - */ - public Object add(Object obj){ - if(judgeCapacity()){ - baseArr = arrayDilatation(baseArr, GROWTH); - maxIndex = baseArr.length-1; - } - baseArr[currentIndex] = obj; - ++currentIndex; - return obj; - } - - /** - * 指定下标添加元素 - * @param index - * @param obj - * @return - */ - public Object add(int index , Object obj){ - if (index < 0 || index > currentIndex) { - throw new IndexOutOfBoundsException(); - } - Object[] dest = new Object[currentIndex+1]; - System.arraycopy(baseArr, 0, dest, 0, index); - dest[index] = obj; - System.arraycopy(baseArr, index, dest, index+1, currentIndex-index); - ++currentIndex; - baseArr = dest; - return obj; - } - - /** - * 指定下标删除元素 - * @param index - * @return - */ - public Object remove(int index){ - if (index < 0 || index >= currentIndex) { - throw new IndexOutOfBoundsException(); - } - Object object = baseArr[index]; - Object[] dest = new Object[currentIndex]; - System.arraycopy(baseArr, 0, dest, 0, index); - System.arraycopy(baseArr, index+1, dest, index, currentIndex-index-1); - --currentIndex; - baseArr = dest; - return object; - } - - /** - * 根据下标获取元素 - * @param index - * @return - */ - public Object get(int index){ - - return baseArr[index]; - } - - /** - * 获取集合大小 - * @return - */ - public int size(){ - return currentIndex; - } - - /** - * 判断容量是否需要增加 - * @return - */ - public boolean judgeCapacity(){ - if(currentIndex > maxIndex){ - return true; - } - return false; - } - - /** - * 数组扩容 - * @param objArr - * @param groth - * @return - */ - public static Object[] arrayDilatation(Object[] objArr , double groth){ - int length = objArr.length; - int newLength = (int) (length * groth + length); - Object[] baseArr = new Object[newLength]; - System.arraycopy(objArr, 0, baseArr, 0, length); - return baseArr; - } - - -} - - - - - - - - - - - - - - - diff --git a/group08/121027265/0226/src/com/my/list/LinkedList.java b/group08/121027265/0226/src/com/my/list/LinkedList.java deleted file mode 100644 index 19b0655287..0000000000 --- a/group08/121027265/0226/src/com/my/list/LinkedList.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.my.list; - -/** - * 实现 LinkedList - * - */ -public class LinkedList { - - //首节点 - Node first = new Node(); - //集合大小 - int size = 0; - - /** - * 添加元素 - * @param object - * @return - */ - public Object add(Object object){ - if (size == 0) { - first.setObject(object); - }else{ - Node previous = first; - Node temp = first.getNext(); - while (temp != null) { - previous = temp; - temp = temp.getNext(); - } - Node node = new Node(); - node.setObject(object); - previous.setNext(node); - } - ++size; - return object; - } - - /** - * 根据下标添加元素 - * @param index - * @param object - * @return - */ - public Object add(int index , Object object){ - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - - if (size == 0) { - first.setObject(object); - }else{ - if (index == 0) { - Node temp = new Node(); - temp.setObject(object); - temp.setNext(first); - first = temp; - }else{ - int count = 1; - Node temp = first; - while (temp != null) { - if (count++ == index) { - Node next = temp.getNext(); - Node node = new Node(); - temp.setNext(node); - node.setObject(object); - node.setNext(next); - break; - } - temp = temp.getNext(); - } - } - } - ++size; - return object; - } - - /** - * 根据下标删除元素 - * @param index - * @return - */ - public Object remove(int index){ - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - Node node = null; - if (index == 0) { - Node next = first.getNext(); - first = next; - node = first; - }else{ - int count = 1; - Node temp = first; - while (temp != null) { - if (count++ == index) { - node = temp.getNext(); - Node next = node.getNext(); - temp.setNext(next); - break; - } - temp = temp.getNext(); - } - } - --size; - return node.getObject(); - } - - /** - * 根据下标获取元素 - * @param index - * @return - */ - public Object get(int index) { - Node temp = first; - int count = 0; - while (temp != null) { - if (count++ == index) { - break; - } - temp = temp.getNext(); - } - return temp.getObject(); - } - - /** - * 获取集合大小 - * @return - */ - public int size() { - return size; - } - - -} - - -/** - * 节点元素 - * - */ -class Node{ - private Object object ; - private Node next; - public Object getObject() { - return object; - } - public void setObject(Object object) { - this.object = object; - } - public Node getNext() { - return next; - } - public void setNext(Node next) { - this.next = next; - } - -} diff --git a/group08/121027265/0226/src/com/my/list/Test.java b/group08/121027265/0226/src/com/my/list/Test.java deleted file mode 100644 index 36b43e20dc..0000000000 --- a/group08/121027265/0226/src/com/my/list/Test.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.my.list; - -public class Test { - - public static void main(String[] args) { - - testArrayList(); - System.out.println("--------------------------------"); - testLinkedList(); - } - - /** - * ArrayList 测试 - */ - public static void testArrayList(){ - System.out.println("ArrayList 测试 --开始"); - ArrayList list = new ArrayList(); - list.add("123"); - list.add("123"); - list.add("123"); - list.add("123"); - list.add("123"); - list.add("123"); - - list.add(1, 111); - - list.remove(1); - - System.out.println(list.baseArr.length); - System.out.println(list.size()); - - for (int i = 0; i < list.size(); i++) { - Object object = list.get(i); - System.out.println(object); - } - System.out.println("ArrayList 测试 --结束"); - } - - /** - * LinkedList 测试 - */ - public static void testLinkedList(){ - System.out.println("LinkedList 测试 --开始"); - LinkedList list = new LinkedList(); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - list.add(6); - - list.add(1, 111); - - list.remove(1); - - System.out.println(list.size()); - - for (int i = 0; i < list.size(); i++) { - Object object = list.get(i); - System.out.println(object); - } - System.out.println("LinkedList 测试 --结束"); - } - -} diff --git a/group08/121027265/README.md b/group08/121027265/README.md deleted file mode 100644 index 488916d101..0000000000 --- a/group08/121027265/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# 是标题 -* aaa -* bbb diff --git a/group08/1226637491/2_26/ArrayList.java b/group08/1226637491/2_26/ArrayList.java deleted file mode 100644 index 1d4aaf7bc4..0000000000 --- a/group08/1226637491/2_26/ArrayList.java +++ /dev/null @@ -1,95 +0,0 @@ -interface MyIterator{ - public boolean hasNext(); - public Object next(); - -} - - -public class ArrayList { -/* public static void main(String[] d){ - ArrayList p = new ArrayList(); - p.add("asd");p.add("123");p.add("123");p.add("234");p.add("456"); - p.remove(1); - p.add(1, 345); - MyIterator it = p.iterator(); - while(it.hasNext()){ - System.out.println(it.next().toString()); - } - } -*/ - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - if(size >= elementData.length){//鳤 - Object[] tem = new Object[elementData.length*2]; - for(int i=0;i= elementData.length){ - Object[] tem = new Object[elementData.length*2]; - for(int i=0;i=size){ - throw new IndexOutOfBoundsException(); - } - for(int i = index; i < size; i++){ - elementData[i-1] = elementData[i]; - } - size--; - return elementData[index]; - } - - public int size(){ - return size; - - } - - - class MMIt implements MyIterator{ - int loc = 0; - - public boolean hasNext() { - if(loc>=size) - return false; - else - return true; - } - - - public Object next() { - ++loc; - return elementData[loc-1]; - } - - } - - - public MyIterator iterator(){ - return new MMIt(); - } - -} \ No newline at end of file diff --git a/group08/1226637491/2_26/LinkedList.java b/group08/1226637491/2_26/LinkedList.java deleted file mode 100644 index 4534272573..0000000000 --- a/group08/1226637491/2_26/LinkedList.java +++ /dev/null @@ -1,127 +0,0 @@ - - -public class LinkedList { - - private Node head = new Node(); - private int size = 0; - - public void add(Object o){ - Node tem = new Node(); - tem.data = o; - tem.next = null; - Node temp = head; - int i = 0; - while(isize+1) - throw new IndexOutOfBoundsException(); - Node tem = new Node(); - tem.data = o; - tem.next = null; - ++size; - Node temp = head; - int i = 0; - while(isize+1) - throw new IndexOutOfBoundsException(); - --size; - Node temp = head; - int i = 0; - while(iindex; i++) { - elementData[i] = elementData[i - 1]; - } - elementData[index] = o; - } - - public Object get(int index){ - return elementData[index]; - } - - public Object removeLast() { - return elementData[size--]; - } - - public Object remove(int index){ - Object temp = elementData[index]; - for (int i = index; i < size - 1; i++) { - elementData[i] = elementData[i + 1]; - } - size -= 1; - return temp; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new myIterator(this); - } - -} diff --git a/group08/125980622/first_hw/BinaryTreeNode.java b/group08/125980622/first_hw/BinaryTreeNode.java deleted file mode 100644 index 0de773afd1..0000000000 --- a/group08/125980622/first_hw/BinaryTreeNode.java +++ /dev/null @@ -1,52 +0,0 @@ -import com.sun.xml.internal.bind.v2.runtime.AttributeAccessor; - -public class BinaryTreeNode { - - private int data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public int getData() { - return data; - } - public void setData(int data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(int o){ - BinaryTreeNode returnNode = null; - if (data < o) { - if (right == null) { - right = new BinaryTreeNode(o, null, null); - returnNode = right; - } else { - returnNode = right.insert(o); - } - } else if (data > o) { - if (left == null) { - returnNode = left = new BinaryTreeNode(o, null, null); - } else { - returnNode = left.insert(o); - } - } - return returnNode; - } - - BinaryTreeNode (int initData, BinaryTreeNode initLeft, BinaryTreeNode initRight) { - data = initData; - left = initLeft; - right = initRight; - } -} diff --git a/group08/125980622/first_hw/Iterator.java b/group08/125980622/first_hw/Iterator.java deleted file mode 100644 index 57b7ad9d11..0000000000 --- a/group08/125980622/first_hw/Iterator.java +++ /dev/null @@ -1,4 +0,0 @@ -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group08/125980622/first_hw/LinkedList.java b/group08/125980622/first_hw/LinkedList.java deleted file mode 100644 index f5477064bb..0000000000 --- a/group08/125980622/first_hw/LinkedList.java +++ /dev/null @@ -1,90 +0,0 @@ -public class LinkedList implements List { - - private Node head; - private int size = 0; - - public void add(Object o){ - if (head == null) { - head = new Node(o); - } else { - Node pointer = head.next; - while (pointer.next != null) { - pointer = pointer.next; - } - pointer.next = new Node(o); - } - size++; - } - public void add(int index , Object o){ - Node pointer = head; - for (int i = 0; i < index - 1; i++) { - pointer = pointer.next; - } - Node nNode = new Node(o, pointer.next); - pointer.next = nNode; - size++; - } - public Object get(int index){ - Node pointer = head; - for (int i= 0; i < index; i++) { - pointer = pointer.next; - } - return pointer; - } - public Object remove(int index){ - Node pointer = head; - for (int i = 0; i < index - 1; i++) { - pointer = pointer.next; - } - Node temp = pointer.next; - pointer.next = temp.next; - size--; - return temp; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - head = new Node(o, head); - } - public void addLast(Object o){ - Node pointer = head; - while (pointer.next != null) { - pointer = pointer.next; - } - pointer.next = new Node(o); - } - public Object removeFirst(){ - Node temp = head; - head = head.next; - return temp; - } - public Object removeLast(){ - Node pointer = head; - while (pointer.next.next != null) { - pointer = pointer.next; - } - Node temp = pointer.next; - pointer.next = null; - return temp; - } - public myIterator iterator(){ - return new myIterator(this); - } - - - private static class Node{ - Object data; - Node next; - Node (Object o, Node n) { - data = o; - next = n; - } - Node (Object o) { - data = o; - next = null; - } - } -} diff --git a/group08/125980622/first_hw/List.java b/group08/125980622/first_hw/List.java deleted file mode 100644 index 4f7bcc71a8..0000000000 --- a/group08/125980622/first_hw/List.java +++ /dev/null @@ -1,7 +0,0 @@ -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group08/125980622/first_hw/Queue.java b/group08/125980622/first_hw/Queue.java deleted file mode 100644 index f176f2a256..0000000000 --- a/group08/125980622/first_hw/Queue.java +++ /dev/null @@ -1,21 +0,0 @@ - -public class Queue { - - LinkedList queueList = new LinkedList(); - - public void enQueue(Object o){ - queueList.addLast(o); - } - - public Object deQueue(){ - return queueList.removeFirst(); - } - - public boolean isEmpty(){ - return queueList.size() <= 0; - } - - public int size(){ - return queueList.size(); - } -} diff --git a/group08/125980622/first_hw/Stack.java b/group08/125980622/first_hw/Stack.java deleted file mode 100644 index e3c15480b8..0000000000 --- a/group08/125980622/first_hw/Stack.java +++ /dev/null @@ -1,24 +0,0 @@ -public class Stack { - private ArrayList elementData = new ArrayList(); - - private int size = 0; - - public void push(Object o){ - elementData.add(o); - size++; - } - - public Object pop(){ - return elementData.remove(size); - } - - public Object peek(){ - return elementData.get(size); - } - public boolean isEmpty(){ - return size <= 0; - } - public int size(){ - return size; - } -} diff --git a/group08/125980622/first_hw/myIterator.java b/group08/125980622/first_hw/myIterator.java deleted file mode 100644 index 0a2f9bb13d..0000000000 --- a/group08/125980622/first_hw/myIterator.java +++ /dev/null @@ -1,37 +0,0 @@ -import java.util.Objects; - -/** - * Created by Yusen Meng on 25/02/2017. - */ -public class myIterator implements Iterator { - int index = 0; - ArrayList _array = null; - LinkedList _list = null; - myIterator (LinkedList theList) { - _list = theList; - } - myIterator (ArrayList theArray) { - _array = theArray; - } - public boolean hasNext() { - boolean result; - if (_array != null) { - result = index < _array.size(); - } else { - result = index < _list.size(); - } - return result; - } - - public Object next() { - Object returnValue; - if (_array != null) { - returnValue = _array.get(index); - index++; - } else { - returnValue = _list.get(index); - index++; - } - return returnValue; - } -} diff --git a/group08/1277959541/1277959541 b/group08/1277959541/1277959541 deleted file mode 100644 index 8b13789179..0000000000 --- a/group08/1277959541/1277959541 +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group08/1287324781/1287324781 b/group08/1287324781/1287324781 deleted file mode 100644 index 8b13789179..0000000000 --- a/group08/1287324781/1287324781 +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group08/1425809544/02-26/com/xuyangyang/util/BinaryTree.java b/group08/1425809544/02-26/com/xuyangyang/util/BinaryTree.java deleted file mode 100644 index 2e566de023..0000000000 --- a/group08/1425809544/02-26/com/xuyangyang/util/BinaryTree.java +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Created by 呢喃 on 2017/2/26. - */ -public class BinaryTree { - - - private Node root; - - private static class Node { - Node left; - Node right; - int data; - - Node(int newData){ - left = null; - right = null; - data = newData; - } - } - - public BinaryTree(){ - root = null; - } - - -public void insert(int data){ - root = insert( root,data); -} - -private Node insert(Node node,int data){ - - if (node == null){ - node = new Node(data); - } - else { - if (data<= node.data){ - node.left = insert(node.left,data); - }else { - node.right = insert(node.right,data); - } - } - return node; -} - - public void bulidTree(int[] data){ - for (int i= 0;i index; i--) { - elementData[i] = elementData[i - 1]; - } - elementData[2] = o; - size++; - - } - - @Override - public Object get(int index) { - - if (index < 0 || index >= size()) { - throw new ArrayIndexOutOfBoundsException(); - } - - return elementData[index]; - - } - - @Override - public Object remove(int index) { - - if (index < 0 || index >= size()) { - throw new ArrayIndexOutOfBoundsException(); - } - Object value = elementData[index]; - for (int i = index; i < size() - 1; i++) { - elementData[i] = elementData[i + 1]; - } - return value; - - } - - @Override - public int size() { - // TODO Auto-generated method stub - return size; - } - - /** - * - * - * @Author xuyangyang - * @Describe - * @date 2017220 - * @param newCapacity - */ - public void ensureCapacity(int newCapacity) { - if (newCapacity < size) { - return; - } - Object[] old = elementData;// - - elementData = new Object[newCapacity];// µ - - for (int i = 0; i < old.length; i++) { - elementData[i] = old[i]; - } - - } - - private class InnerIterator implements MyIterator { - - private int current = 0; - - public boolean hasNext() { - return current < size(); - } - - @Override - public Object next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - return elementData[current++]; - } - - public void remove() { - MyArrayList.this.remove(--current); - } - - } - -} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyIterator.java b/group08/1425809544/02-26/com/xuyangyang/util/MyIterator.java deleted file mode 100644 index 1b83f8988d..0000000000 --- a/group08/1425809544/02-26/com/xuyangyang/util/MyIterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com; - -public interface MyIterator { - - public boolean hasNext(); - public Object next(); - -} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyLinkedList.java b/group08/1425809544/02-26/com/xuyangyang/util/MyLinkedList.java deleted file mode 100644 index 3d84ecd268..0000000000 --- a/group08/1425809544/02-26/com/xuyangyang/util/MyLinkedList.java +++ /dev/null @@ -1,277 +0,0 @@ -package com; - -import java.util.NoSuchElementException; - -public class MyLinkedList implements MyList { - - int size = 0; - Node first; - Node last; - - private static class Node { - Object item; - Node next;// ָһڵ - Node prev;// ָһڵ - - Node(Node prev, Object element, Node next) { - this.item = element; - this.next = next; - this.prev = prev; - } - } - - public boolean add(Object o) { - linkLast(o); - return true; - - } - - /** - * Ԫزָ± - * - * @Author xuyangyang - * @Describe - * @date 2017221 - * @param index - * @param o - */ - public void add(int index, Object o) { - checkPositionIndex(index); - if (index == size) { - linkLast(0); - } else { - LinkBefore(o, node(index)); - } - - } - - public void addFirst(Object o) { - linkFirst(o); - } - - public void addLast(Object o) { - linkLast(o); - } - - private void linkFirst(Object o) { - final Node f = first; - final Node newNode = new Node(null, o, f); - first = newNode; - if (first == null) { - first = newNode; - } else { - f.prev = newNode; - } - size++; - - } - - void LinkBefore(Object o, Node succ) { - final Node pred = succ.prev; - final Node newNode = new Node(pred, o, succ);// Ȱ½ڵǰָ븳ֵ - succ.prev = newNode;// Ѳĺһڵǰָָ½ڵ - if (pred == null) { - first = newNode;// ڵǰָΪ,Ϊͷָ - } else { - pred.next = newNode;// ǰһڵĺָָ½ڵ; - } - size++; - } - - /** - * ָ뷵ؽڵϢ - * - * @Author xuyangyang - * @Describe - * @date 2017221 - * @param index - * @return - */ - Node node(int index) { - - if (index < (size >> 1)) {// ڵǰ벿, - Node x = first;// ͷָx; - for (int i = 0; i < index; i++) - // ǰ벿ֽڵ, - x = x.next;// Ѱindexǰһڵ,nextָ - return x; - } else { - Node x = last; - for (int i = size - 1; i > index; i--) - x = x.prev; - return x; - } - } - - /** - * - * - * @Author xuyangyang - * @Describe - * @date 2017221 - * @param o - */ - private void linkLast(Object o) { - final Node l = last; - final Node newNode = new Node(l, o, null); - last = newNode; - if (last == null) { - first = newNode; - } else { - l.next = newNode; - } - size++; - - } - - public Object get(int index) { - checkElementIndex(index); - return node(index).item; - - } - - /** - * ԪǼ - * - * @Author xuyangyang - * @Describe - * @date 2017221 - * @param index - */ - private void checkElementIndex(int index) { - if (index >= 0 && index < size) { - - } else { - throw new IndexOutOfBoundsException(); - } - - } - - /** - * Ԫʱָ - * - * @Author xuyangyang - * @Describe - * @date 2017221 - * @param index - */ - private void checkPositionIndex(int index) { - if (index >= 0 && index <= size) - throw new IndexOutOfBoundsException(); - } - - public boolean reomve(Object o) { - - if (o == null) { - for (Node x = first; x != null; x = x.next) { - if (x.item == null) { - unlink(x); - return true; - } - } - - } else { - for (Node x = first; x != null; x = x.next) { - if (o.equals(x.item)) { - unlink(x); - return true; - } - } - - } - - return false; - - } - - @Override - public Object remove(int index) { - checkElementIndex(index); - return unlink(node(index)); - - } - - private Object unlink(Node x) { - - final Object element = x.item; - final Node next = x.next; - final Node prev = x.prev; - - if (prev == null) { - first = next; - } else { - prev.next = next; - x.prev = null; - } - - if (next == null) { - last = prev; - } else { - next.prev = prev; - x.next = null; - } - - x.item = null; - size--; - return element; - - } - - public Object removeFirst() { - - final Node f = first; - if (f == null) { - throw new NoSuchElementException(); - } - - return unlinkFirst(f); - - } - - private Object unlinkFirst(Node f) { - - final Object element = f.item; - final Node next = f.next; - f.item = null; - f.next = null; - first = next; - if (next == null) { - last = null; - } else { - next.prev = null; - } - size--; - - return element; - } - - public Object removeLast() { - Node l = last; - if (l == null) { - throw new NoSuchElementException(); - } - return unLinkLast(l); - } - - private Object unLinkLast(Node l) { - final Object element = l.item; - final Node prev = l.prev; - last = prev; - l.item = null; - l.prev = null; - if (prev == null) { - first = null; - } else { - prev.next = null; - } - size--; - - return element; - } - - public int size() { - - return size; - } - -} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyList.java b/group08/1425809544/02-26/com/xuyangyang/util/MyList.java deleted file mode 100644 index 8a2c653c8b..0000000000 --- a/group08/1425809544/02-26/com/xuyangyang/util/MyList.java +++ /dev/null @@ -1,14 +0,0 @@ -package com; - -public interface MyList { - - public boolean add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public int size(); - - public Object remove(int index); -} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyQueueArray.java b/group08/1425809544/02-26/com/xuyangyang/util/MyQueueArray.java deleted file mode 100644 index 248edbce26..0000000000 --- a/group08/1425809544/02-26/com/xuyangyang/util/MyQueueArray.java +++ /dev/null @@ -1,107 +0,0 @@ -package com; - -import java.util.Arrays; - -/** - * ʵֶ - * - * @Author xuyangyang - * @Describe - * @date 2017223 - */ -public class MyQueueArray { - - private int size;// С - private int head;// ͷ - private Object[] elementData;// Ŷе - private int initCapacity = 10;// ʼ - - /** - * ʼ10 - * - * @Author xuyangyang - * @Describe - * @date 2017223 - */ - public MyQueueArray() { - elementData = new Object[initCapacity]; - } - - /** - * ȡдС - * - * @Author xuyangyang - * @Describe - * @date 2017223 - * @return - */ - public int size() { - return size; - } - - /** - * - * - * @Author xuyangyang - * @Describe - * @date 2017223 - * @param o - */ - public void enQueue(Object o) { - if (size + 1 > elementData.length) { - int oldLength = elementData.length; - int newLength = oldLength + oldLength >> 1; - elementData = Arrays.copyOf(elementData, newLength); - } - elementData[size++] = o; - } - - /** - * - * - * @Author xuyangyang - * @Describe - * @date 2017223 - * @return - */ - public Object deQueue() { - if (size == 0) { - throw new NullPointerException(); - } - Object obj = elementData[head]; - elementData[head] = 0; - head++; - size--; - return obj; - } - - /** - * - * - * @Author xuyangyang - * @Describe - * @date 2017223 - * @param args - */ - public static void main(String[] args) { - MyQueueArray myQueue = new MyQueueArray(); - MyQueueLinked myQueueLinked = new MyQueueLinked(); - myQueue.enQueue("1"); - myQueue.enQueue("2"); - myQueue.enQueue("3"); - myQueue.enQueue("4"); - myQueue.enQueue("5"); - myQueue.enQueue("6"); - System.out.println(myQueue.size); - - System.out.println(myQueue.deQueue()); - System.out.println(myQueue.size); - - System.out.println(myQueue.deQueue()); - System.out.println(myQueue.size); - - System.out.println(myQueue.size); - - } - -} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyQueueLinked.java b/group08/1425809544/02-26/com/xuyangyang/util/MyQueueLinked.java deleted file mode 100644 index 5b4f443975..0000000000 --- a/group08/1425809544/02-26/com/xuyangyang/util/MyQueueLinked.java +++ /dev/null @@ -1,139 +0,0 @@ -package com; - -/** - * ʵֶ--- - * - * @Author xuyangyang - * @Describe - * @date 2017223 - */ -public class MyQueueLinked { - - private Node head; - - private Node tail; - // еij - private int size; - - /** - * ضеij - * - * @Author xuyangyang - * @Describe - * @date 2017223 - * @return - */ - public int size() { - return size; - } - - /** - * - * - * @Author xuyangyang - * @Describe - * @date 2017223 - */ - public void enQueue(Object obj) { - - // Ϊ - if (head == null) { - head = new Node(obj, null); - tail = head; - size++; - } else { - Node oldNode = tail; - Node newNode = new Node(obj, null); - tail.next = newNode; - tail = newNode; - size++; - } - - } - - /** - * - * - * @Author xuyangyang - * @Describe - * @date 2017223 - * @return - */ - public Object deQueue() { - - if (head == null) { - throw new NullPointerException(); - } - Object oldNode = head.element; - head = head.next; - size--; - return oldNode; - } - - /** - * ȡɾ - * - * @Author xuyangyang - * @Describe - * @date 2017223 - * @return - */ - public Object peek() { - if (head == null) { - throw new NullPointerException(); - } - return head.element; - } - - /** - * ڵ - * - * @Author xuyangyang - * @Describe - * @date 2017223 - */ - private class Node { - private Object element; - private Node next; - - public Node() { - - } - - public Node(Object element, Node next) { - this.element = element; - this.next = next; - } - - } - - /** - * - * - * @Author xuyangyang - * @Describe - * @date 2017223 - * @param args - */ - public static void main(String[] args) { - MyQueueLinked myQueueLinked = new MyQueueLinked(); - myQueueLinked.enQueue("1"); - myQueueLinked.enQueue("2"); - myQueueLinked.enQueue("3"); - myQueueLinked.enQueue("4"); - myQueueLinked.enQueue("5"); - myQueueLinked.enQueue("6"); - System.out.println(myQueueLinked.size); - - System.out.println(myQueueLinked.deQueue()); - System.out.println(myQueueLinked.size); - - System.out.println(myQueueLinked.deQueue()); - System.out.println(myQueueLinked.size); - - System.out.println(myQueueLinked.peek()); - System.out.println(myQueueLinked.size); - - } - -} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyStack.java b/group08/1425809544/02-26/com/xuyangyang/util/MyStack.java deleted file mode 100644 index 9c0a9a6149..0000000000 --- a/group08/1425809544/02-26/com/xuyangyang/util/MyStack.java +++ /dev/null @@ -1,95 +0,0 @@ -package com; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.EmptyStackException; - -public class MyStack { - - private ArrayList elementDataArrayList = new ArrayList<>(); - - private Object[] elementData; - private int elementCount; - private int size; - - public MyStack() { - this.elementData = new Object[10]; - - } - - public Object push(Object o) { - addElement(o); - return o; - - } - - public void addElement(Object o) { - ensureCapacity(elementCount + 1); - elementData[elementCount++] = o; - } - - private void ensureCapacity(int minCapacity) { - if (minCapacity - elementData.length > 0) { - grow(minCapacity); - } - - } - - private void grow(int minCapacity) { - int oldCapacity = elementData.length; - int newCapacity = oldCapacity + (oldCapacity >> 1); - if (newCapacity - minCapacity < 0) { - newCapacity = minCapacity; - } - elementData = Arrays.copyOf(elementData, newCapacity); - - } - - public synchronized Object pop() { - Object o; - int len = size(); - o = peek(); - removeElement(len - 1); - - return o; - - } - - private void removeElement(int index) { - - if (index >= elementCount) { - throw new ArrayIndexOutOfBoundsException(); - } else if (index < 0) { - throw new ArrayIndexOutOfBoundsException(); - } - int j = elementCount - index - 1; - if (j > 0) { - System.arraycopy(elementData, index + 1, elementData, index, j); - } - elementCount--; - elementData[elementCount] = null; - } - - private Object peek() { - - int len = size(); - if (len == 0) { - throw new EmptyStackException(); - } - return elementAt(len - 1); - - } - - private Object elementAt(int index) { - if (index > +elementCount) { - throw new ArrayIndexOutOfBoundsException(); - } - return elementData[index]; - } - - private int size() { - // TODO Auto-generated method stub - return elementCount; - } - -} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/Test.java b/group08/1425809544/02-26/com/xuyangyang/util/Test.java deleted file mode 100644 index 0fc81acb8e..0000000000 --- a/group08/1425809544/02-26/com/xuyangyang/util/Test.java +++ /dev/null @@ -1,29 +0,0 @@ -package com; - -import java.util.ArrayList; - -public class Test { - - public static void main(String[] args) { - - ArrayList items = new ArrayList<>(); - items.add("1"); - items.add("2"); - items.add("3"); - items.add("4"); - items.add("5"); - items.add("6"); - items.add("7"); - items.add("8"); - items.add("9"); - items.add("10"); - items.add("11"); - items.add("12"); - - - - - - } - -} diff --git "a/group08/1425809544/02-26/cpu \345\206\205\345\255\230 \347\241\254\347\233\230 \345\222\214\346\214\207\344\273\244\347\232\204\345\205\263\347\263\273.txt" "b/group08/1425809544/02-26/cpu \345\206\205\345\255\230 \347\241\254\347\233\230 \345\222\214\346\214\207\344\273\244\347\232\204\345\205\263\347\263\273.txt" deleted file mode 100644 index 036bb225b0..0000000000 --- "a/group08/1425809544/02-26/cpu \345\206\205\345\255\230 \347\241\254\347\233\230 \345\222\214\346\214\207\344\273\244\347\232\204\345\205\263\347\263\273.txt" +++ /dev/null @@ -1,16 +0,0 @@ - - -CPU 相当于大脑,是由PC(程序计数器),运算器,控制器,寄存器三大部分组成; - 1.cpu从内存读取指令,有pc指定位置,放入指令寄存器; - 2,根据读取到的指令,由运算器执行加减命令, - - 1.程序在cpu,内存和硬盘运行的速度依次递减,由快到慢,同样的他们价格成本由高到底;存储容量也是由大到小; - - 2,cpu和内存中的数据断电后就会消失,硬盘不会消失,所以要把需要长期使用的程序放在硬盘中,程序是由指令组成的, - 当开机后,先加载需要的数据从硬盘中读取放到内存中,有cpu从内存中读取指令,要执行的指令和执行后的结果放入cpu的 - 寄存器中;就相当于原料进机器之前排队一样,把半成品也要在这里放一下,再进去加工,它只是一个临时中转站(寄存器); - - 3.CPU从内存中取出指令,放入指令寄存器,并对指令译码操作控制器,操作指令,指令在cpu中暂存在寄存器中; - 但是,cpu不能直接操作硬盘,所以需要内存,要把硬盘中的数据先加载到内存;内存相当于中转站,内存的速度决定电脑程序运行的速度; - - 有的网络文章形象比喻:“CPU是工厂,硬盘是大仓库,内存是正规中转中心 \ No newline at end of file diff --git "a/group08/1425809544/02-26/\346\226\207\347\253\240\351\223\276\346\216\245-java\351\233\206\345\220\210 \345\256\271\345\231\250 \347\256\200\345\215\225\346\246\202\350\277\260" "b/group08/1425809544/02-26/\346\226\207\347\253\240\351\223\276\346\216\245-java\351\233\206\345\220\210 \345\256\271\345\231\250 \347\256\200\345\215\225\346\246\202\350\277\260" deleted file mode 100644 index ff19095823..0000000000 --- "a/group08/1425809544/02-26/\346\226\207\347\253\240\351\223\276\346\216\245-java\351\233\206\345\220\210 \345\256\271\345\231\250 \347\256\200\345\215\225\346\246\202\350\277\260" +++ /dev/null @@ -1 +0,0 @@ -http://m.blog.csdn.net/article/details?id=56674070 diff --git a/group08/1425809544/1425809544.md b/group08/1425809544/1425809544.md deleted file mode 100644 index 61de0edff4..0000000000 --- a/group08/1425809544/1425809544.md +++ /dev/null @@ -1 +0,0 @@ -测试 \ No newline at end of file diff --git a/group08/1509102580/2.27/ArrayList.java b/group08/1509102580/2.27/ArrayList.java deleted file mode 100644 index 02af2fc04e..0000000000 --- a/group08/1509102580/2.27/ArrayList.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.zzk.coding2017.zuoye_1; - - -public class ArrayList implements List { - - private int size = 0; - private int length = 100; - private Object[] elementData = new Object[length]; - - public void add(Object o){ - if(sizesize-1){ - return ; - }else{ - if(sizesize-1){ - return null; - }else{ - return elementData[index]; - } - } - - public Object remove(int index){ - if(index<0||index>size-1){ - return null; - }else{ - Object result = elementData[index]; - if(index+1==size){//即index是最后一个元素 - elementData[index] = null; - size--; - return result; - }else{ - System.arraycopy(elementData, index+1, elementData, index, size-1-index); - size--; - return result; - } - } - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new Iterator() { - int current = 0; - @Override - public Object next() { - // TODO Auto-generated method stub - if(current - - - - - diff --git a/group08/283677872/2-26/.gitignore b/group08/283677872/2-26/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group08/283677872/2-26/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group08/283677872/2-26/.project b/group08/283677872/2-26/.project deleted file mode 100644 index 643ca1eaa2..0000000000 --- a/group08/283677872/2-26/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2-26 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git "a/group08/283677872/2-26/CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\345\205\263\347\263\273.docx" "b/group08/283677872/2-26/CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\345\205\263\347\263\273.docx" deleted file mode 100644 index c5a97b818945a2e47c96589f6259cd2196ae1c83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 865923 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

F0=U`5qCHNq524k<`|PTH~Aj90JTz`8no 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 z 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 z

>I$jz=Fr8Vp7rLq2d+?&@+Z2oN@9&3p$X!w02@TM%clNuBI0T|A3IwE^b)^ePK z5%my6)6&=!)ab}=DaBW5`A6=S)^EyuH2+Ngl@m?ujmLd}RS{*KW`QG1;(H|UyMCne z@g-nu{jxjQRhc>KKS1+NQsqnAYS4^GshNYBn7a@t;pCrjyE!|>&U&~q@WL?&**0MI z9>nqtjg#LZluD4WXY!k@7iL{{fj}KZyCj*!RQ@6xz7tb@$2`z)Pfm#($J0n6# zy@3D&IKuMv#VC^UtE?v4XkyXh3h~mZc>*;3dg0d{{rJt0LZS?L2QT#z569U}4BC!g z%*p6R>0$}Ld&o(a{TqE+NNvex*j<9GVcen}=o#O&q1_g|LZnYX|TuN}FbnOLGWV&Ls#O%v&Ndi5W zDT11ZMv z6Ea-*0&#fl^pLEOJ(fd|;tela&PHh|_+is4la>U{Q^@D4#cZ<}LQO4-TzRK<_{Y*# zBgIOpsbnw6KSuve$ZDPN&(V$AiJ~MuNL}O_j1Wa8+pq;*yRLqEA*sOTUaU50Re>Dt z?k5%nIKE@$nqn#s!Vv~XE(5lGI=&mM-PIpV8LUcJ+ZzRZ=adl*W}>t#@;5TUsDrgV z(68~+K6N>}LoEf^?A_ydgSN+bc7uuH+(Khy3lXb9(FM6v(l%~MAH<-tPgymtT7h%@&Uu5E=45{Hx)UM-&TZJ z#$T?}R#UJ=x&8Zs_P7IlE>gXlWm5EcUQu1av`;F3#QdV@M`9n^duOWzjrz_A z^Y1!GyY==i;i#CXy7b)ys2A_qQQAN=haD0ZAOd>)84uia4NUleTt- zDldw9?AomM`Ko9Dy9Ji57soM*_$hXgB8^2w$kT&9(Kx7u$q1kk9LE#nHkwq_-{pRc z&2H6Sl*FP@7b0ESfX(~P#uToofxtnWLj2c8R=s)?qYjoThX*-^Noa@di-OnP;eXxZ zx?zXM%Ho{iG>;eur3Vut6a0`R@`mdI2#jUzK%r0az3mK6IEo8#2_Ri3sC4qc6c$?=BjoIdF)%d`2Dp#j6m30?X`aUNx-EIVALyrM1p{fNz&Z^74dM|3 z=T5=EOG{GAE7ouFd}cAxj)-ag=XnF!bm!? zL^N&U0AijxW{DcYLb?P!e6jfCQs)6LBcwKp^U}D+j~z{cSHLmbGM*mc44@T)|Gw`6 zNxD-@d@Wnc*ABQJp4%|{L&y7jKW~p@YZyG!U-LiEdmCaodwQXuc4<%J#c^XB=~_J! zOC>CLuI~^rUYedg?!A}A?F5X1GdO8JG;-WWka>k(kJ9;N-htt?6(*Rh)4c$!=flUZ zo1iY5jDIc(zTG#F@}DkmkK{4YmoJ3+0N1W~j7| zI4?;@pwK0Hi-Qk;Yw^4>8)}*^`SpYl>;ni5I@8sc7S71g^*gVv)!bFs3}s5PvAxUj zJrLod8cOuQv+_LyX~4fgW&y}Q{_TU?QRtwzr5#}cEBa>an`XJKmX!nTUEeC6AK2(f zJ7K}pcRO7Cd1=e|J>2yb`2!&=yV=Sqe=XL>WzoHH3lPY!BevnfKd^br9Y5i zh7tb#i=A>|xd4{LXRw31ynnKI5Bxvg8c@4>q9F+^**A%`md4gaa2hJXb5J^(Vl8GL z0NNA?DLY|ZB3zR={{ousV^yVmFi5~Z^YLpuGSjDCG{m_VbeviA&?Ijp7$PwH0o#K4 z&bX=j0Kqm6t~~^e7N@5HQt9v}%)&TB{jCTF121w~SlSvc#Y|SExiSN$T`J##1*$lH z8tIG-*cDn_<#r1zXth3xdM+@GEaZVS1~@Wahl#wc#m`ZM&fV9&znjap)f!`$MJ`34 znfcpL{5o&Jj)Mj80{AKdmOjSleqVWPhXRik9bvc*ScS;GI&zZlBEodUK0y?I2pArx zdx(3O`$X!L<4-1gv~BI*A&i;?_9HOk1}Y&Sd9=uI|IjLB9TumwP`pz)(do*K{2 z=kGkyoP~yoV=sYSNC+|PHv9AKZqbXZ$QW4szU5hZ1H|UoK|HH-am@khS2#a3eo4;f z83>37ec*s(p$UP=EYvxvUpYg@%`-y;Njw*r_znr+#n)5YdtBI+xXPQF zfApNf2OkVv9#0&L``slpGnbnk@v|dFIsoVdw?QSix1wFCp^Oh8gvFBpz=a0M=8eA_ z>wbUNZS&Q8%V{F@9+9P+j55OB_b%7AXh^F}s+p8-7k~vwT;O^Ju@MACaS~sV8K$YK zBVg#@tvGi1Lo-7Q+zvN?0g;VnKJP=|Zo%+O${^!;B7yVHlaM%GGB&_#Q#OSknEtuX zmKsPXUc|-qRHO0Q83cPK{gP}Gsh=39KEAGmAZ&)$!Z7f*+LZHBdVypjunGI>7#EQU zX4r@6IZe3xB4hM;)wN4<+zJ?)&OnBhPh<;lYJsTA_$Tn8{eapu*W=l=qa6H718kZr z!L5)SBIIB=%<{&>ULoV<}GnaLCMKk%Y_vhUVW>8Ox;jH4H*EKV|yO8W= zi4`%W76U7`)lD;6cG_+>yTrlZ=@Gw`$$bEg;w(dLXMSvzB6e+PUsm9Qc#--Sr)^0` z%j3y0s%|3GE3P~~IL~pT$d>z)awKvb#qmv4Q>miHRi*$X`>%m49o{ecZ+QZh1cfr+ z$42P^WSkyU*$jr_g?1i_<4C!7k2~-J9ciA+Hu&Svcnnp!9hgs-B!E~xr4D*G*t>oa zYC!dY>Mt8I=0W;pw^wtobw=ImODU@f9cpi3D2H&;Sz) z2>~3ppJeWZ)s21!{7}~O`1y@PUtj{0(i@wOax%3nXUw8oo&U#Z_SvFwto~uk4}Ibk zW|7i$x(F35l&IiJhYWTWv!gy3Pd02ia}FITH9QkDgBrOLgTsDmC{1d#@GQc4;b;!Q}zS|qNCoJ{mfyuLyP z>y5@*NnCD{7bFP#fS5pv2w9{p!j#gQhs`c~)` z$VL)2OR+$U#1~d6EPkme4dL7|w%MTlQ5aONgX7E;dGSom20^~87SARxg%OaQ_D8xA z%a7!S(^d8dc8TL@@hBMiXmm9=n5RNwHEt^m3Ba>&J8AcHof1#QO5Tq

0sTD@yAzh49u#zC757TvW?QEsVl^; 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

>#HDk@5q!b;RdRG~tzlW6f9#%m)uV2IjS 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

814Us)!IB+1;1(ncNor zxtqmde8it@EqD~zKXcq#a-%yN>4Z6j5v!PI32S_dPR~vOafoC{GQO>53P*sb!ry|a z1TGgUY0>PV;TtS%pleadYni?ABf_m8UL#o`hs0Jf+;H9CPy3e5VYQz;NZR3`rXxgW z)fO62qL=i1_mZBN={5c0b9_#lk6Nxseh;jXqwXbCHwnjy8{XabdbxK{2MB95h3?X2 z7K=p^A;mPY9K77uGxy1l>2+pnSM|f|O-~S&fWodbzKuJ}%bC&e1k%KvDoW?677 z-!|{WM~?hhEM(-eptj879UU!*{cV_|B>iBNkKr}sjoC67S|H&-(!jf2;7X*4LpJlI z^D9%|5dJ|v`ID9=4l1V^5{Kz~BfU=9BnCNQEvFCJO^U0)&^dx)BJA^vdK1Z_DV~Q7 zu4T2s&U31yEl#sCdWjC%ng+e?kCZxDD8fJz__UfJ!z1^`%IBSz2_(tWZg|Id2WTwF zo-4XC(5K&ljmYH(Q*O4oH{HcVkZ92dOu;giK|m0AB1X7J<>S(NStW8h>PQj;4bSx# zZEC&OiVP|`E`2mPe0WSE9}LejZ85jLV2e&_lklRw#f@baVT^H9Fl0w}R<0!^CJadG z3+FFwv#{lQNvMg4^2{!*F_uv1<6)^azZ50gzP4tdWN#-ZjE#mYt1QsUj&<4)`c&Tw za!Bb69pC++5YK#bF-VTX%GVchJrxyw&814;9P2mPsSwS;$c=sBl?s*6T8e7nN|9Ek z<4BWjNSGw(Gm%2&2=)gH7xT$y!@M=D9VUgq5A1Jpy6Ye2oZzXN^(I3;T zep$k@1=L}sB#k9XJe2}57;z8mad2m~X1fgY4;I!!z)BAqjWJRz4!kg3W80FA z@l#Hnb2ukM9U0R-^rsxS8S0r_Mf|2tj!!J%>b`bVkjujnxnSY^oDO6qeyQ#P#8I&i z*Fb5uFF@uUZSn&g{L4?%OFfmftDP8f#O?Y-_7Rbr3$pibhfhcFTr3$XqQ2-V_W{qk zi%5qCVfN4=mN>Tv&SV@K?tLjiVR@;qyaDly1RvI~x2m}#EaR5iczlG}Wwt893 zd&mpAzOcZ0TaZpE8*AC{jx8z)BWZ40>FVu_u6K)ky_zDem?jGw2uv*j>4Lh%-Aq69;vBPl{Tp;LSki(cfm#0`5; zioCa$9W4iBP*QA|GDeF=<3TH=9tx$`z#+6EixI+C^hA36taTmwHP+tU`wHtLsv%fE z&wXfJ|D~?62XQL(&=7{aCOA4oQ23RTyqf}DAlh(BdJ-YEG4H#3DO)J0I;TqG@oIEi zn)D|{2I)fx z?RA~7p+&CECS^;7UX5awd@4@}HweF+o5%7jcxq|e851;~GaMkN5S_AB`4rw4B=jKE zojzyMAu_41Oiy5U+mw6D@w{DN0>y-4pXs|z7n%t9CI{`F7(CHFG>J~FUPrbuS@mP! z5t;;ro%37mQdygiDsPn;f*(1k*t|FF`9|Ol*)a{&_tU)K7E$X1*TZNYl zkQZC!PdWUg-_N4(6&s^v-+g3TLWH`)gm}Do*?N}0*1c3CQ?`5(YB%440-w`pQ1*KS zPtC@C=T`kKNAF9jUek_kEU115W$FRbSgu3~1LRrZ2&V$mJsX6WZ|WIKT7q`j`c)sn zYmG$Lsw~$UF+0YF;h-vkqhz|bDGkZ0UwGuWsrlX}p@VYr#3z-Ww~omv6S!d<)8Cy+ z@7C}`!kjIrL@a|^&hW=w5zx)Js3T4i=w1L=< zTN$2pY{b(mgjl<>3h)Ol%I#|#l2lm?P6rID)4iD=EI*y`(~wu7H^v49;?$T5+_YY- zgyE5VAHflPE%=a6$O5RY`kF{}89Gl}AtCzuk-L}=LX2CgQ{6r-YdGTmP)lRVAQuCq$g1_x7hi-J!Qtmd;AFliAzFmTqA3ft^;rPHP30HtDqp^v)JR$; zg5rsk8jS3C8Y!6GD%;nILO`L4l!kQvZ1tZlZ@1(gFlgl8r%2Ggu9Yah_hM4ehat}< zm@Se1UELvFr3YqKTq14CG%LH7z%)+7omo7;kqf>S0sDO`t){?3e)*5&}fXqnFk_2sjQ+1{A6n{7OWcWJ0Yfmn+)_KXl z#=QQ#DZ}kvDk8oC-n^dAKXau;$(`^wCd=Sc24}|}cA9l9Qi;SJnX@<`#3RWKHdRCc zRgiW;w6fj1sh%s%k~~Aq<__0S<5tbi_Yh;+bC%tYFHLHs@W)o9qajeDjfQ#3`mCiD z<9x#mg6w;5?C`)3eIiJu1nKp^m+Qw92iIUhuvqr%`zPd_XW2RLt}>`2mm*4?`K@OP z)2m-%;X`HV>-einV%dcmTI^GnafJ;chsR!IVeZ$1oiQ!m)i5eZTDs&B1y-Zs#|?qO z9MV9~UiJ0RI>h(+VW-OXO>Gk3*(Z&WAQ?c=iK~TaZx?3DK9!U-RG->KWlvgU+2yo1 zHC||b8QydG_OJoQHDb`{{D=$Ok>GW#h71ot@x1vm;6(0>4NWFj2qUN^hVW2|(CF2c z!VH|g&$f2WB;pFN*G+_2vieocV6Cd#;V=L|&q$7mYlNI#$0IG_ah&Vk7FsyFRL8U! z%x!re(&2|p0+b$ZcNC)jqZS)cdhlEqkY}7X({ov+6-Z~wkRvpF(eoE95PAiBt@%~M zLVuemRR2sK*yzX9<0Z#zLgkte5JldY$^!hMDs8-1h1^RHOndf=@%8Q4pCUOG`^Ci+ zCiYBlHX8|+ECcvEgPa)5vqL~0HSGw+^I5aB3Y>XTR`R?zQW4X-BclnX6uIt`F|iBJ zMt~e=rU8pQPn8MUQ?%ae^&wL(H1w1m86!cVByIQv2I_gdvIq?FYV%00bjFU1C^g=m zsDOr35fo>GQzO5ZP37X&i#|y}W@SgQ9d}+vWCJ*DO+`;PY)UsLD{n_bknTTyP{pfe~+)rBYbDqvnKdL5y zj%>e7hfm|hlzF`pz8wHW~!6I;4L&+ z!ssDkgW-LjmVn~{IU6;&Ys8;KR}PE$K#7{HjdO0O%TBIQos&|?Vk>tdf`Y|?!5Vfe z(-LCdMxvM_G5iP^(8;R{0i0<4+ zX7lu+@%qwFpk{p{LN|k#D$L@@C>6#;8SH?^VZnoM&K98KBJ?gIkC6C7S_{Q#x@O_E z^GRk>XDP1Jdo!g7vHXLfxau9!c|&C7{SC{ zZ@9kRz{Lp(75N5z4;HOnVzo~4A*JcLmLr)`#h}jqtNV?~I6EEi7m6jtK0;6t&?6hr zws;t5OZwW1zArEjBg|edHyU%7c)=g6VW46ro;N~U7E&bHn{#9lh0JyKRXLTU)_`Dm zJ6B%c6^#P)6_Q+8N`1N*Jh#Zb9t~}2PzF-RN@2ge`Shw*CWH#J6TY&c$PMLQL5?Sk zuSjDu*(tH!XUt#*r^=`0QEW|LuFnz4j_%IxKBZobib{KZ9hSqk^Tkq}*t3Vn;2z=V zWg?r+jhA05Cv@))TA+PxL8>_Pw#-7)$dFv=L#ySv(qUSNjCXoHrm7Dkzfk1v^~95h z&q8xu)>+|qrkMVIWNT@Mwb+b;kMV#`SmvRwmc4@<+w+r?L|Sz0!Q&_E>w-eqZ0r3)=)3D8FK5w3%ohv}=aTmLDtFN% zgaydw+fU5y6sZE>YmQs*urjCdUh$PuNmONRmU9abu9d15%tq($Lch_BikLnls93%s z7FR>ZgHbwW;dS95OCpQuuhSL|i8rmaMFaTT5I`jb0HUxE?!k6iw0B6;25j+6ZTyAY zfmA{WIz5N?r$dd3tA@T^-)11L6sW4x7UY^HAg>_{_ZiZe*2NHVFz^hfBNFfr%%sc; z#mPjbyJy*pzBKU5fD+wpF`Z)fIp*8t^+olKYtmCQaOGg=dufdpl@OH)KRC+K?0~@2 zcm-Y#iiVX`&dhaTBU|%QH;^)DsNXB|?8lRzdvs4!c)z0fGd?n>u&WZ?Y&`+x*OFA# z-kRkCkXb>1c|SY^4N~L!C(|+J>Q-<6;S4p+9@)2zm z1B&;Rx*jV3;tbay)dzDv;r5|)^HvJBnO;7XgCCDCO^kF5Az*jTG|R_LrV^Y-ULTM^=DX(2*tB<2M7HeY;U)Z zyj1L%N0BYY20UGzog#C>(o2M0;Y)v92ilB1l~svhar!*aVQ%sI^|!Mm!5xS>tCaF6 zpa>6dQJ>0+G75?H^OaQsd7zb!X3Kj^Znot*V!;p}^G-R< zC9Ys&tZY{H4st=y^#z}{wP*C`C~>h((#11x;!xCd$YJNa%&Pn|o_2%ZvtYZQvQAE` z2Wp>{6B>?VZ~$dn%EDjq(&Q#ltCYY645bi0mJMIyvNYz$25*a7@g2PboEjf>uN!};sUPbXK<^p{E zhV^d*h-!g)Z^qt}i3JZTT;JP<5=MVA)CMTTiAV`$3+uy|-tx0Zkmbws=Bbi$aw01NHvFs|xUyxm(XZwu<9FGMTe zwDgJn%=?rgQ?{3R2HGGuK{3(@Uy4jWxA>TD{5=BwoFuM<^)k`tu8etZ1$CA;Ub z;F`l}L0pa}A~|QR`^!r5ZAFdiq>=`(q`&+4)#kV4U|9{VH7e`)4H&)0yN++}Uo+Dh z_9MPxyc*nnN}w%<9xF>!-SUA~^lJpehw>oW^AGc0m}7Q&DdD&AjC{{biPP^MNw1`$ ztXg=!fZd>A#3c$L?#zpK)TxGX^jkELbr_>(3Cr()CX=q7a$Kz6e0k;^UB018x!9cN zZ3BB8oSUR`t!PJPTW`R8i5TD_?R7Y*5Kk=B!xKIDwKI5d_=saZd(!x$De{2tQcbJ3 zSh4D-`(l!J@8T1%RIY}HENp*jOZlLVGwD(wZ#3-uh#TY1% zd&)Gp5~@Q%o(Itsm0VU21HoEaRA;_i&leFcMm27_SVLdXcn3b|XTbJ;Z#V^RU3I8I z5r}frH_`eYw1MHyjl4^#pnqwO0l>(X<9FRo62|y4j|jr7$`SZ5A$mE87&|xb(vv$dviAacjMq zbx@K;f@<1tCE)F5u-_GUa-la-`{l!-fMq2Euz$~#$GhA>V0Cdx`5SAF-=1LLxaEm! zZ)#R%Ow#Zc({p9%=Tsg~xUD=|<`2A4a?s;Cl|#y>-19pO7x?8C_|?MvdV?~`q!$fJ zU}K$JK4xeah@WWcV_Ksdw1bt$@xN(238P^a8`s?NpHTY7B}Nj9NnmF&nyPo>LEf=} zefGgw0{ivGh}AdcuIKL}-e%gCKet5=MYX`~$iY94WvrjOdLI|*swS>@JR0u$9j3lt zO1!6&LSnW(q2KAj&9*P-eOyKn<+fE^A41+?+Q7Y#*(=aoK=CxU9P`ZmJOkQ+T$Fv%GBb&As1ty_yT{nQ~R2g%~!{<#O6v z5?0KNiPh(lvGy?!&HA(4N6k@-NK1R*>6x~9z(CW(VYJuj6!feD_t!$CC~{MDr+ zq9kC+3ybU;WuvJ!Ya!pALc90DRt5P@750E3#=Ql%2bR_C(MQ|#C}ZG5J`%d2S_fHe zSHcE-n(6o(w(D5o_p3U}e3U%uHIxBqlqggMLhk?Tcm--yF@eA%R@Qx6Jp`J#9s>kAp|yy z3pD+)whVwQ)AGGTE0#NVSr?S<58E#cjK+iFP-QWt^9olvAL~Ae{A3_>FV2%ZP9n2p zw5RametHym>bm4B72UuXISoRE0V)WLw;BKo0`BbhT8A+Sb4TvEuB5*2a-h;2mlval|Ls$0`FRBwy@+eslv4ZMU z4#3ZR?4Nu&L=g(!M(L{r!;hrw^#F*5DG-24EK7CJ&cglYxt;$oAEpSEPE?IiAEP4* z1>>lrkH9f7Gt{9{R#Ki?@s4m<;%1o@v;v<$}MS! z!eeNJHyCESVX4&Tp-<)=C9h24tC6p>Rm)dbSHu@I2col>(1WQ^ZojH8S*Sg>Caxk{ zy}1tOo+vxbQm1Z-d0wET6Yzv>`U`Kyi>WRxjaAPYYGwU#Z`eL8)y%d;p(en6Sj)lb zJx{9M@JENa8v6>$!)`|Jt^6ue%L+_BgM1u4c3W4go&#sfO7&0kw;wfa@VyOc7fi0$M{{iMYUe|6Up!~;FP6d70g8mW|e=Izs!ta(|g z=PdEHo^Nr$RD5cwQ8TYrkB;&w*(*EzcTf>P;W5mQ!K!}y2G3pBsk$>; zpCZR_@H~h>Uxiu9nslR8TxC(v9}iYJ=AU`*x;|>XQ4H@TA0jqTt%Di7;hpsK@^d&G zn-KO6q-smVZzv&6D8A4@reo3wwHO_>`;xVgv2x$;;S8?@@I?#iR|MYcIBnP+MAbQ? zors>ORy!^jzNWeQGe|A$8=VGC+;NJk@ofyLZ>8AMFSZe)iSQbCtIlgD+;POy|j|cm6gG-?lh8Va5 z+uct>{J2o#jPE)f9ra2sqVK9{Pf72yzg*+jN);W5D499;NS+rtv9f7vZpywuBgpL{ zEoaj&5n)v*5Crmi)e`h5th&{(Kxq`?iJ_k?JBJoAPKBY&hpz{WH0T2hL-Urg5|1r~ zF-X83R>$9)lYIYLShh8p^+0$*M-c%4TmTw^wVRc?r<=PMr-i%wkMSpM5fFi;002MZ z|LrYTb40a|3%8Tu2So@_`ByD1Y;tsj9R45kLUULfF6D2c?JPu zq5{TGe3)*!ahn@Q0=YR)v1+^(7j3g7^jaI^#Nrh68RHwOXn6pb;R4r0id(Mvm|8#IAF^fG@#GC;$U8z^QL&h|tKM75ssAotm6dSp-qk!Hl zHy4RQQNNiUEsI4uI9Tc&*q87{PAP@O_DA)YPM*r+*p!|c-PN<`WAHh5y<(u=9lDkT7wOE<$& zv4|E#&0>mCDWG-Qm3w2gVPLIT*Qw3L$gj^c;_Aj^T;9p|*-;T2g;9Tkl{LpxoY6=& zPt)<57{eB6P#woOv&?)~y0I|(glZ9x(Dyl%I7FGtx(V<6Q7uFj8ukV1?{=yy>5d^x zSTOm4C3-g^&K%>$PAblr8#AWaM>KEX^(=8GQo!Z=clr7{I_iu^q^{qigCCf#Ea(JP zlGh3)JJUao#rGOwIzRR1d}S7dH27c{6=w~FG=phsx7fPMusLGKdGia-eidJD$AT0r z7Fpl5M9%lEs$a7EVXlF3TjNVccqpS|*sX5QW{oySB8BmbOY1|QxaNmGXJManc^!5( z$*v*!`I%nOw-$V-eRD~vHbRQW0}iCY{7TsS6y+VV9^}W*V>kI?qGIhr$Dgksj|Rgl z|4)OhUl_wQf*WfyJdZIx{EUBMe70_`-r5$H&i`2KVOme(6c=vfF{D!lcH^2`lIGmJ zSCytqIZ55Jg|O7GaG%k~S`<473FJz9f|$EL9@-j8l++`nirA!`$iM0;(>$tewEQF$!w+2io^QoAr`Z&Uu`1&GL)9W{T) zk)EMxrX#oQWo&B`?Y?GOnhXa~11_v=Wt`vk=gzAO=b|Jk+Krc~Oc z#UIjQI8>5GU#2Kk4|Y8xdg{UFQth>m&Wx-r&MdqLnFT8LMif!^`+$;gFHi6#Le0FA z+|7eioOt?;=!s^&NjYz&5pt~hR#jzb3aIl?xrqkJgBWsh7m_W>fNae@c!rNjt)8^Y z>YmW^AzBC=6Vb#reAEeG+9kRYQ`b)|7v3=8_md12JJM3gd-?65ylUXx?d9UfF9~>{ zkF9H}dMB|&)v>KLlzy;v?vi_TAD1uJLgm-z-aYY`WxK!7*~j5XfgWrCi(3CsQS-qF zmOxWC^!T8;47c{+Z^(phG~DXBX7jBJxl zMsRGeyCwU*^~9KBrz8Zds_N{?8}Gw1=APd=JVEm=tFYUQ(%Ca!egY?SA5RpSkfRb+ z(C^iUnRDj>8fyx#{31K9|-_3^R#jH;(YMq^LNFHDFMY%_%C=OOINdLz8orn(^@7g0ckySX~ zAMNqyHVOLQ*6HT$>gN5QxYY0ZHIM2%eBk=?aQz=K`=8q*cmnc&3S#4G{hK<*f6t-= zl!DYyC=U<;KZN+FE_{!i<-h7KHr5UnoDMD)b~fBXKQg5Mhr&;cheM-_huHwY5BU|t zkpSsG6#k7N_%{r)CtnoG%m9EN@+(H{%fDa<{0(C)YsA4l76AAmzhYS90RQB{_cshd zOAY6{Qn=%U%dZ${S%1O!Cu98Y^$}@a)o~CB0Q`_&F+?Sh|KP#H{Wl(rq6JG2$pC;K z@+*enz@Hf0ygxC1wyr@+7s6b)HEU4(C*A$e%R9RIUkq=18y6eSe?GZ?wy&R;mX3wB z{sMkkf5@*ia<>1Z!SnYjEz+qZgL{A<@+(GvD9WGJ@vox%PlaQzL#5>t^_o(=)82$o(!T4)^NW`eI?nnXvKLk$YUt3wm zpBR6=Eb1>l$I%JErw-xrD@6ClKOz3gf=c}{;;+|)gdzM}hAjZ_Lwz)2?OL*VQ~_V(0xrMOxa{4_54_kTkC%ZvW>UcXO9|Aeq3#{LhBe@{*Seqa23dgrIQHpTy_ z|L elementData.length) - { - Object[] elementDataNew = new Object[elementData.length + stepLength]; - System.arraycopy(elementData, 0, elementDataNew, 0, elementData.length); - elementData = elementDataNew; - } - - elementData[size] = o; - size++; - - } - public void add(int index, Object o){ - if(size > elementData.length) - { - Object[] elementDataNew = new Object[elementData.length + stepLength]; - System.arraycopy(elementData, 0, elementDataNew, 0, elementData.length); - elementData = elementDataNew; - } - System.arraycopy(elementData, index, elementData, index+1, size-index+1); - elementData[index] = o; - size++; - - } - - public Object get(int index){ - return elementData[index]; - } - - public Object remove(int index){ - Object obj = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, size-index-1); - size--; - return obj; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return null; - } - - public String toString() - { - StringBuffer sb = new StringBuffer(); - for(int i=0;i0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group08/283677872/2-26/src/com/coding/basic/Stack.java b/group08/283677872/2-26/src/com/coding/basic/Stack.java deleted file mode 100644 index e911d17866..0000000000 --- a/group08/283677872/2-26/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop() throws Exception{ - if(isEmpty()) - { - throw new Exception("Stack pop error"); - } - return elementData.remove(elementData.size()-1); - } - - public Object peek() throws Exception{ - if(isEmpty()) - { - throw new Exception("Stack pop error"); - } - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return elementData.size()>0; - } - public int size(){ - return elementData.size(); - } -} diff --git "a/group08/286060098/2-26/blong/\345\237\272\346\234\254\347\273\223\346\236\204.md" "b/group08/286060098/2-26/blong/\345\237\272\346\234\254\347\273\223\346\236\204.md" deleted file mode 100644 index 23d6a12c12..0000000000 --- "a/group08/286060098/2-26/blong/\345\237\272\346\234\254\347\273\223\346\236\204.md" +++ /dev/null @@ -1,54 +0,0 @@ -#指令集 ----- -通俗的理解,指令集就是CPU能认识的语言,指令集运行于一定的微架构之上.指令集有很多,比如复杂指令集AMD,INTEL用的,精简指令集ARM用的 - -# CPU ---- -CPU使整个计算机的核心,进行整体的逻辑操作,他的运算速度很快,我们在主机上的操作最终都会变成原子指令由CPU来执行 - -历史上的CPU对程序的执行存在很多的执行方案,比如说时间片法,令牌环之类的的,每个程序依次交换执行,这样就存在一个问题,程序的换入换出需要保留当前执行情况的现场,还要加载历史程序的历史现场 - -这些数据存储在哪里?由于CPU的速度过快,而我们是用的大规模的数据存储一般是价格较低速度较慢的磁盘.如果说CPU直接从磁盘加载,CPU的资源利用率会变的很低,会严重浪费了CPU的运算能力.因此我们需要缓存 - -# 缓存 ---- -缓存的出是为加载相关的数据提供CPU路基运算的存储,CPU中的寄存器就是一种缓存,这是CPU本身对操作的优化.但是说这样高速的缓存本身的制造成本是非常高的,完全使用这样高性能的存储设备并不是一个具有性价比的解决方案 - -因此出现了多级缓存,常见的如INTEL的L1,L2,L3,这是多级缓存的一种实现,随着层级的升高,存储空间在升高,速度在下将,通过诸如LFU、LRU的缓存置换算法优化相关的缓存命中率提高CPU利用率 - -理解 Cache --> 传送门 `http://www.mouseos.com/arch/cache.html` - -即便是L3的缓存也以就是十分昂贵的,依旧是很难大规模使用的存储设备,因此需要速度相对较快,但是价格又是普通用户可以接收的中间设备,比如内存 - -# 内存 ---- -内存的存在实际上解决了很多问题,他的价格相对高速缓存来说相对较低,能够提供较大的存储,也可以看作缓存的一种,将磁盘的数据预加载,供高速缓存加载. - -内存有很多的工作频率,内存主频越高在一定程度上代表着内存所能达到的速度越快,计算机系统的时钟速度是以频率来衡量的.晶体振荡器控制着时钟速度,在石英晶片上加上电压,其就以正弦波的形式震动起来,这一震动可以通过晶片的形变和大小记录下来。晶体的震动以正弦调和变化的电流的形式表现出来,这一变化的电流就是时钟信号. - -内存是一种断电后存储洗洗就会丢失的存储设备,这就尴尬了,对于宕机我们并无法预测,我们需要将众多的资源数据进行存储,这个时候我们需要硬盘. - -# 硬盘 ---- -硬盘对于我们而言他的速度反而是其次的,他最大的意义是数据的安全性.在数据安全的基础之上我们再去追求硬盘的速度. - -硬盘有很多比如说机械硬盘,固态硬盘,PCI硬盘.机械硬盘.机械硬盘的大体结构如下图,数据的读取需要磁头的移动读取扇区上的信息,这时候磁盘的转速就很重要了 -![yingpan.jpg-19.4kB][1] - -固态硬盘可以看作式闪存的堆积,闪存的制造价格的降低带来了他的春天,但是闪存的数据擦除次数有限,固态硬盘的寿命要注意 - - - - - - - - - - - - - - - - [1]: http://static.zybuluo.com/Haipop/finuq0bs9p1d90q38bccqjea/yingpan.jpg \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/AbstractCollection.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/AbstractCollection.java deleted file mode 100644 index 52b095dc23..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/AbstractCollection.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.pop.practice.homework.first.collection; - -/** - * @author haipop Date: 17-2-19 Time: 下午3:40 - */ -public abstract class AbstractCollection implements Collection { - - @Override - @SuppressWarnings("unchecked") - public void addAll(Collection collection) throws IllegalAccessException { - Iterator iterator = collection.iterator(); - while (iterator.hasNext()) { - add((T) iterator.next()); - } - } - - @Override - @SuppressWarnings("unchecked") - public void removeAll(Collection collection) { - Iterator iterator = collection.iterator(); - while (iterator.hasNext()) { - remove((T) iterator.next()); - } - } -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Collection.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Collection.java deleted file mode 100644 index 9355d7761f..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Collection.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pop.practice.homework.first.collection; - -/** - * @author haipop Date: 17-2-16 Time: 下午6:35 - */ -public interface Collection extends Iterator { - - /** - * 是否为空 - */ - boolean isEmpty(); - - /** - * 获取大小 - */ - int size(); - - /** - * 添加元素 - */ - void add(T element) throws IllegalAccessException; - - /** - * 批量添加元素 - */ - void addAll(Collection collection) throws IllegalAccessException; - - /** - * 删除元素 - */ - void remove(T element); - - /** - * 批量删除元素 - */ - void removeAll(Collection collection); - - /** - * 元素查找,返回索引,找不到返回-1 - */ - int contain(T element); -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Iterator.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Iterator.java deleted file mode 100644 index 0bbe4fa605..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Iterator.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.pop.practice.homework.first.collection; - -/** - * @author haipop Date: 17-2-16 Time: 下午6:34 - */ -public interface Iterator { - - /** - * 实例化 - */ - Iterator iterator(); - - /** - * 是否存在下一个 - */ - boolean hasNext(); - - /** - * 获取下一个元素 - */ - T next(); - -} diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/ArrayList.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/ArrayList.java deleted file mode 100644 index 9c355cc8b4..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/ArrayList.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.pop.practice.homework.first.collection.list; - -import java.io.Serializable; -import java.util.Objects; - -import com.pop.practice.homework.first.collection.AbstractCollection; -import com.pop.practice.homework.first.collection.Iterator; -import com.pop.practice.homework.utils.Math; - -/** - * @author haipop Date: 17-2-16 Time: 下午6:33 - */ -public class ArrayList extends AbstractCollection implements List, Serializable { - - private static final long serialVersionUID = -3408657766857424074L; - - /** - * 阈值 - */ - private static final double THRESHOLD = 0.75F; - - /** - * 大小 - */ - private int size; - - /** - * 当前的存储位置 - */ - private int flag; - - /** - * 元素集合 - */ - private Object[] store; - - /** - * 是否容量自增 - */ - private boolean autoIncrement; - - /** - * 遍历器 - */ - private Iterator iterator; - - /** - * 默认无参 - */ - public ArrayList() { - this.size = 8; - this.flag = 0; - this.autoIncrement = true; - this.store = new Object[this.size]; - } - - /** - * 指定大小,不可自增 - */ - public ArrayList(int size) { - this.size = size; - this.flag = 0; - this.autoIncrement = false; - this.store = new Object[size]; - } - - @Override - public Iterator iterator() { - this.iterator = new ArrayListIterator(); - return iterator; - } - - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - @SuppressWarnings("unchecked") - public T next() { - return (T) iterator.next(); - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - @Override - public int size() { - return flag; - } - - @Override - public void add(T element) throws IllegalAccessException { - assessStore(flag + 1, size, store, flag); - flag++; - this.store[flag] = element; - } - - private void assessStore(int left, int size, Object[] store, int flag) throws IllegalAccessException { - if (!autoIncrement) { - return; - } - double coefficient = Math.div(left, size); - if (coefficient > THRESHOLD) { - // 达到阈值,拓展 - Object[] newStore = new Object[this.size * 2]; - System.arraycopy(store, 0, newStore, 0, flag); - this.store = newStore; - this.size = size * 2; - } - } - - @Override - public void remove(T element) { - for (int i = 0; i < flag; i++) { - if (Objects.equals(this.store[i], element)) { - System.arraycopy(store, i + 1, store, i, flag - i); - flag--; - break; - } - } - } - - @Override - public int contain(T element) { - int result = -1; - for (int i = 0; i < flag; i++) { - if (Objects.equals(element, store[i])) { - return i; - } - } - return result; - } - - @Override - @SuppressWarnings("uncheckd") - public T get(int index) throws IndexOutOfBoundsException { - return (T) this.store[index]; - } - - private class ArrayListIterator implements Iterator { - - private int index; - - ArrayListIterator() { - index = 0; - } - - @Override - public Iterator iterator() { - return new ArrayListIterator(); - } - - @Override - public boolean hasNext() { - return index < size; - } - - @Override - public Object next() { - return store[index++]; - } - } -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/LinkedList.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/LinkedList.java deleted file mode 100644 index 874195596e..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/LinkedList.java +++ /dev/null @@ -1,240 +0,0 @@ -package com.pop.practice.homework.first.collection.list; - -import java.io.Serializable; -import java.util.Objects; - -import com.pop.practice.homework.first.collection.AbstractCollection; -import com.pop.practice.homework.first.collection.Iterator; - -/** - * @author haipop Date: 17-2-16 Time: 下午6:34 - */ -public class LinkedList extends AbstractCollection implements List, Serializable { - - private static final long serialVersionUID = 365915684200725970L; - - /** - * 头节点 - */ - private Node head; - - /** - * 尾节点 - */ - private Node tail; - - /** - * 标记位 - */ - private int flag; - - /** - * 遍历器 - */ - private Iterator iterator; - - public LinkedList() { - this.head = new Node(); - this.tail = new Node(); - this.flag = 0; - this.head.setNext(tail); - } - - @Override - public boolean isEmpty() { - return this.flag == 0; - } - - @Override - public int size() { - return this.flag; - } - - @Override - public void add(T element) throws IllegalAccessException { - if (this.head.getData() == null) { - this.head.setData(element); - flag++; - return; - } - if (this.tail.getData() == null) { - this.tail.setData(element); - this.tail.setBefore(this.head); - flag++; - return; - } - Node node = new Node(element); - node.setBefore(this.tail); - this.tail.next = node; - this.tail = node; - flag++; - } - - @Override - public void remove(T element) { - if (this.head == null) { - return; - } - Node tmp = this.head; - while (tmp.next != null) { - if (Objects.equals(tmp.getData(), element)) { - if (tmp == this.head) { - if (this.tail.getData() == null) { - this.head.setData(null); - } else { - this.head = this.head.next; - this.head.before = null; - } - flag--; - return; - } - Node next = tmp.next; - Node before = tmp.before; - if (next == null) { - before.setNext(null); - } else { - before.setNext(next); - } - next.setBefore(before); - flag--; - tmp = null; - } - tmp = tmp.next; - } - } - - @Override - public int contain(T element) { - Node tmp = this.head; - int index = 0; - while (tmp.next != null) { - if (Objects.equals(tmp.getData(), element)) { - return index; - } else { - tmp = tmp.next; - index++; - } - } - return -1; - } - - @Override - public T get(int index) throws IndexOutOfBoundsException { - Node tmp = this.head; - for (int i = 1; i < index; i++) { - if (tail == tmp) { - // 到最后还没到指定位置,越界 - throw new IndexOutOfBoundsException(); - } - tmp = tmp.getNext(); - } - return tmp.getData(); - } - - @Override - public Iterator iterator() { - this.iterator = new LinkListIterator(); - return iterator; - } - - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - @SuppressWarnings("unchecked") - public T next() { - return (T) iterator.next(); - } - - private class LinkListIterator implements Iterator { - - private Node cache; - - LinkListIterator() { - cache = head; - } - - @Override - public Iterator iterator() { - return new LinkListIterator(); - } - - @Override - public boolean hasNext() { - return cache.getNext() == null; - } - - @Override - public Object next() { - return cache.getNext(); - } - } - - /** - * 链表节点类 --> 这里做了双向链表,这里如果是一个跳表的话查询性能会更好一点 - */ - private class Node implements Serializable { - - private static final long serialVersionUID = 6327349429030778592L; - /** - * 数据 - */ - private T data; - - /** - * 下一节点 - */ - private Node before; - - /** - * 下一节点 - */ - private Node next; - - Node() { - } - - Node(T data) { - this.data = data; - this.next = null; - } - - Node(T data, Node before) { - this.data = data; - this.before = before; - } - - Node(T data, Node before, Node next) { - this.data = data; - this.before = before; - this.next = next; - } - - T getData() { - return data; - } - - void setData(T data) { - this.data = data; - } - - Node getBefore() { - return before; - } - - void setBefore(Node before) { - this.before = before; - } - - Node getNext() { - return next; - } - - void setNext(Node next) { - this.next = next; - } - } - -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/List.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/List.java deleted file mode 100644 index 7be9392b75..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/List.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pop.practice.homework.first.collection.list; - -import com.pop.practice.homework.first.collection.Collection; - -/** - * @author haipop Date: 17-2-19 Time: 下午4:03 - */ -public interface List extends Collection { - - /** - * 获取指定位置元素 - */ - T get(int index) throws IndexOutOfBoundsException; -} diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/LinkQueue.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/LinkQueue.java deleted file mode 100644 index bb371d64ca..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/LinkQueue.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.pop.practice.homework.first.collection.queue; - -import java.io.Serializable; -import java.util.Objects; - -import com.pop.practice.homework.first.collection.AbstractCollection; -import com.pop.practice.homework.first.collection.Collection; -import com.pop.practice.homework.first.collection.Iterator; - -/** - * @author haipop Date: 17-2-16 Time: 下午6:34 - */ -public class LinkQueue extends AbstractCollection implements Queue, Serializable { - - private static final long serialVersionUID = 7942321140756962637L; - - /** - * 头节点 - */ - private Node head; - - /** - * 尾节点,伪节点,这个节点指用来指上一个 - */ - private Node tail; - - /** - * 现有的元素个数 - */ - private int size; - - /** - * 遍历器 - */ - private Iterator iterator; - - public LinkQueue() { - this.size = 0; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - @Override - public int size() { - return size; - } - - @Override - public void add(T element) throws IllegalAccessException { - if (this.head == null) { - this.head = new Node(element); - this.tail.setBefore(this.head); - this.size++; - return; - } - Node node = new Node(element); - node.setBefore(null); - node.setNext(this.head.getNext()); - this.head.getNext().setBefore(node); - this.head = node; - this.size++; - } - - @Override - public void remove(T element) { - if (isEmpty()) { - throw new IndexOutOfBoundsException(); - } - Node tmp = this.head; - while (tmp.getNext() == null && tmp.getNext() != this.tail) { - if (Objects.equals(tmp.getData(), element)) { - Node before = tmp.getBefore(); - Node next = tmp.getNext(); - before.setNext(next); - next.setBefore(before); - tmp = null; - break; - } - tmp = tmp.getNext(); - } - } - - @Override - public void push(T element) throws IllegalAccessException { - add(element); - } - - @Override - public void push(Collection collection) throws IllegalAccessException { - addAll(collection); - } - - @Override - public int contain(T element) { - Node tmp = this.head; - int index = 0; - while (tmp.next != null && tmp != this.tail) { - if (Objects.equals(tmp.getData(), element)) { - return index; - } else { - tmp = tmp.next; - index++; - } - } - return -1; - } - - @Override - public T pull() { - if (isEmpty()) { - throw new IndexOutOfBoundsException(); - } - Node node = this.tail.getBefore(); - this.tail.setBefore(node.getBefore()); - size--; - return node.getData(); - } - - @Override - public Iterator iterator() { - this.iterator = new LinkQueueIterator(); - return iterator; - } - - @Override - public boolean hasNext() { - return this.iterator.hasNext(); - } - - @Override - @SuppressWarnings("unchecked") - public T next() { - return (T) this.iterator.next(); - } - - private class LinkQueueIterator implements Iterator { - - private Node cache; - - LinkQueueIterator() { - this.cache = head; - } - - @Override - public Iterator iterator() { - return new LinkQueueIterator(); - } - - @Override - public boolean hasNext() { - return cache.getNext() == tail; - } - - @Override - public T next() { - return cache.getNext().getData(); - } - } - - private class Node implements Serializable { - - private static final long serialVersionUID = 6400564182277299061L; - - private T data; - - private Node before; - - private Node next; - - Node(T data) { - this.data = data; - } - - T getData() { - return data; - } - - void setData(T data) { - this.data = data; - } - - Node getBefore() { - return before; - } - - void setBefore(Node before) { - this.before = before; - } - - Node getNext() { - return next; - } - - void setNext(Node next) { - this.next = next; - } - } - -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/Queue.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/Queue.java deleted file mode 100644 index 92f46378e0..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/Queue.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pop.practice.homework.first.collection.queue; - -import com.pop.practice.homework.first.collection.Collection; - -/** - * 更符合Queue语义的方法 - * - * @author haipop Date: 17-2-19 Time: 下午3:23 - */ -public interface Queue extends Collection { - - /** - * 添加元素 - */ - void push(T element) throws IllegalAccessException; - - /** - * 添加元素 - */ - void push(Collection collection) throws IllegalAccessException; - - /** - * 取元素,删除最后一个并返回 - */ - T pull(); -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/LinkStack.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/LinkStack.java deleted file mode 100644 index c9a0edd124..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/LinkStack.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.pop.practice.homework.first.collection.stack; - -import java.io.Serializable; - -import com.pop.practice.homework.first.collection.AbstractCollection; -import com.pop.practice.homework.first.collection.Iterator; -import com.pop.practice.homework.first.collection.list.LinkedList; -import com.pop.practice.homework.first.collection.list.List; - -/** - * @author haipop Date: 17-2-16 Time: 下午6:33 - */ -public class LinkStack extends AbstractCollection implements Stack, Serializable { - - private static final long serialVersionUID = -2813631170103864318L; - - /** - * 数据存储 - */ - private List cache; - - /** - * 数据量 - */ - private int size; - - /** - * 遍历器 - */ - private Iterator iterator; - - public LinkStack() { - this.size = 0; - this.cache = new LinkedList(); - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - @Override - public int size() { - return size; - } - - @Override - public void push(T element) throws IllegalAccessException { - this.cache.add(element); - size++; - } - - @Override - public void add(T element) throws IllegalAccessException { - this.cache.add(element); - size++; - } - - @Override - public T pull() throws IndexOutOfBoundsException { - T result = this.cache.get(size - 1); - size--; - return result; - } - - @Override - public void remove(T element) { - cache.remove(element); - size--; - } - - @Override - public int contain(T element) { - return cache.contain(element); - } - - @Override - public Iterator iterator() { - this.iterator = this.cache.iterator(); - return iterator; - } - - @Override - public boolean hasNext() { - return this.iterator.hasNext(); - } - - @Override - @SuppressWarnings("unchecked") - public T next() { - return (T) this.iterator.next(); - } - -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/Stack.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/Stack.java deleted file mode 100644 index c9ea66dd2b..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pop.practice.homework.first.collection.stack; - -import com.pop.practice.homework.first.collection.Collection; - -/** - * - * 更符合Stack语义的方法 - * - * @author haipop Date: 17-2-19 Time: 下午3:50 - */ -public interface Stack extends Collection { - - /** - * 添加元素 - */ - void push(T element) throws IllegalAccessException; - - /** - * 取元素 - */ - T pull(); -} diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/AbstractTree.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/AbstractTree.java deleted file mode 100644 index 4e86940103..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/AbstractTree.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pop.practice.homework.first.tree; - -import com.pop.practice.homework.first.collection.Iterator; -import com.pop.practice.homework.first.collection.list.List; - -/** - * @author haipop Date: 17-2-20 Time: 上午9:53 - */ -public abstract class AbstractTree implements Tree { - - @Override - public void addNode(T[] elements) throws IllegalAccessException { - for (T ele : elements) { - addNode(ele); - } - } - - @Override - @SuppressWarnings("unchecked") - public void addNode(List elements) throws IllegalAccessException { - Iterator iterator = elements.iterator(); - while (iterator.hasNext()) { - addNode((T) iterator.next()); - } - } - - - protected abstract void addNode(T elements) throws IllegalAccessException; -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryNode.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryNode.java deleted file mode 100644 index db34c48460..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryNode.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pop.practice.homework.first.tree; - -class BinaryNode { - - private T data; - - private BinaryNode left; - - private BinaryNode right; - - public BinaryNode(T data, BinaryNode left, BinaryNode right) { - this.data = data; - this.left = left; - this.right = right; - } - - public T getData() { - return data; - } - - public void setData(T data) { - this.data = data; - } - - public BinaryNode getLeft() { - return left; - } - - public void setLeft(BinaryNode left) { - this.left = left; - } - - public BinaryNode getRight() { - return right; - } - - public void setRight(BinaryNode right) { - this.right = right; - } -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryTree.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryTree.java deleted file mode 100644 index eff95ec6f9..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryTree.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.pop.practice.homework.first.tree; - -import java.io.Serializable; - -import com.pop.practice.homework.first.collection.queue.LinkQueue; -import com.pop.practice.homework.first.collection.queue.Queue; - -/** - * 左大右小 - * - * @author haipop Date: 17-2-20 Time: 上午9:42 - */ -public class BinaryTree extends AbstractTree implements Serializable { - - private static final long serialVersionUID = -1467347526158258388L; - - /** - * 根节点 - */ - private BinaryNode root; - - @Override - @SuppressWarnings("unchecked") - protected void addNode(T elements) throws IllegalAccessException { - if (root == null) { - root = new BinaryNode(elements, null, null); - } - BinaryNode newNode = new BinaryNode<>(elements, null, null); - Queue queue = new LinkQueue<>(); - queue.add(root); - while (queue.isEmpty()) { - BinaryNode node = queue.pull(); - if (((Comparable) node.getData()).compareTo(elements) > 0) { - if (node.getRight() == null) { - node.setRight(newNode); - break; - } else { - queue.add(node.getRight()); - } - } else if (((Comparable) node.getData()).compareTo(elements) < 0) { - if (node.getLeft() == null) { - node.setLeft(newNode); - break; - } else { - queue.add(node.getLeft()); - } - } - } - } - - @Override - @SuppressWarnings("unchecked") - public void removeNode(T elements) throws IllegalAccessException { - if (root == null) { - return; - } - root = removeNode(elements, root); - } - - @SuppressWarnings("unchecked") - private BinaryNode removeNode(T element, BinaryNode node) { - BinaryNode left = node.getLeft(); - BinaryNode right = node.getRight(); - if (node.getData().compareTo(element) > 0) { - BinaryNode removeNode = removeNode(element, right); - moveNode(element, node, left, right, removeNode); - node.setRight(removeNode); - } else if (node.getData().compareTo(element) < 0) { - BinaryNode removeNode = removeNode(element, left); - moveNode(element, node, left, right, removeNode); - node.setLeft(removeNode); - } - if (left != null) { - return left; - } else if (right != null) { - return right; - } else { - return null; - } - } - - @SuppressWarnings("unchecked") - private void moveNode(T element, BinaryNode node, BinaryNode left, BinaryNode right, - BinaryNode removeNode) { - if (removeNode.getData().compareTo(right) > 0) { - BinaryNode tmp = removeNode.getRight(); - while (tmp != null) { - tmp = tmp.getRight(); - } - tmp.setRight(left.getRight()); - } else if (node.getData().compareTo(element) < 0) { - BinaryNode tmp = removeNode.getLeft(); - while (tmp != null) { - tmp = tmp.getLeft(); - } - tmp.setLeft(right.getLeft()); - } - } - - @Override - @SuppressWarnings("unchecked") - public boolean contain(T data) throws IllegalAccessException { - if (root == null) { - return false; - } - Queue queue = new LinkQueue<>(); - queue.add(root); - while (queue.isEmpty()) { - BinaryNode node = queue.pull(); - if (((Comparable) node.getData()).compareTo(data) > 0) { - if (node.getRight() != null) { - queue.add(node.getRight()); - } - } else if (((Comparable) node.getData()).compareTo(data) < 0) { - if (node.getLeft() == null) { - queue.add(node.getLeft()); - } - } else { - return true; - } - } - return false; - } - -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/Tree.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/Tree.java deleted file mode 100644 index 174a98bc2c..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/Tree.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.pop.practice.homework.first.tree; - -import com.pop.practice.homework.first.collection.list.List; - -/** - * @author haipop Date: 17-2-19 Time: 下午5:12 - */ -public interface Tree { - - /** - * 添加节点 - */ - void addNode(T... elements) throws IllegalAccessException; - - /** - * 添加节点 - */ - void addNode(List elements) throws IllegalAccessException; - - /** - * 删除节点 - */ - void removeNode(T element) throws IllegalAccessException; - - /** - * 节点查找,找到返回节点信息,找不到返回null - */ - boolean contain(T data) throws IllegalAccessException; - -} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/utils/Math.java b/group08/286060098/2-26/src/com/pop/practice/homework/utils/Math.java deleted file mode 100644 index b20c1bb486..0000000000 --- a/group08/286060098/2-26/src/com/pop/practice/homework/utils/Math.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pop.practice.homework.utils; - -import java.math.BigDecimal; -import java.math.RoundingMode; - -/** - * @author haipop Date: 17-2-18 Time: 下午1:00 - */ -public class Math { - - public static double div(int left, int right) throws IllegalAccessException { - return div((double) left, (double) right, 2); - } - - public static double div(int left, int right, int scale) throws IllegalAccessException { - return div((double) left, (double) right, scale); - } - - @SuppressWarnings("unchecked") - public static double div(double left, double right, int scale) throws IllegalAccessException { - // 如果精确范围小于0,抛出异常信息 - if (scale < 0) { - throw new IllegalAccessException("精确度不能小于0"); - } - BigDecimal divisor = new BigDecimal(left); - BigDecimal dividend = new BigDecimal(right); - return divisor.divide(dividend, scale, RoundingMode.HALF_EVEN).doubleValue(); - } -} \ No newline at end of file diff --git a/group08/286060098/readme.md b/group08/286060098/readme.md deleted file mode 100644 index a6325e29da..0000000000 --- a/group08/286060098/readme.md +++ /dev/null @@ -1,17 +0,0 @@ -# Module说明 - ---- - -### 文件夹说明 -| 文件夹 | 描述   | -| -------- | :----: | -| blong |相关的说明文档,博客 | -| script | 相关的脚本信息,如有sql脚本也请在这里查找 | -| src | 代码目录| - -### 代码说明 - -> 作业在homework目录下 - - - diff --git a/group08/406166841/2-26/CPU.md b/group08/406166841/2-26/CPU.md deleted file mode 100644 index 0184372f60..0000000000 --- a/group08/406166841/2-26/CPU.md +++ /dev/null @@ -1,76 +0,0 @@ -CPU:中央处理单元(Cntral Pocessing Uit)的缩写,也叫处理器,是计算机的运算核心和控制核心。人靠大脑思考,电脑靠CPU来运算、控制。让电脑的各个部件顺利工作,起到协调和控制作用。 - -内存:1. 负责硬盘等硬件上的数据与CPU之间数据交换处理;2. 缓存系统中的临时数据。3. 断电后数据丢失。 -硬盘:存储资料和软件等数据的设备,有容量大,断电数据不丢失的特点。也被人们称之为“数据仓库”。 - -现在我们来说一下CPU、硬盘、内存三者之间的关系。 - -首先 ,我们先回想一下三者的作用: - -CPU:是计算机的运算核心和控制核心,让电脑的各个部件顺利工作,起到协调和控制作用。 -硬盘:存储资料和软件等数据的设备,有容量大,断电数据不丢失的特点。也被人们称之为“数据仓库”。 -内存:1. 负责硬盘等硬件上的数据与CPU之间数据交换处理;2. 缓存系统中的临时数据。3. 断电后数据丢失。 - -然后, 我们再来看一下程序是如何执行起来的。 - -当我们在电脑上打开QQ时(右键-打开 或者双击QQ图标),其实是通过鼠标(输入设备)向CPU发送了一条命令,CPU接收到这条命令后,QQ程序就从硬盘里被加载到内存(加载时不通过处理器,直接从硬盘加载程序到内存里),加载完成后,CPU就开始执行QQ程序。程序执行起来后,CPU可以让QQ程序显示在我们的在显示器上。也就是你看到了QQ 程序运行起来了。如果这个时候,你用QQ截取了一张屏幕的图片,那么这张图片会首先保存到内存,在没有退出截屏状态时,你可以在这张图片上写字、画线条,等你右键保存这张图片的时候,这张图片就会保存到硬盘里。 - -通过了解一个程序是如何运行起来的,我们就可以了解三者是如何工作的 。 - -可能有些人会不明白,如果程序是这样执行起来的话,那么为什么CPU不直接在硬盘里执行程序,而非要把程序放到内存后在执行呢? - -因为速度差别太大: -内存存取数据的速度比硬盘的存取速度快了10倍, 在某些环境里,硬盘和内存之间的速度差距可能会更大。 - -而CPU的速度比内存不知还要快多少倍。当我们把程序从硬盘放到内存以后,CPU就直接在内存运行程序,这样比CPU直接在硬盘运行程序就要快很多。 - -内存解决了一部分CPU运行过快,而硬盘数据存取太慢的问题。 提高了我们的电脑的运行速度。 - -内存就如同一条“高速车道”一般,数据由传输速度较慢的硬盘通过这条高速车道传送至CPU进行处理! - -但内存是带电存储的(一旦断电数据就会消失),而且容量有限,所以要长时间储存程序或数据就需要使用硬盘。 - -其实内存在这里起了两个作用: - -1. 保存从硬盘读取的数据,提供给CPU使用 - -2. 保存CPU的一些临时执行结果,以便CPU下次使用或保存到硬盘 - - - -数字电子中有各种逻辑功能,最简单的是与或非,数字电子中用01表示数据比如你表示 12(10进制) - -12 = 8*1+4*1+2*0+1*0表示为 1100你可以试试所有数字都可以这么表示出来,而1和0在数电中用"高电平","低电平"表示,说白了就是通电表示1断电表示0. - -硅片上的集成电路可以把这些门电路作到非常小,这样人们用各种逻辑电路就能实现复杂的计算器功能, - -我们姑且认为只能算加减乘除吧.你想算什么算式都可以用逻辑电路来实现.但是人们往往想算的东西都比较复杂比如这个 - -1*1+2*2+3*3+4*4...10000000*10000000 - -如果一次运算需要一个逻辑电路,那么这就需要2*10000000个逻辑电路, - -额,恕我直言,这个成本有点高, - -于是人们想到了一个好办法,就是做一个逻辑器件,有2个输入,分别是数据输入,指令输入,数据输入就是输入要运算的两个数据,指令输入输入让这个器件干什么,比如00就是做加法,01就是做减法,10是乘法,11是除法,然后给他配个储存设备用来保存数据,这样我们让这一个设备不断的运行,按照一定规则把输出的数据送回输入就能完成上面提到的运算了. - -后来这个设备被称为CPU, - -CPU除了运算逻辑以外,还能执行: 1 移动数据 2 逻辑运算 3 跳转指令 还有些杂七杂八的指令 - -移动数据就是把输出的数据送回输入的指令,通常数据存储在寄存器或者RAM中,储存器就像游泳馆的柜子,上面有个编号,里面存了个数字.后来编号被程序猿称为地址. - -有了这些我们还有一件事没做,想想是什么? - -就是告诉CPU,今天要做的指令,最开始指令是存储在穿孔纸带上的,现在是储存在硬盘里的 - -CPU一个一个地读进来,读一个执行一个操作.因此执行上面的操作要在纸带上打 2*10000000个以上的孔,这也有点麻烦 - -幸好我们的运算是有规律的,因此我们可以让纸带走一走倒带再走一走,直到某个条件满足了为止.这样的指令就是转移指令。 - -from: - -http://www.guokr.com/question/482025/ - - - diff --git a/group08/406166841/2-26/CustomArrayList.java b/group08/406166841/2-26/CustomArrayList.java deleted file mode 100644 index 46dbe3d40d..0000000000 --- a/group08/406166841/2-26/CustomArrayList.java +++ /dev/null @@ -1,92 +0,0 @@ -package net.iyouqu.bruceretrofit.util.java; - -import java.util.Arrays; - -/** - * Created by liq on 2017/2/25. - */ - -public class CustomArrayList implements List { - - private int size = 0; - - private final static int DEFAULT_CAPACITY = 10; - private final static int MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8; - - private Object[] elementData = new Object[DEFAULT_CAPACITY]; - private String desc = "index超过界限"; - - @Override - public void add(Object o) { - isCapacityEnough(size + 1); - elementData[size++] = o; - } - - @Override - public void add(int index, Object o) { - checkRangeForAdd(index); - isCapacityEnough(size + 1); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - @Override - public Object get(int index) { - checkRange(index); - return elementData[index]; - } - - @Override - public Object remove(int index) { - Object value = get(index); - int moveSize = size - index - 1; - if (moveSize > 0){ - System.arraycopy(elementData,index + 1, elementData,index,size - index - 1); - } - elementData[--size] = null; - return value; - } - - @Override - public int size() { - return size; - } - - private void checkRange(int index) { - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(desc); - } - } - - private void checkRangeForAdd(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(desc); - } - } - - private void explicitCapacity(int capacity) { - int newLength = elementData.length * 2; - if (newLength - capacity < 0) { - newLength = capacity; - } - if (newLength > (MAX_ARRAY_LENGTH)) { - newLength = (capacity > MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH); - } - elementData = Arrays.copyOf(elementData, newLength); - } - - private void isCapacityEnough(int size) { - if (size > DEFAULT_CAPACITY) { - explicitCapacity(size); - } - if (size < 0) { - throw new OutOfMemoryError(); - } - } - - public Iterator iterator() { - return null; - } - -} diff --git a/group08/406166841/2-26/CustomLinkedList.java b/group08/406166841/2-26/CustomLinkedList.java deleted file mode 100644 index 532b9b8eaf..0000000000 --- a/group08/406166841/2-26/CustomLinkedList.java +++ /dev/null @@ -1,172 +0,0 @@ -package net.iyouqu.bruceretrofit.util.java; - -/** - * Created by liq on 2017/2/25. - */ - -public class CustomLinkedList implements List { - - //链表长度 - private int size = 0; - //链表头指针 - private Node first; - //链表尾部指针 - private Node last; - //操作次数 - private int modCount; - - @Override - public void add(Object o) { - linkLast(o); - } - - @Override - public void add(int index, Object o) { - checkPositionIndex(index); - if (index == size) { - linkLast(o); - } else { - linkBefore(o, node(index)); - } - } - - @Override - public Object get(int index) { - checkPositionIndex(index); - return node(index).data; - } - - @Override - public Object remove(int index) { - checkPositionIndex(index); - return unlink(node(index)); - } - - @Override - public int size() { - return size; - } - - /** - * 添加节点到链表尾部 - */ - public void addLast(Object e) { - linkLast(e); - } - - /** - * 解除传入节点的属性,并且将传入节点的上一个和下一个节点 链接。使传入节点的属性 全部为 null - */ - private Object unlink(Node node) { - //获取当前节点node的属性 - final Object element = node.data; - final Node next = node.next; - final Node prev = node.prev; - if (prev == null) { - //上一个节点为null将首节点设置为下一个节点 - first = next; - } else { - //上一个节点有 将上一个节点的下一个节点 设置为当前节点的下一个节点 - prev.next = next; - //将当前节点的上一个节点设置为null - node.prev = null; - } - if (next == null) { - //下一个节点为null将末尾节点设置为上一个节点 - last = prev; - } else { - //将下一个节点的上一个节点 设置为当前节点的上一个节点 - next.prev = prev; - node.next = null; - } - node.data = null; - size--; - modCount++; - return element; - } - - /** - * 获取一个节点 - * 判断index 在前半区间还是后半区间。而不是一直从头到尾搜索 - * 将节点访问复杂度从O(n)变为O(n/2) - */ - private Node node(int index) { - checkPositionIndex(index); - if (index < (size / 2)) { - Node x = first; - for (int i = 0; i < index; i++) { - x = x.next; - } - return x; - } else { - Node x = last; - for (int i = size - 1; i > index; i--) { - x = x.prev; - } - return x; - } - } - - /** - * 在参数节点之前插入一个节点 - */ - private void linkBefore(Object element, Node node) { - //获取添加节点的上一个节点 - final Node pred = node.prev; - //创建一个新节点 - final Node newNode = new Node<>(pred, element, node); - //添加节点的上一个节点为 新节点 - node.prev = newNode; - //判断上一个节点是否为null - if (pred == null) { - //首节点设置为新创建的节点 - first = newNode; - } else { - //上个节点不为null。将其下个节点设置为新创建的节点。 - pred.next = newNode; - } - size++; - modCount++; - } - - /** - * 链接 节点到 last - */ - private void linkLast(Object e) { - final Node l = last; - final Node newNode = new Node<>(l, e, null); - last = newNode; - //判断链表last是否为null - if (l == null) { - //链表first指向新添加的 节点 - first = newNode; - } else { - //链表last不为null将链表last节点的的next设置为新节点 - l.next = newNode; - } - size++; - modCount++; - } - - /** - * 检查index是否越界 - */ - private void checkPositionIndex(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("index超过界限"); - } - } - - private static class Node { - Object data; - //下一个节点 - Node next; - //上一个节点 - Node prev; - public Node(Node prev, Object item, Node next) { - this.data = item; - this.next = next; - this.prev = prev; - } - } -} diff --git a/group08/406166841/2-26/CustomQueue.java b/group08/406166841/2-26/CustomQueue.java deleted file mode 100644 index 00f3d89f6d..0000000000 --- a/group08/406166841/2-26/CustomQueue.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.iyouqu.bruceretrofit.util.java; - -/** - * Created by liq on 2017/2/25. - */ - -public class CustomQueue { - - Object[] data = null; - //容量 - private int capacity; - //队尾指针 - private int tail; - - CustomQueue(int initSize) { - if (initSize >= 0) { - this.capacity = initSize; - data = new Object[initSize]; - tail = 0; - } else { - throw new RuntimeException("初始化大小不能小于0" + initSize); - } - } - - public void enQueue(E o){ - ensureCapacity(); - data[tail] = o; - tail++; - } - - public E deQueue(){ - return (E) data[0]; - } - - public boolean isEmpty(){ - return tail == 0; - } - - public int size(){ - return tail; - } - - private void ensureCapacity() { - if (tail == capacity) { - capacity *= 2; - Object[] newData = new Object[capacity]; - System.arraycopy(data, 0, newData, 0, tail); - data = newData; - } - } -} diff --git a/group08/406166841/2-26/CustomStack.java b/group08/406166841/2-26/CustomStack.java deleted file mode 100644 index c83c7aee78..0000000000 --- a/group08/406166841/2-26/CustomStack.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.iyouqu.bruceretrofit.util.java; - -import java.util.ArrayList; - -/** - * Created by liq on 2017/2/25. - */ - -public class CustomStack { - - //重载因子 - private static final float LOAD_FACTOR = 0.75f; - //需要扩充容量时的大小 - private int resizeCapacity; - private Object[] data = null; - //栈容量 - private int capacity; - //栈顶 - private int top; - - public CustomStack(int initSize) { - if (initSize >= 0) { - this.capacity = initSize; - data = new Object[initSize]; - top = 0; - this.resizeCapacity = (int) (capacity * LOAD_FACTOR); - } else { - throw new RuntimeException("初始化大小不能小于0:" + initSize); - } - } - - private ArrayList elementData = new ArrayList(); - - public void push(E o){ - checkStackCapacity(); - data[top] = o; - top++; - } - - public E pop(){ - if(top<=0) - throw new RuntimeException("没有元素不能弹出"); - E e = (E) data[top - 1]; - data[top-1] = null; - --top; - return e; - } - - public E peek(){ - - return (E) data[top - 1]; - - } - public boolean isEmpty(){ - return top == 0; - } - public int size(){ - return top; - } - - private void checkStackCapacity() { - if (top == resizeCapacity) { - capacity = capacity * 2; - Object[] newData = new Object[capacity]; - System.arraycopy(data, 0, newData, 0, top); - data = newData; - } - } - -} diff --git a/group08/406166841/2-26/Iterator.java b/group08/406166841/2-26/Iterator.java deleted file mode 100644 index 2a90aac57b..0000000000 --- a/group08/406166841/2-26/Iterator.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.iyouqu.bruceretrofit.util.java; - -/** - * Created by liq on 2017/2/25. - */ - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group08/406166841/2-26/List.java b/group08/406166841/2-26/List.java deleted file mode 100644 index b302910fb0..0000000000 --- a/group08/406166841/2-26/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.iyouqu.bruceretrofit.util.java; - -/** - * Created by liq on 2017/2/25. - */ - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group08/406166841/406166841.md b/group08/406166841/406166841.md deleted file mode 100644 index aef5098754..0000000000 --- a/group08/406166841/406166841.md +++ /dev/null @@ -1 +0,0 @@ -406166841 \ No newline at end of file diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/ArrayList.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/ArrayList.java" deleted file mode 100644 index 4e31d64920..0000000000 --- "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/ArrayList.java" +++ /dev/null @@ -1,92 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - // size不仅是ArrayList中实际存值得体现,直接add时,也是在elementData[size]处进行 - private int size = 0; - // 数组是连续且有序的 - private Object[] elementData; - - private void resize(int newSize) { - Object[] newArray = new Object[newSize]; - System.arraycopy(elementData, 0, newArray, 0, size); - elementData = newArray; - } - - public ArrayList() { - elementData = new Object[10]; - } - - // 添加指定元素至列表尾 - public void add(Object o) { - if (size == elementData.length) { - resize(size * 2); - } - elementData[size++] = o; - } - - // 将指定元素插入列表中的指定位置。移动当前位置的元素(如果有的话)和右边的后续元素(向索引添加一个元素) - public void add(int index, Object o) { - rangeCheck(index); - if (size == elementData.length / 4) { - resize(elementData.length / 2); - } - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - /* - * 获取指定位置元素 - * (non-Javadoc) - * @see com.coding.basic.List#get(int) - */ - public Object get(int index) { - rangeCheck(index); - return elementData[index]; - } - - /* - * 删除指定位置元素 - * (non-Javadoc) - * @see com.coding.basic.List#remove(int) - */ - public Object remove(int index) { - rangeCheck(index); - Object oldValue = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - size--; - return oldValue; - } - - public int size() { - return this.size; - } - - public Iterator iterator() { - return new ArrayListIterator(); - } - - // 检测索引值,当前有size个元素,占了elementData[0]至elementData[size-1],add时,只能在已有[0,size-1]处插入,或者在列表尾size处add - // 所以index在[0,size之间] - private void rangeCheck(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - } - - class ArrayListIterator implements Iterator { - int i = 0; - - @Override - public boolean hasNext() { - return i < size; - } - - @Override - public Object next() { - return elementData[i++]; - } - - } - -} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/BinaryTreeNode.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/BinaryTreeNode.java" deleted file mode 100644 index d7ac820192..0000000000 --- "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/BinaryTreeNode.java" +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Iterator.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Iterator.java" deleted file mode 100644 index 06ef6311b2..0000000000 --- "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Iterator.java" +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/LinkedList.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/LinkedList.java" deleted file mode 100644 index b036d5ba91..0000000000 --- "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/LinkedList.java" +++ /dev/null @@ -1,143 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private int size = 0; - // 头结点 - private Node head; - // 尾结点 - private Node tail; - - private void rangeCheck(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - } - - public void add(Object o) { - Node node = new Node(o, null); - if (head == null) { - head = tail = node; - } - Node oldTail = tail; - tail = node; - oldTail.next = tail; - size++; - } - - public void add(int index, Object o) { - rangeCheck(index); - if (index == size) { - this.add(o); - } else { - // 保存index处节点 - Node x = head; - // 保存index-1处的节点 - Node y = null; - for (int i = 0; i < index; i++) { - y = x; - x = x.next; - } - Node node = new Node(o, x); - y.next = node; - size++; - } - } - - public Object get(int index) { - rangeCheck(index); - Node x = head; - for (int i = 0; i < index; i++) { - x = x.next; - } - return x.data; - } - - public Object remove(int index) { - rangeCheck(index); - Object removeData; - if (index == 0) { - removeData = removeFirst(); - } else if (index == size - 1) { - removeData = removeLast(); - } else { - Node x = head; - Node y = head; - for (int i = 0; i < index; i++) { - y = x; - x = x.next; - } - y.next = x.next; - size--; - removeData = x.data; - } - return removeData; - } - - public int size() { - return this.size; - } - - public void addFirst(Object o) { - Node oldHead = head; - head = new Node(o, oldHead); - size++; - } - - public void addLast(Object o) { - Node oldTail = tail; - tail = new Node(o, null); - oldTail.next = tail; - size++; - } - - public Object removeFirst() { - Node oldHead = head; - head = oldHead.next; - size--; - return oldHead.data; - } - - public Object removeLast() { - Node oldTail = tail; - Node temp = head; - for (int i = 0; i < size - 2; i++) { - temp = temp.next; - } - tail = temp; - size--; - return oldTail.data; - } - - public Iterator iterator() { - return new LinkedListIterator(); - } - - private static class Node { - Object data; - Node next; - - Node(Object data, Node next) { - this.data = data; - this.next = next; - } - - } - - private class LinkedListIterator implements Iterator { - Node x = head; - - @Override - public boolean hasNext() { - return x != null; - } - - @Override - public Object next() { - Object data = x.data; - x = x.next; - return data; - } - - } -} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/List.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/List.java" deleted file mode 100644 index 10d13b5832..0000000000 --- "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/List.java" +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Queue.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Queue.java" deleted file mode 100644 index 5190e1b798..0000000000 --- "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Queue.java" +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList linkedList; - - public Queue() { - linkedList = new LinkedList(); - } - - public void enQueue(Object o) { - linkedList.add(o); - } - - public Object deQueue() { - return linkedList.removeFirst(); - } - - public boolean isEmpty() { - return linkedList.size() == 0; - } - - public int size() { - return linkedList.size(); - } -} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Stack.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Stack.java" deleted file mode 100644 index a39871d1b4..0000000000 --- "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Stack.java" +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -public class Stack { - - private LinkedList linkedList; - - public Stack() { - linkedList = new LinkedList(); - } - - public void push(Object o) { - linkedList.add(o); - } - - public Object pop() { - return linkedList.removeLast(); - } - - public Object peek() { - return linkedList.get(linkedList.size()-1); - } - - public boolean isEmpty() { - return linkedList.size() == 0; - } - - public int size() { - return linkedList.size(); - } -} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Test.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Test.java" deleted file mode 100644 index b26a11be8a..0000000000 --- "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Test.java" +++ /dev/null @@ -1,15 +0,0 @@ -package com.coding.basic; - -public class Test { - public static void main(String[] args) { - LinkedList linkedList = new LinkedList(); - for (int i = 0; i < 10; i++) { - linkedList.add(i); - } - for (int i = 0; i < 10; i++) { - linkedList.removeLast(); - } - linkedList.removeLast(); - } - -} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.doc" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.doc" deleted file mode 100644 index f518f0f97f1d7664b6cdd3d193be3b614da48f28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 zcmeI1dr(x@9mmhTyTF1gtS=;JbX9_A6fbJ9n*-r_-5Ela85SJF(hMlWPCMX`IQ7w%x>}jWKxp{hqtmEELQd z9U2Kg=5v4NeSYVj-#K?V=j@qL-A8|(dO`G&rNSnz8}TAGB3(h4NO1|FBEa}{!!XQ5 zArKsvyXXz{z*f#N=gnZ{;=GAZ=ghM!C$j* zi-$!M^fvKr%x3hG43Du!&AlKtp1Xn&Z^);3#8lzuq~rhE5%{xWL)1UfOp6g-@ub*{ zze?HnW3ZwQ7HyL$&7uL}re2Noj${Z`q2IDs+R;0A;8==jCahn99;&4cwek(znmr5A zzcv17`{$baD7=xD%CXk`j}-%3-a981Bfr)Dxn?uDh#@qCuYz-8t$*$Z+yl7&xvp=v z{+ZA9KL(5i<3KVP4^qHAAQemiobr3YBrqAc!4xnROap1)K9CNkgA6bO%mnv?SztEE z1ap7}vcOz056lM-fNZb;ECh?dVvqwK1WUkDunc&>a_|ty1uMYAfKK};$ODf7j=;@rwo0g+(x?HE+r5fRXHHbCKxnP?E zwc|ma2tIdh>yg)x^}KBr@cPUM zD#R}MYZm-=9@fDE_;N1R$Xu*}MKUxW=?}o(+3@r%gytfoLFa<`2rUE}Qgf02RD>-E zMkNFJ59dLB=kz--W=?P&?12Bwy86=!{#<@%ZoL?x>1|a?*9-RB<0NXkS=o6iQ zzC<6RZ@mfVk8cCM&%Xdnzvu?^wf6yiEd=Omp8)P>?2Nx@9O1s{i?`xCw3X6#4y|~k zuUTndq-hVu(i}U-LdgK^lY0onUxNqj<(|NFhUxPK@SH;U&o+2y4ZdpC@Y9E&8&I+a zJ5w!kDE*C}!jMnPZDyH?ugE@}<9q7oI2z zyanEqat_Sw&!2Wj@{R8hQ~&mPR=**`phuW8P}s^pCIh4CA`nZPvHqWNu$Eu2XoYQZ zXP6Y$R=s72|I>=xhJFk7aF(K#F1UFb3Rhrx)T82TXnq-I!XAE=`xgygtx9}>8s(R# z|1vjAO~mgXbRgFOe}~+xtd*CKz$q?9$O`n{48E-J+r@q@iKZQXFQX|JZ5gX?>S*iS z$#Vbi{-Ybq1kCs=(G?voHH6;4CG1NRhtPP2%1~6{w0^`4l_3p}W6RFi=~}&_(?Z z-h+WpWmwfl;=jLK{B~U=G2+>6LquxIy9#Z|wjJB??G*OevejXTb@ z%&D{5HCv!X&lk70oO|K;?h!i!fWRvUOz~ zAKQPqUFem*N*}H4sJN(~4XkW4?Q;6h2ZSD1(i5Ch*S&VJJ~{Z~@{#%?@2Ufys?W+k z+SA(NG|V=cBYc-C%u!C+Q~=9pq3~5zs@hX~v!8f+ea$AP@kn7$@Ox#hs=fLrEr-fm zTMn1>_?^c2z^ba3+au?tqe3gW+@mKYQti2kxjDU){#WY{^hI=f&H%gQh&YqZtg9H2kZIdA8=>ns;l? zIo~~z6LT#xay2sYpUB9^k&!Erkq;sx!{Nbs1N@aR5OK4_~ z2=TxUCtEJy1{&~yBJeoa3j81l2C8SZYiT#iewlW@?)7ko;`zW(d6#0IFJfv`QN8Ke zTJyZLGRQ@`sV+5G-}YcV&uka39URC935 z?oa$oEJf)iT!Ynw^>(D0SB=cI1X~a;aLlKb7OCB^S#h+b-~vH8Ra`HPbNpkbuj_P4 z7t2}Jnsv;WUD&KwEt3^l$|^a()1v%Ag;@cz>=1v zrMwZgu0P~24j$>^vLob{gc$5r%P3riOMxyM!ae#$^HYlq75+P3GG} z8PJM|5B2hFq)}9nAnVaO?mGA-7Mck?I-D+dNSHNGj0kbsURM;{xp7-@h-Eeo)$kyB JSnk3%@L$n3er) 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%0AmlmIu_Zu{GADqo&$T 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 T7+m=P6P=Mcm#V6(zZ(|-PfiJ% diff --git a/group08/619057560/2-26/code/com/coding/basic/ArrayList.java b/group08/619057560/2-26/code/com/coding/basic/ArrayList.java deleted file mode 100644 index 5fe3123515..0000000000 --- a/group08/619057560/2-26/code/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - if (size + 1 > elementData.length) { - elementData = Arrays.copyOf(elementData, elementData.length * 3 / 2 + 1); - } - elementData[size++] = o; - } - public void add(int index, Object o){ - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - - if (size + 1 > elementData.length) { - elementData = Arrays.copyOf(elementData, elementData.length * 3 / 2 + 1); - } - - System.arraycopy(elementData, index, elementData, index+1, size-index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - - return elementData[index]; - } - - public Object remove(int index){ - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - - Object old = elementData[index]; - size--; - System.arraycopy(elementData, index+1, elementData, index, size-index); - elementData[size] = null; - - return old; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new Itr(); - } - - private class Itr implements Iterator { - - int cursor = 0; - - @Override - public boolean hasNext() { - return (cursor < size); - } - - @Override - public Object next() { - if (cursor < 0 || cursor >= size) { - throw new NoSuchElementException(); - } - return elementData[cursor++]; - } - - } - -} diff --git a/group08/619057560/2-26/code/com/coding/basic/BinaryTreeNode.java b/group08/619057560/2-26/code/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index af940807e6..0000000000 --- a/group08/619057560/2-26/code/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - if (data == null || ((Integer)data).intValue() == ((Integer)o).intValue()) { - data = o; - return this; - } - else if (((Integer)o).intValue() < ((Integer)data).intValue()) { - if (left == null) { - left = new BinaryTreeNode(); - } - return left.insert(o); - } - else { - if (right == null) { - right = new BinaryTreeNode(); - } - return right.insert(o); - } - } - -} diff --git a/group08/619057560/2-26/code/com/coding/basic/Iterator.java b/group08/619057560/2-26/code/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/group08/619057560/2-26/code/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group08/619057560/2-26/code/com/coding/basic/LinkedList.java b/group08/619057560/2-26/code/com/coding/basic/LinkedList.java deleted file mode 100644 index d2f1422cfb..0000000000 --- a/group08/619057560/2-26/code/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - Node pNewNode = new Node(); - pNewNode.data = o; - - Node pNode = head; - - if (head == null) { - head = pNewNode; - return; - } - - while (pNode.next != null) { - pNode = pNode.next; - } - - pNode.next = pNewNode; - } - - public void add(int index , Object o){ - if (index < 0 && index > size()) { - throw new IndexOutOfBoundsException(); - } - - Node pNewNode = new Node(); - pNewNode.data = o; - - if (index == 0) { - pNewNode.next = head; - head = pNewNode; - return; - } - - Node pNode = head; - while (--index > 0) { - pNode = pNode.next; - } - pNewNode.next = pNode.next; - pNode.next = pNewNode; - } - - public Object get(int index){ - if (index < 0 && index >= size()) { - throw new IndexOutOfBoundsException(); - } - - Node pNode = head; - while (index-- > 0) { - pNode = pNode.next; - } - - return pNode.data; - } - - public Object remove(int index){ - if (index < 0 && index >= size()) { - throw new IndexOutOfBoundsException(); - } - - Node pNode = head; - if (index == 0) { - head = head.next; - return pNode.data; - } - - while (--index > 0) { - pNode = pNode.next; - } - Node pTargetNode = pNode.next; - pNode.next = pTargetNode.next; - - return pTargetNode.data; - } - - public int size(){ - Node pNode = head; - int num = 0; - while (pNode != null) { - pNode = pNode.next; - num++; - } - return num; - } - - public void addFirst(Object o){ - add(0, o); - } - - public void addLast(Object o){ - add(o); - } - - public Object removeFirst(){ - if (head == null) { - throw new NoSuchElementException(); - } - return remove(0); - } - - public Object removeLast(){ - if (head == null) { - throw new NoSuchElementException(); - } - - Node pNode = head; - Node pPrevNode = null; - while (pNode.next != null) { - pPrevNode = pNode; - pNode = pNode.next; - } - if (pPrevNode != null) { - pPrevNode.next = pNode.next; - } - else { - head = null; - } - return pNode.data; - } - - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group08/619057560/2-26/code/com/coding/basic/List.java b/group08/619057560/2-26/code/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/group08/619057560/2-26/code/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group08/619057560/2-26/code/com/coding/basic/Queue.java b/group08/619057560/2-26/code/com/coding/basic/Queue.java deleted file mode 100644 index 67a080f408..0000000000 --- a/group08/619057560/2-26/code/com/coding/basic/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList queueList = new LinkedList(); - - public void enQueue(Object o){ - queueList.addFirst(o); - } - - public Object deQueue(){ - return queueList.removeLast(); - } - - public boolean isEmpty(){ - return queueList.size() == 0; - } - - public int size(){ - return queueList.size(); - } -} diff --git a/group08/619057560/2-26/code/com/coding/basic/Stack.java b/group08/619057560/2-26/code/com/coding/basic/Stack.java deleted file mode 100644 index 481c88bed7..0000000000 --- a/group08/619057560/2-26/code/com/coding/basic/Stack.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - return elementData.remove(elementData.size()-1); - } - - public Object peek(){ - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group08/619057560/2-26/code/com/coding/test/Main.java b/group08/619057560/2-26/code/com/coding/test/Main.java deleted file mode 100644 index c4b5b4b74d..0000000000 --- a/group08/619057560/2-26/code/com/coding/test/Main.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.coding.test; - -import com.coding.basic.ArrayList; -import com.coding.basic.BinaryTreeNode; -import com.coding.basic.Iterator; -import com.coding.basic.LinkedList; -import com.coding.basic.Queue; -import com.coding.basic.Stack; - -public class Main { - - private static void printArrayList(ArrayList list) { - for (int i = 0; i < list.size(); i++) { - System.out.println(list.get(i)); - } - Iterator itr = list.iterator(); - while (itr.hasNext()) { - System.out.println(itr.next()); - } - } - - private static void printLinkedList(LinkedList list) { - for (int i = 0; i < list.size(); i++) { - System.out.println(list.get(i)); - } - } - - private static void printBinaryTree(BinaryTreeNode node) { - if (node == null) - return; - - printBinaryTree(node.getLeft()); - if (node.getData() != null) - System.out.println(node.getData()); - printBinaryTree(node.getRight()); - } - - private static void testArrayList() { - ArrayList arrayList = new ArrayList(); - arrayList.add(new Integer(1)); - arrayList.add(new Integer(2)); - arrayList.add(new Integer(3)); - arrayList.remove(2); - arrayList.add(new Integer(4)); - arrayList.add(0,new Integer(5)); - printArrayList(arrayList); - } - - private static void testLinkedList() { - LinkedList linkedList = new LinkedList(); - linkedList.add(new Integer(1)); - linkedList.add(new Integer(2)); - linkedList.add(new Integer(3)); - linkedList.remove(2); - linkedList.add(new Integer(4)); - linkedList.add(0,new Integer(5)); - linkedList.removeFirst(); - printLinkedList(linkedList); - } - - private static void testStack() { - Stack stack = new Stack(); - stack.push(new Integer(1)); - stack.push(new Integer(2)); - stack.push(new Integer(3)); - System.out.println(stack.peek()); - System.out.println(stack.peek()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - stack.push(new Integer(4)); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - //System.out.println(stack.pop()); - } - - private static void testQueue() { - Queue queue = new Queue(); - queue.enQueue(new Integer(1)); - queue.enQueue(new Integer(2)); - queue.enQueue(new Integer(3)); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - //System.out.println(queue.deQueue()); - } - - private static void testBinaryTree() { - BinaryTreeNode root = new BinaryTreeNode(); - root.insert(new Integer(4)); - root.insert(new Integer(3)); - root.insert(new Integer(5)); - root.insert(new Integer(1)); - root.insert(new Integer(8)); - root.insert(new Integer(2)); - root.insert(new Integer(7)); - root.insert(new Integer(6)); - printBinaryTree(root); - } - - public static void main(String[] args) { - testBinaryTree(); - } -} diff --git a/group08/619057560/CHHSAlex.md b/group08/619057560/CHHSAlex.md deleted file mode 100644 index 8b13789179..0000000000 --- a/group08/619057560/CHHSAlex.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group08/648354678/README.md b/group08/648354678/README.md deleted file mode 100644 index 20b57abd22..0000000000 --- a/group08/648354678/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# 测试上传文件到git -## 第一次上传以作学习 -## QQ:648354678 -### 希望跟大家共同学习进步 \ No newline at end of file diff --git a/group08/649859235/2-26/article.md b/group08/649859235/2-26/article.md deleted file mode 100644 index 556350e58d..0000000000 --- a/group08/649859235/2-26/article.md +++ /dev/null @@ -1,2 +0,0 @@ -文章地址 -http://note.youdao.com/noteshare?id=a0345eff655b1cfc5877cc267452eed0&sub=FE5CD301B3C742269D04973B0DD2393C diff --git a/group08/649859235/2-26/com/vvv/base/ArrayList.java b/group08/649859235/2-26/com/vvv/base/ArrayList.java deleted file mode 100644 index e250afe294..0000000000 --- a/group08/649859235/2-26/com/vvv/base/ArrayList.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.vvv.base; - -public class ArrayList implements IList { - - private static final int DEFAULT_SIZE = 100; - - private int size; - private Object[] data = new Object[DEFAULT_SIZE]; - - @Override - public void add(Object o) { - if (size > data.length) { - increase(); - } - data[size] = o; - size++; - } - - @Override - public void add(int index, Object o) { - check(index); - - if (index > data.length - 1) { - increase(); - } - System.arraycopy(data, index, data, index + 1, size - index); - data[index] = o; - size++; - } - - private void check(int index) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("index: " + index + ", size: " - + size); - } - - private void increase() { - Object[] newData = new Object[DEFAULT_SIZE * 2]; - System.arraycopy(data, 0, newData, 0, size); - data = newData; - } - - @Override - public Object get(int index) { - check(index); - return data[index]; - } - - @Override - public Object remove(int index) { - if (index > 0 && index < size) { - Object d = data[index]; - int diff = size - index - 1; - if (diff > 0) - System.arraycopy(data, index + 1, data, index, size - index - 1); - size--; - data[size] = null; - return d; - } - return null; - } - - @Override - public int size() { - return this.size; - } - -} diff --git a/group08/649859235/2-26/com/vvv/base/BinaryTreeNode.java b/group08/649859235/2-26/com/vvv/base/BinaryTreeNode.java deleted file mode 100644 index a5d5ee1d2a..0000000000 --- a/group08/649859235/2-26/com/vvv/base/BinaryTreeNode.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.vvv.base; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o) { - return null; - } - -} diff --git a/group08/649859235/2-26/com/vvv/base/IList.java b/group08/649859235/2-26/com/vvv/base/IList.java deleted file mode 100644 index 3b449fab3f..0000000000 --- a/group08/649859235/2-26/com/vvv/base/IList.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.vvv.base; - -public interface IList { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group08/649859235/2-26/com/vvv/base/LinkedList.java b/group08/649859235/2-26/com/vvv/base/LinkedList.java deleted file mode 100644 index fa03aba962..0000000000 --- a/group08/649859235/2-26/com/vvv/base/LinkedList.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.vvv.base; - -public class LinkedList implements IList { - private int size; - private Node head; - private Node tail; - - @Override - public void add(Object o) { - Node node = new Node(o); - if (head == null) { - head = node; - tail = node; - } else { - tail.next = node; - node.prev = tail; - tail = node; - } - size++; - } - - @Override - public void add(int index, Object o) { - check(index); - Node node = new Node(o); - Node temp = head; - for (int i = 0; i < index; i++) { - temp = temp.next; - } - if (temp.prev != null && temp.next != null) { - Node prevNode = temp.prev; - prevNode.next = node; - node.prev = prevNode; - node.next = temp; - temp.prev = node; - } else if (temp.prev == null) { - head = node; - temp.prev = node; - node.next = temp; - } else if (temp.next == null) { - temp.next = node; - node.prev = temp; - tail = node; - } - size++; - } - - @Override - public Object get(int index) { - check(index); - Node temp = head; - for (int i = 0; i < index; i++) { - temp = temp.next; - } - return temp.data; - } - - @Override - public Object remove(int index) { - check(index); - Node temp = head; - for (int i = 0; i < index; i++) { - temp = temp.next; - } - Object oldValue = temp.data; - if (temp.prev != null && temp.next != null) { - temp.prev.next = temp.next; - temp.next.prev = temp.prev; - temp = null; - } else if (temp.prev == null) { - head = temp.next; - temp.next.prev = null; - temp = null; - } else if (temp.next == null) { - tail = temp.prev; - temp.prev.next = null; - temp = null; - } - size--; - return oldValue; - } - - public boolean remove(Object obj) { - Node temp = head; - for (int i = 0; i < size; i++) { - if (obj.equals(temp.data)) { - remove(i); - return true; - } - temp = temp.next; - } - return false; - } - - private void check(int index) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("index: " + index + ", size: " - + size); - } - - @Override - public int size() { - return size; - } - - @SuppressWarnings("hiding") - private static class Node { - Object data; - Node next; - Node prev; - - public Node(Object data) { - this.data = data; - } - } - -} diff --git a/group08/649859235/2-26/com/vvv/base/Queue.java b/group08/649859235/2-26/com/vvv/base/Queue.java deleted file mode 100644 index f97bd9d298..0000000000 --- a/group08/649859235/2-26/com/vvv/base/Queue.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.vvv.base; - -public class Queue { - - QueueNode head; - QueueNode tail; - private int size; - - public Queue() { - this.head = null; - this.tail = null; - } - - public void enQueue(Object o) { - if (head == null && tail == null) { - tail = new QueueNode(o); - head = tail; - } else { - QueueNode node = new QueueNode(o); - tail.next = node; - tail = tail.next; - } - size++; - } - - public Object deQueue() { - if (head == null) { - return null; - } - - if (head == tail && tail != null) { - QueueNode node = head; - tail = null; - head = null; - size--; - return node.data; - } - - Object obj = head.data; - head = head.next; - size--; - return obj; - } - - public boolean isEmpty() { - if(head==null && tail == null) - return true; - return false; - } - - public int size() { - return size; - } - -} - -class QueueNode { - Object data; - QueueNode next; - - public QueueNode() { - this(null, null); - } - - public QueueNode(Object data) { - this(data, null); - } - - public QueueNode(Object data, QueueNode next) { - this.data = data; - this.next = next; - } -} diff --git a/group08/649859235/2-26/com/vvv/base/Stack.java b/group08/649859235/2-26/com/vvv/base/Stack.java deleted file mode 100644 index 5e3ed32e14..0000000000 --- a/group08/649859235/2-26/com/vvv/base/Stack.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.vvv.base; - -public class Stack { - private ArrayList data = new ArrayList(); - - public void push(Object o) { - data.add(o); - } - - public Object pop() { - return data.remove(data.size() - 1); - } - - public Object peek() { - if (data.size() > 0) { - return data.get(data.size() - 1); - } - return null; - } - - public boolean isEmpty() { - if (data.size() > 0) - return false; - return true; - } - - public int size() { - return data.size(); - } -} diff --git a/group08/649859235/README.md b/group08/649859235/README.md deleted file mode 100644 index 8b13789179..0000000000 --- a/group08/649859235/README.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group08/729770920/.gitignore b/group08/729770920/.gitignore deleted file mode 100644 index 6b468b62a9..0000000000 --- a/group08/729770920/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.class diff --git a/group08/729770920/2-26/resource/report.txt b/group08/729770920/2-26/resource/report.txt deleted file mode 100644 index f256165498..0000000000 --- a/group08/729770920/2-26/resource/report.txt +++ /dev/null @@ -1,5 +0,0 @@ -CPU是计算机的大脑,由运算器和寄存器组成。可以储存指令和数据,并执行指令进行简单的计算。 -指令是CPU可以直接执行的命令。 -内存是所谓的RAM,读写速度较快。常用来作为CPU和硬盘之间数据交换的缓存。 -硬盘容量极大,但是读写速度比内存慢很多。用来存放程序的二进制码,音频,视频等等数据资源。 -程序运行时,数据由硬盘拷贝到内存,CPU再从内存里加载包含指令的数据,逐一执行。 \ No newline at end of file diff --git a/group08/729770920/2-26/src/com/coding/basic/ArrayList.java b/group08/729770920/2-26/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 1a7cc5a361..0000000000 --- a/group08/729770920/2-26/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size; - - private E[] data; - - public void add(E e){ - add(size, e); - } - - public ArrayList() { - clear(); - } - - public ArrayList(int capacity) { - clear(); - ensureCapacity(capacity); - } - - public void add(int index, E e){ - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(Integer.toString(index)); - } - if (data.length == size) { - ensureCapacity(size + size >> 1 + 1); - } - for (int i = size++; i > index; --i) { - data[i] = data[i - 1]; - } - data[index] = e; - } - - public E get(int index){ - return data[index]; - } - - public E remove(int index){ - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(Integer.toString(index)); - } - E copy = data[index]; - --size; - for (int i = index; i < size; ++i) { - data[i] = data[i + 1]; - } - return copy; - } - - public boolean contains(E e) { - for (int i = 0; i < size; ++i) { - if (data[i] == e) { - return true; - } - } - return false; - } - - public void clear() { - size = 0; - data = (E[]) new Object[0]; - } - - public int size(){ - return size; - } - - public boolean isEmpty() { - return size == 0; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - public void ensureCapacity(int capacity) { - E[] newData = (E[]) new Object[capacity]; - for (int i = 0; i < size; ++i) { - newData[i] = data[i]; - } - data = newData; - } - - public void trimToSize() { - E[] newData = (E[]) new Object[size]; - for (int i = 0; i < size; ++i) { - newData[i] = data[i]; - } - data = newData; - } - - private class ArrayListIterator implements Iterator { - int current = 0; - - public boolean hasNext() { - return current < size; - } - - public E next() { - if (!hasNext()) { - throw new java.util.NoSuchElementException(); - } - return data[current++]; - } - - public void remove() { - ArrayList.this.remove(current); - } - } -} diff --git a/group08/729770920/2-26/src/com/coding/basic/BinaryTree.java b/group08/729770920/2-26/src/com/coding/basic/BinaryTree.java deleted file mode 100644 index 0b41529787..0000000000 --- a/group08/729770920/2-26/src/com/coding/basic/BinaryTree.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.coding.basic; - -public class BinaryTree> { - BinaryTreeNode root = null; - - public BinaryTree() { - } - - public boolean isEmpty() { - return root == null; - } - - public void insert(E e) { - root = insert(root, e); - } - - private BinaryTreeNode insert(BinaryTreeNode node, E e) { - if (node == null) { - node = new BinaryTreeNode(e, null, null); - } - int compareResult = ((Comparable) e).compareTo(node.data); - if (compareResult < 0) { - node.left = insert(node.left, e); - } else if (compareResult > 0) { - node.right = insert(node.right, e); - } - return node; - } - - public void clear() { - root = null; - } - - public boolean contains(E e) { - return contains(root, e); - } - - private boolean contains(BinaryTreeNode node, E e) { - if (node == null) { - return false; - } - int compareResult = ((Comparable) e).compareTo(node.data); - if (compareResult < 0) { - return contains(node.left, e); - } else if (compareResult > 0) { - return contains(node.right, e); - } - // matching - return true; - } - - private BinaryTreeNode findMin(BinaryTreeNode node) { - if (node != null) { - while (node.left != null) { - node = node.right; - } - } - return node; - } - - private BinaryTreeNode findMax(BinaryTreeNode node) { - if (node != null) { - while (node.right != null) { - node = node.right; - } - } - return node; - } - - public void remove(E e) { - root = remove(root, e); - } - - private BinaryTreeNode remove(BinaryTreeNode node, E e) { - if (node == null) { - return node; - } - int compareResult = ((Comparable) e).compareTo(node.data); - if (compareResult < 0) { - node.left = remove(node.left, e); - } else if (compareResult > 0) { - node.right = remove(node.right, e); - } - // matching - if (node.left != null && node.right != null) { // two children - node.data = (E) findMax(node.right).data; - node.right = remove(node.right, node.data); - } else { // one child - node = (node.left != null) ? node.left : node.right; - } - return node; - } - - private class BinaryTreeNode { - E data; - BinaryTreeNode left; - BinaryTreeNode right; - - public BinaryTreeNode(E e, BinaryTreeNode l, BinaryTreeNode r) { - data = e; - left = l; - right = r; - } - } -} diff --git a/group08/729770920/2-26/src/com/coding/basic/Iterator.java b/group08/729770920/2-26/src/com/coding/basic/Iterator.java deleted file mode 100644 index f0e2eddde8..0000000000 --- a/group08/729770920/2-26/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - boolean hasNext(); - - E next(); - - void remove(); -} diff --git a/group08/729770920/2-26/src/com/coding/basic/LinkedList.java b/group08/729770920/2-26/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 899e0be08e..0000000000 --- a/group08/729770920/2-26/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - private int size = 0; - private Node head = new Node<>(); - private Node tail = new Node<>(); - - public LinkedList() { - head.next = tail; - tail.prev = head; - } - - public void add(E e) { - addLast(e); - } - - public void add(int index, E e) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(Integer.toString(index)); - } - Node cursor; - if (index < size/2) { - cursor = head; - for (int i = 0, num = index; i < num; ++i) { - cursor = cursor.next; - } - } else { - cursor = tail.prev; - for (int i = 0, num = size-index; i < num; ++i) { - cursor = cursor.prev; - } - } - cursor.next = cursor.next.prev = new Node(e, cursor, cursor.next); - ++size; - } - - public E get(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(Integer.toString(index)); - } - Node cursor; - if (index < size/2) { - cursor = head.next; - for (int i = 0; i < index; ++i) { - cursor = cursor.next; - } - } else { - cursor = tail.prev; - for (int i = 0, num = size-index-1; i < num; ++i) { - cursor = cursor.prev; - } - } - return cursor.data; - } - - public E remove(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(Integer.toString(index)); - } - Node cursor; - if (index < size/2) { - cursor = head.next; - for (int i = 0; i < index; ++i) { - cursor = cursor.next; - } - } else { - cursor = tail.prev; - for (int i = 0, num = size-index-1; i < num; ++i) { - cursor = cursor.prev; - } - } - cursor.prev.next = cursor.next; - cursor.next.prev = cursor.prev; - --size; - return cursor.data; - } - - public int size() { - return size; - } - - public boolean isEmpty() { - return size == 0; - } - - public void addFirst(E e) { - add(0, e); - } - - public void addLast(E e) { - add(size, e); - } - - public E removeFirst() { - return remove(0); - } - - public E removeLast() { - return remove(size-1); - } - - public void clear() { - while (!isEmpty()) { - removeFirst(); - } - } - - public boolean contains(E e) { - Iterator it = this.iterator(); - while (it.hasNext()) { - if (it.next() == e) { - return true; - } - } - return false; - } - - public Iterator iterator() { - return new LinkedListIterator(); - } - - private static class Node { - E data = null; - Node prev = null; - Node next = null; - - public Node() { - } - - public Node(E e, Node p, Node n) { - data = e; - prev = p; - next = n; - } - } - - private class LinkedListIterator implements Iterator { - Node currentNode = head.next; - - public boolean hasNext() { - return currentNode != tail; - } - - public E next() { - if (!hasNext()) { - throw new java.util.NoSuchElementException(); - } - E data = currentNode.data; - currentNode = currentNode.next; - return data; - } - - public void remove() { - if (!hasNext()) { - throw new java.util.NoSuchElementException(); - } - Node nextNode = currentNode.next; - currentNode.next.prev = currentNode.prev; - currentNode.prev.next = currentNode.next; - currentNode = nextNode; - --size; - } - } -} diff --git a/group08/729770920/2-26/src/com/coding/basic/List.java b/group08/729770920/2-26/src/com/coding/basic/List.java deleted file mode 100644 index babed5a71f..0000000000 --- a/group08/729770920/2-26/src/com/coding/basic/List.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public interface List { - void add(E e); - - void add(int index, E e); - - void clear(); - - E get(int index); - - E remove(int index); - - int size(); - - boolean contains(E e); - - Iterator iterator(); -} diff --git a/group08/729770920/2-26/src/com/coding/basic/Queue.java b/group08/729770920/2-26/src/com/coding/basic/Queue.java deleted file mode 100644 index a660ad6729..0000000000 --- a/group08/729770920/2-26/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList data = new LinkedList<>(); - - public void enQueue(E e){ - data.addFirst(e); - } - - public Object deQueue() { - return data.removeLast(); - } - - public boolean isEmpty() { - return data.size() == 0; - } - - public int size(){ - return data.size(); - } -} diff --git a/group08/729770920/2-26/src/com/coding/basic/Stack.java b/group08/729770920/2-26/src/com/coding/basic/Stack.java deleted file mode 100644 index c7e7773de5..0000000000 --- a/group08/729770920/2-26/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.basic; - -public class Stack { - private LinkedList data = new LinkedList<>(); - - public void push(E e) { - data.addFirst(e); - } - - public Object pop() { - return data.removeFirst(); - } - - public Object peek() { - return data.get(0); - } - - public boolean isEmpty() { - return data.size() == 0; - } - - public int size() { - return data.size(); - } -} diff --git a/group08/729770920/README.md b/group08/729770920/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/group08/769638826/2-27/ArrayList.java b/group08/769638826/2-27/ArrayList.java deleted file mode 100644 index 1e6ccfcfcb..0000000000 --- a/group08/769638826/2-27/ArrayList.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -/** - * Created by huitailang on 17/2/25. - * - * @author zhangkun - * @date 2017年02月25日13:23:30 - */ -public class ArrayList implements List { - private int size = 0; - private static final int DEFAULT_SIZE = 16; - private Object[] elementData = null; - private int index; - - public ArrayList() { - elementData = new Object[DEFAULT_SIZE]; - } - - public ArrayList(final int size) { - elementData = new Object[size]; - } - - public void add(Object o) { - //如果当前元素个数大于数组长度的2/3 - if (size() > elementData.length * 2 / 3) { - raiseArray(); - } - - elementData[index++] = o; - size++; - } - - public void add(int index, Object o) { - checkParam(index); - - //如果当前元素个数大于数组长度的2/3 - if (size() > elementData.length * 2 / 3) { - raiseArray(); - } - - elementData[index] = o; - size++; - } - - public Object get(int index) { - checkParam(index); - - return elementData[index]; - } - - public Object remove(int index) { - checkParam(index); - - Object o = elementData[index]; - elementData[index] = null; - size--; - return o; - } - - private void raiseArray() { - Object[] newElementData = Arrays.copyOf(elementData, size() * 2); - elementData = newElementData; - } - - private void checkParam(int index) { - if (index < 0 || index > elementData.length - 1) { - throw new IndexOutOfBoundsException(); - } - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new ListIterator(); - } - - private class ListIterator implements Iterator{ - int cursor; - - @Override - public boolean hasNext() { - return cursor != size; - } - - public void remove(){ - throw new UnsupportedOperationException(); - } - - @Override - public Object next() { - if(!hasNext()) { - throw new NoSuchElementException(); - } - - int i = cursor; - if (i >= size) - throw new NoSuchElementException(); - - Object[] elementData = ArrayList.this.elementData; - - cursor = i + 1; - - return elementData[i]; - } - } -} diff --git a/group08/769638826/2-27/ArrayListTest.java b/group08/769638826/2-27/ArrayListTest.java deleted file mode 100644 index 199e3d14cb..0000000000 --- a/group08/769638826/2-27/ArrayListTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.coding.basic; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by huitailang on 17/2/25. - * test arraylist - */ -public class ArrayListTest { - ArrayList arrayList = null; - - @Before - public void setUp() { - arrayList = new ArrayList(); - } - - @Test - public void testArrayLength() { - int[] array = new int[10]; - Assert.assertEquals(10, array.length); - } - - @Test - public void testAddElement() { - arrayList.add(11); - Assert.assertEquals(11, arrayList.get(0)); - printElementSize(arrayList); - - for (int i = 0; i < 18; i++) { - - } - } - - @Test - public void testAriseArray() { - for (int i = 0; i < 18; i++) { - arrayList.add(i + 1); - } - - Assert.assertEquals(18, arrayList.size()); - - for (int i = 0; i < 18; i++) { - System.out.println(arrayList.get(i)); - } - } - - @Test - public void testRemoveElement() { - for (int i = 0; i < 18; i++) { - arrayList.add(i + 1); - } - - Assert.assertEquals(18, arrayList.size()); - - arrayList.remove(17); - - Assert.assertEquals(17, arrayList.size()); - - for (int i = 0; i < 18; i++) { - System.out.println(arrayList.get(i)); - } - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testInValidGet() { - arrayList.get(19); - } - - private void printElementSize(ArrayList arrayList) { - System.out.println("array size => " + arrayList.size()); - } -} diff --git a/group08/769638826/2-27/Iterator.java b/group08/769638826/2-27/Iterator.java deleted file mode 100644 index ce3da0d118..0000000000 --- a/group08/769638826/2-27/Iterator.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding.basic; - -/** - * Created by huitailang on 17/2/25. - * - * @author zhangkun - * @date 2017年02月25日16:25:42 - */ -public interface Iterator { - public boolean hasNext(); - - public Object next(); -} diff --git a/group08/769638826/2-27/LinkedList.java b/group08/769638826/2-27/LinkedList.java deleted file mode 100644 index 981822c43e..0000000000 --- a/group08/769638826/2-27/LinkedList.java +++ /dev/null @@ -1,190 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -/** - * Created by huitailang on 17/2/25. - * - * @author zhangkun - * @date 2017年02月25日13:57:58 - */ -public class LinkedList implements List { - private Node head; - private int size; - - public LinkedList() { - head = null; - size = 0; - } - - @Override - public void add(Object o) { - if (head == null) { - Node newNode = new Node(); - newNode.data = o; - head = newNode; - } - - Node oldhead = head; - head = new Node(); - head.data = o; - head.next = oldhead; - size++; - } - - @Override - public void add(int index, Object o) { - Node newNode = new Node(); - newNode.data = o; - - if (head == null) { - head = newNode; - } - - if (index < 1 || index > size + 1) { - throw new IllegalArgumentException("invalid index, it's should be 1 and" + size + 1); - } - - if (index == 1) { - newNode.next = head; - } else { - Node currentNode = head; - int count = 1; - while (count < index - 1) { - count++; - currentNode = currentNode.next; - } - newNode.next = currentNode.next; - currentNode.next = newNode; - } - } - - @Override - public Object get(int index) { - if (head == null) { - return null; - } - - if (index == 1) { - return head.next.data; - } else { - Node currentNode = head; - int count = 1; - while (count < index - 1) { - count++; - currentNode = currentNode.next; - } - - return currentNode.next.data; - } - } - - @Override - public Object remove(int index) { - Object result = null; - - if (index < 1 || index > size) { - throw new IllegalArgumentException("invalid index, it's should be 1 and " + size); - } - - if (index == 1) { - Node currentNode = head.next; - head = null; - return currentNode; - } else { - Node prevNode = head; - - int count = 1; - while (count < index - 1) { - prevNode = prevNode.next; - count++; - } - Node currentNode = prevNode.next; - prevNode.next = currentNode.next; - result = currentNode.data; - currentNode = null; - } - - return result; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object o) { - add(1, o); - } - - public void addLast(Object o) { - add(size + 1, o); - } - - public Object removeFirst() { - return remove(1); - } - - public Object removeLast() { - return remove(size); - } - - public Iterator iterator() { - return new ListIterator(); - } - - public void print() { - if (head == null) { - System.out.println("No elements in the list!"); - } - - Node currentNode = head; - while (currentNode != null) { - System.out.println(currentNode.data + "->"); - currentNode = currentNode.next; - } - - System.out.println(); - } - - public int length() { - int count = 0; - - Node currentNode = head; - while (currentNode != null) { - count++; - currentNode = currentNode.next; - } - - return count; - } - - private static class Node { - Object data; - Node next; - } - - private class ListIterator implements Iterator { - private Node current = head; - - @Override - public boolean hasNext() { - return current != null; - } - - public void remove() { - throw new UnsupportedOperationException(); - } - - @Override - public Object next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - - Object o = current.data; - current = current.next; - return o; - } - } -} diff --git a/group08/769638826/2-27/LinkedListTest.java b/group08/769638826/2-27/LinkedListTest.java deleted file mode 100644 index 786e5d93a7..0000000000 --- a/group08/769638826/2-27/LinkedListTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic; - -/** - * Created by huitailang on 17/2/25. - * @author zhangkun - * @date 2017年02月25日17:33:40 - */ -public class LinkedListTest { - -} diff --git a/group08/769638826/2-27/List.java b/group08/769638826/2-27/List.java deleted file mode 100644 index e9eba47da6..0000000000 --- a/group08/769638826/2-27/List.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -/** - * Created by huitailang on 17/2/25. - * - * @author zhangkun - * @date 2017年02月25日13:54:33 - */ -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group08/769638826/2-27/Queue.java b/group08/769638826/2-27/Queue.java deleted file mode 100644 index abb7e57112..0000000000 --- a/group08/769638826/2-27/Queue.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coding.basic; - -/** - * Created by huitailang on 17/2/25. - * @author zhangkun - * @date 2017年02月25日17:40:02 - */ -public class Queue { - private ArrayList elementData = new ArrayList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - return elementData.get(size()); - } - - public boolean isEmpty(){ - return elementData.size() != 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group08/769638826/2-27/QueueTest.java b/group08/769638826/2-27/QueueTest.java deleted file mode 100644 index 83ee1ff30a..0000000000 --- a/group08/769638826/2-27/QueueTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic; - -/** - * Created by huitailang on 17/2/25. - * @author zhangkun - * @date 2017年02月25日17:44:48 - */ -public class QueueTest { - -} diff --git a/group08/769638826/2-27/Stack.java b/group08/769638826/2-27/Stack.java deleted file mode 100644 index 46f80bc25d..0000000000 --- a/group08/769638826/2-27/Stack.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -/** - * Created by huitailang on 17/2/25. - * @author zhangkun - * @date 2017年02月25日17:34:22 - */ -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - Object o = elementData.get(1); - elementData.remove(1); - return o; - } - - public Object peek(){ - return elementData.get(1); - } - - public boolean isEmpty(){ - return elementData.size() != 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group08/769638826/2-27/StackTest.java b/group08/769638826/2-27/StackTest.java deleted file mode 100644 index 5380bbaa0c..0000000000 --- a/group08/769638826/2-27/StackTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -/** - * Created by huitailang on 17/2/25. - * @author zhangkun - * @date 2017年02月25日17:44:32 - */ -public class StackTest { -} diff --git a/group08/769638826/README.md b/group08/769638826/README.md deleted file mode 100644 index ff11754584..0000000000 --- a/group08/769638826/README.md +++ /dev/null @@ -1 +0,0 @@ -###2017编程能力提高群 diff --git a/group08/782476895/20170225/ArrayList.java b/group08/782476895/20170225/ArrayList.java deleted file mode 100644 index 7b94eebd36..0000000000 --- a/group08/782476895/20170225/ArrayList.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.sl.test20170221; - -import java.util.Arrays; - -public class ArrayList implements List{ - - private int size = 0; - - private Object[] elementData = new Object[100]; - - @Override - public void add(Object o) { - grow(elementData); - elementData[size] = o; - } - - @Override - public void add(int index, Object o) { - grow(elementData); - for(int i = size - 1;i >= index;i--){ - elementData[i+1] = elementData[i]; - } - elementData[index] = o; - } - - @Override - public Object get(int index) { - return elementData[index]; - } - - @Override - public Object remove(int index) { - size--; - for(int i = index;i < size;i++){ - elementData[i] = elementData[i+1]; - } - elementData[size] = null; - return elementData; - } - - @Override - public int size() { - - return size; - } - - private void grow(Object[] elementData){ - size++; - if(size >= elementData.length){ - int newSize = elementData.length + 100; - elementData = Arrays.copyOf(elementData, newSize); - } - } - -} diff --git a/group08/782476895/20170225/LinkedList.java b/group08/782476895/20170225/LinkedList.java deleted file mode 100644 index 30ba21046f..0000000000 --- a/group08/782476895/20170225/LinkedList.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.sl.test20170221; - -public class LinkedList implements List{ - private Node root; - int index; - - public void addNode(String name){ - if(root == null){ - root = new Node(name); - }else{ - root.add(name); - } - } - - - - - class Node{ - Object data; - Node next; - - - Node(Object data){ - this.data = data; - } - //添加节点 - public void add(Object data){ - if(this.next == null){ - this.next = new Node(data); - }else{ - this.next.add(data); - } - } - //删除节点 - public Object del(int i){ - if(this.next != null){ - index++; - if(i == index){ - this.next = this.next.next; - return this.next.data; - }else{ - this.next.del(i); - } - } - return null; - } - - - //遍历 - public void traversal(){ - if(this.next != null){ - index++; - this.next.traversal(); - } - } - //指定位置增加 - public void add(int i, Object o){ - if(this.next != null){ - if(i == index){ - Node node = new Node(data); - node.next = this.next.next; - this.next = node; - return ; - }else{ - this.next.add(i,o); - } - index++; - } - } - - //得到指定的节点 - public Object get(int i){ - if(this.next != null){ - - if(i == index){ - return this.data; - }else{ - this.next.get(i); - } - index++; - } - return null; - } - - } - - @Override - public void add(Object data) { - if(root == null){ - root = new Node(data); - }else{ - root.add(data); - } - } - - @Override - public void add(int index, Object o) { - if(root != null){ - root.add(index, o); - } - } - - @Override - public Object get(int index) { - if(root.next != null){ - return root.get(index); - } - return null; - } - - @Override - public Object remove(int index) { - if(root != null){ - return root.del(index); - } - return null; - } - - @Override - public int size() { - if(root != null){ - root.traversal(); - } - return index; - } - -} diff --git a/group08/782476895/20170225/List.java b/group08/782476895/20170225/List.java deleted file mode 100644 index 08160598b8..0000000000 --- a/group08/782476895/20170225/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sl.test20170221; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group08/782476895/20170225/Queue.java b/group08/782476895/20170225/Queue.java deleted file mode 100644 index 3c4a3c8256..0000000000 --- a/group08/782476895/20170225/Queue.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.sl.test20170221; - -import com.sl.test20170221.LinkedList.Node; - -public class Queue { - - private Node first; - private int index; - - class Node{ - Object data; - Node next; - - - Node(Object data){ - this.data = data; - } - //添加节点 - public void add(Object data){ - if(this.next == null){ - this.next = new Node(data); - }else{ - this.next.add(data); - } - } - - //遍历 - public void traversal(){ - if(this.next != null){ - index++; - this.next.traversal(); - } - } - } - - public void enQueue(Object o){ - if(first != null){ - first.add(o); - } - } - - public Object deQueue(){ - if(first != null){ - Object obj = first.data; - first = first.next; - return obj; - } - return null; - } - - public boolean isEmpty(){ - if(first == null){ - return true; - }else{ - return false; - } - } - - public int size(){ - if(first != null){ - first.traversal(); - } - return index; - } -} diff --git a/group08/782476895/20170225/Stack.java b/group08/782476895/20170225/Stack.java deleted file mode 100644 index 50739dc7f3..0000000000 --- a/group08/782476895/20170225/Stack.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.sl.test20170221; - -public class Stack { - private List elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - int size = elementData.size(); - Object obj = elementData.remove(size--); - return obj; - } - - public Object peek(){ - int size = elementData.size(); - return elementData.get(size - 1); - } - public boolean isEmpty(){ - int size = elementData.size(); - if(size == 0){ - return true; - }else{ - return false; - } - } - public int size(){ - return elementData.size(); - } -} diff --git "a/group08/782476895/20170225/\346\217\217\350\277\260CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" "b/group08/782476895/20170225/\346\217\217\350\277\260CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" deleted file mode 100644 index 0449ce2f366f7c09c20bdcabf8f7fc9cd4ff6b7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6797 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 size) return null; - return array[i]; - } - - public int size() { - return size; - } - - public void remove(int i) { - if (i < 0 || i >= size) return; - for (int j = i; j < size; j++) { - array[j] = array[j + 1]; - } - --size; - } - public boolean isEmpty() { - return size == 0; - } -} diff --git a/group08/875325254/2-26/LinkList.java b/group08/875325254/2-26/LinkList.java deleted file mode 100644 index a6b785ee79..0000000000 --- a/group08/875325254/2-26/LinkList.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Created by Great on 2017/2/24. - */ -public class LinkList { - private class Node{ - Node next; - int data; - } - private Node rear; - private Node top; - private int size = 0; - public void add(int e) { - if (rear == null) { - rear = new Node(); - top = rear; - }else { - rear.next = new Node(); - rear = rear.next; - } - rear.data = e; - ++size; - } - - public Integer getReciprocal(int count) { - if (top == null || count < 1) return null; - Node node = top; - int size = 0; - while( node.next != null) { - node = node.next; - size++; - } - if (size+1 < count) return null; - return get(size+1-count); - } - - public Integer get(int i) { - if (i < 0 || i >= size) return null; - return getNode(i).data; - } - - public void remove(int i) { - if (i < 0 || i >= size) return; - if (i == 0 ) { - top = top.next; - return; - } - if (i == size - 1) { - getNode(i - 1).next = null; - } - Node front = getNode(i - 1); - Node back = getNode(i + 1); - front.next = back; - --size; - } - - private Node getNode(int i) { - if (i < 0 || i >= size) return null; - Node node = top; - for (int j = 0; j < size; j++) { - if (j == i) return node; - node = node.next; - } - return null; - } - - public int size() { - return size; - } - - public boolean isEmpty() { - return size == 0; - } -} diff --git a/group08/875325254/2-26/Queue.java b/group08/875325254/2-26/Queue.java deleted file mode 100644 index 6e3b80d7d2..0000000000 --- a/group08/875325254/2-26/Queue.java +++ /dev/null @@ -1,41 +0,0 @@ -import java.util.Arrays; - -/** - * Created by Great on 2017/2/23. - */ -public class Queue { - private class Node{ - Node next; - int data; - } - private int size; - private Node front; - private Node rear; - public void add(int e) { - if (front == null) { - front = new Node(); - rear = front; - }else { - front.next = new Node(); - front = front.next; - } - front.data = e; - ++size; - } - - public Integer poll() { - if (rear == null) return null; - int data = rear.data; - rear = rear.next; - --size; - return data; - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group08/875325254/2-26/Stack.java b/group08/875325254/2-26/Stack.java deleted file mode 100644 index 78b9884ccb..0000000000 --- a/group08/875325254/2-26/Stack.java +++ /dev/null @@ -1,29 +0,0 @@ -import java.util.Arrays; - -/** - * Created by Great on 2017/2/23. - */ -public class Stack { - private final int DEFAULT_SIZE = 20; - private int base; - private int top; - private int[] array = new int[DEFAULT_SIZE]; - public void push(Integer e) { - if (top == array.length){ - array = Arrays.copyOf(array, array.length + DEFAULT_SIZE); - } - array[top] = e; - ++top; - } - public Integer pop(){ - if (top == 0) return null; - top--; - return array[top]; - } - public int size() { - return top; - } - public boolean isEmpty(){ - return top == 0; - } -} diff --git a/group08/875325254/2-26/Test.java b/group08/875325254/2-26/Test.java deleted file mode 100644 index b397fd3e16..0000000000 --- a/group08/875325254/2-26/Test.java +++ /dev/null @@ -1,35 +0,0 @@ -import java.util.List; - -/** - * Created by Great on 2017/2/23. - */ -public class Test { - public static void main(String[] args) { - ArrayList arrayList = new ArrayList(); - LinkList linkList = new LinkList(); - Queue queue = new Queue(); - Stack stack = new Stack(); - for (int i = 0; i < 10; i++) { - arrayList.add(i); - linkList.add(i); - queue.add(i); - stack.push(i); - } - System.out.println("ArrayList:"); - for (int i = 0; i < arrayList.size(); i++) { - System.out.println(arrayList.get(i)); - } - System.out.println("LinkList:"); - for (int i = 0; i < linkList.size(); i++) { - System.out.println(linkList.get(i)); - } - System.out.println("Queue:"); - while (!queue.isEmpty()) { - System.out.println(queue.poll()); - } - System.out.println("Stack:"); - while (!stack.isEmpty()) { - System.out.println(stack.pop()); - } - } -} diff --git a/group08/875325254/875325254.md b/group08/875325254/875325254.md deleted file mode 100644 index 8b13789179..0000000000 --- a/group08/875325254/875325254.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group08/group08.md b/group08/group08.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group08/group08.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group09/group09.md b/group09/group09.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group09/group09.md +++ /dev/null @@ -1 +0,0 @@ - diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java" deleted file mode 100644 index 620e8ead95..0000000000 --- "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java" +++ /dev/null @@ -1,119 +0,0 @@ -package com.coding.basic; - -import java.lang.reflect.Array; -import java.util.Arrays; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData; - - //默认容量 - private static final int DEFAULT_CAPACITY = 10; - - public ArrayList(int capacity){ - if(capacity >= 0){ - elementData = new Object[capacity]; - }else { - throw new IllegalArgumentException("Illegal Capacity: " + - capacity); - } - - } - public ArrayList(){ - this(DEFAULT_CAPACITY); - } - - /** - * 保证集合容量 - * @param minCapacity - */ - private void ensureCapacity(int minCapacity){ - int oldCapacity = elementData.length; - if(minCapacity > oldCapacity){ - //扩容 - int newCapacity = oldCapacity + (oldCapacity >> 1) + 1; - if(minCapacity - newCapacity > 0){ - newCapacity = minCapacity; - } - elementData = Arrays.copyOf(elementData, newCapacity); - } - } - private void checkIndexRange(int index) - { - if(index >= size || index < 0) - { - throw new IndexOutOfBoundsException("Index out of bounds, index : " + index); - } - } - public void add(E o){ - ensureCapacity(size+1); - elementData[size++] = o; - } - public void add(int index, E o){ - checkIndexRange(index);//检查下标 - ensureCapacity(size+1);//保证数组容量 - System.arraycopy(elementData,index,elementData,index + 1,size-index);//数组复制,把index后的元素全部向后移一位 - elementData[index] = o;//插入元素值 - size++;//元素size加一 - } - - @Override - public E get(int index) { - checkIndexRange(index);//检查下标 - return (E)elementData[index]; - } - - @Override - public E remove(int index) { - E e = this.get(index); - int numMoved = size - index - 1; - if(numMoved > 0) - { - System.arraycopy(elementData, index+1, elementData, index, numMoved);//数组复制,把index后的元素全部向前移一位 - } - elementData[--size] = null;//最后一位赋值为null,size-1 - return e; - } - - - public int size(){ - return size; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - public Iterator iterator(){ - return new ArrayListIterator(this); - } - - private class ArrayListIterator implements Iterator{ - - private Object [] array; - private int endIndex = 0; - private int index = 0; - - public ArrayListIterator(ArrayList list){ - this.array=list.elementData; - this.endIndex = list.size(); - } - @Override - public boolean hasNext() { - return this.index < this.endIndex; - } - - @Override - public E next() { - if(!this.hasNext()) { - throw new NoSuchElementException();//没有元素了 - } else { - return (E)Array.get(this.array, this.index++); - } - } - } -} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/BinaryTreeNode.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/BinaryTreeNode.java" deleted file mode 100644 index a1653b6e9f..0000000000 --- "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/BinaryTreeNode.java" +++ /dev/null @@ -1,68 +0,0 @@ -package com.coding.basic; - - -public class BinaryTreeNode implements Comparable { - public BinaryTreeNode(Object data) { - this.data = data; - } - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o) { - //左子节点的值永远比父节点的值小 - //右子节点的值永远比父节点的值大 - BinaryTreeNode node = new BinaryTreeNode(o); - insertNode(node); - return node; - } - private void insertNode(BinaryTreeNode node){ - insertNode(this,node); - } - private void insertNode(BinaryTreeNode parentNode, BinaryTreeNode node) { - if (parentNode.compareTo(node) <= 0) {//数字大于父节点 - if (parentNode.right == null) { - parentNode.right = node; - return; - } - insertNode(parentNode.right, node); - } else { - if (parentNode.left == null) { - parentNode.left = node; - return; - } - insertNode(parentNode.left, node); - } - } - - @Override - public int compareTo(BinaryTreeNode o) { - Integer i = (Integer) this.data; - return i.compareTo((Integer) o.data); - } -} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Iterator.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Iterator.java" deleted file mode 100644 index 09e5b73661..0000000000 --- "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Iterator.java" +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public E next(); -} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/JavaTest.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/JavaTest.java" deleted file mode 100644 index 208fa8390d..0000000000 --- "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/JavaTest.java" +++ /dev/null @@ -1,62 +0,0 @@ -package com.coding.basic; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by Mori on 2017/2/21. - */ -public class JavaTest { - @Test - public void testBinaryTreeNode(){ - BinaryTreeNode node = new BinaryTreeNode(5); - node.insert(4);//左 - node.insert(7);//右 - node.insert(2);//左左 - node.insert(6);//右左 - node.insert(5);//右左左 - node.insert(6);//右左右 - System.out.println(node.getData()); - System.out.println(node.getLeft().getData()); - System.out.println(node.getRight().getData()); - System.out.println(node.getLeft().getLeft().getData()); - System.out.println(node.getRight().getLeft().getData()); - System.out.println(node.getRight().getLeft().getLeft().getData()); - System.out.println(node.getRight().getLeft().getRight().getData()); - } - @Test - public void testArrayList(){ - ArrayList list =new ArrayList<>(); - list.add(1); - list.add(2); - list.add(3); - list.add(5); - Assert.assertEquals((Object) list.get(2),3); - Assert.assertEquals((Object) list.remove(2),3); - Assert.assertEquals((Object) list.get(2),5); - Iterator listIterator = list.iterator(); - while (listIterator.hasNext()){ - System.out.println(listIterator.next()); - } - } - @Test - public void testLinkedList(){ - LinkedList linkedList = new LinkedList<>(); - linkedList.add(1); - linkedList.add(2); - linkedList.add(5); - linkedList.addFirst(10); - linkedList.add(1,6); - // linkedList.removeLast(); - //linkedList.removeFirst(); - Iterator linkedListIterator = linkedList.iterator(); - while (linkedListIterator.hasNext()){ - System.out.println(linkedListIterator.next()); - } - System.out.println("----"); - System.out.println(linkedList.remove(0)); - System.out.println(linkedList.remove(2)); - //System.out.println(linkedList.get(3)); - //System.out.println(linkedList.get(4)); - } -} \ No newline at end of file diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java" deleted file mode 100644 index 760fec91e9..0000000000 --- "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java" +++ /dev/null @@ -1,165 +0,0 @@ -package com.coding.basic; - -import jdk.nashorn.internal.ir.ReturnNode; - -import java.lang.reflect.Array; -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head;//链表的头 - private Node tail;//链表的结尾 - private int size;//记录当前元素的size - - public void add(E e) { - Node node = new Node(e); - if (head == null) { - head = node; - } else { - tail.next = node; - } - tail = node; - tail.next = null; - size++; - } - - private void checkIndexRange(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - } - - public void add(int index, E e) { - checkIndexRange(index); - Node node = new Node(e); - Node temp = head; - Node temp2 = null; - for (int i = 0; i < index - 1; i++) { - temp = temp.next; - } - temp2 = temp.next; - temp.next = node; - node.next = temp2; - size++; - } - - @Override - public E get(int index) { - checkIndexRange(index); - Node temp = head; - - for (int i = 0; i < index; i++) { - temp = temp.next; - } - return (E) temp.data; - } - - @Override - public E remove(int index) { - checkIndexRange(index); - if (index == 0) { - E e = removeFirst(); - return e; - } - if (index == size) { - E e = removeLast(); - return e; - } - Node temp = head; - Node temp2 = null; - for (int i = 0; i < index - 1; i++) { - temp = temp.next; - } - E e = (E) temp.next.data; - temp2 = temp.next.next; - temp.next = null; - temp.next = temp2; - size--; - return e; - } - - public int size() { - return size; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - public void addFirst(E e) { - Node node = new Node(e); - node.next = head; - head = node; - size++; - } - - public void addLast(E e) { - this.add(e); - } - - public E removeFirst() { - E e = (E) head.data; - head = head.next; - size--; - return e; - } - - public E removeLast() { - Node temp = head; - for (int i = 0; i < size - 1; i++) { - temp = temp.next; - } - temp.next = null; - E e = (E) tail.data; - tail = temp; - size--; - return e; - } - - public Iterator iterator() { - return new LinkedListIterator(this); - } - - private static class Node { - E data; - Node next; - public Node(E e) { - this.data = e; - } - } - private class LinkedListIterator implements Iterator{ - - private Node head;//链表的头 - private Node tail;//链表的结尾 - private Node node;//当前遍历的node - private int index; - private int endIndex; - - public LinkedListIterator(LinkedList list){ - this.head=list.head; - this.tail=list.tail; - this.endIndex = list.size(); - node=head; - } - @Override - public boolean hasNext() { - return this.index < this.endIndex; - } - - @Override - public E next() { - if(!this.hasNext()) { - throw new NoSuchElementException();//没有元素了 - } else { - if(index == 0){ - node = head; - }else { - node = node.next; - } - index++; - return (E)node.data; - } - } - } -} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/List.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/List.java" deleted file mode 100644 index 899ba2bd3e..0000000000 --- "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/List.java" +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(E o); - public void add(int index, E o); - public E get(int index); - public E remove(int index); - public int size(); - boolean isEmpty(); -} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Queue.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Queue.java" deleted file mode 100644 index a8d5741846..0000000000 --- "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Queue.java" +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList elementData = new LinkedList(); - - /** - * 进队列 - * @param o - */ - public void enQueue(E o){ - elementData.addLast(o);//添加到队尾 - } - - /** - * 出队列 - * @return - */ - public E deQueue(){ - return elementData.removeFirst();//移除队首 - } - - public boolean isEmpty(){ - return elementData.isEmpty(); - } - - public int size(){ - return elementData.size(); - } -} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Stack.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Stack.java" deleted file mode 100644 index de407c8548..0000000000 --- "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Stack.java" +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - public void push(E o){ - elementData.add(o); - } - - /** - * 移除栈顶并返回他 - * @return - */ - public E pop(){ - return elementData.remove(elementData.size()-1); - } - /** - * 得到栈顶元素 - * @return - */ - public E peek(){ - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return elementData.isEmpty(); - } - public int size(){ - return elementData.size(); - } -} diff --git a/group10/205301442/src/com/coding/week1/ArrayList.java b/group10/205301442/src/com/coding/week1/ArrayList.java deleted file mode 100644 index db50f7ef46..0000000000 --- a/group10/205301442/src/com/coding/week1/ArrayList.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.coding.week1; - - - - -public class ArrayList implements List{ - private int size = 0; - - private Object[] elementData = {}; - - public void add(Object o){ - extendIndex(); - elementData[size] = o; - size++; - } - public void add(int index, Object o){ - - if(index>size){ - System.out.println("Exception in thread \""+Thread.currentThread()+"\" java.lang.IndexOutOfBoundsException:Index:"+index+",Size:"+size); - return; - } - int length = elementData.length; - if(size==elementData.length){ - length=elementData.length+1; - } - Object[] newElement = new Object[length]; - System.arraycopy(elementData, 0, newElement, 0, index); - System.arraycopy(elementData, index, newElement,index+1,size-index ); - newElement[index]=o; - elementData = newElement; - size++; - } - - public Object get(int index){ - boolean isRange=rangeCheck(index); - if(!isRange){ - return null; - } - return elementData[index]; - } - - public Object remove(int index){ - boolean isRange=rangeCheck(index); - if(!isRange){ - return null; - } - Object rmData = elementData[index]; - Object[] newElement = new Object[elementData.length]; - System.arraycopy(elementData, 0, newElement, 0, index);; - System.arraycopy(elementData, index+1, newElement,index,size-index-1 ); - elementData = newElement; - size--; - return rmData; - } - - public int size(){ - return size; - } - - public com.coding.week1.Iterator iterator(){ - return new Ito(); - } - public boolean rangeCheck(int index){ - - if(index>size-1||index<0){ - System.err.println("Exception in thread \""+Thread.currentThread()+"\" java.lang.IndexOutOfBoundsException:Index:"+index+",Size:"+size); - return false; - } - return true; - } - public void extendIndex(){ - Object[] newElement = new Object[elementData.length+1]; - System.arraycopy(elementData, 0, newElement, 0, size); - elementData = newElement; - - } - public class Ito implements com.coding.week1.Iterator{ - int cursor; - @Override - public boolean hasNext() { - if(cursor!=size){ - return true; - } - return false; - } - - @Override - public Object next() { - Object o=elementData[cursor]; - cursor++; - return o; - } - } - - -} diff --git a/group10/205301442/src/com/coding/week1/BinaryTreeNode.java b/group10/205301442/src/com/coding/week1/BinaryTreeNode.java deleted file mode 100644 index 547e09d42f..0000000000 --- a/group10/205301442/src/com/coding/week1/BinaryTreeNode.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.coding.week1; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - public BinaryTreeNode(Object data){ - this.data = data; - } - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - BinaryTreeNode newBTN = new BinaryTreeNode(o); - Integer insert = (Integer)o; - - BinaryTreeNode cursor = this; - while(true){ - if(insert.compareTo((Integer)cursor.data)==-1){ - if(cursor.left==null){ - cursor.left = newBTN; - break; - } - cursor = cursor.left; - }else if(insert.compareTo((Integer)cursor.data)==1){ - if(cursor.right==null){ - cursor.right = newBTN; - break; - } - cursor = cursor.right; - } - } - return newBTN; - } - -} diff --git a/group10/205301442/src/com/coding/week1/Iterator.java b/group10/205301442/src/com/coding/week1/Iterator.java deleted file mode 100644 index 7f6f333443..0000000000 --- a/group10/205301442/src/com/coding/week1/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.week1; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group10/205301442/src/com/coding/week1/LinkedList.java b/group10/205301442/src/com/coding/week1/LinkedList.java deleted file mode 100644 index 2c14a0e9cb..0000000000 --- a/group10/205301442/src/com/coding/week1/LinkedList.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.coding.week1; - -public class LinkedList implements List { - private int size; - private Node first; - private Node last; - public static class Node{ - Object data; - Node next; - Node prev; - public Node(Node prev,Object data,Node next){ - this.data = data; - this.next = next; - this.prev = prev; - } - } - - @Override - public void add(Object o) { - final Node l = last; - Node newNode = new Node(last,o,null); - last = newNode; - if(first==null){ - first = newNode; - }else{ - l.next = newNode; - } - size++; - - } - - @Override - public void add(int index, Object o) { - - if(index>size){ - System.out.println("Exception in thread \""+Thread.currentThread()+"\" java.lang.IndexOutOfBoundsException:Index:"+index+",Size:"+size); - return; - } - Node newNode = new Node(null,o,null); - Node nodePre = node(index-1); - Node oldNode = node(index); - if(nodePre!=null){ - nodePre.next =newNode; - newNode.prev = nodePre; - }else{ - first = newNode; - } - if(oldNode!=null){ - oldNode.prev = newNode; - newNode.next = oldNode; - }else{ - last = newNode; - } - size++; - } - - @Override - public Object get(int index) { - if(!rangeCheck(index)){ - return null; - } - - return node(index).data; - } - - @Override - public Object remove(int index) { - if(!rangeCheck(index)){ - return null; - } - Node prevNode = node(index-1); - Node nextNode = node(index+1); - Node rmNode = node(index); - if(prevNode!=null){ - prevNode.next = nextNode; - }else{ - first=nextNode; - } - if(nextNode!=null){ - nextNode.prev = prevNode; - }else{ - last = prevNode; - } - size--; - return rmNode.data; - } - - @Override - public int size() { - // TODO Auto-generated method stub - return size; - } - public Object head(){ - return first.data; - } - public Object last(){ - return last.data; - } - public void addFirst(Object o){ - add(0,o); - } - public void addLast(Object o){ - add(size,o); - } - public Object removeFirst(){ - Node f = first; - remove(0); - return f.data; - } - public Object removeLast(){ - Node l = last; - remove(size-1); - return l.data; - } - public Node node(int index){ - if(index<0){ - return null; - } - Node x =null; - if(index<(size<<1)){ - x = first; - for(int i=0;iindex;i--){ - x = x.prev; - } - } - return x; - } - public boolean rangeCheck(int index){ - - if(index>size-1||index<0){ - System.err.println("Exception in thread \""+Thread.currentThread()+"\" java.lang.IndexOutOfBoundsException:Index:"+index+",Size:"+size); - return false; - } - return true; - } - public Ito iterator(){ - return new Ito(); - } - public class Ito implements Iterator{ - int cursor; - @Override - public boolean hasNext() { - if(cursor!=size){ - return true; - } - return false; - } - - @Override - public Object next() { - Object o=node(cursor).data; - cursor++; - return o; - } - - } -} diff --git a/group10/205301442/src/com/coding/week1/List.java b/group10/205301442/src/com/coding/week1/List.java deleted file mode 100644 index e06b7c8ab9..0000000000 --- a/group10/205301442/src/com/coding/week1/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.week1; - -public interface List { - public void add(Object o); - public void add(int index,Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group10/205301442/src/com/coding/week1/Queue.java b/group10/205301442/src/com/coding/week1/Queue.java deleted file mode 100644 index e3c4a44a42..0000000000 --- a/group10/205301442/src/com/coding/week1/Queue.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.week1; - -public class Queue { - ArrayList list = new ArrayList(); - public void enQueue(Object o){ - list.add(o); - } - - public Object deQueue(){ - return list.remove(0); - } - - public boolean isEmpty(){ - if(list.size()==0){ - return true; - } - return false; - } - - public int size(){ - return list.size(); - } -} diff --git a/group10/205301442/src/com/coding/week1/Stack.java b/group10/205301442/src/com/coding/week1/Stack.java deleted file mode 100644 index 307b3630df..0000000000 --- a/group10/205301442/src/com/coding/week1/Stack.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.week1; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - int top = elementData.size()-1; - return elementData.remove(top); - } - - public Object peek(){ - int top = elementData.size()-1; - return elementData.get(top); - } - public boolean isEmpty(){ - if(elementData.size()==0){ - return true; - } - return false; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group10/205301442/test/com/coding/week1/AllTests.java b/group10/205301442/test/com/coding/week1/AllTests.java deleted file mode 100644 index fb54214d4d..0000000000 --- a/group10/205301442/test/com/coding/week1/AllTests.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.coding.week1; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@SuiteClasses({ TestArrayList.class, TestLinkedList.class, TestQueue.class, TestStack.class,TestBiranyTreeNode.class }) -public class AllTests { - -} diff --git a/group10/205301442/test/com/coding/week1/TestArrayList.java b/group10/205301442/test/com/coding/week1/TestArrayList.java deleted file mode 100644 index 0c7040d335..0000000000 --- a/group10/205301442/test/com/coding/week1/TestArrayList.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coding.week1; - -import static org.junit.Assert.*; -import org.junit.Test; - -public class TestArrayList { - ArrayList arrayList =new ArrayList(); - - @Test - public void Test(){ - //add - arrayList.add("MM"); - arrayList.add(1,"YY"); - arrayList.add(2,"ZZ"); - //get - assertEquals((String)arrayList.get(0), "MM"); - assertEquals(arrayList.size(),3 ); - //remove - assertEquals(arrayList.remove(2), "ZZ"); - assertEquals(arrayList.size(),2 ); - //iterator - Iterator ito = arrayList.iterator(); - int i=0; - while(ito.hasNext()){ - assertEquals(ito.next(), arrayList.get(i)); - i++; - } - } - - -} diff --git a/group10/205301442/test/com/coding/week1/TestBiranyTreeNode.java b/group10/205301442/test/com/coding/week1/TestBiranyTreeNode.java deleted file mode 100644 index 5968ebf562..0000000000 --- a/group10/205301442/test/com/coding/week1/TestBiranyTreeNode.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coding.week1; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class TestBiranyTreeNode { - - @Test - public void test() { - BinaryTreeNode node = new BinaryTreeNode(5); - node.insert(2); - node.insert(7); - node.insert(1); - node.insert(6); - System.out.println(" "+node.getData()); - System.out.println(" "+node.getLeft().getData()+" "+node.getRight().getData()); - System.out.println(node.getLeft().getLeft().getData()+" null "+node.getRight().getLeft().getData()+" null"); - } - -} diff --git a/group10/205301442/test/com/coding/week1/TestLinkedList.java b/group10/205301442/test/com/coding/week1/TestLinkedList.java deleted file mode 100644 index db6524ac53..0000000000 --- a/group10/205301442/test/com/coding/week1/TestLinkedList.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coding.week1; - -import static org.junit.Assert.*; - - -import org.junit.Test; - -public class TestLinkedList { - LinkedList linkedList = new LinkedList(); - - @Test - public void test() { - //add - linkedList.add("AA"); - linkedList.add(0,"BB"); - linkedList.add(1,"CC"); - linkedList.add(3,"DD"); - - assertEquals(linkedList.get(0), "BB"); - assertEquals(linkedList.get(1), "CC"); - assertEquals(linkedList.get(2), "AA"); - assertEquals(linkedList.last(), "DD"); - //add first last - linkedList.addFirst("EE"); - assertEquals(linkedList.get(0), "EE"); - linkedList.addLast("FF"); - assertEquals(linkedList.get(5), "FF"); - //remove - assertEquals(linkedList.remove(1), "BB"); - assertEquals(linkedList.removeFirst(), "EE"); - assertEquals(linkedList.removeLast(), "FF"); - //iterator - Iterator ito = linkedList.iterator(); - int i=0; - while(ito.hasNext()){ - assertEquals(linkedList.get(i), ito.next()); - i++; - } - assertEquals(i, linkedList.size()); - } - -} diff --git a/group10/205301442/test/com/coding/week1/TestQueue.java b/group10/205301442/test/com/coding/week1/TestQueue.java deleted file mode 100644 index 525eaf5886..0000000000 --- a/group10/205301442/test/com/coding/week1/TestQueue.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coding.week1; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class TestQueue { - - @Test - public void test() { - Queue queue = new Queue(); - queue.enQueue("MM"); - assertEquals(queue.deQueue(), "MM"); - assertEquals(queue.isEmpty(), true); - } - -} diff --git a/group10/205301442/test/com/coding/week1/TestStack.java b/group10/205301442/test/com/coding/week1/TestStack.java deleted file mode 100644 index ababf23df6..0000000000 --- a/group10/205301442/test/com/coding/week1/TestStack.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.week1; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class TestStack { - - @Test - public void test() { - Stack stack = new Stack(); - stack.push("AA"); - stack.push("BB"); - stack.push("CC"); - stack.push("DD"); - assertEquals(stack.pop(), "DD"); - assertEquals(stack.pop(), "CC"); - assertEquals(stack.peek(), "BB"); - assertEquals(stack.size(), 2); - assertEquals(stack.isEmpty(),false); - } - -} diff --git "a/group10/205301442/\346\226\207\347\253\240\345\234\260\345\235\200.txt" "b/group10/205301442/\346\226\207\347\253\240\345\234\260\345\235\200.txt" deleted file mode 100644 index fab8d99a58..0000000000 --- "a/group10/205301442/\346\226\207\347\253\240\345\234\260\345\235\200.txt" +++ /dev/null @@ -1 +0,0 @@ -first week http://blog.csdn.net/kellyfun/article/details/57504808 \ No newline at end of file diff --git a/group10/3314793852/.classpath b/group10/3314793852/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group10/3314793852/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group10/3314793852/.gitignore b/group10/3314793852/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group10/3314793852/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group10/3314793852/.project b/group10/3314793852/.project deleted file mode 100644 index e09255853a..0000000000 --- a/group10/3314793852/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - FirstWeek - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group10/3314793852/src/myList/MyArrayList.java b/group10/3314793852/src/myList/MyArrayList.java deleted file mode 100644 index 7b5a883190..0000000000 --- a/group10/3314793852/src/myList/MyArrayList.java +++ /dev/null @@ -1,103 +0,0 @@ -package myList; - -/* - * ArrayListĵײһ飬ͨ´ķ̬ - * ArrayListղݡ - */ - -public class MyArrayList { - private int theSize; //ǰС - private static final int DEFAULT_CAPACITY=10; //Ĭ - private Object[] theArr=new Object[10]; //ײ - - //ʼ - public MyArrayList(){ - clear(); - } - - // - public void clear(){ - theSize=0; - capacityBigger(DEFAULT_CAPACITY); - } - - //ȡС - public int size(){ - return theSize; - } - - //ȡײ - public Object[] getArr(){ - return theArr; - - } - //룬ֱӲ뵽β - public void add(Object a){ - add(theSize, a); - } - - //±ȡ - public Object get(int i){ - if(i<0||i>=theSize){ - throw new ArrayIndexOutOfBoundsException(); - } - return theArr[i]; - } - - //룬ָ±롣 - public void add(int i,Object a){ - - if(theSize==theArr.length){ //ʼΪ10ÿɹһʱsize+1,sizeĴСͬʱ󷽷̬ĴС - capacityBigger(size()); - } - for(int j=theSize-1;j>=i;j--){ - theArr[j+1]=theArr[j]; - } - theArr[i]=a; - - theSize++; - } - - //ɾ,±ɾݡ - public void remove(int i){ - - for(int j=i;j0){ - return contains(x,aNode.left); - } - else if(comparaResult<0){//ݴڵǰڵʱӦڵǰڵҺӽڵС - return contains(x,aNode.right); - } - else{ //ݵڵǰڵʱӦڵǰڵС - return true; - } - } - - //ݡ - public void insert(Object x){ - root=insert(x,root); - } - - public BinaryNode insert(Object x,BinaryNode aNode){ - - if(aNode==null){//ǰΪµݽڵ㣬ΪҶӽڵ㣬ҽڵΪnull. - return new BinaryNode(x,null,null); - } - - //͵ǰĽڵбȽϡ - Integer comparaResult=(Integer)aNode.element-(Integer)x; - - //СڵǰڵʱӦڵǰڵӽڵС - if(comparaResult>0){ - aNode.left= insert(x,aNode.left); - } - else if(comparaResult<0){//ݴڵǰڵʱӦڵǰڵҺӽڵС - aNode.right=insert(x,aNode.right); - } - else{ //ݵڵǰڵʱӦڵǰڵ,κβ - ; - } - return aNode; - } - - //ӡ - public void getData(){ - getData(root); - } - public void getData(BinaryNode root){ - if (root != null) { - // - this.getData(root.left); - - //Һ - this.getData(root.right); - //ڵ - this.print(root); - } - - } - - //ӡڵ㡣 - public void print(BinaryNode root){ - System.out.println( - (Integer)(root.element) - ); - } - } diff --git a/group10/3314793852/src/myList/MyIterator.java b/group10/3314793852/src/myList/MyIterator.java deleted file mode 100644 index 8c97809af8..0000000000 --- a/group10/3314793852/src/myList/MyIterator.java +++ /dev/null @@ -1,40 +0,0 @@ - - package myList; - - public class MyIterator { - - private Object aData; - private int i=0; - private int l=0; - MyLinkedList.Node node; - public MyIterator(Object aDate){ - this.aData=aDate; - } - - public boolean hasNext(){ - if(aData instanceof MyArrayList){//MyArrayListIterator - - Object[] arr=((MyArrayList) aData).getArr(); - int a=((MyArrayList)aData).size(); - return a>i; - } - else{//MyLinkedListIterator - node=((MyLinkedList)aData).getHeadNode();//ͷڵ - int a=((MyLinkedList)aData).size(); - return a>l; - } - - - } - public Object next(){ - if(aData instanceof MyArrayList){//MyArrayListIterator - - Object[] arr=((MyArrayList) aData).getArr(); - return arr[++i]; - } - else{//MyLinkedListIterator - l++; - return node.getDate(); - } - } - } diff --git a/group10/3314793852/src/myList/MyLinkedList.java b/group10/3314793852/src/myList/MyLinkedList.java deleted file mode 100644 index 0bad8c8953..0000000000 --- a/group10/3314793852/src/myList/MyLinkedList.java +++ /dev/null @@ -1,122 +0,0 @@ - package myList; - - /* - * õͷڵġ - */ - - public class MyLinkedList { - - private int theSize; //ĴС - private Node headNode; //ͷڵ - - //ڵࡣ - public static class Node{ - - private Object data; - private Node node; - - public Node(){ - - } - - public Node(Object data, Node node) { - this.data = data; - this.node = node; - } - public Object getDate(){ - return data; - } - - } - - //췽ʼʱһͷڵĿյ - public MyLinkedList(){ - clear(); - } - - //ͷڵ - public Node getHeadNode(){ - return headNode; - } - - // - public void clear(){ - headNode=new Node(null,null); //ͷʼdateָnodeȫΪnull. - theSize=0; //ĴС - } - - //ȡĴС - public int size(){ - return theSize; - } - - //ӽڵ㵽β - public void add(Object aData){ - add(theSize+1,aData); - } - - //ӽڵ㵽ָλá - public void add(int idx,Object aDate){ - - //һµĽڵ - Node newNode=new Node(); - newNode.data=aDate; - - //ҵָλõĽڵ㣬½ڵ嵽ָλýڵǰһλá - Node p,q; - p=headNode; - - for(int i=1;i(arr.length-1)){//tailѾβʱͷΪʱµ뵽ͷ - tail=0; - } - theSize++; - } - } - - //pop,С - public Object pop(){ - Object a=null; - if(theSize!=0){ //ΪգܽгеIJ - a=arr[head]; - arr[head]=null; - head++; - if(head>(arr.length-1)){ - head=0; - } - theSize--; - } - return a; - } - - //ӡС - public void print(){ - for(int i=0;i - - - - - - - diff --git a/group10/353261578/.gitignore b/group10/353261578/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group10/353261578/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group10/353261578/.project b/group10/353261578/.project deleted file mode 100644 index 251ba32e96..0000000000 --- a/group10/353261578/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 353261578Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group10/353261578/src/com/sx/structures/BinaryNode.java b/group10/353261578/src/com/sx/structures/BinaryNode.java deleted file mode 100644 index a5d2e45bdd..0000000000 --- a/group10/353261578/src/com/sx/structures/BinaryNode.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.sx.structures; - -public class BinaryNode implements Comparable{ - private Object data; - private BinaryNode left; - private BinaryNode right; - - public BinaryNode() { - } - public BinaryNode(Object o){ - data = o; - left = null; - right = null; - } - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryNode getLeft() { - return left; - } - public void setLeft(BinaryNode left) { - this.left = left; - } - public BinaryNode getRight() { - return right; - } - public void setRight(BinaryNode right) { - this.right = right; - } - @Override - public int compareTo(BinaryNode o) { - Integer to = (Integer)this.data; - Integer co = (Integer)o.data; - if(toco) - return 1; - return 0; - } -} diff --git a/group10/353261578/src/com/sx/structures/BinaryTree.java b/group10/353261578/src/com/sx/structures/BinaryTree.java deleted file mode 100644 index 7af8f8edd5..0000000000 --- a/group10/353261578/src/com/sx/structures/BinaryTree.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.sx.structures; - -public class BinaryTree { - - private BinaryNode root; - - public BinaryTree(Object o) { - root = new BinaryNode(o); - } - - public void insert(Object o) { - BinaryNode node = new BinaryNode(o); - insert(root, node); - } - - private void insert(BinaryNode root, BinaryNode node) { - if (node.compareTo(root) > 0) { - if (root.getRight() == null) { - root.setRight(node); - return; - } - insert(root.getRight(), node); - } else { - if (root.getLeft() == null) { - root.setLeft(node); - return; - } - insert(root.getLeft(), node); - } - - } - - public void preOrder(BinaryNode root){ - order(root); - if(root.getLeft()!=null) - preOrder(root.getLeft()); - if(root.getRight()!=null) - preOrder(root.getRight()); - } - - public void postOrder(BinaryNode root){ - if(root.getLeft()!=null) - postOrder(root.getLeft()); - if(root.getRight()!=null) - postOrder(root.getRight()); - order(root); - } - - public void inOrder(BinaryNode root){ - if(root.getLeft()!=null) - inOrder(root.getLeft()); - order(root); - if(root.getRight()!=null) - inOrder(root.getRight()); - } - - /** - * 未实现 - * @param root - * @param node - * @return - */ - private boolean remove(BinaryNode root, BinaryNode node){ - return false; - } - - public BinaryNode getRoot(){ - return root; - } - - private void order(BinaryNode root){ - System.out.print(root.getData()+" "); - } -} diff --git a/group10/353261578/src/com/sx/structures/Iterator.java b/group10/353261578/src/com/sx/structures/Iterator.java deleted file mode 100644 index 9965e652bc..0000000000 --- a/group10/353261578/src/com/sx/structures/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.sx.structures; - -public interface Iterator { - boolean hasNext(); - Object next(); -} diff --git a/group10/353261578/src/com/sx/structures/MyArrayList.java b/group10/353261578/src/com/sx/structures/MyArrayList.java deleted file mode 100644 index 952776b5cb..0000000000 --- a/group10/353261578/src/com/sx/structures/MyArrayList.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.sx.structures; - -public class MyArrayList implements MyList { - - private int size; - private int ex=10; - private int last=-1; - private Object [] arr; - - public MyArrayList() { - size = 10; - arr = new Object[size]; - } - - @Override - public void add(Object o) { - last++; - if(last==size){ - size += ex; - Object[] temp = new Object[size]; - System.arraycopy(arr, 0, temp, 0, arr.length); - arr = temp; - } - arr[last]=o; - } - - @Override - public void add(int index, Object o) { - add(o); - for(int i=arr.length-1;i>index;i--) - arr[i]=arr[i-1]; - arr[index]=o; - } - - @Override - public Object get(int index) { - return arr[index]; - } - - @Override - public Object remove(int index) { - Object element = arr[index]; - for(int i=index;ilist.size()) - return false; - return true; - } - - @Override - public Object next() { - if(hasNext()) - return list.get(p-1); - return -1; - } - - } - -} diff --git a/group10/353261578/src/com/sx/structures/MyLinkedList.java b/group10/353261578/src/com/sx/structures/MyLinkedList.java deleted file mode 100644 index 3d9932ee92..0000000000 --- a/group10/353261578/src/com/sx/structures/MyLinkedList.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.sx.structures; - -public class MyLinkedList implements MyList{ - private Node head; - private int size = 0; - - public MyLinkedList() { - head = new Node(); - } - @Override - public void add(Object o) { - Node node = createNode(o); - Node pre = head; - while(pre.next!=null){ - pre = pre.next; - } - pre.next = node; - size++; - } - - @Override - public void add(int index, Object o) { - if(index < 0){ - System.out.println("����Խ��");return; - } - Node node = createNode(o); - Node pointer = head; - while(index>0){ - pointer = pointer.next; - index--; - } - node.next = pointer.next; - pointer.next = node; - size++; - } - - @Override - public Object get(int index) { - Node pointer = head; - while(index>=0){ - pointer = pointer.next; - index--; - } - return pointer.data; - } - - @Override - public Object remove(int index) { - Object data = null; - Node pre = head; - while(index>0){ - pre = pre.next; - index--; - } - data = pre.next.data; - pre.next = pre.next.next; - size--; - return data; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object o){ - add(0, o); - } - public void addLast(Object o){ -// Node node = createNode(o); -// Node p = head; -// while(p.next!=null) -// p = p.next; -// p.next = node; -// size++; - add(o); - } - public Object removeFirst(){ - return remove(0); - } - public Object removeLast(){ - Object data = null; - Node re = head; - Node pre = head; - while(re.next!=null){ - re = re.next; - pre = re; - } - data = re.data; - re=null; - pre.next = null; - size--; - return data; - } - private Node createNode(Object o){ - Node node = new Node(); - node.data=o; - return node; - } - private static class Node{ - Object data = null; - Node next = null; - } - -} diff --git a/group10/353261578/src/com/sx/structures/MyList.java b/group10/353261578/src/com/sx/structures/MyList.java deleted file mode 100644 index c880f5c8ff..0000000000 --- a/group10/353261578/src/com/sx/structures/MyList.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sx.structures; - -public interface MyList { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group10/353261578/src/com/sx/structures/MyQueue.java b/group10/353261578/src/com/sx/structures/MyQueue.java deleted file mode 100644 index 9d0cf9018b..0000000000 --- a/group10/353261578/src/com/sx/structures/MyQueue.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sx.structures; - -public class MyQueue { - private MyLinkedList elements ; - public MyQueue() { - elements = new MyLinkedList(); - } - - public void enQueue(Object o){ - elements.add(o); - } - - public Object deQueue(){ - return elements.removeFirst(); - } - - public boolean isEmpty(){ - if(size()>0) - return false; - return true; - } - public int size(){ - return elements.size(); - } -} diff --git a/group10/353261578/src/com/sx/structures/MyStack.java b/group10/353261578/src/com/sx/structures/MyStack.java deleted file mode 100644 index b81930604d..0000000000 --- a/group10/353261578/src/com/sx/structures/MyStack.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sx.structures; - -public class MyStack { - private int pointer; - private MyArrayList element; - public MyStack() { - element = new MyArrayList(); - pointer = -1; - } - - public void push(Object o){ - pointer++; - element.add(pointer); - } - public Object pop(){ - if(pointer<0) - return -1; - Object p = element.get(pointer); - pointer--; - return p; - } - /** - *只返回栈顶元素 - * @return - */ - public Object peek(){ - if(pointer<0) - return -1; - return element.get(pointer); - } - public boolean isEmpty(){ - if(pointer<0) - return true; - return false; - } - -} diff --git a/group10/353261578/test/com/test/BinaryTreeTest.java b/group10/353261578/test/com/test/BinaryTreeTest.java deleted file mode 100644 index 714c71798c..0000000000 --- a/group10/353261578/test/com/test/BinaryTreeTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.test; - - -import org.junit.Test; - -import com.sx.structures.BinaryTree; - -public class BinaryTreeTest { - - private BinaryTree bt; - - @Test - public void test() { - bt = new BinaryTree(55); - bt.insert(23); - bt.insert(44); - bt.insert(16); - bt.insert(78); - bt.insert(99); - //先序 - System.out.println("先序遍历:"); - bt.preOrder(bt.getRoot()); - //中序遍历 - System.out.println("\n中序遍历:"); - bt.inOrder(bt.getRoot()); - //后序 - System.out.println("\n后序遍历:"); - bt.postOrder(bt.getRoot()); - } - -} diff --git a/group10/353261578/test/com/test/MyArrayListTest.java b/group10/353261578/test/com/test/MyArrayListTest.java deleted file mode 100644 index 9c8369f91b..0000000000 --- a/group10/353261578/test/com/test/MyArrayListTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.test; - - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.sx.structures.MyArrayList; -import com.sx.structures.MyList; - -public class MyArrayListTest { - - private MyArrayList list ; - - @Test - public void testAddObject() { - for(int j=0;j<12;j++){ - list.add(j); - } - } - - @Test - public void testAddIntObject() { - list.add(5, 12); - list.add(10, 11); - } - - @Test - public void testGet() { - System.out.println(list.get(5)); - } - - @Test - public void testRemove() { - System.out.println("\nremoved 5:"+list.remove(5)+"."); - } - - @Test - public void testSize() { - System.out.println("\nlist.size:"+list.size()); - } - - @After - public void Print(){ - System.out.println("最终结果:List:"); - PrintList(list); - } - @Before - public void createlist(){ - list = new MyArrayList(); - for(int j=0;j<12;j++){ - list.add(j); - } - System.out.println("初始list:"); - PrintList(list); - } - - public static void PrintList(MyList list){ - for (int i = 0; i < list.size(); i++) { - System.out.print(list.get(i)+" "); - } - } - -} diff --git a/group10/353261578/test/com/test/MyLinkedListTest.java b/group10/353261578/test/com/test/MyLinkedListTest.java deleted file mode 100644 index 62dcbbc8d1..0000000000 --- a/group10/353261578/test/com/test/MyLinkedListTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.test; - - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.sx.structures.MyLinkedList; -import com.sx.structures.MyList; - -public class MyLinkedListTest { - - private MyLinkedList list; - - @Test - public void testAddObject() { - list.add(3); - } - - @Test - public void testAddIntObject() { - list.add(0,"t-0"); - list.add(1, "t-1"); - } - - @Test - public void testGet() { - System.out.println(list.get(1)); - } - - @Test - public void testRemove() { - list.remove(0); - } - - @Test - public void testSize() { - System.out.println(); - System.out.println(" list-size="+list.size()); - } - - @Test - public void testAddFirst() { - list.addFirst("t-1"); - } - - @Test - public void testAddLast() { - list.addLast("T-last"); - } - - @Test - public void testRemoveFirst() { - list.removeFirst(); - } - - @Test - public void testRemoveLast() { - list.removeLast(); - } - - @After - public void Print(){ - System.out.println("\n操作之后,List:"); - PrintList(list); - } - @Before - public void createlist(){ - list = new MyLinkedList(); - for(int j=0;j<11;j++){ - list.add(j); - } - System.out.println("初始list:"); - PrintList(list); - } - - public static void PrintList(MyList list){ - for (int i = 0; i < list.size(); i++) { - System.out.print(list.get(i)+" "); - } - } - -} diff --git a/group10/353261578/test/com/test/StaQueTest.java b/group10/353261578/test/com/test/StaQueTest.java deleted file mode 100644 index fef9ba8ff7..0000000000 --- a/group10/353261578/test/com/test/StaQueTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.test; - - -import org.junit.Test; - -import com.sx.structures.MyQueue; -import com.sx.structures.MyStack; - -public class StaQueTest { - private MyStack s; - private MyQueue queue; - - @Test - public void Stacktest() { - - s = new MyStack(); - - for(int i=0;i<10;i++){ - s.push(i); - } - System.out.println("\npop:"); - while(s.isEmpty()==false){ - System.out.println("-"+s.isEmpty()+":"+s.pop()); - } - - System.out.println("\n"+"-"+s.isEmpty()+":"+s.pop()); - - System.out.println("\npeek"); - for(int i=1;i<3;i++){ - System.out.print(s.peek()+" "); - } - } - - @Test - public void queueTest(){ - queue = new MyQueue(); - for(int i=0;i<10;i++) - queue.enQueue(i); - while(queue.size()>0) - System.out.print(queue.deQueue()+" "); - } - - -} diff --git a/group10/364298692/article.md b/group10/364298692/article.md deleted file mode 100644 index 01af1f5151..0000000000 --- a/group10/364298692/article.md +++ /dev/null @@ -1,3 +0,0 @@ -# ÿ -## week01 - diff --git a/group10/364298692/cs/.classpath b/group10/364298692/cs/.classpath deleted file mode 100644 index fceb4801b5..0000000000 --- a/group10/364298692/cs/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group10/364298692/cs/.gitignore b/group10/364298692/cs/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group10/364298692/cs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group10/364298692/cs/.project b/group10/364298692/cs/.project deleted file mode 100644 index 8536996016..0000000000 --- a/group10/364298692/cs/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - cs - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group10/364298692/cs/.settings/org.eclipse.jdt.core.prefs b/group10/364298692/cs/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group10/364298692/cs/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group10/364298692/cs/src/com/coding/basic/ArrayList.java b/group10/364298692/cs/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 71761666aa..0000000000 --- a/group10/364298692/cs/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List{ - - private int size = 0; - - private Object[] elementData; - - public ArrayList(int initialCapacity){ - elementData = new Object[initialCapacity]; - } - - public ArrayList(){ - elementData = new Object[10]; - } - - public void ensureCapacity(int minCapacity){ - int oldCapacity = elementData.length; - if(minCapacity > oldCapacity){ - Object[] oldData = elementData; - int newCapacity = (oldCapacity * 3) / 2 + 1; - if(minCapacity > newCapacity){ - newCapacity = minCapacity; - } - elementData = Arrays.copyOf(elementData, newCapacity); - } - } - - public void add(Object o){ - ensureCapacity(size + 1); - elementData[size] = o; - size++; - } - public void add(int index, Object o){ - ensureCapacity(size + 1); - for(int i = size-1; i >= index; i--){ - elementData[i+1] = elementData[i]; - } - elementData[index] = o; - size++; - } - - public Object get(int index){ - if(index > size-1){ - return null; - }else{ - return elementData[index]; - } - } - - public Object remove(int index){ - if(index > size-1){ - return null; - }else{ - Object obj = elementData[index]; - for(int i=index; i o.hashCode()){ - this.right = node; - }else{ - this.left = node; - } - return this; - } - - - -} diff --git a/group10/364298692/cs/src/com/coding/basic/Iterator.java b/group10/364298692/cs/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group10/364298692/cs/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group10/364298692/cs/src/com/coding/basic/LinkedList.java b/group10/364298692/cs/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 976eb88fa3..0000000000 --- a/group10/364298692/cs/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - private int size; - - public void add(Object o){ - addLast(o); - } - - public void add(int index , Object o){ - Node node = head; - for(int i = 0; i < index; i++){ - node = node.next; - } - Node newNode = new Node(); - newNode.data = o; - newNode.next = node.next; - node.next = newNode; - size++; - } - public Object get(int index){ - if(index > size-1){ - return null; - }else{ - Node node = head; - for(int i = 0; i < index; i++){ - node = node.next; - } - return node.data; - } - } - public Object remove(int index){ - if(index > size-1){ - return null; - }else if(index == 0){ - Object obj = head.data; - head = head.next; - size--; - return obj; - }else{ - Node node = head; - //ñɾڵǰһڵ - for(int i = 0; i < index-1; i++){ - node = node.next; - } - Object obj = node.next.data; - node.next = node.next.next; - size--; - return obj; - } - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node newHead = new Node(); - newHead.data = o; - newHead.next = head; - head = newHead; - size++; - } - public void addLast(Object o){ - Node node = head; - while(node.next != null){ - node = node.next; - } - Node newNode = new Node(); - newNode.data = o; - node.next = newNode; - size++; - } - public Object removeFirst(){ - return remove(0); - } - public Object removeLast(){ - return remove(size); - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - } -} diff --git a/group10/364298692/cs/src/com/coding/basic/List.java b/group10/364298692/cs/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group10/364298692/cs/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group10/364298692/cs/src/com/coding/basic/Queue.java b/group10/364298692/cs/src/com/coding/basic/Queue.java deleted file mode 100644 index 1a96515399..0000000000 --- a/group10/364298692/cs/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList linkedList; - - public void enQueue(Object o){ - linkedList.addLast(o); - } - - public Object deQueue(){ - Object obj = linkedList.removeFirst(); - return obj; - } - - public boolean isEmpty(){ - return linkedList.size() == 0; - } - - public int size(){ - return linkedList.size(); - } -} diff --git a/group10/364298692/cs/src/com/coding/basic/Stack.java b/group10/364298692/cs/src/com/coding/basic/Stack.java deleted file mode 100644 index 7043ba9386..0000000000 --- a/group10/364298692/cs/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(elementData.size(), o); - } - - public Object pop(){ - Object obj = elementData.remove(elementData.size()-1); - return obj; - } - - public Object peek(){ - Object obj = elementData.get(0); - return obj; - } - public boolean isEmpty(){ - return elementData.size()==0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group10/569420966/struct/pom.xml b/group10/569420966/struct/pom.xml deleted file mode 100644 index 2fc5902e7a..0000000000 --- a/group10/569420966/struct/pom.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - 4.0.0 - - com.rishy - struct - 1.0-SNAPSHOT - - - \ No newline at end of file diff --git a/group10/569420966/struct/src/main/java/com/myutil/ArrayList.java b/group10/569420966/struct/src/main/java/com/myutil/ArrayList.java deleted file mode 100644 index 19f0fdc26f..0000000000 --- a/group10/569420966/struct/src/main/java/com/myutil/ArrayList.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.myutil; - - -import java.text.MessageFormat; -import java.util.NoSuchElementException; - -/** - * 数组列表 - */ -public class ArrayList implements List { - private Object[] elementData; - private int size = 0; - private static final int DEFAULT_SIZE = 10; - - /** - * 判断边界 - *

- *

-     *      若 index < 0 或者 index > size 则抛出非法参数异常
-     * 
- * - * @param index 当前索引 - */ - private void judgeRange(int index) { - if (index < 0) { - throw new IllegalArgumentException( - MessageFormat.format("Index is must be great or equal then 0. index:{0}", index)); - } - if (index >= this.size) { - throw new IllegalArgumentException( - MessageFormat.format("Index is must be less then size(). index:{0}", index)); - } - if (this.size == Integer.MAX_VALUE) { - throw new IllegalArgumentException("Array already can not Expansion."); - } - } - - /** - * 扩充数组容量 - *

- *

-     *     若 size >= elementData.length 则对数组进行扩容
-     *     扩容至原(elementData.length+1) * 2
-     * 
- */ - private void capacityExpansion() { - if (this.size >= elementData.length) { - Object[] tmpData = new Object[(elementData.length + 1) * 2]; - System.arraycopy(elementData, 0, tmpData, 0, elementData.length); - elementData = tmpData; - } - } - - public ArrayList() { - elementData = new Object[DEFAULT_SIZE]; - } - - public ArrayList(int capacity) { - if (capacity < 0) { - throw new IllegalArgumentException( - MessageFormat.format("Capacity is must be great or equal 0. capacity:{0}", capacity)); - } - this.elementData = new Object[capacity]; - } - - public void add(T element) { - capacityExpansion(); - elementData[this.size] = element; - this.size++; - } - - public void add(T element, int index) { - judgeRange(index); - capacityExpansion(); - if (this.size - index > 0) { - System.arraycopy(elementData, index, elementData, index + 1, this.size - index); - } - elementData[index] = element; - this.size++; - } - - public T remove(int index) { - judgeRange(index); - T tmpObject = (T) elementData[index]; - if (this.size - index > 0) { - System.arraycopy(elementData, index + 1, elementData, index, this.size - index - 1); - } - this.size--; - return tmpObject; - } - - public T get(int index) { - judgeRange(index); - return (T) elementData[index]; - } - - public int size() { - return this.size; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (int i = 0; i < this.size; i++) { - sb.append((T) elementData[i]); - if (i < this.size - 1) { - sb.append(","); - } - } - sb.append("]"); - - return sb.toString(); - } - - /** - * 获取迭代器 - * - * @return 迭代器 - */ - public Iterator iterator() { - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator { - int position = 0; - int lastRet = -1; - - public boolean hasNext() { - return position < ArrayList.this.size(); - } - - public T next() { - if (position >= size) { - throw new NoSuchElementException(); - } - int i = position; - T element = ArrayList.this.get(position++); - lastRet = i; - return element; - } - - public T remove() { - if (lastRet < 0) { - throw new IllegalStateException(); - } - T removeElement = ArrayList.this.remove(lastRet); - position = lastRet; - lastRet = -1; - return removeElement; - } - } - - public static void main(String[] args) { - ArrayList ids = new ArrayList<>(); - for (int i = 0; i < 11; i++) { - ids.add(i); - } - Iterator iterator = ids.iterator(); - System.out.println(ids); - } -} diff --git a/group10/569420966/struct/src/main/java/com/myutil/BinaryTreeNode.java b/group10/569420966/struct/src/main/java/com/myutil/BinaryTreeNode.java deleted file mode 100644 index 0e862a199d..0000000000 --- a/group10/569420966/struct/src/main/java/com/myutil/BinaryTreeNode.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.myutil; - -import java.util.Random; - -/** - * 二叉树 - */ -public class BinaryTreeNode> { - private T element; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public T getElement() { - return element; - } - - public void setElement(T element) { - this.element = element; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - /** - * 将元素插入二叉树 - * - * @param element 元素 - * @return 插入后的节点 - */ - public BinaryTreeNode insert(T element) { - if (element == null) { - throw new IllegalArgumentException("Element must be not null."); - } - - BinaryTreeNode currentNode = null; - if (this.element == null) { - currentNode = this; - currentNode.element = element; - } else { - currentNode = compareToElement(element, this); - } - - return currentNode; - } - - private BinaryTreeNode compareToElement(T element, BinaryTreeNode curr) { - if (element.compareTo(curr.element) == -1) { - if (curr.left == null) { - BinaryTreeNode node = new BinaryTreeNode<>(); - node.element = element; - curr.left = node; - return node; - } else { - return compareToElement(element, curr.left); - } - } else { - if (curr.right == null) { - BinaryTreeNode node = new BinaryTreeNode<>(); - node.element = element; - curr.right = node; - return node; - } else { - return compareToElement(element, curr.right); - } - } - } - - /** - * 先序遍历 - * - * @return 按先序遍历顺序展示节点值 - */ - public String preOrderTraversal() { - return concatPreOrder(this); - } - - private String concatPreOrder(BinaryTreeNode node) { - StringBuilder ret = new StringBuilder(); - if (node.left != null) { - ret.append(concatPreOrder(node.left)); - } - - ret.append(node.element).append(" "); - - if (node.right != null) { - ret.append(concatPreOrder(node.right)); - } - - return ret.toString(); - } - - /** - * 中序遍历 - * - * @return 按中序遍历顺序展示节点值 - */ - public String inOrderTraversal() { - return concatInOrder(this); - } - - private String concatInOrder(BinaryTreeNode node) { - StringBuilder ret = new StringBuilder(); - - ret.append(node.element).append(" "); - - if (node.left != null) { - ret.append(concatInOrder(node.left)); - } - - if (node.right != null) { - ret.append(concatInOrder(node.right)); - } - - return ret.toString(); - } - - /** - * 后序遍历 - * - * @return 按后序遍历顺序展示节点值 - */ - public String postOrderTraversal() { - return concatPostOrder(this); - } - - private String concatPostOrder(BinaryTreeNode node) { - StringBuilder ret = new StringBuilder(); - - if (node.right != null) { - ret.append(concatPostOrder(node.right)); - } - - ret.append(node.element).append(" "); - - if (node.left != null) { - ret.append(concatPostOrder(node.left)); - } - - return ret.toString(); - } - - public static void main(String[] args) { - BinaryTreeNode binaryTree = new BinaryTreeNode<>(); - Random random = new Random(); - for (int i = 0; i < 5; i++) { - binaryTree.insert(random.nextInt(100)); - } - - - System.out.println(binaryTree.preOrderTraversal()); - System.out.println(binaryTree.inOrderTraversal()); - System.out.println(binaryTree.postOrderTraversal()); - } -} diff --git a/group10/569420966/struct/src/main/java/com/myutil/Iterator.java b/group10/569420966/struct/src/main/java/com/myutil/Iterator.java deleted file mode 100644 index 412a1ef0aa..0000000000 --- a/group10/569420966/struct/src/main/java/com/myutil/Iterator.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.myutil; - -/** - * 迭代器 - */ -public interface Iterator { - - /** - * 是否有下一个元素 - * - * @return true-有 false-无 - */ - boolean hasNext(); - - /** - * 获取下一个元素 - * - * @return 下一个元素 - */ - T next(); - - /** - * 删除当前迭代的元素 - * - * @return 被删除的元素 - */ - T remove(); -} diff --git a/group10/569420966/struct/src/main/java/com/myutil/LinkedList.java b/group10/569420966/struct/src/main/java/com/myutil/LinkedList.java deleted file mode 100644 index dcbce429ec..0000000000 --- a/group10/569420966/struct/src/main/java/com/myutil/LinkedList.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.myutil; - -import java.text.MessageFormat; -import java.util.NoSuchElementException; - -/** - * 链表列表 - */ -public class LinkedList implements List { - private Node header = new Node(); - private int size = 0; - - private Node lastNode() { - return findNode(this.size); - } - - private Node findNode(int index) { - int current = 0; - Node targetNode = header; - while (current < index) { - targetNode = targetNode.next; - current++; - } - return targetNode; - } - - /** - * 判断边界 - *

- *

-     *      若 index < 0 或者 index > size 则抛出非法参数异常
-     * 
- * - * @param index 当前索引 - */ - private void judgeRange(int index) { - if (index < 0) { - throw new IllegalArgumentException( - MessageFormat.format("Index is must be great or equal then 0. index:{0}", index)); - } - if (index >= this.size) { - throw new IllegalArgumentException( - MessageFormat.format("Index is must be less then size(). index:{0}", index)); - } - if (this.size == Integer.MAX_VALUE) { - throw new IllegalArgumentException("Array already can not Expansion."); - } - } - - public LinkedList() { - - } - - @Override - public void add(T element) { - Node lastNode = lastNode(); - Node addNode = new Node(); - addNode.element = element; - lastNode.next = addNode; - this.size++; - } - - @Override - public void add(T element, int index) { - judgeRange(index); - Node targetNode = findNode(index); - Node addNode = new Node(); - addNode.element = element; - addNode.next = targetNode.next; - targetNode.next = addNode; - this.size++; - } - - @Override - public T remove(int index) { - judgeRange(index); - Node targetNode = findNode(index); - Node removeNode = targetNode.next; - targetNode.next = targetNode.next.next; - T element = (T) removeNode.element; - this.size--; - return element; - } - - @Override - public T get(int index) { - judgeRange(index); - return (T) findNode(index).next.element; - } - - @Override - public int size() { - return this.size; - } - - /** - * 添加一个元素到最开始的位置 - * - * @param element 元素 - */ - public void addFirst(T element) { - add(element, 0); - } - - /** - * 添加一个元素到最后 - * - * @param element 元素 - */ - public void addLast(T element) { - add(element, this.size - 1); - } - - /** - * 删除第一个元素 - * - * @return 第一个元素 - */ - public T removeFirst() { - if (this.size == 0) { - throw new ArrayIndexOutOfBoundsException("This list is empty, don't to remove."); - } - - return remove(0); - } - - /** - * 删除最后一个元素 - * - * @return 最后一个元素 - */ - public T removeLast() { - if (this.size == 0) { - throw new ArrayIndexOutOfBoundsException("This list is empty, don't to remove."); - } - return remove(this.size - 1); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("["); - Node indexNode = header.next; - while (indexNode != null) { - sb.append((T) indexNode.element); - if (indexNode.next != null) { - sb.append(","); - } - indexNode = indexNode.next; - } - sb.append("]"); - - return sb.toString(); - } - - /** - * 获取迭代器 - * - * @return 迭代器 - */ - public Iterator iterator() { - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator { - int position = 0; - int lastRet = -1; - - public boolean hasNext() { - return position < LinkedList.this.size(); - } - - public T next() { - if (position >= size) { - throw new NoSuchElementException(); - } - int i = position; - T element = LinkedList.this.get(position++); - lastRet = i; - return element; - } - - public T remove() { - if (lastRet < 0) { - throw new IllegalStateException(); - } - T removeElement = LinkedList.this.remove(lastRet); - position = lastRet; - lastRet = -1; - return removeElement; - } - } - - private static class Node { - T element; - Node next; - } - - public static void main(String[] args) { - LinkedList ids = new LinkedList<>(); - for (int i = 0; i < 11; i++) { - ids.add(i); - } - Iterator iterator = ids.iterator(); - System.out.println(ids); - } -} diff --git a/group10/569420966/struct/src/main/java/com/myutil/List.java b/group10/569420966/struct/src/main/java/com/myutil/List.java deleted file mode 100644 index 8dced86dc7..0000000000 --- a/group10/569420966/struct/src/main/java/com/myutil/List.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.myutil; - -/** - * 列表基本操作 - */ -public interface List { - /** - * 添加一个元素到列表 - * - * @param element 元素 - */ - void add(T element); - - /** - * 添加一个元素至指定位置 - * - *
-     *     指定位置范围: index >= 0 && index < size
-     *     否则回抛出非法参数异常
-     * 
- * - * @param element 元素 - * @param index 指定位置 - */ - void add(T element, int index); - - /** - * 删除指定位置元素 - * - *
-     *     指定位置范围: index >= 0 && index < size
-     *     否则回抛出非法参数异常
-     * 
- * - * @param index 指定位置 - * @return 删除的元素的引用 - */ - T remove(int index); - - /** - * 获取指定位置元素 - * @param index 指定位置 - * @return 指定位置的元素 - */ - T get(int index); - - /** - * 获取当前列表的大小 - * @return 当前列表的大小 - */ - int size(); -} diff --git a/group10/569420966/struct/src/main/java/com/myutil/Queue.java b/group10/569420966/struct/src/main/java/com/myutil/Queue.java deleted file mode 100644 index 9097caa7f4..0000000000 --- a/group10/569420966/struct/src/main/java/com/myutil/Queue.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.myutil; - -/** - * 队列 - */ -public class Queue { - private LinkedList elementList = new LinkedList<>(); - - /** - * 进入队列 - * - * @param element 进入队列的元素 - */ - public void enQueue(T element) { - elementList.add(element); - } - - /** - * 出队列 - * - * @return 出队列的元素 - */ - public T deQueue() { - return elementList.removeFirst(); - } - - /** - * 队列是否为空 - * - * @return true-是 false-否 - */ - public boolean isEmpty() { - return elementList.size() == 0; - } - - /** - * 获取队列的大小 - * - * @return 队列的大小 - */ - public int size() { - return elementList.size(); - } -} diff --git a/group10/569420966/struct/src/main/java/com/myutil/Stack.java b/group10/569420966/struct/src/main/java/com/myutil/Stack.java deleted file mode 100644 index d78ae2b39a..0000000000 --- a/group10/569420966/struct/src/main/java/com/myutil/Stack.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.myutil; - -/** - * 栈 - */ -public class Stack { - private ArrayList elementList = new ArrayList<>(); - - /** - * 入栈 - * - * @param element 入栈的元素 - */ - public void push(T element) { - elementList.add(element); - } - - /** - * 出栈 - * - * @return 出栈的元素 - */ - public T pop() { - if (elementList.size() == 0) { - throw new ArrayIndexOutOfBoundsException("Stack is empty, don't to pop()."); - } - T element = elementList.get(elementList.size() - 1); - elementList.remove(elementList.size() - 1); - return element; - } - - /** - * 获取栈顶元素 - * - * @return 栈顶元素 - */ - public T peek() { - if (elementList.size() == 0) { - throw new ArrayIndexOutOfBoundsException("Stack is empty, don't to peek()."); - } - return elementList.get(elementList.size() - 1); - } - - /** - * 是否为空栈 - * - * @return true-是 false-否 - */ - public boolean isEmpty() { - return elementList.size() == 0; - } - - /** - * 获取当前栈大小 - * - * @return 当前栈大小 - */ - public int size() { - return elementList.size(); - } -} diff --git a/group10/584709796/worka/.classpath b/group10/584709796/worka/.classpath deleted file mode 100644 index ece376cba2..0000000000 --- a/group10/584709796/worka/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group10/584709796/worka/.gitignore b/group10/584709796/worka/.gitignore deleted file mode 100644 index 3e2fcc7171..0000000000 --- a/group10/584709796/worka/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group10/584709796/worka/.project b/group10/584709796/worka/.project deleted file mode 100644 index 2858b5b710..0000000000 --- a/group10/584709796/worka/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group10/584709796/worka/.settings/org.eclipse.jdt.core.prefs b/group10/584709796/worka/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a87..0000000000 --- a/group10/584709796/worka/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group10/584709796/worka/src/com/coding/basic/ArrayList.java b/group10/584709796/worka/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 7d06acbe10..0000000000 --- a/group10/584709796/worka/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,75 +0,0 @@ -//刚开始学JAVA,现在学到JAVA基础类库耐力,迭代器还没学 - -package com.coding.basic; - -public class ArrayList implements List { - - private int size =0; - - private Object[] elementData = new Object[100]; - - public int getSize() {//得到数组大小 - return size; - } - public void setSize(int size) {//设置数组的长度 - this.size = size; - } - - public void ExtendArray(int size){ //插入元素时,数组长度加1,确保数组不越界 - this.size=size+1; - } - - public void add(Object o){//在末尾添加元素 - int length=getSize(); - elementData[length] = o; - ExtendArray(length); - } - - public void add(int index, Object o){ - int length=getSize(); - - for(int k=length-1;k>=index-1;k--){//元素后移 - elementData[k+1]=elementData[k]; - } - elementData[index-1]=o; - ExtendArray(length);//插一个元素,扩充一次 - } - - public Object get(int index){//获取元素 - int length=getSize(); - if(index+1>length||index<0){ - System.out.println("方法 get(int index)的index不在数组索引的范围内"); - } - return (Object)elementData[index]; - } - - public Object remove(int index){//移除元素 - int length=getSize(); - if(index+1>length||index<0){ - System.out.println("方法 remove(int index)的index不在数组索引的范围内"); - } - Object ss=(Object)elementData[index]; - - for(int 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 Kb~v2w6aNc`P(%{| diff --git a/group10/595128841/Readme.txt b/group10/595128841/Readme.txt deleted file mode 100644 index a5206d5b31..0000000000 --- a/group10/595128841/Readme.txt +++ /dev/null @@ -1 +0,0 @@ -第一次文章地址:http://www.jianshu.com/p/089ac95363d4 如何自己实现一个简单的ArrayList \ No newline at end of file diff --git a/group10/595128841/src/org/le/ArrayList.java b/group10/595128841/src/org/le/ArrayList.java deleted file mode 100644 index 571362606b..0000000000 --- a/group10/595128841/src/org/le/ArrayList.java +++ /dev/null @@ -1,144 +0,0 @@ -/** - * - */ -package org.le; - -/** - * @author yue - * @time 2017年2月19日 - */ -public class ArrayList implements List { - - private Object[] elementData; - - private int size; - - public ArrayList(int initCapcity){ - if(initCapcity < 0){ - throw new IllegalArgumentException("initCapcity 必须大于0"); - } - elementData = new Object[initCapcity]; - } - - public ArrayList(){ - elementData = new Object[10]; - } - - @Override - public void add(Object obj) { - grow(size + 1); - elementData[size++] = obj; - } - - @Override - public void add(int index, Object obj) { - rangeCheckForAdd(index); - grow(size + 1); - System.arraycopy(elementData, index, elementData, index+1, size - index); - elementData[index] = obj; - size ++; - } - - @Override - public void remove(Object obj) { - if(obj == null){ - for (int i = 0; i < size; i++) { - if(elementData[i] == null){ - fastRemove(i); - } - } - }else{ - for (int i = 0; i < size; i++) { - if(obj.equals(elementData[i])){ - fastRemove(i); - } - } - } - } - - @Override - public E remove(int index) { - rangeCheck(index); - int movedNum = size - index - 1; - E oldElement = elementData(index); - System.arraycopy(elementData, index+1, elementData, index, movedNum); - elementData[--size] = null; - return oldElement; - } - - @Override - public E get(int index) { - rangeCheck(index); - return elementData(index); - } - - @Override - public E set(int index, E obj) { - rangeCheck(index); - E oldElement = elementData(index); - elementData[index] = obj; - return oldElement; - } - - @Override - public int indexOf(E obj) { - if(obj == null){ - for (int i = 0; i < size; i++) { - if(elementData[i] == null){ - return i; - } - } - }else{ - for (int i = 0; i < size; i++) { - if(obj.equals(elementData[i])){ - return i; - } - } - } - return -1; - } - - /** - * 数组扩容 - * @param minCapacity - */ - private void grow(int minCapacity) { - if(minCapacity <= elementData.length){ - return; - } - int oldCapacity = elementData.length; - int newCapacity = minCapacity + (oldCapacity >> 1); - if(newCapacity < minCapacity){ - newCapacity = minCapacity; - } - if(minCapacity > Integer.MAX_VALUE){ - newCapacity = Integer.MAX_VALUE; - } - Object[] newArray = new Object[newCapacity]; - System.arraycopy(elementData, 0, newArray, 0, newCapacity); - elementData = newArray; - } - - @SuppressWarnings("unchecked") - private E elementData(int index){ - return (E) elementData[index]; - } - - private void fastRemove(int i) { - int numMoved = size - i -1; - if(numMoved > 0){ - System.arraycopy(elementData, i+1, elementData, i, numMoved); - } - elementData[-- size] = null; - } - - private void rangeCheck(int index){ - if(index >= size || index <0) - throw new IndexOutOfBoundsException("index:"+index+",size:"+size); - } - - private void rangeCheckForAdd(int index){ - if(index > size || index <0) - throw new IndexOutOfBoundsException("index:"+index+",size:"+size); - } -} diff --git a/group10/595128841/src/org/le/LinkedList.java b/group10/595128841/src/org/le/LinkedList.java deleted file mode 100644 index fbe95017cb..0000000000 --- a/group10/595128841/src/org/le/LinkedList.java +++ /dev/null @@ -1,299 +0,0 @@ -/** - * - */ -package org.le; - -import java.util.NoSuchElementException; - -/** - * @author yue - * @time 2017年2月19日 - */ -public class LinkedList implements List { - - private int size = 0; - - private Node first; - - private Node last; - - private static class Node{ - E item; - Node prev; - Node next; - Node(Node prev,E item, Node next) { - super(); - this.item = item; - this.prev = prev; - this.next = next; - } - } - - public LinkedList(){ - - } - - /** - * 头部插入 - */ - private void linkFirst(E e){ - final Node f = first; - final Node newNode = new Node(null,e,f); - first = newNode; - if(f == null) - last = newNode; - else - f.prev = newNode; - size ++; - } - - /** - * 尾部插入 - */ - private void linkLast(E e){ - final Node l = last; - final Node newNode = new Node<>(l,e,null); - last = newNode; - if(last == null) - first = newNode; - else - l.next = newNode; - size ++; - } - - /** - * 某个不为null元素之前插入 - */ - private void linkBefore(E e,Node succ){ - final Node pred = succ.prev; - final Node newNode = new Node<>(pred,e,succ); - succ.prev = newNode; - if(pred == null) - first = newNode; - else - pred.next = newNode; - size ++; - } - - /** - * 删除头部元素 - */ - private E unlinkFirst(Node f){ - final E element = f.item; - final Node next = f.next; - f.item = null; - f.next = null; - first = next; - if(next == null) - last = null; - else - next.prev = null; - size -- ; - return element; - } - /** - * 删除尾部元素 - * @param l - * @return - */ - private E unlinkLast(Node l){ - final E element = l.item; - final Node prev = l.prev; - l.item = null; - l.prev = null; - last = prev; - if(prev == null) - first = null; - else - prev.next = null; - size -- ; - return element; - } - - /** - * 删除指定节点 - * @param e - * @return - */ - private E unlink(Node e){ - final Node prev = e.prev; - final E element = e.item; - final Node next = e.next; - - if(prev == null){ - first = next; - }else{ - prev.next = next; - e.prev = null; - } - - if(next == null){ - last = prev; - }else{ - next.prev = prev; - e.next = null; - } - e.item = null; - size -- ; - return element; - } - - /** - * 该方法默认在尾部添加 - */ - @Override - public void add(E e) { - linkLast(e); - } - - /** - * - */ - @Override - public void add(int index, E e) { - checkPositionIndex(index); - if(index == size){ - linkLast(e); - }else{ - linkBefore(e, node(index)); - } - } - - private Node node(int index) { - //小于容量一半 - if(index < (size >> 1)){ - Node x = first; - for(int i = 0; i < index; i++){ - x = x.next; - } - return x; - }else{ - Node x = last; - for(int i = size - 1; i > index; i --){ - x = x.prev; - } - return x; - } - } - - private void checkPositionIndex(int index){ - if(index <0 || index > size){ - throw new IndexOutOfBoundsException("索引越界:index:"+index+",size:"+size); - } - } - - private void checkElementIndex(int index){ - if(index <0 || index >= size){ - throw new IndexOutOfBoundsException("索引越界:index:"+index+",size:"+size); - } - } - - /** - * - */ - @Override - public void remove(E obj) { - if(obj == null){ - for(Node x = first;x != null; x = x.next){ - if(x.item == null){ - unlink(x); - } - } - }else{ - for(Node x = first;x != null;x = x.next){ - if(obj.equals(x.item)){ - unlink(x); - } - } - } - } - - /** - * - */ - @Override - public E remove(int index) { - checkElementIndex(index); - return unlink(node(index)); - } - - /** - * - */ - @Override - public E get(int index) { - checkElementIndex(index); - return node(index).item; - } - - /** - * - */ - @Override - public E set(int index, E obj) { - checkElementIndex(index); - Node x = node(index); - E oldVal = x.item; - x.item = obj; - return oldVal; - } - - /** - * - */ - @Override - public int indexOf(E obj) { - int index = 0; - if(obj == null){ - for(Node x = first;x != null;x = x.next){ - if(x.item == null) - return index; - index ++; - } - }else{ - for(Node x = first; x != null; x = x.next){ - if(obj.equals(x.item)) - return index; - index ++; - } - } - return -1; - } - /** - * 弹出栈顶的元素,不删除元素 - * @param e - * @return - */ - public E peek(){ - final Node e = first; - return e == null ? null : e.item; - } - - /** - * 弹出栈顶元素,删除元素 - * @return - */ - public E poll(){ - final Node e = first; - return (e == null) ? null : unlinkFirst(e); - } - /** - * 入栈,栈顶 - * @param e - */ - public void push(E e){ - linkFirst(e); - } - - /** - * 出栈,删除并返回栈顶元素 - * @return - */ - public E pop(){ - final Node f = first; - if(f == null) - throw new NoSuchElementException(); - return unlinkFirst(f); - } - -} diff --git a/group10/595128841/src/org/le/List.java b/group10/595128841/src/org/le/List.java deleted file mode 100644 index 5fa9d6799a..0000000000 --- a/group10/595128841/src/org/le/List.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.le; - -public interface List { - - void add(E obj); - - void add(int index,E obj); - - void remove(E obj); - - E remove(int index); - - E get(int index); - - E set(int index,E obj); - - int indexOf(E obj); - -} diff --git a/group10/630505243/src/com/coding/basic/ArrayList.java b/group10/630505243/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 396dc96ae7..0000000000 --- a/group10/630505243/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - if(o!=null){ - elementData[size] = o; - if(size<100-1){ - size++; - }else{ - Object[] temp = new Object[(size+1)+100]; - System.arraycopy(elementData, 0, temp, 0, size); - elementData = temp; - size++; - } - } - - } - public void add(int index, Object o){ - if(index<=size){ - - if(index=index;i--){ - if(i==index){ - temps[index] = tmp; - }else{ - temps[i]=temps[i-1]; - } - } - elementData = temps; - - }else if(index==elementData.length-1){ - //Ԫλôұ߽ - Object[] temp = new Object[(size+1)+100]; - System.arraycopy(elementData, 0, temp, 0, size); - elementData = temp; - elementData[index] = o; - } - } - } - - public Object get(int index){ - if(index<=size){ - return elementData[index]; - }else{ - return null; - } - } - - public Object remove(int index){ - Object rtnObj = null; - if(index<=size){ - if(indexsize()){ - throw new IndexOutOfBoundsException(); - } - if (index == size) { - add(o); - } else { - Node node = head; - for (int i = 0; i < index-1; i++) { - node = node.next; - } - Node newNode = new Node(o, node); - node.next = newNode; - newNode.next = node; - size++; - } - } - public Object get(int index){ - if(index<0||index>size()){ - throw new IndexOutOfBoundsException(); - } - Node node=head; - for(int i=0;isize()){ - throw new IndexOutOfBoundsException(); - } - return null; - } - - public int size(){ - return this.size; - } - - public void addFirst(Object o){ - Node newNode = new Node(o,null); - newNode.next=head.next; - } - public void addLast(Object o){ - add(o); - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } -} diff --git a/group10/706097141/learning/src/com/hmily/learning/List.java b/group10/706097141/learning/src/com/hmily/learning/List.java deleted file mode 100644 index 02ef056bd3..0000000000 --- a/group10/706097141/learning/src/com/hmily/learning/List.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.hmily.learning; -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group10/706097141/learning/src/com/hmily/learning/MyArrayList.java b/group10/706097141/learning/src/com/hmily/learning/MyArrayList.java deleted file mode 100644 index 46e1c564af..0000000000 --- a/group10/706097141/learning/src/com/hmily/learning/MyArrayList.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.hmily.learning; - -public class MyArrayList implements List,Iterator{ - - private int size = 0; - - private Object[] elementData = new Object[100]; - - /** - * Ԫ - */ - public void add(Object o){ - if(size==elementData.length){ - Object[] newElementData = new Object[elementData.length+1]; - for(int i=0;iindex;i--){ - elementData[i]=elementData[i-1]; - } - elementData[index]=o; - size++; - } - /** - * ȡԪ - */ - public Object get(int index){ - if(index>=size()||index<0){ - throw new ArrayIndexOutOfBoundsException(); - } - return elementData[index]; - } - /** - * ƳԪ - */ - public Object remove(int index){ - if(index<0||index>size()){ - throw new ArrayIndexOutOfBoundsException(); - } - Object o=elementData[index]; - for(int i=index;i - - - - - diff --git a/group10/875867419/.gitignore b/group10/875867419/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group10/875867419/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group10/875867419/.project b/group10/875867419/.project deleted file mode 100644 index b6d8ce6204..0000000000 --- a/group10/875867419/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - coding2017 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group10/875867419/src/com/work/week01/MyArrayList.java b/group10/875867419/src/com/work/week01/MyArrayList.java deleted file mode 100644 index d005800d39..0000000000 --- a/group10/875867419/src/com/work/week01/MyArrayList.java +++ /dev/null @@ -1,203 +0,0 @@ -package com.work.week01; - -import java.io.Serializable; -import java.util.Arrays; - -/** - * ʵListӿڣķʽʵԼArrayList - * @author denghuaijun - * - * @param - */ -public class MyArrayList implements MyList,Serializable { - - private static final long serialVersionUID = 4145346362382387995L; - - /** - * ĬϴС - */ - private static final int DEFAULT_CAPACITY = 10; - - /** - * ĬϿ - */ - private static final Object[] EMPTY_ELEMENTDATA = {}; - - transient Object[] elementData; - - /** - * С - */ - private int size; - - public MyArrayList(){ - this.elementData = EMPTY_ELEMENTDATA; - } - - public MyArrayList(int capacity){ - if(capacity > 0){ - this.elementData = new Object[capacity]; - }else if(capacity == 0){ - this.elementData = EMPTY_ELEMENTDATA; - }else{ - throw new IllegalArgumentException("Ƿ"); - } - } - - private void ensureCapacity(int minCapacity){ - if(this.elementData == EMPTY_ELEMENTDATA){ - minCapacity = Math.max(minCapacity, DEFAULT_CAPACITY); - } - if(minCapacity > elementData.length){//λô鳤 - grow(minCapacity); - } - } - - private void grow(int minCapacity){ - int oldCapacity = elementData.length; - int newCapacity = oldCapacity + (oldCapacity >> 1); - if(newCapacity < minCapacity){ - newCapacity = minCapacity; - } - elementData = Arrays.copyOf(elementData, newCapacity); - } - - @Override - public boolean add(E element) { - ensureCapacity(size + 1); - elementData[size++] = element; - return true; - } - - @Override - public void add(int index, E element) { - //ȷindexǷԽ - checkAddRange(index); - //ȷ鳤Ƿ㹻 - ensureCapacity(size + 1); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = element; - size++; - } - - private void checkAddRange(int index){ - if(index < 0 || index > size){//index == size Ԫ - throw new IndexOutOfBoundsException("Խ"); - } - } - - @SuppressWarnings("unchecked") - @Override - public E get(int index) { - checkRange(index); - return (E) elementData[index]; - } - - private void checkRange(int index){ - if(index < 0 || index >= size){ - throw new IndexOutOfBoundsException("Խ"); - } - } - - @SuppressWarnings("unchecked") - @Override - public E remove(int index) { - checkRange(index); - E element = (E) elementData[index]; - int numMoved = size - index - 1; - if(numMoved > 0){ - System.arraycopy(elementData, index + 1, elementData, index, numMoved); - } - elementData[size--] = null; - return element; - } - - @Override - public int size() { - return size; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - public int indexOf(Object o) { - if(o == null){ - for(int i=0;i=0;i--){ - if(elementData[i] == null){ - return i; - } - } - }else{ - for(int i=size-1;i>=0;i--){ - if(o.equals(elementData[i])){ - return i; - } - } - } - return -1; - } - - @Override - public MyIterator iterator() { - return new MyIter(); - } - - private class MyIter implements MyIterator{ - - int flag = -1; - - public MyIter(){ - flag = size; //鳤 - } - - @Override - public boolean hasNext() { - return flag > 0; - } - - @SuppressWarnings("unchecked") - @Override - public E next() { - if(!hasNext()){ - throw new IndexOutOfBoundsException("ֵ鷶Χ"); - } - return (E) elementData[size-(flag--)]; - } - - } - public static void main(String[] args) { - MyArrayList array = new MyArrayList(); - array.add("1"); - array.add("2"); - array.add("3"); - array.add("4"); - array.remove(2); - array.add(2, "1"); - System.out.println("size="+array.size()); - System.out.println("indexOf(3)="+array.indexOf("3")); - System.out.println("lastIndexOf(1)="+array.lastIndexOf("1")); - MyIterator itr = array.iterator(); - while(itr.hasNext()){ - System.out.println(itr.next()); - } - } -} diff --git a/group10/875867419/src/com/work/week01/MyBinaryTree.java b/group10/875867419/src/com/work/week01/MyBinaryTree.java deleted file mode 100644 index 8c6f057648..0000000000 --- a/group10/875867419/src/com/work/week01/MyBinaryTree.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.work.week01; - -public class MyBinaryTree { - - private MyBinaryTreeNode parent; - - public MyBinaryTree(){ - this.parent = new MyBinaryTreeNode(null, null, null); - } - - public void insertNode(E element){ - MyBinaryTreeNode node = new MyBinaryTreeNode(element, null, null); - if(parent.element == null){ - parent = node; - return; - } - insertNode(parent, node); - } - - private void insertNode(MyBinaryTreeNode parentNode, MyBinaryTreeNode newNode){ - if(parentNode.compareTo(newNode) <= 0){// - if(parentNode.right == null){ - parentNode.right = newNode; - }else{ - insertNode(parentNode.right, newNode); - } - }else{ - if(parentNode.left == null){ - parentNode.left = newNode; - }else{ - insertNode(parentNode.left, newNode); - } - } - } - - private void printNode(MyBinaryTreeNode node, int count){ - if(node.left != null){ - printNode(node.left, count++); - } - if(node.right != null){ - printNode(node.right, count++); - } - for(int i=0;i implements Comparable> { - - private T element; - private MyBinaryTreeNode left; - private MyBinaryTreeNode right; - - public MyBinaryTreeNode(T element, MyBinaryTreeNode left, MyBinaryTreeNode right){ - this.element = element; - this.left = left; - this.right = right; - } - - @Override - public int compareTo(MyBinaryTreeNode o) { - Integer src = (Integer) this.element; - Integer dest = (Integer) o.element; - return src.compareTo(dest); - } - } - - public static void main(String[] args) { - MyBinaryTree tree = new MyBinaryTree(); - tree.insertNode(5); - tree.insertNode(7); - tree.insertNode(3); - tree.insertNode(9); - tree.insertNode(4); - tree.printTree(); - } -} diff --git a/group10/875867419/src/com/work/week01/MyIterator.java b/group10/875867419/src/com/work/week01/MyIterator.java deleted file mode 100644 index 78abc20f23..0000000000 --- a/group10/875867419/src/com/work/week01/MyIterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.work.week01; - -public interface MyIterator { - boolean hasNext(); - E next(); -} diff --git a/group10/875867419/src/com/work/week01/MyLinkedList.java b/group10/875867419/src/com/work/week01/MyLinkedList.java deleted file mode 100644 index 675323a249..0000000000 --- a/group10/875867419/src/com/work/week01/MyLinkedList.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.work.week01; - -import java.io.Serializable; - - -public class MyLinkedList implements MyList, Serializable{ - - private static final long serialVersionUID = 8700137302944494769L; - - transient int size = 0; - - transient MyNode head; - transient MyNode last; - - public MyLinkedList(){ - head = new MyNode(null, null); - last = new MyNode(null, null); - } - - @Override - public boolean add(E element) { - if(head.element == null){ - head = new MyNode(element, null); - last = head; - }else{ - MyNode node = new MyNode(element, null); - last.next = node; - last = node; - } - size++; - return true; - } - - @Override - public void add(int index, E element) { - if(index < 0 || index -size > 0){ - throw new IndexOutOfBoundsException(""); - } - if(index == 0){ - MyNode node = new MyNode(element, null); - node.next = head; - head = node; - }else{ - MyNode leftNode = getIndexNode(index-1); - MyNode node = new MyNode(element, null); - node.next = leftNode.next; - leftNode.next = node; - } - size++; - } - - private MyNode getIndexNode(int index){ - MyNode node = head; - for(int i=0; i= 0){ - throw new IndexOutOfBoundsException(""); - } - MyNode node = getIndexNode(index); - return node.element; - } - - @Override - public E remove(int index) { - if(index < 0 || index >= size){ - throw new IndexOutOfBoundsException(""); - } - if(index == 0){//Ƴͷ - MyNode node = head; - head = head.next; - node.next = null; - size--; - return node.element; - }else{ - MyNode leftNode = getIndexNode(index-1); - MyNode node = leftNode.next; //ƳĽڵ - leftNode.next = node.next; - node.next = null; - size--; - return node.element; - } - } - - @Override - public int size() { - return size; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - public void addFirst(E element){ - add(0, element); - } - - public void addLast(E element){ - add(size, element); - } - - public void removeFirst(){ - remove(0); - } - - public void removeLast(){ - remove(size-1); - } - - private static class MyNode{ - E element; - MyNode next; - - MyNode(E element, MyNode next) { - this.element = element; - this.next = next; - } - - } - - @Override - public MyIterator iterator() { - return new MyIter(); - } - - private class MyIter implements MyIterator{ - - int flag = 0; - - public MyIter(){ - flag = size; - } - - @Override - public boolean hasNext() { - return flag > 0; - } - - @Override - public E next() { - if(!hasNext()){ - throw new IndexOutOfBoundsException("ֵΧ"); - } - return get(size-(flag--)); - } - } - - public static void main(String[] args) { - MyLinkedList link = new MyLinkedList(); - link.add("1"); - link.add("2"); - link.add("3"); - link.add("4"); - link.add(3, "1"); - link.removeFirst(); - System.out.println("size="+link.size()); - MyIterator itr = link.iterator(); - while(itr.hasNext()){ - System.out.println(itr.next()); - } - link.remove(4); - } -} diff --git a/group10/875867419/src/com/work/week01/MyList.java b/group10/875867419/src/com/work/week01/MyList.java deleted file mode 100644 index f7cc918888..0000000000 --- a/group10/875867419/src/com/work/week01/MyList.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.work.week01; - -public interface MyList{ - boolean add(E element); - void add(int index, E element); - E get(int index); - E remove(int index); - int size(); - boolean isEmpty(); - MyIterator iterator(); -} diff --git a/group10/875867419/src/com/work/week01/MyQueue.java b/group10/875867419/src/com/work/week01/MyQueue.java deleted file mode 100644 index 97bca5399a..0000000000 --- a/group10/875867419/src/com/work/week01/MyQueue.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.work.week01; - -public class MyQueue { - private MyArrayList elementData; - - public MyQueue(){ - elementData = new MyArrayList(); - } - - public void enQueue(E element){// - elementData.add(element); - } - - public E deQuene(){// Ƚȳ - return elementData.remove(0); - } - - public int size(){ - return elementData.size(); - } - - public boolean isEmpty(){ - return elementData.isEmpty(); - } - - public static void main(String[] args) { - MyQueue queue = new MyQueue(); - queue.enQueue("1"); - queue.enQueue("2"); - queue.enQueue("3"); - queue.enQueue("4"); - queue.enQueue("5"); - System.out.println("size="+queue.size()); - while(!queue.isEmpty()){ - System.out.println(queue.deQuene()); - } - } -} diff --git a/group10/875867419/src/com/work/week01/MyStack.java b/group10/875867419/src/com/work/week01/MyStack.java deleted file mode 100644 index f82bbe04c1..0000000000 --- a/group10/875867419/src/com/work/week01/MyStack.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.work.week01; - -public class MyStack { - private MyArrayList elementData; - - public MyStack(){ - elementData = new MyArrayList<>(); - } - - public void push(E element){ - elementData.add(element); - } - - public E pop(){ //ƳջԪ ȳ - return elementData.remove(elementData.size() - 1); - } - - public E peek(){ //ȡջԪ - return elementData.get(elementData.size() - 1); - } - - public int size(){ - return elementData.size(); - } - - public boolean isEmpty(){ - return elementData.isEmpty(); - } - - public static void main(String[] args) { - MyStack stack = new MyStack(); - stack.push("1"); - stack.push("2"); - stack.push("3"); - stack.push("4"); - stack.push("5"); - System.out.println("size="+stack.size()); - System.out.println("peekջԪ="+stack.peek()); - while(!stack.isEmpty()){ - System.out.println("popջԪ"+stack.pop()); - } - } -} diff --git "a/group10/875867419/src/com/work/week01/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" "b/group10/875867419/src/com/work/week01/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" deleted file mode 100644 index 5c63425fba..0000000000 --- "a/group10/875867419/src/com/work/week01/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" +++ /dev/null @@ -1 +0,0 @@ -ҵַhttps://my.oschina.net/u/3080511/blog/846172 \ No newline at end of file diff --git a/group10/group10.md b/group10/group10.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group10/group10.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group11/1178243325/DataStructure/build.gradle b/group11/1178243325/DataStructure/build.gradle deleted file mode 100644 index 5c3694d8ec..0000000000 --- a/group11/1178243325/DataStructure/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -apply plugin: 'java' -apply plugin: 'eclipse' - -jar { - manifest { - attributes 'Main-Class' : 'com.coding.Main' - } -} - - diff --git a/group11/1178243325/DataStructure/readme.md b/group11/1178243325/DataStructure/readme.md deleted file mode 100644 index 29ad9d5c06..0000000000 --- a/group11/1178243325/DataStructure/readme.md +++ /dev/null @@ -1 +0,0 @@ -实现基本的数据结构ArrayList,LinkList,Stack,Queue,Tree,Iterator diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/Main.java b/group11/1178243325/DataStructure/src/main/java/com/coding/Main.java deleted file mode 100644 index 31d2f2f277..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/Main.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coding; - -import com.coding.basic.*; -public class Main { - public static void main(String[] args) { - ArrayList list = new ArrayList(); - - list.add(0, "2xxx"); - list.add(1, "we"); - list.add(2, "sss"); - list.add("xing"); - list.remove(2); - System.out.println(list.get(2)); - Iterator iterator = list.iterator(); - while(iterator.hasNext()) { - System.out.println(iterator.next()); - } - System.out.println(list.size()); - - LinkedList llist = new LinkedList(); - llist.add("hu"); - llist.add("zhao"); - llist.add(2,"xing"); - llist.addFirst("身骑白马"); - llist.addLast("德州小老虎"); - llist.add(5, "sf"); - llist.remove(5); - llist.removeFirst(); - llist.removeLast(); - for (int i = 2; i >=0; i--) - System.out.print(llist.get(i)); - System.out.println(llist.size()); - - Iterator literator = llist.iterator(); - while(literator.hasNext()) { - System.out.println(literator.next()); - } - - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - System.out.println(stack.peek()); - while(!stack.isEmpty()) - System.out.println(stack.pop()); - - Queue queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - System.out.println(queue.size()); - while (!queue.isEmpty()) { - System.out.println(queue.deQueue()); - } - - } -} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/ArrayList.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/ArrayList.java deleted file mode 100644 index f6cd4c38fc..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.coding.basic; - -import com.coding.basic.exception.*; -public class ArrayList implements List { - - private int size; - private Object[] elementData; - - public ArrayList () { - size = 0; - elementData = new Object[100]; - } - - public void add(Object o){ - add(size(), o); - } - - public void add(int index, Object o){ - if (size() == elementData.length) - ensureCapacity( size() * 2 + 1); - if (index > size() || index < 0) { //index == size时相当于在尾后插入 - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - for (int i = size; i > index; i--) { - elementData[i] = elementData[i-1]; - } - elementData[index] = o; - size++; - - } - - private void ensureCapacity(int newCapacity) { - if (newCapacity < size()) - return; - Object[] old = elementData; - elementData = new Object[newCapacity]; - for (int i = 0; i < size(); i++) { - elementData[i] = old[i]; - } - } - - public Object get(int index){ - if (index >= size() || index < 0) { //获取时,index==size()越界 - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - return elementData[index]; - } - - private String outOfBoundsMsg(int index) { - return "Index:" + index + ", Size:" + size; - } - - public Object remove(int index){ - if (index >= size() || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - Object old = elementData[index]; - for (int i = index; i < size(); i++) { - elementData[i] = elementData[i+1]; - } - size--; - return old; - } - - /*获取表内容量*/ - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - public class ArrayListIterator implements Iterator { - private final int ONLY_CAPACITY = size; - private int index; - public ArrayListIterator() { - index = 0; - } - - @Override - public boolean hasNext() { - if (ONLY_CAPACITY != size) - throw new ConcurrentModificationException("此对象没有进行修改同步"); - return index != size; - } - - @Override - public Object next() { - if (ONLY_CAPACITY != size) - throw new ConcurrentModificationException("此对象没有进行修改同步"); - if (index >= ONLY_CAPACITY) - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - return elementData[index++]; - } - } -} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 266eff3d56..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Iterator.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Iterator.java deleted file mode 100644 index ff93e30377..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/LinkedList.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/LinkedList.java deleted file mode 100644 index d82349089b..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.coding.basic; - -import com.coding.basic.exception.*; -public class LinkedList implements List { - - private Node head; - private int size; - public LinkedList() { - head = new Node(null, null); - size = 0; - } - - public void add(Object o){ - add(size, o); - } - - public void add(int index , Object o){ - if (index > size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - Node frontNode = getNode(index-1); - Node newNode = new Node(o, frontNode.next); - frontNode.next = newNode; - size++; - - } - - private Node getNode(int index) { - Node node = head; - int i = 0; - while(node.next != null && i <= index) { - node = node.next; - i++; - } - return node; - } - - public Object get(int index){ - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - - Node node = getNode(index); - return node.data; - } - - public Object remove(int index){ - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - Node frontNode = getNode(index-1); - Node oldNode = getNode(index); - frontNode.next = oldNode.next; - size--; - return oldNode.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - //就是这么硬! - add(0, o); - } - - public void addLast(Object o){ - add(size, o); - } - - public Object removeFirst(){ - return remove(0); - } - - public Object removeLast(){ - return remove(size-1); - } - - public Iterator iterator(){ - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator { - int index; - final int capacity = size; - LinkedListIterator() { - index = 0; - } - @Override - public boolean hasNext() { - if (capacity != size) - throw new ConcurrentModificationException("此对象没有修改同步"); - return index < capacity; - } - - @Override - public Object next() { - if (capacity != size) - throw new ConcurrentModificationException("此对象没有修改同步"); - if (index >= capacity) - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - return get(index++); - } - } - - private String outOfBoundsMsg(int index) { - return "index:" + index + ", size:" + size; - } - - private static class Node { - Object data; - Node next; - - Node(Object data, Node next) { - this.data = data; - this.next = next; - } - - void setData(Object data) { - this.data = data; - } - - Object getData() { - return data; - } - - void setNext(Node next) { - this.next = next; - } - - Object getNext() { - return next; - } - } -} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/List.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Queue.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Queue.java deleted file mode 100644 index a5c31f5a09..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Queue.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; -import com.coding.basic.exception.*; -public class Queue { - - private LinkedList elementData; - - public Queue() { - elementData = new LinkedList(); - } - - public void enQueue(Object o){ - elementData.addLast(o); - } - - public Object deQueue(){ - if (isEmpty()) { - throw new EmptyQueueException("队空"); - } - Object result = elementData.removeFirst(); - return result; - } - - public boolean isEmpty(){ - return elementData.size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Stack.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Stack.java deleted file mode 100644 index e41c662792..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Stack.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.coding.basic; - -import com.coding.basic.exception.*; -public class Stack { - - private ArrayList elementData; - public Stack() { - elementData = new ArrayList(); - } - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (isEmpty()) { - throw new EmptyStackException("栈空"); - } - Object result = elementData.get(size()-1); - elementData.remove(size()-1); - return result; - } - - public Object peek(){ - if (isEmpty()) { - throw new EmptyStackException("栈空"); - } - return elementData.get(0); - } - - public boolean isEmpty(){ - return elementData.size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/ConcurrentModificationException.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/ConcurrentModificationException.java deleted file mode 100644 index f1c5c79721..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/ConcurrentModificationException.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic.exception; - -public class ConcurrentModificationException extends RuntimeException { - public ConcurrentModificationException() {} - public ConcurrentModificationException(String msg) { - super(msg); - } -} - diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyQueueException.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyQueueException.java deleted file mode 100644 index 2ee7aa4ee7..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyQueueException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic.exception; - -public class EmptyQueueException extends RuntimeException { - public EmptyQueueException() {} - public EmptyQueueException(String msg) { - super(msg); - } -} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyStackException.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyStackException.java deleted file mode 100644 index 2a5ae4055d..0000000000 --- a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyStackException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic.exception; - -public class EmptyStackException extends RuntimeException { - public EmptyStackException() {} - public EmptyStackException(String msg) { - super(msg); - } -} diff --git a/group11/1310368322/GitHub/.gitignore b/group11/1310368322/GitHub/.gitignore deleted file mode 100644 index 5e56e040ec..0000000000 --- a/group11/1310368322/GitHub/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin diff --git a/group11/1310368322/GitHub/src/ArrayList.java b/group11/1310368322/GitHub/src/ArrayList.java deleted file mode 100644 index 68b42b1c03..0000000000 --- a/group11/1310368322/GitHub/src/ArrayList.java +++ /dev/null @@ -1,79 +0,0 @@ -package Day_2017_2_20_DateStructure; - -public class ArrayList { - - - private int size = 0; - - private Object[] elementData = new Object[10]; - - private Exception Exception; - - public void add(Object o){ - if(size>elementData.length){ - elementData = ArrayList.grow(elementData, 10); - } - for(int i = 0; i < elementData.length; i++){ - if(null == elementData[i]){ - elementData[i] = o; - break; - } - } - size++; - } - public void add(int index, Object o){ - if(size>elementData.length){ - elementData = ArrayList.grow(elementData, 10); - } - if(index<0){ - System.out.println("λ"); - } - int k = -1; - for(int i = index; i < elementData.length; i++){ - if(null==elementData[i]){ - k = i-1; - break; - } - } - for(int i = k; i >= index;i--){ - elementData[i+1] = elementData[i]; - } - elementData[index] = o; - size++; - } - public Object get(int index){ - return elementData[index]; - } - - public Object remove(int index){ - while(true){ - elementData[index] = elementData[index+++1]; - if(elementData[index]==null){ - break; - } - } - size--; - return null; - } - public int size(){ - return -1; - } - public void getElementData(){ - for(int i = 0; i < elementData.length; i++){ - System.out.println(elementData[i]); - - } - } - public static Object[] grow(Object[] elementData2, int size){ - Object []target = new Object[elementData2.length+size]; - System.arraycopy(elementData2, 0, target, 0, elementData2.length); - return target; - } - - public static void main(String[] args) { - ArrayList a = new ArrayList(); - a.add("a"); - a.getElementData(); - System.out.println(a.size); - } -} diff --git a/group11/1310368322/GitHub/src/testGitHub.java b/group11/1310368322/GitHub/src/testGitHub.java deleted file mode 100644 index af74e99b53..0000000000 --- a/group11/1310368322/GitHub/src/testGitHub.java +++ /dev/null @@ -1,7 +0,0 @@ - -public class testGitHub { - private void mian() { - System.out.print("Hello GitHub"); - } - -} diff --git a/group11/171535320/ArrayList.java b/group11/171535320/ArrayList.java deleted file mode 100644 index e277814cc9..0000000000 --- a/group11/171535320/ArrayList.java +++ /dev/null @@ -1,62 +0,0 @@ -import java.util.Arrays; -import java.util.Objects; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - private void ensureCapacity(int minCapacity) { - if(minCapacity > elementData.length) { - Object[] temp = elementData; - int newCapacity = elementData.length * 3 / 2 + 1; - Object[] newArray = new Object[newCapacity]; - System.arraycopy(temp, 0, newArray, 0, elementData.length); - elementData = newArray; - } - } - - public void add(Object o){ - - - ensureCapacity(size + 1); - elementData[size++] = o; - } - - public void add(int index, Object o){ - ensureCapacity(size + 1); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - if(index >= size || index < 0) { - return null; - } - return elementData[index]; - } - - public Object remove(int index){ - if(index < 0 || index >= size) { - return null; - } - Object obj = elementData[index]; - - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - - elementData[--size] = null; - - return obj; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group11/171535320/BinaryTreeNode.java b/group11/171535320/BinaryTreeNode.java deleted file mode 100644 index 3c8d543355..0000000000 --- a/group11/171535320/BinaryTreeNode.java +++ /dev/null @@ -1,43 +0,0 @@ -public class BinaryTreeNode { - - private Node root = null; - - public void insert(int value) { - if(root == null) { - root = new Node(value); - root.leftNode = null; - root.rightNode = null; - } else { - Node current = root; - Node old = root; - while(true) { - if(value < current.value) { - if(current.leftNode == null) { - current.leftNode = new Node(value); - break; - } - old = current; - current = current.leftNode; - } else { - if(current.rightNode == null) { - current.rightNode = new Node(value); - break; - } - old = current; - current = current.rightNode; - } - } - } - } - -} - -class Node { - int value; - Node leftNode; - Node rightNode; - - public Node(int value) { - this.value = value; - } -} diff --git a/group11/171535320/Iterator.java b/group11/171535320/Iterator.java deleted file mode 100644 index 96a43dbe0a..0000000000 --- a/group11/171535320/Iterator.java +++ /dev/null @@ -1,5 +0,0 @@ -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group11/171535320/LinkedList.java b/group11/171535320/LinkedList.java deleted file mode 100644 index 43bb74e516..0000000000 --- a/group11/171535320/LinkedList.java +++ /dev/null @@ -1,152 +0,0 @@ -import java.util.Objects; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - if(head == null) { - head = new Node(); - head.data = o; - } else { - Node temp = head; - while(temp.next != null) { - temp = temp.next; - } - temp.next = new Node(); - temp.next.data = o; - } - } - - public void add(int index , Object o){ - if(index > size()) { - return ; - } - if(index == 0) { - Node newNode = new Node(); - newNode.data = o; - newNode.next = head; - head = newNode; - } else { - int temp = 0; - Node newNode = new Node(); - newNode.data = o; - Node tempNode = head; - while(temp != index - 1) { - tempNode = tempNode.next; - ++temp; - } - Node tempNode2 = tempNode.next; - tempNode.next = newNode; - newNode.next = tempNode2; - } - } - - public Object get(int index){ - if(index > size() || size() == 0) { - return null; - } - Node temp = head; - for(int i = 0; i < index; ++i) { - temp = temp.next; - } - - return temp.data; - } - - - public Object remove(int index){ - if(size() == 0) { - return null; - } - if(size() == 1) { - Object obj = head.data; - head = null; - return obj; - } - if(index == 0) { - Node temp = head; - head = head.next; - temp.next = null; - } else if(index > size()) { - return null; - } else { - int t = 0; - Node temp = head; - while(t != index - 1) { - temp = temp.next; - ++t; - } - Node result = temp.next; - temp.next = temp.next.next; - return result.data; - } - return null; - } - - public int size(){ - int len = 0; - Node temp = head; - while(temp != null) { - temp = temp.next; - ++len; - } - return len; - } - - public void addFirst(Object o){ - Node temp = new Node(); - temp.data = o; - temp.next = head; - head = temp; - } - public void addLast(Object o){ - Node newNode = new Node(); - newNode.data = o; - - if(size() == 0) { - head = newNode; - } - Node temp = head; - while(temp.next != null) { - temp = temp.next; - } - temp.next = newNode; - } - public Object removeFirst(){ - if(size() == 0) { - return null; - } - Node temp = head; - head = head.next; - return temp.data; - } - public Object removeLast(){ - if(size() == 0) { - return null; - } - if(size() == 1) { - Node temp = head.next; - head = head.next; - return temp.data; - } - Node temp1 = head; - Node temp2 = head.next; - while(temp2.next != null) { - temp1 = temp1.next; - temp2 = temp2.next; - } - temp1.next = null; - return temp2.data; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group11/171535320/List.java b/group11/171535320/List.java deleted file mode 100644 index 4f7bcc71a8..0000000000 --- a/group11/171535320/List.java +++ /dev/null @@ -1,7 +0,0 @@ -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group11/171535320/stackANDqueue/Queue.java b/group11/171535320/stackANDqueue/Queue.java deleted file mode 100644 index cbd885e73c..0000000000 --- a/group11/171535320/stackANDqueue/Queue.java +++ /dev/null @@ -1,34 +0,0 @@ -package stackANDqueue; - -import java.util.LinkedList; -import java.util.List; - -/** - * Created by dengdechao on 2017/2/22. - */ -public class Queue { - - private LinkedList queue = new LinkedList(); - - public void enQueue(Object o){ - queue.add(o); - } - - public Object deQueue(){ - if(queue.isEmpty()) { - return null; - } - return queue.removeFirst(); - } - - public boolean isEmpty(){ - if(queue.isEmpty()) { - return true; - } - return false; - } - - public int size(){ - return queue.size(); - } -} diff --git a/group11/171535320/stackANDqueue/Stack.java b/group11/171535320/stackANDqueue/Stack.java deleted file mode 100644 index 17ca9d6298..0000000000 --- a/group11/171535320/stackANDqueue/Stack.java +++ /dev/null @@ -1,52 +0,0 @@ -package stackANDqueue; - -import java.util.ArrayList; - -/** - * Created by dengdechao on 2017/2/22. - */ -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if(elementData.size() == 0) { - return null; - } - Object obj = null; - for(int i = 0; i < elementData.size(); ++i) { - obj = elementData.get(i); - } - int j = 0; - while(j < elementData.size()) { - ++j; - } - elementData.set(j - 1, null); - return obj; - } - - public Object peek(){ - if(elementData.size() == 0) { - return null; - } - Object obj = null; - for(int i = 0; i < elementData.size(); ++i) { - obj = elementData.get(i); - } - - return obj; - } - public boolean isEmpty(){ - if(elementData.size() == 0) { - return true; - } - - return false; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group11/252308879/dataStructure/.gitignore b/group11/252308879/dataStructure/.gitignore deleted file mode 100644 index c7175f9b40..0000000000 --- a/group11/252308879/dataStructure/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -dataStructure/.classpath -dataStructure/.project -dataStructure/.settings/ - -.project -.settings/ -target/ -# 忽略IntelliJ IDEA配置文件 -*.iml -*.idea/ diff --git a/group11/252308879/dataStructure/pom.xml b/group11/252308879/dataStructure/pom.xml deleted file mode 100644 index 4b756e4f0d..0000000000 --- a/group11/252308879/dataStructure/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - 4.0.0 - - org.apn.coding2017 - dataStructure - 1.0.0-SNAPSHOT - jar - - dataStructure - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 4.12 - test - - - diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/ArrayList.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/ArrayList.java deleted file mode 100644 index 3d2a685f35..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,212 +0,0 @@ -package org.apn.coding2017.basic; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -/** - * Created by QiPan on 2017/2/23. - */ -public class ArrayList implements List { - - private int size; - - // 设置默认容量 不可变 - private static final int DEFAULT_CAPACITY = 10; - - private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; - - private Object[] elementData; - - // 定义一个默认的空的数组,引用不可变 - private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; - - public ArrayList(int initialCapacity) { - if (initialCapacity > 0) { - this.elementData = new Object[initialCapacity]; - } else if (initialCapacity == 0) { - this.elementData = new Object[]{}; - } else { - throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); - } - } - - public ArrayList() { // 如果调用默认构造函数,设置容器为空的默认数组 - this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; - } - - - public boolean add(Object o) { - ensureCapacityInternal(size + 1); - elementData[size++] = o; - return true; - } - - @Override - public boolean add(int index, Object o) { - if (index > size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - ensureCapacityInternal(size + 1); - // 从插入位置开发,所有的数据需要往后移动 - System.arraycopy(elementData, index, elementData, index + 1, - size - index); - elementData[index] = o; - size++; - return true; - } - - public Object set(int index, Object element) { - checkIndexOutOf(index); - Object oldEle = elementData[index]; - elementData[index] = element; - return oldEle; - } - - public Object get(int index) { - checkIndexOutOf(index); - return elementData[index]; - } - - public Object remove(int index) { - checkIndexOutOf(index); - Object oldValue = elementData[index]; - - // 计算需要移动的位数 - int needMoveNum = size - index - 1; - - if (needMoveNum > 0) { - /* - * src:源数组; - * srcPos:源数组要复制的起始位置; - * dest:目的数组; - * destPos:目的数组放置的起始位置; - * length:复制的长度。 - */ - System.arraycopy(elementData, index + 1, elementData, index, needMoveNum); - } - // 避免对象游离,是的gcc能工作回收 - elementData[--size] = null; - return oldValue; - } - - public int size() { - return this.size; - } - - public boolean isEmpty() { - return this.size == 0; - } - - public Iterator iterator() { - return new Itr(); - } - - - private String outOfBoundsMsg(int index) { - return "Index: " + index + ", Size: " + size; - } - - /** - * 检查数组越界 - * - * @param index - */ - private void checkIndexOutOf(int index) { - if (index >= size) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - } - - private void ensureCapacityInternal(int minCapacity) { - // 如果是容器是默认的空的数组 - if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { - // 取得为与默认容量相比的较大值 - minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); - } - // 调用确保有能力放下那么多元素 - ensureExplicitCapacity(minCapacity); - } - - private void ensureExplicitCapacity(int minCapacity) { - // 防止容量溢出。所需的最小容器大于数组长度 - if (minCapacity - elementData.length > 0) { - grow(minCapacity); - } - } - - /** - * 扩充容量 - * - * @param minCapacity - */ - private void grow(int minCapacity) { - int oldCapacity = elementData.length; - // 得到一个新的容量大小,为 oldCapacity 的1.5倍 - int newCapacity = oldCapacity + (oldCapacity >> 1); - // 如果扩容后的大小比,最小容量(DEFAULT_CAPACITY: 10)小 - if (newCapacity - minCapacity < 0) { - newCapacity = minCapacity; - } else if (newCapacity - MAX_ARRAY_SIZE > 0) { // 扩容后比最大的还大,考虑溢出 - // - newCapacity = hugeCapacity(minCapacity); - } - - elementData = Arrays.copyOf(elementData, newCapacity); - } - - /** - * 这个很少用到这个判断,毕竟基本不会使用那么大容量存储 - * - * @param minCapacity - * @return - */ - private static int hugeCapacity(int minCapacity) { - if (minCapacity < 0) { - throw new OutOfMemoryError(); - } - return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; - } - - private class Itr implements Iterator { - - /** - * 当前游标 - */ - int cursor; - int lastRet = -1; // 是否是返回最后一个结果 - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public Object next() { - int i = cursor; - // 游标已经超过数组的大小 - if (i >= size) { - throw new NoSuchElementException(); - } - Object[] elementData = ArrayList.this.elementData; - - // 指向下一个元素 - cursor = i + 1; - Object elementDatum = elementData[i]; - lastRet = i; - return elementDatum; - } - - @Override - public void remove() { - if (lastRet < 0) { - throw new IllegalStateException(); - } - // 实际上这个时候的 lastRet,为 next方法时候的 i = cursor - ArrayList.this.remove(lastRet); - cursor = lastRet; - lastRet = -1; - } - } - - -} diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/BinaryTreeNode.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index 3725e5c71b..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.apn.coding2017.basic; - -/** - * Created by QiPan on 2017/2/23. - */ -public class BinaryTreeNode, Value> { - - private Node root; - - private class Node { - private Key key; - private Value value; - private Node left, right; //指向子树的链接 - private int N; // 以该节点为根的子树节点总数 - public Node(Key key, Value value, int N) { - this.key = key; - this.value = value; - this.N = N; - } - } - - public int size() { - return size(root); - } - - private int size(Node x) { - if (x == null) return 0; - else return x.N; - } - - public Value get(Key key){ - return get(root, key); - } - - private Value get(Node x, Key key) { - // 如果根节点也是Null 那么返回null - if (x == null){ - return null; - } - // 拿需要查询的key 与 根节点的 key 比较 - int cmp = key.compareTo(x.key); - if (cmp < 0){ // 如果小于0 那么去左子树上查询,并且递归调用 - return get(x.left, key); - }else if (cmp > 0){// 如果大于0 那么去右子树上查询,并且递归调用 - return get(x.right, key); - }else { - return x.value; - } - } - - public void push(Key key, Value value){ - // 查询key, 找到则更新它的值,否则就创建 - root = put(root, key, value); - } - - private Node put(Node x, Key key, Value value) { - // 如果key 存在于以 x 为根节点的子树中 则更新它的值 - // 否则将以key 和 value 为键值对的新节点插入到该子树中 - - if (x == null){ - return new Node(key, value, 1); - } - int cmp = key.compareTo(x.key); - if (cmp < 0 ){ - x.left = put(x.left, key, value); - }else if (cmp > 0){ - x.right = put(x.right, key, value); - }else { // 存在更新值 - x.value = value; - } - // 重新统计节点总数 - x.N = size(x.left) + size(x.right) + 1; - return x; - } - -} diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Iterator.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Iterator.java deleted file mode 100644 index 94dc84dfdc..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Iterator.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.apn.coding2017.basic; - -/** - * Created by QiPan on 2017/2/23. - */ -public interface Iterator { - boolean hasNext(); - - Object next(); - - void remove(); -} diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/LinkedList.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/LinkedList.java deleted file mode 100644 index e83de27c11..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.apn.coding2017.basic; - -/** - * Created by QiPan on 2017/2/23. - */ -public class LinkedList { - - private Node head; - private int size; - public LinkedList() { - head = new Node(null, null); - size = 0; - } - - public void add(Object o){ - add(size, o); - } - - public void add(int index , Object o){ - if (index > size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - Node frontNode = getNode(index-1); - Node newNode = new Node(o, frontNode.next); - frontNode.next = newNode; - size++; - - } - - private Node getNode(int index) { - Node node = head; - int i = 0; - while(node.next != null && i <= index) { - node = node.next; - i++; - } - return node; - } - - public Object get(int index){ - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - - Node node = getNode(index); - return node.data; - } - - public Object remove(int index){ - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - Node frontNode = getNode(index-1); - Node oldNode = getNode(index); - frontNode.next = oldNode.next; - size--; - return oldNode.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - add(0, o); - } - - public void addLast(Object o){ - add(size, o); - } - - public Object removeFirst(){ - return remove(0); - } - - public Object removeLast(){ - return remove(size-1); - } - - public Iterator iterator(){ - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator { - int index; - final int capacity = size; - LinkedListIterator() { - index = 0; - } - @Override - public boolean hasNext() { - return index < capacity; - } - - @Override - public Object next() { - return get(index++); - } - - @Override - public void remove() { - - } - } - - private String outOfBoundsMsg(int index) { - return "index:" + index + ", size:" + size; - } - - private static class Node { - Object data; - Node next; - - Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } - - -} diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/List.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/List.java deleted file mode 100644 index 15c9d9d3be..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/List.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.apn.coding2017.basic; - - -/** - * Created by QiPan on 2017/2/23. - */ -public interface List { - - boolean add(Object o); - - boolean add(int index, Object o); - - Object set(int index, Object element); - - Object get(int index); - - Object remove(int index); - - int size(); - - boolean isEmpty(); - - Iterator iterator(); -} diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Queue.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Queue.java deleted file mode 100644 index d51695b148..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Queue.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.apn.coding2017.basic; - -/** - * Created by QiPan on 2017/2/23. - * 队列,链表实现版本 - */ -public class Queue { - - private Node first; - private Node last; - private int N; - - private class Node { - E item; - Node next; - } - - public void enQueue(E e) { - // 向表尾添加元素 - Node oldLast = last; - last = new Node(); - last.item = e; - last.next = null; - if (isEmpty()){// 如果是往空的队列里面添加东西。那么首尾链表都是指向第一个元素 - first = last; - }else { - - oldLast.next = last; - } - N++; - } - - public E deQueue() { - E item = first.item; - first = first.next; - if (isEmpty()){ - last = null; - } - N--; - return item; - } - - public boolean isEmpty() { - return first == null; - } - - public int size() { - return N; - } -} diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack.java deleted file mode 100644 index 3233954cf8..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.apn.coding2017.basic; - -/** - * Created by QiPan on 2017/2/23. - */ -public class Stack { - - private E[] elements; - // 记录元素当前位置 - private int N; - - public Stack(int cap) { - elements = (E[]) new Object[cap]; - } - - public boolean isEmpty() { - return N == 0; - } - - public int size() { - return N; - } - - public void push(E e) { - // 如果 N 和数组的长度已经相同,就进行扩容 - if (N == elements.length) { - resize(2 * elements.length); - } - elements[N++] = e; - } - - public E pop() { - E element = elements[--N]; - elements[N] = null;// 避免对象游离 - // 如果元素值剩下容量的1/4,那么就把数组容量变成现在的一半 - if (N > 0 && N == elements.length / 4) { - resize(elements.length / 2); - } - return element; - } - - private void resize(int max) { - E[] elementTmps = (E[]) new Object[max]; - for (int i = 0; i < N; i++) { - elementTmps[i] = elements[i]; - } - // 指向扩容的数组 - elements = elementTmps; - } - -} diff --git a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack2.java b/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack2.java deleted file mode 100644 index 2769c72485..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/apn/coding2017/basic/Stack2.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.apn.coding2017.basic; - -/** - * Created by Pan on 2017/2/25. - * 栈(链表实现): 下压栈。操作栈顶元素 - */ -public class Stack2 { - - private Node first; - private int N; - - private class Node { - E item; - Node next; - } - - public boolean isEmpty(){ - return first == null; - } - - public int size(){ - return N; - } - - /** - * 向栈顶添加元素 - * @param element - */ - public void push (E element){ - Node oldFirst = first; - first = new Node(); - first.item = element; - first.next = oldFirst; - N++; - } - - /** - * 弹出栈顶元素 - * @return - */ - public E pop(){ - E item = first.item; - first = first.next; - N--; - return item; - } -} diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/TestJavaUtilArrayList.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/TestJavaUtilArrayList.java deleted file mode 100644 index 1b38998253..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/TestJavaUtilArrayList.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.apn.coding2017; - -import org.junit.Assert; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by QiPan on 2017/2/23. - */ -public class TestJavaUtilArrayList { - - - @Test - public void testAdd() { - List arrayList = new ArrayList(5); - arrayList.add(new Object()); - System.out.println("sssssssssssss"); - } - - @Test - public void testRightShift() { - int x = 5; - - x = x << 1; - x = x >> 1; - System.out.println(x); - } - -} diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/ArrayListTest.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/ArrayListTest.java deleted file mode 100644 index a52647b7df..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/ArrayListTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.apn.coding2017.basic; - -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by Pan on 2017/2/26. - */ -public class ArrayListTest { - - ArrayList arrayList; - - @Before - public void before(){ - arrayList = new ArrayList(); - arrayList.add(1); - arrayList.add(2); - arrayList.add(3); - } - - @Test - public void add() throws Exception { - ArrayList arrayList = new ArrayList(); - arrayList.add(3); - System.out.println(arrayList); - } - - @Test - public void set() throws Exception { - arrayList.add(3); - arrayList.set(0, 4); - System.out.println(arrayList); - } - - @Test - public void get() throws Exception { - arrayList.add(1); - arrayList.add(2); - arrayList.add(3); - Object o = arrayList.get(1); - System.out.println(o); - } - - @Test - public void remove() throws Exception { - arrayList.add(1); - arrayList.add(2); - arrayList.add(3); - arrayList.remove(1); - System.out.println(arrayList); - } - - @Test - public void size() throws Exception { - System.out.println(arrayList.size()); - } - - @Test - public void isEmpty() throws Exception { - System.out.println(arrayList.isEmpty()); - } - - @Test - public void iterator() throws Exception { - Iterator iterator = arrayList.iterator(); - while (iterator.hasNext()){ - Object next = iterator.next(); - System.out.println(next); - iterator.remove(); - } - System.out.println(arrayList.isEmpty()); - } - -} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/BinaryTreeNodeTest.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/BinaryTreeNodeTest.java deleted file mode 100644 index 8b15597ed2..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/BinaryTreeNodeTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.apn.coding2017.basic; - -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by Pan on 2017/2/26. - */ -public class BinaryTreeNodeTest { - - BinaryTreeNode binaryTreeNode; - - @Before - public void setUp() throws Exception { - binaryTreeNode = new BinaryTreeNode(); - binaryTreeNode.push(1, "A"); - binaryTreeNode.push(2, "B"); - binaryTreeNode.push(3, "C"); - binaryTreeNode.push(4, "D"); - } - - @Test - public void size() throws Exception { - System.out.println(binaryTreeNode.size()); - } - - @Test - public void get() throws Exception { - System.out.println(binaryTreeNode.get(3)); - } - - @Test - public void push() throws Exception { - binaryTreeNode.push(5, "E"); - System.out.println(binaryTreeNode); - } - -} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/LinkedListTest.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/LinkedListTest.java deleted file mode 100644 index f932e49cf0..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/LinkedListTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.apn.coding2017.basic; - -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by Pan on 2017/2/26. - */ -public class LinkedListTest { - - LinkedList linkedList; - - @Before - public void setUp() throws Exception { - linkedList = new LinkedList(); - linkedList.add(0); - linkedList.add(1); - linkedList.add(2); - linkedList.add(3); - } - - @Test - public void add() throws Exception { - linkedList.add(0); - System.out.println(linkedList); - } - - @Test - public void get() throws Exception { - Object o = linkedList.get(1); - System.out.println(o); - } - - @Test - public void remove() throws Exception { - linkedList.remove(1); - System.out.println(linkedList); - } - - @Test - public void size() throws Exception { - System.out.println(linkedList.size()); - } - - @Test - public void addFirst() throws Exception { - linkedList.addFirst(4); - System.out.println(linkedList); - } - - @Test - public void addLast() throws Exception { - linkedList.addLast(5); - System.out.println(linkedList); - } - - @Test - public void removeFirst() throws Exception { - linkedList.removeFirst(); - System.out.println(linkedList); - } - - @Test - public void removeLast() throws Exception { - linkedList.removeLast(); - System.out.println(linkedList); - } - - @Test - public void iterator() throws Exception { - Iterator iterator = linkedList.iterator(); - while (iterator.hasNext()){ - Object next = iterator.next(); - System.out.println(next); - iterator.remove(); - } - System.out.println(linkedList); - } - -} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/QueueTest.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/QueueTest.java deleted file mode 100644 index 0d52d8585f..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/QueueTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.apn.coding2017.basic; - -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by Pan on 2017/2/26. - */ -public class QueueTest { - - Queue queue; - - @Before - public void setUp() throws Exception { - queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - - } - - @Test - public void enQueue() throws Exception { - queue.enQueue(1); - System.out.println(queue); - } - - @Test - public void deQueue() throws Exception { - queue.deQueue(); - System.out.println(queue); - } - - @Test - public void isEmpty() throws Exception { - System.out.println(queue.isEmpty()); - } - - @Test - public void size() throws Exception { - System.out.println(queue.size()); - } - -} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/StackTest.java b/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/StackTest.java deleted file mode 100644 index f1798f8329..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/apn/coding2017/basic/StackTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.apn.coding2017.basic; - -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by Pan on 2017/2/26. - */ -public class StackTest { - - Stack stack; - - @Before - public void setUp() throws Exception { - stack = new Stack(3); - stack.push(1); - stack.push(2); - stack.push(3); - } - - @Test - public void isEmpty() throws Exception { - System.out.println(stack.isEmpty()); - } - - @Test - public void size() throws Exception { - System.out.println(stack.size()); - } - - @Test - public void push() throws Exception { - stack.push(1); - stack.push(2); - stack.push(3); - System.out.println(stack); - } - - @Test - public void pop() throws Exception { - stack.pop(); - System.out.println(stack); - } - -} \ No newline at end of file diff --git a/group11/283091182/src/com/coding/basic/ArrayList.java b/group11/283091182/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 402d05c019..0000000000 --- a/group11/283091182/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private static final int GROW_BY_SIZE = 10; - - private Object[] elementData = new Object[GROW_BY_SIZE]; - - public void add(Object o){ - if(size == elementData.length){ - grow(); - } - elementData[size]=o; - size++; - } - public void add(int index, Object o){ - validate(index); - if(size == elementData.length){ - grow(); - } - for(int i=size;i>index+1;i--){ - elementData[i]=elementData[i-1]; - } - elementData[index]=o; - size++; - } - - public Object get(int index){ - validate(index); - return elementData[index]; - } - - public Object remove(int index){ - validate(index); - Object result = elementData[index]; - for(int i =index;i=size)throw new IndexOutOfBoundsException("Invalid Index:"+pos); - Object result = elementData[pos]; - pos++; - return result; - } - - - } - - private void grow(){ - elementData = Arrays.copyOf(elementData, elementData.length+GROW_BY_SIZE); - } - private void validate(int index){ - if(index<0||index>=size)throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - @Override - public String toString(){ - StringBuilder sb = new StringBuilder("["); - for(int i=0;i1)sb.append(","); - sb.append(elementData[i]); - } - sb.append("]size=").append(this.size()); - return sb.toString(); - } - - public static void main(String[] args){ - ArrayList l = new ArrayList(); - for(int i=0;i<12;i++){ - l.add(i+""); - } - System.out.println(l); - l.add("aaa"); - System.out.println("After adding aaa:"+l); - l.add(2,"bbb"); - System.out.println("After adding bbb:"+l); - System.out.println(l.get(2)); - System.out.println("After getting:"+l); - System.out.println(l.remove(2)); - System.out.println("After removing:"+l); - Iterator it = l.iterator(); - while(it.hasNext()){ - System.out.println(it.next()); - } - } - -} diff --git a/group11/283091182/src/com/coding/basic/BinaryTreeNode.java b/group11/283091182/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 7f2a030983..0000000000 --- a/group11/283091182/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - public BinaryTreeNode(Object o,BinaryTreeNode leftChild,BinaryTreeNode rightChild){ - this.data = o; - this.left = leftChild; - this.right = rightChild; - } - public BinaryTreeNode insert(Object o){ - if(!(o instanceof Comparable)){ - throw new RuntimeException("Incompareable Oject:"+o); - } - System.out.println("CurrentNode Value="+data); - if(((Comparable)o).compareTo(data)>0){ - System.out.print(o+" is greater than "+data+",insert to right;"); - if(this.right==null){ - System.out.println("Creating new rightChild;"); - this.right = new BinaryTreeNode(o,null,null); - }else{ - System.out.println("rightChild exists,Conitnue to insert to rightChild"); - this.right.insert(o); - } - } - if(((Comparable)o).compareTo(data)<0){ - System.out.print(o+" is less than "+data+",insert to left;"); - if(this.left==null){ - System.out.println("Creating new leftChild;"); - this.left = new BinaryTreeNode(o,null,null); - }else{ - System.out.println("leftChild exists,Conitnue to insert to leftChild"); - this.left.insert(o); - } - } - return this; - } - - public static void main(String[] args){ - Integer one = new Integer(1); - Integer two = new Integer(2); - System.out.println(one.compareTo(two)); - System.out.println(two.compareTo(one)); - System.out.println(one.compareTo(one)); - BinaryTreeNode btn = new BinaryTreeNode(new Integer(5),null,null); - btn.insert(new Integer(2)); - btn.insert(new Integer(7)); - btn.insert(new Integer(1)); - btn.insert(new Integer(6)); - inOrderTraversal(btn); - btn.insert(new Integer(4)); - btn.insert(new Integer(8)); - inOrderTraversal(btn); - } - //in-order traversal to print all nodes in sorted order - private static void inOrderTraversal(BinaryTreeNode btn){ - if(btn!=null){ - if(btn.left!=null){ - inOrderTraversal(btn.left); - } - System.out.println(btn.data); - if(btn.right!=null){ - inOrderTraversal(btn.right); - } - } - } - -} diff --git a/group11/283091182/src/com/coding/basic/Iterator.java b/group11/283091182/src/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/group11/283091182/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group11/283091182/src/com/coding/basic/LinkedList.java b/group11/283091182/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 233c243130..0000000000 --- a/group11/283091182/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head = null; - private int size = 0; - - public void add(Object o){ - if(head==null){ - head = new Node(o); - }else{ - Node temp = head; - while(temp.hasNext()){ - temp = temp.next; - } - temp.next = new Node(o); - } - size++; - - } - public void add(int index , Object o){ - validate(index); - if(index==0){ - Node newNode = new Node(o,head); - head = newNode; - }else{ - Node temp = head; - for(int i=0;i=size)throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - private static class Node{ - Object data; - Node next; - public boolean hasNext(){ - return (this.next!=null); - } - public Node(Object data,Node next){ - this.data = data; - this.next = next; - } - public Node(Object data){ - this.data = data; - this.next = null; - } - } - @Override - public String toString(){ - StringBuilder sb = new StringBuilder("["); - Node temp = head; - while(temp!=null){ - if(sb.length()>1)sb.append(","); - sb.append(temp.data); - temp = temp.next; - } - sb.append("]size=").append(this.size()); - return sb.toString(); - } - public static void main(String[] args){ - LinkedList l = new LinkedList(); - for(int i=0;i<12;i++){ - l.add(i+""); - } - System.out.println(l); - l.add("aaa"); - System.out.println("After adding aaa:"+l); - l.add(2,"bbb"); - System.out.println("After adding bbb:"+l); - System.out.println(l.get(2)); - System.out.println("After getting:"+l); - System.out.println(l.remove(2)); - System.out.println("After removing:"+l); - l.addFirst("first"); - System.out.println("After add First:"+l); - l.addLast("last"); - System.out.println("After add Last:"+l); - System.out.println(l.removeFirst()); - System.out.println("After remove First:"+l); - System.out.println(l.removeLast()); - System.out.println("After remove Last:"+l); - Iterator it = l.iterator(); - while(it.hasNext()){ - System.out.println(it.next()); - } - //it.next(); - } -} diff --git a/group11/283091182/src/com/coding/basic/List.java b/group11/283091182/src/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/group11/283091182/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group11/283091182/src/com/coding/basic/Queue.java b/group11/283091182/src/com/coding/basic/Queue.java deleted file mode 100644 index 45fea2a118..0000000000 --- a/group11/283091182/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList list = new LinkedList(); - - public void enQueue(Object o){ - list.add(o); - } - - public Object deQueue(){ - if(list.size()==0)throw new RuntimeException("Queue is empty."); - return list.removeFirst(); - } - - public boolean isEmpty(){ - return (list.size()==0); - } - - public int size(){ - return list.size(); - } - - @Override - public String toString(){ - return this.list.toString(); - } - - public static void main(String[] args){ - Queue q = new Queue(); - q.enQueue("aaa"); - q.enQueue("bbb"); - System.out.println(q); - System.out.println(q.isEmpty()); - System.out.println(q.size()); - q.deQueue(); - q.deQueue(); - System.out.println(q); - System.out.println(q.isEmpty()); - System.out.println(q.size()); - //q.deQueue(); - } -} diff --git a/group11/283091182/src/com/coding/basic/Stack.java b/group11/283091182/src/com/coding/basic/Stack.java deleted file mode 100644 index 915d173b1b..0000000000 --- a/group11/283091182/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if(elementData.size()==0)throw new RuntimeException("Stack is empty."); - return elementData.remove(elementData.size()-1); - } - - public Object peek(){ - if(elementData.size()==0)throw new RuntimeException("Stack is empty."); - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return (elementData.size()==0); - } - public int size(){ - return elementData.size(); - } - - @Override - public String toString(){ - return elementData.toString(); - } - - public static void main(String[] args){ - Stack s = new Stack(); - s.push("aaa"); - s.push("bbb"); - s.push("ccc"); - System.out.println(s); - System.out.println(s.isEmpty()); - System.out.println(s.size()); - System.out.println(s.peek()); - System.out.println(s.pop()); - System.out.println(s.pop()); - System.out.println(s.pop()); - System.out.println(s); - System.out.println(s.isEmpty()); - System.out.println(s.size()); - //System.out.println(s.pop()); - } -} diff --git a/group11/395443277/data_structure/.gitignore b/group11/395443277/data_structure/.gitignore deleted file mode 100644 index e02fdb6730..0000000000 --- a/group11/395443277/data_structure/.gitignore +++ /dev/null @@ -1,111 +0,0 @@ - - -.metadata - -bin/ - -tmp/ - -*.tmp - -*.bak - -*.swp - -*~.nib - -local.properties - -.settings/ - -.loadpath - -.recommenders - - - -# Eclipse Core - -.project - - - -# External tool builders - -.externalToolBuilders/ - - - -# Locally stored "Eclipse launch configurations" - -*.launch - - - -# PyDev specific (Python IDE for Eclipse) - -*.pydevproject - - - -# CDT-specific (C/C++ Development Tooling) - -.cproject - - - -# JDT-specific (Eclipse Java Development Tools) - -.classpath - - - -# Java annotation processor (APT) - -.factorypath - - - -# PDT-specific (PHP Development Tools) - -.buildpath - - - -# sbteclipse plugin - -.target - - - -# Tern plugin - -.tern-project - - - -# TeXlipse plugin - -.texlipse - - - -# STS (Spring Tool Suite) - -.springBeans - - - -# Code Recommenders - -.recommenders/ - - - -# Scala IDE specific (Scala & Java development for Eclipse) - -.cache-main - -.scala_dependencies - -.worksheet \ No newline at end of file diff --git a/group11/395443277/data_structure/src/com/coding/basic/ArrayList.java b/group11/395443277/data_structure/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 93a2781f3b..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[4]; - - public void add(Object o){ - if (size == elementData.length) { - // double size - doubleSize(); - } - - elementData[size] = o; - size++; - } - - private void doubleSize() { - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - - public void add(int index, Object o){ - // check size - if (size == elementData.length) { - doubleSize(); - } - - //shift and add element - System.arraycopy(elementData, index, elementData, index+1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - return elementData[index]; - } - - public Object remove(int index){ - if (size == 0) { - return null; - } - - // remove element and shift - Object target = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, size - index - 1); - - // reset last element - elementData[size-1] = null; - size--; - return target; - } - - public int size(){ - return size; - } - - public Iterator iterator (){ - return new SeqIterator(); - } - - private class SeqIterator implements Iterator { - int i = 0; - - @Override - public boolean hasNext() { - return i < size; - } - - @Override - public Object next() { - if (!hasNext()) { - return null; - } - return elementData[i++]; - } - - } - -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/ArrayListTest.java b/group11/395443277/data_structure/src/com/coding/basic/ArrayListTest.java deleted file mode 100644 index 75bae320f4..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.coding.basic; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class ArrayListTest { - - @Test - public void testAddObject() { - ArrayList list = new ArrayList(); - list.add(5); - assertEquals(5, list.get(0)); - - list.add(4); - list.add(3); - list.add(2); - list.add(1); - assertEquals(1, list.get(4)); - - // size equals to 5 - assertEquals(5, list.size()); - } - - @Test - public void testAddIntObject() { - ArrayList list = new ArrayList(); - list.add(5); - list.add(4); - list.add(3); - list.add(2); - list.add(1); - - // change position 2 element - list.add(2, 10); - - // pos 2 has 10 - assertEquals(10, list.get(2)); - - // last element is 1 - assertEquals(1, list.get(5)); - - // size is 6 - assertEquals(6, list.size()); - } - - @Test - public void testRemove() { - ArrayList list = new ArrayList(); - list.add(5); - list.add(4); - list.add(3); - list.add(2); - list.add(1); - - Object removed = list.remove(2); - assertEquals(removed, 3); - - assertEquals(2, list.get(2)); - assertEquals(4, list.size()); - assertEquals(null, list.get(4)); - - list.add(6); - assertEquals(6, list.get(4)); - } - - @Test - public void testIterator() { - ArrayList list = new ArrayList(); - list.add(5); - list.add(4); - list.add(3); - list.add(2); - list.add(1); - - Iterator it = list.iterator(); - if(it.hasNext()) { - assertEquals(5, it.next()); - assertEquals(4, it.next()); - } - - } - -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNode.java b/group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 907fc23275..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode implements Comparable{ - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - if (this.compareTo(o)==0) { - return null; - } else { - // current value less than inserted value - // go right - if (this.compareTo(o)<0) { - if (this.right == null) { - BinaryTreeNode nd = new BinaryTreeNode(); - nd.setData(o); - this.setRight(nd); - } else { - this.getRight().insert(o); - } - } - // greater than - // go left - else if(this.compareTo(o)>0) { - if (this.left == null) { - BinaryTreeNode nd = new BinaryTreeNode(); - nd.setData(o); - this.setLeft(nd); - } else { - this.getLeft().insert(o); - } - } - } - - return null; - } - - /** - * oversimplified implementation: only allows int and string - */ - @Override - public int compareTo(Object nd) throws ClassCastException{ - if (!(nd instanceof Object)) { - throw new ClassCastException("An object expected."); - } - - if (nd instanceof String) { - return ((String)this.data).compareTo((String) nd); - } else { - return ((int) this.data) -((int) nd); - } - } - -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNodeTest.java b/group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNodeTest.java deleted file mode 100644 index 1c5c637ccd..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/BinaryTreeNodeTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coding.basic; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class BinaryTreeNodeTest { - - @Test - public void testInsert() { - BinaryTreeNode root = new BinaryTreeNode(); - root.setData(3); - - root.insert(2); - BinaryTreeNode left = root.getLeft(); - assertEquals(2,left.getData()); - - root.insert(5); - BinaryTreeNode right = root.getRight(); - assertEquals(5, right.getData()); - - root.insert(7); - BinaryTreeNode rr = right.getRight(); - assertEquals(7, rr.getData()); - } - - @Test - public void testCompareTo() { - BinaryTreeNode n1 = new BinaryTreeNode(); - n1.setData("abc"); - - assertEquals(true, n1.compareTo("cde")<0); - - BinaryTreeNode n3 = new BinaryTreeNode(); - n3.setData(1); - - assertEquals(true, n3.compareTo(2)<0); - } - -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/Iterator.java b/group11/395443277/data_structure/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/LinkedList.java b/group11/395443277/data_structure/src/com/coding/basic/LinkedList.java deleted file mode 100644 index fb9fbd81ca..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - private Node head; - - public void add(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - - if (head == null) { - head = newNode; - } else { - Node curr = head; - while(curr.next != null) { - curr = curr.next; - } - curr.next = newNode; - } - } - public void add(int index , Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - - if (head == null) { - head = newNode; - } else { - Node curr = head; - Node prev = curr; - while(index >0 && curr.next != null) { - prev = curr; - curr = curr.next; - index--; - } - - prev.next = newNode; - newNode.next = curr; - } - } - public Object get(int index){ - Node curr = head; - while(index > 0) { - curr = curr.next; - index--; - } - return curr.data; - } - public Object remove(int index){ - if (index ==0) { - return this.removeFirst(); - } - - Node curr = head; - Node prev = curr; - while(index >0 && curr.next != null) { - prev = curr; - curr = curr.next; - index--; - } - - Object target = curr.data; - prev.next = curr.next; - curr.next = null; - - return target; - } - public int size(){ - int size = 0; - Node curr = head; - while(curr != null) { - size++; - curr = curr.next; - } - return size; - } - public void addFirst(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - - if (head == null) { - head = newNode; - } else { - newNode.next = head.next; - head.next = newNode; - } - } - public void addLast(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - - Node curr = head; - if (head == null) { - head = newNode; - } else { - while(curr.next != null) { - curr = curr.next; - } - curr.next = newNode; - } - } - public Object removeFirst(){ - if (head == null) { - return null; - } - - Object target = head.data; - head = head.next; - return target; - } - public Object removeLast(){ - if (head == null) { - return null; - } - Node curr = head; - Node prev = curr; - while(curr.next != null) { - prev = curr; - curr = curr.next; - } - Object target = curr.data; - prev.next = null; - return target; - } - public Iterator iterator(){ - return new SeqIterator(); - } - - private class SeqIterator implements Iterator { - Node curr = head; - - @Override - public boolean hasNext() { - return curr != null; - } - - @Override - public Object next() { - if (!hasNext()) throw new NoSuchElementException(); - Object target = curr.data; - curr = curr.next; - return target; - } - - } - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/LinkedListTest.java b/group11/395443277/data_structure/src/com/coding/basic/LinkedListTest.java deleted file mode 100644 index af5aa2d3a2..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/LinkedListTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.coding.basic; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class LinkedListTest { - - @Test - public void testAddObject() { - LinkedList list = new LinkedList(); - list.add(5); - assertEquals(1, list.size()); - assertEquals(5, list.get(0)); - - list.add(4); - list.add(3); - list.add(2); - assertEquals(4, list.size()); - assertEquals(4, list.get(1)); - assertEquals(3, list.get(2)); - assertEquals(2, list.get(3)); - } - - @Test - public void testAddIntObject() { - LinkedList list = new LinkedList(); - list.add(0, 5); - assertEquals(1, list.size()); - assertEquals(5, list.get(0)); - - list.add(4); - list.add(3); - list.add(2); - - list.add(1, 1); - assertEquals(1, list.get(1)); - } - - @Test - public void testRemove() { - LinkedList list = new LinkedList(); - assertEquals(null, list.remove(0)); - list.add(4); - assertEquals(4, list.remove(0)); - - list.add(5); - list.add(-1); - list.add(16); - list.add(2); - list.add(7); - assertEquals(16, list.remove(2)); - assertEquals(4, list.size()); - assertEquals(2, list.get(2)); - } - - @Test - public void testAddFirst() { - LinkedList list = new LinkedList(); - list.addFirst(5); - assertEquals(1, list.size()); - assertEquals(5, list.get(0)); - - list.addFirst(4); - list.addFirst(3); - list.addFirst(2); - assertEquals(4, list.size()); - assertEquals(2, list.get(1)); - assertEquals(3, list.get(2)); - assertEquals(4, list.get(3)); - } - - @Test - public void testAddLast() { - LinkedList list = new LinkedList(); - list.addLast(5); - assertEquals(1, list.size()); - assertEquals(5, list.get(0)); - - list.addLast(4); - list.addLast(3); - list.addLast(2); - assertEquals(4, list.size()); - assertEquals(4, list.get(1)); - assertEquals(3, list.get(2)); - assertEquals(2, list.get(3)); - } - - @Test - public void testRemoveFirst() { - LinkedList list = new LinkedList(); - assertEquals(null, list.removeFirst()); - - list.add(4); - list.add(3); - list.add(2); - assertEquals(4, list.removeFirst()); - assertEquals(3, list.removeFirst()); - assertEquals(2, list.removeFirst()); - } - - @Test - public void testRemoveLast() { - LinkedList list = new LinkedList(); - assertEquals(null, list.removeLast()); - - list.add(4); - list.add(3); - list.add(2); - assertEquals(2, list.removeLast()); - assertEquals(3, list.removeLast()); - } - - @Test - public void testIterator() { - LinkedList list = new LinkedList(); - list.add(4); - list.add(3); - list.add(2); - - Iterator it = list.iterator(); - - assertEquals(4, it.next()); - assertEquals(3, it.next()); - assertEquals(2, it.next()); - } -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/List.java b/group11/395443277/data_structure/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/Queue.java b/group11/395443277/data_structure/src/com/coding/basic/Queue.java deleted file mode 100644 index f12e73d46d..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - return elementData.removeFirst(); - } - - public boolean isEmpty(){ - return elementData.size()==0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/QueueTest.java b/group11/395443277/data_structure/src/com/coding/basic/QueueTest.java deleted file mode 100644 index bd1ec0487a..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/QueueTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coding.basic; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class QueueTest { - - @Test - public void testEnQueue() { - Queue q = new Queue(); - assertEquals(0, q.size()); - - q.enQueue(1); - q.enQueue(2); - q.enQueue(3); - } - - @Test - public void testDeQueue() { - Queue q = new Queue(); - q.enQueue(1); - q.enQueue(2); - q.enQueue(3); - assertEquals(1, q.deQueue()); - assertEquals(2, q.deQueue()); - } - -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/Stack.java b/group11/395443277/data_structure/src/com/coding/basic/Stack.java deleted file mode 100644 index 28b9e8a203..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - return elementData.remove(elementData.size()-1); - } - - public Object peek(){ - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return elementData.size()==0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group11/395443277/data_structure/src/com/coding/basic/StackTest.java b/group11/395443277/data_structure/src/com/coding/basic/StackTest.java deleted file mode 100644 index 7b3c4d2cf6..0000000000 --- a/group11/395443277/data_structure/src/com/coding/basic/StackTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coding.basic; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class StackTest { - - @Test - public void testPush() { - Stack st = new Stack(); - st.push(1); - assertEquals(1, st.peek()); - - st.push(2); - st.push(3); - st.push(4); - assertEquals(4, st.peek()); - } - - @Test - public void testPop() { - Stack st = new Stack(); - assertEquals(null, st.pop()); - - st.push(1); - assertEquals(1, st.pop()); - - st.push(2); - st.push(3); - st.push(4); - assertEquals(4, st.pop()); - } - - @Test - public void testIsEmpty() { - Stack st = new Stack(); - assertEquals(true, st.isEmpty()); - - st.push(1); - assertEquals(false, st.isEmpty()); - } - - -} diff --git a/group11/635189253/dataStructure/.classpath b/group11/635189253/dataStructure/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group11/635189253/dataStructure/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group11/635189253/dataStructure/.gitignore b/group11/635189253/dataStructure/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group11/635189253/dataStructure/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group11/635189253/dataStructure/.project b/group11/635189253/dataStructure/.project deleted file mode 100644 index 35bb23a0fc..0000000000 --- a/group11/635189253/dataStructure/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - dataStructure - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group11/635189253/dataStructure/src/com/coding/basic/ArrayList.java b/group11/635189253/dataStructure/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 033cb6b5f5..0000000000 --- a/group11/635189253/dataStructure/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public boolean add(Object o){ - add(size(), o); - size++; - return true; - } - public boolean add(int index, Object o){ - if (index >= 0 && index < elementData.length) { - for (int i = size(); i > index; i--) { - elementData[i] = elementData[i-1]; - } - elementData[index] = o; - } - size++; - return true; - } - - public Object get(int index){ - if (index >= 0 && index < size()) { - return elementData[index]; - } -// return null; - throw new ArrayIndexOutOfBoundsException(); - } - - public Object remove(int index){ - Object removedItem = elementData[index]; - if (index > size()) { - throw new ArrayIndexOutOfBoundsException(); - } - for (int i = index; i < size() - 1; i++) { - elementData[i] = elementData[i+1]; - } - size--; - return removedItem; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator { - - private int current = 0; - - public boolean hasNext() { - return current < size(); - } - - public Object next() { -/* if (elementData[current+1] != null) { - return elementData[current+1]; - } else { - return null; - }*/ - if (!hasNext()) { - throw new java.util.NoSuchElementException(); - } - return elementData[current++]; - } - } - -} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/BinaryTreeNode.java b/group11/635189253/dataStructure/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group11/635189253/dataStructure/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/Iterator.java b/group11/635189253/dataStructure/src/com/coding/basic/Iterator.java deleted file mode 100644 index e7cbd474ec..0000000000 --- a/group11/635189253/dataStructure/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/LinkedList.java b/group11/635189253/dataStructure/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 26818d8741..0000000000 --- a/group11/635189253/dataStructure/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,191 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private int size; - private int modCount = 0; - private Node beginMarker; - private Node endMarker; - - private static class Node{ - public Node( Object d, Node p, Node n) { - data = d; - prev = p; - next = n; - } - public Object data; - public Node prev; - public Node next; - } - - public LinkedList () { - doClear(); - } - - public void clear() { - doClear(); - } - - private void doClear() { - beginMarker = new Node(null, null, null); - endMarker = new Node(null, beginMarker, null); - beginMarker.next = endMarker; - - size = 0; - modCount++; - } - - public boolean add(Object o){ - add(size(), o); - return true; - } - public boolean add(int index , Object o){ - /*if (index < 0 && index > size()) { - throw new IndexOutOfBoundsException(); - }*/ - addBefore( getNode( index, 0, size()), o); - return true; - } - - public void addFirst(Object o){ - add(0, o); - } - - public void addLast(Object o){ - add(size(), o); - } - - public Object removeFirst(){ - return remove(0); - } - - public Object removeLast(){ - return remove(size()); - } - - public Object get(int index){ - return getNode(index).data; - } - public Object remove(int index){ - return remove(getNode(index)); - } - - public int size(){ - return size; - } - - public boolean isEmpty() { - return size() == 0; - } - - private void addBefore( Node p, Object o ) { - Node newNode = new Node(o, p.prev, p ); - newNode.prev.next = newNode; - p.prev = newNode; -// p.prev = p.prev.next = new Node(o, p.prev, p); - size++; - modCount++; - } - - private Node getNode(int idx) { - return getNode(idx, 0, size() - 1); - } - - private Node getNode(int idx, int lower, int upper) { - Node p; - if (idx < lower || idx > upper) { - throw new IndexOutOfBoundsException(); - } - - if (idx < size() / 2) { - p = beginMarker.next; - for (int i = 0; i < idx; i++) { - p = p.next; - } - } else { - p = endMarker.prev; - for (int i = size(); i > idx; i--) { - p = p.prev; - } - } - return p; - } - - private Object remove( Node p ) { - p.prev.next = p.next; - p.next.prev = p.prev; - modCount++; - size--; - - return p.data; - } - - - public java.util.Iterator iterator() { - return new LinkListIterator(); - } - - private class LinkListIterator implements java.util.Iterator { - - private Node current = beginMarker.next; - private int expectedModCount = modCount; - private boolean okToRemove = false; - - @Override - public boolean hasNext() { - return current != endMarker; - } - - @Override - public Object next() { - if ( modCount != expectedModCount ) { - throw new java.util.ConcurrentModificationException(); - } - if (!hasNext()) { - throw new java.util.NoSuchElementException(); - } - Object nextItem = current.next; - current = current.next; - okToRemove = true; - return nextItem; - } - - public void remove() { - if ( modCount != expectedModCount ) { - throw new java.util.ConcurrentModificationException(); - } - if ( !okToRemove ) { - throw new IllegalStateException(); - } - LinkedList.this.remove(current.prev); - expectedModCount++; - okToRemove = false; - - } - } -} - -class TestLinkLedList { - - public static void main(String[] args) { - LinkedList lst = new LinkedList(); - for (int i = 0; i < 10; i++) { - lst.add(i); - } - for (int i = 20; i < 30; i++) { - lst.add(0, i); - } - - lst.remove(0); - lst.remove(lst.size()-1); - - System.out.println(lst); - - java.util.Iterator itr = lst.iterator(); - while (itr.hasNext()) { - itr.next(); - itr.remove(); - System.out.println(lst); - } - } -} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/List.java b/group11/635189253/dataStructure/src/com/coding/basic/List.java deleted file mode 100644 index 66beb2b1c6..0000000000 --- a/group11/635189253/dataStructure/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public boolean add(Object o); - public boolean add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/Queue.java b/group11/635189253/dataStructure/src/com/coding/basic/Queue.java deleted file mode 100644 index 46890b2b03..0000000000 --- a/group11/635189253/dataStructure/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList elementData; - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/Stack.java b/group11/635189253/dataStructure/src/com/coding/basic/Stack.java deleted file mode 100644 index a5a04de76d..0000000000 --- a/group11/635189253/dataStructure/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group11/729245768/DataStructure/src/main/coding_170225/ArrayList.java b/group11/729245768/DataStructure/src/main/coding_170225/ArrayList.java deleted file mode 100644 index d0a81044c6..0000000000 --- a/group11/729245768/DataStructure/src/main/coding_170225/ArrayList.java +++ /dev/null @@ -1,86 +0,0 @@ -import java.util.Arrays; - -/** - * Created by peter on 2017/2/22. - */ -public class ArrayList { - private Object[] elements = new Object[10]; - private int position = 0; - //添加元素 - public void add(Object o){ - //首先判断当前数组是否已满 - if(position==elements.length){ - ensureCapacity();//如果到达则扩展数组长度 - } - elements[position++] = o; - } - //在index位置添加元素 - public void add(int index,Object o){ - if(index<0||index>position){ - System.out.println("invalid index"); - throw new ArrayIndexOutOfBoundsException(); - } - if(position==elements.length){ - //如果此时数组已满 - ensureCapacity(); - } - for(int i=position-1;i>=index;i--){ - elements[i+1] = elements[i];//元素向后移动一位 - } - elements[index] = o; - position++;//数组元素个数加一 - } - - //获取index位置的元素 - public Object get(int index){ - if(index<0||index>position-1){ - System.out.println("不合法的index"); - throw new ArrayIndexOutOfBoundsException(); - } - return elements[index]; - } - - //删除index位置的元素 - public Object remove(int index){ - if(index<0||index>position-1){ - System.out.println("不合法的index"); - throw new ArrayIndexOutOfBoundsException(); - } - position--; - return elements[position+1]; - } - public int size(){ - return position; - } - //返回一个迭代器 - public Iterator getIterator(){ - return new ArrayListIterator(this); - } - //扩展数组大小,在原来基础上扩展一倍 - public void ensureCapacity(){ - elements = Arrays.copyOf(elements,elements.length); - } - private class ArrayListIterator implements Iterator{ - private ArrayList list; - int position=-1; - public ArrayListIterator(ArrayList list){ - this.list=list; - } - @Override - public boolean hasNext() { - if(++position=binaryTreeNode.getData()){ - //插入到左孩子 - parent.setLeft(binaryTreeNode); - }else{ - //插入到右孩子 - parent.setRight(binaryTreeNode); - } - } - //输出二叉树每个节点 - public void printBinaryTreeNode(BinaryTreeNode root){ - if(root==null){ - return; - } - if(root.getLeft()!=null){ - printBinaryTreeNode(root.getLeft()); - } - System.out.println(root.getData()); - if(root.getRight()!=null){ - printBinaryTreeNode(root.getRight()); - } - } - //获取根节点 - public BinaryTreeNode getRoot(){ - return root; - } -} diff --git a/group11/729245768/DataStructure/src/main/coding_170225/BinaryTreeNode.java b/group11/729245768/DataStructure/src/main/coding_170225/BinaryTreeNode.java deleted file mode 100644 index 0cea0f59c7..0000000000 --- a/group11/729245768/DataStructure/src/main/coding_170225/BinaryTreeNode.java +++ /dev/null @@ -1,40 +0,0 @@ - -/** - * Created by peter on 2017/2/23. - */ -public class BinaryTreeNode{ - private int data; - private BinaryTreeNode left=null; - private BinaryTreeNode right=null; - public BinaryTreeNode(){ - - } - - public BinaryTreeNode(int data){ - this.data=data; - } - - public int getData() { - return data; - } - - public void setData(int data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } -} diff --git a/group11/729245768/DataStructure/src/main/coding_170225/Iterator.java b/group11/729245768/DataStructure/src/main/coding_170225/Iterator.java deleted file mode 100644 index a833ba0acd..0000000000 --- a/group11/729245768/DataStructure/src/main/coding_170225/Iterator.java +++ /dev/null @@ -1,9 +0,0 @@ - -/** - * Created by peter on 2017/2/23. - */ -public interface Iterator { - public boolean hasNext(); - public Object next(); - public Object remove(); -} diff --git a/group11/729245768/DataStructure/src/main/coding_170225/LinkedList.java b/group11/729245768/DataStructure/src/main/coding_170225/LinkedList.java deleted file mode 100644 index b02e7101b1..0000000000 --- a/group11/729245768/DataStructure/src/main/coding_170225/LinkedList.java +++ /dev/null @@ -1,113 +0,0 @@ - -/** - * Created by peter on 2017/2/22. - */ -public class LinkedList { - private Node head,tail; - private int size=0; - public void add(Object o){ - Node node = new Node(); - node.data = o; - node.next=null; - if(size==0){ - head=node; - tail=node; - }else{ - tail.next = node; - tail = tail.next; - } - size++; - } - public void add(int index,Object o){ - if(index<0||index>size){ - System.out.println("插入下标越界"); - throw new ArrayIndexOutOfBoundsException(); - } - //如果插入的位置是第一个 - if(index==0){ - Node node =new Node(); - node.data = o; - node.next = head; - head = node; - }else { - int i =0;//记录走过的节点 - Node p = head;//移动节点 - while (isize-1){ - System.out.println("访问下标越界"); - throw new ArrayIndexOutOfBoundsException(); - } - Node node =head; - int i=0; - while (isize-1){ - System.out.println("out of array"); - throw new ArrayIndexOutOfBoundsException(); - } - Object data=null;//用来存储返回值 - if(index==0){ - //删除的是第一个节点 - data = head.data; - head=head.next; - size--; - return data; - }else{ - Node p1=head,p2=null;//p1表示移动节点,p2是上一个节点 - int i =0;//表示移动的距离 - while (i - - - - - diff --git a/group11/996108220/.gitignore b/group11/996108220/.gitignore deleted file mode 100644 index 5e56e040ec..0000000000 --- a/group11/996108220/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin diff --git a/group11/996108220/.project b/group11/996108220/.project deleted file mode 100644 index fe4e769dd4..0000000000 --- a/group11/996108220/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 996108220Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group11/996108220/src/com/coding/basic/ArrayList.java b/group11/996108220/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 6fe727645b..0000000000 --- a/group11/996108220/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - private Object[] elementData = new Object[100]; - /** - * 在队尾添加元素 - */ - public void add(Object o){ - if(size+1>elementData.length)this.grow(elementData); - else elementData[size++]=o; - } - /** - * 在index处添加元素,index+1到size-1元素向后移动 - */ - public void add(int index, Object o){ - if(index<0||index>size){ - System.out.println("数组越界"+index); - return; - } - if(size+1>elementData.length)this.grow(elementData); - else { - for(int i=size;i>=index+1;) - { - elementData[i]=elementData[--i]; - } - size++; - elementData[index]=o; - } - - } - /** - * 获得index处的元素elementData[index] - */ - public Object get(int index){ - //TODO越界抛出异常 - if(index<0||index>size){ - System.out.println("数组越界"+index); - return null; - } - else{ - return elementData[index]; - } - } - /** - * 移除index处的元素,将index+1到size-1的元素向前移动 - */ - public Object remove(int index){ - //TODO越界抛出异常 - if(index<0||index>=size){ - System.out.println("数组越界"+index); - return null; - } - else{ - Object value=elementData[index]; - for(int i=index;i= size) - System.out.println("超过size");; - Object[] elementData = ArrayList.this.elementData; - if (i >= elementData.length) - System.out.println("超过length"); - cursor = i + 1; - return elementData[i]; - } - - } - public void grow(Object[] elementData2){ - int[] elementData=new int[elementData2.length+elementData2.length/2]; - System.arraycopy(elementData2,0,elementData,0,elementData2.length); - } - /** - * 测试方法 - * @param args - */ - public static void main(String args[]){ - ArrayList list=new ArrayList(); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - list.add(6); - //list.add(2,0); - //list.remove(list.size-1); - System.out.println(list.size()); - Iterator itr=list.iterator(); - while (itr.hasNext()) { - System.out.println(itr.next()); - - } - } - -} - diff --git a/group11/996108220/src/com/coding/basic/BinaryTree.java b/group11/996108220/src/com/coding/basic/BinaryTree.java deleted file mode 100644 index 1b6d95b6d1..0000000000 --- a/group11/996108220/src/com/coding/basic/BinaryTree.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.coding.basic; - -import com.sun.corba.se.impl.orbutil.graph.Node; - -public class BinaryTree { - - private BinaryTreeNode root=null; - private int size=0; - /** - * 插入节点,保持二叉树的性质 - * @param o - */ - public void insert(T o){ - if (size==0) { - root=new BinaryTreeNode(o); - } - else{ - insert(o,root); - } - size++; - } - - private void insert(T o, BinaryTreeNode ptr) { - if ((ptr.right==null&&(ptr.data.compareTo(o)<=0))){ - ptr.right=new BinaryTreeNode(o); - } - else if (ptr.left==null&&(ptr.data.compareTo(o)>0)) { - ptr.left=new BinaryTreeNode(o); - - } - else if (ptr.left!=null&&(ptr.data.compareTo(o)>0)) { - insert(o, ptr.left); - } - else { - insert(o, ptr.right); - } - } - private static class BinaryTreeNode { - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private BinaryTreeNode(T o) { - this.data=o; - this.left=null; - this.right=null; - } - private BinaryTreeNode() { - - } - } - /** - * 前序遍历 - */ - public void preOrder(BinaryTreeNode Node) - { - if (Node != null) - { - System.out.print(Node.data + " "); - preOrder(Node.left); - preOrder(Node.right); - } - } - - /** - * 中序遍历 - */ - public void midOrder(BinaryTreeNode Node) - { - if (Node != null) - { - midOrder(Node.left); - System.out.print(Node.data + " "); - midOrder(Node.right); - } - } - - /** - * 后序遍历 - */ - public void posOrder(BinaryTreeNode Node) - { - if (Node != null) - { - posOrder(Node.left); - posOrder(Node.right); - System.out.print(Node.data + " "); - } - } - /** - * @param key查找元素 - * @param node - * @return 返回date的node引用 - */ - public BinaryTreeNode searchNode(T key,BinaryTreeNode node) { - if (node!=null) { - if (node.data.compareTo(key)==0) { - return node; - } - else if (node.data.compareTo(key)>0) { - return searchNode(key,node.left); - } - else { - return searchNode(key,node.right); - } - } - else{ - return null; - } - } - - public static void main(String[] args) { - BinaryTree tree=new BinaryTree(); - tree.insert(5); - tree.insert(3); - tree.insert(1); - tree.insert(6); - tree.insert(5); - tree.insert(2); - tree.preOrder(tree.root); - System.out.println(); - tree.posOrder(tree.root); - System.out.println(); - tree.midOrder(tree.root); - System.out.println(tree.searchNode(1, tree.root).data); - - - } - -} diff --git a/group11/996108220/src/com/coding/basic/Iterator.java b/group11/996108220/src/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/group11/996108220/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group11/996108220/src/com/coding/basic/LinkedList.java b/group11/996108220/src/com/coding/basic/LinkedList.java deleted file mode 100644 index be0b354bc2..0000000000 --- a/group11/996108220/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.coding.basic; -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - private int size=0; -/** - * 增加节点 - */ - public void add(Object o){ - if(size==0){ - head=new Node(); - head.data=o; - head.next=null; - size++; - } - else{ - addLast(o); - } - - } -/** - * 在index(0~size)处添加元素 - */ - public void add(int index , Object o){ - - if(index<0||index>size){ - System.out.println("index超出范围"+index); - return; - } - if(index==0)addFirst( o); - else if(index==size)addLast(o); - else{ - Node ptr=head; - for(int i=1;i=size)return null; - else{ - Node ptr=head; - for(int i=0;i=size)return null; - else if(index==0)return removeFirst(); - else if(index==size-1)return removeLast(); - else{ - Node ptr=head; - for(int i=1;isize){ - throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); - } - grow(); - if(indexsize){ - throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); - } - return elementData[index]; - } - - public Object remove(int index){ - - Object o = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, size-(index+1)); - size --; - return o; - } - - public int size(){ - return size; - } - - /** - * 扩容,扩容因子为10 - */ - private void grow(){ - - if(size>=elementData.length){//长度不够需要扩容 - newElementData = new Object[size+GENE]; - System.arraycopy(elementData, 0, newElementData, 0, elementData.length); - elementData = newElementData; - } - } - - - public Iterator iterator(){ - - return new Itr(); - } - - private class Itr implements Iterator{ - - int cursor; - @Override - public boolean hasNext() { - return cursor != ArrayList.this.size; - } - - @Override - public Object next() { - - int i = this.cursor; - if (i >= ArrayList.this.size){ - throw new NoSuchElementException(); - } - this.cursor = (i + 1); - return ArrayList.this.elementData[i]; - } - - } -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java deleted file mode 100644 index e5fae50203..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.coding.basic; - -public class BinaryTree { - - //根节点 - private BinaryTreeNode root; - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public > BinaryTreeNode insert(T o){ - - BinaryTreeNode treeNode = new BinaryTreeNode(); - treeNode.setData(o); - if(root == null){ - root = treeNode; - }else{ - BinaryTreeNode currentNode = root; - BinaryTreeNode parent; - while(true){ - parent = currentNode; - if(((Comparable)currentNode.getData()).compareTo(o)>0){//向左放 - currentNode = currentNode.getLeft(); - if(currentNode == null){ - parent.setLeft(treeNode); - treeNode.setParent(parent); - break; - } - }else{//向右放 - currentNode = currentNode.getRight(); - if(currentNode == null){ - parent.setRight(treeNode); - treeNode.setParent(parent); - break; - } - } - } - } - return treeNode; - } - - /** - * 先序遍历 - * @param node - * @return - */ - public List traversalBefore(BinaryTreeNode node){ - //所有数据集合 - List datas = new ArrayList(); - return traversal(node,datas); - } - private List traversal(BinaryTreeNode node,List datas){ - - if(node !=null){ - datas.add(node.getData()); - traversal(node.getLeft(),datas); - traversal(node.getRight(),datas); - } - return datas; - } - - public BinaryTreeNode getRoot() { - return root; - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 557728a02a..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coding.basic; -public class BinaryTreeNode { - - private Object data; - //父节点 - private BinaryTreeNode parent; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode getParent() { - return parent; - } - public void setParent(BinaryTreeNode parent) { - this.parent = parent; - } -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java b/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java deleted file mode 100644 index c854120212..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - - public boolean hasNext(); - public Object next(); - -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java b/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 460298ff56..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - - private int size = 0; - - public void add(Object o){ - - Node addNode = new Node(); - addNode.data = o; - if(size==0){ - head = addNode; - }else{ - //获取最后一个节点 - Node lastNode = getPointNode(size-1); - lastNode.next = addNode; - } - size++; - } - public void add(int index , Object o){ - - Node addNode = new Node(); - addNode.data = o; - if(index == 0){ - addFirst(o); - return; - } - if(index == size){ - Node lastNode = getPointNode(size-1); - lastNode.next = addNode; - }else{ - Node pointNode = getPointNode(index); - Node prePointNode = getPointNode(index-1); - prePointNode.next = addNode; - addNode.next = pointNode; - } - size ++; - } - public Object get(int index){ - - Node node = getPointNode(index); - return node.data; - } - - public Object remove(int index){ - - Node pointNode = getPointNode(index); - Node nextPointNode = getPointNode(index+1); - if(index ==0){ - head = nextPointNode; - }else{ - Node prePointNode = getPointNode(index-1); - prePointNode.next = nextPointNode; - } - size --; - return pointNode.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - - Node secondNode = head; - head = new Node(); - head.data = o; - if(size>0){ - head.next = secondNode; - } - size ++; - } - - public void addLast(Object o){ - add(o); - } - - public Object removeFirst(){ - - return remove(0); - } - - public Object removeLast(){ - - return remove(size-1); - } - public Iterator iterator(){ - return new Itr(); - } - - private class Itr implements Iterator{ - - int cursor; - @Override - public boolean hasNext() { - return cursor != LinkedList.this.size; - } - - @Override - public Object next() { - - int i = this.cursor; - if (i >= LinkedList.this.size){ - throw new NoSuchElementException(); - } - this.cursor = (i + 1); - return LinkedList.this.get(i); - } - - } - - /** - * 获取指定的节点 - * @return - */ - private Node getPointNode(int index){ - - if(index>size){ - throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size+""); - } - Node node = head; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - } - - private static class Node{ - Object data; - Node next; - - } -} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/List.java b/group12/2258659044/zj-2017/src/com/coding/basic/List.java deleted file mode 100644 index a5a3688eb6..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic; - -public interface List { - - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java b/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java deleted file mode 100644 index e29ff65ddf..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList element = new LinkedList(); - - public void enQueue(Object o){ - - element.add(o); - } - - public Object deQueue(){ - - return element.removeFirst(); - } - - public boolean isEmpty(){ - - return element.size()==0; - } - - public int size(){ - - return element.size(); - } -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java b/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java deleted file mode 100644 index 03709097e5..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.basic; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - - elementData.add(o); - } - - public Object pop(){ - - return elementData.remove(size()-1); - } - - public Object peek(){ - - return elementData.get(size()-1); - } - public boolean isEmpty(){ - - return size()==0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/ArrayListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/ArrayListTest.java deleted file mode 100644 index badcb2968f..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,109 +0,0 @@ -package test.com.coding.basic; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.ArrayList; -import com.coding.basic.Iterator; - -public class ArrayListTest { - - ArrayList ls ; - @Before - public void setup() { - ls = new ArrayList(); - } - - /** - * 测试一个参数的add方法 - * ArrayList当数据超过10时进行第一次扩容 - */ - @Test - public void add(){ - - ls.add(3); - ls.add("a"); - for (int i = 0; i < 10; i++) { - ls.add(i); - } - Assert.assertEquals(ls.size(), 12); - Assert.assertEquals(ls.get(1), "a"); - } - - /** - * 两个参数的add方法 - */ - @Test//(expected = IndexOutOfBoundsException.class) - public void add4ToPramter(){ - - ls.add(0, 0); - ls.add(1,1); - ls.add(2, 2); - ls.add(3,3); - for (int i = 0; i < 10; i++) { - ls.add(3,i); - } - Assert.assertEquals(ls.size(), 14); - Assert.assertEquals(ls.get(3), 9); - Assert.assertEquals(ls.get(13), 3); - //打开下面操作抛出异常 - //ls.add(15, "a"); - } - - /** - * get(i) - */ - @Test//(expected = IndexOutOfBoundsException.class) - public void get(){ - - for (int i = 0; i < 10; i++) { - ls.add(i); - } - - Assert.assertEquals(ls.get(9), 9); - //打开下面操作抛出异常 - //ls.get(12); - } - - @Test - public void remove(){ - - for (int i = 0; i < 10; i++) { - ls.add(i); - } - Assert.assertEquals(ls.remove(5),5); - Assert.assertEquals(ls.size(),9); - Assert.assertEquals(ls.remove(8),9); - Assert.assertEquals(ls.size(),8); - } - - @Test - public void size(){ - - Assert.assertEquals(ls.size(),0); - ls.add("a"); - Assert.assertEquals(ls.size(),1); - ls.add(0,0); - Assert.assertEquals(ls.size(),2); - ls.remove(0); - Assert.assertEquals(ls.size(),1); - - } - - @Test//(expected = NoSuchElementException.class) - public void iterator(){ - - for (int i = 0; i < 10; i++) { - ls.add(i); - } - Iterator it = ls.iterator(); - Assert.assertEquals(it.hasNext(),true); - for (int i = 0; i < 10; i++) { - it.next(); - } - Assert.assertEquals(it.hasNext(),false); - //打开下面操作抛出异常 - //it.next(); - } -} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java deleted file mode 100644 index 0f343ed895..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package test.com.coding.basic; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.BinaryTree; -import com.coding.basic.BinaryTreeNode; -import com.coding.basic.List; - -public class BinaryTreeTest { - - BinaryTree tree ; - - @Before - public void setup() { - - tree = new BinaryTree(); - Assert.assertEquals(tree.getRoot(), null); - tree.insert(5); - tree.insert(2); - tree.insert(7); - tree.insert(1); - tree.insert(6); - } - @Test - public void insert(){ - - BinaryTreeNode node = tree.insert(4); - Assert.assertEquals(node.getParent().getData(), 2); - Assert.assertEquals(node.getParent().getLeft().getData(), 1); - - BinaryTreeNode node2 = tree.insert(8); - Assert.assertEquals(node2.getParent().getData(), 7); - Assert.assertEquals(node2.getParent().getLeft().getData(), 6); - } - - @Test - public void traversal(){ - - insert(); - //以根节点为起点先序遍历 - List treeList = tree.traversalBefore(tree.getRoot()); - //expected value - int[] exValue = {5,2,1,4,7,6,8}; - for (int i = 0; i < exValue.length; i++) { - Assert.assertEquals(treeList.get(i),exValue[i]); - } - - //以数据2位起点先序遍历 - List treeList2 = tree.traversalBefore(tree.getRoot().getLeft()); - //expected value - int[] exValue2 = {2,1,4}; - for (int i = 0; i < exValue2.length; i++) { - Assert.assertEquals(treeList2.get(i),exValue2[i]); - } - } -} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java deleted file mode 100644 index a55b2d5a3f..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java +++ /dev/null @@ -1,109 +0,0 @@ -package test.com.coding.basic; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.Iterator; -import com.coding.basic.LinkedList; - -public class LinkedListTest { - - LinkedList ls ; - @Before - public void setup() { - ls = new LinkedList(); - } - - /** - * 测试一个参数的add方法 - * ArrayList当数据超过10时进行第一次扩容 - */ - @Test - public void add(){ - - ls.add(3); - ls.add("a"); - for (int i = 0; i < 10; i++) { - ls.add(i); - } - Assert.assertEquals(ls.size(), 12); - Assert.assertEquals(ls.get(1), "a"); - } - - /** - * 两个参数的add方法 - */ - @Test//(expected = IndexOutOfBoundsException.class) - public void add4ToPramter(){ - - ls.add(0, 0); - ls.add(1,1); - ls.add(2, 2); - ls.add(3,3); - for (int i = 0; i < 10; i++) { - ls.add(3,i); - } - Assert.assertEquals(ls.size(), 14); - Assert.assertEquals(ls.get(3), 9); - Assert.assertEquals(ls.get(13), 3); - //打开下面操作抛出异常 - //ls.add(15, "a"); - } - - /** - * get(i) - */ - @Test//(expected = IndexOutOfBoundsException.class) - public void get(){ - - for (int i = 0; i < 10; i++) { - ls.add(i); - } - - Assert.assertEquals(ls.get(9), 9); - //打开下面操作抛出异常 - //ls.get(12); - } - - @Test - public void remove(){ - - for (int i = 0; i < 10; i++) { - ls.add(i); - } - Assert.assertEquals(ls.remove(5),5); - Assert.assertEquals(ls.size(),9); - Assert.assertEquals(ls.remove(8),9); - Assert.assertEquals(ls.size(),8); - } - - @Test - public void size(){ - - Assert.assertEquals(ls.size(),0); - ls.add("a"); - Assert.assertEquals(ls.size(),1); - ls.add(0,0); - Assert.assertEquals(ls.size(),2); - ls.remove(0); - Assert.assertEquals(ls.size(),1); - - } - - @Test//(expected = NoSuchElementException.class) - public void iterator(){ - - for (int i = 0; i < 10; i++) { - ls.add(i); - } - Iterator it = ls.iterator(); - Assert.assertEquals(it.hasNext(),true); - for (int i = 0; i < 10; i++) { - it.next(); - } - Assert.assertEquals(it.hasNext(),false); - //打开下面操作抛出异常 - //it.next(); - } -} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java deleted file mode 100644 index e688d9b41f..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package test.com.coding.basic; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.Queue; - -public class QueueTest { - - Queue qe ; - - @Before - public void setup() { - qe = new Queue(); - for (int i = 0; i < 10; i++) { - qe.enQueue(i); - } - } - - @Test - public void enQueue(){ - - Assert.assertEquals(qe.size(), 10); - qe.enQueue("abcd"); - Assert.assertEquals(qe.size(), 11); - } - - @Test//(expected = IndexOutOfBoundsException.class) - public void deQueue(){ - - Assert.assertEquals(qe.size(), 10); - for (int i = 0; i < 10; i++) { - Assert.assertEquals(qe.deQueue(), i); - } - Assert.assertEquals(qe.size(), 0); - //打开下列语句与期望异常测试 - //qe.deQueue(); - } - - public void isEmpty(){ - - Assert.assertEquals(qe.isEmpty(),false); - for (int i = 0; i < 10; i++) { - qe.deQueue(); - } - Assert.assertEquals(qe.isEmpty(),true); - Queue qe1 = new Queue(); - Assert.assertEquals(qe1.isEmpty(), true); - } - - public void size(){ - - Assert.assertEquals(qe.size(),10); - qe.enQueue("lk"); - qe.enQueue('h'); - Assert.assertEquals(qe.size(),12); - for (int i = 0; i < 12; i++) { - qe.deQueue(); - } - Assert.assertEquals(qe.size(),0); - Queue qe1 = new Queue(); - Assert.assertEquals(qe1.size(), 0); - } -} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java deleted file mode 100644 index a0875c8f3c..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package test.com.coding.basic; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.Stack; - -public class StackTest { - - Stack st ; - - @Before - public void setup() { - st = new Stack(); - for (int i = 0; i < 10; i++) { - st.push(i); - } - } - - @Test - public void push(){ - - Assert.assertEquals(st.size(), 10); - st.push(10); - st.push('a'); - Assert.assertEquals(st.size(), 12); - } - - @Test//(expected = IndexOutOfBoundsException.class) - public void pop(){ - - Assert.assertEquals(st.size(), 10); - for (int i = 9; i >= 0; i--) { - Assert.assertEquals(st.pop(), i); - } - //打开下列语句抛出期望异常 - //st.pop(); - } - - @Test - public void peek(){ - - Assert.assertEquals(st.size(), 10); - Assert.assertEquals(st.peek(), 9); - Assert.assertEquals(st.size(), 10); - } - - @Test - public void isEmpty(){ - - Assert.assertEquals(st.isEmpty(), false); - for (int i = 0; i < 10; i++) { - st.pop(); - } - Assert.assertEquals(st.isEmpty(), true); - Stack st1 = new Stack(); - Assert.assertEquals(st1.isEmpty(), true); - } - - public void size(){ - - Assert.assertEquals(st.size(),10); - st.push("lk"); - st.push('h'); - Assert.assertEquals(st.size(),12); - for (int i = 0; i < 12; i++) { - st.pop(); - } - Assert.assertEquals(st.size(),0); - st.peek(); - Assert.assertEquals(st.size(),0); - Stack st1 = new Stack(); - Assert.assertEquals(st1.size(), 0); - } -} diff --git a/group12/247565311/week1/ArrayList.java b/group12/247565311/week1/ArrayList.java deleted file mode 100644 index c2643af683..0000000000 --- a/group12/247565311/week1/ArrayList.java +++ /dev/null @@ -1,249 +0,0 @@ -package week1; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - - -public class ArrayList implements List { - private int size=0,offset=10; - private Object[] data = null; - public ArrayList(){ - data = new Object[offset]; - } - public ArrayList(int arg0){ - if(arg0<0) arg0=0; - size = arg0; - data = new Object[size]; - } - @Override - public boolean add(E arg0) { - if(arg0 == null) return false; - size += 1; - int leng = data.length; - if(size>leng){ - Object[] newdata = new Object[size + offset]; - for(int i=0;isize || 0leng){ - Object[] newdata = new Object[size + offset]; - for(int i=0;i arg0) { - if (arg0 == null) return false; - int leng = data.length,newobjnum = arg0.size(),lastsize=size; - size += newobjnum; - if(size>leng){ - Object[] newdata = new Object[size + offset]; - for(int i=0;i arg1) { - int newobjnum = arg1.size(),lastsize = size; - if(arg1 == null || arg0>size+1 || 0>arg0 || newobjnum==0) return false; - size += newobjnum; - int leng = data.length; - if(size>leng){ - Object[] newdata = new Object[size + offset]; - for(int i=0;i arg0) { - for(Object o:arg0){ - if(!this.contains(o)) return false; - } - return true; - } - - @Override - public E get(int arg0) { - if(arg0 >-1 && arg0-1;i--){ - if(this.data[i].equals(arg0)) return i; - } - return -1; - } - - @Override - public Iterator iterator() { - - return null; - } - - @Override - public ListIterator listIterator() { - - return null; - } - - @Override - public ListIterator listIterator(int arg0) { - - return null; - } - - @Override - public boolean remove(Object arg0) { - for(int i=0;ithis.size-1) return null; - E res = (E)data[arg0]; - for(int i=arg0;i arg0) { - int toberemovednums = arg0.size(); - if(!this.containsAll(arg0)) return false; - int index=0; - for(int i=0;i arg0) { - // what does this mean? - return false; - } - - @Override - public E set(int arg0, E arg1) { - if(arg0<0||arg0>this.size-1) return null; - this.data[arg0] = arg1; - return arg1; - } - - @Override - public int size() { - return this.size; - } - - @Override - public List subList(int arg0, int arg1) { - if(arg0>=arg1 || arg0<0 || arg1>this.size-1) return null; - List res = new ArrayList(); - for(int i=arg0;i T[] toArray(T[] arg0) { - T[] res = (T[])(new Object[this.size]); - for(int i=0;i { - private LinkedList data = new LinkedList(); - private int size = 0; - - - public Deque(){ - - } - public Deque(int arg0){ - data = new LinkedList(arg0); - } - public boolean push(E arg0){ - data.add(data.size(),arg0); - size += 1; - return true; - } - public E pop(){ - size -= 1; - E res = data.get(0); - data.remove(0); - return res; - } - public E peek(){ - return data.get(0); - } - public int size(){ - return this.size; - } - public boolean isEmpty(){ - return this.size==0; - } - -} diff --git a/group12/247565311/week1/Link.java b/group12/247565311/week1/Link.java deleted file mode 100644 index e2910e53d3..0000000000 --- a/group12/247565311/week1/Link.java +++ /dev/null @@ -1,5 +0,0 @@ -package week1; - -public class Link { - -} diff --git a/group12/247565311/week1/LinkedList.java b/group12/247565311/week1/LinkedList.java deleted file mode 100644 index c3f0ca2eb8..0000000000 --- a/group12/247565311/week1/LinkedList.java +++ /dev/null @@ -1,266 +0,0 @@ -package week1; - -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -public class LinkedList implements List,Cloneable { - private Node head = null; - private Node tail = null; - private int size = 0; - - public LinkedList(){ - head = new Node(null); - tail = new Node(null); - head.next = tail; - tail.ahead = head; - size = 0; - } - public LinkedList(int arg0){ - head = new Node(null); - tail = new Node(null); - head.next = tail; - tail.ahead = head; - size = 0; - } - public Object clone(){ - LinkedList clone = null; - try { - clone = (LinkedList)(super.clone()); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - clone.head = new Node(null); - clone.tail = new Node(null); - clone.size = 0; - for(Node x = head.next;x!=null;x = x.next){ - clone.add(x.val); - } - return clone; - } - @Override - public boolean add(Object val) { - Node n = new Node(val); - n.next = tail; - n.ahead = tail.ahead; - tail.ahead.next = n; - tail.ahead = n; - size += 1; - return true; - } - - @Override - public void add(int arg0, E arg1) { - if(arg0<0 || arg0>size) arg0=0; - Node n=new Node(arg1),p=head; - for(int i=0;i arg0) { - for(E o:arg0){ - this.add(o); - } - return true; - } - - @Override - public boolean addAll(int arg0, Collection arg1) { - for(E e:arg1){ - this.add(arg0,e); - arg0+=1; - } - return true; - } - - @Override - public void clear() { - head = new Node(null); - tail = new Node(null); - head.next = tail; - tail.ahead = head; - size = 0; - } - - @Override - public boolean contains(Object arg0) { - boolean flag = arg0==null; - Node n = head; - for(int i=0;i arg0) { - for(Object e:arg0){ - if(!this.contains(e)) return false; - } - return true; - } - - @Override - public E get(int arg0) { - E res = null; - if(arg0>-1 && arg0 < size){ - Node n = head; - for(int i=0;i iterator() { - - return null; - } - - @Override - public int lastIndexOf(Object arg0) { - boolean flag = arg0==null; - Node n = tail; - for(int i=size-1;i>-1;i--){ - n = n.ahead; - if(flag){ - if(n.val == null) return i; - }else{ - if(arg0.equals(n.val)) return i; - } - } - return -1; - } - - @Override - public ListIterator listIterator() { - - return null; - } - - @Override - public ListIterator listIterator(int arg0) { - - return null; - } - - @Override - public boolean remove(Object arg0) { - Node n = head; - int index = this.indexOf(arg0); - if(index == -1) return false; - for(int i=0;isize-1) return null; - for(int i=0;i arg0) { - for(Object o:arg0){ - if(!this.remove(o)) return false; - } - return true; - } - - @Override - public boolean retainAll(Collection arg0) { - // ? - return false; - } - - @Override - public E set(int arg0, E arg1) { - if(arg0<0 || arg0>size-1) return null; - Node n=head; - for(int i=0;i subList(int arg0, int arg1) { - - return null; - } - - @Override - public Object[] toArray() { - Object[]res = new Object[size]; - Node n = head; - for(int i=0;i T[] toArray(T[] arg0) { - - return null; - } - private static class Node{ - Object val = null; - Node next = null,ahead=null; - public Node(Object arg0){val = arg0;} - } -} diff --git a/group12/247565311/week1/Stack.java b/group12/247565311/week1/Stack.java deleted file mode 100644 index 5672274d81..0000000000 --- a/group12/247565311/week1/Stack.java +++ /dev/null @@ -1,39 +0,0 @@ -package week1; - -import java.util.List; - -public class Stack { - private List data = new ArrayList(); - private int size = 0; - - public Stack(){ - - } - - public Stack(int arg0){ - if(arg0 < 0) arg0 = 0; - size = arg0; - data = new ArrayList(size); - - } - public boolean isEmpty(){ - return size==0; - } - public boolean push(E arg0){ - size += 1; - data.add(arg0); - return true; - } - public E pop(){ - if(this.isEmpty()) return null; - size -= 1; - E res = data.get(size); - data.remove(size); - return res; - } - public E peek(){ - if(this.isEmpty()) return null; - E res = data.get(size-1); - return res; - } -} diff --git a/group12/251822722/ArrayList.java b/group12/251822722/ArrayList.java deleted file mode 100755 index 77b8052cc7..0000000000 --- a/group12/251822722/ArrayList.java +++ /dev/null @@ -1,87 +0,0 @@ -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private int index =0; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - elementData[size] = o; - size = size+1; - - } - - public void add(int index, Object o) { - - Object[] elementDataNew =null; - if(size= size || index < 0){ - throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size); - } - } - - - private class ArrayListIterator implements Iterator{ - - private int lastIndex = 0; - - @Override - public boolean hasNext() { - return lastIndex < size; - } - - @Override - public Object next() { - return elementData[lastIndex++]; - } - } -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/BinaryTreeNode.java b/group12/377401843/learning_1/src/com/guodong/datastructure/BinaryTreeNode.java deleted file mode 100644 index 677eff3dab..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/BinaryTreeNode.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.guodong.datastructure; - -public class BinaryTreeNode { - - private int data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(int data) { - this.data = data; - } - - public int getData() { - return data; - } - - public void setData(int data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(int o) { - - if (o < data) { - if (left != null) { - left.insert(o); - } else { - left = new BinaryTreeNode(o); - return left; - } - } else { - if (right != null) { - right.insert(o); - } else { - right = new BinaryTreeNode(o); - return right; - } - } - - return null; - } - -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/Iterator.java b/group12/377401843/learning_1/src/com/guodong/datastructure/Iterator.java deleted file mode 100644 index 1a9bc5ad8a..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.guodong.datastructure; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/LinkedList.java b/group12/377401843/learning_1/src/com/guodong/datastructure/LinkedList.java deleted file mode 100644 index a7dc12694e..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/LinkedList.java +++ /dev/null @@ -1,285 +0,0 @@ -package com.guodong.datastructure; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private int size; - - private Node head; - - private Node last; - - /** - * 向 链表尾端插入元素 - * - * @Method add - * @param o - * @see com.guodong.datastructure.List#add(java.lang.Object) - */ - public void add(Object o) { - linkLast(o); - } - - /** - * 向链表指定位置插入元素 - * - * @Method add - * @param index - * @param o - * @see com.guodong.datastructure.List#add(int, java.lang.Object) - */ - public void add(int index, Object o) { - checkIndexForAdd(index); - - if (index == size) { - linkLast(o); - } else { - Node prevNode = getNodeByIndex(index - 1); // 取到当前下标的前一个节点 - Node currentNode = getNodeByIndex(index); // 取到当前下标节点 - Node newNode = new Node(o, currentNode); // 创建新节点,新节点的下一个节点为当前下标节点 - - if (prevNode == null) { // 如果前一个节点为空,说明从头部插入 - head = newNode; - } else { - prevNode.next = newNode; - } - size++; - } - } - - /** - * 根据下标获取链表中元素 - * - * @Method get - * @param index - * @return - * @see com.guodong.datastructure.List#get(int) - */ - public Object get(int index) { - checkIndexForGet(index); - return getNodeByIndex(index).data; - } - - public Object getLast() { - return last.data; - } - - /** - * 根据下标移除链表元素 - * - * @Method remove - * @param index - * @return - * @see com.guodong.datastructure.List#remove(int) - */ - public Object remove(int index) { - checkIndexForGet(index); - - Node prevNode = getNodeByIndex(index - 1); // 获取当前index前一个元素 - Node currentNode = null; - if (prevNode == null) { - currentNode = getNodeByIndex(index); // 如果前一个为空,则把下一个元素赋值给链表头 - head = currentNode.next; - } else { - currentNode = prevNode.next; // 如果不为空,则把前一个节点跟后一个节点链接 - prevNode.next = currentNode.next; - } - Node nextNode = currentNode.next; - - if (nextNode == null) { // 如果后一个节点为空,则把链尾赋值为前一个节点 - last = prevNode; - } else { - currentNode.next = null; // 如果后一个节点不为空,不做任何处理,只打断当前节点的链接 - } - Object data = currentNode.data; - currentNode.data = null; // 清空当前节点的值,等待垃圾回收 - - size--; - - return data; - } - - /** - * 返回List长度 - */ - public int size() { - return size; - } - - /** - * 向列表头部添加元素 - * - * @param o - */ - public void addFirst(Object o) { - Node n = head; - Node newNode = new Node(o, n); - - head = newNode; - if (n == null) { - last = newNode; - } - size++; - } - - /** - * 向列表尾部添加元素 - * - * @param o - */ - public void addLast(Object o) { - linkLast(o); - } - - /** - * 移除链表第一个元素 - * - * @return - */ - public Object removeFirst() { - Node n = head; - if (n == null) { - throw new NoSuchElementException(); - } - Object data = n.data; - Node nextNode = n.next; - - n.data = null; - n.next = null; - - head = nextNode; - if (nextNode == null) { - last = null; - } - - size--; - return data; - } - - public Object removeLast() { - Node n = last; - if (n == null) { - throw new NoSuchElementException(); - } - Object data = n.data; - Node prevNode = getNodeByIndex(size - 2); - n.data = null; - if (prevNode == null) { - head = null; - } else { - prevNode.next = null; - } - last = prevNode; - - size--; - return data; - } - - /** - * 根据下标获取对应的节点 - * - * @MethodName getNodeByIndex - * @author zhaogd - * @date 2017年2月23日 下午3:32:48 - * @param index - * @return - */ - private Node getNodeByIndex(int index) { - if (index < 0) { - return null; - } - Node n = head; - for (int i = 0; i < index; i++) { - n = n.next; - } - return n; - } - - /** - * 在链表尾端插入节点 - * - * @MethodName linkLast - * @author zhaogd - * @date 2017年2月23日 下午3:14:28 - * @param o - */ - private void linkLast(Object o) { - Node n = last; // 取出原尾端数据 - Node newNode = new Node(o, null); // 创建新节点 - last = newNode; // 把新节点放入链表尾端 - // 如果原尾端为空,说明链表为空,把新节点也放入链表头部 - // 如果不为空,把原尾端节点指向新节点 - if (n == null) { - head = newNode; - } else { - n.next = newNode; - } - - size++; - } - - /** - * 检查下标是否合法 - * - * @MethodName checkIndexForAdd - * @author zhaogd - * @date 2017年2月23日 下午3:05:07 - * @param index - */ - private void checkIndexForAdd(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size); - } - } - - /** - * 检查下标是否合法 - * - * @MethodName checkIndexForGet - * @author zhaogd - * @date 2017年2月23日 下午4:21:35 - * @param index - */ - private void checkIndexForGet(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size); - } - } - - private static class Node { - Object data; - Node next; - - Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } - - public Iterator iterator() { - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator { - private Node current; - - private int index; - - @Override - public boolean hasNext() { - return index < size; - } - - @Override - public Object next() { - if (current == null) { - current = getNodeByIndex(index); - } - Object data = current.data; - current = current.next; - index++; - return data; - } - } -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/List.java b/group12/377401843/learning_1/src/com/guodong/datastructure/List.java deleted file mode 100644 index 2471c15d21..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/List.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.guodong.datastructure; - -public interface List { - - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/Queue.java b/group12/377401843/learning_1/src/com/guodong/datastructure/Queue.java deleted file mode 100644 index b14751aab7..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/Queue.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.guodong.datastructure; - -public class Queue { - private LinkedList element = new LinkedList(); - - public void enQueue(Object o) { - element.addLast(o); - } - - public Object deQueue() { - return element.removeFirst(); - } - - public boolean isEmpty() { - return element.size() == 0; - } - - public int size() { - return element.size(); - } -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/Stack.java b/group12/377401843/learning_1/src/com/guodong/datastructure/Stack.java deleted file mode 100644 index f743d0dd3b..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.guodong.datastructure; - -public class Stack { - private LinkedList elementData = new LinkedList(); - - public void push(Object o) { - elementData.addLast(o); - } - - public Object pop() { - return elementData.removeLast(); - } - - public Object peek() { - return elementData.getLast(); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/test/ArrayListTest.java b/group12/377401843/learning_1/src/com/guodong/datastructure/test/ArrayListTest.java deleted file mode 100644 index ec3a7600a4..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/test/ArrayListTest.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.guodong.datastructure.test; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.guodong.datastructure.ArrayList; -import com.guodong.datastructure.Iterator; - -public class ArrayListTest { - - ArrayList arrayList; - - @Before - public void setUp() throws Exception { - arrayList = new ArrayList(); - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testAddObject() { - // 测试新增 - arrayList.add(0); - assertEquals(0, arrayList.get(0)); - assertEquals(1, arrayList.size()); - - // 测试扩充 - for (int i = 1; i < 101; i++) { - arrayList.add(i); - } - assertEquals(101, arrayList.size()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForAdd1() { - // 测试新增下标异常时,是否可以正确抛出异常 - arrayList.add(-1, 2); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForAdd2() { - // 测试新增下标异常时,是否可以正确抛出异常 - arrayList.add(1, 3); - } - - @Test - public void testAddIntObject() { - // 测试下标新增 - arrayList.add(0, 1); - arrayList.add(1, 2); - arrayList.add(2, 3); - arrayList.add(3, 4); - assertEquals(4, arrayList.size()); - - // 测试中间插入 - arrayList.add(2, 5); - assertEquals(5, arrayList.size()); // 测试插入之后长度 - assertEquals(5, arrayList.get(2)); - assertEquals(4, arrayList.get(4)); // 测试插入之后原来数据是否后移 - assertEquals(3, arrayList.get(3)); // 测试插入之后原来数据是否后移 - - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForGet1() { - // 测试Get时,下标异常,是否可以正确抛出异常 - arrayList.get(-1); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForGet2() { - // 测试Get时,下标异常,是否可以正确抛出异常 - arrayList.get(0); - } - - @Test - public void testGet() { - arrayList.add(1); - arrayList.add(2); - arrayList.add(3); - assertEquals(1, arrayList.get(0)); - assertEquals(2, arrayList.get(1)); - assertEquals(3, arrayList.get(2)); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForRemove1() { - arrayList.remove(-1); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForRemove2() { - arrayList.remove(0); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForRemove3() { - arrayList.remove(1); - } - - @Test - public void testRemove() { - arrayList.add(1); - arrayList.remove(0); - assertEquals(0, arrayList.size()); - - arrayList.add(1); - arrayList.add(2); - arrayList.remove(0); - assertEquals(1, arrayList.size()); - assertEquals(2, arrayList.get(0)); - } - - @Test - public void testSize() { - arrayList.add(1); - assertEquals(1, arrayList.size()); - } - - @Test - public void testIterator() { - Iterator iterator = arrayList.iterator(); - assertFalse(iterator.hasNext()); - - arrayList.add(1); - assertTrue(iterator.hasNext()); - assertEquals(1, iterator.next()); - assertFalse(iterator.hasNext()); - } -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/test/BinaryTreeNodeTest.java b/group12/377401843/learning_1/src/com/guodong/datastructure/test/BinaryTreeNodeTest.java deleted file mode 100644 index 83972b7776..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/test/BinaryTreeNodeTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.guodong.datastructure.test; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.guodong.datastructure.BinaryTreeNode; - -public class BinaryTreeNodeTest { - - private BinaryTreeNode binaryTreeNode; - - @Before - public void setUp() throws Exception { - binaryTreeNode = new BinaryTreeNode(50); - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testInsert() { - binaryTreeNode.insert(20); - binaryTreeNode.insert(30); - binaryTreeNode.insert(60); - binaryTreeNode.insert(80); - - assertEquals(20, binaryTreeNode.getLeft().getData()); - assertEquals(30, binaryTreeNode.getLeft().getRight().getData()); - assertEquals(60, binaryTreeNode.getRight().getData()); - assertEquals(80, binaryTreeNode.getRight().getRight().getData()); - } - -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/test/LinkedListTest.java b/group12/377401843/learning_1/src/com/guodong/datastructure/test/LinkedListTest.java deleted file mode 100644 index 054e8f81b4..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/test/LinkedListTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.guodong.datastructure.test; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.guodong.datastructure.Iterator; -import com.guodong.datastructure.LinkedList; - -public class LinkedListTest { - - private LinkedList linkedList; - - @Before - public void setUp() throws Exception { - linkedList = new LinkedList(); - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testAddObject() { - linkedList.add(1); - assertEquals(1, linkedList.size()); - assertEquals(1, linkedList.get(0)); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForAdd1() { - linkedList.add(-1, 1); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForAdd2() { - linkedList.add(1, 1); - } - - @Test - public void testAddIntObject() { - linkedList.add(0, 1); - linkedList.add(1, 2); - assertEquals(1, linkedList.get(0)); - - linkedList.add(1,3); - assertEquals(2, linkedList.get(2)); - assertEquals(3, linkedList.get(1)); - assertEquals(3, linkedList.size()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForGet1() { - linkedList.get(-1); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForGet2() { - linkedList.get(0); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testExceptionForGet3() { - linkedList.get(1); - } - - @Test - public void testGet() { - linkedList.add(0, 1); - linkedList.add(1, 2); - assertEquals(2, linkedList.get(1)); - } - - @Test - public void testGetLast() { - linkedList.add(1); - assertEquals(1, linkedList.getLast()); - - linkedList.add(2); - assertEquals(2, linkedList.getLast()); - } - - @Test - public void testRemove() { - linkedList.add(1); - assertEquals(1, linkedList.remove(0)); - assertEquals(0, linkedList.size()); - } - - @Test - public void testSize() { - linkedList.add(1); - linkedList.add(1); - linkedList.add(1); - assertEquals(3, linkedList.size()); - } - - @Test - public void testAddFirst() { - linkedList.addFirst(1); - assertEquals(1, linkedList.get(0)); - - linkedList.addFirst(2); - linkedList.addFirst(3); - assertEquals(3, linkedList.get(0)); - assertEquals(1, linkedList.getLast()); - } - - @Test - public void testAddLast() { - linkedList.addLast(1); - assertEquals(1, linkedList.getLast()); - assertEquals(1, linkedList.get(0)); - } - - @Test - public void testRemoveFirst() { - linkedList.addFirst(1); - assertEquals(1, linkedList.removeFirst()); - assertEquals(0, linkedList.size()); - } - - @Test - public void testRemoveLast() { - linkedList.addLast(2); - assertEquals(2, linkedList.removeLast()); - assertEquals(0, linkedList.size()); - } - - @Test - public void testIterator() { - Iterator iterator = linkedList.iterator(); - assertFalse(iterator.hasNext()); - - linkedList.add(1); - assertTrue(iterator.hasNext()); - assertEquals(1, iterator.next()); - assertFalse(iterator.hasNext()); - } - -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/test/QueueTest.java b/group12/377401843/learning_1/src/com/guodong/datastructure/test/QueueTest.java deleted file mode 100644 index 86a4ebdd68..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/test/QueueTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.guodong.datastructure.test; - -import static org.junit.Assert.*; - -import java.util.NoSuchElementException; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.guodong.datastructure.Queue; - -public class QueueTest { - - private Queue queue; - - @Before - public void setUp() throws Exception { - queue = new Queue(); - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEnQueue() { - queue.enQueue(1); - assertFalse(queue.isEmpty()); - } - - @Test(expected = NoSuchElementException.class) - public void testDeQueueExecption() { - queue.deQueue(); - } - - @Test - public void testDeQueue() { - queue.enQueue(1); - assertEquals(1, queue.deQueue()); - assertTrue(queue.isEmpty()); - } - - @Test - public void testIsEmpty() { - queue.enQueue(1); - assertFalse(queue.isEmpty()); - - queue.deQueue(); - assertTrue(queue.isEmpty()); - } - - @Test - public void testSize() { - queue.enQueue(1); - queue.enQueue(1); - queue.enQueue(1); - - assertEquals(3, queue.size()); - } - -} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/test/StackTest.java b/group12/377401843/learning_1/src/com/guodong/datastructure/test/StackTest.java deleted file mode 100644 index 36781c863f..0000000000 --- a/group12/377401843/learning_1/src/com/guodong/datastructure/test/StackTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.guodong.datastructure.test; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.guodong.datastructure.Stack; - -public class StackTest { - - private Stack stack; - - @Before - public void setUp() throws Exception { - stack = new Stack(); - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testPush() { - stack.push(11); - assertEquals(11, stack.pop()); - assertTrue(stack.isEmpty()); - } - - @Test - public void testPop() { - stack.push(11); - assertEquals(11, stack.pop()); - assertTrue(stack.isEmpty()); - } - - @Test - public void testPeek() { - stack.push(11); - assertEquals(11, stack.peek()); - assertFalse(stack.isEmpty()); - assertEquals(1, stack.size()); - } - -} diff --git a/group12/382266293/.classpath b/group12/382266293/.classpath deleted file mode 100644 index 3e0fb272a8..0000000000 --- a/group12/382266293/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group12/382266293/.gitignore b/group12/382266293/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group12/382266293/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group12/382266293/.project b/group12/382266293/.project deleted file mode 100644 index 1282023911..0000000000 --- a/group12/382266293/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 382266293Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group12/382266293/src/Collection/AbstractList.java b/group12/382266293/src/Collection/AbstractList.java deleted file mode 100644 index a81e76b587..0000000000 --- a/group12/382266293/src/Collection/AbstractList.java +++ /dev/null @@ -1,43 +0,0 @@ -package Collection; - -public abstract class AbstractList implements List { - - protected static final String PREFIX = "["; - protected static final String SUFFIX = "]"; - protected static final String SEPERATOR = ", "; - protected static final int MAX_SIZE = Integer.MAX_VALUE/3; - - protected void checkIndex(int i) { - if( i < 0 || i > Math.min(size(), MAX_SIZE)) - throw new IndexOutOfBoundsException("Size :" + size()+", Index: " + i); - } - - public boolean isEmpty() { - return size() == 0; - } - - - public int indexOf(E e) { - for (int i = 0; i < size()-1; i++) { - if (get(i).equals(e)) - return i; - } - return -1; - } - - protected abstract Iterator iterator(); - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(PREFIX); - for (int i = 0; i < size(); i++) { - sb.append(get(i)); - if (i < size()-1) - sb.append(SEPERATOR); - } - sb.append(SUFFIX); - return sb.toString(); - } - -} diff --git a/group12/382266293/src/Collection/Concrete/ArrayList.java b/group12/382266293/src/Collection/Concrete/ArrayList.java deleted file mode 100644 index 3db5ab47e6..0000000000 --- a/group12/382266293/src/Collection/Concrete/ArrayList.java +++ /dev/null @@ -1,148 +0,0 @@ -package Collection.Concrete; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -import Collection.AbstractList; -import Collection.Iterator; - -public class ArrayList extends AbstractList { - - private E[] elements; - private int size; - private static final int INITIAL_SIZE = 16; - - - public ArrayList() { - elements = (E[]) new Object[INITIAL_SIZE]; - size = 0; - } - - @Override - public void add(E e) { - checkCapacity(); - elements[size++] = e; - } - - private void checkCapacity() { - if (size >= MAX_SIZE) - throw new IndexOutOfBoundsException("Reached max size"); - - if (elements.length - size < INITIAL_SIZE) - grow(); - } - - synchronized private void grow() { - - int newCapacity = size * 2; - newCapacity = (newCapacity < 0 || newCapacity - MAX_SIZE > 0) ? MAX_SIZE : newCapacity; - E[] target = (E[]) new Object[newCapacity]; - System.arraycopy(elements, 0, target, 0, size); - elements = target; - - } - - public void add(int index, E e) { - checkCapacity(); - if (index == size) { - add(e); - return; - } - checkIndex(index); - synchronized (this) { - System.arraycopy(elements, index, elements, index+1, size-index+1); - elements[index] = e; - size++; - } - } - - @Override - public E get(int index) { - checkIndex(index); - return elements[index]; - } - - - public E getLast() { - return get(size-1); - } - - public void addLast(E e) { - add(e); - } - - public E removeLast() { - return elements[--size]; - } - - public E remove(int index) { - checkIndex(index); - E result = elements[index]; - synchronized (this) { - System.arraycopy(elements, index+1, elements, index, size-index-1); - elements[--size] = null; - } - return result; - } - - @Override - public int size() { - return size; - } - - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Arrays.hashCode(elements); - result = prime * result + size; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ArrayList other = (ArrayList) obj; - if (!Arrays.equals(elements, other.elements)) - return false; - if (size != other.size) - return false; - return true; - } - - public Iterator iterator(){ - return new ArrayListIterator(this); - } - - private class ArrayListIterator implements Iterator { - - private ArrayList myArrayList; - private int pos; - - public ArrayListIterator(ArrayList arrayList) { - myArrayList = arrayList; - pos = 0; - } - - @Override - public boolean hasNext() { - return pos < size; - } - - @Override - public E next() { - if (hasNext()) - return (E) elements[pos++]; - throw new NoSuchElementException(); - } - } - - - -} diff --git a/group12/382266293/src/Collection/Concrete/BinaryTreeNode.java b/group12/382266293/src/Collection/Concrete/BinaryTreeNode.java deleted file mode 100644 index 34a9d4253e..0000000000 --- a/group12/382266293/src/Collection/Concrete/BinaryTreeNode.java +++ /dev/null @@ -1,126 +0,0 @@ -package Collection.Concrete; - -public class BinaryTreeNode> { - - private E data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private int size; - private ArrayList myList; - - - - public BinaryTreeNode() { - this.data = null; - this.left = null; - this.right = null; - } - - public BinaryTreeNode(E data) { - this.data = data; - this.left = null; - this.right = null; - } - - public boolean isEmpty() { - return data == null; - } - - public int size() { - return size; - } - - public BinaryTreeNode insert(E o) { - BinaryTreeNode res; - if (isEmpty()) { - data = o; - size++; - return this; - } else { - BinaryTreeNode p = this; - res = new BinaryTreeNode(o); - while (true) { - if (res.getData().compareTo(p.getData()) < 0) { - if (p.left == null) { - p.setLeft(res); - break; - } - p = p.left; - } else if (res.getData().compareTo(p.getData()) > 0) { - if (p.right == null) { - p.setRight(res); - break; - } - p = p.right; - } else { - return null; - } - } - size++; - } - return res; - } - - - - public ArrayList preOrderTraversal(BinaryTreeNode node) { - - if (node != null) { - preOrderTraversal(node.left); - myList.add(node.data); - preOrderTraversal(node.right); - } - return myList; - } - - @Override - public String toString() { - myList = new ArrayList(); - return preOrderTraversal(this).toString(); - } - - public E getData() { - return data; - } - public void setData(E data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((data == null) ? 0 : data.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - BinaryTreeNode other = (BinaryTreeNode) obj; - if (data == null) { - if (other.data != null) - return false; - } else if (!data.equals(other.data)) - return false; - return true; - } - -} \ No newline at end of file diff --git a/group12/382266293/src/Collection/Concrete/LinkedList.java b/group12/382266293/src/Collection/Concrete/LinkedList.java deleted file mode 100644 index 66dbd9d8d0..0000000000 --- a/group12/382266293/src/Collection/Concrete/LinkedList.java +++ /dev/null @@ -1,196 +0,0 @@ -package Collection.Concrete; - -import java.util.NoSuchElementException; -import Collection.AbstractList; -import Collection.Iterator; - - -public class LinkedList extends AbstractList { - - private Node head; - private int size; - - public LinkedList() { - this.head = new Node(null); - this.size = 0; - } - - @Override - public void add(E e) { - addLast(e); - } - - - @Override - public E get(int index) { - checkIndex(index); - return getNode(index).data; - } - - public E getFirst() { - return get(0); - } - - public E getLast() { - return get(size-1); - } - - - public void add(int index, E e) { - if (index == size) { - addLast(e); - return; - } - - if (index == 0) { - addFirst(e); - return; - } - - checkIndex(index); - Node pNode = new Node(e); - Node p = getNode(index); - synchronized (this) { - getNode(index-1).next = pNode; - pNode.next = p; - size++; - } - } - - public void addFirst(E e){ - checkCapacity(); - Node pNode = new Node(e); - Node oldHead = head; - head = pNode; - pNode.next = oldHead; - size++; - return; - } - - public void addLast(E e){ - if (size == 0) { - addFirst(e); - return; - } - - checkCapacity(); - Node res = new Node(e); - setLastNode(res); - size++; - return; - } - - public E removeFirst(){ - return remove(0); - } - public E removeLast(){ - return remove(size-1); - } - - public E remove(int index) { - checkIndex(index); - Node pNode = getNode(index); - if (index == 0) { - head = head.next; - } else if (index == size-1 ) { - getNode(index-1).next = null; - } else { - getNode(index-1).next = getNode(index+1); - } - size--; - return pNode.data; - } - - @Override - public int size() { - return size; - } - - public Iterator iterator(){ - return new LinkedListIterator(this); - } - - private void checkCapacity() { - if (size > MAX_SIZE) - throw new IndexOutOfBoundsException("Reached max capacity: "+ MAX_SIZE); - } - - private Node getNode(int index) { - if (size == 0) - return head; - - Node pNode = head; - for ( int i = 0; i < index ; i++) { - pNode = pNode.next; - } - return pNode; - } - - private void setLastNode(Node res) { - getNode(size-1).next = res; - } - - private static class Node { - E data; - Node next; - - public Node(E data) { - this.data = data; - this.next = null; - } - - @Override - public String toString() { - return data.toString(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((data == null) ? 0 : data.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Node other = (Node) obj; - if (data == null) { - if (other.data != null) - return false; - } else if (!data.equals(other.data)) - return false; - return true; - } - } - - @SuppressWarnings("hiding") - private class LinkedListIterator implements Iterator { - - private LinkedList myLinkedList; - private int pos; - - public LinkedListIterator(LinkedList linkedList) { - myLinkedList = linkedList; - pos = 0; - } - - @Override - public boolean hasNext() { - return pos < size; - } - - @Override - public E next() { - if (hasNext()) - return (E) get(pos++); - throw new NoSuchElementException(); - } - } -} diff --git a/group12/382266293/src/Collection/Concrete/Queue.java b/group12/382266293/src/Collection/Concrete/Queue.java deleted file mode 100644 index 300fb633af..0000000000 --- a/group12/382266293/src/Collection/Concrete/Queue.java +++ /dev/null @@ -1,84 +0,0 @@ -package Collection.Concrete; -import java.util.NoSuchElementException; - -import Collection.AbstractList; -import Collection.Iterator; - -public class Queue extends AbstractList { - - private LinkedList myList; - - public Queue() { - this.myList = new LinkedList(); - } - - public void enQueue(E e){ - myList.addLast(e); - } - - public E deQueue(){ - if (0 == size()) - return null; - return myList.removeFirst(); - } - - @Override - public void add(E e) { - enQueue(e); - } - - @Override - public E get(int index) { - if (0 == size()) - return null; - return myList.get(index); - } - - public E element() { - if (0 == size()) - return null; - return myList.getFirst(); - } - - - @Override - public int size() { - return myList.size(); - } - - @Override - protected Iterator iterator() { - return myList.iterator(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((myList == null) ? 0 : myList.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Queue other = (Queue) obj; - if (myList == null) { - if (other.myList != null) - return false; - } else if (!myList.equals(other.myList)) - return false; - return true; - } - - - - - - -} diff --git a/group12/382266293/src/Collection/Concrete/Stack.java b/group12/382266293/src/Collection/Concrete/Stack.java deleted file mode 100644 index 17ec4364fa..0000000000 --- a/group12/382266293/src/Collection/Concrete/Stack.java +++ /dev/null @@ -1,106 +0,0 @@ -package Collection.Concrete; - -import java.util.EmptyStackException; -import java.util.NoSuchElementException; - -import Collection.AbstractList; -import Collection.Iterator; - -public class Stack extends AbstractList { - - private ArrayList myList; - - public Stack() { - this.myList = new ArrayList(); - } - - public void push(E e){ - myList.addLast(e); - } - - public E pop(){ - checkEmpty(); - return myList.removeLast(); - } - - private void checkEmpty() { - if (0 == size()) - throw new EmptyStackException(); - } - - public E peek(){ - checkEmpty(); - return myList.getLast(); - } - - public int size(){ - return myList.size(); - } - - @Override - public void add(E e) { - push(e); - } - - @Override - public E get(int index) { - checkEmpty(); - return myList.get(size() - index - 1); - } - - @Override - protected Iterator iterator() { - return new StackIterator(myList); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((myList == null) ? 0 : myList.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Stack other = (Stack) obj; - if (myList == null) { - if (other.myList != null) - return false; - } else if (!myList.equals(other.myList)) - return false; - return true; - } - - private class StackIterator implements Iterator { - - private ArrayList myArrayList; - private int pos; - - public StackIterator(ArrayList myList) { - myArrayList = myList; - pos = 0; - } - - @Override - public boolean hasNext() { - return pos < size(); - } - - @Override - public E next() { - if (hasNext()) - return (E) get(pos); - throw new NoSuchElementException(); - } - } - - - -} diff --git a/group12/382266293/src/Collection/Iterator.java b/group12/382266293/src/Collection/Iterator.java deleted file mode 100644 index d51656a3a8..0000000000 --- a/group12/382266293/src/Collection/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package Collection; - -public interface Iterator { - - public boolean hasNext(); - public E next(); -} diff --git a/group12/382266293/src/Collection/List.java b/group12/382266293/src/Collection/List.java deleted file mode 100644 index 7ddb685cac..0000000000 --- a/group12/382266293/src/Collection/List.java +++ /dev/null @@ -1,16 +0,0 @@ -package Collection; - -public interface List { - - public void add(E e); - - public int size(); - - public E get(int index); - - public boolean isEmpty(); - - public int indexOf(E e); - - -} diff --git a/group12/382266293/src/TestCollection/AllTests.java b/group12/382266293/src/TestCollection/AllTests.java deleted file mode 100644 index cd4eeadb58..0000000000 --- a/group12/382266293/src/TestCollection/AllTests.java +++ /dev/null @@ -1,11 +0,0 @@ -package TestCollection; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@SuiteClasses({ ArrayListTest.class, BinaryTreeNodeTest.class, LinkedListTest.class, QueueTest.class, StackTest.class }) -public class AllTests { - -} diff --git a/group12/382266293/src/TestCollection/ArrayListTest.java b/group12/382266293/src/TestCollection/ArrayListTest.java deleted file mode 100644 index f29580616f..0000000000 --- a/group12/382266293/src/TestCollection/ArrayListTest.java +++ /dev/null @@ -1,173 +0,0 @@ -package TestCollection; - -import static util.Print.*; -import static util.TestUtil.*; -import java.util.Date; -import java.util.NoSuchElementException; -import java.util.Random; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - - -import Collection.Iterator; -import Collection.List; -import Collection.Concrete.ArrayList; -import junit.framework.TestCase; - -public class ArrayListTest extends TestCase { - - - private ArrayList myAL; - private static Random rnd = new Random(); - - @Before - public void setUp() throws Exception { - - myAL = new ArrayList(); - assertEquals(true,myAL.isEmpty()); - - } - - @After - public void tearDown() throws Exception { - myAL = null; - } - - @Test - public void testRawTypeArrayList() { - - List rawList = new ArrayList(); - assertEquals(rawList.size(), 0); - rawList.add(new Date()); - assertEquals(1, rawList.size()); - } - - @Test - public void testEmpty() { - - assertEquals(true,myAL.isEmpty()); - - myAL.add(5); - assertEquals(false,myAL.isEmpty()); - - int num = getRandomNumber(); - addIntWithNatureOrder(myAL, num); - assertEquals(false,myAL.isEmpty()); - - } - - @Test - public void testAddIntAutoBoxing() { - - myAL.add(5); - myAL.add(5); - myAL.add(5); - myAL.add(1,10); - int c = myAL.get(1); - assertEquals(10,c); - - assertEquals(4,myAL.size()); - myAL.add(4,15); - int a = myAL.get(0); - Integer b = myAL.get(1); - c = myAL.get(2); - int d = myAL.get(3); - int e = myAL.get(4); - assertEquals(5,a); - assertEquals(new Integer(10),b); - assertEquals(5,c); - assertEquals(5,d); - assertEquals(15,e); - } - - @Test - public void testGet() { - - int[] result = addRandomInt(myAL, getRandomNumber()); - - int actual,expected; - - for (int i = 0; i < result.length; i++) { - actual = myAL.get(i); - expected = result[i]; - assertEquals(expected, actual); - } - - } - - @Test - public void testRemove() { - - addIntWithNatureOrder(myAL, 100); - - testRemoveAndGetFromTail(myAL); - try { - myAL.remove(10); - fail("no exception thrown"); - } catch (Exception e) { - assertEquals(IndexOutOfBoundsException.class, e.getClass()); - } - - } - - @Test - public void testSize() { - - assertEquals(0,myAL.size()); - int num = getRandomNumber(); - addIntWithNatureOrder(myAL, num); - assertEquals(num,myAL.size()); - } - - - - @Test - public void testGrow() { - - int actualSize = 12345; - - addIntWithNatureOrder(myAL, actualSize); - - assertEquals(actualSize,myAL.size()); - } - - - @Test - public void testIterator() { - - addIntWithNatureOrder(myAL,100); - - Iterator it = myAL.iterator(); - - for(int i = 0; it.hasNext(); i++){ - int actual = it.next(); - assertEquals(i,actual); - } - - try { - it.next(); - } catch (NoSuchElementException ex) { - assertEquals(ex.getClass(),NoSuchElementException.class); - } - } - - @Test - public void testIndexOf() { - - int num = 200; - addIntWithNatureOrder(myAL,num); - - int expected,actual; - for (int i = 0; i < num-1; i++) { - expected = i; - actual = myAL.indexOf(i); - assertEquals(expected, actual); - } - - assertEquals(-1, myAL.indexOf(-1*getRandomNumber())); - - } - -} diff --git a/group12/382266293/src/TestCollection/BinaryTreeNodeTest.java b/group12/382266293/src/TestCollection/BinaryTreeNodeTest.java deleted file mode 100644 index 275ef59484..0000000000 --- a/group12/382266293/src/TestCollection/BinaryTreeNodeTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package TestCollection; - -import static util.Print.*; -import java.util.Random; -import java.util.Set; -import java.util.TreeSet; -import static util.TestUtil.*; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import Collection.Concrete.BinaryTreeNode; -import junit.framework.TestCase; - -public class BinaryTreeNodeTest extends TestCase { - - private BinaryTreeNode myTree; - - @Before - public void setUp() throws Exception { - myTree = new BinaryTreeNode(); - assertEquals(0, myTree.size()); - } - - @After - public void tearDown() throws Exception { - myTree = null; - } - - @Test - public void testInsert() { - Set expected = new TreeSet(); - int size = getRandomNumber(); - int j = 0 ; - while (expected.size() != size) { - j = getRandomNumber(); - expected.add(j); - myTree.insert(j); - } - - assertEquals(size,myTree.size()); - assertEquals(expected.toString(),myTree.toString()); - } - - public void testSize() { - - for (int i = 0; i < getRandomNumber(); i++) { - myTree.insert(18); - myTree.insert(-19); - myTree.insert(1); - assertEquals(3,myTree.size()); - } - } -} \ No newline at end of file diff --git a/group12/382266293/src/TestCollection/LinkedListTest.java b/group12/382266293/src/TestCollection/LinkedListTest.java deleted file mode 100644 index 8b9fad15eb..0000000000 --- a/group12/382266293/src/TestCollection/LinkedListTest.java +++ /dev/null @@ -1,212 +0,0 @@ -package TestCollection; - -import static util.Print.*; -import static util.TestUtil.*; -import java.util.Date; -import java.util.NoSuchElementException; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import Collection.Iterator; -import Collection.List; -import Collection.Concrete.LinkedList; -import junit.framework.TestCase; - - -public class LinkedListTest extends TestCase { - - LinkedList myLL; - - @Before - public void setUp() throws Exception { - myLL = new LinkedList(); - assertEquals(0,myLL.size()); - } - - @After - public void tearDown() throws Exception { - myLL = null; - } - - @Test - public void testLinkedList() { - List rawList = new LinkedList(); - assertEquals(rawList.size(), 0); - rawList.add(new Date()); - assertEquals(1, rawList.size()); - - } - - @Test - public void testAddE() { - myLL.add("s"); - assertEquals(1,myLL.size()); - assertEquals(false,myLL.isEmpty()); - } - - @Test - public void testAddStringE() { - String a; - - addString(myLL,30); - println(myLL.get(0)); - -// for (int i = 0 ; i < 29; i++) { -// a = "" + i; -// assertEquals(myLL.get(i),a); -// } - } - - @Test - public void testAddIndex() { - String a; - for (int i = 0 ; i < 30; i++) { - a = "" + i; - myLL.add(a); - } - - String ss = "ss"; - myLL.add(3,ss); - assertEquals(myLL.get(3), ss); - assertEquals(myLL.get(2), "2"); - assertEquals(myLL.get(4), "3"); - - } - - public void testAddFirst() { - String a; - for (int i = 0 ; i < 20; i++) { - a = "" + i; - myLL.add(a); - } - - String ss = "bba"; - myLL.addFirst(ss); - assertEquals(ss,myLL.get(0)); - assertEquals(21, myLL.size()); - - ; - for (int i = 1 ; i < myLL.size(); i++) { - a = (i-1) + ""; - assertEquals(a, myLL.get(i)); - } - } - - public void testAddLast() { - String a; - for (int i = 0 ; i < 25; i++) { - a = "" + i; - myLL.add(a); - } - - String ss = "25"; - myLL.addLast(ss); - int size = myLL.size(); - assertEquals(26, size); - - for (int i = 0 ; i < size; i++) { - a = i + ""; - assertEquals(a, myLL.get(i)); - } - } - - @Test - public void testRemoveFirst() { - - String a = ""; - String result = ""; - for(int i = 0; i < 10; i++) { - myLL.add(i+""); - } - - myLL.removeFirst(); - assertEquals(9, myLL.size()); - - for(int i = 0; i < myLL.size(); i++) { - a = i+1 + ""; - assertEquals(a, myLL.get(i)); - } - - int size = myLL.size(); - for(int i = 0; i < size; i++) { - a = i+1 +""; - result = myLL.removeFirst(); - assertEquals(a, result); - } - - assertEquals(0, myLL.size()); - } - - @Test - public void testRemoveLast() { - - String a = ""; - String result = ""; - for(int i = 0; i < 10; i++) { - myLL.add(i+""); - } - - myLL.removeLast(); - assertEquals(9, myLL.size()); - - for(int i = 0; i < myLL.size(); i++) { - a = i + ""; - assertEquals(a, myLL.get(i)); - } - - int size = myLL.size(); - for(int i = 0; i < size; i++) { - a = myLL.size()-1 +""; - result = myLL.removeLast(); - assertEquals(a, result); - } - - assertEquals(0, myLL.size()); - - } - - - @Test - public void testRemove() { - - String res = ""; - String a = ""; - for(int i = 0; i < 10; i++) { - myLL.add(i+""); - } - - for(int i = myLL.size()-1; i >= 0; i--) { - a = myLL.get(i); - res = myLL.remove(i); - assertEquals(i, myLL.size()); - assertEquals(a,res); - } - } - - @Test - public void testSize() { - assertEquals(0,myLL.size()); - } - - @Test - public void testIterator() { - for(int i = 0; i<10; i++) { - myLL.add(i+""); - } - Iterator it = myLL.iterator(); - - for(int i = 0; it.hasNext(); i++){ - String res = it.next(); - assertEquals(i+"",res); - } - - try { - it.next(); - } catch (NoSuchElementException ex) { - assertEquals(ex.getClass(),NoSuchElementException.class); - } - } - - -} diff --git a/group12/382266293/src/TestCollection/QueueTest.java b/group12/382266293/src/TestCollection/QueueTest.java deleted file mode 100644 index 01a9aa31f2..0000000000 --- a/group12/382266293/src/TestCollection/QueueTest.java +++ /dev/null @@ -1,98 +0,0 @@ -package TestCollection; - -import static util.Print.*; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import static util.TestUtil.*; -import Collection.Concrete.Queue; -import junit.framework.TestCase; - -public class QueueTest extends TestCase { - - private Queue myQueue; - - @Before - public void setUp() throws Exception { - myQueue= new Queue(); - } - - @After - public void tearDown() throws Exception { - myQueue = null; - } - - @Test - public void testIsEmpty() { - assertEquals(true, myQueue.isEmpty()); - myQueue.enQueue(getRandomNumber()); - assertEquals(false, myQueue.isEmpty()); - } - - @Test - public void testEnQueue() { - - enQueueIntWithNatureOrder(myQueue, getRandomNumber()); - - } - - @Test - public void testDeQueue() { - enQueueIntWithNatureOrder(myQueue, getRandomNumber()); - int size = myQueue.size(); - for (int i = 0; i < size ; i++) { - assertEquals(size-i, myQueue.size()); - int expect = i; - int actual = myQueue.deQueue(); - assertEquals(expect, actual); - } - - assertEquals(null, myQueue.deQueue()); - assertEquals(null, myQueue.element()); - assertEquals(null, myQueue.get(0)); - - } - - @Test - public void testelement() { - - int expected = 0; - int element1 = 0; - int repeated = 0; - - for (int i = 0; i < 10; i++) { - myQueue.enQueue(i); - expected = i; - - element1 = myQueue.element(); - assertEquals(expected, element1); - - for (int j = 0; j < i; j++) { - repeated = myQueue.element(); - assertEquals(expected, repeated); - } - myQueue.deQueue(); - } - - } - - @Test - public void testSize() { - for (int i = 0; i < 10000; i++) { - assertEquals(i, myQueue.size()); - myQueue.enQueue(i); - } - } - - @Test - public void testAdd() { - for (int i = 0; i < 10; i++) { - myQueue.add(i); - Integer actual = new Integer(myQueue.get(i)); - Integer expected = new Integer(i); - assertEquals(expected, actual); - } - } - - -} diff --git a/group12/382266293/src/TestCollection/StackTest.java b/group12/382266293/src/TestCollection/StackTest.java deleted file mode 100644 index 3784a9b972..0000000000 --- a/group12/382266293/src/TestCollection/StackTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package TestCollection; - -import static util.Print.*; - -import java.util.EmptyStackException; -import static util.TestUtil.*; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import Collection.Concrete.Stack; -import junit.framework.TestCase; - -public class StackTest extends TestCase { - - Stack myStack; - - @Before - public void setUp() throws Exception { - myStack= new Stack(); - } - - @After - public void tearDown() throws Exception { - myStack = null; - } - - @Test - public void testIsEmpty() { - assertEquals(true, myStack.isEmpty()); - myStack.push(getRandomNumber()); - assertEquals(false, myStack.isEmpty()); - } - - @Test - public void testPush() { - for (int i = 0; i < 10; i++) { - assertEquals(i, myStack.size()); - myStack.push(i); - } - } - - @Test - public void testPop() { - testPush(); - int size = myStack.size(); - for (int i = size; i > 0; i--) { - assertEquals(i, myStack.size()); - int expect = i-1; - assertEquals(i, myStack.size()); - int actual = myStack.pop(); - assertEquals(expect, actual); - } - - try { - myStack.pop(); - fail("no exception throw"); - } catch (Exception e) { - assertEquals(EmptyStackException.class, e.getClass()); - } - } - - @Test - public void testPeek() { - - int expected = 0; - int peek1 = 0; - int repeated = 0; - - for (int i = 0; i < 10; i++) { - myStack.push(i); - expected = i; - - peek1 = myStack.peek(); - assertEquals(expected, peek1); - - for (int j = 0; j < i; j++) { - repeated = myStack.peek(); - assertEquals(expected, repeated); - } - } - - } - - - public void testGet() { - - try { - myStack.get(getRandomNumber()); - fail("no exception throw"); - } catch (Exception e) { - assertEquals(EmptyStackException.class, e.getClass()); - } - - } - - @Test - public void testSize() { - for (int i = 0; i < 10000; i++) { - assertEquals(i, myStack.size()); - myStack.push(i); - } - } - - @Test - public void testAdd() { - myStack.push(5); - myStack.push(10); - myStack.push(15); - println(myStack.get(0)); - println(myStack.get(1)); - println(myStack.get(2)); - - } - - @Test - public void testPopPushAndPeek() { - for (int i = 0; i < 10; i++) { - int expected = i; - myStack.push(i); - int a = 0; - myStack.push(a); - myStack.pop(); - int actual = myStack.peek(); - assertEquals(expected, actual); - } - } - -} diff --git a/group12/382266293/src/test.java b/group12/382266293/src/test.java deleted file mode 100644 index e4e7fead2d..0000000000 --- a/group12/382266293/src/test.java +++ /dev/null @@ -1,15 +0,0 @@ -import java.util.ArrayList; -import java.util.Queue; -import java.util.Stack; -import java.util.concurrent.PriorityBlockingQueue; -import static util.Print.*; - -public class test { - - public static void main(String[] args) { - Queue queue = new PriorityBlockingQueue(); - println(queue.poll()); - - } - -} diff --git a/group12/382266293/src/util/Print.java b/group12/382266293/src/util/Print.java deleted file mode 100644 index b2ae48552b..0000000000 --- a/group12/382266293/src/util/Print.java +++ /dev/null @@ -1,14 +0,0 @@ -package util; - - -public class Print { - - public static void print(Object o){ - System.out.print(o); - } - - public static void println(Object o){ - System.out.println(o); - } - -} diff --git a/group12/382266293/src/util/TestUtil.java b/group12/382266293/src/util/TestUtil.java deleted file mode 100644 index 2dfeeade7f..0000000000 --- a/group12/382266293/src/util/TestUtil.java +++ /dev/null @@ -1,78 +0,0 @@ -package util; - -import java.util.Random; - -import Collection.List; -import Collection.Concrete.ArrayList; -import Collection.Concrete.LinkedList; -import Collection.Concrete.Queue; -import junit.framework.TestCase; - - -public class TestUtil extends TestCase { - - private static Random random = new Random(); - private static final int RANDOM_BOUND = 2<<15; - private static final int RANDOM_SIZE = 500; - - - public static int getRandomNumber() { - return random.nextInt(RANDOM_SIZE); - } - - public static void addIntWithNatureOrder(List myList, int numbers) { - - for (int acutal = 0; acutal < numbers ; acutal++) { - myList.add(acutal); - } - } - - public static int[] addRandomInt(List myList, int numbers) { - - int actual = 0; - int[] result = new int[numbers]; - for (int i = 0; i < numbers ; i++) { - actual = random.nextInt(RANDOM_BOUND); - result[i] = actual; - myList.add(actual); - } - return result; - } - - public static void addString(List myList, int num) { - - String actual; - for (int index = 0; index < num ; index++) { - actual = index + ""; - myList.add(actual); - } - } - - public static void testRemoveAndGetFromTail(ArrayList myList) { - E get; - E remove; - for(int i = myList.size()-1; i >= 0; i--) { - get = myList.get(i); - remove = myList.remove(i); - assertEquals(get,remove); - } - } - - public static void testRemoveAndGetFromTail(LinkedList myList) { - E get; - E remove; - for(int i = myList.size()-1; i >= 0; i--) { - get = myList.get(i); - remove = myList.remove(i); - assertEquals(get,remove); - } - } - - public static void enQueueIntWithNatureOrder(Queue myQueue, int numbers) { - - for (int acutal = 0; acutal < numbers ; acutal++) { - myQueue.enQueue(acutal); - } - } - -} diff --git a/group12/441908378/ArrayList.java b/group12/441908378/ArrayList.java deleted file mode 100755 index 45e495867c..0000000000 --- a/group12/441908378/ArrayList.java +++ /dev/null @@ -1,50 +0,0 @@ -import java.util.Arrays; - -public class ArrayList { - -private int size = 0; - -private Object[] elementData = new Object[100]; - -public void enlargeCapacity(int minCapacity){ - int oldCapacity=elementData.length; - if(oldCapacityb){ - return left; - }else{ - return right; - } - } - - -} diff --git a/group12/441908378/LinkedList.java b/group12/441908378/LinkedList.java deleted file mode 100755 index 0d0339bc01..0000000000 --- a/group12/441908378/LinkedList.java +++ /dev/null @@ -1,121 +0,0 @@ -public class LinkedList { - -private Node head; - -private static class Node{ - Object data; - Node next; -} - -public boolean hasNext(Node a){ - if(a.next!=null){ - return true; - } - return false; -} - -public Node getIndex(int index){ - Node a=head.next; - for(int i=0;i elementData.length) { - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - } - /** - * - * 验证 - * - * @MethodName validate 下标 - * @author msh - * @date 2017年2月21日 下午3:54:21 - * @param index - */ - private void validate(int index) { - if (index < 0 || index >= size) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } -} diff --git a/group12/446031103/src/com/coding/basic/BinaryTreeNode.java b/group12/446031103/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index ed26d946bb..0000000000 --- a/group12/446031103/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.coding.basic; - - -public class BinaryTreeNode { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private BinaryTreeNode( Object data,BinaryTreeNode left,BinaryTreeNode right){ - this.data = data; - this.left = left; - this.right = right; - } - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(BinaryTreeNode tree,Object o){ - if(null== tree){ - tree = new BinaryTreeNode(o, null, null); - } - if(Integer.valueOf(o.toString())>Integer.valueOf(tree.data.toString())){ - tree.right =insert(tree.right,o); - }else{ - tree.left = insert(tree.left,o); - } - return tree; - } - -} diff --git a/group12/446031103/src/com/coding/basic/Iterator.java b/group12/446031103/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group12/446031103/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group12/446031103/src/com/coding/basic/LinkedList.java b/group12/446031103/src/com/coding/basic/LinkedList.java deleted file mode 100644 index de508694a0..0000000000 --- a/group12/446031103/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,225 +0,0 @@ -package com.coding.basic; - -/** - * - * LinkedList集合-链 - * - * @ClassName LinkedList - * @author msh - * @date 2017年2月21日 下午4:08:01 - */ -public class LinkedList implements List { - //链头 - private Node head; - //集合大小 - private int size=0; - /** - * - * 向链中添加元素 - * - * @Method add 添加 - * @param o 元素 - * @see com.coding.basic.List#add(java.lang.Object) - */ - public void add(Object o){ - Node newNode = new Node(o, null); - if (null == head) { - head = newNode; - } else { - Node lastNode = null; - for (int i = 0; i < size; i++) { - lastNode = (Node) get(i); - } - lastNode.next = newNode; - } - size++; - } - /** - * - * 向链中添加元素 - * - * @Method add 增加 - * @param index 下标 - * @param o 元素 - * @see com.coding.basic.List#add(int, java.lang.Object) - */ - public void add(int index , Object o){ - validate(index); - Node newNode = null; - Node perNode = null; - Node nextNode = null; - // 当为最后插入时 - if (index == size - 1) { - newNode = new Node(o, null); - for (int i = 0; i < index; i++) { - Node tempNode = (Node) get(i); - perNode = tempNode.next; - } - perNode.next = newNode; - } else if (0 == index) { - nextNode = head.next; - newNode = new Node(o, nextNode); - head = newNode; - } else { - for (int i = 0; i < index; i++) { - Node tempNode = (Node) get(i); - perNode = tempNode.next; - } - nextNode = perNode.next.next; - newNode = new Node(o, nextNode); - perNode.next = newNode; - } - size++; - } - /** - * - * 取得元素 - * - * @Method get 取得 - * @param index 下标 - * @return - * @see com.coding.basic.List#get(int) - */ - public Object get(int index){ - validate(index); - Node tempNode = head; - for (int i = 0; i <= index; i++) { - tempNode = tempNode.next; - } - return tempNode; - } - /** - * - * 删除元素 - * - * @Method remove 删除 - * @param index 下标 - * @return - * @see com.coding.basic.List#remove(int) - */ - public Object remove(int index){ - Node removeNode = (Node) get(index); - validate(index); - if (index == size - 1) { - Node tempNode = head; - for (int i = 0; i < index; i++) { - tempNode = tempNode.next; - } - tempNode.next = null; - } else if (index == 0) { - Node tempNode = head.next; - head.next = null; - head = tempNode; - } else { - } - size--; - return removeNode; - } - /** - * - * 取得集合大小 - * - * @Method size 集合大小 - * @return 集合大小 - * @see com.coding.basic.List#size() - */ - public int size(){ - return size; - } - /** - * - * 想链头中插入元素 - * - * @MethodName addFirst - * @author msh - * @date 2017年2月21日 下午4:10:56 - * @param o - */ - public void addFirst(Object o){ - Node newNode = new Node(o, head); - head = newNode; - } - /** - * - * 向链后加入元素 - * - * @MethodName addLast - * @author msh - * @date 2017年2月21日 下午4:11:43 - * @param o - */ - public void addLast(Object o){ - add(o); - } - /** - * - * 删除链头 - * - * @MethodName removeFirst - * @author msh - * @date 2017年2月21日 下午4:12:14 - * @return - */ - public Object removeFirst(){ - if(null==head) - throw new IndexOutOfBoundsException("Size: " + size); - Node orgHead = head; - Node tempNode = head.next; - head.next = null; - head = tempNode; - return orgHead; - } - /** - * - * 删除链尾 - * - * @MethodName removeLast - * @author zhaogd - * @date 2017年2月21日 下午4:12:44 - * @return - */ - public Object removeLast(){ - if(null==head) - throw new IndexOutOfBoundsException("Size: " + size); - Node lastNode = (Node) get(size); - Node tempNode = head; - for (int i = 0; i < (size - 1); i++) { - tempNode = tempNode.next; - } - tempNode.next = null; - return lastNode; - } - public Iterator iterator(){ - return null; - } - - /** - * - * 验证 - * - * @MethodName validate 下标 - * @author msh - * @date 2017年2月21日 下午3:54:21 - * @param index - */ - private void validate(int index) { - if (index < 0 || index >= size) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - /** - * - * 链中元素 - * - * @ClassName Node - * @author zhaogd - * @date 2017年2月21日 下午4:13:10 - */ - private static class Node{ - Object data; - Node next; - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } -} diff --git a/group12/446031103/src/com/coding/basic/List.java b/group12/446031103/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group12/446031103/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group12/446031103/src/com/coding/basic/Queue.java b/group12/446031103/src/com/coding/basic/Queue.java deleted file mode 100644 index 3844d9dd24..0000000000 --- a/group12/446031103/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.coding.basic; - -/** - * - * 队列-先进先出 - * - * @ClassName Queue - * @author msh - * @date 2017年2月21日 下午9:29:03 - */ -public class Queue { - private LinkedList elementData = new LinkedList(); - /** - * - * 入队列 - * - * @MethodName enQueue - * @author msh - * @date 2017年2月21日 下午9:45:15 - * @param o - */ - public void enQueue(Object o){ - elementData.add(o); - } - /** - * - * 离开队列 - * - * @MethodName deQueue - * @author msh - * @date 2017年2月21日 下午9:56:06 - * @return - */ - public Object deQueue(){ - if(isEmpty()) - throw new IndexOutOfBoundsException("size:"+size()); - Object o=elementData.get(0); - elementData.removeFirst(); - return o; - } - /** - * - * 是否为空 - * - * @MethodName isEmpty - * @author msh - * @date 2017年2月21日 下午9:57:14 - * @return - */ - public boolean isEmpty(){ - boolean temp = false; - if(0==elementData.size()) - temp= true; - return temp; - } - /** - * - * 队列中元素 - * - * @MethodName size - * @author msh - * @date 2017年2月21日 下午9:57:28 - * @return - */ - public int size(){ - return elementData.size(); - } -} diff --git a/group12/446031103/src/com/coding/basic/Stack.java b/group12/446031103/src/com/coding/basic/Stack.java deleted file mode 100644 index 4d1c58b671..0000000000 --- a/group12/446031103/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.coding.basic; - -/** - * - * 栈-先进后出 - * - * @ClassName Stack - * @author msh - * @date 2017年2月21日 下午9:05:39 - */ -public class Stack { - - private ArrayList elementData = new ArrayList(); - /** - * - * 向栈中加入元素 - * - * @MethodName push - * @author msh - * @date 2017年2月21日 下午9:12:03 - * @param o - */ - public void push(Object o){ - elementData.add(o); - } - /** - * - * 从栈中取出元素 - * - * @MethodName pop - * @author msh - * @date 2017年2月21日 下午9:12:51 - * @return - */ - public Object pop(){ - Object o= peek(); - elementData.remove(size()-1); - return o; - } - /** - * - * 取出栈顶元素 - * - * @MethodName peek - * @author msh - * @date 2017年2月21日 下午9:13:08 - * @return - */ - public Object peek(){ - Object o=elementData.get(size()-1); - return o; - } - /** - * - * 判断栈中是否有元素 - * - * @MethodName isEmpty - * @author msh - * @date 2017年2月21日 下午9:14:26 - * @return - */ - public boolean isEmpty(){ - boolean temp = false; - if(0==size()) - temp = true; - return temp; - } - /** - * - * 栈中有多少元素 - * - * @MethodName size - * @author msh - * @date 2017年2月21日 下午9:16:42 - * @return - */ - public int size(){ - return elementData.size(); - } - -} diff --git a/group12/495473393/Coding/.gitignore b/group12/495473393/Coding/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group12/495473393/Coding/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group12/495473393/Coding/src/Base/ArrayList.java b/group12/495473393/Coding/src/Base/ArrayList.java deleted file mode 100644 index 0b99f87873..0000000000 --- a/group12/495473393/Coding/src/Base/ArrayList.java +++ /dev/null @@ -1,32 +0,0 @@ -package Base; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group12/495473393/Coding/src/Base/BinaryTreeNode.java b/group12/495473393/Coding/src/Base/BinaryTreeNode.java deleted file mode 100644 index 875abe8c80..0000000000 --- a/group12/495473393/Coding/src/Base/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package Base; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group12/495473393/Coding/src/Base/Iterator.java b/group12/495473393/Coding/src/Base/Iterator.java deleted file mode 100644 index 19b65c3637..0000000000 --- a/group12/495473393/Coding/src/Base/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package Base; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group12/495473393/Coding/src/Base/LinkedList.java b/group12/495473393/Coding/src/Base/LinkedList.java deleted file mode 100644 index 0d4ce20167..0000000000 --- a/group12/495473393/Coding/src/Base/LinkedList.java +++ /dev/null @@ -1,46 +0,0 @@ -package Base; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group12/495473393/Coding/src/Base/List.java b/group12/495473393/Coding/src/Base/List.java deleted file mode 100644 index 6c910af600..0000000000 --- a/group12/495473393/Coding/src/Base/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package Base; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group12/495473393/Coding/src/Base/Queue.java b/group12/495473393/Coding/src/Base/Queue.java deleted file mode 100644 index 9c2948d7e3..0000000000 --- a/group12/495473393/Coding/src/Base/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package Base; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group12/495473393/Coding/src/Base/Stack.java b/group12/495473393/Coding/src/Base/Stack.java deleted file mode 100644 index 8f59343d4b..0000000000 --- a/group12/495473393/Coding/src/Base/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package Base; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group12/563253496/datastructure/.classpath b/group12/563253496/datastructure/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group12/563253496/datastructure/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group12/563253496/datastructure/.gitignore b/group12/563253496/datastructure/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group12/563253496/datastructure/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group12/563253496/datastructure/.project b/group12/563253496/datastructure/.project deleted file mode 100644 index 4ae7fd9359..0000000000 --- a/group12/563253496/datastructure/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - datastructure - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group12/563253496/datastructure/src/Collection/ArrayList.java b/group12/563253496/datastructure/src/Collection/ArrayList.java deleted file mode 100644 index 597a9b1a3a..0000000000 --- a/group12/563253496/datastructure/src/Collection/ArrayList.java +++ /dev/null @@ -1,173 +0,0 @@ -package Collection; - -import com.coding.basic.List; - -import java.util.NoSuchElementException; - -import com.coding.basic.Iterator; - -public class ArrayList implements List { - - private int size; - private Object[] elementData; - - public ArrayList() { - size = 0; - elementData = new Object[10]; - } - - public ArrayList(Object o) { - size = 0; - elementData = new Object[10]; - this.add(o); - } - - public ArrayList(int initialCapacity) { - size = 0; - elementData = new Object[initialCapacity]; - } - - @Override - public void add(Object o) { - if (size <= elementData.length - 1) { - elementData[size] = o; - size++; - } else { - this.extendCapacity(); - elementData[size] = o; - size++; - - } - } - - @Override - public void add(int index, Object o) { - if (index < 0) { - throw new IndexOutOfBoundsException(); - } - if (index > elementData.length - 1) { - while (index > elementData.length - 1) { - this.extendCapacity(); - } - elementData[index] = o; - size = index + 1; - return; - } - - if (index >= size) { - size = index + 1; - elementData[index] = o; - return; - } - if (index >= 0 && index < size) { - this.moveRearward(index); - elementData[index] = o; - size++; - return; - } - } - - @Override - public Object get(int index) { - checkCapacity(index); - if (index < size) { - return elementData[index]; - } - return null; - } - - @Override - public Object remove(int index) { - checkCapacity(index); - - if (index == size - 1) { - size--; - return elementData[size - 1]; - } - if (index < size - 1) { - Object tmp = elementData[index]; - for (int i = index; i < size - 1; i++) { - elementData[i] = elementData[i + 1]; - } - size--; - return tmp; - } - return null; - } - - private void checkCapacity(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - } - - private void extendCapacity() { - Object[] elements = new Object[elementData.length + 10]; - for (int i = 0; i < size; i++) { - elements[i] = elementData[i]; - } - elementData = elements; - - } - - @Override - public int size() { - return size; - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (int i = 0; i < size; i++) { - sb.append(elementData[i]); - sb.append(","); - } - sb.deleteCharAt(sb.length() - 1); - sb.append("]"); - return sb.toString(); - } - - private void moveRearward(int index) { - size++; - - if (size >= elementData.length - 1) - this.extendCapacity(); - - for (int i = size - 1; i > index; i--) { - elementData[i] = elementData[i - 1]; - } - } - - public Iterator iterator() { - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator { - - private int pos; - - public ArrayListIterator() { - - pos = 0; - } - - @Override - public boolean hasNext() { - if (pos < size) { - return true; - } - return false; - } - - @Override - public Object next() { - if (hasNext()) { - return elementData[pos++]; - } else - throw new NoSuchElementException(); - - } - - } - -} diff --git a/group12/563253496/datastructure/src/Collection/LinkedList.java b/group12/563253496/datastructure/src/Collection/LinkedList.java deleted file mode 100644 index 94aefb188e..0000000000 --- a/group12/563253496/datastructure/src/Collection/LinkedList.java +++ /dev/null @@ -1,227 +0,0 @@ -package Collection; - -import com.coding.basic.List; -import com.coding.basic.Iterator; - -public class LinkedList implements List { - - public Node head; - public int size; - - public LinkedList() { - head = new Node(); - size = 0; - } - - public LinkedList(Object o) { - head = new Node(o); - size = 1; - } - - public void add(Object o) { - if (size == 0) { - addfirst(o); - return; - } - addlast(o); - } - - public void add(int index, Object o) { - this.checkCapacity(index); - if (index == 0) { - addfirst(o); - return; - } - if (index == size) { - addlast(o); - return; - } - addmid(index, o); - } - - public void checkCapacity(int index) { - if (index > size || index < 0) { - throw new IndexOutOfBoundsException(); - } - } - - public void addfirst(Object o) { - Node tmp = new Node(head); - head.data = o; - head.next = tmp; - size++; - } - - public void addlast(Object o) { - Node tmp = new Node(head); - //Node last = new Node(o); - //last.data=o; - for (int i = 0; i < size-1; i++) { - tmp = tmp.next; - } - - tmp.next = new Node(o); - size++; - - } - - public void addmid(int index, Object o) { - Node tmp = new Node(head); - Node add = new Node(o); - for (int i = 0; i < index - 1; i++) { - tmp = tmp.next; - } - add.next = tmp.next; - tmp.next = add; - size++; - } - - public Object get(int index) { - checkCapacity(index); - Node tmp = new Node(head); - if (index == 0) { - return head; - } - for (int i = 0; i < index - 1; i++) { - tmp = tmp.next; - } - return tmp.next; - } - - public Object remove(int index) { - checkCapacity(index); - Node tmp = new Node(head); - if (index == 0) { - return removeFirst(); - } - for (int i = 0; i < index - 1; i++) { - tmp = tmp.next; - } - Node result = new Node(tmp.next); - tmp.next = result.next; - return result; - } - - public int size() { - return this.size; - } - - public Object removeFirst() { - Node tmp = new Node(head); - head = head.next; - return tmp; - } - - public Object removeLast() { - if (size == 0) { - return null; - } - if (size == 1) { - Node tmp = new Node(head); - head = null; - return tmp; - } - Node tmp = new Node(head); - for (int i = 0; i < size - 2; i++) { - tmp = tmp.next; - } - Node result = new Node(tmp.next); - tmp.next = result.next; - return result; - } - - public String toString(){ - StringBuilder sb= new StringBuilder(); - sb.append("["); - Node tmp=new Node(head); - for(int i=0;ielementData.size()){ - throw new IndexOutOfBoundsException(); - } - } - public Object pop(){ - checkCapacity(); - Object o = elementData.remove(size-1); - size--; - return o; - } - - public Object peek() { - checkCapacity(); - Object o = elementData.get(size-1); - return o; - } - - public boolean isEmpty() { - if(size!=0){ - return true; - } - return false; - } - - public String toString(){ - return super.toString(); - } - - public int size() { - return size; - } -} diff --git a/group12/563253496/datastructure/src/Collection/TestArrayList.java b/group12/563253496/datastructure/src/Collection/TestArrayList.java deleted file mode 100644 index eef55fae6b..0000000000 --- a/group12/563253496/datastructure/src/Collection/TestArrayList.java +++ /dev/null @@ -1,33 +0,0 @@ -package Collection; - -import java.lang.reflect.Array; - -/** - * Created by bdl19 on 2017/2/23. - */ -public class TestArrayList { - /*public static void main(String[] args){ - /* - ArrayList al= new ArrayList("test1"); - System.out.println(al); - al.add("test2"); - System.out.println(al); - al.add(1,2); - System.out.println(al); - System.out.println(al.get(2)); - System.out.println(al.get(1)); - System.out.println(al.get(0)); - // System.out.println(al.get(3)); - System.out.println(al.size()); - System.out.println(al.remove(2)); - System.out.println(al); - - ArrayList al =new ArrayList(); - al.add(3,2); - al.add(0,0); - System.out.println(al.size()); - System.out.println(al); - - } - **/ -} diff --git a/group12/563253496/datastructure/src/Collection/TestStack.java b/group12/563253496/datastructure/src/Collection/TestStack.java deleted file mode 100644 index 4702e49079..0000000000 --- a/group12/563253496/datastructure/src/Collection/TestStack.java +++ /dev/null @@ -1,15 +0,0 @@ -package Collection; - -/** - * Created by bdl19 on 2017/2/25. - */ -public class TestStack { - public static void main(String[] args) { - Stack s=new Stack(); - s.push("a"); - s.push("b"); - System.out.println(s.pop()); - System.out.println(s.pop()); - - } -} diff --git a/group12/563253496/datastructure/src/com/coding/basic/ArrayList.java b/group12/563253496/datastructure/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 1f185736f9..0000000000 --- a/group12/563253496/datastructure/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group12/563253496/datastructure/src/com/coding/basic/BinaryTreeNode.java b/group12/563253496/datastructure/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group12/563253496/datastructure/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group12/563253496/datastructure/src/com/coding/basic/Iterator.java b/group12/563253496/datastructure/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group12/563253496/datastructure/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group12/563253496/datastructure/src/com/coding/basic/LinkedList.java b/group12/563253496/datastructure/src/com/coding/basic/LinkedList.java deleted file mode 100644 index e2c4e5e795..0000000000 --- a/group12/563253496/datastructure/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group12/563253496/datastructure/src/com/coding/basic/List.java b/group12/563253496/datastructure/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group12/563253496/datastructure/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group12/563253496/datastructure/src/com/coding/basic/Queue.java b/group12/563253496/datastructure/src/com/coding/basic/Queue.java deleted file mode 100644 index 36e516e266..0000000000 --- a/group12/563253496/datastructure/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group12/563253496/datastructure/src/com/coding/basic/Stack.java b/group12/563253496/datastructure/src/com/coding/basic/Stack.java deleted file mode 100644 index a5a04de76d..0000000000 --- a/group12/563253496/datastructure/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group12/group12.md b/group12/group12.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group12/group12.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group13/group13.md b/group13/group13.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group13/group13.md +++ /dev/null @@ -1 +0,0 @@ - diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.classpath" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.classpath" deleted file mode 100644 index 373dce4005..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.classpath" +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.gitignore" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.gitignore" deleted file mode 100644 index ae3c172604..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.gitignore" +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.project" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.project" deleted file mode 100644 index 194f47da7a..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.project" +++ /dev/null @@ -1,17 +0,0 @@ - - - basicstructuredemo - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.settings/org.eclipse.jdt.core.prefs" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.settings/org.eclipse.jdt.core.prefs" deleted file mode 100644 index 3a21537071..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/.settings/org.eclipse.jdt.core.prefs" +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/ArrayList.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/ArrayList.java" deleted file mode 100644 index f6d3b4c44a..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/ArrayList.java" +++ /dev/null @@ -1,66 +0,0 @@ -package com.maple.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - //不够了怎么扩容 - elementData[size++]=o; - } - public void add(int index, Object o){ - if(index<0||index>size){ - throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); - } - for(int i=size;i>index;i--){ - elementData[i-1]=elementData[i]; - } - elementData[index]=o; - size++; - } - - public Object get(int index){ - if(index<0||index>=size){ - throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); - } - return elementData[index]; - } - - public Object remove(int index){ - if(index<0||index>=size){ - throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); - } - Object removeObj=elementData[index]; - for(int i=index;i=size) return false; - return true; - } - }; - } - -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTree.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTree.java" deleted file mode 100644 index 5e63cf4d3c..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTree.java" +++ /dev/null @@ -1,45 +0,0 @@ -package com.maple.basic; - -import org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName; - -public class BinaryTree> { - private BinaryTreeNode root; - - public void traversal(BinaryTreeNode node){ - if(node.getLeft()!=null){ - traversal(node.getLeft()); - } - System.out.println("--"+node.getData()+"--"); - if(node.getRight()!=null){ - traversal(node.getRight()); - } - } - /** - * 如果根节点为null,则作为根节点,否则遍历下去插值 - * @param o - * @return - * 2017年2月23日 下午4:21:51 - * @Author Joy - */ - public BinaryTreeNode insert(T o){ - if(root==null){ - BinaryTreeNode newB=new BinaryTreeNode(); - newB.setData(o); - newB.setLeft(null); - newB.setRight(null); - root=newB; - return root; - } - - return root.insert(o); - } - public BinaryTreeNode getRoot() { - return root; - } - - public void setRoot(BinaryTreeNode root) { - this.root = root; - } - - -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTreeNode.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTreeNode.java" deleted file mode 100644 index f702d48922..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/BinaryTreeNode.java" +++ /dev/null @@ -1,69 +0,0 @@ -package com.maple.basic; - -import org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName; - -public class BinaryTreeNode>{ - - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - /** - * 如果待插入的值等于节点的值,则抛出异常:duplicate value - * 如果小于节点的值,则往左边遍历 - * 如果大于节点的值,则往右边遍历 - * @param o - * @return - * 2017年2月23日 下午4:22:50 - * @Author Joy - */ - public BinaryTreeNode insert(T o){ - //assume that no duplicate key - - if(o.compareTo(data)==0){ - try { - throw new DuplicateName("duplicate value: "+o); - } catch (DuplicateName e) { - e.printStackTrace(); - } - } - BinaryTreeNode newB=new BinaryTreeNode(); - newB.setData(o); - newB.setLeft(null); - newB.setRight(null); - //o更大,在右边 - if(o.compareTo(data)>0){ - if(this.getRight()!=null){ - this.getRight().insert(o); - }else{ - this.setRight(newB); - } - }else if(o.compareTo(data)<0){ - if(this.getLeft()!=null){ - this.getLeft().insert(o); - }else{ - this.setLeft(newB); - } - } - return newB; - } - - public T getData() { - return data; - } - public void setData(T data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Iterator.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Iterator.java" deleted file mode 100644 index ac8ecd6050..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Iterator.java" +++ /dev/null @@ -1,7 +0,0 @@ -package com.maple.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/LinkedList.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/LinkedList.java" deleted file mode 100644 index d957f74bdc..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/LinkedList.java" +++ /dev/null @@ -1,154 +0,0 @@ -package com.maple.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - private int size = 0;//自己加的,觉得需要 - /** - * 与addList()是一样的 - */ - public void add(Object o){ - addLast(o); - } - public void add(int index , Object o){ - if(index<0||index>size){ - throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); - } - Node prevNode=head; - Node curNode=head.next; - int count=0; - while(count<=index){ - if(count==index){ - Node newNode=new Node(); - newNode.data=o; - - newNode.next=curNode; - prevNode.next=newNode; - size++; - break; - } - curNode=curNode.next; - prevNode=prevNode.next; - count++; - } - - - } - public Object get(int index){ - if(index<0||index>=size) - throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); - - Node curNode=head.next; - int count=0; - while(count<=index){ - if(count==index){ - return curNode.data; - } - curNode=curNode.next; - count++; - } - return null; - } - public Object remove(int index){ - if(index<0||index>=size) - throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); - Node prevNode=head; - Node curNode=head.next; - int count=0; - while(count<=index){ - if(count==index){ - prevNode.next=curNode.next; - size--; - return curNode.data; - } - curNode=curNode.next; - prevNode=prevNode.next; - count++; - } - return null; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node objNode=new Node(); - objNode.data=o; - if(head==null) head=new Node(); - objNode.next=head.next; - size++; - head.next=objNode; - } - public void addLast(Object o){ - Node objNode=new Node(); - objNode.data=o; - if(head==null) head=new Node(); - - //也可以用iterator迭代,先不用吧 - Node curNode=head; - while(curNode.next!=null){ - curNode=curNode.next; - } - objNode.next=curNode.next; - curNode.next=objNode; - size++; - - } - public Object removeFirst(){ - if(head==null||head.next==null) - throw new NoSuchElementException(); - Node delNode=head.next; - head.next=delNode.next; - size--; - return delNode.data; - } - public Object removeLast(){ - if(head==null||head.next==null) - throw new NoSuchElementException(); - Node prevNode=head; - Node curNode=head.next; - while(curNode!=null){ - if(curNode.next==null){//说明是尾节点 - prevNode.next=curNode.next; - size--; - return curNode.data; - } - curNode=curNode.next; - prevNode=prevNode.next; - } - return null; - } - public Iterator iterator(){ - return new Iterator() { - private Node cur=head!=null?head.next:head; - @Override - public Object next() { - if(cur==null){ - throw new NoSuchElementException(); - } - Object object=cur.data; - cur=cur.next; - return object; - } - - @Override - public boolean hasNext() { - if(cur==null){ - return false; - }else{ - return true; - } - - } - }; - } - - - private static class Node{ - Object data; - Node next; - } -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/List.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/List.java" deleted file mode 100644 index 99bed9d96b..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/List.java" +++ /dev/null @@ -1,9 +0,0 @@ -package com.maple.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Queue.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Queue.java" deleted file mode 100644 index 278d3dba7f..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Queue.java" +++ /dev/null @@ -1,21 +0,0 @@ -package com.maple.basic; - -public class Queue { - private LinkedList elementData=new LinkedList(); - public void enQueue(Object o){ - elementData.addLast(o); - } - - public Object deQueue(){ - Object first=elementData.removeFirst(); - return first; - } - - public boolean isEmpty(){ - return elementData.size()<=0; - } - - public int size(){ - return elementData.size(); - } -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Stack.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Stack.java" deleted file mode 100644 index cec4599237..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/basic/Stack.java" +++ /dev/null @@ -1,26 +0,0 @@ -package com.maple.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - Object object=elementData.get(elementData.size()-1); - elementData.remove(elementData.size()-1); - return object; - } - - public Object peek(){ - Object object=elementData.get(elementData.size()-1); - return object; - } - public boolean isEmpty(){ - return elementData.size()<=0; - } - public int size(){ - return elementData.size(); - } -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAPIDemo.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAPIDemo.java" deleted file mode 100644 index ee592fbb7b..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAPIDemo.java" +++ /dev/null @@ -1,53 +0,0 @@ -package com.maple.test; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.Queue; -import java.util.Stack; - - -/** - * 测试Java中的API - * @author group 14, QQ:1091149131 - */ -public class TestAPIDemo { - public static void main(String[] args) { - - //Stack - /*Stack stack=new Stack(); - stack.push(0); - stack.push(1); - stack.push(2); - System.out.println(stack.peek()); - System.out.println(stack.pop()); - System.out.println(stack.peek());*/ - - //LinkedList - /*LinkedList list2=new LinkedList<>(); - list2.add(0); - list2.add(1); - list2.add(2); - - list2.addLast(3); - list2.remove(0); - //list2.removeFirst(); - Iterator ite2=list2.iterator(); - ite2.next(); - while(ite2.hasNext()){ - System.out.println(ite2.next()); - }*/ - - - //ArrayList - /*ArrayList list1=new ArrayList(); - list1.add(0); - list1.add(1); - //list1.add(3, -1);//error - //list1.remove(2);//error - Iterator ite=list1.iterator(); - while(ite.hasNext()){ - System.out.println(ite.next()); - }*/ - } -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAll.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAll.java" deleted file mode 100644 index 9fd59e512e..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestAll.java" +++ /dev/null @@ -1,71 +0,0 @@ -package com.maple.test; - -import org.junit.Test; - -import com.maple.basic.ArrayList; -import com.maple.basic.BinaryTree; -import com.maple.basic.Iterator; -import com.maple.basic.LinkedList; -import com.maple.basic.Queue; -import com.maple.basic.Stack; - -public class TestAll { - @Test - public void testArrayList(){ - ArrayList list1=new ArrayList(); - list1.add(0); - list1.add(1); - //list1.add(3, -1);//error - //list1.remove(2);//error - Iterator ite=list1.iterator(); - while(ite.hasNext()){ - System.out.println(ite.next()); - } - } - @Test - public void testLinkedList(){ - LinkedList list2=new LinkedList(); - list2.add(0); - list2.add(1); - list2.addFirst(-1); - list2.addLast(-2); - - list2.removeFirst(); - list2.removeLast(); - list2.remove(0); - - Iterator ite2=list2.iterator(); - while(ite2.hasNext()){ - System.out.println(ite2.next()); - } - } - @Test - public void testStack(){ - Stack stack=new Stack(); - stack.push(0); - stack.push(1); - stack.push(2); - System.out.println(stack.peek()); - System.out.println(stack.pop()); - System.out.println(stack.peek()); - } - @Test - public void testQueue(){ - Queue queue=new Queue(); - queue.enQueue(0); - queue.enQueue(1); - - System.out.println(queue.deQueue()); - } - @Test - public void testBinaryTree(){ - BinaryTree tree=new BinaryTree<>(); - tree.insert(3); - tree.insert(2); - tree.insert(5); - //tree.insert(5);//error,duplicate - tree.insert(1); - tree.traversal(tree.getRoot()); - } - -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestArrayList.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestArrayList.java" deleted file mode 100644 index 94ecec52f7..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestArrayList.java" +++ /dev/null @@ -1,22 +0,0 @@ -package com.maple.test; - -import org.junit.Test; - -import com.maple.basic.ArrayList; -import com.maple.basic.Iterator; - -public class TestArrayList{ - - @Test - public void testAdd(){ - ArrayList list1=new ArrayList(); - list1.add(0); - list1.add(1); - //list1.add(3, -1);//error - //list1.remove(2);//error - Iterator ite=list1.iterator(); - while(ite.hasNext()){ - System.out.println(ite.next()); - } - } -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestMyDemo.java" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestMyDemo.java" deleted file mode 100644 index 639aaa629b..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/basicstructuredemo/src/com/maple/test/TestMyDemo.java" +++ /dev/null @@ -1,75 +0,0 @@ -package com.maple.test; - -import com.maple.basic.ArrayList; -import com.maple.basic.BinaryTree; -import com.maple.basic.BinaryTreeNode; -import com.maple.basic.Iterator; -import com.maple.basic.LinkedList; -import com.maple.basic.Queue; -import com.maple.basic.Stack; - -/** - * 测试自己写的数据结构 - * @author group 14, QQ:1091149131 - */ -public class TestMyDemo { - public static void main(String[] args) { - //BinaryTree - BinaryTree tree=new BinaryTree<>(); - tree.insert(3); - tree.insert(2); - tree.insert(5); - //tree.insert(5);//error,duplicate - tree.insert(1); - tree.traversal(tree.getRoot()); - - - //Queue - /*Queue queue=new Queue(); - queue.enQueue(0); - queue.enQueue(1); - - System.out.println(queue.deQueue());*/ - - //Stack - /*Stack stack=new Stack(); - stack.push(0); - stack.push(1); - stack.push(2); - System.out.println(stack.peek()); - System.out.println(stack.pop()); - System.out.println(stack.peek());*/ - - //LinkedList - /*LinkedList list2=new LinkedList(); - list2.add(0); - list2.add(1); - list2.addFirst(-1); - list2.addLast(-2); - - list2.removeFirst(); - list2.removeLast(); - list2.remove(0); - - Iterator ite2=list2.iterator(); - while(ite2.hasNext()){ - System.out.println(ite2.next()); - }*/ - - - //ArrayList - /*ArrayList list1=new ArrayList(); - list1.add(0); - list1.add(1); - //list1.add(3, -1);//error - //list1.remove(2);//error - Iterator ite=list1.iterator(); - while(ite.hasNext()){ - System.out.println(ite.next()); - }*/ - - - - - } -} diff --git "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/\346\226\207\347\253\240\351\223\276\346\216\245_20170224.txt" "b/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/\346\226\207\347\253\240\351\223\276\346\216\245_20170224.txt" deleted file mode 100644 index 1ecad55f85..0000000000 --- "a/group14/1091149131/20170226_\344\275\234\344\270\2321_\346\225\260\346\215\256\347\273\223\346\236\204\345\217\212\346\226\207\347\253\240/\346\226\207\347\253\240\351\223\276\346\216\245_20170224.txt" +++ /dev/null @@ -1,5 +0,0 @@ -CPUڴ棬 Ӳָ̣֮Ĺϵ - -ӣhttp://www.cnblogs.com/qingmaple/p/6437070.html - -QQ1091149131 -Ҷ \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.classpath b/group14/187114392/work_1_20170225/.classpath deleted file mode 100644 index fceb4801b5..0000000000 --- a/group14/187114392/work_1_20170225/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group14/187114392/work_1_20170225/.gitignore b/group14/187114392/work_1_20170225/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group14/187114392/work_1_20170225/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group14/187114392/work_1_20170225/.idea/.name b/group14/187114392/work_1_20170225/.idea/.name deleted file mode 100644 index 9769cfad31..0000000000 --- a/group14/187114392/work_1_20170225/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -2017Learning \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.idea/compiler.xml b/group14/187114392/work_1_20170225/.idea/compiler.xml deleted file mode 100644 index 96cc43efa6..0000000000 --- a/group14/187114392/work_1_20170225/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.idea/copyright/profiles_settings.xml b/group14/187114392/work_1_20170225/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3377..0000000000 --- a/group14/187114392/work_1_20170225/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.idea/encodings.xml b/group14/187114392/work_1_20170225/.idea/encodings.xml deleted file mode 100644 index 97626ba454..0000000000 --- a/group14/187114392/work_1_20170225/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.idea/junitgenerator-prj-settings.xml b/group14/187114392/work_1_20170225/.idea/junitgenerator-prj-settings.xml deleted file mode 100644 index b6bb9db746..0000000000 --- a/group14/187114392/work_1_20170225/.idea/junitgenerator-prj-settings.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.idea/misc.xml b/group14/187114392/work_1_20170225/.idea/misc.xml deleted file mode 100644 index 6a48f33378..0000000000 --- a/group14/187114392/work_1_20170225/.idea/misc.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.idea/modules.xml b/group14/187114392/work_1_20170225/.idea/modules.xml deleted file mode 100644 index f37bb20093..0000000000 --- a/group14/187114392/work_1_20170225/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.idea/uiDesigner.xml b/group14/187114392/work_1_20170225/.idea/uiDesigner.xml deleted file mode 100644 index e96534fb27..0000000000 --- a/group14/187114392/work_1_20170225/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.idea/work_1_20170225.iml b/group14/187114392/work_1_20170225/.idea/work_1_20170225.iml deleted file mode 100644 index d6ebd48059..0000000000 --- a/group14/187114392/work_1_20170225/.idea/work_1_20170225.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.idea/workspace.xml b/group14/187114392/work_1_20170225/.idea/workspace.xml deleted file mode 100644 index 8c5615cc95..0000000000 --- a/group14/187114392/work_1_20170225/.idea/workspace.xml +++ /dev/null @@ -1,1295 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1488028819234 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/.project b/group14/187114392/work_1_20170225/.project deleted file mode 100644 index fab8d7f04c..0000000000 --- a/group14/187114392/work_1_20170225/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group14/187114392/work_1_20170225/.settings/org.eclipse.jdt.core.prefs b/group14/187114392/work_1_20170225/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group14/187114392/work_1_20170225/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group14/187114392/work_1_20170225/2017Learning.iml b/group14/187114392/work_1_20170225/2017Learning.iml deleted file mode 100644 index c4678227ee..0000000000 --- a/group14/187114392/work_1_20170225/2017Learning.iml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/ReadMe.md b/group14/187114392/work_1_20170225/ReadMe.md deleted file mode 100644 index 79077789f6..0000000000 --- a/group14/187114392/work_1_20170225/ReadMe.md +++ /dev/null @@ -1,3 +0,0 @@ -这个项目用idea直接打开。 -运行里面的test 目录就可以直接单元测试。 -谢谢 diff --git a/group14/187114392/work_1_20170225/src/Main.java b/group14/187114392/work_1_20170225/src/Main.java deleted file mode 100644 index 3e44cc8e16..0000000000 --- a/group14/187114392/work_1_20170225/src/Main.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Created by bshu on 2017/2/25. - */ -import com.coding.basic.ArrayList; -import com.coding.basic.Iterator; - -import java.util.*; - -/** - * Created by bshu on 2017/2/21. - */ -public class Main { - public static void main(String[] args) { - int size = 0; - System.out.println("1 size " + (size++)); - System.out.println("2 size " + (size)); - LinkedList lnk = new LinkedList(); - java.util.ArrayList list = new java.util.ArrayList(){{add("str0");}}; - lnk.add("kk1"); - lnk.add("kk2"); - lnk.add("kk3"); - lnk.remove(2); - lnk.iterator(); - int count = 0; - for (java.util.Iterator iter = lnk.iterator(); iter.hasNext();) { - System.out.printf("%s is :%s \n",count, iter.next()); - ++count; - } - } -} - diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/ArrayList.java b/group14/187114392/work_1_20170225/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 78f24c6dae..0000000000 --- a/group14/187114392/work_1_20170225/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.basic; -import java.util.Arrays; -import java.lang.IndexOutOfBoundsException; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void ensure_length(int expect_length) { - if (expect_length > elementData.length) { - elementData = Arrays.copyOf(elementData,elementData.length * 2); - } - } - - public void add(Object o){ - ensure_length(size + 1); - elementData[size] = o; - size += 1; - } - - public void add(int index, Object o){ - ensure_length(size + 1); - System.arraycopy(elementData,index, - elementData,index + 1, - size - index + 1); - elementData[index] = o; - size += 1; - } - - public Object get(int index) { - if (index > size) { - throw new IndexOutOfBoundsException("index out of bounds"); - } else { - return elementData[index]; - } - } - - public Object remove(int index){ - Object oldvalue = elementData[index]; - System.arraycopy(elementData,index + 1,elementData,index,size - index - 1); - elementData[--size] = null; - return oldvalue; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new Iterator_ip(); - } - - private class Iterator_ip implements Iterator { - private int index = 0; - - @Override - public boolean hasNext() { - return (index + 1) <= size; - } - - @Override - public Object next() { - if (index > size) { -// throw new IndexOutOfBoundsException("iterator next out of bounds"); - return null; - } - return elementData[index++]; - } - } - -} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/BinaryTreeNode.java b/group14/187114392/work_1_20170225/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group14/187114392/work_1_20170225/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/Iterator.java b/group14/187114392/work_1_20170225/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group14/187114392/work_1_20170225/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/LinkedList.java b/group14/187114392/work_1_20170225/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 89b4523e0a..0000000000 --- a/group14/187114392/work_1_20170225/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,168 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private Node tail; - private Node last_but_one; - private int size = 0; - - public LinkedList() { - tail = new Node(); - tail.data = null; - tail.next = null; - - head = new Node(); - head.next = null; - } - - private void add_elementbyindex(int index , Object o) { - Node new_node = new Node(); - if (index == 0) { - if (size > 0) { - new_node.data = head.data; - } else { -// System.out.println("first new node is null"); - new_node.data = null; - head.next = null; - } - head.data = o; - } else { - new_node.data = o; - } - - int count = 0; - Node k = head; - while (count < index - 1) { -// System.out.printf("add count:%s, k is:%s \n",count,k.data); - k = k.next; - ++count; - } - new_node.next = k.next; - k.next = new_node; - ++size; - } - - private Object remove_elementbyindex(int index) { - int count = 0; - Object remove_ob = null; - Node k = head; - while (count < index - 1) { -// System.out.printf("remove count:%s, k is:%s \n",count,k.data); - k = k.next; - ++count; - } - - if (index == 0) { - remove_ob = head.data; - head.data = head.next.data; - if (size == 1) { - head.data = null; - } - head.next = head.next.next; - } else if ((index - 1) == size) { -// System.out.printf("index:%s == size, count:%s, k is:%s \n",index,count,k.data); - remove_ob = k.data; - k.next = null; - } else { - if (size == 1) { - k.data = null; - } - remove_ob = k.next.data; - k.next = k.next.next; - } - --size; - return remove_ob; - } - - public void add(Object o){ - add_elementbyindex(size(),o); - } - - public void add(int index , Object o){ - // if index larger than size , then we set index equal to size; - if (index > size) { - throw new IndexOutOfBoundsException("index out of bounds"); - } - add_elementbyindex(index,o); - - } - public Object get(int index){ - if (index > size) { - throw new IndexOutOfBoundsException("get index out of bounds"); - } - Node k = head; - int count = 0; - while (count < index) { -// System.out.printf("get count:%s, k is:%s \n",count,k.data); - k = k.next; - ++count; - } -// System.out.printf("get count:%s, k is:%s \n",count,k.data); - return k.data; - } - public Object remove(int index){ - if (index < 0 || index > size || size == 0) { - return null; - } - return remove_elementbyindex(index); - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - add_elementbyindex(0,o); - } - public void addLast(Object o){ - add_elementbyindex(size,o); - } - public Object removeFirst(){ - if (size == 0) { - return null; - } - return remove_elementbyindex(0); - } - public Object removeLast(){ - if (size == 0) { - return null; - } - return remove_elementbyindex(size); - } - public Iterator iterator(){ - Iterator_ip iter = new Iterator_ip(head); - return iter; - } - - private static class Node{ - Object data; - Node next; - } - - private class Iterator_ip implements Iterator { - private int index = 0; - private Node node_iter; - - public Iterator_ip(Node node_iter) { - this.node_iter = node_iter; - } - - @Override - public boolean hasNext() { - return node_iter.next != null; - } - - @Override - public Object next() { - if (index > size) { -// throw new IndexOutOfBoundsException("iterator next out of bounds"); - return null; - } - Object now_data = node_iter.data; - node_iter = node_iter.next; - ++index; - return now_data; - } - } -} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/List.java b/group14/187114392/work_1_20170225/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group14/187114392/work_1_20170225/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/Queue.java b/group14/187114392/work_1_20170225/src/com/coding/basic/Queue.java deleted file mode 100644 index ada4130038..0000000000 --- a/group14/187114392/work_1_20170225/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList lnk = new LinkedList(); - - public void enQueue(Object o){ - lnk.addLast(o); - } - - public Object deQueue(){ - return lnk.removeFirst(); - } - - public boolean isEmpty(){ - return lnk.size() == 0; - } - - public int size(){ - return lnk.size(); - } -} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/Stack.java b/group14/187114392/work_1_20170225/src/com/coding/basic/Stack.java deleted file mode 100644 index d553579b79..0000000000 --- a/group14/187114392/work_1_20170225/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coding.basic; -import java.lang.ArrayIndexOutOfBoundsException; -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); -// System.out.println("size is " + elementData.size()); - } - - public Object pop() { - int elementData_size = elementData.size(); - if (elementData_size == 0) { - throw new EmptyStackException(); - } - Object top_data = elementData.get(elementData_size - 1); - elementData.remove(elementData_size - 1); - return top_data; - } - - public Object peek() { - if (elementData.size() == 0) { - throw new EmptyStackException(); - } - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} diff --git a/group14/187114392/work_1_20170225/test/ArrayList_Test.java b/group14/187114392/work_1_20170225/test/ArrayList_Test.java deleted file mode 100644 index fbfbdf1b3a..0000000000 --- a/group14/187114392/work_1_20170225/test/ArrayList_Test.java +++ /dev/null @@ -1,52 +0,0 @@ -import com.coding.basic.ArrayList; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -/** - * Created by bshu on 2017/2/25. - */ -public class ArrayList_Test { - @Test - public void add_test() { - ArrayList arr = new ArrayList(); - arr.add("one"); - assertEquals(arr.get(0),"one"); - arr.add("two"); - assertEquals(arr.get(1),"two"); - } - - @Test - public void add_index_test() { - ArrayList arr = new ArrayList(); - arr.add(0,"one"); - assertEquals(arr.get(0),"one"); - arr.add(1,"two"); - arr.add(2,"three"); - arr.add(3,"four"); - arr.add(4,"five"); - assertEquals(arr.get(4),"five"); - arr.add(2,"duplicte two"); - assertEquals(arr.get(2),"duplicte two"); - } - - @Test - public void remove_test() { - ArrayList arr = new ArrayList(); - arr.add(0,"one"); - arr.add(1,"two"); - arr.add(2,"three"); - arr.remove(1); - assertEquals(arr.get(1),"three"); - } - - @Test - public void get_test() { - ArrayList arr = new ArrayList(); - arr.add(0,"one"); - arr.add(1,"two"); - arr.add(2,"three"); - assertEquals(arr.get(1),"two"); - assertEquals(arr.get(3),null); - } -} \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/test/LinkedList_Test.java b/group14/187114392/work_1_20170225/test/LinkedList_Test.java deleted file mode 100644 index 986366cb6a..0000000000 --- a/group14/187114392/work_1_20170225/test/LinkedList_Test.java +++ /dev/null @@ -1,122 +0,0 @@ -import org.junit.Test; -import com.coding.basic.*; -import java.lang.Object; - -import static org.junit.Assert.assertEquals; - -/** - * LinkedList_Test Tester. - * - * @author - * @since
bshu 26, 2017
- * @version 1.0 - */ -public class LinkedList_Test { - @Test - public void get() { - LinkedList link = new LinkedList(); - link.add("kkk"); - assertEquals(link.get(0),"kkk"); - link.add("kkk1"); - assertEquals(link.get(1),"kkk1"); - } - - @Test - public void add() { - LinkedList link = new LinkedList(); - link.add("kkk"); - link.add("aaa"); - link.add("bbb"); - link.add("ccc"); - link.add("ddd"); - link.add("eee"); - Object[] ob = new Object[]{"kkk","aaa","bbb","ccc","ddd","eee"}; - int count = 0; - for (Iterator iter = link.iterator(); iter.hasNext();) { - Object data = iter.next(); -// System.out.printf("%s is :%s \n",count, data); - assertEquals(data,ob[count]); - ++count; - } - } - - @Test - public void add_index() { - LinkedList link = new LinkedList(); - link.add("kkk"); -// System.out.println("0 is " + link.get(0)); - link.add("kkk2"); - link.add(0,"0kkk"); - link.add(3,"3kkk"); - assertEquals(link.get(0),"0kkk"); - assertEquals(link.get(2),"kkk2"); - } - - @Test - public void add_first() { - LinkedList link = new LinkedList(); - link.add("kkk"); - link.addFirst("F_kkk"); - assertEquals(link.get(0),"F_kkk"); - assertEquals(link.get(1),"kkk"); - } - - @Test - public void add_last() { - LinkedList link = new LinkedList(); - link.add("kkk"); - link.addLast("L_kkk"); - assertEquals(link.get(0),"kkk"); - assertEquals(link.get(link.size() - 1),"L_kkk"); - } - - @Test - public void remove() { - LinkedList link = new LinkedList(); - link.add("kkk"); -// System.out.println("0 is " + link.get(0)); - link.add("kkk1"); - link.add("kkk2"); - link.remove(2); - link.add(link.size(),"2kkk"); - link.add("kkk3"); - link.add("kkk4"); - link.add("kkk5"); - link.remove(link.size()); - link.add("kkk6"); - int count = 0; - Object[] ob = new Object[]{"kkk","kkk1","2kkk","kkk3","kkk4","kkk6"}; - for (Iterator iter = link.iterator(); iter.hasNext();) { - Object data = iter.next(); - System.out.printf("%s is :%s \n",count, data); - assertEquals(data,ob[count]); - ++count; - } - } - - @Test - public void remove_first() { - LinkedList link = new LinkedList(); - link.add("kkk"); - link.add("kkk1"); - link.add("kkk2"); - link.removeFirst(); - assertEquals("kkk1",link.get(0)); - assertEquals("kkk2",link.get(1)); - assertEquals(2,link.size()); - } - - @Test - public void remove_last() { - LinkedList link = new LinkedList(); - link.add("kkk"); - link.add("kkk1"); - link.removeLast(); - assertEquals("kkk",link.get(0)); - link.removeLast(); - link.removeLast(); - link.remove(0); - link.remove(0); - assertEquals(null,link.get(0)); - } -} diff --git a/group14/187114392/work_1_20170225/test/Queue_Test.java b/group14/187114392/work_1_20170225/test/Queue_Test.java deleted file mode 100644 index 319baf6706..0000000000 --- a/group14/187114392/work_1_20170225/test/Queue_Test.java +++ /dev/null @@ -1,44 +0,0 @@ - -import com.coding.basic.LinkedList; -import com.coding.basic.Queue; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import static org.junit.Assert.assertEquals; - -/** - * Queue_Test Tester. - * - * @author - * @since
bshu 26, 2017
- * @version 1.0 - */ -public class Queue_Test { - - @Test - public void enQueue() { - Queue que = new Queue(); - que.enQueue("kkk"); - que.enQueue("kkk1"); - assertEquals(2,que.size()); - } - - @Test - public void deQueue() { - Queue que = new Queue(); - que.enQueue("kkk"); - que.enQueue("kkk1"); - Object data = que.deQueue(); - assertEquals("kkk",data); - } - - @Test - public void isempty() { - Queue que = new Queue(); - assertEquals(true,que.isEmpty()); - que.enQueue("kk2"); - assertEquals(false,que.isEmpty()); - } - -} diff --git a/group14/187114392/work_1_20170225/test/Stack_Test.java b/group14/187114392/work_1_20170225/test/Stack_Test.java deleted file mode 100644 index 8a11a20632..0000000000 --- a/group14/187114392/work_1_20170225/test/Stack_Test.java +++ /dev/null @@ -1,72 +0,0 @@ - -import org.junit.Test; -import com.coding.basic.*; - -import java.util.EmptyStackException; - -import static org.junit.Assert.assertEquals; - -/** - * Stack_Test Tester. - * - * @author - * @since
bshu 26, 2017
- * @version 1.0 - */ -public class Stack_Test { - @Test - public void pop() { - Stack stk = new Stack(); - stk.push("one"); - stk.push("two"); - assertEquals(stk.pop(),"two"); - } - - @Test - public void pop_empty() { - Stack stk = new Stack(); - try { - stk.pop(); - } - catch (EmptyStackException e) { - assertEquals(e.toString(),"java.util.EmptyStackException"); - } - } - - @Test - public void push() { - Stack stk = new Stack(); - stk.push("one"); - stk.push("two"); - assertEquals(stk.peek(),"two"); - } - - @Test - public void peek() { - Stack stk = new Stack(); - stk.push("one"); - stk.push("two"); - stk.push("three"); - assertEquals(stk.peek(),"three"); - } - - @Test - public void peek_empty() { - Stack stk = new Stack(); - try { - stk.peek(); - } - catch (EmptyStackException e) { - assertEquals(e.toString(),"java.util.EmptyStackException"); - } - } - - @Test - public void isempty() { - Stack stk = new Stack(); - stk.push("one"); - assertEquals(stk.isEmpty(),false); - stk.pop(); - assertEquals(stk.isEmpty(),true); - } -} diff --git "a/group14/190530132/20170219\344\275\234\344\270\232/ArrayList.java" "b/group14/190530132/20170219\344\275\234\344\270\232/ArrayList.java" deleted file mode 100644 index 079540bc4e..0000000000 --- "a/group14/190530132/20170219\344\275\234\344\270\232/ArrayList.java" +++ /dev/null @@ -1,67 +0,0 @@ -package com.coding.basic; - -public class ArrayList { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - - //在ArrayList的尾部添加 - public void add(Object o){ - - size = elementData.length + 1; - Object[] tempData = new Object[size]; - System.arraycopy(elementData, 0, tempData,0, elementData.length); - elementData = tempData; - - elementData[size-1] = o; - - } - - //在ArrayList中的某一个元素后面添加, 这里的关键在于先移动末尾的元素 - public void add(int index, Object o){ - - size = elementData.length + 1; - Object[] tempData = new Object[size]; - System.arraycopy(elementData, 0, tempData,0, elementData.length); - elementData = tempData; - - for (int i=elementData.length-2; i>index; i--) { - elementData[i+1] = elementData[i]; - } - - elementData[index+1] = o; - - } - - //按下标来访问ArrayList中的元素 - public Object get(int index){ - return elementData[index]; - } - - //按下标来删除ArrayList中的元素 - public Object remove(int index){ - Object r = elementData[index]; - for (int i=index; i= size) { - throw new IndexOutOfBoundsException("Index:" + index + ",size:" + size); - } - - Node n = new Node(); - n.data = o; - Node m = get(index); - n.next = m.next; - m.next = n; - size = size + 1; - } - - public Node get(int index){ - //index越界检查 - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException("Index:" + index + ",size:" + size); - } - - Node n = head.next; - int count = 0; - while(count<=index){ - if(count==index){ - return n; - } - n = n.next; - count++; - } - - return null; - } - - public void remove(int index){ - if(index<0||index>=size) - throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); - - Node d = get(index); - Node pred = get(index-1); - pred.next = d.next; - size = size - 1; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node n = new Node(); - n.data = o; - - //避免空链表 - if (head==null) head=new Node(); - - n.next = head.next; - head.next = n; - size = size + 1; - } - - public void addLast(Object o){ - Node n = new Node(); - n.data = o; - - //避免空链表 - if (head==null) head = new Node(); - - //从头部往后顺序查找,找到尾部就添加 - Node m = head; - while (m.next != null){ - m = m.next; - } - n.next = m.next; - m.next = n; - size = size + 1; - } - - public Object removeFirst(){ - if(head==null||head.next==null) - throw new NoSuchElementException(); - Node d = head.next; - head.next = d.next; - size = size - 1; - return d.data; - } - - public Object removeLast(){ - if(head==null||head.next==null) - throw new NoSuchElementException(); - - Node m = head; - Node n = head.next; - while(n.next != null){ - m = n; - n = n.next; - } - size = size - 1; - return m.data; - } - - //public Iterator iterator(){ - // return null; - //} - - private static class Node{ - Node next; - Object data; - } - -} diff --git "a/group14/190530132/20170219\344\275\234\344\270\232/Queue.java" "b/group14/190530132/20170219\344\275\234\344\270\232/Queue.java" deleted file mode 100644 index 365b65aecb..0000000000 --- "a/group14/190530132/20170219\344\275\234\344\270\232/Queue.java" +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.basic; - -public class Queue { - - LinkedList l = new LinkedList(); - public void enQueue(Object o){ - l.addLast(o); - } - - public Object deQueue(){ - return l.removeFirst(); - } - - public boolean isEmpty(){ - if (l.size() == 0) - return true; - else - return false; - } - - public int size(){ - return l.size(); - } - -} diff --git "a/group14/190530132/20170219\344\275\234\344\270\232/Stack.java" "b/group14/190530132/20170219\344\275\234\344\270\232/Stack.java" deleted file mode 100644 index f73de31abc..0000000000 --- "a/group14/190530132/20170219\344\275\234\344\270\232/Stack.java" +++ /dev/null @@ -1,33 +0,0 @@ -package com.coding.basic; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - int index = elementData.size() - 1; - Object o = elementData.remove(index); - return o; - } - - public Object peek(){ - int e = elementData.size() - 1; - return elementData.get(e); - } - - public boolean isEmpty(){ - if (elementData.size() == 0 ) - return true; - else - return false; - } - - public int size(){ - return elementData.size(); - } - -} diff --git "a/group14/190530132/20170219\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" "b/group14/190530132/20170219\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" deleted file mode 100644 index 2c79e20a62..0000000000 --- "a/group14/190530132/20170219\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" +++ /dev/null @@ -1 +0,0 @@ -http://rexwcl.blog.163.com/blog/static/270599039201712651450997/ \ No newline at end of file diff --git a/group14/254659936/.gitignore b/group14/254659936/.gitignore deleted file mode 100644 index 5561991601..0000000000 --- a/group14/254659936/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -*.iml -.gradle -.idea -/local.properties -/.idea/workspace.xml -/.idea/libraries -.DS_Store -/build -/captures -.externalNativeBuild \ No newline at end of file diff --git a/group14/254659936/src/Main.java b/group14/254659936/src/Main.java deleted file mode 100644 index 4d4fbb71ef..0000000000 --- a/group14/254659936/src/Main.java +++ /dev/null @@ -1,7 +0,0 @@ - -public class Main { - - public static void main(String[] args) { - System.out.println("Hello World!"); - } -} diff --git a/group14/254659936/src/com/coding/basic/ArrayList.java b/group14/254659936/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 7fb9c076b6..0000000000 --- a/group14/254659936/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.basic; - -import java.util.Objects; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[5]; - - public void add(Object o) { - if (size == elementData.length) { - Object[] newArr = new Object[elementData.length * 2]; - System.arraycopy(newArr, 0, elementData, 0, elementData.length); - elementData = newArr; - } - elementData[size] = o; - size++; - } - - public void add(int index, Object o) { - if (index >= size) { - throw new RuntimeException("the ArrayList size is short than index"); - } - elementData[index] = o; - } - - public Object get(int index) { - if (index >= size) { - throw new RuntimeException("the ArrayList size is short than index"); - } - return elementData[index]; - } - - public Object remove(int index) { - if (index >= size) { - throw new RuntimeException("the ArrayList size is short than index"); - } - Object resultObj = elementData[index]; - size--; - for (int i = index; i < size; i++) { - elementData[index] = elementData[index + 1]; - } - return resultObj; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return null; - } - - private class ArrayIterator implements Iterator { - - private int iteratorIndex = 0; - - @Override - public boolean hasNext() { - return iteratorIndex < size; - } - - @Override - public Object next() { - if (iteratorIndex >= size) { - throw new RuntimeException("the index is out of the list"); - } - return elementData[iteratorIndex++]; - } - } - -} diff --git a/group14/254659936/src/com/coding/basic/BinaryTreeNode.java b/group14/254659936/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 8b89c37114..0000000000 --- a/group14/254659936/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public T getData() { - return data; - } - - public void setData(T data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(T o) { - BinaryTreeNode node = new BinaryTreeNode(); - node.setData(o); - insert(this, node); - return node; - } - - private void insert(BinaryTreeNode parent, BinaryTreeNode child) { - BinaryTreeNode node; - if (child.getData().isLargeThanTarget(parent.getData())) { - // 子节点比父节点大,需要向右插入 - node = getRight(); - if (null == node) { - // 右节点为空则可以直接插入 - parent.setRight(node); - } else { - // 递归检查右边子树的插入位置 - insert(node, child); - } - } else { - // 子节点比父节点小,或者等于父节点,需要向左插入 - node = getLeft(); - if (null == node) { - // 左节点为空,则直接插入 - parent.setLeft(node); - } else { - // 递归检查左子树的插入位置 - insert(node, child); - } - } - } - - public interface Compare { - boolean isLargeThanTarget(Compare target); - } - -} diff --git a/group14/254659936/src/com/coding/basic/Iterator.java b/group14/254659936/src/com/coding/basic/Iterator.java deleted file mode 100644 index 160f044ad1..0000000000 --- a/group14/254659936/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - - public Object next(); - -} \ No newline at end of file diff --git a/group14/254659936/src/com/coding/basic/LinkedList.java b/group14/254659936/src/com/coding/basic/LinkedList.java deleted file mode 100644 index e0ad67a6d8..0000000000 --- a/group14/254659936/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private int size = 0; - - public void add(Object o) { - addLast(o); - } - - public void add(int index, Object o) { - if (index >= size) { - throw new RuntimeException("the LinkedList size is short than index"); - } - Node node = new Node(); - node.data = 0; - if (index == 0) { - node.next = head; - head = node; - } - Node next = head; - int i = 0; - while (null != next) { - i++; - if (index == i) { - node.next = next.next; - next.next = node; - break; - } - next.next = next.next; - } - size++; - } - - public Object get(int index) { - if (index >= size) { - throw new RuntimeException("the LinkedList size is short than index"); - } - Node next = head; - int i = 0; - while (null != next) { - if (i == index) { - return next; - } - next = next.next; - i++; - } - return null; - } - - public Object remove(int index) { - if (index >= size) { - throw new RuntimeException("the LinkedList size is short than index"); - } - size--; - Node resultNode = null; - if (index == 0) { - resultNode = head; - head = head.next; - return resultNode.data; - } - - Node next = head; - int i = 0; - while (null != next) { - if (i == index) { - resultNode = next.next; - next.next = resultNode.next; - } - } - return resultNode.data; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - size++; - Node node = new Node(); - node.data = 0; - node.next = head; - head = node; - } - - public void addLast(Object o) { - size++; - Node node = new Node(); - node.data = o; - if (null == head) { - head = node; - return; - } - Node next = head; - while (null != next.next) { - next = next.next; - } - next.next = node; - } - - public Object removeFirst() { - if (size == 0) { - throw new RuntimeException("the LinkedList is null"); - } - size--; - Object obj = head.data; - head = head.next; - return obj; - } - - public Object removeLast() { - if (size == 0) { - throw new RuntimeException("the LinkedList is null"); - } - Node next = head; - Object obj = null; - for (int i = 0; i < size - 1; i++) { - next = next.next; - } - next.next = null; - size--; - return obj; - } - - public Iterator iterator() { - return null; - } - - - private static class Node { - Object data; - Node next; - } - - private class LinkedListIterator implements Iterator { - - private Node next = head; - - @Override - public boolean hasNext() { - return null != next; - } - - @Override - public Object next() { - if (null == next) { - throw new RuntimeException("the LinkedList is out of index"); - } - Object obj = next.data; - next = next.next; - return obj; - } - } -} diff --git a/group14/254659936/src/com/coding/basic/List.java b/group14/254659936/src/com/coding/basic/List.java deleted file mode 100644 index 01398944e6..0000000000 --- a/group14/254659936/src/com/coding/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group14/254659936/src/com/coding/basic/Queue.java b/group14/254659936/src/com/coding/basic/Queue.java deleted file mode 100644 index 50f99e6d1c..0000000000 --- a/group14/254659936/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private Node head; - private Node tail; - private int size; - - public void enQueue(Object o) { - Node node = new Node(); - node.data = o; - if (null == head) { - head = node; - tail = node; - } else { - tail.next = node; - tail = tail.next; - } - size++; - } - - public Object deQueue() { - if (size <= 0) { - throw new RuntimeException("the queue is empty"); - } - Object obj = head.data; - head = head.next; - size--; - return obj; - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - private static class Node { - Object data; - Node next; - Node pre; - } -} diff --git a/group14/254659936/src/com/coding/basic/Stack.java b/group14/254659936/src/com/coding/basic/Stack.java deleted file mode 100644 index 796a3e2e24..0000000000 --- a/group14/254659936/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coding.basic; - -public class Stack { - - private Node mStackNode; - private int size; - - public void push(Object o) { - Node node = new Node(); - node.data = o; - if (null == mStackNode) { - mStackNode = node; - } else { - mStackNode.next = node; - mStackNode = node; - } - size++; - } - - public Object pop() { - if (size == 0) { - throw new RuntimeException("the stack is empty"); - } - Object obj = mStackNode.data; - mStackNode = mStackNode.pre; - size--; - return obj; - } - - public Object peek() { - if (size == 0) { - throw new RuntimeException("the stack is empty"); - } - return mStackNode.data; - } - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - private static class Node { - Object data; - Node next; - Node pre; - } -} diff --git a/group14/296933284/Note/README.md b/group14/296933284/Note/README.md deleted file mode 100644 index 0b08b8f0bb..0000000000 --- a/group14/296933284/Note/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 2017编程提高(Java)学习系列笔记链接 ---- - -1. [漫谈计算机组成 -- 微型计算机的硬件组成 2017-02-26](http://tennyson.ren/2017/02/25/%E6%BC%AB%E8%B0%88%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E7%BB%84%E6%88%90%20--%20%E5%BE%AE%E5%9E%8B%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E7%A1%AC%E4%BB%B6%E7%BB%84%E6%88%90/) -2. [Java中解析XML的方法 2017-03-04](http://tennyson.ren/2017/03/04/Java%E4%B8%AD%E8%A7%A3%E6%9E%90XML%E7%9A%84%E6%96%B9%E6%B3%95/#more) \ No newline at end of file diff --git a/group14/296933284/README.md b/group14/296933284/README.md deleted file mode 100644 index 5c3f27c267..0000000000 --- a/group14/296933284/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# 2017年编程提高(Java) 作业、练习、总结 - -[coding --- 代码练习](https://github.com/Tennysons/coding2017/tree/master/group14/296933284/coding) -[Note --- 2017编程提高(Java)学习系列笔记链接](https://github.com/Tennysons/coding2017/tree/master/group14/296933284/Note) diff --git a/group14/296933284/coding/.classpath b/group14/296933284/coding/.classpath deleted file mode 100644 index 11ea08c22c..0000000000 --- a/group14/296933284/coding/.classpath +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/group14/296933284/coding/.gitignore b/group14/296933284/coding/.gitignore deleted file mode 100644 index 1ea200494a..0000000000 --- a/group14/296933284/coding/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/bin/ -.eml -.iml -.idea -/lib/ -*.eml \ No newline at end of file diff --git a/group14/296933284/coding/.project b/group14/296933284/coding/.project deleted file mode 100644 index fab8d7f04c..0000000000 --- a/group14/296933284/coding/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group14/296933284/coding/.settings/org.eclipse.core.resources.prefs b/group14/296933284/coding/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 9abffe377f..0000000000 --- a/group14/296933284/coding/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/com/coderising/litestruts/StrutsTest.java=UTF-8 diff --git a/group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs b/group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java b/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java deleted file mode 100644 index 41e731a462..0000000000 --- a/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.coderising.array; - -import com.coding.basic.ArrayList; - -import java.util.Arrays; - - -/** - * Created by Tennyson on 2017/3/1. - */ -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin) { - for (int i = 0, j = origin.length - 1; i < origin.length / 2; i++, j--) { - int temp = origin[j]; - origin[j] = origin[i]; - origin[i] = temp; - } - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * @param oldArray - * @return - */ - public int[] removeZero(int[] oldArray) { - - int i; - // 获取数组中第一个值为 0 的元素的位置 - for (i = 0; i < oldArray.length; i++) - if (oldArray[i] == 0) - break; - // 从第一个值为 0 的元素开始,用之后的非零元素覆盖之前值为 0 的元素,并记录非零元素的个数 - for (int j = i + 1; j < oldArray.length; j++) - if (oldArray[j] != 0) - oldArray[i++] = oldArray[j]; - - // 复制数组 - int[] newArray = new int[i]; - System.arraycopy(oldArray, 0, newArray, 0, i); - - return newArray; - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * @param array1 - * @param array2 - * @return - */ - public int[] merge(int[] array1, int[] array2) { - int i = 0, j = 0; - ArrayList arrayList = new ArrayList(); - - // 比较两个数组的元素值,将较小的值存入arrayList - while (i < array1.length && j < array2.length) { - - if (array1[i] == array2[j]) { - arrayList.add(array1[i]); - i++; - j++; - } else if (array1[i] < array2[j]) { - arrayList.add(array1[i++]); - } else if (array1[i] > array2[j]) { - arrayList.add(array2[j++]); - } - } - - // 剩下一个数组还未比较完, 将其剩余元素存入arrayList - while (i < array1.length) arrayList.add(array1[i++]); - while (j < array2.length) arrayList.add(array2[j++]); - - return ArrayUtil.toArray(arrayList); - } - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size) { - int[] newArray = new int[oldArray.length + size]; - - return newArray = Arrays.copyOf(oldArray, newArray.length); - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - public int[] fibonacci(int max) { - - ArrayList arrayList = new ArrayList(); - arrayList.add(1); - arrayList.add(1); - - int i, num; - for (i = 2; (num = (int) (arrayList.get(i - 1)) - + (int) (arrayList.get(i - 2))) < max; i++) - arrayList.add(num); - - return ArrayUtil.toArray(arrayList); - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max) { - - ArrayList arrayList = new ArrayList(); - - for (int i = 2; i < max; i++) { - int k = (int) Math.sqrt(i), j; - for (j = 2; j <= k; j++) - if (i % j == 0) break; - - // 若是 j >= k + 1 表示 i 没有被整除 即 i 为素数 - if (j >= k + 1) - arrayList.add(i); - } - - return ArrayUtil.toArray(arrayList); - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max) { - - ArrayList arrayList = new ArrayList(); - - for (int i = 6; i < max; i += 2) { - - if (i == 6) { - arrayList.add(i); - continue; - } - - int factorSum = 0; - - if (i % 3 == 1 && i % 9 == 1) { - - boolean flag = false; - - // 尾数为6的数 - if (i % 10 == 6 ) { - flag = true; - } - - // 尾数8则其后两位尾数必为28 - if (i % 10 == 8) { - if (i % 100 == 28) { - flag = true; - } - } - - if (flag) { - for (int j = 1; j <= (i / 2); j++) { - - if (i % j == 0) { - factorSum += j; - } - } - } - - } - - if (factorSum == i) { - arrayList.add(i); - } - - } - - return ArrayUtil.toArray(arrayList); - } - - // 将ArrayList对象转换为数组返回 - private static int[] toArray(ArrayList arrayList) { - int[] array = new int[arrayList.size()]; - - for (int i = 0; i < array.length; i++) - array[i] = (Integer) arrayList.get(i); - - return array; - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param seperator - * @return - */ - public String join(int[] array, String seperator){ - - StringBuffer stringBuffer = new StringBuffer(); - - for (int i = 0; i < array.length - 1; i++) - stringBuffer.append("" + array[i] + seperator); - - stringBuffer.append(array[array.length - 1]); - - return stringBuffer.toString(); - } - - -} diff --git a/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java b/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java deleted file mode 100644 index d56b2381c8..0000000000 --- a/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.coderising.array; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -/** - * Created by damocles on 2017/3/1. - */ -public class ArrayUtilTest { - private ArrayUtil arrayUtil; - private int[] oldArray = null; - private int[] newArray = null; - - @Before - public void setUp() throws Exception { - arrayUtil = new ArrayUtil(); - } - - @After - public void tearDown() throws Exception { - } - - - @Test - public void reverseArray() throws Exception { - oldArray = new int[]{7, 9, 30, 3}; - newArray = new int[]{3, 30, 9, 7}; - arrayUtil.reverseArray(oldArray); - - Assert.assertArrayEquals(newArray, oldArray); - - oldArray = new int[]{3, 30, 9, 7, 4}; - newArray = new int[]{4, 7, 9, 30, 3}; - arrayUtil.reverseArray(oldArray); - - Assert.assertArrayEquals(newArray, oldArray); - } - - @Test - public void removeZero() throws Exception { - oldArray = new int[]{1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; - newArray = new int[]{1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}; - - Assert.assertArrayEquals(newArray, arrayUtil.removeZero(oldArray)); - - } - - @Test - public void merge() throws Exception { - int[] a1 = {3, 5, 7, 8}; - int[] a2 = {4, 5, 6, 7}; - newArray = new int[]{3, 4, 5, 6, 7, 8}; - - Assert.assertArrayEquals(newArray, arrayUtil.merge(a1, a2)); - } - - @Test - public void grow() throws Exception { - oldArray = new int[]{2, 3, 6}; - newArray = new int[]{2, 3, 6, 0, 0, 0}; - int size = 3; - - Assert.assertArrayEquals(newArray, arrayUtil.grow(oldArray, size)); - } - - @Test - public void fibonacci() throws Exception { - newArray = new int[]{1, 1, 2, 3, 5, 8, 13}; - - Assert.assertArrayEquals(newArray, arrayUtil.fibonacci(15)); - } - - @Test - public void getPrimes() throws Exception { - newArray = new int[]{2, 3, 5, 7, 11, 13, 17, 19}; - - Assert.assertArrayEquals(newArray, arrayUtil.getPrimes(23)); - } - - @Test - public void getPerfectNumbers() throws Exception { - newArray = new int[]{6, 28, 496, 8128}; - - Assert.assertArrayEquals(newArray, arrayUtil.getPerfectNumbers(10000)); - } - - @Test - public void join() throws Exception { - oldArray = new int[]{3, 8, 9, 10, 2}; - String seperator = "-"; - String exception = "3-8-9-10-2"; - - Assert.assertEquals(exception, arrayUtil.join(oldArray, seperator)); - } - -} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java b/group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java deleted file mode 100644 index b76d6548b0..0000000000 --- a/group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.coderising.litestruts; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin - * - */ -public class LoginAction{ - private String name ; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute() { - - if("test".equals(name) && "1234".equals(password)) { - this.message = "login successful"; - return "success"; - } - - this.message = "login failed,please check your user/pwd"; - - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - - public void setPassword(String password){ - this.password = password; - } - - public String getMessage() { - return this.message; - } -} diff --git a/group14/296933284/coding/src/com/coderising/litestruts/Struts.java b/group14/296933284/coding/src/com/coderising/litestruts/Struts.java deleted file mode 100644 index 0c83cf4507..0000000000 --- a/group14/296933284/coding/src/com/coderising/litestruts/Struts.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.coderising.litestruts; - -import org.dom4j.Attribute; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - - - -public class Struts { - - public static View runAction(String actionName, Map parameters) { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - SAXReader reader = new SAXReader(); - File file = new File("src/com/coderising/litestruts/struts.xml"); - View view = new View(); - - try { - // 加载配置文件 - Document doucment = reader.read(file); - Element struts = doucment.getRootElement(); - Iterator strutsIterator = struts.elementIterator(); - Element action = null; - Object obj = null; - - while (strutsIterator.hasNext()) { - action = (Element) strutsIterator.next(); - Attribute actionAttribute = action.attribute("name"); - - // 通过反射获取实例化对象 - if (actionAttribute.getValue().equals(actionName)) { - obj = Class.forName(action.attribute("class").getValue()).newInstance(); - break; - } - } - - Iterator> parametersIterator = parameters.entrySet().iterator(); - - while (parametersIterator.hasNext()) { - - Map.Entry entry = parametersIterator.next(); - - // 调用相应属性的setter方法 - Method setterMethod = obj.getClass().getMethod("set" + - toUpperFisrtLetter(entry.getKey()), String.class); - setterMethod.invoke(obj, entry.getValue()); - } - - Method exectueMethod= obj.getClass().getMethod("execute"); - String exectueValue = (String) exectueMethod.invoke(obj); - - // 获取类中的所有属性 - Field[] fields = obj.getClass().getDeclaredFields(); - HashMap fieldHashMap = new HashMap<>(); - - for(int i = 0; i < fields.length; i++){ - - String fieldName = fields[i].getName(); - - // 获取对应的getter方法 - Method getterMethod = obj.getClass().getMethod("get" + - toUpperFisrtLetter(fieldName)); - String fieldValue = (String) getterMethod.invoke(obj); - - fieldHashMap.put(fieldName, fieldValue); - } - - - view.setParameters(fieldHashMap); - - Iterator actionIterator = action.elementIterator(); - - while (actionIterator.hasNext()) { - Element result = (Element) actionIterator.next(); - Attribute resuAttribute = result.attribute("name"); - - if (resuAttribute.getValue().equals(exectueValue)) { - view.setJsp(result.getStringValue()); - break; - } - } - - } catch (DocumentException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - - return view; - } - - // 将字符串首字母大写 - @NotNull - private static String toUpperFisrtLetter(String str) { - String string = str.toLowerCase(); - char[] cs = string.toCharArray(); - // 首字母大写 - cs[0] -= 32; - - return String.valueOf(cs); - } - -} diff --git a/group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java b/group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java deleted file mode 100644 index ab335a0ea4..0000000000 --- a/group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group14/296933284/coding/src/com/coderising/litestruts/View.java b/group14/296933284/coding/src/com/coderising/litestruts/View.java deleted file mode 100644 index 07df2a5dab..0000000000 --- a/group14/296933284/coding/src/com/coderising/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group14/296933284/coding/src/com/coderising/litestruts/struts.xml b/group14/296933284/coding/src/com/coderising/litestruts/struts.xml deleted file mode 100644 index ea46090bc9..0000000000 --- a/group14/296933284/coding/src/com/coderising/litestruts/struts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/ArrayList.java b/group14/296933284/coding/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 116020466d..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -/** - * ArrayList ʵ 14С 296933284 - * - * @author Tonnyson - * - */ -public class ArrayList implements List { - - private int size; - private static final int DEFAULT_CAPACITY = 10; - private Object[] elementData; - - - public ArrayList() { - elementData = new Object[DEFAULT_CAPACITY]; - } - - public ArrayList(int initCapacity) { - elementData = new Object[initCapacity]; - } - - /** - * ĩβָԪأԶչΪԭȵ - */ - public void add(Object obj) { - - ensureCapacityInternal(size); - - elementData[size] = obj; - size++; - } - - - /** - * ָλòԪ - */ - public void add(int index, Object obj) { - - rangCheckForAdd(index); - ensureCapacityInternal(size + 1); - - for (int i = size - 1; i >= index; i--) - elementData[i + 1] = elementData[i]; - - elementData[index] = obj; - size++; - } - - /** - * - */ - private void ensureCapacityInternal(int minCapacity) { - if (minCapacity - elementData.length > 0) { - int newCapacity = elementData.length * 2; - elementData = Arrays.copyOf(elementData, newCapacity); - // elementData = tempElementData; - } - } - - /** - * add() м±ǷԽ - */ - private void rangCheckForAdd(int index) { - if (index > size || index < 0) - throw new IndexOutOfBoundsException(); - } - - /** - * ָλõԪֵ - */ - public Object get(int index) { - - rangCheck(index); - - return elementData[index]; - } - - /** - * ɾָλõԪأظֵ - */ - public Object remove(int index) { - rangCheck(index); - - Object obj = elementData[index]; - - for (int i = index; i < size; i++) - elementData[i] = elementData[i + 1]; - - size--; - - return obj; - } - - /** - * ±ǷԽ - * - * @param index - */ - private void rangCheck(int index) { - if (index >= size) - throw new IndexOutOfBoundsException(); - } - - /** - * 鳤 - */ - public int size() { - return size; - } - - /** - * - * - * @return - */ - public Iterator iterator() { - return new Iter(); - } - - //ڲ - private class Iter implements Iterator { - int current; - - @Override - public boolean hasNext() { - return current != size; - } - - @Override - public Object next() { - - int i = current; - rangCheck(i); - current++; - - return elementData[i]; - } - - } - -} - - diff --git a/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java b/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java deleted file mode 100644 index b74dbe85a2..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.coding.basic; - -/** - * BST ʵ 14С 296933284 - * - * @author Tonnyson - * - */ -public class BinarySearchTree implements Comparable { - - private Object data; - private BinarySearchTree leftChild; - private BinarySearchTree rightChild; - - public BinarySearchTree() { - super(); - this.data = null; - this.leftChild = null; - this.rightChild = null; - } - - public BinarySearchTree(Object data) { - this(); - this.data = data; - } - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinarySearchTree getLeftChild() { - return leftChild; - } - - public void setLeftChild(BinarySearchTree leftChild) { - this.leftChild = leftChild; - } - - public BinarySearchTree getRightChild() { - return rightChild; - } - - public void setRightChild(BinarySearchTree rightChild) { - this.rightChild = rightChild; - } - - /** - * вڵ - * - * @param obj - * ڵֵ - */ - public void insert(Object obj) { - insert(obj, this); - } - - private boolean insert(Object obj, BinarySearchTree node) { - - BinarySearchTree bstNode = new BinarySearchTree(obj); - - if (node == null) { - node = bstNode; - return true; - } else if (node.compareTo(obj) == 0) { - return true; - } else if (node.compareTo(obj) > 0) { - - if (node.getLeftChild() != null) { - return insert(obj, node.getLeftChild()); - } - - node.leftChild = bstNode; - - } else if (node.compareTo(obj) < 0) { - - if (node.getRightChild() != null) { - return insert(obj, node.getRightChild()); - } - - node.rightChild = bstNode; - } - - return false; - - } - - /** - * BST Ľڵ㣬ʹ֮ - */ - public void inOrder(BinarySearchTree node) { - - if (node != null) { - inOrder(node.getLeftChild()); - visit(node); - inOrder(node.getRightChild()); - } - - } - - /** - * BST Ľڵֵ - */ - public void levelOrder(BinarySearchTree node) { - Queue queue = new Queue(); - BinarySearchTree bstNode = null; - queue.enQueue(node); - - while (!queue.isEmpty()) { - bstNode = (BinarySearchTree) queue.deQueue(); - visit(bstNode); - - if (bstNode.getLeftChild() != null) { - queue.enQueue(bstNode.getLeftChild()); - } - - if (bstNode.getRightChild() != null) { - queue.enQueue(bstNode.getRightChild()); - } - } - } - - /** - * ָڵֵ - * - * @param node - */ - public void visit(BinarySearchTree node) { - System.out.println(node.getData()); - } - - /** - * Ƚ BST ڵֵС - */ - @Override - public int compareTo(Object obj) { - int result = 0; - - if (obj instanceof Integer) { - Integer value = (Integer) obj; - Integer thisValue = (Integer) this.data; - result = thisValue.compareTo(value); - } else { - String value = obj.toString(); - result = this.data.toString().compareTo(value); - } - - return result; - } - -} diff --git a/group14/296933284/coding/src/com/coding/basic/Iterator.java b/group14/296933284/coding/src/com/coding/basic/Iterator.java deleted file mode 100644 index e7cbd474ec..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group14/296933284/coding/src/com/coding/basic/JavaTest.java b/group14/296933284/coding/src/com/coding/basic/JavaTest.java deleted file mode 100644 index 8c4cab01b6..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/JavaTest.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.coding.basic; - -import org.junit.Test; - -public class JavaTest { - - @Test - public void binarySearchTreeTest() { - BinarySearchTree bSTree = new BinarySearchTree(5); - - System.out.println(bSTree.getData()); - - // insert - bSTree.insert(1); - bSTree.insert(2); - bSTree.insert(4); - bSTree.insert(6); - bSTree.insert(7); - bSTree.insert(8); - System.out.println("-----------------"); - // inOrder - bSTree.inOrder(bSTree); - - System.out.println("-----------------"); - // levelOrder - bSTree.levelOrder(bSTree); - } - - @Test - public void queueTest() { - Queue queue = new Queue(); - - // enQueue() - for (int i = 0; i < 10; i++) { - queue.enQueue("hello: " + i); - } - - // size() - System.out.println(queue.size()); // 10 - // isEmpty - System.out.println(queue.isEmpty()); - - // deQueue() - for (int i = 0; i < 10; i++) { - System.out.println(queue.deQueue()); - } - - // size() - System.out.println(queue.size()); // 0 - - // isEmpty - System.out.println(queue.isEmpty()); - } - - @Test - public void stackTest() { - Stack stack = new Stack(); - - // push() - for (int i = 0; i < 10; i++) { - stack.push("hello: " + i); - } - - // size() - System.out.println(stack.size()); - - // pop() - for (int i = 0; i < 10; i++) { - System.out.println(stack.pop()); - } - - // isEmpty() - System.out.println(stack.isEmpty()); - System.out.println(stack.size()); - - stack.push("hello world 1"); - stack.push("hello world 2"); - stack.push("hello world 3"); - stack.push("hello world 4"); - - // peek() - System.out.println(stack.peek()); - - // isEmpty() - System.out.println(stack.isEmpty()); - } - - @Test - public void linkedListTest() { - LinkedList linkedList = new LinkedList(); - - // add() addLast() - for (int i = 0; i < 5; i++) { - linkedList.add("hello: " + i); - } - - // iterator() get() getPreNode() - Iterator iter = linkedList.iterator(); - - while (iter.hasNext()) { - System.out.println(iter.next()); - } - System.out.println("-----------------------"); - LinkedList linkedList1 = new LinkedList(); - - // addFirst() - for (int i = 0; i < 5; i++) { - linkedList1.addFirst("hello: " + i); - } - - Iterator iter1 = linkedList1.iterator(); - - while (iter1.hasNext()) { - System.out.println(iter1.next()); - } - - System.out.println("-----------------------"); - // remove() - System.out.println(linkedList1.remove(0)); // hello: 4 - - System.out.println("-----------------------"); - // removeFirst() removeLast() - System.out.println(linkedList1.removeFirst()); // hello: 3 - System.out.println(linkedList1.removeLast()); // hello: 0 - - System.out.println("-----------------------"); - // size() - System.out.println(linkedList.size()); // 5 - } - - @Test - public void arrayListTest() { - ArrayList arrayList = new ArrayList(); - - // add(obj) - for (int i = 0; i < 10; i++) { - arrayList.add("hello: " + i); - } - - // get(index) - for (int i = 0; i < arrayList.size(); i++) { - System.out.println("-->" + arrayList.get(i)); - } - - // add(index, obj) - arrayList.add(5, "Tennyson"); - - for (int i = 0; i < arrayList.size(); i++) { - System.out.println("++>" + arrayList.get(i)); - } - - // size() - System.out.println("size: " + arrayList.size()); - System.out.println("index 5: " + arrayList.get(5)); - - // remove() - Object value = arrayList.remove(5); - System.out.println("index 5: " + value); - System.out.println("size: " + arrayList.size()); - System.out.println("index5: " + arrayList.get(5)); - - for (int i = 0; i < arrayList.size(); i++) { - System.out.println("index " + i + " : " + arrayList.get(i)); - } - - System.out.println("-------------------------------"); - // iterator - Iterator iter = arrayList.iterator(); - while (iter.hasNext()) { - System.out.println(iter.next()); - } - - System.out.println("-------------------------------"); - - } -} diff --git a/group14/296933284/coding/src/com/coding/basic/LinkedList.java b/group14/296933284/coding/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 3c37904532..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,215 +0,0 @@ -package com.coding.basic; - -import java.util.Collection; - - -/** - * LinkedList (ͷĵ) ʵ 14С 296933284 - * - * @author Tonnyson - * - */ -public class LinkedList implements List { - - private Node head; - private int size; - - public LinkedList() { - super(); - this.head = new Node(); - this.size = 0; - } - - public void add(Object obj) { - addLast(obj); - } - - public void add(int index, Object obj) { - - if (index == size + 1) { - addLast(obj); - } else { - Node r = getPreNode(index); - Node node = new Node(); - node.data = obj; - node.next = r.next; - r.next = node; - size++; - } - } - - - - /** - * ײڵ - * - * @param obj ڵĽڵֵ - * - */ - public void addFirst(Object obj) { - Node node = new Node(); - node.data = obj; - - node.next = head.next; - head.next = node; - size++; - } - - /** - * βڵ - * - * @param obj ڵĽڵֵ - * - */ - public void addLast(Object obj) { - - Node node = new Node(); - node.data = obj; - node.next = null; - - Node r = head; - while (r.next != null) r = r.next; - - r.next = node; - - size++; - - } - - /** - * Ԫذ˳뵥 - * - * @param c Ҫ뵥Ԫصļ - * - */ - public void addAll(Collection c) { - - Iterator iter = (Iterator) c.iterator(); - - while (iter.hasNext()) { - addLast(iter.next()); - } - } - - /** - * ȡָλõĽڵֵ - */ - public Object get(int index) { - // rangCheck(index); - - return getPreNode(index).next.data; - } - - /** - * ɾָλýڵ㣬ؽڵֵ - */ - public Object remove(int index) { - - rangCheck(index); - - Node r = getPreNode(index); - - Object result = r.next.data; - - r.next = r.next.next; - size--; - return result; - } - - /** - * ɾһڵ㣬ؽڵֵ - * - * @return һڵֵ - */ - public Object removeFirst() { - return remove(0); - } - - /** - * ɾһڵ㣬ؽڵֵ - * - * @return һڵֵ - */ - public Object removeLast() { - return remove(size - 1); - } - - // ȡָλõǰ㲢 - private Node getPreNode(int index) { - - rangCheck(index); - - if (index == 0) { - return head; - } else { - Node r = head; - - for (int i = 0; i < index; i++) - r = r.next; - - return r; - } - - } - - /** - * صij - */ - public int size() { - return size; - } - - /** - * - * - * @return һ - */ - public Iterator iterator() { - return new Iter(); - } - - // ڲ - private class Iter implements Iterator { - int current = 0; - - @Override - public boolean hasNext() { - return current != size; - } - - @Override - public Object next() { - int i = current; - - rangCheck(i); - - current++; - - return get(i); - } - - } - - /** - * ǷԽ - * - * @param index - */ - private void rangCheck(int index) { - if (index > size || index < 0) - throw new IndexOutOfBoundsException(); - } - - private static class Node { - Object data; - Node next; - - public Node() { - super(); - this.data = null; - this.next = null; - } - - - } -} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java b/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java deleted file mode 100644 index 825df453ff..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by damocles on 2017/3/6. - */ -public class LinkedListTest { - private LinkedList bookList; - - @Before - public void setUp() throws Exception { - bookList = new LinkedList<>(); - - bookList.add("javascript"); - bookList.add("java"); - bookList.add("c++"); - bookList.add("c"); - - } - - @After - public void tearDown() throws Exception { - bookList = null; - } - - @Test - public void add() throws Exception { - Assert.assertTrue(bookList.add("python")); - } - - @Test - public void add1() throws Exception { - bookList.add("python"); - Assert.assertEquals("python", bookList.removeLast()); - } - - @Test - public void addFirst() throws Exception { - bookList.addFirst("python"); - Assert.assertEquals("python", bookList.removeFirst()); - } - - @Test - public void addLast() throws Exception { - bookList.addLast("python"); - Assert.assertEquals("python", bookList.removeLast()); - } - - @Test - public void get() throws Exception { - Assert.assertEquals("javascript", bookList.get(0)); - } - - @Test - public void remove() throws Exception { - Assert.assertEquals("javascript", bookList.remove(0)); - } - - @Test - public void removeFirst() throws Exception { - Assert.assertEquals("javascript", bookList.removeFirst()); - } - - @Test - public void removeLast() throws Exception { - Assert.assertEquals("c", bookList.removeLast()); - } - - @Test - public void size() throws Exception { - Assert.assertEquals(4, bookList.size()); - } - - @Test - public void isEmpty() throws Exception { - Assert.assertFalse(bookList.isEmpty()); - } - - @Test - public void iterator() throws Exception { - Iterator it = bookList.iterator(); - Assert.assertTrue(it.hasNext()); - int count = 0; - while (it.hasNext()) { - Assert.assertEquals(bookList.get(count++), it.next()); - } - } - -} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/List.java b/group14/296933284/coding/src/com/coding/basic/List.java deleted file mode 100644 index 969e6dd82b..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object obj); - public void add(int index, Object obj); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group14/296933284/coding/src/com/coding/basic/Queue.java b/group14/296933284/coding/src/com/coding/basic/Queue.java deleted file mode 100644 index 9257eb04ca..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coding.basic; - -/** - * Queue ʵ - * First In First Out - * 14С 296933284 - * - * @author Tonnyson - * - */ -public class Queue { - - private LinkedList elementData = new LinkedList(); - - /** - * вԪ - * - * @param obj - */ - public void enQueue(Object obj){ - elementData.addLast(obj); - } - - /** - * ɾԪ - * - * @return - */ - public Object deQueue(){ - return elementData.removeFirst(); - } - - /** - * ж϶ǷΪ - * - * @return - */ - public boolean isEmpty(){ - return elementData.size() == 0; - } - - /** - * ضеԪظ - * - * @return - */ - public int size(){ - return elementData.size(); - } -} diff --git a/group14/296933284/coding/src/com/coding/basic/QueueTest.java b/group14/296933284/coding/src/com/coding/basic/QueueTest.java deleted file mode 100644 index 3a32d0f0c9..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/QueueTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by damocles on 2017/3/7. - */ -public class QueueTest { - private Queue queue; - - @Before - public void setUp() throws Exception { - queue = new Queue<>(); - - queue.enQueue("javascript"); - queue.enQueue("java"); - queue.enQueue("c++"); - queue.enQueue("c"); - } - - @After - public void tearDown() throws Exception { - queue = null; - } - - @Test - public void enQueue() throws Exception { - queue.enQueue("php"); - - Assert.assertEquals(5, queue.size()); - } - - @Test - public void deQueue() throws Exception { - Assert.assertEquals("javascript",queue.deQueue()); - } - - @Test - public void isEmpty() throws Exception { - Assert.assertFalse(queue.isEmpty()); - } - - @Test - public void size() throws Exception { - Assert.assertEquals(4, queue.size()); - } - -} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/Stack.java b/group14/296933284/coding/src/com/coding/basic/Stack.java deleted file mode 100644 index e28a9e3760..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.coding.basic; - -/** - * Stack ʵ - * Last In First Out - * 14С 296933284 - * - * @author Tonnyson - * - */ -public class Stack { - - private ArrayList elementData = new ArrayList(); - private int top = 0; - - /** - * ջвԪ - * - * @param obj - */ - public void push(Object obj) { - elementData.add(obj); - top++; - } - - /** - * ջȡԪ - * - * @return - */ - public Object pop() { - return elementData.remove(--top); - } - - /** - * ȡջԪ - * - * @return - */ - public Object peek() { - return elementData.get(top - 1); - } - - /** - * жջǷΪ - * - * @return - */ - public boolean isEmpty() { - return top == 0; - } - - /** - * ȡջԪظ - * - * @return - */ - public int size() { - return top; - } -} diff --git a/group14/296933284/coding/src/com/coding/basic/StackTest.java b/group14/296933284/coding/src/com/coding/basic/StackTest.java deleted file mode 100644 index e67a4ec361..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/StackTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by damocles on 2017/3/7. - */ -public class StackTest { - private Stack stack; - - @Before - public void setUp() throws Exception { - stack = new Stack<>(); - - stack.push("javascript"); - stack.push("java"); - stack.push("c++"); - stack.push("c"); - } - - @After - public void tearDown() throws Exception { - stack = null; - } - - @Test - public void push() throws Exception { - stack.push("php"); - Assert.assertEquals("php", stack.pop()); - } - - @Test - public void pop() throws Exception { - Assert.assertEquals("c", stack.pop()); - } - - @Test - public void peek() throws Exception { - Assert.assertEquals("c", stack.peek()); - } - - @Test - public void isEmpty() throws Exception { - Assert.assertFalse(stack.isEmpty()); - } - - @Test - public void size() throws Exception { - Assert.assertEquals(4, stack.size()); - } - -} \ No newline at end of file diff --git a/group14/352504906/test/.classpath b/group14/352504906/test/.classpath deleted file mode 100644 index 18d70f02cb..0000000000 --- a/group14/352504906/test/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group14/352504906/test/.project b/group14/352504906/test/.project deleted file mode 100644 index b0299dbe76..0000000000 --- a/group14/352504906/test/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - test - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group14/352504906/test/.settings/org.eclipse.core.resources.prefs b/group14/352504906/test/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index e2d1bdfc9f..0000000000 --- a/group14/352504906/test/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,6 +0,0 @@ -#Sun Feb 26 15:56:36 CST 2017 -eclipse.preferences.version=1 -encoding//src/com/coding/basic=UTF-8 -encoding//src/com/coding/basic/SimpleArrayList.java=UTF-8 -encoding/=UTF-8 -encoding/src=UTF-8 diff --git a/group14/352504906/test/.settings/org.eclipse.jdt.core.prefs b/group14/352504906/test/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 06bffba000..0000000000 --- a/group14/352504906/test/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Sun Feb 26 15:31:53 CST 2017 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/group14/352504906/test/src/com/coding/basic/SimpleArrayList.java b/group14/352504906/test/src/com/coding/basic/SimpleArrayList.java deleted file mode 100644 index 931d0af3aa..0000000000 --- a/group14/352504906/test/src/com/coding/basic/SimpleArrayList.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - - -/** - * @Description 简单实现ArrayList - */ -public class SimpleArrayList implements SimpleList{ - private int size = 0; - private Object[] elementData = new Object[10]; - /** - * 插入元素o - * @param o 待插入元素 - */ - public void add(Object o){ - //扩容 - if(elementData.length < size + 1){ - grow(size+1); - } - elementData[size++] = o; - } - /** - * 数组扩容 - * @param capacity 数组实际长度 - */ - private void grow(int capacity) { - int oldCapacity = elementData.length; - int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容50% - if(capacity > newCapacity){ - newCapacity = capacity; - } - elementData = Arrays.copyOf(elementData, newCapacity); - } - /** - * 在指定索引初插入元素 - * @param index 索引 - * @param o 待插入元素 - */ - public void add(int index,Object o){ - rangeCheckForAdd(index); - if(elementData.length size || index <0){ - throw new IndexOutOfBoundsException("数组越界异常"); - } - } - /** - * 索引越界处理 - * @param index 索引 - */ - private void rangeCheck(int index) { - if(index >= size || index <0) - throw new IndexOutOfBoundsException("数组越界异常"); - } - /** - * 移除该索引处元素 - * @param index 索引位置 - * @return 移除元素 - */ - public Object remove(int index){ - rangeCheck(index); - Object oldObject = elementData[index]; - if(size > index +1){ - System.arraycopy(elementData, index +1 , elementData, index, size-index-1); - } - elementData[--size] = null; - return oldObject; - } - /** - * 返回集合长度 - * @return 长度 - */ - public int size(){ - return this.size; - } - /** - * 返回指定索引元素 - * @param index 索引 - * @return Object 元素 - */ - public Object get(int index){ - rangeCheck(index); - return elementData[index]; - } - private class ArrayListIterator implements SimpleIterator{ - SimpleArrayList l = null; - private int iteratorIndex = 0; - - private ArrayListIterator(SimpleArrayList arrayList){ - this.l = arrayList; - } - - @Override - public boolean hasNext() { - return iteratorIndex < size; - } - - @Override - public Object next() { - if (iteratorIndex >= size) { - throw new RuntimeException("数组越界异常"); - } - return elementData[iteratorIndex++]; - } - - } -} diff --git a/group14/352504906/test/src/com/coding/basic/SimpleIterator.java b/group14/352504906/test/src/com/coding/basic/SimpleIterator.java deleted file mode 100644 index fd8db0aa8f..0000000000 --- a/group14/352504906/test/src/com/coding/basic/SimpleIterator.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.coding.basic; - -/** - *简单迭代器接口 - * - */ -public interface SimpleIterator { - public Object next(); - public boolean hasNext(); - -} diff --git a/group14/352504906/test/src/com/coding/basic/SimpleLinkedList.java b/group14/352504906/test/src/com/coding/basic/SimpleLinkedList.java deleted file mode 100644 index 692fd23f62..0000000000 --- a/group14/352504906/test/src/com/coding/basic/SimpleLinkedList.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.coding.basic; -/** - * @Description 简单实现linkedList - */ -public class SimpleLinkedList implements SimpleList{ - private Node head; - - private int size = 0; - /** - * 返回集合长度 - * @return 长度 - */ - public int size(){ - return this.size; - } - /** - * 返回指定索引出元素 - * @param index 索引 - * @return Object 元素 - */ - public Object get(int index){ - rangeCheck(index); - Node current = head; - for(int i =0;i size || index < 0){ - throw new RuntimeException("找不到该节点"); - } - } - //头插法 - public void addFirst(Object o){ - Node newNode = new Node(o); - newNode.next = head; - head = newNode; - size++; - } - //尾插法 - public void addLast(Object o){ - Node newNode = new Node(o); - Node current = head;//设定一个当前节点,便于遍历 - while(current.next!=null){ - current = current.next; - } - if(current.next == null)//尾节点 - { - current.next = newNode; - size++; - } - } - /** - * 移除该索引处元素 - * @param index 索引位置 - * @return 移除元素 - */ - public Object remove(int index){ - rangeCheck(index+1); - Node current = head; - if(index == 0){//头部删除 - Object removeObj = head.o; - head = head.next; - size --; - return removeObj; - } - int i; - for(i=0;i newCapacity){ - newCapacity = capacity; - } - elementData = Arrays.copyOf(elementData, newCapacity); - } - /** - * 移除并返回队列头部元素 - * @return 队列头部元素 - */ - public Object deQueue(){ - Object o = elementData[size-1]; - removeElement(0); - return o; - } - /** - * 删除指定索引处元素 - * @param index 索引 - */ - private void removeElement(int index) { - if(index >= 0){ - System.arraycopy(elementData, index+1, elementData, 0, size-index-1); - elementData[--size] = null; - } - } - /** - * 判断队列是否为空 - * @return Boolean - */ - public boolean isEmpty(){ - return size==0; - } - /** - * 返回队列长度 - * @return int 队列长度 - */ - public int size(){ - return this.size; - } -} diff --git a/group14/352504906/test/src/com/coding/basic/SimpleStack.java b/group14/352504906/test/src/com/coding/basic/SimpleStack.java deleted file mode 100644 index 66d5e7dbe1..0000000000 --- a/group14/352504906/test/src/com/coding/basic/SimpleStack.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; -import java.util.EmptyStackException; - -/** - * @Description 简单实现stack - */ -public class SimpleStack { - private Object[] elementData = new Object[10]; - private int size; - /** - * 往栈顶添加新的元素 - * @param o 要添加的元素 - */ - public void push(Object o){ - //扩容 - if(elementData.length < size +1){ - grow(size+1); - } - elementData[size++] = o; - } - /** - * 数组扩容 - * @param capacity 数组实际长度 - */ - private void grow(int capacity) { - int oldCapacity = elementData.length; - int newCapacity = oldCapacity *2;//扩容2倍 - if(newCapacity < capacity){ - newCapacity = capacity; - } - elementData = Arrays.copyOf(elementData, newCapacity); - } - /** - * 移除并返回栈顶元素 - * @return Object 返回该移除的元素 - */ - public Object pop(){ - Object o = peek(); - removeElement(size-1); - return o; - } - /** - * 移除栈顶元素 - * @param length 栈的长度 - */ - private void removeElement(int length) { - elementData = Arrays.copyOf(elementData, length); - size --; - } - /** - * 返回栈顶元素 - * @return Object 栈顶元素 - */ - public Object peek(){ - if(size == 0){ - throw new EmptyStackException(); - } - return elementData[size-1]; - } - /** - * 查询并返回栈的长度 - * @return int 栈的长度 - */ - public int size(){ - return this.size; - } - /** - * 判断是否为空栈 - * @return boolean - */ - public boolean isEmpty(){ - return size==0; - } -} diff --git "a/group14/352504906/\346\265\205\350\260\210CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.txt" "b/group14/352504906/\346\265\205\350\260\210CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.txt" deleted file mode 100644 index d269d4a4ab..0000000000 --- "a/group14/352504906/\346\265\205\350\260\210CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.txt" +++ /dev/null @@ -1 +0,0 @@ -͵ַhttp://www.cnblogs.com/superFish2016/articles/cpu.html \ No newline at end of file diff --git a/group14/598808350/20170219.txt b/group14/598808350/20170219.txt deleted file mode 100644 index 2570935d90..0000000000 --- a/group14/598808350/20170219.txt +++ /dev/null @@ -1,5 +0,0 @@ - CPUڴ棬 Ӳָ̣֮Ĺϵ - -http://blog.sina.com.cn/s/blog_986d02cd0102xncn.html - -QQ:598808350 \ No newline at end of file diff --git a/group14/598808350/2017project/src/org/learning/container/ArrayList.java b/group14/598808350/2017project/src/org/learning/container/ArrayList.java deleted file mode 100644 index 5755c7cf3a..0000000000 --- a/group14/598808350/2017project/src/org/learning/container/ArrayList.java +++ /dev/null @@ -1,186 +0,0 @@ -package org.learning.container; - - -public class ArrayList { - - private Object [] objs = null; - private int index = -1; - public ArrayList(){ - objs = new Object[5]; - } - public ArrayList(int size){ - objs = new Object[size]; - } - /** - * һµ - * @param src - * @param src_index - * @param dest - * @param dest_index - * @param length - * @return - */ - private static Object[] copy(Object[] src,int src_index,Object[] dest,int dest_index,int length){ - System.arraycopy(src, src_index, dest, dest_index, length); - return dest; - } - - public void add(Object obj){ - if(this.index == objs.length-1) { - Object[] dest = new Object[objs.length+5]; - objs = copy(objs,0,dest,0,objs.length); - } - this.index ++; - objs[this.index] = obj; - } - - public void add(int index,Object obj){ - if(index-1 > this.index || index < 0){ - throw new IndexOutOfBoundsException(); - } - Object[] dest = new Object[objs.length+5]; - if(index == 0){ - dest[index] = obj; - dest =copy(objs,index,dest,index+1,getSize()); - objs = dest; - }else if(index == getSize()){ - objs[index] = obj; - }else{ - dest = copy(objs,0,dest,0,index);//ǰ - dest[index] = obj; //м䲿 - dest =copy(objs,index,dest,index+1,getSize()-index);//󲿷 - objs = dest; - } - this.index++; - } - - public Object get(int index){ - if(index > this.index || index <0){ - throw new IndexOutOfBoundsException(); - } - return objs[index]; - } - - public boolean isEmpty(){ - if(objs == null || this.index == -1){ - return true; - } - return false; - } - - public int getSize(){ - return this.index+1; - } - - public boolean remove(int index){ - if (index <0 || index > objs.length){ - throw new IndexOutOfBoundsException(); - } - Object[] dest = new Object[this.index]; - dest = copy(objs,0,dest,0,index);//ǰ - dest = copy(objs,index+1,dest,index,this.index-index);//󲿷 - objs = dest; - this.index --; - return true; - } - public boolean remove(Object obj){ - for(int i=0;i<=this.index;i++){ - if(obj==null ? get(i)==null : obj.equals(get(i))) { - remove(i); //i ǰԪص±ʶ - return true; - } - } - return false; - } - public static void print(Object obj){ - System.out.println(obj); - } - - public static void main(String [] args){ - ArrayList al = new ArrayList(); - /*print(al.isEmpty()); - al.add("a1"); - print(al.isEmpty()); - print(al.getSize()); - print(al.get(0)); - print(al.get(1));*/ - al.add("a0"); - al.add("a1"); - al.add("a2"); - al.add("a3"); - al.add("a4"); - al.add("a5"); - - //al.remove(0); - //al.remove(5); - //al.remove(2); - /*boolean flag = al.remove("a7"); - print(flag); - for(int i=0;i - - 4.0.0 - - com.mark - algo - 1.0-SNAPSHOT - - - - junit - junit - 4.12 - - - \ No newline at end of file diff --git a/group14/676615845/algo/src/main/java/algo/BinarySearch.java b/group14/676615845/algo/src/main/java/algo/BinarySearch.java deleted file mode 100644 index 3144a37181..0000000000 --- a/group14/676615845/algo/src/main/java/algo/BinarySearch.java +++ /dev/null @@ -1,17 +0,0 @@ -package algo; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -/** - * Created by mark on 17/2/23. - */ -public class BinarySearch { - - public static int rank(int key, int[] a) { - List list = new ArrayList(); - list = new LinkedList(); - return -1; - } -} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/Array.java b/group14/676615845/algo/src/main/java/com/coding/basic/Array.java deleted file mode 100644 index 44afce6c25..0000000000 --- a/group14/676615845/algo/src/main/java/com/coding/basic/Array.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -/** - * Created by mark on 17/2/24. - */ -public class Array { - - public static Object[] grow(Object[] src, int size) { - return Arrays.copyOf(src, src.length + size); -// Object[] target = new Object[src.length + size]; -// System.arraycopy(src, 0, target, 0, src.length); - - } -} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/ArrayList.java b/group14/676615845/algo/src/main/java/com/coding/basic/ArrayList.java deleted file mode 100644 index 148bd6da96..0000000000 --- a/group14/676615845/algo/src/main/java/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size; // ArrayList 中的实际元素个数 - private Object[] elementData; - - public ArrayList() { - size = 0; - elementData = new Object[100]; - } - - public void add(Object o){ - if (size >= elementData.length) { - elementData = Array.grow(elementData, 100); - } - elementData[size++] = o; - } - - public void add(int index, Object o){ - if (size >= elementData.length) { - elementData = Array.grow(elementData, 100); - } - - if (index > size || index < 0) throw new ArrayIndexOutOfBoundsException(); - - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - if (index > size) throw new ArrayIndexOutOfBoundsException(); - return elementData[index]; - } - - public Object remove(int index){ - - if (index >= size || index < 0) throw new ArrayIndexOutOfBoundsException(); - - Object result = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - elementData[--size] = null; - return result; - } - - public int size() { - return size; - } - - public Iterator iterator(){ - - return new Iterator() { - - private int next = 0; // 下一个返回元素所在的位置 - - public boolean hasNext() { - return next < size; - } - - public Object next() { - if (!hasNext()) throw new ArrayIndexOutOfBoundsException(); - return elementData[next++]; - } - - public Object remove() { - if (next <= 0) throw new IllegalStateException(); - return ArrayList.this.remove(--next); - } - }; - } - -} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/BinaryTreeNode.java b/group14/676615845/algo/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 5ddd6f5f8a..0000000000 --- a/group14/676615845/algo/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode implements Comparable { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - - public int compareTo(Object obj) { - if (obj == null || obj.getClass() != Integer.class) throw new IllegalArgumentException(); - return Integer.compare(((Integer) data).intValue(), ((Integer) obj).intValue()); - } -} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/Iterator.java b/group14/676615845/algo/src/main/java/com/coding/basic/Iterator.java deleted file mode 100644 index a0b91b1a82..0000000000 --- a/group14/676615845/algo/src/main/java/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - boolean hasNext(); - Object next(); - Object remove(); -} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/LinkedList.java b/group14/676615845/algo/src/main/java/com/coding/basic/LinkedList.java deleted file mode 100644 index a1548a0c23..0000000000 --- a/group14/676615845/algo/src/main/java/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node first = null; - private Node last = null; - private int size = 0; - - public void add(Object o){ - Node node = new Node(o); - if (first == null) { - first = node; - } else { - last.next = node; - node.prev = last; - } - last = node; - size++; - } - - public void add(int index , Object o) { - if (index < 0 || index > size) throw new ArrayIndexOutOfBoundsException(); - - Node node = new Node(o); - - if (first == null) { - first = node; - last = node; - } else { - if (index == 0) { - node.next = first; - first.prev = node; - first = node; - } else if (index == size) { - last.next = node; - node.prev = last; - last = node; - } else { - Node temp = first; - while (--index > 0) { - temp = temp.next; - } - node.next = temp.next; - temp.next.prev = node; - temp.next = node; - node.prev = temp; - } - } - size++; - } - public Object get(int index){ - if (index < 0 || index > size - 1) throw new ArrayIndexOutOfBoundsException(); - Node node = first; - while (index-- > 0) { - node = node.next; - } - return node.data; - } - - public Object remove(int index){ - if (index < 0 || index >= size) throw new ArrayIndexOutOfBoundsException(); - - Node node = null; - if (index == 0) { - node = first; - if (size == 1) { - first = null; - last = null; - } else { - first = first.next; - first.prev = null; - } - } else if (index == size - 1) { - node = last; - last = last.prev; - last.next = null; - } else { - node = first; - Node temp = null; - while (index-- > 0) { - node = node.next; - } - temp = node.prev; - temp.next = node.next; - node.next.prev = temp; - } - size--; - return node.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object obj){ - add(0, obj); - } - - public void addLast(Object obj){ - add(size, obj); - } - - public Object removeFirst(){ - return remove(0); - } - - public Object removeLast(){ - return remove(size - 1); - } - - public Iterator iterator(){ - - if (first == null || last == null) throw new IllegalStateException(); - - return new InnerIterator(); - } - - private class InnerIterator implements Iterator { - - private Node nextNode = first; - - public boolean hasNext() { - return nextNode != null; - } - - public Object next() { - if (!hasNext()) throw new ArrayIndexOutOfBoundsException(); - Node node = nextNode; - nextNode = nextNode.next; - return node.data; - } - - public Object remove() { - if (nextNode == first) throw new IllegalStateException(); - - Node node = nextNode.prev; - if (nextNode == first.next) { - first = nextNode; - first.prev = null; - } else if (nextNode == null) { - node = last; - last = last.prev; - last.next = null; - } else { - node.prev = node.next; - node.next.prev = node.prev; - } - return node.data; - } - } - - private static class Node{ - - Object data; - Node next; - Node prev; - - public Node(Object data) { - this.data = data; - next = null; - prev = null; - } - } -} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/List.java b/group14/676615845/algo/src/main/java/com/coding/basic/List.java deleted file mode 100644 index 6d380288e5..0000000000 --- a/group14/676615845/algo/src/main/java/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - void add(Object o); - void add(int index, Object o); - Object get(int index); - Object remove(int index); - int size(); -} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/Queue.java b/group14/676615845/algo/src/main/java/com/coding/basic/Queue.java deleted file mode 100644 index 60345ca4f6..0000000000 --- a/group14/676615845/algo/src/main/java/com/coding/basic/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList linkedList = new LinkedList(); - - public void enQueue(Object o){ - linkedList.add(o); - } - - public Object deQueue(){ - return linkedList.removeFirst(); - } - - public boolean isEmpty(){ - return linkedList.size() == 0; - } - - public int size(){ - return linkedList.size(); - } -} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/Stack.java b/group14/676615845/algo/src/main/java/com/coding/basic/Stack.java deleted file mode 100644 index a9f0d009f3..0000000000 --- a/group14/676615845/algo/src/main/java/com/coding/basic/Stack.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coding.basic; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty(){ - return elementData.size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group14/676615845/algo/src/test/java/algo/BinarySearchTest.java b/group14/676615845/algo/src/test/java/algo/BinarySearchTest.java deleted file mode 100644 index 6308e23251..0000000000 --- a/group14/676615845/algo/src/test/java/algo/BinarySearchTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package algo; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by mark on 17/2/24. - */ -public class BinarySearchTest { - @Before - public void setUp() throws Exception { - - } - - @After - public void tearDown() throws Exception { - - } - - @Test - public void rank() throws Exception { - - } - -} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/ArrayListTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/ArrayListTest.java deleted file mode 100644 index 64fd31eb33..0000000000 --- a/group14/676615845/algo/src/test/java/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.coding.basic; - -import org.junit.*; -import org.junit.rules.ExpectedException; - -/** - * Created by mark on 17/2/24. - */ -public class ArrayListTest { - - private static ArrayList list; - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @BeforeClass - public static void setUpBeforeClass() throws Exception { - } - - @Before - public void setUp() throws Exception { - list = new ArrayList(); - } - - @After - public void tearDown() throws Exception { - list = null; - } - - @Test - public void add() throws Exception { - // 可以加入元素 - list.add("hello"); - Assert.assertEquals(1, list.size()); - - // 可以自动扩容 - for (int i=0; i<150; i++) { - list.add(i); - } - Assert.assertEquals(151, list.size()); - Assert.assertTrue(149 == ((Integer) list.get(150)).intValue()); - } - - @Test - public void add1() throws Exception { - for (int i=0; i<100; i++) { - list.add(i); - } - list.add(0, "zero"); - list.add(50, "fifty"); - list.add(102, "102"); - Assert.assertEquals("zero", list.get(0)); - Assert.assertEquals("fifty", list.get(50)); - Assert.assertEquals("102", list.get(102)); - - list = new ArrayList(); - for (int i=0; i<100; i++) { - list.add(i); - } - list.add(100, "100"); - Assert.assertEquals("100", list.get(100)); - - thrown.expect(ArrayIndexOutOfBoundsException.class); - list.add(102, "102"); - } - - @Test - public void get() throws Exception { - list.add("hello"); - Object obj = list.get(0); - Assert.assertTrue("hello".equals(obj)); - } - - @Test - public void remove() throws Exception { - for (int i=0; i<100; i++) { - list.add(i); - } - Assert.assertEquals(99, ((Integer) list.remove(99)).intValue()); - Assert.assertEquals(99, list.size()); - - thrown.expect(ArrayIndexOutOfBoundsException.class); - list.remove(100); - list.remove(-1); - } - - @Test - public void size() throws Exception { - for (int i=0; i<100; i++) { - list.add(i); - } - Assert.assertEquals(100, list.size()); - list.add("hello"); - Assert.assertEquals(101, list.size()); - } - - @Test - public void iterator() throws Exception { - for (int i=0; i<100; i++) { - list.add(i); - } - - Iterator iterator = list.iterator(); - while (iterator.hasNext()) { - Assert.assertNotNull(iterator.next()); - } -// Assert.assertNotNull(iterator.next()); - - Object[] target = new Object[list.size()]; - int i = 0; - iterator = list.iterator(); - while (iterator.hasNext()) { - target[i++] = iterator.next(); - } - Assert.assertEquals(100, target.length); - - for (int j = 0; j < 100; j++) { - Assert.assertEquals(j, ((Integer) target[j]).intValue()); - } - - // 测试迭代器的 remove() 方法 - list = new ArrayList(); - for (int k=0; k<100; k++) { - list.add(k); - } - iterator = list.iterator(); -// thrown.expect(IllegalStateException.class); -// iterator.remove(); - - iterator.next(); - Object i0 = iterator.remove(); - Assert.assertEquals(0, ((Integer) i0).intValue()); - - for (int j=0; j<50; j++) { - iterator.next(); - } - Object i50 = iterator.remove(); - Assert.assertEquals(50, ((Integer)i50).intValue()); - - for (int j = 0; j < 48; j++) { - iterator.next(); - } - Object i99 = iterator.remove(); - Assert.assertEquals(98, ((Integer)i99).intValue()); - } - -} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/ArrayTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/ArrayTest.java deleted file mode 100644 index 579b98c585..0000000000 --- a/group14/676615845/algo/src/test/java/com/coding/basic/ArrayTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by mark on 17/2/24. - */ -public class ArrayTest { - private Object[] src; - - @Before - public void setUp() throws Exception { - src = new Object[10]; - } - - @After - public void tearDown() throws Exception { - - } - - @Test - public void grow() throws Exception { - src = Array.grow(src, 20); - Assert.assertEquals(30, src.length); - } - -} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/BinaryTreeNodeTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/BinaryTreeNodeTest.java deleted file mode 100644 index b3d3c7d557..0000000000 --- a/group14/676615845/algo/src/test/java/com/coding/basic/BinaryTreeNodeTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.coding.basic; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by mark on 17/2/25. - */ -public class BinaryTreeNodeTest { - - private BinaryTreeNode tree; - - @Before - public void setUp() throws Exception { - tree = new BinaryTreeNode(); - } - - @After - public void tearDown() throws Exception { - tree = null; - } - - @Test - public void getData() throws Exception { - - } - - @Test - public void setData() throws Exception { - - } - - @Test - public void getLeft() throws Exception { - - } - - @Test - public void setLeft() throws Exception { - - } - - @Test - public void getRight() throws Exception { - - } - - @Test - public void setRight() throws Exception { - - } - - @Test - public void insert() throws Exception { - tree.insert("8"); - tree.insert("1"); - tree.insert("2"); - tree.insert("10"); - tree.insert("4"); - tree.insert("34"); - } - -} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/LinkedListTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/LinkedListTest.java deleted file mode 100644 index 24c2a84367..0000000000 --- a/group14/676615845/algo/src/test/java/com/coding/basic/LinkedListTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.coding.basic; - -import org.junit.*; -import org.junit.rules.ExpectedException; - -/** - * Created by mark on 17/2/24. - */ -public class LinkedListTest { - - private LinkedList linkedList; - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Before - public void setUp() throws Exception { - linkedList = new LinkedList(); - } - - @After - public void tearDown() throws Exception { - linkedList = null; - } - - @Test - public void add() throws Exception { - linkedList.add("first"); - Assert.assertEquals(1, linkedList.size()); - Assert.assertEquals("first", linkedList.get(0)); - - linkedList.add("second"); - linkedList.add("third"); - Assert.assertEquals("third", linkedList.get(2)); - } - - @Test - public void add1() throws Exception { - for (int i=0; i<10; i++) { - linkedList.add(i); - } - linkedList.add(5, "Five"); - Assert.assertEquals("Five", linkedList.get(5)); - Assert.assertEquals(11, linkedList.size()); - - linkedList.add(0, "Zero"); - Assert.assertEquals("Zero", linkedList.get(0)); - - linkedList.add(12, "Last"); - Assert.assertEquals("Last", linkedList.get(12)); - } - - @Test - public void get() throws Exception { - - linkedList.add("hello"); - Assert.assertEquals("hello", linkedList.get(0)); - - linkedList.add("two"); - Assert.assertEquals("two", linkedList.get(1)); - - linkedList = new LinkedList(); - thrown.expect(ArrayIndexOutOfBoundsException.class); - linkedList.get(0); - } - - @Test - public void remove() throws Exception { - Object data = null; - - for (int i=0; i<10; i++) { - linkedList.add("" + i); - } - - data = linkedList.remove(0); - Assert.assertEquals("0", data); - - data = linkedList.remove(8); - Assert.assertEquals("9", data); - - data = linkedList.remove(4); - Assert.assertEquals("5", data); - } - - @Test - public void size() throws Exception { - linkedList.add(0); - Assert.assertEquals(1, linkedList.size()); - } - - @Test - public void addFirst() throws Exception { - - } - - @Test - public void addLast() throws Exception { - - } - - @Test - public void removeFirst() throws Exception { - - } - - @Test - public void removeLast() throws Exception { - - } - - @Test - public void iterator() throws Exception { - - } - -} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/QueueTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/QueueTest.java deleted file mode 100644 index 76ecb28a48..0000000000 --- a/group14/676615845/algo/src/test/java/com/coding/basic/QueueTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by mark on 17/2/25. - */ -public class QueueTest { - - private Queue queue; - - @Before - public void setUp() throws Exception { - queue = new Queue(); - } - - @After - public void tearDown() throws Exception { - queue = null; - } - - @Test - public void enQueue() throws Exception { - queue.enQueue("first"); - queue.enQueue("second"); - queue.enQueue("third"); - Assert.assertEquals("first", queue.deQueue()); - Assert.assertEquals("second", queue.deQueue()); - Assert.assertEquals("third", queue.deQueue()); - } - - @Test - public void deQueue() throws Exception { - - } - - @Test - public void isEmpty() throws Exception { - Assert.assertEquals(true, queue.isEmpty()); - queue.enQueue("first"); - Assert.assertEquals(false, queue.isEmpty()); - queue.deQueue(); - Assert.assertEquals(true, queue.isEmpty()); - } - - @Test - public void size() throws Exception { - Assert.assertEquals(0, queue.size()); - queue.enQueue("first"); - Assert.assertEquals(1, queue.size()); - queue.deQueue(); - Assert.assertEquals(0, queue.size()); - } - -} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/StackTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/StackTest.java deleted file mode 100644 index 21192c9036..0000000000 --- a/group14/676615845/algo/src/test/java/com/coding/basic/StackTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by mark on 17/2/25. - */ -public class StackTest { - - private Stack stack; - - @Before - public void setUp() throws Exception { - stack = new Stack(); - } - - @After - public void tearDown() throws Exception { - stack = null; - } - - @Test - public void push() throws Exception { - stack.push("first"); - stack.push("second"); - Assert.assertEquals("second", stack.pop()); - Assert.assertEquals("first", stack.pop()); - Assert.assertEquals(0, stack.size()); - } - - @Test - public void pop() throws Exception { - - } - - @Test - public void peek() throws Exception { - stack.push("first"); - stack.push("second"); - Assert.assertEquals("second", stack.peek()); - stack.pop(); - Assert.assertEquals("first", stack.peek()); - } - - @Test - public void isEmpty() throws Exception { - Assert.assertEquals(true, stack.isEmpty()); - stack.push("first"); - Assert.assertEquals(false, stack.isEmpty()); - stack.pop(); - Assert.assertEquals(true, stack.isEmpty()); - - } - - @Test - public void size() throws Exception { - Assert.assertEquals(0, stack.size()); - stack.push("first"); - Assert.assertEquals(1, stack.size()); - stack.push("second"); - Assert.assertEquals(2, stack.size()); - stack.pop(); - stack.pop(); - Assert.assertEquals(0, stack.size()); - } - -} \ No newline at end of file diff --git a/group14/775857669/.gitignore b/group14/775857669/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group14/775857669/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group14/775857669/src/com/coding/basic/ArrayList.java b/group14/775857669/src/com/coding/basic/ArrayList.java deleted file mode 100644 index b560f97afb..0000000000 --- a/group14/775857669/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private static final int MIN_EXTEND = 10; - - private Object[] elementData = new Object[100]; - /** - * - * @Author: yuhe - * @Description: 确保数组的容量 - * @param next 要插入的位置 - */ - private void ensureCapacity(int capacity) { - if (capacity < elementData.length) { - return; - } else { - int newLength = capacity + MIN_EXTEND; - elementData = Arrays.copyOf(elementData, newLength); - } - - } - - private void rangeCheckForAdd(int index) { - if (index < 0 || index > size) { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - private void rangeCheck(int index) { - if (index < 0 || index >= size) { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - public void add(Object o){ - ensureCapacity(size+1); - elementData[size++] = o; - } - - public void add(int index, Object o){ - rangeCheckForAdd(index); - ensureCapacity(size +1); - System.arraycopy(elementData, index, elementData, index+1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - rangeCheck(index); - return elementData[index]; - } - - public Object remove(int index){ - rangeCheck(index); - Object ret = elementData[index]; - int numToRemove = size-index-1; - if (numToRemove > 0) - System.arraycopy(elementData, index+1, elementData, index, numToRemove); - elementData[size--] = null; - return ret; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new Iterator() { - private int index = 0; - @Override - public Object next() { - return elementData[index++]; - } - - @Override - public boolean hasNext() { - return index < size; - } - }; - } -} diff --git a/group14/775857669/src/com/coding/basic/BinaryTreeNode.java b/group14/775857669/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 913297b0a4..0000000000 --- a/group14/775857669/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode> { - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(T data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public void insert(T t) { - BinaryTreeNode node = new BinaryTreeNode<>(); - node.setData(t); - compare(this, node); - } - - private void compare(BinaryTreeNode targetNode, BinaryTreeNode insertNode) { - - if (targetNode.data.compareTo(insertNode.data) < 0) { - if (targetNode.left != null){ - compare(targetNode.getLeft(), insertNode); - } else { - targetNode.left = insertNode; - } - - } else { - if (targetNode.right != null) { - compare(targetNode.getRight(), insertNode); - } else { - targetNode.right = insertNode; - } - - } - } - -} diff --git a/group14/775857669/src/com/coding/basic/Iterator.java b/group14/775857669/src/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/group14/775857669/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group14/775857669/src/com/coding/basic/JUnitTest.java b/group14/775857669/src/com/coding/basic/JUnitTest.java deleted file mode 100644 index 3cf54bc02c..0000000000 --- a/group14/775857669/src/com/coding/basic/JUnitTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.coding.basic; - -import static org.junit.Assert.*; - - -import org.junit.Test; - -public class JUnitTest { - @Test - public void testArrayList() { - ArrayList list = new ArrayList(); - for (int i = 0; i < 300; i++) { - list.add(i); - } - assertTrue(list.size() == 300); - list.add(3, 3); - assertTrue( (int)list.get(3) == 3 ); - assertTrue( (int)list.get(2) == 2 ); - assertTrue( (int)list.get(4) == 3 ); - assertTrue( (int)list.get(299) == 298 ); - assertTrue( (int)list.get(300) == 299 ); - assertTrue(list.size() == 301); - list.remove(3); - assertTrue( (int)list.get(3) == 3 ); - assertTrue( (int)list.get(2) == 2 ); - assertTrue( (int)list.get(4) == 4 ); - assertTrue( (int)list.get(299) == 299 ); - assertTrue(list.size() == 300); - Iterator iterator = list.iterator(); - while(iterator.hasNext()) { - System.out.print(iterator.next() + " "); - } - System.out.println(); - LinkedList linkedList = new LinkedList(); - for(int i=0 ; i<10 ; i++){ - linkedList.add(i); - } - assertTrue(linkedList.size() == 10); - Iterator iterator2 = linkedList.iterator(); - while(iterator2.hasNext()) { - System.out.print(iterator2.next() + " "); - } - linkedList.add(0, -1); - linkedList.add(11,10); - - assertTrue(linkedList.size() == 12); - assertTrue((int)linkedList.removeFirst() == -1); - - assertTrue((int)linkedList.removeLast() == 10); - assertTrue((int)linkedList.remove(5) == 5); - assertTrue(linkedList.size() == 9); - - Stack stack = new Stack(); - for (int i = 0; i < 10; i++) { - stack.push(i); - } - assertTrue(stack.size() == 10); - assertFalse(stack.isEmpty()); - assertTrue((int)stack.peek() == 9); - assertTrue((int)stack.pop() == 9); - assertTrue(stack.size() == 9); - System.out.println(); - for (int i=0 ; i<9 ; i++){ - System.out.print(stack.pop() + " "); - } - assertTrue(stack.isEmpty()); - } - -} diff --git a/group14/775857669/src/com/coding/basic/LinkedList.java b/group14/775857669/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 3756e9d59d..0000000000 --- a/group14/775857669/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private int size = 0; - - private Node head; - - public LinkedList() { - head = new Node(); - } - - public void add(Object o){ - Node temp = head; - for (int i=0 ; i size) { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - private void checkRange(int index) { - if (index < 0 || index >= size) { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - private static class Node{ - public Node() { - } - - public Node(Object data, Node next) { - super(); - this.data = data; - this.next = next; - } - - private Object data; - private Node next; - - } -} diff --git a/group14/775857669/src/com/coding/basic/List.java b/group14/775857669/src/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/group14/775857669/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group14/775857669/src/com/coding/basic/Queue.java b/group14/775857669/src/com/coding/basic/Queue.java deleted file mode 100644 index 0772c397fd..0000000000 --- a/group14/775857669/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList list = new LinkedList(); - - public void enQueue(Object o){ - list.add(o); - } - - public Object deQueue(){ - return list.removeFirst(); - } - - public boolean isEmpty(){ - return list.size() == 0; - } - - public int size(){ - return list.size(); - } -} diff --git a/group14/775857669/src/com/coding/basic/Stack.java b/group14/775857669/src/com/coding/basic/Stack.java deleted file mode 100644 index 64b1caebf5..0000000000 --- a/group14/775857669/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (!isEmpty()){ - return elementData.remove(elementData.size()-1); - } else { - return null; - } - - } - - public Object peek(){ - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group14/857999411/FirstHomework/.classpath b/group14/857999411/FirstHomework/.classpath deleted file mode 100644 index 373dce4005..0000000000 --- a/group14/857999411/FirstHomework/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group14/857999411/FirstHomework/.gitignore b/group14/857999411/FirstHomework/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group14/857999411/FirstHomework/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group14/857999411/FirstHomework/.project b/group14/857999411/FirstHomework/.project deleted file mode 100644 index e93e0072c0..0000000000 --- a/group14/857999411/FirstHomework/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - FirstHomework - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group14/857999411/FirstHomework/.settings/org.eclipse.jdt.core.prefs b/group14/857999411/FirstHomework/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group14/857999411/FirstHomework/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group14/857999411/FirstHomework/src/com/coding/basic/MyArrayList.java b/group14/857999411/FirstHomework/src/com/coding/basic/MyArrayList.java deleted file mode 100644 index 6e75248b73..0000000000 --- a/group14/857999411/FirstHomework/src/com/coding/basic/MyArrayList.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.basic; - -import java.util.*; - -public class MyArrayList implements MyList{ - //定义Object类型数组 - //定义数组元素个数 - private int size=0; - private Object [] elementData =new Object[10]; - - public void add(Object o) { - ensureCapacity(size+1); - elementData[size] = o; - size++; - } - - //添加指定位置的元 - public void add (int index,Object element){ - if(index > size || index < 0) - throw new IndexOutOfBoundsException("数组角标越界"); - ensureCapacity(size+1); - //添加指定位置元素 - //将该位置后的有元素右 - System.arraycopy(elementData,index,elementData,index+1,size-index); - elementData[index] =element; - size++; - } - - //可调整数组的容量 - public void ensureCapacity (int mincapacity){ - int oldlen =elementData.length; - if(mincapacity > oldlen){ - int newlen =(oldlen * 3)/2 + 1; - if(mincapacity > newlen) - newlen =mincapacity; - elementData =Arrays.copyOf(elementData,newlen); - } - } - - - //获取指定位置的元 - public Object get(int index){ - if(index < 0 || index >size-1){ - throw new IndexOutOfBoundsException("数组角标越界"); - } - return elementData[index]; - } - - public Object remove(int index){ - if(index >=size || index < 0){ - throw new IndexOutOfBoundsException("数组角标越界"); - } - Object oldelement =elementData[index]; - int numMoved = size-index-1; - if(numMoved > 0){ - System.arraycopy(elementData,index+1,elementData,index,numMoved); - } - size--; - return oldelement; - } - - public void clear(){ - elementData = null; - } - - public boolean isEmpty (){ - return size == 0; - } - - public int size (){ - return size; - } -} diff --git a/group14/857999411/FirstHomework/src/com/coding/basic/MyLinkedList.java b/group14/857999411/FirstHomework/src/com/coding/basic/MyLinkedList.java deleted file mode 100644 index 221a8c9092..0000000000 --- a/group14/857999411/FirstHomework/src/com/coding/basic/MyLinkedList.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.coding.basic; - -import java.util.*; - -public class MyLinkedList implements MyList{ - //用内部类定义链表中的节点 - private class Node{ - //节点中包含数据和引用 - Object data; - Node next; - - public Node (){ - - } - - //每个节点包含数据和引 - public Node (Object data,Node next){ - this.data =data; - this.next =next; - } - } - //定义头节点和尾节 - public Node head; - public Node tail; - public int size; - - //无参数构造函数创建空链表 - public MyLinkedList(){ - head =null; - tail =null; - } - - //链表中传入元 - public MyLinkedList(Object element){ - head.data =element; - head.next =tail; - size++; - } - - public void add(Object o){ - addLast(o); - } - public void addFirst(Object element) { - - head =new Node(element,head); - if(tail == null){ - tail=head; - } - size++; - } - - public void addLast(Object element) { - if(head == null) { - head =new Node (element,null); - tail =head; - }else{ - Node newNode =new Node(element,null); - tail.next =newNode; - tail=newNode; - } - size++; - - } - - public void add(int index,Object element){ - - if(index < 0 || index > size) { - throw new IndexOutOfBoundsException("索引越界"); - } - if(index == 0) { - head =new Node(element,head); - } - Node frontNode =getNode(index-1); - frontNode.next =new Node(element,frontNode.next); - size++; - } - public Node getNode(int index) - { - if(index < 0 || index > size-1) { - - throw new IndexOutOfBoundsException("索引越界"); - } - Node current=head; - for(int i=0;i < size; i++,current =current.next) { - if(i == index) { - return current; - } - } - return null; - } - - public Object get(int index){ - return getNode(index).data; - } - - public Object remove(int index){ - if(index < 0 || index > size-1) { - throw new IndexOutOfBoundsException("索引越界"); - } - Node delNode =null; - if(index == 0) { - delNode =head; - head =head.next; - }else{ - Node frontNode =getNode(index-1); - delNode =frontNode.next; - frontNode.next =delNode.next; - delNode.next =null; - } - size--; - return delNode.data; - } - - public Object removeFirst(){ - if(head == null || head.next == null) - throw new NoSuchElementException(); - Node oldhead =head; - head =head.next; - oldhead.next =null; - size--; - return oldhead.data; - - } - - public Object removeLast(){ - return remove(size - 1); - - } - - - public int size() { - return size; - } - - -} - - diff --git a/group14/857999411/FirstHomework/src/com/coding/basic/MyList.java b/group14/857999411/FirstHomework/src/com/coding/basic/MyList.java deleted file mode 100644 index 03fffb96c3..0000000000 --- a/group14/857999411/FirstHomework/src/com/coding/basic/MyList.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic; - -public interface MyList { - - public void add(Object o); - public void add(int index,Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group14/857999411/FirstHomework/src/com/coding/basic/MyQueue.java b/group14/857999411/FirstHomework/src/com/coding/basic/MyQueue.java deleted file mode 100644 index 3f397f69ec..0000000000 --- a/group14/857999411/FirstHomework/src/com/coding/basic/MyQueue.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.basic; - -public class MyQueue { - - MyLinkedList link =new MyLinkedList(); - - //入队 - public void enQueue(Object o){ - link.addLast(o); - } - //出队 - public Object deQueue(){ - return link.removeFirst(); - } - //判断是否为空 - public boolean isEmpty(){ - return link.size == 0; - } - //获取长度 - public int size(){ - return link.size; - } -} diff --git a/group14/857999411/FirstHomework/src/com/coding/basic/MyStack.java b/group14/857999411/FirstHomework/src/com/coding/basic/MyStack.java deleted file mode 100644 index c0d6395726..0000000000 --- a/group14/857999411/FirstHomework/src/com/coding/basic/MyStack.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.coding.basic; - -import java.util.*; - -public class MyStack { - - - MyArrayList elementData=new MyArrayList(); - - //入栈 - public void push(Object o){ - elementData.add(o); - } - - //出栈 - public Object pop(){ - - Object element =elementData.get(elementData.size() - 1); - elementData.remove(elementData.size()-1); - return element; - } - - //获取栈顶元素 - public Object peek(){ - int len =elementData.size(); - if(len == 0) - throw new EmptyStackException(); - Object element =elementData.get(len - 1); - return element; - } - - public int size(){ - return elementData.size(); - } - - public boolean isEmpty(){ - return elementData.size() == 0; - } - - public boolean empty(){ - return elementData.isEmpty(); - } - -} diff --git a/group14/857999411/FirstHomework/src/com/coding/test/MyArrayListTest.java b/group14/857999411/FirstHomework/src/com/coding/test/MyArrayListTest.java deleted file mode 100644 index a489b51623..0000000000 --- a/group14/857999411/FirstHomework/src/com/coding/test/MyArrayListTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding.test; - -import static org.junit.Assert.*; - -import org.junit.Test; - -import com.coding.basic.MyArrayList; - -public class MyArrayListTest { - - @Test - public void test() { - MyArrayList sa =new MyArrayList(); - sa.add(0,0); - sa.add(1,1); - sa.add(2,2); - sa.add(3,3); - - //System.out.println(sa.get(1)); - - for(int i=0; i - - - - - diff --git a/group15/1500_369516660/.gitignore b/group15/1500_369516660/.gitignore deleted file mode 100644 index 5e56e040ec..0000000000 --- a/group15/1500_369516660/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin diff --git a/group15/1500_369516660/.project b/group15/1500_369516660/.project deleted file mode 100644 index c2f1bb9994..0000000000 --- a/group15/1500_369516660/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - codingLeaning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group15/1500_369516660/src/com/arrayList/basic/List.java b/group15/1500_369516660/src/com/arrayList/basic/List.java deleted file mode 100644 index 698e06eb42..0000000000 --- a/group15/1500_369516660/src/com/arrayList/basic/List.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.arrayList.basic; -/** - * ɾ鷽 - * @author Jodie - * - */ -public interface List { - - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public String remove(Object o); - public int size(); - -} diff --git a/group15/1500_369516660/src/com/arrayList/basic/SimpleArrayList.java b/group15/1500_369516660/src/com/arrayList/basic/SimpleArrayList.java deleted file mode 100644 index d2f3af6329..0000000000 --- a/group15/1500_369516660/src/com/arrayList/basic/SimpleArrayList.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.arrayList.basic; - -import java.util.Arrays; - -/** - * - * @author Jodie - * - */ -public class SimpleArrayList implements List { - - private final static int default_num = 10;//ʱûжСĬΪ10 - private Object[] elementData; - private int size = 0;//ĴС,ʵĴС - - public SimpleArrayList(){ - this(default_num); - } - - public SimpleArrayList(int size) { - if(size<0){//ж϶ĴСǷС0 - throw new IllegalArgumentException(); - }else{ - elementData = new Object[size]; - } - } - -/** - * дӺķ1 - */ - @Override - public void add(Object o) { - //жǷҪ - ifSpaceEnougn(size+1); - elementData[size++]=o; - } - -/** - * дӺķ2 - */ - @Override - public void add(int index, Object o) { - checkIfOut(index);//ǷԽ - ifSpaceEnougn(size+1);//ǷҪ - System.arraycopy(elementData, index, elementData, index + 1, size-index);//indexԪؼԺԪһλ - } -/** - * õָ± - */ - @Override - public Object get(int index) { - checkIfOut(index); - return elementData[index]; - } -/** - * ɾָ± - */ - @Override - public Object remove(int index) { - Object value = get(index); - int numRemove = size - index - 1; - if(numRemove > 0){ - System.arraycopy(elementData, index+1, elementData, index, size - index);//ǰһλ - } - elementData[--size] = null; - return value; - } -/** - * ɾָ - */ - @Override - public String remove(Object o) { - if(contains(o)){ - remove(indexOf(o)); - return "ɾɹ"; - }else{ - return "ҪɾݲУɾʧ"; - } - } -/** - * жǷҪ - * @param size - */ - private void ifSpaceEnougn(int size) { - if(size>default_num){ - exlicitSpace(size); - } - if(size<0){//sizeInteger.MAX_VALUEʱΪ - throw new OutOfMemoryError(); - } - } -/** - * ݷ - * @param - */ - private void exlicitSpace(int size) { - final int max_arrayLength = Integer.MAX_VALUE-8; - int newLength = elementData.length*2;//һΪԭƵ - if(newLength - size<0){ - newLength = size; - } - if(newLength > max_arrayLength){//ݺĴСֵ - newLength = (size > max_arrayLength ? Integer.MAX_VALUE : max_arrayLength); - } - elementData = Arrays.copyOf(elementData, newLength); - } - -/** - * жǷԽ - * @param index - */ - private void checkIfOut(int index) { - if(index<0 || index>size){ - throw new IndexOutOfBoundsException(); - } - } - -/** - * ҵָ± - * @param o - * @return - */ -private int indexOf(Object o) { - if(o!=null){ - for(int i=0;i= 0; - } - - @Override - public int size() { - return size; - } - - -} diff --git a/group15/1500_369516660/src/com/arrayList/basic/SimpleLinkedList.java b/group15/1500_369516660/src/com/arrayList/basic/SimpleLinkedList.java deleted file mode 100644 index 646c2ab656..0000000000 --- a/group15/1500_369516660/src/com/arrayList/basic/SimpleLinkedList.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.arrayList.basic; - -public class SimpleLinkedList implements List { - - private int size;//ĴС - private Node head; - - @Override - public void add(Object o) { - - } - - @Override - public void add(int index, Object o) { - - } - - @Override - public Object get(int index) { - return null; - } - - @Override - public Object remove(int index) { - return null; - } - - @Override - public String remove(Object o) { - return null; - } - - @Override - public int size() { - return 0; - } - -} diff --git a/group15/1501_2535894075/2017code/src/arraylist.java b/group15/1501_2535894075/2017code/src/arraylist.java deleted file mode 100644 index 01e3be56e7..0000000000 --- a/group15/1501_2535894075/2017code/src/arraylist.java +++ /dev/null @@ -1,252 +0,0 @@ -package firstweek; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -public class arraylist implements List { - ArrayList q=new ArrayList(); - - private static final int InitialValue=10; - - private static final Object[] Empty_Elementdata={}; - - private Object[] elementData = new Object[100]; - - private int size = 0; - - public boolean add(Object o){ - if(elementData==Empty_Elementdata){ - //ΪʼΪ10 - elementData[0]=o; - } - if(size==elementData.length){ - //copy鲢50% - int oldLength=elementData.length; - int newLength=oldLength+(oldLength>>1); - if(newLength-oldLength>0){ - elementData=Arrays.copyOf(elementData, newLength); - } - } - elementData[size++]=o; - return true; - - } - public void add(int index, Object o){ - if(elementData==Empty_Elementdata){ - elementData[0]=o; - System.out.print("һµֻиԪص"); - return ; - } - if(size==elementData.length){ - int oldLength=elementData.length; - int newLength=oldLength+(oldLength>>1); - if(newLength-oldLength>0){ - System.arraycopy(elementData, index, elementData,index+1 ,size-index); - } - } - elementData[index]=o; - size++; - } - - public Object get(int index){ - rangecheck(index); - return elementData[index]; - } - - public Object remove(int index){ - rangecheck(index); - Object oldValue=elementData(index); - int numMove=size-index-1; - if(numMove>0){ - System.arraycopy(elementData, index+1, elementData, index, numMove); - } - elementData[--size]=null; - return true; - } - public boolean removeObject(Object o){ - if(o==null){ - for(int index=0;index elementData(int index) { - // TODO Auto-generated method stub - return null; - } - public int size(){ - return size; - } - @Override - public boolean isEmpty() { - // TODO Auto-generated method stub - return size==0; - } - @Override - public boolean contains(Object o) { - // TODO Auto-generated method stub - return 0>=indexOf(o); - } - @Override - public Iterator iterator() { - // TODO Auto-generated method stub - // - return null; - } - @Override - public Object[] toArray() { - // TODO Auto-generated method stub - return Arrays.copyOf(elementData,size); - } - @Override - public Object[] toArray(Object[] a) { - - // TODO Auto-generated method stub - return null; - } - @Override - public boolean remove(Object o) { - // TODO Auto-generated method stub - if(o==null){ - for(int i=0;isize||index<0){ - System.out.println("ѯΧ"); - return null; - } - elementData[index]=element; - return null; - } - @Override - public int indexOf(Object o) { - // TODO Auto-generated method stub - if(o==null){ - for(int i=0;i= this.size) - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - private String outOfBoundsMsg(int index) { - return "Index: "+index+", Size: "+this.size; - } - private void fastremove(int index){ - int numMoved=size-index-1; - if(numMoved>0){ - System.arraycopy(elementData, index+1, elementData, index, numMoved); - } - elementData[--size]=null; - } - -} diff --git a/group15/1501_2535894075/2017code/src/linkedlist.java b/group15/1501_2535894075/2017code/src/linkedlist.java deleted file mode 100644 index 04a99762e5..0000000000 --- a/group15/1501_2535894075/2017code/src/linkedlist.java +++ /dev/null @@ -1,194 +0,0 @@ -package firstweek; - - -import java.util.NoSuchElementException; - -public class linkedlist { - private int size=0; - - private node first; - - private node next; - - private node last; - - public linkedlist(){ - - } - - private void linkFirst(E e){ - final node f=first; - final node newnode=new node(null,e,f); - first=newnode; - if(f==null){ - last=f; - }else{ - f.pre=newnode; - } - size++; - } - - void linkLast(E e){ - final node l=last; - final node newnode=new node(l,e,null); - last=newnode; - if(last==null){ - last=l; - }else{ - l.next=newnode; - } - } - - void linkbefore(E e,node nodes ){ - final node pre=nodes.pre; - final node newnode=new node<>(pre,e,nodes); - nodes.pre=newnode; - if(pre==null){ - first=newnode; - }else{ - pre.next=newnode; - } - size++; - } - - private E unlinkFirst(node f){ - //ɾһǿսڵ ȷfΪһڵ㲢ǿ - final E item=f.item; - final node next=f.next; - f.item=null; - f.next=null;//Ϊgc - first=next; - if(next==null){ - last=null; - }else{ - next.pre=null; - } - size--; - return item; - } - private E unlinkLast(node l){ - //ɾһǿսڵ ȷlΪڵҷǿ - final E item=l.item; - final node pre=l.pre; - l.item=null; - l.pre=null; - last=pre; - if(pre==null){ - first=null; - }else{ - pre.next=null; - } - size--; - return item; - } - - E unlinekd(node e){ - final node pre=e.pre; - final node next=e.next; - if(size==0){ - System.out.println("Ϊ ɾ"); - return e.item; - } - if(e==last){ - if(size==1){ - last=null; - first=null; - size--; - return e.item; - } - last=pre; - pre.next=null; - size--; - return e.item; - } - if(e==first){ - if(size==1){ - first=null; - last=null; - size--; - return e.item; - } - size--; - first=next; - next.pre=null; - return e.item; - } - pre.next=next; - next.pre=pre; - size--; - return e.item; - } - - public E getFirst(){ - final node f=first; - if(f==null){ - throw new NoSuchElementException(); - } - return f.item; - } - - public E getLast(){ - final node l=last; - if(l==null){ - throw new NoSuchElementException(); - } - return l.item; - } - public E removeFirst(){ - final node f=first; - if(f==null){ - throw new NoSuchElementException(); - } - return unlinkFirst(f); - } - public E removeLast(){ - final node l=last; - if(l==null){ - throw new NoSuchElementException(); - } - return unlinkLast(l); - } - public void addLast(E e){ - linkLast(e); - } - public void addFirst(E e){ - linkFirst(e); - } - public int size(){ - return size; - } - public boolean add(E e){ - linkLast(e); - return true; - } - public int indexof(Object o){ - int index=0; - if(o==null){ - for(node x=first;x!=null;x=x.next){ - if(x.item==null){ - return index; - } - index++; - } - }else{ - for(node x=first;x!=null;x=x.next){ - if(o.equals(x.item)){ - return index; - } - index++; - } - } - return -1; - } -} - -class node{ - E item; - node pre; - node next; - node(node pre,E item,node next){ - this.pre=pre; - this.next=next; - this.item=item; - } -} diff --git a/group15/1501_2535894075/2017code/src/queue.java b/group15/1501_2535894075/2017code/src/queue.java deleted file mode 100644 index 8a9646a2ea..0000000000 --- a/group15/1501_2535894075/2017code/src/queue.java +++ /dev/null @@ -1,115 +0,0 @@ -package firstweek; -import java.util.AbstractList; -import java.util.Iterator; -import java.util.List; - -public class queue extends AbstractList implements List ,java.io.Serializable { - - private static final long serialVersionUID = 6203363761107460505L; - - // ָͷ - private transient Entry front; - - private transient int size ; - // ָβ - private transient Entry rear; - - public Iterator singleListIterator() { - return new QueueIterator(); - } - - public queue() { - this.front = this.rear = null; - } - - @Override - public boolean add(E e) { - Entry newData = new Entry(e, null); - if (this.rear == null) { - this.rear = newData; - this.front = this.rear; - } else { - Entry preElement = this.front; - while (preElement.next != null) { - preElement = preElement.next; - } - preElement.next = newData; - } - size ++; - return true; - } - - /** - * βԪ - * @param e - * @return - */ - public boolean append(E e) { - return add(e); - } - - /** - * ȡͷ - */ - @Override - public E get(int index) { - return this.front.element; - } - - public E getFrist() { - return get(0); - } - - /** - * - * @return - */ - public E delete() { - E result = null; - Entry entry = this.front; - if (entry != null) { - result = entry.element; - this.front = entry.next; - entry = null; - } - size --; - return result; - } - - /** - * ӳ - */ - @Override - public int size() { - return size; - } - - private static class Entry { - E element; - Entry next; - public Entry(E element, Entry next) { - this.element = element; - this.next = next; - } - } - - private class QueueIterator implements Iterator { - private Entry itFront = front; - @Override - public boolean hasNext() { - return itFront != null; - } - - @Override - public E next() { - E result = itFront.element ; - itFront = itFront.next; - return result; - } - - @Override - public void remove() { - throw new UnsupportedOperationException("can not remove"); - } - } -} \ No newline at end of file diff --git a/group15/1501_2535894075/2017code/src/stack.java b/group15/1501_2535894075/2017code/src/stack.java deleted file mode 100644 index 64cf55168b..0000000000 --- a/group15/1501_2535894075/2017code/src/stack.java +++ /dev/null @@ -1,71 +0,0 @@ -package firstweek; - -import java.util.Arrays; - -public class stack { - //Define capacity constant:CAPACITY - private static final int CAPACITY = 1024; - //Define capacity - private static int capacity; - //Define the top position of stack - //top = -1 meaning that the stack empty - private static int top = -1; - //Basic Object class array - Object[] array; - //Initialize the capacity of stack - public stack() { - this.capacity = CAPACITY; - array = new Object[capacity]; - } - - //Get the size of stack - public int getSize(){ - if(isEmpty()){ - return 0; - }else{ - return top + 1; - } - } - - //Get whether stack is empty - public boolean isEmpty(){ - return (top < 0); - } - - //Get the top element of stack - public Object top() { - - if(isEmpty()){ - System.out.println("Stack is empty"); - } - return array[top]; - - } - - //Push element to stack - public void push(Object element) throws Exception{ - if(getSize()== CAPACITY){ - throw new Exception("Stack is full"); - } - array[++ top] = element; - } - - //Pop element from stack - public Object pop() { - if(isEmpty()){ - System.out.println("Stack is empty"); - } - return array[top --]; - } - - - public String getAllElements() { - String[] arr = new String[top + 1]; - if(!isEmpty()){ - for(int i = 0;i < getSize();i ++){ - arr[i] = (String)array[i]; - } - } - return Arrays.toString(arr); - } -} diff --git a/group15/1502_1617273078/src/com/coding/basic/ArrayList.java b/group15/1502_1617273078/src/com/coding/basic/ArrayList.java deleted file mode 100644 index cdf06c0a6d..0000000000 --- a/group15/1502_1617273078/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; -import java.util.ConcurrentModificationException; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[5]; - - public void add(Object o) { - add(size(),o); - //size++; - } - - public void add(int index, Object o) { - if (size+1 > elementData.length) { - Object[] newelementData = new Object[elementData.length * 2]; - System.arraycopy(elementData,0,newelementData,0,elementData.length); - System.arraycopy(newelementData,index,newelementData,index+1,newelementData.length-index-1); - newelementData[index] = o; - elementData = newelementData; - newelementData = null; - size = size + 1; -// Arrays.copyOf() - } else { - System.arraycopy(elementData,index,elementData,index+1,elementData.length-index-1); - elementData[index] = o; - size=size+1; - } - -} - - public Object get(int index) { - - return elementData[index]; - } - - public Object remove(int index) { - System.arraycopy(elementData,index+1,elementData,index,size-2); - return elementData; - } - - public int size() { - return size; - } - - public Iterator iterator() { - - return new Iterator() { - int cuindex = 0; - int lastRet = -1; - - @Override - public boolean hasNext() { - return cuindex != size; - } - - @Override - public Object next() { - int i = cuindex; - if (i>=size){ - throw new NoSuchElementException(); - } - if (i >= elementData.length) - throw new ConcurrentModificationException(); - cuindex = i + 1; - return elementData[lastRet=i]; - } - - }; - } - - -} diff --git a/group15/1502_1617273078/src/com/coding/basic/Iterator.java b/group15/1502_1617273078/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group15/1502_1617273078/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group15/1502_1617273078/src/com/coding/basic/LinkedList.java b/group15/1502_1617273078/src/com/coding/basic/LinkedList.java deleted file mode 100644 index f10225fb5e..0000000000 --- a/group15/1502_1617273078/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - private int thesize; - private Node head; - public void add(Object o){ - if (head == null) { - head = new Node(); - head.data = o; - head.next = null; - thesize++; - } else { - addLast(o); - //thesize++; - } - } - public void add(int index , Object o){ - if (index > thesize) { - throw new IndexOutOfBoundsException(); - } else if (index == thesize) { - addLast(o); - //thesize++; - } else if(index= thesize) { - throw new IndexOutOfBoundsException(); - } else{ - Node x = head; - int i=0; - do { - x = x.next; - i++; - } while (i == index); - return x.data; - } - } - public Object remove(int index){ - Node x = head; - for (int i = 1; i =length){ - grow(100); - } - elementData[size]=o; - size++; - } - public void add(int index, Object o){ - size++; - if(size>=length){ - grow(100); - } - System.arraycopy(elementData,index,elementData,index+1,size-index-1); - elementData[index]=o; - } - - public Object get(int index){ - if(index=size) - throw new IndexOutOfBoundsException(); - size--; - Object a=elementData[index]; - //刚好最后一个 - if (index+1==size){ - return a; - } - System.arraycopy(elementData,index+1,elementData,index,size); - return a; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - private class ArrayListIterator implements Iterator{ - private int index=0; - @Override - public boolean hasNext() { - if(index+1o){ - if(right==null){ - right=b; - return b; - } - right.insert(o); - } - return b; - } - - public void showAll(){ - if(right!=null){ - right.showAll(); - } - System.out.print(data+" "); - if(left!=null){ - left.showAll(); - } - - } - - - -} diff --git a/group15/1503_1311822904/myCollection/src/Iterator.java b/group15/1503_1311822904/myCollection/src/Iterator.java deleted file mode 100644 index 96a43dbe0a..0000000000 --- a/group15/1503_1311822904/myCollection/src/Iterator.java +++ /dev/null @@ -1,5 +0,0 @@ -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group15/1503_1311822904/myCollection/src/LinkedList.java b/group15/1503_1311822904/myCollection/src/LinkedList.java deleted file mode 100644 index 69fad47ace..0000000000 --- a/group15/1503_1311822904/myCollection/src/LinkedList.java +++ /dev/null @@ -1,182 +0,0 @@ -public class LinkedList implements List { - private int size = 0; - private Node head=new Node(null); - - public void add(Object o){ - if(head.data==null){ - head.data=o; - return; - } - Node n=head; - while (n.next!=null){ - n=n.next; - } - n.next=new Node(o); - size++; - } - public void add(int index , Object o){ - Node n=getNode(index); - Node newN=new Node(o); - newN.next=n.next; - n.next=newN; - size++; - } - public Object get(int index){ - return getNode(index).data; - } - private Node getNode(int index){ - Node n=head; - for (int i=0;i - - - - - diff --git a/group15/1506_1084478979/1506_1084478979/.gitignore b/group15/1506_1084478979/1506_1084478979/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group15/1506_1084478979/1506_1084478979/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group15/1506_1084478979/1506_1084478979/.project b/group15/1506_1084478979/1506_1084478979/.project deleted file mode 100644 index 13c7a33b93..0000000000 --- a/group15/1506_1084478979/1506_1084478979/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 1506_1084478979 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.jdt.core.prefs b/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java b/group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java deleted file mode 100644 index d3afe067a7..0000000000 --- a/group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java +++ /dev/null @@ -1,70 +0,0 @@ -package banshee; - -import java.util.Arrays; -public class ArrayList { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - ensureCapacity(size + 1); - elementData[size++] = o; - } - public void add(int index, Object o){ - rangeCheck(index); - ensureCapacity(size+1); - System.arraycopy(elementData, index, elementData, index + 1, - size - index); - elementData[index] = o; - size++; - } - - public Object get(int index){ - rangeCheck(index); - return elementData[index]; - } - - public Object remove(int index){ - rangeCheck(index); - Object oldValue = elementData[index]; - int numMoved = size - index - 1; - if (numMoved > 0) - System.arraycopy(elementData, index + 1, elementData, index, - numMoved); - elementData[--size] = null; - return oldValue; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - //TODO - //ᡣ - return null; - } - - - private void rangeCheck( int index) { - if (index >= size || index < 0){ - throw new IndexOutOfBoundsException("ָindex"); - } - } - - - public void ensureCapacity(int minCapacity) { - int oldCapacity = elementData.length; - if (minCapacity > oldCapacity) { - //µСΪǰ1.5 - int newCapacity = (oldCapacity * 3) / 2 + 1; - if (newCapacity < minCapacity) - newCapacity = minCapacity; - elementData = Arrays.copyOf(elementData, newCapacity); - } - } - -} - - diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java b/group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java deleted file mode 100644 index f5fe5b5a31..0000000000 --- a/group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java +++ /dev/null @@ -1,154 +0,0 @@ -package banshee; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - private Node last; - private int size = 0; - - public void add(Object o){ - addAtLast(o); - } - public void add(int index , Object o){ - rangeCheck(index); - if (index == size) { - addAtLast(o); - }else{ - linkBrfore(o, node(index)); - } - } - public Object get(int index){ - rangeCheck(index); - return node(index); - } - public Object remove(int index){ - Node e = node(index); - remove(e); - return null; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - final Node h = head ; - final Node newNode = new Node(null, o, h); - if (h == null) { - last = newNode; - }else{ - h.prev = newNode; - } - size++; - } - public void addLast(Object o){ - addAtLast(o); - } - public Object removeFirst(){ - final Node h = head; - final Object e = h.data; - Node next = h.next; - h.data = null; - h.next = null; - head = next; - if (next == null) - last = null; - else - next.prev = null; - size--; - return e; - } - public Object removeLast(){ - final Node l = last; - final Object e = l.data; - Node newL = l.prev; - l.data = null; - l.prev = null; - last = newL; - if (newL == null) - head = null; - else - newL.next = null; - size--; - return e; - } - public Iterator iterator(){ - //TODO - //... - return null; - } - - - private static class Node{ - Object data; - Node next; - Node prev; - - Node(Node prev, Object element,Node next){ - this.data = element ; - this.next = next; - this.prev = prev ; - } - } - - private void addAtLast(Object element){ - Node l = last; - Node newLink = new Node(l, element, null); - last = newLink; - if (l == null) { - head = newLink; - }else { - l.next = newLink; - } - size++; - } - - private void linkBrfore(Object element , Node spNode ){ - final Node pred = spNode.prev; - final Node newNode = new Node(pred, element, spNode); - spNode.prev = newNode; - if (pred == null) { - head = newNode; - }else{ - pred.next = newNode; - } - size++; - } - - private void rangeCheck(int index) { - if (index > size || index < 0) { - throw new IndexOutOfBoundsException("ָindex"); - } - } - - private Node node(int index) { - if (index < (size >> 1)) { - Node x = head; - for (int i = 0; i < index; i++) - x = x.next; - return x; - } else { - Node x = last; - for (int i = size - 1; i > index; i--) - x = x.prev; - return x; - } - } - - private Object remove(Node e) { - if (e == head ) - throw new NoSuchElementException(); - Object result = e. data; - e. prev.next = e.next; - e. next.prev = e.prev; - e. next = e.prev = null; - e. data = null; - size--; - return result; - } - -} - - diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/Queue.java b/group15/1506_1084478979/1506_1084478979/src/banshee/Queue.java deleted file mode 100644 index 2886d458f3..0000000000 --- a/group15/1506_1084478979/1506_1084478979/src/banshee/Queue.java +++ /dev/null @@ -1,20 +0,0 @@ -package banshee; - -public class Queue { - private LinkedList elementData = new LinkedList(); - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - return elementData.removeFirst(); - } - - public boolean isEmpty(){ - return elementData.size() == 0 ? true : false; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/Stack.java b/group15/1506_1084478979/1506_1084478979/src/banshee/Stack.java deleted file mode 100644 index e1ec7a9ab3..0000000000 --- a/group15/1506_1084478979/1506_1084478979/src/banshee/Stack.java +++ /dev/null @@ -1,23 +0,0 @@ -package banshee; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return elementData.size()==0?true:false; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group15/1506_1084478979/RemoteSystemsTempFiles/.project b/group15/1506_1084478979/RemoteSystemsTempFiles/.project deleted file mode 100644 index 5447a64fa9..0000000000 --- a/group15/1506_1084478979/RemoteSystemsTempFiles/.project +++ /dev/null @@ -1,12 +0,0 @@ - - - RemoteSystemsTempFiles - - - - - - - org.eclipse.rse.ui.remoteSystemsTempNature - - diff --git a/group15/1507_977996067/README.md b/group15/1507_977996067/README.md deleted file mode 100644 index 78a3f19258..0000000000 --- a/group15/1507_977996067/README.md +++ /dev/null @@ -1 +0,0 @@ -### qq 977996067 的作业文件夹 \ No newline at end of file diff --git a/group15/1507_977996067/src/task1/MyArrayList.java b/group15/1507_977996067/src/task1/MyArrayList.java deleted file mode 100644 index e4d01a2c06..0000000000 --- a/group15/1507_977996067/src/task1/MyArrayList.java +++ /dev/null @@ -1,95 +0,0 @@ -package task1; - -import java.util.Arrays; -import java.util.Iterator; - -/** - * ArrayList实现 - */ -public class MyArrayList implements MyList { - - //列表元素的个数 - private int size; - //列表存放的元素 - private Object[] elements; - //初始容量10 - private static final int DEFAULT_CAPACITY = 10; - - public MyArrayList() { - elements = new Object[DEFAULT_CAPACITY]; - } - - public MyArrayList(int capacity) { - elements = new Object[capacity <= DEFAULT_CAPACITY ? DEFAULT_CAPACITY : capacity]; - } - - @Override - public void add(T o) { - add(size, o); - } - - @Override - public void add(int index, T o) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("index " + index + " 不合法"); - if (size >= elements.length) - ensureCapacity((size >> 1) + size); - elements[index] = o; - size++; - } - - @Override - @SuppressWarnings("unchecked") - public T get(int index) { - if (index < 0 || index >= size) - throw new IndexOutOfBoundsException("index " + index + " 越界"); - return (T) elements[index]; - } - - @Override - @SuppressWarnings("unchecked") - public T remove(int index) { - if (index < 0 || index >= size) - throw new IndexOutOfBoundsException("index " + index + " 越界"); - T removeElement = (T) elements[index]; - System.arraycopy(elements, index + 1, elements, index, elements.length - index - 1); - size--; - return removeElement; - } - - @Override - public int size() { - return size; - } - - public Iterator iterator() { - return new MyItr(); - } - - private void ensureCapacity(int newCapacity) { - elements = Arrays.copyOf(elements, newCapacity); - } - - private class MyItr implements Iterator { - - private int current = 0; - - @Override - public boolean hasNext() { - return current < size; - } - - @Override - @SuppressWarnings("unchecked") - public T next() { - return (T) elements[current++]; - } - - @Override - public void remove() { - if (current == 0) - throw new IllegalStateException("先调用next后才能再调用remove"); - MyArrayList.this.remove(--current); - } - } -} diff --git a/group15/1507_977996067/src/task1/MyLinkedList.java b/group15/1507_977996067/src/task1/MyLinkedList.java deleted file mode 100644 index fa5d651078..0000000000 --- a/group15/1507_977996067/src/task1/MyLinkedList.java +++ /dev/null @@ -1,130 +0,0 @@ -package task1; - -import java.util.Iterator; - -/** - * LinkedList 实现 - */ -public class MyLinkedList implements MyList { - - //存放的元素数量 - private int size; - - private Node head; - - public MyLinkedList() { - head = new Node<>(null, null); - } - - @Override - public void add(T o) { - add(size, o); - } - - @Override - public void add(int index, T o) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("index " + index + " 不合法"); - Node targetNode = new Node<>(null, o); - Node targetPrevNode = getPrevNode(index); - targetNode.next = targetPrevNode.next; - targetPrevNode.next = targetNode; - size++; - } - - @Override - public T get(int index) { - checkIndexRange(index); - return getPrevNode(index).next.data; - } - - - @Override - public T remove(int index) { - checkIndexRange(index); - Node prevNode = getPrevNode(index); - Node nodeToRemove = prevNode.next; - prevNode.next = nodeToRemove.next; - size--; - return nodeToRemove.data; - } - - @Override - public int size() { - return size; - } - - public void addFirst(T o) { - add(0, o); - - } - - public void addLast(T o) { - add(size, o); - } - - public T removeFirst() { - return remove(0); - } - - public T removeLast() { - return remove(size - 1); - } - - - public Iterator iterator() { - return new MyLinkedItr(); - } - - /** - * 找到位置为index的前一个node - * - * @param index 索引值 - */ - - private Node getPrevNode(int index) { - Node targetPrevNode = head; - for (int i = 0; i < index; i++) { - targetPrevNode = targetPrevNode.next; - } - return targetPrevNode; - } - - /** - * 检查索引是否越界 - * - * @param index 索引值 - */ - private void checkIndexRange(int index) { - if (index < 0 || index >= size) - throw new IndexOutOfBoundsException("index " + index + " 越界"); - } - - private static class Node { - private Node next; - private T data; - - private Node(Node next, T data) { - this.next = next; - this.data = data; - } - } - - private class MyLinkedItr implements Iterator { - - private Node currentNode = head; - - @Override - public boolean hasNext() { - return currentNode.next != null; - } - - @Override - public T next() { - Node nextNode = currentNode.next; - T data = nextNode.data; - currentNode = nextNode; - return data; - } - } -} diff --git a/group15/1507_977996067/src/task1/MyList.java b/group15/1507_977996067/src/task1/MyList.java deleted file mode 100644 index e68f445174..0000000000 --- a/group15/1507_977996067/src/task1/MyList.java +++ /dev/null @@ -1,16 +0,0 @@ -package task1; - -/** - * List 接口 - */ -public interface MyList { - public void add(T o); - - public void add(int index, T o); - - public T get(int index); - - public T remove(int index); - - public int size(); -} diff --git a/group15/1507_977996067/src/task1/MyQueue.java b/group15/1507_977996067/src/task1/MyQueue.java deleted file mode 100644 index 2ae3d8529f..0000000000 --- a/group15/1507_977996067/src/task1/MyQueue.java +++ /dev/null @@ -1,25 +0,0 @@ -package task1; - -/** - * Queue 实现 - */ -public class MyQueue { - private MyLinkedList elementData = new MyLinkedList(); - - public void enQueue(T o) { - elementData.addFirst(o); - } - - public T deQueue() { - return elementData.removeLast(); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } - -} diff --git a/group15/1507_977996067/src/task1/MyStack.java b/group15/1507_977996067/src/task1/MyStack.java deleted file mode 100644 index 476caf67e2..0000000000 --- a/group15/1507_977996067/src/task1/MyStack.java +++ /dev/null @@ -1,29 +0,0 @@ -package task1; - -/** - * Stack 实现 - */ -public class MyStack { - private MyLinkedList elementData = new MyLinkedList(); - - public void push(T o) { - elementData.addFirst(o); - } - - public T pop() { - return elementData.removeFirst(); - } - - public T peek() { - return elementData.get(0); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } - -} diff --git a/group15/1507_977996067/src/task1/README.md b/group15/1507_977996067/src/task1/README.md deleted file mode 100644 index d012aef953..0000000000 --- a/group15/1507_977996067/src/task1/README.md +++ /dev/null @@ -1 +0,0 @@ -###2.26作业:实现简单的数据结构 \ No newline at end of file diff --git a/group15/1510_739253131/src/com/bruce/homework0226/ArrayListV00.java b/group15/1510_739253131/src/com/bruce/homework0226/ArrayListV00.java deleted file mode 100644 index 3137c7568b..0000000000 --- a/group15/1510_739253131/src/com/bruce/homework0226/ArrayListV00.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.bruce.homework0226; - -import com.bruce.utils.MyException; - -import java.io.Serializable; -import java.util.Arrays; - -/** - * 用数组实现ArrayList基本功能:add,remove,size,contains,toArray方法 - * @Version: 0.0 - * Created by Bruce.Jiao on 17-2-23. - */ -public class ArrayListV00 implements Serializable { - - /** - * 存放集合元素的数组 - */ - private transient Object[] elementData; - /** - * 集合中元素的个数 - */ - private int size; - - /** - * 空构造,默认数组长度为10 - */ - public ArrayListV00() throws MyException { - this(10); - } - - /** - * 有参构造 - * - * @param initCapacity - * 用户传入的集合大小,底层数组的初始化大小 - */ - public ArrayListV00(int initCapacity) throws MyException{ - if(initCapacity < 0){ - throw new MyException("集合大小不能小于0"); - } - elementData = new Object[initCapacity]; - } - - /** - * 向集合中添加元素 - * - * @param value - * 添加的元素,允许添加null - * @return true:添加成功 ; false:添加失败 - */ - public boolean add(Object value) { - // 添加元素之前,对数组长度进行判断,此处需要传入当前元素个数+1, - ensureCapacity(size + 1); - elementData[size++] = value; - return true; - } - - /** - * 返回指定位置的元素 数组和集合,下标从1开始 - * - * @param index - * 用户指定的位置 - * @return - */ - public Object get(int index) throws MyException { - // 判断是否越界,注意:此处判断依据是size,而不能是elementData.length, - // 集合元素个数size小于等于elementData.length - if (index >= size || index < 0) { - throw new MyException("给定数值超出集合范围"); - } - return elementData[index]; - } - - /** - * 删除指定位置的元素 - * - * @param index - * 用户指定位置,从0开始 - * @return 返回删除掉的指定位置的元素 - */ - public Object remove(int index) throws MyException { - if (index >= size || index < 0) { - throw new MyException("给定数值超出集合范围"); - } - Object value = elementData[index]; - // 数组中被删除元素后边的所有元素的个数,此处不能使用elementData.length - int length = size - 1 - index; - // 被删除位置后还有元素,将数组中被删除位置往后(不包含被删除位置)的所有元素往前移动一位 - if (length > 0) { - System.arraycopy(elementData, index + 1, elementData, index, length); - } - elementData[--size] = null; - return value; - } - - /** - * 判断集合中是否包含指定的元素 - * - * @param value - * 用户制定的元素 - * @return true:包含指定元素;false:不包含指定元素 - */ - public boolean contains(Object value) { - for (int i = 0; i < elementData.length; i++) { - if (value == null) { - if (elementData[i] == null) { - return true; - } - } else { - if (value.equals(elementData[i])) { - return true; - } - } - } - return false; - } - - /** - * 得到集合对应的静态数组 - * - * @return 底层数组 - */ - public Object[] toArray() { - //elementData可能会包含null元素,不能直接返回,需返回一个包含集合所有元素的新数组 -// return elementData; - return Arrays.copyOf(elementData,size); - } - - /** - * 返回集合大小 - * - * @return - */ - public int size() { - return size; - } - - /** - * 传入的数值与数组长度进行比较,长度小于传入数值,对数组进行扩容 - * - * @param minCapacity - * 传入的数值 - */ - public void ensureCapacity(int minCapacity) { - int oldCapacity = elementData.length; - // 如果传入数值大于现有数组长度,对现有数组进行扩容 - if (minCapacity > oldCapacity) { - // 此处用新的局部变量引用指向原有数组的内存地址,仅为了避免复制数组元素到新数组时候,发生原有数组内存地址被覆盖的情况 - Object[] oldArray = elementData; - // 先得到现有数组长度1.5倍的值 - int newCapacity = oldCapacity + oldCapacity >> 1; - // 如果增加1.5倍后的数值仍然小于传入的数值,将传入的数值赋给新数组长度 - if (minCapacity > newCapacity) { - newCapacity = minCapacity; - } - // 将elementData引用指向一个新的扩容后的数组,并且将原有数组的元素复制到新数组中 - elementData = Arrays.copyOf(elementData, newCapacity); - } - } - - /** - * 重写toString方法,查看集合具体内容 - * @return - */ - @Override - public String toString() { - return Arrays.toString(elementData); - } - - /** - * 仅仅作为自己查看底层数组长度的方法, - * @return - */ - int arrayLength() { - return elementData.length; - } -} diff --git a/group15/1510_739253131/src/com/bruce/homework0226/JuintTest.java b/group15/1510_739253131/src/com/bruce/homework0226/JuintTest.java deleted file mode 100644 index b0aa452f6d..0000000000 --- a/group15/1510_739253131/src/com/bruce/homework0226/JuintTest.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.bruce.homework0226; - -import com.bruce.utils.MyException; -import junit.framework.TestCase; -import org.junit.Test; -import java.util.Arrays; -import java.util.Random; - -/** - * Created by Bruce.Jiao on 17-2-23. - */ -public class JuintTest extends TestCase{ - - @Test - public void testArrayList(){ - try { - ArrayListV00 arrayList = new ArrayListV00(0); - arrayList.add("aaa"); - arrayList.add("bbb"); - arrayList.add("ccc"); - arrayList.add("fff"); - arrayList.add("ggg"); - System.out.println("集合下标2处的元素:"+arrayList.get(2)); - System.out.println("是否包含ccc这个元素:"+arrayList.contains("ccc")); - System.out.println("是否包含ddd这个元素:"+arrayList.contains("ddd")); - System.out.println("删除前集合大小为:"+arrayList.size()); - System.out.println("删除下标2处元素前底层数组:"+arrayList); - arrayList.remove(2); - System.out.println("删除下标2处元素后底层数组:"+arrayList); - System.out.println("删除一个元素后集合大小为:"+arrayList.size()); - arrayList.remove(2); - System.out.println("再删除下标2处元素后底层数组:"+arrayList); - System.out.println("集合为:"+ Arrays.toString(arrayList.toArray())); - System.out.println("集合底层数组长度:"+ arrayList.arrayLength()); -// System.out.println("集合下标-1处的元素:"+arrayList.get(-1)); - } catch (MyException e) { - System.out.println("发生异常>>>"+e); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Test - public void testLinkedList(){ - try { - LinkedListV00 linkedList = new LinkedListV00<>(); - linkedList.add("aaa"); - linkedList.add("bbb"); - linkedList.add("ccc"); - linkedList.add("ddd"); - System.out.println("删除index=2的元素前:"+linkedList); - System.out.println("链表尺寸"+linkedList.size()); - System.out.println("拿到index=2的元素"+linkedList.get(2)); - linkedList.remove(2); - System.out.println("删除index=2的元素后:"+linkedList); - } catch (MyException e) { - System.out.println(e.getMessage()); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Test - public void testStack(){ - try { - StackV00 stack = new StackV00(); - stack.push("ccc"); - stack.push(null); - stack.push("bbb"); - stack.push("aaa"); - System.out.println("栈的大小:"+stack.size()); - System.out.println("栈是否为空:"+stack.isEmpty()); - System.out.println("栈是否为空:"+stack); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - stack.clear(); - System.out.println("清空后,栈大小:"+stack.size()); - System.out.println("栈是否为空:"+stack.isEmpty()); - } catch (MyException e) { - System.out.println(e); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Test - public void testQueue(){ - try { - QueueV00 queue = new QueueV00(); - System.out.println("队列是否为空:"+queue.isEmpty()); - queue.add("aaa"); - queue.add("bbb"); - queue.add("ccc"); - queue.add("ddd"); - System.out.println(queue); - System.out.println("queue.peek结果:"+queue.peek()); - System.out.println("peek后队列长度:"+queue.length()); - System.out.println("queue.poll结果:"+queue.poll()); - System.out.println("poll后队列长度:"+queue.length()); - System.out.println("队列是否为空:"+queue.isEmpty()); - } catch (MyException e) { - System.out.println(e.getMessage()); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Test - public void testArrayLinked(){ - try { - ArrayListV00 arrayList = new ArrayListV00(); - LinkedListV00 linkedList = new LinkedListV00(); - long start1 = System.currentTimeMillis(); - for(int i = 0;i<10000;i++){ - arrayList.add("abc"+i); - } - long end1 = System.currentTimeMillis(); - for(int i = 0;i<10000;i++){ - linkedList.add("abc"+i); - } - long end2 = System.currentTimeMillis(); - System.out.println("ArrayList的时间:"+(end1-start1)); - System.out.println("LinkedList的时间:"+(end2-end1)); - } catch (MyException e) { - e.printStackTrace(); - } - } - - public String getRandomString(int length){ - String base = "abcdefghijklmnopqrstuvwxyz0123456789"; - Random random = new Random(); - StringBuffer sb = new StringBuffer(); - for(int i = 0;i implements Serializable { - - /** - * 双向链表中节点实例的个数 - */ - private transient int size = 0; - - /** - * 前一个节点 - */ - private transient Node first; - - /** - * 后一个节点 - */ - private transient Node last; - - /** - * 空构造 - */ - public LinkedListV00(){} - - /** - * 添加一个节点 - * @param element - * @return - */ - public boolean add(E element){ - linkNext(element); - return true; - } - - /** - * 拿到制定位置的元素 - * @param index - * @return - */ - public E get(int index) throws MyException{ - if(index < 0 || index > size){ - throw new MyException("索引越界"); - } - return node(index).element; - } - - /** - * 删除指定位置的元素 - * 将index-1处节点的next指向index+1处节点,将index+1处节点的previous指向index-1节点 - * @param index 节点位置 - * @return 删除节点的element数据 - */ - public E remove(int index) throws MyException{ - if(index < 0 || index > size){ - throw new MyException("节点索引越界"); - } - return unlink(node(index)); - } - - /** - * 返回链表的长度 - * @return 双向链表中节点实例的个数 - */ - public int size(){ - return size; - } - - /** - * 拿到链表对应的数组 - * @return 链表各节点的element元素组成的数组 - */ - public Object[] toArray(){ - Object[] array = new Object[size]; - for(int i = 0;i x = first; x != null; x = x.next) -// result[i++] = x.element; -// return result; - } - - /** - * 表示一个节点的内部类 - * @param 链表元素泛型 - */ - private static class Node{ - E element; - Node previous; - Node next; - Node(Node previous,E element,Node next){ - this.element = element; - this.previous = previous; - this.next = next; - } - } - - /** - * 根据索引拿对应的节点 - * @param index 索引号 - * @return 索引号对应的节点 - */ - private Node node(int index){ - Node x; - //如果index小于size的一半,即目标节点在链表前半部分 - if(index < (size >> 1)){ - //从第一个节点挨个向后查找,一直到(index-1)处,将其next赋值给x - x = first; - for(int i = 0; iindex;i--){ - x = x.previous; - } - } - //返回x - return x; - } - - /** - * 链接下一个 - * @param e 新节点的element - */ - private void linkNext(E e){ - //将当前的last节点赋值给n - final Node n = last; - //创建一个新的Node节点,其previous为n,next为null - final Node newNode = new Node(n,e,null); - //创建一个新的节点后,则last更新为新节点newNode - last = newNode; - //如果n为null,说明还是一个空的双向链表,将新节点newNode赋值给first - //否则,将newNode赋值给n的next - if(n == null){ - first = newNode; - }else{ - n.next = newNode; - } - //添加一个新节点后,size加1 - size++; - } - - /** - * 从链表解除一个节点 - * @param node 将要被链表接触关联的目标节点 - * @return 目标节点的element元素 - */ - private E unlink(Node node){ - //拿到传入节点的元素 - final E element = node.element; - //拿到传入节点的next节点 - final Node next = node.next; - //拿到传入节点的previous节点 - final Node previous = node.previous; - //如果传入节点的previous=null,说明是第一个节点 - if(previous == null){ - //将链表第一个节点指向本节点的下一个节点next,即把原有的第一个节点解除 - first = next; - }else{ - //将本节点前一个节点的next指向本节点后一个节点,即跳过了本节点 - previous.next = next; - //将本节点的previous节点设置为null - node.previous = null; - } - //如果传入节点的next=null,说明是最后一个节点 - if(next == null){ - //将链表最后一个节点指向本节点的前一个节点,即把原来的最后一个节点解除 - last = previous; - }else{ - //将本节点下一个节点的previous节点指向本节点的前一个节点,即跳过了本节点 - next.previous = previous; - //本节点的next节点设置为null - node.next = null; - } - node.element = null; - size--; - return element; - } - - /** - * 仅作为临时方法,打印链表元素使用,方面查看 - * @return - */ - @Override - public String toString() { - return Arrays.toString(toArray()); - } -} diff --git a/group15/1510_739253131/src/com/bruce/homework0226/QueueV00.java b/group15/1510_739253131/src/com/bruce/homework0226/QueueV00.java deleted file mode 100644 index 7e86244d66..0000000000 --- a/group15/1510_739253131/src/com/bruce/homework0226/QueueV00.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.bruce.homework0226; - -import com.bruce.utils.MyException; - -import java.util.Arrays; - -/** - * 实现Queue的基本功能:peek,poll,add,length,isEmpty - * Created by Bruce.Jiao on 2017/2/25. - */ -public class QueueV00 { - /** - * 队列元素的数组 - */ - private Object[] elementData; - - /** - * 队列容量 - */ - private int max_size; - - /** - * 队列头,允许删除 - */ - private int head; - - /** - * 队列尾,允许插入 - */ - private int tail; - - /** - * 无参构造,默认的初始长度10 - */ - public QueueV00() throws MyException{ - this(10); - } - - /** - * 有参构造 - * @param initCapacity 用户自定的初始长度 - */ - public QueueV00(int initCapacity) throws MyException{ - if(initCapacity < 0){ - throw new MyException("队列长度不能为负数"); - } - this.max_size = initCapacity; - elementData = new Object[initCapacity]; - head = tail = 0; - } - - /** - * 向队列里添加元素 - * @param value 添加的元素 - * @return true:添加成功;false:添加失败 - * @throws MyException 加入添加完成后元素个数超过队列最大尺寸,抛出异常 - */ - public boolean add(Object value) throws MyException{ - if(tail == max_size){ - throw new MyException("队列已满,不能继续插入"); - } - elementData[tail++] = value; - return true; - } - - /** - * 返回队列的第一个元素,但不从队列中删除该元素 - * @return 队列的第一个元素,以插入顺序为先后标准 - */ - public Object peek() throws MyException{ - if(isEmpty()){ - throw new MyException("队列为空队列"); - } - return elementData[head]; - } - - /** - * 返回队列的第一个元素,并且从队列中将该元素删除 - * @return 队列的第一个元素 - * @throws MyException 队列为空,抛出异常 - */ - public Object poll() throws MyException{ - if(isEmpty()){ - throw new MyException("队列为空队列"); - } - //将队列的第一个元素暂存 - Object result = elementData[head]; - //将队列的第一个元素设置为null,并且将head加1 - elementData[head++] = null; - return result; - } - - /** - * 队列长度 - * @return 队列中元素个数 - */ - public int length(){ - return tail-head; - } - - /** - * 判断队列是否为空 - * @return true:队列为空;false:队列不为空 - */ - public boolean isEmpty(){ - return tail == head; - } - - /** - * 临时方法,仅作为测试阶段打印队列元素使用 - * @return - */ - @Override - public String toString() { - return Arrays.toString(Arrays.copyOf(elementData,length())); - } -} diff --git a/group15/1510_739253131/src/com/bruce/homework0226/StackV00.java b/group15/1510_739253131/src/com/bruce/homework0226/StackV00.java deleted file mode 100644 index 29cfe7e9fd..0000000000 --- a/group15/1510_739253131/src/com/bruce/homework0226/StackV00.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.bruce.homework0226; - -import com.bruce.utils.MyException; - -import java.io.Serializable; -import java.util.Arrays; - -/** - * 用数组实现一个栈的基本功能:push,pop,isEmpty,size,clear方法 - * @Version: 0.0 - * Created by Bruce.Jiao on 17-2-24. - */ -public class StackV00 implements Serializable{ - - /** - * 底层存放栈元素的数组 - */ - private Object[] elementData; - - /** - * 栈中元素的个数 - */ - private int size; - - /** - * 每次扩容增加的大小 - */ - private int capacityIncrement; - - /** - * 空构造,数组初始长度为10 - */ - public StackV00() throws MyException{ - this(10); - } - - /** - * 有参构造 - * @param initCapacity 用户指定的栈空间初始大小(底层数组的初始大小) - * @throws MyException 对传入参数进行判断,不符合要求抛出异常 - */ - public StackV00(int initCapacity) throws MyException{ - this(initCapacity,0); - } - - /** - * 有参构造 - * @param initCapacity 用户指定的栈空间初始大小(底层数组的初始大小) - * @param capacityIncrement 用户指定的每次扩容大小(当空间不足时,每一次扩容增加的大小) - * @throws MyException 对传入参数进行判断,不符合要求抛出异常 - */ - public StackV00(int initCapacity, int capacityIncrement) throws MyException{ - if(initCapacity < 0 || capacityIncrement <0){ - throw new MyException(initCapacity < 0?"栈空间大小不能为负数":"扩容参数不能为负数"); - } - elementData = new Object[initCapacity]; - } - - /** - * 向栈中添加元素 - * @param value 添加的元素,可以为null - * @return 添加成功后的元素 - */ - public Object push(Object value){ - ensureCapacity(size+1); - //将新增的元素放在size索引处,并且将size加1 - elementData[size++] = value; - return value; - } - - /** - * 从栈中获取元素,拿到当前所有元素中最后添加进来的元素 - * @return 最后的元素 - */ - public Object pop(){ - //拿到最后的元素,在栈中将该元素删除,将size减1 - return elementData[--size]; - } - - /** - * 判断栈是否为空 - * @return true:空栈,无元素;false:有元素 - */ - public boolean isEmpty(){ - return size == 0; - } - - /** - * 获取栈大小(元素数量,包括null元素) - * @return 栈中元素大小 - */ - public int size(){ - return size; - } - - /** - * 清空栈中元素 - */ - public void clear(){ - int oldCapacity = elementData.length; - size = 0; - elementData = new Object[oldCapacity]; - } - - /** - * 判断数组尺寸 - * @param minCapacity - */ - public void ensureCapacity(int minCapacity){ - int oldCapacity = elementData.length; - //如果传入值大于当前数组尺寸,对数组进行扩容 - if(minCapacity > oldCapacity){ - //如果capacityIncrement大于0,每次扩容用户指定的大小,否则每次将当前数组尺寸扩大一倍 - int newCapacity = oldCapacity + capacityIncrement > 0 ? capacityIncrement : oldCapacity; - //元素数组扩容,并且将原有的元素复制到新数组中 - elementData = Arrays.copyOf(elementData,newCapacity); - } - } - - /** - * 拿到底层的静态数组 - * @return 底层元素数组 - */ - public Object[] toArray(){ - return Arrays.copyOf(elementData,size); - } - - /** - * toString方法,可以直接打印出栈底层的数组 - * @return - */ - @Override - public String toString() { - return Arrays.toString(toArray()); - } - - /** - * 仅仅作为自己查看底层数组长度的方法, - * @return 数组长度,大于等于元素个数 - */ - int arrayLength() { - return elementData.length; - } -} diff --git a/group15/1510_739253131/src/com/bruce/utils/MyException.java b/group15/1510_739253131/src/com/bruce/utils/MyException.java deleted file mode 100644 index 2e2fa7833e..0000000000 --- a/group15/1510_739253131/src/com/bruce/utils/MyException.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.bruce.utils; - -/** - * Created by Bruce.Jiao on 15-6-23. - */ -public class MyException extends Exception{ - private int code; - private String message; - - public MyException() { - } - - public MyException(String message) { - this.message = message; - } - - public MyException(int code, String message) { - this.code = code; - this.message = message; - } - - public int getCode() { - return code; - } - - public String getMessage() { - return message; - } -} diff --git a/group15/1511_714512544/.idea/checkstyle-idea.xml b/group15/1511_714512544/.idea/checkstyle-idea.xml deleted file mode 100644 index 9d5b48d873..0000000000 --- a/group15/1511_714512544/.idea/checkstyle-idea.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/group15/1511_714512544/.idea/encodings.xml b/group15/1511_714512544/.idea/encodings.xml deleted file mode 100644 index cfca28230a..0000000000 --- a/group15/1511_714512544/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/group15/1511_714512544/.idea/misc.xml b/group15/1511_714512544/.idea/misc.xml deleted file mode 100644 index 05483570e0..0000000000 --- a/group15/1511_714512544/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/group15/1511_714512544/.idea/modules.xml b/group15/1511_714512544/.idea/modules.xml deleted file mode 100644 index 0ed960e3bf..0000000000 --- a/group15/1511_714512544/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/group15/1511_714512544/.idea/uiDesigner.xml b/group15/1511_714512544/.idea/uiDesigner.xml deleted file mode 100644 index e96534fb27..0000000000 --- a/group15/1511_714512544/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group15/1511_714512544/.idea/vcs.xml b/group15/1511_714512544/.idea/vcs.xml deleted file mode 100644 index b2bdec2d71..0000000000 --- a/group15/1511_714512544/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/group15/1511_714512544/.idea/workspace.xml b/group15/1511_714512544/.idea/workspace.xml deleted file mode 100644 index e9a1aea025..0000000000 --- a/group15/1511_714512544/.idea/workspace.xml +++ /dev/null @@ -1,1295 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - DEFINITION_ORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - project - - - - - - - - - - - - - - - - project - - - true - - - - DIRECTORY - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1487829138626 - - - 1487829266287 - - - 1487829432867 - - - 1487856987141 - - - 1487857271746 - - - 1487857304368 - - - 1488004359192 - - - 1488019343082 - - - 1488019461939 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - No facets are configured - - - - - - - - - - - - - - - 1.8 - - - - - - - - 1511_714512544 - - - - - - - - 1.8 - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group15/1511_714512544/1511_714512544.iml b/group15/1511_714512544/1511_714512544.iml deleted file mode 100644 index 3ab15b1867..0000000000 --- a/group15/1511_714512544/1511_714512544.iml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group15/1511_714512544/src/com/coding/basic/ArrayList.java b/group15/1511_714512544/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 27911198d2..0000000000 --- a/group15/1511_714512544/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -public class ArrayList implements List { - private int size = 0; //表内现有元素个数 - private Object[] elementData = new Object[2]; //数据结构--数组 - - public void add(Object o){ //在后面追加 - if(size == elementData.length) elementData = grow(elementData, 2* elementData.length); //先扩容 - elementData[size++] = o; - } - - public void add(int index, Object o){ //在指定位置插入 - if(size == elementData.length) elementData = grow(elementData, 2* elementData.length); //先扩容 - if(index > size || index < 0) throw new ArrayIndexOutOfBoundsException(); //保证最后一个元素后面也可以插 - System.arraycopy(elementData,index, elementData,index+1,size-index); - elementData[index] = o; - size ++; - } - - public Object get(int index){ //返回指定索引的元素 - if(index > size - 1 || index < 0) throw new ArrayIndexOutOfBoundsException(); - return elementData[index]; - } - - public Object remove(int index){ //删除指定索引处的元素 - if(index > size - 1 || index < 0) throw new ArrayIndexOutOfBoundsException(); - Object o = elementData[index]; - System.arraycopy(elementData,index+1, elementData,index,size-index-1); - elementData[size-1] = null; - size --; - return o; - } - - public int size(){ //number of elements - return size; - } - - public Iterator iterator(){ //迭代器 - return new ListIterator(); - } - - private class ListIterator implements Iterator{ //实例内部类 - private int i = 0; - - @Override - public boolean hasNext() { - return i < size; - } - - @Override - public Object next() { - if(size() == 0) throw new NoSuchElementException("Stack Underflow"); - return elementData[i++]; - } - } - - //数组扩容 - private Object[] grow(Object[] src, int newLength){ - assert src.length < newLength; //断言 - return Arrays.copyOf(src,newLength); - } - -} diff --git a/group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java b/group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java deleted file mode 100644 index 936960abab..0000000000 --- a/group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java +++ /dev/null @@ -1,238 +0,0 @@ -package com.coding.basic; - -import java.util.Stack; - -/** - 二叉树 - 5 - / \ - 2 7 - / \ /\ -1 4 6 8 - - 1.前序遍历: 5 2 1 4 7 6 8 - 2.中序遍历: 1 2 4 5 6 7 8 - 3.后序遍历: 1 4 2 6 8 7 5 - */ -public class BinarySearchTree> { - private BinarySearchTreeNode root; //root node - - public BinarySearchTreeNode getRoot() { - return root; - } - - public void setRoot(BinarySearchTreeNode root) { - this.root = root; - } - - /** - * 二叉树插入节点 - * @param data 节点元素 - * @return 插入的节点 - */ - public BinarySearchTreeNode insert(T data){ - if(root == null){ - root = new BinarySearchTreeNode(data); - return root; - } - //root非空 - BinarySearchTreeNode current = root; - while(true){ - //当前节点的数据小于data - if(current.getData().compareTo(data) >= 0){ - if(current.getLeft() != null){ - current = current.getLeft(); - }else { - current.setLeft(new BinarySearchTreeNode(data)); - return current.getLeft(); - } - }else {//当前节点数据大于root - if(current.getRight() != null){ - current = current.getRight(); - }else { - current.setRight(new BinarySearchTreeNode(data)); - return current.getRight(); - } - } - } - } - - /** - * 查找元素data - * @param data 要查找的元素 - * @return 返回true找到、false未找到 - */ - public boolean contains(T data){ - if(root == null){ - return false; - } - BinarySearchTreeNode current = root; - while(true){ - if(current.getData().compareTo(data) > 0){ - if(current.getLeft() != null){ - current = current.getLeft(); - }else{ - return false; - } - }else if(current.getData().compareTo(data) < 0){ - if(current.getRight() != null){ - current = current.getRight(); - }else { - return false; - } - }else { - return true; - } - } - } - - /** - * 前序遍历递归实现 根节点 左子树 右子树 - * @param n 根节点 - */ - public void preOrder(BinarySearchTreeNode n){ - System.out.print(n.getData()+" "); - if(n.getLeft() != null){ - preOrder(n.getLeft()); - } - if(n.getRight() != null){ - preOrder(n.getRight()); - } - } - - /** - * 中序遍历递归实现 左子树 根节点 右子树 - * @param n 根节点 - */ - public void midOrder(BinarySearchTreeNode n){ - if(n.getLeft() != null){ - midOrder(n.getLeft()); - } - System.out.print(n.getData()+" "); - if(n.getRight() != null){ - midOrder(n.getRight()); - } - } - - /** - * 后序遍历递归实现 左子树 右子树 根节点 - * @param n 根节点 - */ - public void postOrder(BinarySearchTreeNode n){ - if(n.getLeft() != null){ - postOrder(n.getLeft()); - } - if(n.getRight() != null){ - postOrder(n.getRight()); - } - System.out.print(n.getData()+" "); - } - - /** - * 非递归实现前序遍历 - */ - public void preOrderWithoutRecursion(){ - if(root == null){ //根节点为空 - return; - } - - Stack> stack = new Stack<>(); //存放未执行完的节点 - stack.push(root); //首先push根节点 - BinarySearchTreeNode current = null; - - while(!stack.isEmpty()){ //栈内还有节点 - current = stack.peek(); //得到栈顶节点 - if(current.getState() == 0){ - System.out.print(current.getData() + " "); //打印数据 - current.setState(1); - }else if(current.getState() == 1){ - if(current.getLeft() != null){ - stack.push(current.getLeft()); - } - current.setState(2); //确认是否有左子树 - }else if(current.getState() == 2){ - if(current.getRight() != null){ - stack.push(current.getRight()); - } - current.setState(3); //确认是否有右子树 - }else if(current.getState() == 3){ - stack.pop(); //删除栈顶节点(该节点已经执行完所有程序) - current.setState(0); - } - } - } - - /** - * 非递归实现中序遍历 - */ - public void midOrderWithoutRecursion(){ - if(root == null){ //根节点为空 - return; - } - - Stack> stack = new Stack<>(); //存放未执行完的节点 - stack.push(root); //首先push根节点 - BinarySearchTreeNode current = null; - - while(!stack.isEmpty()){ //栈内还有节点 - current = stack.peek(); //得到栈顶节点 - if(current.getState() == 0){ - if(current.getLeft() != null){ - stack.push(current.getLeft()); //确认是否有左子树 - } - current.setState(1); - }else if(current.getState() == 1){ - System.out.print(current.getData() + " "); //打印数据 - current.setState(2); - }else if(current.getState() == 2){ - if(current.getRight() != null){ - stack.push(current.getRight()); - } - current.setState(3); //确认是否有右子树 - }else if(current.getState() == 3){ - stack.pop(); //删除栈顶节点 - current.setState(0); - } - } - } - - /** - * 非递归实现后序遍历 - */ - public void postOrderWithoutRecursion(){ - if(root == null){ //根节点为空 - return; - } - - Stack> stack = new Stack<>(); //存放未执行完的节点 - stack.push(root); //首先push根节点 - BinarySearchTreeNode current = null; - - while(!stack.isEmpty()){ //栈内还有节点 - current = stack.peek(); //得到栈顶节点 - if(current.getState() == 0){ - if(current.getLeft() != null){ - stack.push(current.getLeft()); - } - current.setState(1); - }else if(current.getState() == 1){ - if(current.getRight() != null){ - stack.push(current.getRight()); - } - current.setState(2); //确认是否有左子树 - }else if(current.getState() == 2){ - System.out.print(current.getData() + " "); //打印数据 - current.setState(3); //确认是否有右子树 - }else if(current.getState() == 3){ - stack.pop(); //删除栈顶节点 - current.setState(0); - } - } - } - - //按层遍历,每层从左到右输出 - /*public void TraversalByLayer(){ - - }*/ - -} diff --git a/group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java b/group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java deleted file mode 100644 index b4e94ff7b6..0000000000 --- a/group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.coding.basic; - -/** - * 二叉树BST结点 - */ -public class BinarySearchTreeNode{ - private T data; - private BinarySearchTreeNode left; - private BinarySearchTreeNode right; - private int state; //递归状态(非递归遍历表示一个节点运行到的状态) - - public BinarySearchTreeNode(T data) { - this.data = data; - this.left = null; - this.right = null; - } - - public T getData() { - return data; - } - - public void setData(T data) { - this.data = data; - } - - public BinarySearchTreeNode getLeft() { - return left; - } - - public void setLeft(BinarySearchTreeNode left) { - this.left = left; - } - - public BinarySearchTreeNode getRight() { - return right; - } - - public void setRight(BinarySearchTreeNode right) { - this.right = right; - } - - public int getState() { - return state; - } - - public void setState(int state) { - this.state = state; - } -} diff --git a/group15/1511_714512544/src/com/coding/basic/Iterator.java b/group15/1511_714512544/src/com/coding/basic/Iterator.java deleted file mode 100644 index b8c8e0ce6a..0000000000 --- a/group15/1511_714512544/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - boolean hasNext(); - Object next(); -} diff --git a/group15/1511_714512544/src/com/coding/basic/LinkedList.java b/group15/1511_714512544/src/com/coding/basic/LinkedList.java deleted file mode 100644 index e806c0e6a2..0000000000 --- a/group15/1511_714512544/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - private Node head; //首节点 - private int size; //节点个数 - - public void add(Object o){ //在链表尾部添加node - if(head == null){ - head = new Node(o, null); - }else { - Node last = head; - while(last.next != null){ - last = last.next; - } - last.next = new Node(o, null); - } - size ++; - } - - public void add(int index , Object o){ //在指定索引处插入node - if(index > size || index < 0) throw new RuntimeException("IndexOutOfBounds"); - if(head == null){ - head = new Node(o, null); - }else { - if(index == 0){ //插入位置在头部 - head = new Node(o, head); - }else { //后面位置插入 - Node temp = head; - int i = 0; - while(i != index - 1){ - temp = temp.next; - i ++; - } - Node tempNext = temp.next; - temp.next = new Node(o, tempNext); - } - } - size ++; - } - - public Object get(int index){ //取出指定节点处的元素,从0开始 - if(index > size -1 || index < 0) throw new RuntimeException("IndexOutOfBounds"); - int i = 0; - Node temp = head; - while(i != index){ - i ++; - temp = temp.next; - } - return temp.data; - } - - public Object remove(int index){ //删除指定索引处的节点 - if(index > size -1 || index < 0) throw new RuntimeException("IndexOutOfBounds"); - if(index == 0) { //第一个元素或只有一个元素 - Object o = head.data; - head = head.next; - size --; - return o; - }else { //其他元素 - int i = 0; - Node temp = head; //被删除节点之前的节点 - while(i != index - 1){ - i ++; - temp = temp.next; - } - Node delete = temp.next; //被删除的节点 - Object o = delete.data; - temp.next = delete.next; //删除 - size --; - return o; - } - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ //在表头添加节点 - head = new Node(o, head); - size ++; - } - - public void addLast(Object o){ //在链表尾部添加节点 - if(head == null){ - head = new Node(o,null); - size ++; - return; - } - Node last = head; - while(last.next != null){ - last = last.next; - } - last.next = new Node(o, null); - size ++; - } - - public Object removeFirst(){ //在链表头部删除节点 - if(size() == 0) throw new RuntimeException("Underflow"); - Object o = head.data; - head = head.next; - size --; - return o; - } - - public Object removeLast(){ //在链表尾部删除节点 - if(size() == 0) throw new RuntimeException("Underflow"); - if(size() == 1){ - Object o = head.data; - head = null; - size --; - return o; - } - Node temp = head; - int i = 0; - while(i != size-2){ - temp = temp.next; - i ++; - } - Object o = temp.next.data; - temp.next = null; - size --; - return o; - } - - public Iterator iterator(){ //迭代器 - return new ListIterator(); - } - - private class ListIterator implements Iterator{ //实例内部类 - private Node current = head; - - @Override - public boolean hasNext() { - return current != null; - } - - @Override - public Object next() { - if(size() == 0) throw new NoSuchElementException("Underflow"); - Object o = current.data; - current = current.next; - return o; - } - } - - //这里内部类须为static,在类级别上一一对应,非实例级别 - private static class Node{ - Object data; - Node next; - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } -} diff --git a/group15/1511_714512544/src/com/coding/basic/List.java b/group15/1511_714512544/src/com/coding/basic/List.java deleted file mode 100644 index 4cc4f6fe5b..0000000000 --- a/group15/1511_714512544/src/com/coding/basic/List.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.coding.basic; - -/** - * List可以随机访问,不需要遍历 - */ -public interface List { - void add(Object o); - - void add(int index, Object o); - - Object get(int index); - - Object remove(int index); - - int size(); -} diff --git a/group15/1511_714512544/src/com/coding/basic/Queue.java b/group15/1511_714512544/src/com/coding/basic/Queue.java deleted file mode 100644 index 00a69823b5..0000000000 --- a/group15/1511_714512544/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -/** - * 队列,先进先出 - */ -public class Queue { - private LinkedList list = new LinkedList(); //链表数据结构 - - //入队 - public void enQueue(Object o){ - list.addLast(o); - } - - //出队 - public Object deQueue(){ - if(list.size() == 0) throw new NoSuchElementException("队列无元素"); - return list.removeFirst(); - } - - //是否为空 - public boolean isEmpty(){ - return list.size() == 0; - } - - //队列内元素 - public int size(){ - return list.size(); - } - - //迭代器 - public Iterator iterator(){ - return list.iterator(); - } - -} diff --git a/group15/1511_714512544/src/com/coding/basic/Stack.java b/group15/1511_714512544/src/com/coding/basic/Stack.java deleted file mode 100644 index d54b896356..0000000000 --- a/group15/1511_714512544/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; -//LIFO -public class Stack { - private ArrayList elementData = new ArrayList(); //使用刚实现的ArrayList - - //入栈 - public void push(Object o){ - elementData.add(o); - } - - //出栈 - public Object pop(){ - if(elementData.size() == 0) throw new NoSuchElementException("Stack Underflow"); - return elementData.remove(elementData.size()-1); - } - - //栈顶元素 - public Object peek(){ - if(elementData.size() == 0) throw new NoSuchElementException("Stack Underflow"); - return elementData.get(elementData.size()-1); - } - - //是否为空 - public boolean isEmpty(){ - return elementData.size() == 0; - } - - //栈内元素个数 - public int size(){ - return elementData.size(); - } - -} diff --git a/group15/1511_714512544/src/test/com/coding/basic/ArrayListTest.java b/group15/1511_714512544/src/test/com/coding/basic/ArrayListTest.java deleted file mode 100644 index 8e6cc5a64d..0000000000 --- a/group15/1511_714512544/src/test/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package test.com.coding.basic; - -import com.coding.basic.ArrayList; -import com.coding.basic.Iterator; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * ArrayList Test - */ -public class ArrayListTest { - @Test - public void add() throws Exception { - ArrayList list = new ArrayList(); - list.add(1); - list.add(2); - list.add(3); - assertEquals(3, list.size()); - } - - @Test - public void addByIndex() throws Exception { - ArrayList list = new ArrayList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - assertEquals(3,list.get(0)); - } - - @Test - public void get() throws Exception { - ArrayList list = new ArrayList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - assertEquals(3,list.get(0)); - } - - @Test - public void remove() throws Exception { - ArrayList list = new ArrayList(); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.remove(0); - assertEquals(2, list.get(0)); - } - - @Test - public void size() throws Exception { - ArrayList list = new ArrayList(); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - assertEquals(5, list.size()); - } - - @Test - public void iterator() throws Exception { - ArrayList list = new ArrayList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - Iterator iterator = list.iterator(); - while(iterator.hasNext()){ - System.out.print(iterator.next() + " "); - } - } - -} \ No newline at end of file diff --git a/group15/1511_714512544/src/test/com/coding/basic/BinarySearchTreeTest.java b/group15/1511_714512544/src/test/com/coding/basic/BinarySearchTreeTest.java deleted file mode 100644 index 3b7102e5cd..0000000000 --- a/group15/1511_714512544/src/test/com/coding/basic/BinarySearchTreeTest.java +++ /dev/null @@ -1,113 +0,0 @@ -package test.com.coding.basic; - -import static org.junit.Assert.*; - -import com.coding.basic.BinarySearchTree; -import org.junit.Test; - -public class BinarySearchTreeTest { - - @Test - public void testInsert() { - BinarySearchTree bst = new BinarySearchTree(); - bst.insert(5); - bst.insert(2); - bst.insert(7); - bst.insert(1); - bst.insert(6); - bst.insert(4); - bst.insert(8); - } - - @Test - public void testContains() { - BinarySearchTree bst = new BinarySearchTree(); - bst.insert(5); - bst.insert(2); - bst.insert(7); - bst.insert(1); - bst.insert(6); - bst.insert(4); - bst.insert(8); - assertEquals(true,bst.contains(8)); - } - - @Test - public void testPreOrder(){ - BinarySearchTree bst = new BinarySearchTree(); - bst.insert(5); - bst.insert(2); - bst.insert(7); - bst.insert(1); - bst.insert(6); - bst.insert(4); - bst.insert(8); - bst.preOrder(bst.getRoot()); - } - - @Test - public void testPreOrderWithoutRecursion(){ - BinarySearchTree bst = new BinarySearchTree<>(); - bst.insert(5); - bst.insert(2); - bst.insert(7); - bst.insert(1); - bst.insert(6); - bst.insert(4); - bst.insert(8); - bst.preOrderWithoutRecursion(); - } - - @Test - public void testMidOrder(){ - BinarySearchTree bst = new BinarySearchTree(); - bst.insert(5); - bst.insert(2); - bst.insert(7); - bst.insert(1); - bst.insert(6); - bst.insert(4); - bst.insert(8); - bst.midOrder(bst.getRoot()); - } - - @Test - public void testMidOrderWithoutRecursion(){ - BinarySearchTree bst = new BinarySearchTree<>(); - bst.insert(5); - bst.insert(2); - bst.insert(7); - bst.insert(1); - bst.insert(6); - bst.insert(4); - bst.insert(8); - bst.midOrderWithoutRecursion(); - } - - @Test - public void testPostOrder(){ - BinarySearchTree bst = new BinarySearchTree(); - bst.insert(5); - bst.insert(2); - bst.insert(7); - bst.insert(1); - bst.insert(6); - bst.insert(4); - bst.insert(8); - bst.postOrder(bst.getRoot()); - } - - @Test - public void testPostOrderWithoutRecursion(){ - BinarySearchTree bst = new BinarySearchTree<>(); - bst.insert(5); - bst.insert(2); - bst.insert(7); - bst.insert(1); - bst.insert(6); - bst.insert(4); - bst.insert(8); - bst.postOrderWithoutRecursion(); - } - -} diff --git a/group15/1511_714512544/src/test/com/coding/basic/LinkedListTest.java b/group15/1511_714512544/src/test/com/coding/basic/LinkedListTest.java deleted file mode 100644 index e5a2617247..0000000000 --- a/group15/1511_714512544/src/test/com/coding/basic/LinkedListTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package test.com.coding.basic; - -import com.coding.basic.Iterator; -import com.coding.basic.LinkedList; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * LinkedList Test - */ -public class LinkedListTest { - @Test - public void add() throws Exception { - LinkedList list = new LinkedList(); - list.add(1); - list.add(2); - list.add(3); - assertEquals(3,list.size()); - } - - @Test - public void addByIndex() throws Exception { - LinkedList list = new LinkedList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - Iterator iterator = list.iterator(); - while(iterator.hasNext()){ - System.out.println(iterator.next()); - } - assertEquals(3, list.get(0)); - } - - @Test - public void get() throws Exception { - LinkedList list = new LinkedList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - assertEquals(3,list.get(0)); - } - - @Test - public void remove() throws Exception { - LinkedList list = new LinkedList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - list.add(3,4); - list.add(4,5); - list.remove(0); - System.out.println(list.size()); - Iterator iterator = list.iterator(); - while(iterator.hasNext()){ - System.out.print(iterator.next() + " "); - } - } - - @Test - public void size() throws Exception { - LinkedList list = new LinkedList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - list.add(3,4); - list.add(4,5); - assertEquals(5, list.size()); - } - - @Test - public void addFirst() throws Exception { - LinkedList list = new LinkedList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - list.add(3,4); - list.add(4,5); - list.addFirst(0); - System.out.println(list.size()); - Iterator iterator = list.iterator(); - while(iterator.hasNext()){ - System.out.print(iterator.next() + " "); - } - } - - @Test - public void addLast() throws Exception { - LinkedList list = new LinkedList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - list.add(3,4); - list.add(4,5); - list.addLast(0); - System.out.println(list.size()); - Iterator iterator = list.iterator(); - while(iterator.hasNext()){ - System.out.print(iterator.next() + " "); - } - } - - @Test - public void removeFirst() throws Exception { - LinkedList list = new LinkedList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - list.add(3,4); - list.add(4,5); - list.removeFirst(); - System.out.println(list.size()); - Iterator iterator = list.iterator(); - while(iterator.hasNext()){ - System.out.print(iterator.next() + " "); - } - } - - @Test - public void removeLast() throws Exception { - LinkedList list = new LinkedList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - list.add(3,4); - list.add(4,5); - list.removeLast(); - System.out.println(list.size()); - Iterator iterator = list.iterator(); - while(iterator.hasNext()){ - System.out.print(iterator.next() + " "); - } - } - - @Test - public void iterator() throws Exception { - LinkedList list = new LinkedList(); - list.add(0,1); - list.add(1,2); - list.add(0,3); - list.add(3,4); - list.add(4,5); - Iterator iterator = list.iterator(); - while(iterator.hasNext()){ - System.out.print(iterator.next() + " "); - } - } - -} \ No newline at end of file diff --git a/group15/1511_714512544/src/test/com/coding/basic/QueueTest.java b/group15/1511_714512544/src/test/com/coding/basic/QueueTest.java deleted file mode 100644 index 597966d62e..0000000000 --- a/group15/1511_714512544/src/test/com/coding/basic/QueueTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package test.com.coding.basic; - -import com.coding.basic.Iterator; -import com.coding.basic.Queue; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * QueueTest - */ -public class QueueTest { - @Test - public void enQueue() throws Exception { - Queue queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - queue.enQueue(4); - assertEquals(1, queue.deQueue()); - } - - @Test - public void deQueue() throws Exception { - Queue queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - queue.enQueue(4); - assertEquals(1, queue.deQueue()); - } - - @Test - public void isEmpty() throws Exception { - Queue queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - queue.enQueue(4); - assertEquals(false, queue.isEmpty()); - } - - @Test - public void size() throws Exception { - Queue queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - queue.enQueue(4); - assertEquals(4 , queue.size()); - } - - @Test - public void iterator() throws Exception { - Queue queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - queue.enQueue(4); - queue.enQueue(4); - Iterator iterator = queue.iterator(); - while(iterator.hasNext()){ - System.out.print(iterator.next() + " "); - } - } - -} \ No newline at end of file diff --git a/group15/1511_714512544/src/test/com/coding/basic/StackTest.java b/group15/1511_714512544/src/test/com/coding/basic/StackTest.java deleted file mode 100644 index 96eabc523d..0000000000 --- a/group15/1511_714512544/src/test/com/coding/basic/StackTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package test.com.coding.basic; - -import com.coding.basic.Stack; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Stack Test - */ -public class StackTest { - @Test - public void push() throws Exception { - Stack stack = new Stack(); - stack.push(1); - assertEquals(1,stack.pop()); - } - - @Test - public void pop() throws Exception { - Stack stack = new Stack(); - stack.push(1); - assertEquals(1,stack.pop()); - } - - @Test - public void peek() throws Exception { - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - assertEquals(5,stack.peek()); - } - - @Test - public void isEmpty() throws Exception { - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - assertEquals(false,stack.isEmpty()); - } - - @Test - public void size() throws Exception { - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - assertEquals(5,stack.size()); - } - -} \ No newline at end of file diff --git "a/group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md" "b/group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md" deleted file mode 100644 index f6f4c26b37..0000000000 --- "a/group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md" +++ /dev/null @@ -1 +0,0 @@ -(1)介绍CPU,内存,硬盘,指令以及他们之间的关系的文章地址:http://www.jianshu.com/p/f86ca5072c5d diff --git a/group15/1512_656512403/.idea/compiler.xml b/group15/1512_656512403/.idea/compiler.xml deleted file mode 100644 index 217af471a9..0000000000 --- a/group15/1512_656512403/.idea/compiler.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/group15/1512_656512403/.idea/copyright/profiles_settings.xml b/group15/1512_656512403/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3377..0000000000 --- a/group15/1512_656512403/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/group15/1512_656512403/.idea/description.html b/group15/1512_656512403/.idea/description.html deleted file mode 100644 index db5f129556..0000000000 --- a/group15/1512_656512403/.idea/description.html +++ /dev/null @@ -1 +0,0 @@ -Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group15/1512_656512403/.idea/encodings.xml b/group15/1512_656512403/.idea/encodings.xml deleted file mode 100644 index e206d70d85..0000000000 --- a/group15/1512_656512403/.idea/encodings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/group15/1512_656512403/.idea/inspectionProfiles/Project_Default.xml b/group15/1512_656512403/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index e9844ba05b..0000000000 --- a/group15/1512_656512403/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/group15/1512_656512403/.idea/inspectionProfiles/profiles_settings.xml b/group15/1512_656512403/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 3b312839bf..0000000000 --- a/group15/1512_656512403/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/group15/1512_656512403/.idea/misc.xml b/group15/1512_656512403/.idea/misc.xml deleted file mode 100644 index 1b063fd81b..0000000000 --- a/group15/1512_656512403/.idea/misc.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/group15/1512_656512403/.idea/modules.xml b/group15/1512_656512403/.idea/modules.xml deleted file mode 100644 index a2753a29d2..0000000000 --- a/group15/1512_656512403/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/group15/1512_656512403/.idea/vcs.xml b/group15/1512_656512403/.idea/vcs.xml deleted file mode 100644 index def6a6a184..0000000000 --- a/group15/1512_656512403/.idea/vcs.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group15/1512_656512403/.idea/workspace.xml b/group15/1512_656512403/.idea/workspace.xml deleted file mode 100644 index 49276d46a4..0000000000 --- a/group15/1512_656512403/.idea/workspace.xml +++ /dev/null @@ -1,768 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - DEFINITION_ORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1487995674848 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group15/1512_656512403/1512_656512403.iml b/group15/1512_656512403/1512_656512403.iml deleted file mode 100644 index d5c0743275..0000000000 --- a/group15/1512_656512403/1512_656512403.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/group15/1512_656512403/1512_656512403.md b/group15/1512_656512403/1512_656512403.md deleted file mode 100644 index 08b657df23..0000000000 --- a/group15/1512_656512403/1512_656512403.md +++ /dev/null @@ -1 +0,0 @@ -//这是1512深的文件夹 diff --git a/group15/1512_656512403/src/Iterator.java b/group15/1512_656512403/src/Iterator.java deleted file mode 100644 index 4af68013b5..0000000000 --- a/group15/1512_656512403/src/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Created by wangtiegang on 2017/2/25. - */ -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group15/1512_656512403/src/List.java b/group15/1512_656512403/src/List.java deleted file mode 100644 index c952972cea..0000000000 --- a/group15/1512_656512403/src/List.java +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Created by wangtiegang on 2017/2/25. - */ -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group15/1512_656512403/src/Main.java b/group15/1512_656512403/src/Main.java deleted file mode 100644 index db9b7162b6..0000000000 --- a/group15/1512_656512403/src/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -public class Main { - - public static void main(String[] args) { - System.out.println("Hello World!"); - - } -} diff --git a/group15/1512_656512403/src/MyArrayList.java b/group15/1512_656512403/src/MyArrayList.java deleted file mode 100644 index 125cbfe052..0000000000 --- a/group15/1512_656512403/src/MyArrayList.java +++ /dev/null @@ -1,198 +0,0 @@ -import java.io.Serializable; -import java.util.Collection; - -/** - * Created by wangtiegang on 2017/2/18. - */ -public class MyArrayList implements List,Serializable{ - private int size; - private Object[] elementData; - - //空构造方法,初始容量10 - public MyArrayList(){ - this(10); - } - - //构造指定容量的空列表 - public MyArrayList(int size){ - this.elementData = new Object[size]; - } - - //构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。 - public MyArrayList(Collection collection){ - this.size = collection.size(); - this.elementData = new Object[collection.size()]; - //复制元素到数组中 - } - - //添加值到列表尾 - public void add(Object obj){ - //先判断长度够不够 - this.ensureCapacity(size+1); - //添加到数组 - elementData[size++] = obj; - } - - //添加值到指定位置 - public void add(int index,Object obj){ - this.ensureCapacity(size+1); - //添加元素到指定位置,将所有指定位置开始的值都往后移一位 - for(int i = index;i=0;i--){ - if(obj.equals(elementData[i])){ - return i; - } - } - return -1; - } - - //没有元素则返回true - public boolean isEmpty(){ - return size == 0 ? true : false; - } - - //remove指定位置元素 - public Object remove(int index){ - if(index > size){ - throw new IndexOutOfBoundsException(); - }else { - Object removeObj = elementData[index]; - for(int i=index;i size) || (toIndex < 0 || toIndex > size) ){ - throw new IndexOutOfBoundsException(); - }else{ - if(fromIndex < toIndex){ - for(int i = fromIndex ; i < size ; i++){ - if(toIndex + 1 <= size){ - elementData[i] = elementData[toIndex+1]; - }else{ - elementData[i] = null; - } - } - size = size - (toIndex - fromIndex) - 1; - }else if(fromIndex > toIndex){ - for(int i = toIndex ; i < size ; i++){ - if(fromIndex + 1 <= size){ - elementData[i] = elementData[fromIndex+1]; - }else{ - elementData[i] = null; - } - } - size = size - (fromIndex - toIndex) - 1; - } - } - } - - //替换指定位置元素 - public Object set(int index,Object obj){ - if(index > size || index < 0){ - throw new IndexOutOfBoundsException(); - }else { - Object oldObj = elementData[index]; - elementData[index] = obj; - return oldObj; - } - } - - public Object[] toArray(){ - Object[] arr = new Object[elementData.length]; - for(int i = 0 ; i elementData.length){ - Object[] oldData = elementData; - int newCapacity = (elementData.length*3)/2 + 1; - if(newCapacity < minCapacity){ - newCapacity = minCapacity; - } - Object[] newData = new Object[newCapacity]; - //复制元素到新的数组中 - elementData = this.copyArray(elementData,newCapacity); - } - } - - public Object[] copyArray(Object[] arr,int newCapacity){ - Object[] newArray = new Object[newCapacity]; - - for(int i = 0 ; i < arr.length ; i++){ - newArray[i] = arr[i]; - } - - return newArray; - } - - public int size(){ - return this.size; - } - - public Object get(int index){ - return elementData[index]; - } - -} diff --git a/group15/1512_656512403/src/MyBinaryTreeNode.java b/group15/1512_656512403/src/MyBinaryTreeNode.java deleted file mode 100644 index 186a4c182f..0000000000 --- a/group15/1512_656512403/src/MyBinaryTreeNode.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Created by wangtiegang on 2017/2/25. - */ -public class MyBinaryTreeNode { - private Node root; - - private static class Node{ - Object data; - Node right; - Node left; - - public Node(Object obj,Node right,Node left){ - this.data = obj; - this.right = right; - this.left = left; - } - } - - public Object insert(Object o){ - if(root == null){ - root = new Node(o,null,null); - }else{ - - } - return null; - } -} diff --git a/group15/1512_656512403/src/MyLinkedList.java b/group15/1512_656512403/src/MyLinkedList.java deleted file mode 100644 index 30dda78d17..0000000000 --- a/group15/1512_656512403/src/MyLinkedList.java +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Created by wangtiegang on 2017/2/25. - */ -public class MyLinkedList implements List { - //当前size - private int size; - //第一个节点 - private Node firstNode; - //最后一个节点 - private Node lastNode; - - - //构造存放数据及指针的Node - private static class Node{ - E data; - Node preNode; - Node nextNode; - - public Node(E data,Node preNode,Node nextNode){ - this.data = data; - this.preNode = preNode; - this.nextNode = nextNode; - } - } - - @Override - public void add(Object o) { - - //将最后一个node放到preNode - Node node = new Node(o,lastNode,null); - //将最后一个node的nextNode设置成o - if(lastNode != null){ - lastNode.nextNode = node; - } - - lastNode = node; - - if(firstNode == null){ - firstNode = node; - } - //size增加 - size++; - } - - @Override - public void add(int index, Object o) { - if(index < 0 || index > size){ - throw new IndexOutOfBoundsException(); - } - - if(index == size){ - this.add(o); - }else { - //找到index个 - Node node = firstNode; - for(int i = 0;i= size){ - throw new IndexOutOfBoundsException(); - } - Node node = firstNode; - for(int i = 0;i= size){ - throw new IndexOutOfBoundsException(); - } - - //找到index个 - Node node = firstNode; - for(int i = 0;i - - - - - diff --git a/group15/1513_121469918/HomeWork01/.gitignore b/group15/1513_121469918/HomeWork01/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group15/1513_121469918/HomeWork01/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group15/1513_121469918/HomeWork01/.project b/group15/1513_121469918/HomeWork01/.project deleted file mode 100644 index 2865c24f37..0000000000 --- a/group15/1513_121469918/HomeWork01/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - HomeWork01 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group15/1513_121469918/HomeWork01/.settings/org.eclipse.jdt.core.prefs b/group15/1513_121469918/HomeWork01/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab1683..0000000000 --- a/group15/1513_121469918/HomeWork01/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group15/1513_121469918/HomeWork01/src/coding/ArrayList.java b/group15/1513_121469918/HomeWork01/src/coding/ArrayList.java deleted file mode 100644 index f85c800084..0000000000 --- a/group15/1513_121469918/HomeWork01/src/coding/ArrayList.java +++ /dev/null @@ -1,118 +0,0 @@ -package coding; - -import java.util.NoSuchElementException; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - int len = size + 1; - // жlistijǷ - if (len > elementData.length) { - // - Object[] newElemDate = new Object[elementData.length + 1]; - // ƾԪص - System.arraycopy(elementData, 0, newElemDate, 0, elementData.length); - elementData = newElemDate; - } - elementData[size] = o; - size++; - } - - public void add(int index, Object o) { - // ǷԽ - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("index:" + index + "size:" + size); - } - // Ԫصĩβֱӵadd - if (index == size) { - add(o); - } else { - // - Object[] newElemData = new Object[elementData.length + 1]; - // indexǰԪص - System.arraycopy(elementData, 0, newElemData, 0, index); - newElemData[index] = o; - // index ԺԪص - System.arraycopy(elementData, index, newElemData, index + 1, size - index); - - elementData = newElemData; - size++; - } - } - - public Object get(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException("index:" + index + "size:" + size); - } - return elementData[index]; - } - - public Object remove(int index) { - if (index >= size) { - throw new IndexOutOfBoundsException("index:" + index + "size:" + size); - } - Object removeElement = elementData[index]; - //һԪصֵҪ - if(index != (size-1)){ - // - Object[] newElemData = new Object[elementData.length]; - // indexǰԪص - System.arraycopy(elementData, 0, newElemData, 0, index); - // index ԺԪص - System.arraycopy(elementData, index+1, newElemData, index, size - index -1); - } - //һԪصֱֵӼlist - size--; - return removeElement; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new MyIterator(this); - } - - private class MyIterator implements Iterator { - private int poi = -1; - private ArrayList array = null; - - private MyIterator(ArrayList array) { - this.array = array; - } - - @Override - public boolean hasNext() { - return (poi + 1) < array.size; - } - - @Override - public Object next() { - // TODO Auto-generated method stub - poi++; - if (poi >= array.size) { - poi--; - throw new IndexOutOfBoundsException(); - } - - return array.get(poi); - } - - @Override - public Object remove() { - // TODO Auto-generated method stub - if (poi < 0) { - throw new NoSuchElementException(); - } - Object val = array.remove(poi); - poi--; - return val; - } - - } -} diff --git a/group15/1513_121469918/HomeWork01/src/coding/BinaryTreeNode.java b/group15/1513_121469918/HomeWork01/src/coding/BinaryTreeNode.java deleted file mode 100644 index 8e40fa1d90..0000000000 --- a/group15/1513_121469918/HomeWork01/src/coding/BinaryTreeNode.java +++ /dev/null @@ -1,53 +0,0 @@ -package coding; - -public class BinaryTreeNode { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o) { - // жϵǰڵԪ - if (data == null) { - setData(o); - } else { - Integer i = (Integer) o; - // ǰڵжҽڵ - if (i.compareTo((Integer) data) == -1) { - if(right == null) - right = new BinaryTreeNode(); - return right.insert(i); - } else if (i.compareTo((Integer) data) == 1) { - if(left == null) - left = new BinaryTreeNode(); - return left.insert(i); - } - return null; - } - return null; - } - -} diff --git a/group15/1513_121469918/HomeWork01/src/coding/Iterator.java b/group15/1513_121469918/HomeWork01/src/coding/Iterator.java deleted file mode 100644 index 26ca2a672a..0000000000 --- a/group15/1513_121469918/HomeWork01/src/coding/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package coding; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - public Object remove(); -} diff --git a/group15/1513_121469918/HomeWork01/src/coding/LinkedList.java b/group15/1513_121469918/HomeWork01/src/coding/LinkedList.java deleted file mode 100644 index 5d15f141f7..0000000000 --- a/group15/1513_121469918/HomeWork01/src/coding/LinkedList.java +++ /dev/null @@ -1,170 +0,0 @@ -package coding; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - private Node head; - private int size; - - public void add(Object o) { - // жͷǷ - if (head == null) { - head = new Node(o, null); - } else { - Node newNode = head; - while (newNode.next != null) { - newNode = newNode.next; - } - newNode.next = new Node(o, null); - } - size++; - } - - public void add(int index, Object o) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("index:" + index + "size:" + size); - } - Node node = head; - if (index != 0) { - // ǵһֵҵֵǰһڵ - for (int i = 1; i < index; i++) { - node = node.next; - } - Node newNode = new Node(o, node.next); - node.next = newNode; - size++; - } else { - // һֵͽͷڵָ - Node newNode = new Node(o, head); - head = newNode; - size++; - } - } - - public Object get(int index) { - indexCheck(index); - Node node = head; - for (int i = 1; i <= index; i++) { - node = node.next; - } - return node.data; - } - - public Object remove(int index) { - indexCheck(index); - - Node node = head; - Node removeNode; - if (index == 0) { - //ɾһڵͰͷڵָԭĵڶڵ - removeNode = head; - head = head.next; - } else { - //ҵֵǰһڵ - for (int i = 1; i < index; i++) { - node = node.next; - } - removeNode = node.next; - //ǰһڵָ룬ָɾڵָĽڵ - node.next = removeNode.next; - } - size--; - return removeNode.data; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node newNode = new Node(o, head.next); - head.next = newNode; - size++; - } - - public void addLast(Object o) { - add(o); - } - - public Object removeFirst() { - //ûԪؾ쳣 - if (size <= 0) { - throw new IndexOutOfBoundsException("size:" + size); - } - Object val = head.data; - head = head.next; - size--; - return val; - } - - public Object removeLast() { - if (size <= 0) { - throw new IndexOutOfBoundsException("size:" + size); - } - Node node = head; - while (node.next != null) { - node = node.next; - } - Object val = node.data; - node = null; - size--; - return val; - } - - public Iterator iterator() { - return new MyIterator(this); - } - - private class MyIterator implements Iterator{ - private int poi = -1; - private LinkedList list ; - private MyIterator(LinkedList list) { - this.list= list; - } - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return (poi + 1) < list.size; - } - - @Override - public Object next() { - // TODO Auto-generated method stub - poi++; - if (poi >= list.size) { - poi--; - throw new IndexOutOfBoundsException(); - } - - return list.get(poi); - } - - @Override - public Object remove() { - // TODO Auto-generated method stub - if (poi < 0) { - throw new NoSuchElementException(); - } - Object val = list.removeLast(); - poi--; - return val; - } - - } - - private void indexCheck(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException("index:" + index + "size:" + size); - } - } - - private static class Node { - Object data; - Node next; - - Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } -} diff --git a/group15/1513_121469918/HomeWork01/src/coding/List.java b/group15/1513_121469918/HomeWork01/src/coding/List.java deleted file mode 100644 index 8b85bc5b37..0000000000 --- a/group15/1513_121469918/HomeWork01/src/coding/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package coding; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group15/1513_121469918/HomeWork01/src/coding/Queue.java b/group15/1513_121469918/HomeWork01/src/coding/Queue.java deleted file mode 100644 index f4b6faaa8a..0000000000 --- a/group15/1513_121469918/HomeWork01/src/coding/Queue.java +++ /dev/null @@ -1,35 +0,0 @@ -package coding; - -import java.util.NoSuchElementException; - -public class Queue { - private int size; - private LinkedList list = new LinkedList(); - - public void enQueue(Object o){ - list.addLast(o);; - size++; - } - - public Object deQueue(){ - if(size<=0){ - throw new NoSuchElementException(); - } - Object val = list.removeFirst(); - size--; - return val; - } - - public boolean isEmpty(){ - boolean flag = false; - if(size >= 0){ - flag = true; - } - return flag; - } - - public int size(){ - return size; - } - -} diff --git a/group15/1513_121469918/HomeWork01/src/coding/Stack.java b/group15/1513_121469918/HomeWork01/src/coding/Stack.java deleted file mode 100644 index 742a6c4e40..0000000000 --- a/group15/1513_121469918/HomeWork01/src/coding/Stack.java +++ /dev/null @@ -1,41 +0,0 @@ -package coding; - -import java.util.NoSuchElementException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - private int size; - - public void push(Object o){ - elementData.add(o); - size++; - } - - public Object pop(){ - if(size<=0){ - throw new NoSuchElementException(); - } - int len = size-1; - Object val = elementData.remove(len); - size--; - return val; - } - - public Object peek(){ - if(size<=0){ - throw new NoSuchElementException(); - } - int len = size-1; - return elementData.get(len); - } - public boolean isEmpty(){ - boolean flag = false; - if(size >= 0){ - flag = true; - } - return flag; - } - public int size(){ - return size; - } -} diff --git a/group15/1514_616019420/ArrayList.java b/group15/1514_616019420/ArrayList.java deleted file mode 100644 index e4f5d255c5..0000000000 --- a/group15/1514_616019420/ArrayList.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - elementData[size] = o; - size++; - } - - public void add(int index, Object o) { - for (int i = size; i > index; i--) { - elementData[i] = elementData[i - 1]; - } - - elementData[index] = o; - - } - - public Object get(int index) { - return elementData[index]; - } - - public Object remove(int index) { - Object oj = elementData[index]; - for (int i = index; i < size; i++) { - elementData[i] = elementData[i + 1]; - } - elementData[size--] = null; - return oj; - } - - public int size() { - - return size; - } - - public Iterator iterator() { - return new MyIterator(); - } - - public class MyIterator implements Iterator { - - int i = 0; - - @Override - public boolean hasNext() { - while (elementData[i] != null) { - return true; - } - return false; - } - - @Override - public Object next() { - return elementData[i++]; - } - } - - - public static void main(String[] args) { - ArrayList a = new ArrayList(); - a.add(1); - a.add(2); - a.add(3); - - MyIterator b = (MyIterator) a.iterator(); - - while(b.hasNext()){ - System.out.println(b.next()); - } - } - - - -} diff --git a/group15/1514_616019420/BinaryTreeNode.java b/group15/1514_616019420/BinaryTreeNode.java deleted file mode 100644 index 763f79c06c..0000000000 --- a/group15/1514_616019420/BinaryTreeNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o) { - BinaryTreeNode node = new BinaryTreeNode(); - if (left == null && right != null) { - right = node; - } else if (right == null & left != null) { - left = node; - } else { - return null; - } - return node; - } - -} diff --git a/group15/1514_616019420/Iterator.java b/group15/1514_616019420/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group15/1514_616019420/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group15/1514_616019420/LinkedList.java b/group15/1514_616019420/LinkedList.java deleted file mode 100644 index 0e3bed357f..0000000000 --- a/group15/1514_616019420/LinkedList.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private int size; - - public void add(Object o) { - Node n = new Node(); - n.data = o; - if (head != null) { - n.next = head; - size++; - } else { - size = 1; - } - head = n; - } - - public void add(int index, Object o) { - - Node n1 = head; - Node n2 = new Node(); - for (int i = size - 1; i >= index; i--) { - if (i == index) { - n2.next = n1.next; - n2.data = 0; - n1.next = n2; - } else { - n1 = n1.next; - } - - } - - size++; - } - - public Object get(int index) { - Node n1 = head; - Object o = null; - for (int i = size - 1; i >= index; i--) { - n1 = n1.next; - if (i == index) { - o = n1.data; - } - - } - - return o; - } - - public Object remove(int index) { - Node n1 = head; - Node n2 = new Node(); - Node n3 = new Node(); - Object o = null; - for (int i = size - 1; i >= index; i--) { - if (i == index + 1) { - n2 = n1.next; - } else if (i == index) { - n3 = n2.next; - o = n3.data; - n1 = n3.next; - } else { - n1 = n1.next; - } - - } - n2.next = n1; - size--; - return o; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node n=new Node(); - Node n1=head; - - for(int i=size-1;i>=0;i--) - { - n1=n1.next; - if(i==0){ - n=n1.next; - n.data=o; - } - - } - } - - public void addLast(Object o) { - Node n=new Node(); - n.data=o; - n.next=head; - head=n; - - } - - public Object removeFirst() { - Object o= new Object(); - Node n1=head; - - for(int i=size-1;i>=0;i--) - { - n1=n1.next; - if(i==1){ - o=n1.next.data; - n1.next=null; - } - - } - return o; - } - - public Object removeLast() { - Object o= new Object(); - Node n=head; - head=n.next; - o=n.data; - n.next=null; - return o; - } - - public Iterator iterator() { - - return null; - } - - private static class Node { - Object data; - Node next; - - } -} diff --git a/group15/1514_616019420/List.java b/group15/1514_616019420/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group15/1514_616019420/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group15/1514_616019420/Queue.java b/group15/1514_616019420/Queue.java deleted file mode 100644 index 9f55b2a4fa..0000000000 --- a/group15/1514_616019420/Queue.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList list =new LinkedList(); - - public void enQueue(Object o){ - - list.addFirst(o); - } - - public Object deQueue(){ - return list.removeLast(); - } - - public boolean isEmpty(){ - return list.size()==0; - } - - public int size(){ - return list.size(); - } -} diff --git a/group15/1514_616019420/Stack.java b/group15/1514_616019420/Stack.java deleted file mode 100644 index 88589d98c7..0000000000 --- a/group15/1514_616019420/Stack.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - - return elementData.remove(elementData.size()-1); - } - - public Object peek(){ - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return elementData.size()==0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group15/1515_337959725/.classpath b/group15/1515_337959725/.classpath deleted file mode 100644 index d171cd4c12..0000000000 --- a/group15/1515_337959725/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group15/1515_337959725/.gitignore b/group15/1515_337959725/.gitignore deleted file mode 100644 index 5e56e040ec..0000000000 --- a/group15/1515_337959725/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin diff --git a/group15/1515_337959725/.project b/group15/1515_337959725/.project deleted file mode 100644 index 8c7c8dd0f7..0000000000 --- a/group15/1515_337959725/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - BasicTest - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group15/1515_337959725/src/com/coding/basic/ArrayListTest.java b/group15/1515_337959725/src/com/coding/basic/ArrayListTest.java deleted file mode 100644 index dbdbbbc406..0000000000 --- a/group15/1515_337959725/src/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayListTest implements ListTest{ - private Object[] obj; - - public ArrayListTest() { - obj=new Object[0]; - } - - public void add(Object o) { - obj = Arrays.copyOf(obj, obj.length+1); - obj[obj.length-1]=o; - } - - public void add(int index, Object o) { - obj = Arrays.copyOf(obj, obj.length+1); - for(int i=index;inode2.data){ - if(node1.left==null){ - node1.left=node2; - }else{ - compareNode(node1.left,node2); - } - }else{ - if(node1.right==null){ - node1.right=node2; - }else{ - compareNode(node1.right,node2); - } - } - } - -} diff --git a/group15/1515_337959725/src/com/coding/basic/IteratorTest.java b/group15/1515_337959725/src/com/coding/basic/IteratorTest.java deleted file mode 100644 index f8fcdcaa9c..0000000000 --- a/group15/1515_337959725/src/com/coding/basic/IteratorTest.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface IteratorTest { - public boolean hasNext(); - public Object next(); -} diff --git a/group15/1515_337959725/src/com/coding/basic/LinkedListTest.java b/group15/1515_337959725/src/com/coding/basic/LinkedListTest.java deleted file mode 100644 index 03b4e1946c..0000000000 --- a/group15/1515_337959725/src/com/coding/basic/LinkedListTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.coding.basic; - -public class LinkedListTest implements ListTest { - private Node headNode; - private Node tailNode; - - class Node{ - private Object obj; -// private Node proNode; - private Node nextNode; - - public Node(Object obj) { - this.obj = obj; - } - - - } - - public void add(Object o) { - if(headNode==null){ - headNode=new Node(o); - tailNode=headNode; - }else{ - tailNode.nextNode=new Node(o); - tailNode=tailNode.nextNode; - } - } - - public void add(int index, Object o) { - Node newNode=new Node(o); - Node node=headNode; - for(int i=0;i elementData.length-1){ - return "get position illegal."; - }else{ - return elementData[index]; - } - } - - public int size(){ - return size; - } - - public String toString(){ - String str ="toString():"; - for(int i=0; i 0) - throw new IndexOutOfBoundsException(); - } - - /** - * 增加数组容量 - */ - private void kuorong() { - elementData = Arrays.copyOf(elementData, size + 1); - } - - /** - * 添加数据 - * - * @param o - */ - public void add(Object o) { - //扩容 - kuorong(); - //添加数据 - elementData[size++] = o; - } - - /** - * 在指定索引添加数据 - * - * @param index - * @param o - */ - public void add(int index, Object o) { - //扩容 - kuorong(); - //移动数据 - System.arraycopy(elementData, index, elementData, index + 1, size - index); - //添加数据 - elementData[index] = o; - size++; - } - - /** - * 获取指定索引数据 - * - * @param index - * @return - */ - public Object get(int index) { - //检查是否越界 - checkLenght(index); - return elementData[index]; - } - - /** - * 移除指定索引数据 - * - * @param index - * @return - */ - public Object remove(int index) { - //检查是否越界 - checkLenght(index); - Object element = elementData[index]; - //计算移除该元素后,要前移的个数 - int movesize = size - index - 1; - //移动数据 - System.arraycopy(elementData, index + 1, elementData, index, movesize); - //删除末尾元素 - elementData[--size] = null; - return element; - } - - /** - * 返回数量 - * - * @return - */ - public int size() { - return size; - } - - /** - * 获取迭代器 - * - * @return - */ - public Iterator iterator() { - return new ArrayItr(); - } - - //迭代器实现类部类 - private class ArrayItr implements Iterator { - int cursor;//游标 - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public Object next() { - int i = cursor; - if (i > size) throw new NoSuchElementException(); - Object[] newElementData = ArrayList.this.elementData; - if (i > newElementData.length) throw new IndexOutOfBoundsException(); - cursor = i + 1; - return newElementData[i]; - } - } - - /** - * 重写toString 方便打印 - * - * @return - */ - @Override - public String toString() { - Object[] s = Arrays.copyOf(elementData, size); - return Arrays.toString(s); - } -} diff --git a/group15/1521_653895972/src/com/coding/basic/BasicTest.java b/group15/1521_653895972/src/com/coding/basic/BasicTest.java deleted file mode 100644 index a181087104..0000000000 --- a/group15/1521_653895972/src/com/coding/basic/BasicTest.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.coding.basic; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by wanc on 2017/2/21. - */ -public class BasicTest { - - @Test - public void test() { - //测试 - testArrayList(); - testLinkedList(); - testBinaryTreeNode(); - testStack(); - testQueue(); - } - - - public void testQueue(){ - Queue queue = new Queue(); - queue.enQueue("S"); - queue.enQueue("Y"); - queue.enQueue(5); - System.out.println(queue); - System.out.println("queue.size()="+queue.size()); - System.out.println("queue.deQueue()="+queue.deQueue()); - System.out.println(queue); - System.out.println("queue.isEmpty()="+queue.isEmpty()); - System.out.println(queue); - } - public void testStack(){ - Stack stack = new Stack(); - stack.push("S"); - stack.push("Y"); - stack.push(5); - System.out.println("stack.size()="+stack.size()); - System.out.println("stack.peek()="+stack.peek()); - System.out.println(stack); - System.out.println("stack.isEmpty()="+stack.isEmpty()); - stack.pop(); - System.out.println(stack); - } - public void testBinaryTreeNode(){ - System.out.println("-------------------BinaryTreeNode 测试开始-------------------"); - System.out.println("new 一个实例"); - BinaryTreeNode root = new BinaryTreeNode(); - root.insert(5); - root.insert(6); - root.insert(9); - root.insert(3); - root.insert(3); - root.insert(2); - root.insert(10); - System.out.println(root); - System.out.println("-------------------LinkedList 测试结束-------------------"); - } - public void testLinkedList() { - System.out.println("-------------------LinkedList 测试开始-------------------"); - - System.out.println("new 一个实例"); - LinkedList list = new LinkedList(); - - System.out.println("添加元素----A"); - list.add("A"); - Assert.assertEquals(list.get(list.size()-1),"A"); - System.out.println("结果:"+list); - - System.out.println(); - System.out.println("添加元素----B"); - list.add("B"); - Assert.assertEquals(list.get(list.size()-1),"B"); - System.out.println("结果:"+list); - - System.out.println(); - System.out.println("添加元素----3"); - list.add(3); - Assert.assertEquals(list.get(list.size()-1),3); - System.out.println("结果:"+list); - - System.out.println(); - System.out.println("在下标1插入元素----3"); - list.add(1, 3); - Assert.assertEquals(list.get(1),3); - System.out.println("结果:"+list); - - System.out.println(); - System.out.println("在下标3插入元素----6"); - list.add(3, 6); - Assert.assertEquals(list.get(3),6); - System.out.println("结果:"+list); - - System.out.println(); - System.out.println("删除下标0元素"); - list.remove(0); - System.out.println("结果:"+list); - - System.out.println(); - System.out.println("获取size"); - System.out.println("结果:"+list.size()); - - System.out.println(); - System.out.println("在首位前插入F"); - list.addFirst("F"); - Assert.assertEquals(list.get(0),"F"); - System.out.println("结果:"+list); - - System.out.println(); - System.out.println("在末位前插入K"); - list.addLast("K"); - Assert.assertEquals(list.get(list.size()-1),"K"); - System.out.println("结果:"+list); - - System.out.println(); - System.out.println("删除首位"); - list.removeFirst(); - System.out.println("结果:"+list); - - System.out.println(); - System.out.println("删除末尾"); - list.removeLast(); - System.out.println("结果:"+list); - - System.out.println(); - System.out.println("迭代器输出:"); - Iterator i = list.iterator(); - while (i.hasNext()){ - System.out.print(i.next()+" "); - } - System.out.println("-------------------LinkedList 测试结束-------------------"); - } - - /** - * 测试 ArrayList - */ - public void testArrayList() { - System.out.println("-------------------ArrayList 测试开始-------------------"); - - System.out.println("new 一个实例"); - ArrayList list = new ArrayList(); - - System.out.println("添加元素 A"); - list.add("A"); - Assert.assertEquals(list.get(list.size()-1),"A"); - - System.out.println("添加元素 B"); - list.add("B"); - Assert.assertEquals(list.get(list.size()-1),"B"); - - System.out.println("添加元素 3"); - list.add(3); - Assert.assertEquals(list.get(list.size()-1),3); - System.out.println("输出:"+list); - - System.out.println("添加元素 3 到索引 1"); - list.add(1, 3); - Assert.assertEquals(list.get(1),3); - System.out.println("输出:"+list); - - System.out.println("添加元素 6 到索引 3"); - list.add(3, 6); - Assert.assertEquals(list.get(3),6); - System.out.println("输出:"+list); - - System.out.println("移除 索引 4 元素"); - Object rm = list.remove(4); - System.out.println("输出:"+list); - - System.out.println("获取 索引 4 元素"); - Object get = list.get(4); - Assert.assertNotEquals(rm,get); - - System.out.println("输出:"+list); - System.out.println("数量:"+list.size()); - Iterator i = list.iterator(); - System.out.print("迭代器输出:"); - while (i.hasNext()){ - System.out.print(i.next()+" "); - } - System.out.println("-------------------ArrayList 测试结束-------------------"); - } -} diff --git a/group15/1521_653895972/src/com/coding/basic/BinaryTreeNode.java b/group15/1521_653895972/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 34d76db083..0000000000 --- a/group15/1521_653895972/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.coding.basic; - -/** - * 实现二叉树 - * left总比父节点小 - * right总比父节点大 - */ -public class BinaryTreeNode { - private Node root; - private int size = 0; - - /** - * 插入数据 - * @param data - */ - public void insert(int data) { - final Node newNode = new Node(data); - if (root == null) {//根节点为空 直接插入数据到根节点 - root = newNode; - } else { - Node current = root; - while (true) {//循环判断 - Node parent = current; - if (data < current.data) {//比父节点小 就是left - current = current.left; - //直到left节点不存在 - if (current == null) { - //插入数据 - parent.left = newNode; - return; - } - } else {//比父节点大 也就是right - current = current.right; - //直到right节点不存在 - if (current == null) { - //插入数据 - parent.right = newNode; - return; - } - } - } - } - size++; - } - - - /** - * 返回数量 - * @return - */ - public int size() { - return size; - } - - /** - * 重写toString 方便打印 - * - * @return - */ - @Override - public String toString() { - return "["+midTraverse(root)+"]"; - } - - /** - * 节点内部类 用于保存数据 - */ - private static class Node { - int data; - Node left; - Node right; - - Node(int data) { - this.data = data; - this.left = null; - this.right = null; - } - } - - //先序遍历 - private String preTraverse(Node node) { - if (node == null) - return ""; - else - return node.data + preJointComma(preTraverse(node.left)) + preJointComma(preTraverse(node.right)); - } - //中序遍历 - private String midTraverse(Node node) { - if (node == null) - return ""; - else - return midTraverse(node.left)+" "+node.data+" " +midTraverse(node.right); - } - //后序遍历 - private String posTraverse(Node node) { - if (node == null) - return ""; - else - return posTraverse(node.left)+" " +posTraverse(node.right)+" "+node.data; - } - - private String preJointComma(String str) { - return str == "" ? "" : "," + str; - } -} diff --git a/group15/1521_653895972/src/com/coding/basic/Iterator.java b/group15/1521_653895972/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group15/1521_653895972/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group15/1521_653895972/src/com/coding/basic/LinkedList.java b/group15/1521_653895972/src/com/coding/basic/LinkedList.java deleted file mode 100644 index f1f942590d..0000000000 --- a/group15/1521_653895972/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,271 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -/** - * Created by wanc on 2017/2/21. - * 实现单向链表集合 - */ -public class LinkedList implements List { - /** - * 首节点 - */ - private Node head; - /** - * 计数 - */ - private int size = 0; - - /** - * 检查是否越界 利用jdk源码的检测方法 - */ - private boolean isElementIndex(int index) { - return index >= 0 && index < size; - } - - /** - * JDK 源码检测方法 - * - * @param index - * @return - */ - private boolean isPositionIndex(int index) { - return index >= 0 && index <= size; - } - - /** - * JDK 源码 错误信息 - * - * @param index - * @return - */ - private String outOfBoundsMsg(int index) { - return "Index: " + index + ", Size: " + size; - } - - /** - * JDK 源码检测方法 - * - * @param index - * @return - */ - private void checkElementIndex(int index) { - if (!isElementIndex(index)) - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - - /** - * JDK 源码检测方法 - * - * @param index - * @return - */ - private void checkPositionIndex(int index) { - if (!isPositionIndex(index)) - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - - /** - * 获取对应下标的节点 - */ - Node node(int index) { - Node x = head; - for (int i = 0; i < index; i++) - x = x.next; - return x; - } - - /** - * 在末尾添加数据 - * - * @param o - */ - public void add(Object o) { - - if (head == null) - head = new Node(o, null); - else { - final Node lastNode = node(size - 1); - final Node newNode = new Node(o, null); - lastNode.next = newNode; - } - size++; - } - - /** - * 指定位置添加数据 - * - * @param index - * @param o - */ - public void add(int index, Object o) { - checkPositionIndex(index); - if (size == index) - add(o); - else { - final Node prevNode = node(index - 1); - final Node nextNode = prevNode.next; - final Node newNode = new Node(o, nextNode); - prevNode.next = newNode; - size++; - } - } - - /** - * 获取指定索引数据 - * - * @param index - * @return - */ - public Object get(int index) { - return node(index).data; - } - - /** - * 移除指定索引数据 - * - * @param index - * @return - */ - public Object remove(int index) { - checkElementIndex(index); - final Node prevNode = node(index - 1); - final Node x = prevNode.next; - if (index - 1 < 0) { - prevNode.next = null; - head = x; - } else { - final Node nextNode = x.next; - prevNode.next = nextNode; - x.next = null; - } - size--; - return x.data; - } - - /** - * 返回数量 - * - * @return - */ - public int size() { - return size; - } - - /** - * 在链首添加数据 - * - * @return - */ - public void addFirst(Object o) { - final Node h = head; - final Node newNode = new Node(o, h); - head = newNode; - size++; - } - - /** - * 在链尾添加数据 - * - * @return - */ - public void addLast(Object o) { - add(o); - } - - /** - * 移除链首数据 - * - * @return - */ - public Object removeFirst() { - final Node h = head; - if (h == null) - throw new NoSuchElementException(); - final Node newFirst = h.next; - h.next = null; - head = newFirst; - size--; - return h.data; - } - - /** - * 移除链尾数据 - * - * @return - */ - public Object removeLast() { - final Node prev = node(size - 1 - 1); - final Node l = prev.next; - prev.next = null; - l.next = null; - size--; - return l.data; - } - - /** - * 获取迭代器 - * - * @return - */ - public Iterator iterator() { - return new LinkedItr(); - } - - /** - * 迭代器实现内部类 - * - * @return - */ - private class LinkedItr implements Iterator { - int cursor;//游标 - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public Object next() { - int i = cursor; - if (i > size - 1) throw new NoSuchElementException(); - Node current = node(i); - if (current == null) throw new IndexOutOfBoundsException(); - cursor = i + 1; - return current.data; - } - } - - /** - * 节点内部类 用于保存数据 - */ - private static class Node { - Object data; - Node next; - - Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } - - /** - * 重写toString 方便打印 - * - * @return - */ - @Override - public String toString() { - String result = "["; - for (int i = 0; i < size; i++) { - Node n = node(i); - if (i == 0) - result += n.data; - else - result += "," + n.data; - - } - - return result + "]"; - } -} diff --git a/group15/1521_653895972/src/com/coding/basic/List.java b/group15/1521_653895972/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group15/1521_653895972/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group15/1521_653895972/src/com/coding/basic/Queue.java b/group15/1521_653895972/src/com/coding/basic/Queue.java deleted file mode 100644 index 4add2be9a4..0000000000 --- a/group15/1521_653895972/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coding.basic; - -/** - * Created by wanc on 2017/2/21. - * 利用LinkedList 实现队列 - */ -public class Queue { - /** - * 利用LinkedList 保存数据 - */ - private LinkedList elementData = new LinkedList(); - - /** - * 入队 - * - * @param o - */ - public void enQueue(Object o) { - elementData.add(o); - } - - /** - * 出队 - * - * @return - */ - public Object deQueue() { - return elementData.removeFirst(); - } - - /** - * 是否为空 - * - * @return - */ - public boolean isEmpty() { - return elementData.size() == 0 ? true : false; - } - - /** - * 返回队列长度 - * - * @return - */ - public int size() { - return elementData.size(); - } - - /** - * 重写toString 方便打印 - * - * @return - */ - @Override - public String toString() { - return "Queue{" + - "elementData=" + elementData + - '}'; - } -} diff --git a/group15/1521_653895972/src/com/coding/basic/Stack.java b/group15/1521_653895972/src/com/coding/basic/Stack.java deleted file mode 100644 index 23c5ba6a7b..0000000000 --- a/group15/1521_653895972/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.coding.basic; -/** - * Created by wanc on 2017/2/21. - * 利用ArrayList 实现栈 - */ -public class Stack { - /** - * 利用ArrayList 保存数据 - */ - private ArrayList elementData = new ArrayList(); - - /** - * 入栈 - * @param o - */ - public void push(Object o) { - elementData.add(o); - } - - /** - * 出栈 - * @return - */ - public Object pop() { - elementData.remove(elementData.size()-1); - return null; - } - - /** - * 返回栈顶数据 - * @return - */ - public Object peek() { - return elementData.get(elementData.size()-1); - } - - /** - * 是否为空 - * @return - */ - public boolean isEmpty() { - return elementData.size()==0?true:false; - } - - /** - * 返回栈长度 - * @return - */ - public int size() { - return elementData.size(); - } - - /** - * 重写toString 方便打印 - * - * @return - */ - @Override - public String toString() { - return "Stack{" + - "elementData=" + elementData + - '}'; - } -} diff --git a/group15/group15.md b/group15/group15.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group15/group15.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group16/1012075117/DataStructure219/.classpath b/group16/1012075117/DataStructure219/.classpath deleted file mode 100644 index fceb4801b5..0000000000 --- a/group16/1012075117/DataStructure219/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group16/1012075117/DataStructure219/.project b/group16/1012075117/DataStructure219/.project deleted file mode 100644 index 567baae65f..0000000000 --- a/group16/1012075117/DataStructure219/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - DataStructure219 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group16/1012075117/DataStructure219/.settings/org.eclipse.jdt.core.prefs b/group16/1012075117/DataStructure219/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group16/1012075117/DataStructure219/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/ArrayList.java b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/ArrayList.java deleted file mode 100644 index a1d46a21d8..0000000000 --- a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/ArrayList.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.stackwei.DataStructure; - -/** - * - * @author stackwei -2017.2.25 - * - */ -public class ArrayList implements List { - - private int flag = -1; - private static final int DEFAULT_CAPACITY = 1; - private Object[] elementData = new Object[DEFAULT_CAPACITY]; - - @Override - public void add(Object element) { - // 当要添加数据的位置已经超过数组长度时,增长数组长度 - if (size() + 1 == elementData.length) { - grow(); - } - elementData[flag + 1] = element; - flag++; - } - - @Override - public void add(int index, Object element) { - if (index < 0 || index > getFlag() + 1) { - System.out.println("在--" + index + "--添加的--" + element + "--无效,因为越界了!"); - return; - } - // 数组长度永远比已存数据大一个。 - if (size() + 1 == elementData.length) { - grow(); - } - elementData[index] = element; - if (index > getFlag()) { - flag++; - } - } - - @Override - public Object get(int index) { - if (index < 0 || index > getFlag()) { - System.out.print("在--" + index + "--的get无效,因为越界了!"); - return null; - } - return elementData[index]; - } - - @Override - public Object remove(int index) { - if (index < 0 || index > getFlag()) { - System.out.println("在--" + index + "--的remove无效,因为越界了!"); - return null; - } - Object oldValue = elementData[index]; - elementData[index] = null; - // 将删除处后面的数据往前移一格。 - Object[] data2 = new Object[elementData.length - 1]; - System.arraycopy(elementData, 0, data2, 0, getFlag()); - elementData = data2; - flag--; - return oldValue; - } - - @Override - public int size() { - return getFlag() + 1; - } - - public int getFlag() { - return flag; - } - - private void grow() { - Object[] data2 = new Object[elementData.length + 1]; - System.arraycopy(elementData, 0, data2, 0, getFlag() + 2);// 最后一个参数是需要复制的数据的数量。 - elementData = data2; - } - - /** - * 测试用例 - * - * @param args - */ - public static void main(String[] args) { - ArrayList al = new ArrayList(); - al.add(0, 99); - al.add(1, 100); - System.out.println(al.get(1)); - al.remove(1); - System.out.println(al.get(1)); - System.out.println(al.size()); - } -} \ No newline at end of file diff --git a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/LinkedList.java b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/LinkedList.java deleted file mode 100644 index a1c728f0a1..0000000000 --- a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/LinkedList.java +++ /dev/null @@ -1,194 +0,0 @@ -package com.stackwei.DataStructure; - -/** - * - * @author stackwei -2017.2.25 - * - */ -public class LinkedList implements List { - - private Node head = null; - private Node last = null; - private int size = 0; - - private static class Node { - Object item; - Node prev; - Node next; - - public Node(Node prev, Object item, Node next) { - this.prev = prev; - this.item = item; - this.next = next; - } - } - - @Override - public void add(Object element) { - addLast(element); - } - - @Override - public void add(int index, Object element) { - if (index < 0 || index > size) { - System.out.println("操作无效,越界了"); - return; - } - if (index == 0) { - addFirst(element); - return; - } - if (index == size) { - addLast(element); - return; - } - Node indexNode = node(index); - Node newNode = new Node(indexNode.prev, element, indexNode); - indexNode.prev.next = newNode; - indexNode.prev = newNode; - size++; - } - - @Override - public Object get(int index) { - if (index < 0 || index >= size) { - System.out.println("查询无效,越界了"); - return null; - } - if (index == 0) { - return head.item; - } - return node(index).item; - } - - @Override - public Object remove(int index) { - if (index < 0 || index > size) { - System.out.println("是空的,无法删除"); - return null; - } - if (index == 0) { - return removeFirst(); - } - if (index == size - 1) { - return removeLast(); - } - Node x = node(index); - final Object element = x.item; - final Node next = x.next; - final Node prev = x.prev; - - if (prev == null) { - head = next; - } else { - prev.next = next; - x.prev = null; - } - - if (next == null) { - last = prev; - } else { - next.prev = prev; - x.next = null; - } - - x.item = null; - size--; - return element; - } - - @Override - public int size() { - return size; - } - - private void addFirst(Object element) { - final Node f = head; - Node newNode = new Node(null, element, f); - head = newNode; - if (f == null) - last = newNode; - else - f.prev = newNode; - size++; - } - - public void addLast(Object element) { - if (head == null) { - addFirst(element); - } else { - Node newNode = new Node(last, element, null); - last.next = newNode; - last = newNode; - size++; - } - } - - public Object removeFirst() { - if (head == null) { - System.out.println("是空的,无法删除"); - return null; - } else { - Node x = head; - Node next = head.next; - Object element = x.item; - x.item = null; - x.next = null; - head = next; - if (next == null) - last = null; - else - x.prev = null; - size--; - return element; - } - } - - public Object removeLast() { - if (last == null) { - System.out.println("是空的,无法删除"); - return null; - } else { - final Node l = last; - final Object element = l.item; - final Node p = l.prev; - l.item = null; - l.prev = null; - last = p; - if (p == null) - head = null; - else - p.next = null; - size--; - return element; - } - } - - Node node(int index) { - if (index < (size >> 1)) { - Node x = head; - for (int i = 0; i < index; i++) - x = x.next; - return x; - } else { - Node x = last; - for (int i = size - 1; i > index; i--) - x = x.prev; - return x; - } - } - - /** - * 测试用例 - * - * @param args - */ - public static void main(String[] args) { - LinkedList ll = new LinkedList(); - ll.add(0, "xxx"); - ll.add(1, 111); - System.out.println(ll.size()); - System.out.println(ll.get(2)); - - } -} \ No newline at end of file diff --git a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/List.java b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/List.java deleted file mode 100644 index 5226796141..0000000000 --- a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.stackwei.DataStructure; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Queue.java b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Queue.java deleted file mode 100644 index 4a227495e9..0000000000 --- a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Queue.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.stackwei.DataStructure; - -/** - * - * @author stackwei -2017.2.25 - * - */ -public class Queue { - - private LinkedList ll = new LinkedList(); - - /** - * 在队尾添加数据 - * @param element - */ - public void enQueue(Object element) { - ll.addLast(element); - } - - /** - * 删除队头数据 - * @return - */ - public Object deQueue() { - return ll.removeFirst(); - } - - /** - * 队列是否为空 - * @return - */ - public boolean isEmpty() { - if (ll.size() > 0) { - return false; - } - return true; - } - - /** - * 测试用例 - * @param args - */ - public static void main(String[] args) { - Queue q = new Queue(); - q.enQueue(97); - q.enQueue(98); - q.enQueue(99); - System.out.println(q.isEmpty()); - System.out.println(q.deQueue()); - } - -} diff --git a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Stack.java b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Stack.java deleted file mode 100644 index 1b047ffafd..0000000000 --- a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Stack.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.stackwei.DataStructure; - -/** - * - * @author stackwei -2017.2.25 - * - */ -public class Stack { - - private ArrayList al = new ArrayList(); - - /** - * 进栈 - * @param item - */ - public void push(Object item) { - al.add(item); - } - - /** - * 出栈 - * @return - */ - public Object pop() { - return al.remove(al.getFlag()); - } - - /** - * 获取栈顶元素 - * @return - */ - public Object peek() { - return al.get(al.getFlag()); - } - - /** - * 栈是否为空 - * @return - */ - public boolean isEmpty() { - if (al.getFlag() >= 0) { - return false; - } - return true; - } - - /** - * 测试用例 - * @param args - */ - public static void main(String[] args) { - Stack s = new Stack(); - s.push(98); - s.push(99); - s.pop(); - System.out.println(s.peek()); - } - -} diff --git a/group16/1154151360/.classpath b/group16/1154151360/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group16/1154151360/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group16/1154151360/.gitignore b/group16/1154151360/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group16/1154151360/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group16/1154151360/.project b/group16/1154151360/.project deleted file mode 100644 index f88388f6d7..0000000000 --- a/group16/1154151360/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - DataStructure2 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group16/1154151360/.settings/org.eclipse.core.resources.prefs b/group16/1154151360/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0203..0000000000 --- a/group16/1154151360/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/group16/1154151360/src/com/list/ArrayList.java b/group16/1154151360/src/com/list/ArrayList.java deleted file mode 100644 index 733dc0f341..0000000000 --- a/group16/1154151360/src/com/list/ArrayList.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.list; - - -//ArrayList -public class ArrayList { - - private int size; - - private Object [] elementData = new Object[10]; - - public boolean add(Object data){ - - getRow(size+1); - elementData[size++] = data; - return true; - } - - public boolean add(int index, Object data){ - if (index < 0 || index > elementData.length){ - throw new IndexOutOfBoundsException("�±�Խ��"); - } - getRow(size + 1); - Object object = elementData [index]; - System.arraycopy(elementData, index,elementData , index + 1,size - index ); - elementData[index] = data; - size++; - return true; - } - - public Object get(int index){ - if (index < 0 || index > elementData.length){ - throw new IndexOutOfBoundsException("下标越界"); - } - return elementData[index]; - } - - public Object remove(int index){ - if (index < 0 || index > elementData.length){ - throw new IndexOutOfBoundsException("下标越界"); - } - Object object = elementData [index]; - System.arraycopy(elementData, index + 1 , elementData, index, size - 1 - index); - elementData[size--]= null; - return object; - } - - - private void getRow(int num){ - if (num > elementData.length ){ - int oldLength = elementData.length; - int newLength = ((num + elementData.length) * 3) >> 2; - Object [] oldelements = elementData; - elementData = new Object[newLength]; - System.arraycopy(oldelements, 0, elementData, 0, size); - } - } - - public int size(){ - return size; - } - - public int length(){ - return elementData.length; - } - public static void main(String[] args) { - ArrayList list = new ArrayList(); - - list.add("A"); - list.add("B"); - list.add("C"); - list.add("D"); - list.add("E"); - list.add("F"); - list.add("G"); - list.add("H"); - list.add("I"); - list.add("J"); - list.add("K"); - list.add("L"); - list.add(2, 1); - System.out.println("elementsData.Length: "+list.length()); - System.out.println("elementsData.size: "+list.size()); - for (int i = 0; i < list.size; i++){ - System.out.print(list.get(i)+ " "); - } - System.out.println(" "); - list.remove(2); - - for (int i = 0; i < list.size; i++){ - System.out.print(list.get(i)+ " "); - } - } -} diff --git a/group16/1154151360/src/com/list/LinkedList.java b/group16/1154151360/src/com/list/LinkedList.java deleted file mode 100644 index 46f61fb667..0000000000 --- a/group16/1154151360/src/com/list/LinkedList.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.list; - -public class LinkedList { - - private int size; - - private Node head;//头节点 - - Node current; //当前节点 - - public LinkedList(){ - this.head = current = new Node(null); - this.size = 0; - } - - - private boolean add(Object object){ - addAfter(object); - size++; - return true; - } - - - private boolean add(int index,Object object) throws Exception{ - index(index - 1); - current.nextNode = new Node(object,current.nextNode.nextNode); - size++; - return true; - } - - - private boolean addFirst(Object object){ - Node node = new Node(object,null); - current = head.nextNode; - head.nextNode = node; - node.nextNode = current; - size++; - return true; - } - - - private boolean addLast(Object object){ - add(object); - return true; - } - - - private Object get(int index) throws Exception{ - index(index); - return current.object; - } - - - private Object remove(int index) throws Exception{ - - if (index == size - 1){ - Object object = removeLast(); - return object; - } - index(index - 1); - Object object = current.nextNode.object; - - current.nextNode = current.nextNode.nextNode; - size--; - return object; - } - - private Object removeFirst(){ - Object object = null; - if (size > 0){ - current = head.nextNode; - object = current.object; - head.nextNode = head.nextNode.nextNode; - size--; - } - return object; - } - - private Object removeLast() throws Exception{ - Object object = null; - if (size > 0){ - int j = 0; - current = head.nextNode; - - while (current != null){ - current = current.nextNode; - j++; - } - index(j - 1); - object = current.nextNode.object; - current.nextNode = null; - size--; - } - return object; - } - private void index (int index) throws Exception{ - - if (index < -1 || index > size){ - - throw new Exception(" "); - } - - if (index == -1){ - return; - } - current = head.nextNode; - int j = 0; - while (current != null && j < index){ - current = current.nextNode; - j++; - } - } - - - private void addAfter(Object object){ - - if (head.nextNode == null){ - - Node newNode = new Node(object,null); - }else{ - current = head.nextNode; - while (current.nextNode == null){ - current = current.nextNode; - } - current.setNode(new Node(object,null)); - } - - - } - - - - - private static class Node{ - - Object object; - - Node nextNode; - - - Node (Node nextNode){ - this.nextNode = nextNode; - } - - - Node (Object object, Node nextNode){ - this.nextNode = nextNode; - this.object = object; - } - - private void setNode(Node node){ - this.nextNode = node; - } - - } - - -} diff --git a/group16/1154151360/src/com/list/Queue.java b/group16/1154151360/src/com/list/Queue.java deleted file mode 100644 index faa3e87381..0000000000 --- a/group16/1154151360/src/com/list/Queue.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.list; -//队列 -public class Queue { - - Object [] element; - - private static int DEFAULT_SIZE = 10; - - int front;//头指针 - - int rear;//尾指针 - - public Queue(){ - this(DEFAULT_SIZE); - } - public Queue(int size){ - element = new Object[size]; - this.front = 0; - this.rear = 0; - } - - public boolean enQueue(Object object){ - - if ((rear + 1) % element.length == front){ - return false; - }else{ - element[rear] = object; - rear = (rear + 1) % element.length; - return true; - } - } - - public Object deQueue(){ - if (front == rear){ - return null; - }else{ - Object object = element[front]; - front = (front + 1) % element.length; - return object; - } - - } - - public int size(){ - return (rear -front) & (element.length - 1); - } - - public boolean isEmpty(){ - return rear == front; - } -} diff --git a/group16/1154151360/src/com/list/Stack.java b/group16/1154151360/src/com/list/Stack.java deleted file mode 100644 index f92a9e731c..0000000000 --- a/group16/1154151360/src/com/list/Stack.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.list; - -import java.util.ArrayList; -import java.util.EmptyStackException; - -public class Stack { - - ArrayList elelmentData = new ArrayList(); - - //压入栈 - public void push(Object object){ - elelmentData.add(object); - } - - //弹出栈 - public Object pop(){ - if (isEmpty()){ throw new EmptyStackException();} - return elelmentData.remove(elelmentData.size() - 1); - } - - //取栈顶元素 - public Object peek(){ - if (isEmpty()){return null;} - return elelmentData.get(elelmentData.size() - 1); - } - - public boolean isEmpty(){ - return elelmentData.isEmpty(); - } - - public int size(){ - if (isEmpty()){throw new EmptyStackException();} - return elelmentData.size(); - } -} diff --git a/group16/1287642108/0226/src/com/coding/basic/ArrayList.java b/group16/1287642108/0226/src/com/coding/basic/ArrayList.java deleted file mode 100644 index e287419dc0..0000000000 --- a/group16/1287642108/0226/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - IncrementsCapacity(size + 1); - elementData[size++] = o; - - } - - public void add(int index, Object o) { - checkIndex(index); - IncrementsCapacity(size + 1); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - public Object get(int index) { - checkIndex(index); - return elementData[index]; - } - - public Object remove(int index) { - checkIndex(index); - Object o = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - elementData[--size] = null; - return o; - } - - public int size() { - return size; - } - - public int length() { - return elementData.length; - } - - // - private void IncrementsCapacity(int num) { - if (num > elementData.length) { - int oldCapacity = elementData.length; // ǰ鳤 - int newCapacity = ((num + oldCapacity) * 3) >> 2; // ǰ鳤ȵ1.5 - if (newCapacity - num < 0) { - newCapacity = num; // Dz,ֱΪֵ - } - Object[] oldelements = elementData; - elementData = new Object[newCapacity]; - System.arraycopy(oldelements, 0, elementData, 0, size); - } - } - - // ±Խж - private void checkIndex(int index) { - if (index >= size || index < 0) - throw new IndexOutOfBoundsException("±Խ"); - } -} diff --git a/group16/1287642108/0226/src/com/coding/basic/Iterator.java b/group16/1287642108/0226/src/com/coding/basic/Iterator.java deleted file mode 100644 index e7cbd474ec..0000000000 --- a/group16/1287642108/0226/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group16/1287642108/0226/src/com/coding/basic/LinkedList.java b/group16/1287642108/0226/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 99c92fb9f1..0000000000 --- a/group16/1287642108/0226/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private Node tail; - private int size = 0 ; - - public void add(Object o){ - addLast(o); - } - - public void add(int index, Object o) { - if (index == 0) { - addFirst(o); - } else if (index >= size) { - addLast(o); - } else { - Node node = new Node(); - node.data = o; - node.next = getNode(index); - getNode(index - 1).next = node; - size++; - } - } - - public Object get(int index) { - Node node = getNode(index); - return node.data; - } - - public Object remove(int index){ - Node currentNode = getNode(index); - Node prevNode = getNode(index - 1); - Node lastNode = getNode(index + 1); - prevNode.next = lastNode; - size--; - return currentNode.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node node=new Node(); - node.data = o; - node.next = head; - head = node; - size++; - } - public void addLast(Object o){ - Node node=new Node(); - node.data = o; - node.next = null; - Node lastNode = getNode(size-1); - lastNode.next = node; - size++; - } - public Object removeFirst(){ - Object obj = getNode(0).data; - Node node = getNode(1); - node.next = head; - size--; - return obj; - } - public Object removeLast(){ - Object obj = getNode(size - 1).data; - Node node = getNode(size - 2); - node.next = null; - size--; - return obj; - } - - //ȡڵ - public Node getNode(int index){ - checkIndex(index); - if(index == 0 ){ - return head; - }else if(index == size -1 ){ - return tail; - }else{ - Node node = head; - for(int i=0;i= size || index < 0) - throw new IndexOutOfBoundsException("±Խ"); - } - - private static class Node { - Object data; - Node next; - } -} diff --git a/group16/1287642108/0226/src/com/coding/basic/List.java b/group16/1287642108/0226/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group16/1287642108/0226/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group16/1287642108/0226/src/com/coding/basic/Queue.java b/group16/1287642108/0226/src/com/coding/basic/Queue.java deleted file mode 100644 index 95dee3d81b..0000000000 --- a/group16/1287642108/0226/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - elementData.addLast(o); - } - - public Object deQueue(){ - if (isEmpty()) { - return null; - }else{ - return elementData.removeFirst(); - } - } - - public boolean isEmpty(){ - if (elementData.size() == 0) { - return true; - } - return false; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group16/1287642108/0226/src/com/coding/basic/Stack.java b/group16/1287642108/0226/src/com/coding/basic/Stack.java deleted file mode 100644 index c0b7da89f8..0000000000 --- a/group16/1287642108/0226/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - if (isEmpty()) { - elementData.add(elementData.length() - 1, o); - } - elementData.add(elementData.length() - elementData.size() - 1, o); - } - - public Object pop() { - if (isEmpty()) { - return null; - } - return elementData.remove(elementData.length() - elementData.size() - 1); - } - - public Object peek() { - if (isEmpty()) { - return null; - } - return elementData.get(elementData.length() - elementData.size() - 1); - } - - public boolean isEmpty() { - if (elementData.size() == 0) { - return true; - } - return false; - } - - public int size() { - return elementData.size(); - } - -} diff --git a/group16/1325756593/.classpath b/group16/1325756593/.classpath deleted file mode 100644 index 3e0fb272a8..0000000000 --- a/group16/1325756593/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group16/1325756593/.gitignore b/group16/1325756593/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group16/1325756593/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group16/1325756593/.project b/group16/1325756593/.project deleted file mode 100644 index e3d07b6899..0000000000 --- a/group16/1325756593/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - DongqiHomeWork - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group16/1325756593/dongqihust.readme b/group16/1325756593/dongqihust.readme deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/group16/1325756593/src/com/dong/week1/ArrayList.java b/group16/1325756593/src/com/dong/week1/ArrayList.java deleted file mode 100644 index a700aecfb5..0000000000 --- a/group16/1325756593/src/com/dong/week1/ArrayList.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.dong.week1; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - /** - * жǷѾˣѾݴ - */ - if(elementData.length==size){ - elementData = Arrays.copyOf(elementData, elementData.length*2+1); - } - elementData[size++]=o; - - } - public void add(int index, Object o){ - if(index >size || index < 0 ){ - throw new ArrayIndexOutOfBoundsException("Խ,ǰ鳤"+size+",Ԫص:"+index); - } - /** - * Ѿˣ - */ - if(size==elementData.length){ - elementData = Arrays.copyOf(elementData, elementData.length*2+1); - } - Object[] elementDataClone = elementData.clone(); - System.arraycopy(elementData, index, elementDataClone, index+1, size-index); - elementDataClone[index++]=o; - size++; - elementData = elementDataClone; - } - - - public Object get(int index){ - if(index >=size || index < 0 ){ - throw new ArrayIndexOutOfBoundsException("Խ,ǰ鳤"+size+",Ԫص:"+index); - } - return elementData[index]; - } - - public Object remove(int index){ - if(index >=size || index < 0 ){ - throw new ArrayIndexOutOfBoundsException("Խ,ǰ鳤"+size+",ɾԪص:"+index); - } - elementData[index]=null; - size--; - Object[] elementDataClone = elementData.clone(); - System.arraycopy(elementData, index+1, elementDataClone, index, size-index-1); - elementData = elementDataClone; - return elementData[index]; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new IteratorArrayList(this); - } - @Override - public String toString() { - return "ArrayList [size=" + size + ", elementData=" + Arrays.toString(elementData) + "]"; - } - - - private class IteratorArrayList implements Iterator{ - - private ArrayList arrayList; - private int index=0; - - - public IteratorArrayList(ArrayList arrayList) { - super(); - this.arrayList = arrayList; - } - - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return this.arrayList.size() >index; - } - - @Override - public Object next() { - // TODO Auto-generated method stub - if(hasNext()){ - return this.arrayList.get(index++); - } - return null; - } - - } - - public static void main(String[] args) { - ArrayList arrayList= new ArrayList(); - - Iterator iterator= arrayList.iterator(); - while(iterator.hasNext()){ - System.out.println(iterator.next()); - } - } - - -} diff --git a/group16/1325756593/src/com/dong/week1/ArrayListTest.java b/group16/1325756593/src/com/dong/week1/ArrayListTest.java deleted file mode 100644 index 128130cfb2..0000000000 --- a/group16/1325756593/src/com/dong/week1/ArrayListTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.dong.week1; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class ArrayListTest { - - //@Test - public void testAddObject() { - ArrayList arrayList = new ArrayList(); - for(int i=0;i<=200;i++){ - arrayList.add(i); - } - System.out.println(arrayList); - } - - //@Test - public void testAddIntObject() { - ArrayList arrayList = new ArrayList(); - for(int i=0;i<=2;i++){ - arrayList.add(i); - } - arrayList.add(1,100); - arrayList.add(1, 1000); - System.out.println(arrayList); - } - -// @Test - public void testGet() { - ArrayList arrayList = new ArrayList(); - for(int i=0;i<=200;i++){ - arrayList.add(i); - } - //System.out.println(arrayList.get(-1)); - //System.out.println(arrayList.get(50)); - System.out.println(arrayList.get(200)); - //System.out.println(arrayList.get(300)); - - - } - - @Test - public void testRemove() { - ArrayList arrayList = new ArrayList(); - for(int i=0;i<=10;i++){ - arrayList.add(i); - } - arrayList.remove(1); - arrayList.remove(1); - System.out.println(arrayList); - } - -// @Test - public void testSize() { - ArrayList arrayList = new ArrayList(); - for(int i=0;i<=10;i++){ - arrayList.add(i); - } - System.out.println(arrayList.size()); - } - -} diff --git a/group16/1325756593/src/com/dong/week1/BinaryTreeNode.java b/group16/1325756593/src/com/dong/week1/BinaryTreeNode.java deleted file mode 100644 index ef41ced8df..0000000000 --- a/group16/1325756593/src/com/dong/week1/BinaryTreeNode.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.dong.week1; - -public class BinaryTreeNode { - private TreeNode node; - - private static class TreeNode{ - private int key=0; - private TreeNode leftChild=null; - private TreeNode rightChild=null; - - public TreeNode(){} - - /** - * @param key - * @param data - */ - public TreeNode(int key){ - this.key=key; - this.leftChild=null; - this.rightChild=null; - } - - - } - - - - public TreeNode insert(TreeNode o){ - if(node == null){ - return o; - } - if(node.key > o.key){ - return insert(o.leftChild); - }else{ - return insert(node.leftChild); - } - } - -} diff --git a/group16/1325756593/src/com/dong/week1/Iterator.java b/group16/1325756593/src/com/dong/week1/Iterator.java deleted file mode 100644 index 9147ab8264..0000000000 --- a/group16/1325756593/src/com/dong/week1/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dong.week1; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group16/1325756593/src/com/dong/week1/LinkedList.java b/group16/1325756593/src/com/dong/week1/LinkedList.java deleted file mode 100644 index 339b5862ee..0000000000 --- a/group16/1325756593/src/com/dong/week1/LinkedList.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.dong.week1; - -public class LinkedList implements List { - - private int size = 0; - private Node head; - private Node tail; - - - public void add(Object o){ - //һԪص߼dz򵥣ֻҪжheadǷΪաΪգֱӼӼ - Node node = new Node(o,null); - if(head ==null){ - head =node; - }else{ - tail.next=node; - } - tail=node; - size++; - - } - public void add(int index , Object o){ - if(index < 0){ - throw new ArrayIndexOutOfBoundsException("indexΪ"); - } - if(index > size){ - throw new ArrayIndexOutOfBoundsException("ǰlistΪ"+size+",ȡǣ"+index); - } - if(size==0){ - head=new Node(o, null); - tail=head; - return; - } - if(index==0){ - Node curNode =head; - Node newNode =new Node(o, curNode); - head=newNode; - return; - } - Node curNode =head; - Object retVal = null; - for(int i=0;i= size){ - throw new ArrayIndexOutOfBoundsException("ǰlistΪ"+size+",Ƴǣ"+index); - } - Node curNode = head; - for(int i=0;i= size){ - throw new ArrayIndexOutOfBoundsException("ǰlistΪ"+size+",ȡǣ"+index); - } - Object retVal = null; - if(index==0){ - retVal =head.data; - head=head.next; - return retVal; - } - Node curNode =head; - - for(int i=0;iindex; - } - - @Override - public Object next() { - // TODO Auto-generated method stub - if(hasNext()){ - return this.list.get(index++); - } - return null; - } -} - public static void main(String[] args) { - - LinkedList arrayList= new LinkedList(); - - Iterator iterator= arrayList.iterator(); - while(iterator.hasNext()){ - System.out.println(iterator.next()); - } - -} - -} diff --git a/group16/1325756593/src/com/dong/week1/List.java b/group16/1325756593/src/com/dong/week1/List.java deleted file mode 100644 index adc694241a..0000000000 --- a/group16/1325756593/src/com/dong/week1/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dong.week1; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group16/1325756593/src/com/dong/week1/Queue.java b/group16/1325756593/src/com/dong/week1/Queue.java deleted file mode 100644 index 445390a168..0000000000 --- a/group16/1325756593/src/com/dong/week1/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dong.week1; - -public class Queue { - private ArrayList elementData = new ArrayList(); - - public void enQueue(Object o){ - elementData.add(elementData.size(), o); - } - - public Object deQueue(){ - if(elementData.size()==0){ - throw new IndexOutOfBoundsException("Ϊ"); - } - return elementData.remove(0); - } - - public boolean isEmpty(){ - return elementData.size()==0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group16/1325756593/src/com/dong/week1/Stack.java b/group16/1325756593/src/com/dong/week1/Stack.java deleted file mode 100644 index 1dea6cdfd9..0000000000 --- a/group16/1325756593/src/com/dong/week1/Stack.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dong.week1; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - - public Object pop(){ - if(elementData.size()==0){ - throw new IndexOutOfBoundsException("ջΪ"); - } - return elementData.remove(elementData.size()-1); - - } - - public Object peek(){ - if(elementData.size()==0){ - throw new IndexOutOfBoundsException("ջΪ"); - } - return elementData.get(elementData.size()-1); - } - public boolean isEmpty(){ - return elementData.size()==0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group16/1924332561/.classpath b/group16/1924332561/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group16/1924332561/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group16/1924332561/.project b/group16/1924332561/.project deleted file mode 100644 index 5f960262bc..0000000000 --- a/group16/1924332561/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 1924332561Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group16/1924332561/.settings/org.eclipse.core.resources.prefs b/group16/1924332561/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0203..0000000000 --- a/group16/1924332561/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/group16/1924332561/src/com/coding/basic/ArrayList.java b/group16/1924332561/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 3fc0960e08..0000000000 --- a/group16/1924332561/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List{ - private int size = 0; - - private Object[] elementDate = new Object[100]; - - - @Override - public void add(Object o) { - - this.elementDate[this.size]=o; - this.size++; - } - - @Override - public void add(int index, Object o) { - - } - - @Override - public Object get(int dex) { - - return null; - } - - @Override - public Object remove(int index) { - return null; - } - - @Override - public int size() { - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group16/1924332561/src/com/coding/basic/BinaryTreeNode.java b/group16/1924332561/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index e7d9e43e24..0000000000 --- a/group16/1924332561/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - private Object date; - private BinaryTreeNode left; - private BinaryTreeNode right; - public Object getDate() { - return date; - } - public void setDate(Object date) { - this.date = date; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } -} diff --git a/group16/1924332561/src/com/coding/basic/Iterator.java b/group16/1924332561/src/com/coding/basic/Iterator.java deleted file mode 100644 index e7cbd474ec..0000000000 --- a/group16/1924332561/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group16/1924332561/src/com/coding/basic/LinkedList.java b/group16/1924332561/src/com/coding/basic/LinkedList.java deleted file mode 100644 index d39557be29..0000000000 --- a/group16/1924332561/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private static class Node{ - Object date; - Node next; - } - - private Node head; - - - @Override - public void add(Object o) { - - } - - @Override - public void add(int index, Object o) { - - } - - @Override - public Object get(int dex) { - return null; - } - - @Override - public Object remove(int index) { - return null; - } - - @Override - public int size() { - - return 0; - } - - public void addFirst(Object o){ - - } - - public void addLast(Object o){ - - } - - public Object removeFirst(){ - - return null; - } - - public Object removeLast(){ - - return null; - } - - public Iterator iterator(){ - - return null; - } - -} diff --git a/group16/1924332561/src/com/coding/basic/List.java b/group16/1924332561/src/com/coding/basic/List.java deleted file mode 100644 index d48b1f4827..0000000000 --- a/group16/1924332561/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index,Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group16/1924332561/src/com/coding/basic/Queue.java b/group16/1924332561/src/com/coding/basic/Queue.java deleted file mode 100644 index 7dc7b4820a..0000000000 --- a/group16/1924332561/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(){ - - - } - public Object deQueue(){ - - return null; - } - - public boolean isEmpty(){ - - return false; - } - - public int size(){ - - return -1; - } -} diff --git a/group16/1924332561/src/com/coding/basic/Stack.java b/group16/1924332561/src/com/coding/basic/Stack.java deleted file mode 100644 index 7a49c48279..0000000000 --- a/group16/1924332561/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementDate = new ArrayList(); - - public void push(Object o){ - - } - - public Object pop(){ - - return null; - } - - public Object peek(){ - - return null; - } - - public boolean isEmpty(){ - - return false; - } - - public int size(){ - - return -1; - } -} diff --git a/group16/214074094/readme.txt b/group16/214074094/readme.txt deleted file mode 100644 index c1b06ddcc2..0000000000 --- a/group16/214074094/readme.txt +++ /dev/null @@ -1 +0,0 @@ -I am 北京-Shane diff --git a/group16/214074094/src/com/coding/basic/ArrayList.java b/group16/214074094/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 158c866d45..0000000000 --- a/group16/214074094/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,165 +0,0 @@ -package coding.basic; - - -import java.util.Arrays; -import java.util.NoSuchElementException; - -/** - * @Author shane - * @Time 2017/2/25 13:06 - * @Email stevenchenguang@gmail.com - * @Desc OwnArrayList - */ -public class ArrayList implements List { - - private int size = 0; - - private final static Object[] EMPTY_ELEMENTDATA = {}; - - /** - * 默认容量 - */ - private static int DEFAULT_CAPACITY = 10; - - private Object[] elementData; - - public ArrayList() { - this.elementData = EMPTY_ELEMENTDATA; - } - - @Override - public void add(Object o) { - if (elementData == EMPTY_ELEMENTDATA) { - elementData = Arrays.copyOf(elementData, DEFAULT_CAPACITY); - elementData[0] = o; - } else if (size < elementData.length) { - elementData[size] = o; - } else { - _grow(); - elementData[size] = o; - } - size++; - _analyze(); - } - - @Override - public void add(int index, Object o) { - if (index < 0) { - throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); - } - if (elementData == EMPTY_ELEMENTDATA) { - if (index != 0) { - throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); - } else { - elementData = new Object[DEFAULT_CAPACITY]; - elementData[0] = o; - } - } else if (index > size) { - throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); - } else if (index == size) { - _grow(); - elementData[size] = o; - size++; - } else { - if (elementData.length == size) { - _grow(); - } - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - _analyze(); - } - - @Override - public Object get(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); - } - return elementData[index]; - } - - @Override - public Object remove(int index) { - - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); - } - Object oldValue = elementData[index]; - //需要复制的长度 - int needMoveLength = size - index - 1; - //如果该长度小于0, 说明只有一个元素, 直接置空即可 - if (needMoveLength > 0) { - System.arraycopy(elementData, index + 1, elementData, index, needMoveLength); - } - elementData[--size] = null; - _analyze(); - return oldValue; - } - - @Override - public int size() { - return size; - } - - public Iterator iterator() { - return new ArrayListItrator(); - } - - /** - * @Author: shane - * @Time: 2017/2/25 20:18 - * @Email: stevenchenguang@gmail.com - * @param: - * @Return: - * @Throw: - * @Desc: 返回真实长度的数组数据 - */ - private void _analyze() { - if (size < elementData.length) { - elementData = Arrays.copyOf(elementData, size); - } - } - - /** - * @Author: shane - * @Time: 2017/2/25 20:19 - * @Email: stevenchenguang@gmail.com - * @param: - * @Return: - * @Throw: - * @Desc: 将数组的长度扩容至2倍 - */ - private void _grow() { - elementData = Arrays.copyOf(elementData, elementData.length << 1); - } - - @Override - public String toString() { - return Arrays.toString(elementData); - } - - public boolean isEmpty() { - return size == 0; - } - - private class ArrayListItrator implements Iterator { - - private int position = 0; - - @Override - public boolean hasNext() { - return position != size; - } - - @Override - public Object next() { - int i = position; - if (i >= size) { - throw new NoSuchElementException(); - } - position = i + 1; - return elementData[i]; - } - } -} diff --git a/group16/214074094/src/com/coding/basic/BinaryTreeNode.java b/group16/214074094/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index b40066ebe1..0000000000 --- a/group16/214074094/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,39 +0,0 @@ -package coding.basic; - -public class BinaryTreeNode { - - private Object data; - - private BinaryTreeNode left; - - private BinaryTreeNode right; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o) { - return null; - } - -} diff --git a/group16/214074094/src/com/coding/basic/Iterator.java b/group16/214074094/src/com/coding/basic/Iterator.java deleted file mode 100644 index 1acc5349a4..0000000000 --- a/group16/214074094/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,9 +0,0 @@ -package coding.basic; - -public interface Iterator { - - boolean hasNext(); - - Object next(); - -} diff --git a/group16/214074094/src/com/coding/basic/LinkedList.java b/group16/214074094/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 9108c2b6fe..0000000000 --- a/group16/214074094/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,222 +0,0 @@ -package coding.basic; - -/** - * @Author shane - * @Time 2017/2/25 21:01 - * @Email stevenchenguang@gmail.com - * @Desc OwnLinkedList - */ -public class LinkedList implements List { - - private int size = 0; - - private Node first; - - private Node last; - - public void add(Object o) { - if (size == 0) { - first = new Node(null, o, null); - last = first; - size++; - } else { - addLast(o); - } - } - - public void add(int index, Object o) { - _checkIndex(index); - if (index == size - 1) { - addLast(o); - } else { - Node prev = _node(index); - Node next = _node(index + 1); - Node newNode = new Node(prev, o, next); - prev.next = newNode; - next.prev = newNode; - size++; - } - } - - public Object get(int index) { - _checkIndex(index); - return node(index); - } - - public Object remove(int index) { - _checkIndex(index); - if (index == 0) { - return removeFirst(); - } else if (index == size - 1) { - return removeLast(); - } - Node curr = _node(index); - Object data = curr.data; - final Node prev = curr.prev; - final Node next = curr.next; - - prev.next = next; - next.prev = prev; - curr = null; - size--; - - return data; - } - - private Object removeFirst() { - Node oldFirst = first; - Object data = first.data; - final Node oldSecond = oldFirst.next; - if (null == oldSecond) { - first = null; - last = null; - } else { - oldSecond.prev = null; - first = oldSecond; - oldFirst = null; - } - size--; - return data; - } - - private Object removeLast() { - Node oldLast = last; - Object data = last.data; - final Node oldLastButOne = last.prev; - if (null == oldLastButOne) { - first = null; - last = null; - } else { - oldLastButOne.next = null; - last = oldLastButOne; - oldLast = null; - } - size--; - return data; - } - - public void addFirst(Object o) { - final Node oldFirst = first; - final Node param = new Node(null, o, null); - if (null == oldFirst) { - first = param; - } else { - oldFirst.prev = param; - param.next = oldFirst; - first = param; - } - size++; - } - - public void addLast(Object o) { - final Node n = last; - final Node newNode = new Node(n, o, null); - last = newNode; - n.next = newNode; - size++; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return null; - } - - public boolean isEmpty() { - return size == 0; - } - - private static class Node { - Node prev; - Object data; - Node next; - - public Node(Node prev, Object data, Node next) { - this.prev = prev; - this.data = data; - this.next = next; - } - } - - /** - * @Author: shane - * @Time: 2017/2/25 22:44 - * @Email: stevenchenguang@gmail.com - * @param: int index - * @Return: Node - * @Throw: - * @Desc: 根据下标获取节点元素上的数据 - */ - private Object node(int index) { - //如果下标在左一半, 从左往右取 - if (index < size >> 1) { - Node tmp = first; - for (int i = 0; i < index; i++) { - tmp = tmp.next; - } - return tmp.data; - } else { - Node tmp = last; - for (int i = size - 1; i > index; i--) { - tmp = tmp.prev; - } - return tmp.data; - } - } - - /** - * @Author: shane - * @Time: 2017/2/25 22:44 - * @Email: stevenchenguang@gmail.com - * @param: int index - * @Return: Node - * @Throw: - * @Desc: 根据下标获取节点元素 - */ - private Node _node(int index) { - //如果下标在左一半, 从左往右取 - if (index < size >> 1) { - Node tmp = first; - for (int i = 0; i < index; i++) { - tmp = tmp.next; - } - return tmp; - } else { - Node tmp = last; - for (int i = size - 1; i > index; i--) { - tmp = tmp.prev; - } - return tmp; - } - } - - /** - * @Author: shane - * @Time: 2017/2/25 22:43 - * @Email: stevenchenguang@gmail.com - * @param: int index - * @Return: - * @Throw: IndexOutOfBoundsException - * @Desc: 校验下标是否合法 - */ - private void _checkIndex(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); - } - } - - @Override - public String toString() { - if (0 == size) { - return "[]"; - } - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < this.size; i++) { - sb.append(get(i)).append(", "); - } - String tmp = sb.substring(0, sb.length() - 2); - return "[" + tmp + "]"; - } -} \ No newline at end of file diff --git a/group16/214074094/src/com/coding/basic/List.java b/group16/214074094/src/com/coding/basic/List.java deleted file mode 100644 index 5da9b0d4c6..0000000000 --- a/group16/214074094/src/com/coding/basic/List.java +++ /dev/null @@ -1,15 +0,0 @@ -package coding.basic; - -public interface List { - - void add(Object o); - - void add(int index, Object o); - - Object get(int index); - - Object remove(int index); - - int size(); - -} diff --git a/group16/214074094/src/com/coding/basic/Queue.java b/group16/214074094/src/com/coding/basic/Queue.java deleted file mode 100644 index 869d0f7333..0000000000 --- a/group16/214074094/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,36 +0,0 @@ -package coding.basic; - -/** - * @Author shane - * @Time 2017/2/26 17:19 - * @Email stevenchenguang@gmail.com - * @Desc Own Queue - */ -public class Queue { - - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o) { - elementData.add(o); - } - - public Object deQueue() { - if (isEmpty()) { - throw new RuntimeException("Queue is empty"); - } - return elementData.remove(0); - } - - public boolean isEmpty() { - return elementData.isEmpty(); - } - - public int size() { - return elementData.size(); - } - - @Override - public String toString() { - return elementData.toString(); - } -} diff --git a/group16/214074094/src/com/coding/basic/Stack.java b/group16/214074094/src/com/coding/basic/Stack.java deleted file mode 100644 index 7ef1c9ad06..0000000000 --- a/group16/214074094/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,37 +0,0 @@ -package coding.basic; - -/** - * @Author shane - * @Time 2017/2/26 16:55 - * @Email stevenchenguang@gmail.com - * @Desc Own Stack - */ -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - return elementData.remove(elementData.size() - 1); - } - - public Object peek() { - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.isEmpty(); - } - - public int size() { - return elementData.size(); - } - - @Override - public String toString() { - return elementData.toString(); - } -} diff --git a/group16/214074094/src/com/reading/blog_test.txt b/group16/214074094/src/com/reading/blog_test.txt deleted file mode 100644 index b7e5cbfe14..0000000000 --- a/group16/214074094/src/com/reading/blog_test.txt +++ /dev/null @@ -1 +0,0 @@ -just test new fork \ No newline at end of file diff --git a/group16/214074094/src/test/coding/basic/AbstractTest.java b/group16/214074094/src/test/coding/basic/AbstractTest.java deleted file mode 100644 index 80eaaa6fe5..0000000000 --- a/group16/214074094/src/test/coding/basic/AbstractTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package coding.basic; - -/** - * @Author shane - * @Time 2017/2/25 13:06 - * @Email stevenchenguang@gmail.com - * @Desc 测试基类 - */ -public class AbstractTest { - - protected void printStar() { - System.out.println("********************************************"); - } - - protected void printHyphen() { - System.out.println("--------------------------------------------"); - } - -} diff --git a/group16/214074094/src/test/coding/basic/ArrayListTest.java b/group16/214074094/src/test/coding/basic/ArrayListTest.java deleted file mode 100644 index 2f03342d61..0000000000 --- a/group16/214074094/src/test/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @Author shane - * @Time 2017/2/25 13:02 - * @Email stevenchenguang@gmail.com - * @Desc ... - */ - -public class ArrayListTest extends AbstractTest { - - private static ArrayList list; - - @Before - public void before() { - - list = new ArrayList(); - list.add("a"); - list.add("b"); - list.add("c"); - list.add("d"); - list.add("e"); - - printStar(); - System.out.println("Before Test data :" + list); - printHyphen(); - } - - @After - public void after() { - printHyphen(); - System.out.println("After Test data : " + list); - printStar(); - } - - @Test - public void testAddI() { - int index = list.size(); - list.add(index, "test add i"); - Assert.assertEquals(list.get(index), "test add i"); - } - - @Test - public void test() { - java.util.ArrayList list = new java.util.ArrayList(); - list.add("a"); - list.add("b"); - java.util.Iterator it = list.iterator(); - while (it.hasNext()) { - - } - System.out.println(it.next()); - System.out.println(it.next()); - System.out.println(it.next()); - } - - @Test - public void testSize() { - Assert.assertEquals(5, list.size()); - } - - @Test - public void testRemove() { - list.remove(5); - Assert.assertEquals(list.get(3), "d"); - } - - @Test - public void testIterator() { - Iterator it = list.iterator(); - while (it.hasNext()) { - System.out.println(it.next()); - } - } - -} diff --git a/group16/214074094/src/test/coding/basic/LinkedListTest.java b/group16/214074094/src/test/coding/basic/LinkedListTest.java deleted file mode 100644 index bc78728a25..0000000000 --- a/group16/214074094/src/test/coding/basic/LinkedListTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package coding.basic; - -import junit.framework.Assert; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * @Author shane - * @Time 2017/2/25 23:32 - * @Email stevenchenguang@gmail.com - * @Desc ... - */ -public class LinkedListTest extends AbstractTest { - - private static LinkedList list; - - @Before - public void before() { - list = new LinkedList(); - list.add("a"); - list.add("b"); - list.add("c"); - list.add("d"); - list.add("e"); - - printStar(); - System.out.println("Before Test data :" + list); - printHyphen(); - } - - @After - public void after() { - printHyphen(); - System.out.println("After Test data : " + list); - printStar(); - } - - @Test - public void testAddIndex() { - list.add(0, "after a"); - Assert.assertEquals("after a", list.get(1)); - - list.add(3, "after c"); - Assert.assertEquals("after c", list.get(4)); - - list.add(6, "after e"); - Assert.assertEquals("after e", list.get(7)); - } - - @Test - public void testRemove() { - list.remove(0); - Assert.assertEquals("b", list.get(0)); - - list.remove(list.size() - 1); - Assert.assertEquals("d", list.get(list.size() - 1)); - - Object obj = list.remove(1); - Assert.assertEquals("c", obj); - Assert.assertEquals(2, list.size()); - } -} diff --git a/group16/214074094/src/test/coding/basic/QueueTest.java b/group16/214074094/src/test/coding/basic/QueueTest.java deleted file mode 100644 index 12302783b3..0000000000 --- a/group16/214074094/src/test/coding/basic/QueueTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package coding.basic; - -import junit.framework.Assert; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * @Author shane - * @Time 2017/2/26 17:24 - * @Email stevenchenguang@gmail.com - * @Desc ... - */ -public class QueueTest extends AbstractTest { - - private static Queue queue; - - @Before - public void before() { - queue = new Queue(); - - queue.enQueue("a"); - queue.enQueue("b"); - queue.enQueue("c"); - queue.enQueue("d"); - queue.enQueue("e"); - - printStar(); - System.out.println("Before Test data :" + queue); - printHyphen(); - } - - @After - public void after() { - printHyphen(); - System.out.println("After Test data : " + queue); - printStar(); - } - - @Test - public void testDeQueueAndIsEmpty() { - Assert.assertEquals("a", queue.deQueue()); - - queue.deQueue(); - queue.deQueue(); - queue.deQueue(); - queue.deQueue(); - - Assert.assertEquals(true, queue.isEmpty()); - - try { - queue.deQueue(); - } catch (RuntimeException e) { - Assert.assertEquals("Queue is empty", e.getMessage()); - } - } - - @Test - public void testSize() { - Assert.assertEquals(5, queue.size()); - } -} diff --git a/group16/214074094/src/test/coding/basic/StackTest.java b/group16/214074094/src/test/coding/basic/StackTest.java deleted file mode 100644 index f289744a67..0000000000 --- a/group16/214074094/src/test/coding/basic/StackTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package coding.basic; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * @Author shane - * @Time 2017/2/26 16:58 - * @Email stevenchenguang@gmail.com - * @Desc ... - */ -public class StackTest extends AbstractTest { - - private static Stack stack; - - @Before - public void before() { - stack = new Stack(); - - stack.push("a"); - stack.push("b"); - stack.push("c"); - stack.push("d"); - stack.push("e"); - - printStar(); - System.out.println("Before Test data :" + stack); - printHyphen(); - } - - @After - public void after() { - printHyphen(); - System.out.println("After Test data : " + stack); - printStar(); - } - - @Test - public void testPop() { - Assert.assertEquals("e", stack.pop()); - } - - @Test - public void testPeek() { - Assert.assertEquals("e", stack.peek()); - } - - @Test - public void testIsEmpty() { - Assert.assertEquals(false, stack.isEmpty()); - - stack.pop(); - stack.pop(); - stack.pop(); - stack.pop(); - stack.pop(); - - Assert.assertEquals(true, stack.isEmpty()); - } - - @Test - public void testSize() { - Assert.assertEquals(5, stack.size()); - } - -} diff --git a/group16/214074094/target/production/214074094/reading/blog_test.txt b/group16/214074094/target/production/214074094/reading/blog_test.txt deleted file mode 100644 index b7e5cbfe14..0000000000 --- a/group16/214074094/target/production/214074094/reading/blog_test.txt +++ /dev/null @@ -1 +0,0 @@ -just test new fork \ No newline at end of file diff --git a/group16/2562124714/.idea/dictionaries/zhangwj.xml b/group16/2562124714/.idea/dictionaries/zhangwj.xml deleted file mode 100644 index d07fd80ae1..0000000000 --- a/group16/2562124714/.idea/dictionaries/zhangwj.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/group16/2562124714/.idea/misc.xml b/group16/2562124714/.idea/misc.xml deleted file mode 100644 index e97ef03f44..0000000000 --- a/group16/2562124714/.idea/misc.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - 1.7 - - - - - - - - \ No newline at end of file diff --git a/group16/2562124714/.idea/modules.xml b/group16/2562124714/.idea/modules.xml deleted file mode 100644 index c3fdba38f0..0000000000 --- a/group16/2562124714/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/group16/2562124714/.idea/workspace.xml b/group16/2562124714/.idea/workspace.xml deleted file mode 100644 index d357c0f9a1..0000000000 --- a/group16/2562124714/.idea/workspace.xml +++ /dev/null @@ -1,780 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - binaryTree.PriOder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1487640652721 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group16/2562124714/2562124714.iml b/group16/2562124714/2562124714.iml deleted file mode 100644 index 3a8ffcf1f5..0000000000 --- a/group16/2562124714/2562124714.iml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group16/2562124714/src/Test/ArrayListTest.java b/group16/2562124714/src/Test/ArrayListTest.java deleted file mode 100644 index 9bd8f2aeca..0000000000 --- a/group16/2562124714/src/Test/ArrayListTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package Test; - -import com.coding.basic.ArrayList; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by zhangwj on 2017/2/23. - */ -public class ArrayListTest { - private static ArrayList arraylist = new ArrayList(); - @BeforeClass - public static void setUp() throws Exception { - - System.out.println("初始化变量"); - for (Integer i = 0; i < 5; i++) - { - arraylist.add(i); - } - - - } - - @After - public void tearDown() throws Exception { - - } - - @Test - public void add() throws Exception { - Integer i = arraylist.size(); - Integer AddElement = 999; - arraylist.add(AddElement); - assertEquals(i + 1, arraylist.size()); - assertEquals(AddElement, arraylist.get(arraylist.size())); - arraylist.remove(arraylist.size()); - } - - @Test - public void add1() throws Exception { - Integer AddElement = 999; - arraylist.add(1, AddElement); - assertEquals(AddElement, arraylist.get(1)); - arraylist.remove(1); - } - - @Test - public void get() throws Exception { - assertEquals(null, arraylist.get(9999)); - } - - @Test - public void remove() throws Exception { - Integer i = (Integer)arraylist.get(1); - assertEquals(i, arraylist.remove(1)); - arraylist.add(1, i); - - } - - @Test - public void size() throws Exception { - assertEquals(5, arraylist.size()); - - } - -} \ No newline at end of file diff --git a/group16/2562124714/src/Test/BinaryTreeNodeTest.java b/group16/2562124714/src/Test/BinaryTreeNodeTest.java deleted file mode 100644 index 7d8f4fdd01..0000000000 --- a/group16/2562124714/src/Test/BinaryTreeNodeTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package Test; - -import com.coding.basic.BinaryTreeNode; -import com.coding.basic.TreeData; -import com.sun.org.apache.bcel.internal.generic.NEW; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by zhangwj on 2017/2/23. - */ -public class BinaryTreeNodeTest { - private BinaryTreeNode binaryTree = new BinaryTreeNode(); - @Before - public void setUp() throws Exception { - //System.out.println("初始化二叉树,5, 4, 7"); - TreeData element = new TreeData(); - element.setT((Integer)5); - binaryTree.insert(element); - TreeData element2 = new TreeData(); - element2.setT((Integer)4); - binaryTree.insert(element2); - TreeData element3 = new TreeData(); - element3.setT((Integer)7); - binaryTree.insert(element3); -// binaryTree.PriOder(this.binaryTree); - } - - @Test - public void getData() throws Exception { - assertEquals(5, binaryTree.getData().getT()); - - } - - @Test - public void setData() throws Exception { - TreeData element = new TreeData(); - element.setT(6); - binaryTree.setData(element); - assertEquals(6, binaryTree.getData().getT()); -// binaryTree.PriOder(this.binaryTree); - - } - - @Test - public void getLeft() throws Exception { - assertEquals(4, binaryTree.getLeft().getData().getT()); - - } - - @Test - public void setLeft() throws Exception { - TreeData element = new TreeData(); - element.setT(2); - BinaryTreeNode NewTreeNode = new BinaryTreeNode(); - NewTreeNode.setData(element); - binaryTree.setLeft(NewTreeNode); - assertEquals(2, binaryTree.getLeft().getData().getT()); -// binaryTree.PriOder(this.binaryTree); - } - - @Test - public void getRight() throws Exception { - assertEquals(7, binaryTree.getRight().getData().getT()); - - } - - @Test - public void setRight() throws Exception { - TreeData element = new TreeData(); - element.setT(9); - BinaryTreeNode NewTreeNode = new BinaryTreeNode(); - NewTreeNode.setData(element); - binaryTree.setRight(NewTreeNode); - assertEquals(9, binaryTree.getRight().getData().getT()); - } - - @Test - public void priOder() throws Exception { - - - } - - @Test - public void insert() throws Exception { - TreeData element = new TreeData(); - element.setT(2); - binaryTree.insert(element); - binaryTree.PriOder(this.binaryTree); - element.setT(9); - binaryTree.insert(element); - binaryTree.PriOder(this.binaryTree); - element.setT(8); -// binaryTree.PriOder(this.binaryTree); - - } - -} \ No newline at end of file diff --git a/group16/2562124714/src/Test/LinkedListTest.java b/group16/2562124714/src/Test/LinkedListTest.java deleted file mode 100644 index 276b389f15..0000000000 --- a/group16/2562124714/src/Test/LinkedListTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package Test; - -import com.coding.basic.LinkedList; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by zhangwj on 2017/2/23. - */ -public class LinkedListTest { - private LinkedList linkedlist = new LinkedList(); - - @Before - public void Init() - { - System.out.println("初始化"); - linkedlist.add(9.9); - linkedlist.add(9.99); - } - - - @Test - public void add() throws Exception { - linkedlist.add(8.8); - assertEquals(3, linkedlist.size()); - System.out.println("after add size is " + linkedlist.size()); - System.out.println("after add last element is " + linkedlist.get(linkedlist.size())); - - } - - @Test - public void add1() throws Exception { - linkedlist.add(2, 7.7); - assertEquals(3, linkedlist.size()); - System.out.println("after add in 2th size is " + linkedlist.size()); - System.out.println("after add 2th element is " + linkedlist.get(2)); - } - - @Test - public void get() throws Exception { - assertEquals(9.9, linkedlist.get(1)); - } - - @Test - public void remove() throws Exception { - assertEquals(9.9, linkedlist.remove(1)); - } - - @Test - public void size() throws Exception { - assertEquals(2, linkedlist.size()); - - } - - @Test - public void addFirst() throws Exception { - linkedlist.addFirst(3.3); - assertEquals(3.3, linkedlist.get(1)); -// System.out.println(); - } - - @Test - public void addLast() throws Exception { - linkedlist.addLast(3.3); - assertEquals(3.3, linkedlist.get(linkedlist.size())); - - } - - @Test - public void removeFirst() throws Exception { - assertEquals(9.9, linkedlist.removeFirst()); - } - - @Test - public void removeLast() throws Exception { - assertEquals(9.99, linkedlist.removeLast()); - } - -} \ No newline at end of file diff --git a/group16/2562124714/src/Test/QueueTest.java b/group16/2562124714/src/Test/QueueTest.java deleted file mode 100644 index 3f0557f262..0000000000 --- a/group16/2562124714/src/Test/QueueTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package Test; - -import com.coding.basic.Queue; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by zhangwj on 2017/2/23. - */ -public class QueueTest { - private Queue queue = new Queue(); - @Before - public void setUp() throws Exception { - System.out.println("初始化队列,元素为a,b,c,d"); - - String[] s = {"a", "b","c","d"}; - for (String a:s - ) { - queue.enQueue(a); - } - - } - - @After - public void tearDown() throws Exception { - - } - - @Test - public void enQueue() throws Exception { - queue.enQueue("dasdas"); - assertEquals(5, queue.size()); -// assertEquals("dasdas", queue.); - } - - @Test - public void deQueue() throws Exception { - assertEquals("a",queue.deQueue()); - assertEquals(3, queue.size()); - - } - - @Test - public void isEmpty() throws Exception { - assertEquals(false, queue.isEmpty()); - - } - - @Test - public void size() throws Exception { - assertEquals(4, queue.size()); - - } - -} \ No newline at end of file diff --git a/group16/2562124714/src/Test/StackTest.java b/group16/2562124714/src/Test/StackTest.java deleted file mode 100644 index 0a36d4dc0f..0000000000 --- a/group16/2562124714/src/Test/StackTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package Test; - -import com.coding.basic.Stack; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by zhangwj on 2017/2/23. - */ -public class StackTest { - private Stack stack = new Stack(); - @Before - public void setUp() throws Exception { - System.out.println("初始化栈,元素为a,b,c,d"); - - String[] s = {"a", "b","c","d"}; - for (String a:s - ) { - stack.push(a); - } - - } - - @Test - public void push() throws Exception { - stack.push("aaa"); - assertEquals(5, stack.size()); - assertEquals("aaa", stack.peek()); - - } - - @Test - public void pop() throws Exception { - assertEquals("d", stack.pop()); - assertEquals(3, stack.size()); - - } - - @Test - public void peek() throws Exception { - assertEquals("d", stack.peek()); - assertEquals(4, stack.size()); - } - - @Test - public void isEmpty() throws Exception { - assertEquals(false, stack.isEmpty()); - } - - @Test - public void size() throws Exception { - assertEquals(4, stack.size()); - } - -} \ No newline at end of file diff --git a/group16/2562124714/src/Test/TestRunner.java b/group16/2562124714/src/Test/TestRunner.java deleted file mode 100644 index 2bf465f832..0000000000 --- a/group16/2562124714/src/Test/TestRunner.java +++ /dev/null @@ -1,19 +0,0 @@ -package Test; - -import org.junit.runner.JUnitCore; -import org.junit.runner.notification.Failure; - -import javax.xml.transform.Result; - -/** - * Created by zhangwj on 2017/2/23. 调用测试类 可重复使用 - */ -public class TestRunner { - public static void main(String[] args) { - org.junit.runner.Result result = JUnitCore.runClasses(BinaryTreeNodeTest.class); - for (Failure failure:result.getFailures()) { - System.out.println(failure.toString()); - } - System.out.println(result.wasSuccessful()); - } -} diff --git a/group16/2562124714/src/com/coding/basic/ArrayList.java b/group16/2562124714/src/com/coding/basic/ArrayList.java deleted file mode 100644 index f1d5a9fdd9..0000000000 --- a/group16/2562124714/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private int Scale; //每次扩展大小 - - private Object[] elementData = new Object[100]; - - public ArrayList() - { - this.Scale = 10; - } - - public ArrayList(int i) - { - this.Scale = i; - } - - public void add(Object o){ - if (this.size == elementData.length) - { - DoEnlage(); - } - elementData[size] = o; - this.size++; - } - - private void DoEnlage() - { - if (this.Scale >= 1 && this.Scale <= 10000) - { - Object[] NewElementData = new Object[this.elementData.length + this.Scale]; - System.arraycopy(this.elementData,0,NewElementData,0,this.elementData.length); - - this.elementData = NewElementData; - } - - } - - //index从1开始 位置1,2,3,4,5,6 - public void add(int index, Object o){ - if (this.size == elementData.length) - { - DoEnlage(); - } - int i = 0; - //遍历赋值 - for(i = this.size; i >= index;i--) - { - this.elementData[i] = this.elementData[i - 1]; - } - - this.elementData[i] = o; - this.size++; - - } - - public Object get(int index){ - if (index >= 1 && index <= this.size) - { - return this.elementData[index - 1]; - } - else { - return null; - } - - - } - - public Object remove(int index){ - if (index >= 1 && index <= this.size) - { - int i = 0; - Object DelElement = this.elementData[index - 1]; - for(i = index; i <= this.size; i++) - { - this.elementData[i - 1] = this.elementData[i]; - } - this.elementData[i] = null; - this.size--; - - return DelElement; - - } - else { - return null; - } - } - - public int size(){ - return this.size; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group16/2562124714/src/com/coding/basic/BinaryTreeNode.java b/group16/2562124714/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index a703ad3165..0000000000 --- a/group16/2562124714/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.coding.basic; - -import java.util.Properties; - -public class BinaryTreeNode { - - private TreeData treeData; - //private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public TreeData getData() { - return treeData; - } - public void setData(TreeData data) { - this.treeData = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public void PriOder(BinaryTreeNode Node) - { - if (Node.treeData != null) - { - System.out.println(Node.treeData.getT()); - if (Node.left != null) - { - PriOder(Node.left); - } - if (Node.right != null) - { - PriOder(Node.right); - } - } - - } - - - public BinaryTreeNode insert(TreeData o){ - if (this.treeData == null && this.left == null && this.right == null) - { - this.treeData = o; - this.left = null; - this.right = null; - return null; - } - - //遍历寻找元素应该插入的位置 - if (o.compareTo(this.treeData) <= 0) - { - if (this.left != null) - { - this.left.insert(o); - } - else - { - BinaryTreeNode NewNode = new BinaryTreeNode(); - NewNode.setData(o); - NewNode.setLeft(null); - NewNode.setRight(null); - this.left = NewNode; - } - } - else - { - if (this.right != null) - { - this.right.insert(o); - } - else - { - BinaryTreeNode NewNode = new BinaryTreeNode(); - NewNode.setData(o); - NewNode.setLeft(null); - NewNode.setRight(null); - this.right = NewNode; - } - } - - - return null; - } - -} diff --git a/group16/2562124714/src/com/coding/basic/Iterator.java b/group16/2562124714/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group16/2562124714/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group16/2562124714/src/com/coding/basic/LinkedList.java b/group16/2562124714/src/com/coding/basic/LinkedList.java deleted file mode 100644 index f1de0a6839..0000000000 --- a/group16/2562124714/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,200 +0,0 @@ -package com.coding.basic; - -import com.sun.org.apache.bcel.internal.generic.NEW; - -import java.awt.*; - -public class LinkedList implements List { - public LinkedList() - { - head = null; - this.Size = 0; - } - - private Node head; - private int Size; - - public void add(Object o){ - Node NewNode = new Node(o); - - if (this.head == null) - { - head = NewNode; - } - else - { - Node node; - for (node = head; node.next != null; node = node.next) - { - } - node.next = NewNode; - } - this.Size++; - - } - //index为位置1,2,3,4,5,6,7 - public void add(int index , Object o){ - Node NewNode = new Node(o); - - if (1 == index) - { - NewNode.next = head; - head = NewNode; - } - else { - Node node; - int i = 0; - for (i = 1, node = head; i < index - 1; i++, node = node.next) { - } - NewNode.next = node.next; - node.next = NewNode; - } - this.Size++; - - } - public Object get(int index){ - Node node; - int i = 0; - - for (i = 1, node = head; i < index ; i++, node = node.next) { - } - - return node.data; -// return null; - } - public Object remove(int index){ - Node node; - int i = 0; - - if (1 == index) - { - if (head.next == null) - { - Object DelData = head.data; - head = null; - this.Size--; - return DelData; - } - else - { - Node DelNode = head; - head = DelNode.next; - DelNode.next = null; - this.Size--; - return DelNode.data; - - } - } - else { - - for (i = 1, node = head; i < index - 1; i++, node = node.next) { - } - Node DelNode = node.next; - node.next = DelNode.next; - DelNode.next = null; - this.Size--; - return DelNode.data; - } - } - - public int size(){ - - return this.Size; - } - - public void addFirst(Object o){ - Node NewNode = new Node(o); - - if (null == this.head) - { - NewNode.next = null; - head = NewNode; - } - else - { - NewNode.next = head; - head = NewNode; - } - - this.Size++; - - } - public void addLast(Object o){ - Node NewNode = new Node(o); - - if (this.Size == 0) - { - NewNode.next = null; - head = NewNode; - } - else - { -// int i = 0; - Node node; - for (node = head; node.next != null; node = node.next) { - - } - node.next = NewNode; - } - - this.Size++; - - } - public Object removeFirst(){ - Node DelFirst; - - if (1 == this.Size) - { - DelFirst = this.head; - DelFirst.next = null; - head = null; - } - else - { - DelFirst = this.head; - head = head.next; - DelFirst.next = null; - } - this.Size--; - - return DelFirst.data; - } - public Object removeLast(){ - Node DelLast; - - if (1 == this.Size) - { - DelLast = head; - DelLast.next = null; - head = null; - } - else - { - Node node; - for (node = head; node.next.next != null; node = node.next) { - - } - DelLast = node.next; - node.next = null; - } - this.Size--; - - return DelLast.data; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - public Node(Object o) - { - this.data = o; - this.next = null; - } - - } -} diff --git a/group16/2562124714/src/com/coding/basic/List.java b/group16/2562124714/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group16/2562124714/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group16/2562124714/src/com/coding/basic/Queue.java b/group16/2562124714/src/com/coding/basic/Queue.java deleted file mode 100644 index 40b8f22607..0000000000 --- a/group16/2562124714/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic; - -public class Queue { - private ArrayList elementData = new ArrayList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - - - return elementData.get(1); - } - - public boolean isEmpty(){ - - return elementData.size() == 0 ? true : false; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group16/2562124714/src/com/coding/basic/Stack.java b/group16/2562124714/src/com/coding/basic/Stack.java deleted file mode 100644 index 9dba3befa5..0000000000 --- a/group16/2562124714/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - -// public Stack() -// { -// elementData -// } - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - Object o = elementData.remove(elementData.size()); - return o; - } - - public Object peek(){ - Object o = elementData.get(elementData.size()); - return o; - } - public boolean isEmpty(){ - if (elementData.size() == 0) - { - return true; - } - return false; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group16/2562124714/src/com/coding/basic/TestJunit.java b/group16/2562124714/src/com/coding/basic/TestJunit.java deleted file mode 100644 index 59ef43a992..0000000000 --- a/group16/2562124714/src/com/coding/basic/TestJunit.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coding.basic; -import org.junit.Test; -import static org.junit.Assert.assertEquals; - -/** - * Created by zhangwj on 2017/2/23. - */ -public class TestJunit { - @Test - - public void testAdd() - { - String str = "Junit is working fine"; - assertEquals("Junit is working fine", str); - } - -} diff --git a/group16/2562124714/src/com/coding/basic/TestRunner.java b/group16/2562124714/src/com/coding/basic/TestRunner.java deleted file mode 100644 index 625ace52c6..0000000000 --- a/group16/2562124714/src/com/coding/basic/TestRunner.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.basic; - -import com.sun.net.httpserver.Authenticator; -import org.junit.runner.JUnitCore; -import org.junit.runner.notification.Failure; -import org.junit.runners.model.TestClass; - -import javax.xml.transform.Result; - -/** - * Created by zhangwj on 2017/2/23. - */ -public class TestRunner { - public static void main(String[] args) - { - org.junit.runner.Result result = JUnitCore.runClasses(TestJunit.class); - - for (Failure failure : result.getFailures()) - { - System.out.println(failure.toString()); - } - - System.out.println(result.wasSuccessful()); - } -} diff --git a/group16/2562124714/src/com/coding/basic/TreeData.java b/group16/2562124714/src/com/coding/basic/TreeData.java deleted file mode 100644 index e79b7bd450..0000000000 --- a/group16/2562124714/src/com/coding/basic/TreeData.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.basic; - -/** - * Created by zhangwj on 2017/2/22. - */ -public class TreeData> implements Comparable>{ - private int s; - private T t; - - public T getT() - { - return t; - } - - public void setT(T o) { t = o;} - - @Override - public int compareTo(TreeData o) { - return getT().compareTo(o.getT()); - } - -// public int compareTo(TreeData o) -// { -// -// } - - -} diff --git a/group16/313001956/.classpath b/group16/313001956/.classpath deleted file mode 100644 index b42037dde2..0000000000 --- a/group16/313001956/.classpath +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/group16/313001956/.gitignore b/group16/313001956/.gitignore deleted file mode 100644 index 84c048a73c..0000000000 --- a/group16/313001956/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build/ diff --git a/group16/313001956/.project b/group16/313001956/.project deleted file mode 100644 index 16d7526efa..0000000000 --- a/group16/313001956/.project +++ /dev/null @@ -1,36 +0,0 @@ - - - assignment - - - - - - org.eclipse.wst.jsdt.core.javascriptValidator - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.wst.common.project.facet.core.builder - - - - - org.eclipse.wst.validation.validationbuilder - - - - - - org.eclipse.jem.workbench.JavaEMFNature - org.eclipse.wst.common.modulecore.ModuleCoreNature - org.eclipse.wst.common.project.facet.core.nature - org.eclipse.jdt.core.javanature - org.eclipse.wst.jsdt.core.jsNature - - diff --git a/group16/313001956/.settings/.jsdtscope b/group16/313001956/.settings/.jsdtscope deleted file mode 100644 index 92e666d77d..0000000000 --- a/group16/313001956/.settings/.jsdtscope +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/group16/313001956/.settings/org.eclipse.jdt.core.prefs b/group16/313001956/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index c537b63063..0000000000 --- a/group16/313001956/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,7 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/group16/313001956/.settings/org.eclipse.wst.common.component b/group16/313001956/.settings/org.eclipse.wst.common.component deleted file mode 100644 index 2a267dc19d..0000000000 --- a/group16/313001956/.settings/org.eclipse.wst.common.component +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/group16/313001956/.settings/org.eclipse.wst.common.project.facet.core.xml b/group16/313001956/.settings/org.eclipse.wst.common.project.facet.core.xml deleted file mode 100644 index 611d2dfa73..0000000000 --- a/group16/313001956/.settings/org.eclipse.wst.common.project.facet.core.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.container b/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.container deleted file mode 100644 index 3bd5d0a480..0000000000 --- a/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.container +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.name b/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.name deleted file mode 100644 index 05bd71b6ec..0000000000 --- a/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.name +++ /dev/null @@ -1 +0,0 @@ -Window \ No newline at end of file diff --git a/group16/313001956/WebContent/META-INF/MANIFEST.MF b/group16/313001956/WebContent/META-INF/MANIFEST.MF deleted file mode 100644 index 254272e1c0..0000000000 --- a/group16/313001956/WebContent/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Class-Path: - diff --git a/group16/313001956/src/com/coding/basic/ArrayList.java b/group16/313001956/src/com/coding/basic/ArrayList.java deleted file mode 100644 index eaaa690fa6b76c4f36483531b915bbdd3a22c926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 453 zcmYciQBK{;Ai&7Lz`*FL8=RPy>X%vqB&Io6+f!T&{DNEEJ+9t=qX%X>Rb^71zNsCDZ;)ah#cI$db@Y1P*6ufr=>-#%}- zPWr9Z;mu|T1P*?CzB=KPo$-#vy#mu^em_yZw5+1eM0dX1ul&R8hkox({Pclu`sW`% z8$4!6c5qp}Tae&?%)9)hufE`o&p{V*X0mA1?qojh*~ocv<}1H~8*|-~^Ud^b^||pp z@3%cLML=_tW_LSVCiAQRhYvlOeO*H^^M}Fev|oAhpKi$uhwUq#uDde1QKhuB_hs!p zcCHA6omu7EI~V({bLHs{SevF=W?;xSEmvxF_^ORDaY4=-x%>7PijuAfJwmhoy6w~W0RZ({nMMEr diff --git a/group16/502059278/.classpath b/group16/502059278/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group16/502059278/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group16/502059278/.gitignore b/group16/502059278/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group16/502059278/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group16/502059278/.project b/group16/502059278/.project deleted file mode 100644 index 72a951f7c1..0000000000 --- a/group16/502059278/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - DataStructure - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git "a/group16/502059278/homework/\350\256\241\347\256\227\346\234\272\346\274\253\350\260\210_\344\275\234\344\270\232.docx" "b/group16/502059278/homework/\350\256\241\347\256\227\346\234\272\346\274\253\350\260\210_\344\275\234\344\270\232.docx" deleted file mode 100644 index 31dfe4c14bd2c5980ba3209f8e697d71c800b157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532875 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

8x3%iP4hL3e$S6O`@%N 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

Q}Xo1 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⁡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 diff --git a/group16/502059278/src/cn/mark/MyArrayList.java b/group16/502059278/src/cn/mark/MyArrayList.java deleted file mode 100644 index 9e0e406274..0000000000 --- a/group16/502059278/src/cn/mark/MyArrayList.java +++ /dev/null @@ -1,144 +0,0 @@ -package cn.mark; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * 自定义实现ArrayList的数据结构 - * @author hilih - * - */ -public class MyArrayList implements MyList{ - - private int size = 0; - - private Object[] elementData; - - public MyArrayList(){ - //默认容量初始化为10 - this(10); - } - - /** - * 初始即指定大小的构造方法 - * @param size 集合容量 - */ - public MyArrayList(int size){ - if ( size < 0 ){ - System.out.println("不合法的容量输入"); - return; - } - elementData = new Object[size]; - } - - /** - * 集合增容 - * @param minSize - */ - private void ensureSize(int minSize){ - int oldSize = elementData.length; - if(minSize > oldSize){ - int newSize = 3 * oldSize / 2 + 1; - if(minSize > newSize){ - newSize = minSize; - } - elementData = Arrays.copyOf(elementData, newSize); - } - } - - /** - * 下标范围判断 - * @param index - */ - private boolean rangeCheck(int index){ - if ( index >= size || index < 0 ){ - System.out.println("索引不合法!"); - return false; - } - return true; - } - - @Override - public boolean add(Object o) { - ensureSize(size+1); - elementData[size++] = o; - return true; - } - - @Override - public boolean add(int index, Object o) { - if (!rangeCheck(index)){ - return false; - } - ensureSize(size + 1); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - return true; - } - - @Override - public Object get(int index) { - if (!rangeCheck(index)){ - return null; - } - Object o = elementData[index]; - return o; - } - - @Override - public Object remove(int index) { - if (!rangeCheck(index)){ - return null; - } - Object oldValue = elementData[index]; - int numMoved = size - index - 1; - if( numMoved > 0 ){ - System.arraycopy(elementData, index + 1, elementData, index, numMoved); - } - return oldValue; - } - - @Override - public int size() { - return size; - } - - - - @Override - public String toString() { - StringBuilder s = new StringBuilder(); - s.append("["); - for (int i = 0; i < size; i++){ - Object o = elementData[i]; - s.append(o.toString()); - if( i < size-1 ){ - s.append(","); - } - } - s.append("]"); - return s.toString(); - } - - /** - * 判断当前集合是否为空 - * @return - */ - public boolean isEmpty(){ - return size == 0; - } - - public static void main(String[] args) { - MyList list = new MyArrayList(); - list.add("a"); - list.add("b"); - list.add("c"); - list.add(2,"d"); - Object o = list.get(5); - System.out.println(o); - System.out.println(list.size()); - System.out.println(list); - } -} diff --git a/group16/502059278/src/cn/mark/MyLinkedList.java b/group16/502059278/src/cn/mark/MyLinkedList.java deleted file mode 100644 index 7f9c3856a2..0000000000 --- a/group16/502059278/src/cn/mark/MyLinkedList.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.mark; -/** - * 自定义实现LinkedList数据结构 - * @author hilih - * - */ -public class MyLinkedList implements MyList{ - - private Node head; - private int size;//集合的长度 - - /** - * 添加元素 - */ - @Override - public boolean add(Object o) { - //为空判断 - if ( o == null ){ - System.out.println("不允许null的元素插入!"); - return false; - } - if(head == null){ - head = new Node(); - head.data = o; - }else{ - - } - - return false; - } - - @Override - public boolean add(int index, Object o) { - // TODO Auto-generated method stub - return false; - } - - @Override - public Object get(int index) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Object remove(int index) { - // TODO Auto-generated method stub - return null; - } - - @Override - public int size() { - // TODO Auto-generated method stub - return 0; - } - - private static class Node{ - Object data; - Node next; - } - - - public static void main(String[] args) { - - - } - -} diff --git a/group16/502059278/src/cn/mark/MyList.java b/group16/502059278/src/cn/mark/MyList.java deleted file mode 100644 index 19bc3f92fe..0000000000 --- a/group16/502059278/src/cn/mark/MyList.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.mark; - -public interface MyList { - /** - * 向集合中增加元素 - * @param o - */ - public boolean add(Object o); - /** - * 向集合指定的位置中增加元素 - * @param index 下标 - * @param o 元素 - */ - public boolean add(int index, Object o); - /** - * 从集合指定位置取出元素 - * @param index 下标 - * @return - */ - public Object get(int index); - /** - * 从集合中删除指定位置的元素 - * @param index 下标 - * @return - */ - public Object remove(int index); - /** - * 当前集合的元素个数 - * @return - */ - public int size(); -} \ No newline at end of file diff --git a/group16/542087872/src/com/coding/basic/ArrayList.java b/group16/542087872/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 1b10b441cf..0000000000 --- a/group16/542087872/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[10]; - - // 每次乘2增长 - private void grow() { - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - - - public void add(Object o){ - if (size >= elementData.length) { - this.grow(); - } - - elementData[size++] = o; - } - public void add(int index, Object o){ - if (size >= elementData.length) { - this.grow(); - } - System.arraycopy(elementData, index, elementData, index + 1, size - index); - - elementData[index] = o; - size++; - } - - public Object get(int index){ - if (index >= size) { - throw new IndexOutOfBoundsException(); - } - return elementData[index]; - } - - public Object remove(int index){ - if (index >= size) { - throw new IndexOutOfBoundsException(); - } - - Object el = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - - size--; - return el; - } - - public int size(){ - return size; - } - - private class ArrIter implements Iterator { - int cursor = 0; - - @Override - public boolean hasNext() { - return cursor < size; - } - - @Override - public Object next() { - return elementData[cursor++]; - } - } - - public Iterator iterator(){ - return new ArrIter(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (int i = 0; i < size; i++) { - sb.append(elementData[i]); - if (i < size - 1) { - sb.append(","); - } - } - sb.append("]"); - return sb.toString(); - } -} diff --git a/group16/542087872/src/com/coding/basic/BinaryTreeNode.java b/group16/542087872/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index df167343a0..0000000000 --- a/group16/542087872/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private int data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public int getData() { - return data; - } - public void setData(int data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - - public BinaryTreeNode(int data) { - this.data = data; - } - - private BinaryTreeNode insertAt(BinaryTreeNode node, int o) { - if (o < node.getData()) { - if (node.getLeft() != null) { - return insertAt(node.getLeft(), o); - } else { - BinaryTreeNode nowNode = new BinaryTreeNode(o); - node.setLeft(nowNode); - - return nowNode; - } - } else { - if (node.getRight() != null) { - return insertAt(node.getRight(), o); - } else { - BinaryTreeNode nowNode = new BinaryTreeNode(o); - node.setRight(nowNode); - return nowNode; - } - } - } - - public BinaryTreeNode insert(int o){ - return insertAt(this, o); - } - - @Override - public String toString() { - return "data: " + data; - } -} diff --git a/group16/542087872/src/com/coding/basic/Iterator.java b/group16/542087872/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group16/542087872/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group16/542087872/src/com/coding/basic/LinkedList.java b/group16/542087872/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 144af4ec8d..0000000000 --- a/group16/542087872/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,192 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private Node tail; - - public void add(Object o){ - Node nowNode = new Node(o); - if (head == null) { - head = nowNode; - } else { - tail.next = nowNode; - } - tail = nowNode; - } - public void add(int index , Object o){ - int count = 0; - Node lastOne = null; - Node tpHead = head; - while (tpHead != null && count != index) { - count++; - lastOne = tpHead; - tpHead = tpHead.next; - } - if (count != index) { - throw new IndexOutOfBoundsException(); - } - - - Node nowNode = new Node(o); - if (lastOne == null) { - head = nowNode; - head.next = tpHead; - } else { - lastOne.next = nowNode; - nowNode.next = tpHead; - } - } - public Object get(int index){ - int count = 0; - Node tpHead = head; - while (tpHead != null && count != index) { - count++; - tpHead = tpHead.next; - } - if (count != index) { - throw new IndexOutOfBoundsException(); - } - - return tpHead.data; - } - public Object remove(int index){ - int count = 0; - Node lastOne = null; - Node tpHead = head; - while (tpHead != null && count != index) { - count++; - lastOne = tpHead; - tpHead = tpHead.next; - } - if (count != index) { - throw new IndexOutOfBoundsException(); - } - - if (lastOne == null) { - head = tpHead.next; - } else { - lastOne.next = tpHead.next; - } - - if (tpHead.next == null) { - tail = lastOne; - } - - return tpHead.data; - } - - public int size(){ - int count = 0; - Node tpHead = head; - while (tpHead != null) { - count ++; - tpHead = tpHead.next; - } - - return count; - } - - public void addFirst(Object o){ - Node nowNode = new Node(o); - if (head == null) { - head = nowNode; - tail = nowNode; - } else { - nowNode.next = head; - head = nowNode; - } - } - public void addLast(Object o){ - Node nowNode = new Node(o); - if (head == null) { - head = nowNode; - tail = nowNode; - } else { - tail.next = nowNode; - tail = nowNode; - } - } - public Object removeFirst(){ - if (head == null) { - throw new IndexOutOfBoundsException(); - } - - Node nowValue = head; - - Node nextNode = head.next; - if (nextNode == null) { - tail = null; - } - head = nextNode; - - return nowValue.data; - } - public Object removeLast(){ - if (head == null) { - throw new IndexOutOfBoundsException(); - } - - Node nowValue = tail; - - Node lastOne = null; - Node tpHead = head; - while (tpHead != tail) { - lastOne = tpHead; - tpHead = tpHead.next; - } - if (lastOne == null) { - head = null; - } else { - lastOne.next = null; - } - tail = lastOne; - - return nowValue.data; - } - - private class LinkIter implements Iterator { - - Node cursor = head; - - @Override - public boolean hasNext() { - return cursor != null; - } - - @Override - public Object next() { - Node ret = cursor; - cursor = cursor.next; - return ret.data; - } - } - - public Iterator iterator(){ - return new LinkIter(); - } - - - private static class Node{ - Object data; - Node next; - - public Node(Object data) { - this.data = data; - } - } - - @Override - public String toString() { - Node tpHead = head; - StringBuilder sb = new StringBuilder("["); - while (tpHead != null) { - sb.append(tpHead.data); - sb.append(","); - tpHead = tpHead.next; - } - sb.append("]"); - return sb.toString(); - } - -} diff --git a/group16/542087872/src/com/coding/basic/List.java b/group16/542087872/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group16/542087872/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group16/542087872/src/com/coding/basic/Queue.java b/group16/542087872/src/com/coding/basic/Queue.java deleted file mode 100644 index 8e4285464b..0000000000 --- a/group16/542087872/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList linkedList = new LinkedList(); - - public void enQueue(Object o){ - linkedList.addLast(o); - } - - public Object deQueue(){ - return linkedList.removeFirst(); - } - - public boolean isEmpty(){ - return linkedList.size() == 0; - } - - public int size(){ - return linkedList.size(); - } -} diff --git a/group16/542087872/src/com/coding/basic/Stack.java b/group16/542087872/src/com/coding/basic/Stack.java deleted file mode 100644 index bfe98dd8b7..0000000000 --- a/group16/542087872/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - Object o = elementData.get(elementData.size() - 1); - elementData.remove(elementData.size() - 1); - return o; - } - - public Object peek(){ - return elementData.get(elementData.size() - 1); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group16/542087872/src/com/coding/basic/Test.java b/group16/542087872/src/com/coding/basic/Test.java deleted file mode 100644 index 2db5b2f9ab..0000000000 --- a/group16/542087872/src/com/coding/basic/Test.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.coding.basic; - - -/** - * Created by xiaoyuan on 25/02/2017. - */ -public class Test { - public static void main(String[] args) { - - testArrayList(); - testLinkedList(); - - testQueue(); - testStack(); - - - testBinaryTreeNode(); - } - - private static void testBinaryTreeNode() { - - BinaryTreeNode binaryTreeNode = new BinaryTreeNode(10); - binaryTreeNode.insert(5); - binaryTreeNode.insert(4); - binaryTreeNode.insert(6); - binaryTreeNode.insert(11); - - traverse(binaryTreeNode); - - } - - private static void traverse(BinaryTreeNode node) { - if (node.getLeft() != null) { - traverse(node.getLeft()); - } - - System.out.println("-- " + node.getData() + " --"); - - if (node.getRight() != null) { - traverse(node.getRight()); - } - - } - - - static void testStack() { - - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - - System.out.println(stack.size()); - System.out.println(stack.isEmpty()); - - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - - System.out.println(stack.isEmpty()); - - } - - static void testQueue() { - Queue queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - - System.out.println(queue.size()); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - System.out.println(queue.size()); - } - static void testLinkedList() { - LinkedList linkedList = new LinkedList(); - linkedList.add(1); - linkedList.add(2); - - System.out.println(linkedList.size()); - System.out.println(linkedList); - - linkedList.add(4); - linkedList.add(5); - System.out.println(linkedList.size()); - System.out.println(linkedList); - - - linkedList.add(0, 10); - linkedList.add(0, 9); - System.out.println(linkedList.size()); - System.out.println(linkedList); - - System.out.println(linkedList.get(3)); - - linkedList.remove(0); - System.out.println(linkedList.size()); - System.out.println(linkedList); - - - linkedList.addFirst(100); - linkedList.addLast(8888); - System.out.println(linkedList.size()); - System.out.println(linkedList); - - - linkedList.removeFirst(); - linkedList.removeLast(); - System.out.println(linkedList.size()); - System.out.println(linkedList); - - Iterator iterator = linkedList.iterator(); - while (iterator.hasNext()) { - System.out.println(iterator.next()); - } - - } - - static void testArrayList() { - ArrayList arrayList = new ArrayList(); - arrayList.add("1"); - arrayList.add("2"); - // test size and add - System.out.println(arrayList.size()); - System.out.println(arrayList); - - - arrayList.add("3"); - arrayList.add("4"); - arrayList.add("5"); - arrayList.add("6"); - arrayList.add("7"); - arrayList.add("8"); - arrayList.add("9"); - arrayList.add("10"); - arrayList.add("11"); - arrayList.add("12"); - arrayList.add("13"); - - // test size - // test grow - System.out.println(arrayList.size()); - System.out.println(arrayList); - - // test add at index - arrayList.add(2, 100); - System.out.println(arrayList.size()); - System.out.println(arrayList); - - // test remove - arrayList.remove(0); - System.out.println(arrayList.size()); - System.out.println(arrayList); - arrayList.remove(2); - System.out.println(arrayList.size()); - System.out.println(arrayList); - - // test iterator - Iterator iterator = arrayList.iterator(); - while (iterator.hasNext()) { - System.out.println(iterator.next()); - } - - } -} diff --git a/group16/group16.md b/group16/group16.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group16/group16.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group16/out/production/214074094/com/reading/blog_test.txt b/group16/out/production/214074094/com/reading/blog_test.txt deleted file mode 100644 index b7e5cbfe14..0000000000 --- a/group16/out/production/214074094/com/reading/blog_test.txt +++ /dev/null @@ -1 +0,0 @@ -just test new fork \ No newline at end of file diff --git a/group16/out/production/214074094/readme.txt b/group16/out/production/214074094/readme.txt deleted file mode 100644 index c1b06ddcc2..0000000000 --- a/group16/out/production/214074094/readme.txt +++ /dev/null @@ -1 +0,0 @@ -I am 北京-Shane diff --git a/group16/out/production/214074094/src/com/reading/blog_test.txt b/group16/out/production/214074094/src/com/reading/blog_test.txt deleted file mode 100644 index b7e5cbfe14..0000000000 --- a/group16/out/production/214074094/src/com/reading/blog_test.txt +++ /dev/null @@ -1 +0,0 @@ -just test new fork \ No newline at end of file diff --git a/group17/102228177/.classpath b/group17/102228177/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group17/102228177/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group17/102228177/.project b/group17/102228177/.project deleted file mode 100644 index 7f56ab1057..0000000000 --- a/group17/102228177/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 102228177 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group17/102228177/src/data2_19/ArrayList.java b/group17/102228177/src/data2_19/ArrayList.java deleted file mode 100644 index 35a17dcf59..0000000000 --- a/group17/102228177/src/data2_19/ArrayList.java +++ /dev/null @@ -1,148 +0,0 @@ -package data2_19; - -import java.util.ConcurrentModificationException; -import java.util.NoSuchElementException; - - -public class ArrayList implements List{ - public static final int defLen = 10; - private Object[] elements; - private int size; - private int maxLen; - - public ArrayList(){ - size = 0; - maxLen = defLen; - elements = new Object[defLen]; - } - - /** - * 在ArrayList末尾处追加元素 - * @param o 添加的元素 - */ - public void add(Object o){ - if(size >= maxLen){ - grow(); - } - elements[size] = o; - size++; - } - - /** - * 数组扩容 - */ - private void grow(){ - maxLen = maxLen + (maxLen >> 1); - Object[] newArr = new Object[maxLen]; - System.arraycopy(elements, 0, newArr, 0, size); - elements = newArr; - } - - /** - * 在指定索引处添加元素 - * @param i 指定索引 - * @param o 添加元素 - */ - public void add(int i,Object o){ - //判断插入位置大于数组实际长度 - if(i > size){ - size = i; - if(size >= maxLen){//数组大小大于数组最大容量则需要扩容 - grow(); - } - } - //插入位置不大于数组实际长度时,将插入位置的元素向后移。 - for (int j = size; j > i ; j++) { - elements[j] = elements[j-1]; - } - elements[i] = o; - size++; - } - - /** - * 获取传入索引的元素 - * @param index 索引 - * @return 返回传入索引的元素 - */ - public Object get(int index){ - //索引不在实际范围内 - if(index < 0||index >= size){ - throw new ArrayIndexOutOfBoundsException(); - } - for (int i = 0; i < size; i++) { - return elements[index]; - } - return null; - } - - /** - * 删除指定索引元素并返回 - * @param index - * @return 该索引处元素 - */ - public Object remove(int index){ - //索引不在实际范围内 - if(index < 0||index >= size){ - throw new ArrayIndexOutOfBoundsException(); - }else{ - for (int j = index; j < size-1; j++) { - elements[j]=elements[j+1]; - } - size--; - return elements[index]; - } - } - - /** - * 获取大小 - * @return - */ - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator{ - int cursor; - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public Object next() { - int i = cursor; - if(i >= size){ - throw new NoSuchElementException(); - } - if (i >= elements.length){ - throw new ConcurrentModificationException(); - } - cursor = i+1; - return elements[i]; - } - } - - public static void main(String[] args) { - ArrayList list = new ArrayList(); - list.add(0); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(6, 6); - list.remove(3); - for (int i = 0; i < list.size(); i++) { - System.out.println(i+":"+list.get(i)); - } - - Iterator it = list.iterator(); - while (it.hasNext()) { - System.out.println(it.next()); - } - } -} diff --git a/group17/102228177/src/data2_19/BinaryTreeNode.java b/group17/102228177/src/data2_19/BinaryTreeNode.java deleted file mode 100644 index adb23e8467..0000000000 --- a/group17/102228177/src/data2_19/BinaryTreeNode.java +++ /dev/null @@ -1,74 +0,0 @@ -package data2_19; - -public class BinaryTreeNode implements Comparable{ - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Object o) { - this.data = o; - } - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - @Override - public int compareTo(BinaryTreeNode o) { - return (this.data.hashCode() < o.data.hashCode()) ? -1 : - ((this.data.hashCode() == o.data.hashCode()) ? 0 : 1); - } - - public BinaryTreeNode insert(Object o){ - BinaryTreeNode node = new BinaryTreeNode(o); - insertNode(this,node); - return node; - } - - private void insertNode(BinaryTreeNode parentNode, BinaryTreeNode node) { - //父节点大于添加元素 - if(parentNode.compareTo(node) == 1){ - if(parentNode.left == null){ - parentNode.left = node; - return; - } - insertNode(parentNode.left, node); - } - //父节点小于添加元素 - else - if(parentNode.compareTo(node) == -1){ - if(parentNode.right == null){ - parentNode.right = node; - return; - } - insertNode(parentNode.right, node); - }else{ - throw new RuntimeException("No duplicate vertex allowed!"); - } - } - - public static void main(String[] args) { - BinaryTreeNode tree = new BinaryTreeNode(5); - tree.insert(2); - tree.insert(23); - tree.insert(7); - tree.insert(1); - } - -} \ No newline at end of file diff --git a/group17/102228177/src/data2_19/Iterator.java b/group17/102228177/src/data2_19/Iterator.java deleted file mode 100644 index cbb3f605c2..0000000000 --- a/group17/102228177/src/data2_19/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package data2_19; - -public interface Iterator { - - public boolean hasNext(); - public Object next(); - -} \ No newline at end of file diff --git a/group17/102228177/src/data2_19/LinkedList.java b/group17/102228177/src/data2_19/LinkedList.java deleted file mode 100644 index 9c53c7d99d..0000000000 --- a/group17/102228177/src/data2_19/LinkedList.java +++ /dev/null @@ -1,142 +0,0 @@ -package data2_19; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - private int size; - - public LinkedList(){ - size = 0; - head = null; - } - - public void add(Object o){ - Node node = new Node(o); - if(head == null){ - head = node; - }else{ - //p为游标 从头遍历到尾 - Node p = head; - while(p.next != null){ - p = p.next; - } - p.next = node; - } - size++; - } - - public void add(int index , Object o){ - //判断不为空链表 - if(head != null){ - Node p = head; - int k = 0; - //扫描单链表查找第index-1个节点 - while(k < index-1 && p.next != null){ - k++; - p = p.next; - } - //判断是否找到第index-1个节点 - if(p != null){ - Node node = new Node(o); - node.next = p.next; - p.next = node; - } - size++; - } - } - - public Object get(int index){ - if(index <0 || index >= size){ - throw new IndexOutOfBoundsException(); - }else{ - Node p = head; - int k = 0; - while(k < index && p.next != null){ - k++; - p = p.next; - } - return p.data; - } - } - public Object remove(int index){ - if(index <0 || index >= size){ - throw new IndexOutOfBoundsException(); - }else{ - if(head != null){ - Node p = head; - int k = 0; - while(k > index-1 && p.next != null){ - k++; - p = p.next; - } - Node next = p.next; - p.next = next.next; - size--; - return next.data; - } - } - return null; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node node = new Node(o); - node.next = head; - head = node; - size++; - } - - public void addLast(Object o){ - Node node = new Node(o); - if(head == null){ - head = node; - }else{ - Node p = head; - while(p.next != null){ - p = p.next; - } - p.next = node; - } - size++; - } - - public Object removeFirst(){ - if(head == null){ - throw new NoSuchElementException(); - } - Node node = head; - head = node.next; - size--; - return node.data; - } - public Object removeLast(){ - if(head == null){ - throw new NoSuchElementException(); - }else{ - Node p = head; - int k = 0; - while(k < size-1 && p.next != null){ - k++; - p = p.next; - } - Node last = p.next; - p.next = null; - size--; - return last.data; - } - } - - private static class Node{ - Object data; - Node next; - private Node(Object o){ - this.data = o; - this.next = null; - } - } -} \ No newline at end of file diff --git a/group17/102228177/src/data2_19/List.java b/group17/102228177/src/data2_19/List.java deleted file mode 100644 index 8a03fb9c8c..0000000000 --- a/group17/102228177/src/data2_19/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package data2_19; - -public interface List { - - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} \ No newline at end of file diff --git a/group17/102228177/src/data2_19/Queue.java b/group17/102228177/src/data2_19/Queue.java deleted file mode 100644 index 95bd77729d..0000000000 --- a/group17/102228177/src/data2_19/Queue.java +++ /dev/null @@ -1,38 +0,0 @@ -package data2_19; -public class Queue { - - private LinkedList linkedList = new LinkedList(); - private int elementCount; - - public Queue() { - this.elementCount = 0; - } - - public void enQueue(Object o){ - linkedList.addLast(o); - elementCount++; - } - - public Object deQueue(){ - Object object = linkedList.removeFirst(); - elementCount--; - return object; - } - - public boolean isEmpty(){ - return elementCount == 0; - } - - public int size(){ - return elementCount; - } - - public static void main(String[] args) { - Queue queue = new Queue(); - queue.enQueue(2); - queue.enQueue(3); - System.out.println(queue.isEmpty()); - System.out.println(queue.size()); - System.out.println(queue.deQueue()); - } -} \ No newline at end of file diff --git a/group17/102228177/src/data2_19/Stack.java b/group17/102228177/src/data2_19/Stack.java deleted file mode 100644 index 7c26967ef4..0000000000 --- a/group17/102228177/src/data2_19/Stack.java +++ /dev/null @@ -1,44 +0,0 @@ -package data2_19; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData; - private int elementCount; - - public Stack() { - this.elementData = new ArrayList(); - this.elementCount = 0; - } - public void push(Object o){ - elementData.add(o); - elementCount++; - } - - public Object pop(){ - Object object = elementData.remove(elementCount-1); - elementCount--; - return object; - } - - public Object peek(){ - if(isEmpty()){ - throw new EmptyStackException(); - } - return elementData.get(elementCount-1); - } - public boolean isEmpty(){ - return elementCount==0; - } - public int size(){ - return elementCount; - } - public static void main(String[] args) { - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - System.out.println(stack.pop()); - System.out.println(stack.peek()); - - } -} \ No newline at end of file diff --git a/group17/116665530/homework/src/com/coding/basic/MyArrayList.java b/group17/116665530/homework/src/com/coding/basic/MyArrayList.java deleted file mode 100644 index e9af793f47..0000000000 --- a/group17/116665530/homework/src/com/coding/basic/MyArrayList.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic; - -public class MyArrayList implements MyList { - private int size = 0; - private Object[] elementData = new Object[100]; - - public void add(Object o){ - elementData[size++] = o; - } - public void add(int index, Object o){ - for(int i = size; i > index; i--) - { - elementData[i] = elementData[i - 1]; - } - elementData[index] = o; - size++; - } - - public Object get(int index){ - return elementData[index]; - } - - public Object remove(int index){ - Object obj = elementData[index]; - for(int i = index; i < size(); i++) - { - elementData[i] = elementData[i + 1]; - } - size--; - return elementData; - } - - public int size(){ - return size; - } - - public MyIterator myIterator(){ - return null; - } - -} diff --git a/group17/116665530/homework/src/com/coding/basic/MyBinaryTreeNode.java b/group17/116665530/homework/src/com/coding/basic/MyBinaryTreeNode.java deleted file mode 100644 index c79328b1ed..0000000000 --- a/group17/116665530/homework/src/com/coding/basic/MyBinaryTreeNode.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -public class MyBinaryTreeNode { - private Object data; - private MyBinaryTreeNode left; - private MyBinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public MyBinaryTreeNode getLeft() { - return left; - } - public void setLeft(MyBinaryTreeNode left) { - this.left = left; - } - public MyBinaryTreeNode getRight() { - return right; - } - public void setRight(MyBinaryTreeNode right) { - this.right = right; - } - - public MyBinaryTreeNode insert(Object o){ - return null; - } -} diff --git a/group17/116665530/homework/src/com/coding/basic/MyIterator.java b/group17/116665530/homework/src/com/coding/basic/MyIterator.java deleted file mode 100644 index 9247878483..0000000000 --- a/group17/116665530/homework/src/com/coding/basic/MyIterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface MyIterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group17/116665530/homework/src/com/coding/basic/MyLinkedList.java b/group17/116665530/homework/src/com/coding/basic/MyLinkedList.java deleted file mode 100644 index fb75a27c6b..0000000000 --- a/group17/116665530/homework/src/com/coding/basic/MyLinkedList.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coding.basic; - -public class MyLinkedList implements MyList{ - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public MyIterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group17/116665530/homework/src/com/coding/basic/MyList.java b/group17/116665530/homework/src/com/coding/basic/MyList.java deleted file mode 100644 index 3cc9d10473..0000000000 --- a/group17/116665530/homework/src/com/coding/basic/MyList.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface MyList { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group17/116665530/homework/src/com/coding/basic/MyQueue.java b/group17/116665530/homework/src/com/coding/basic/MyQueue.java deleted file mode 100644 index c5e79cdf4e..0000000000 --- a/group17/116665530/homework/src/com/coding/basic/MyQueue.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class MyQueue { - private Object[] elementData; - private int elementCount; - private int head; - private int next; - public void enQueue(Object o){ - elementData[next] = o; - elementCount++; - next++; - } - - public Object deQueue(){ - Object obj = elementData[head]; - elementData[head] = null; - elementCount--; - head++; - return obj; - } - - public boolean isEmpty(){ - if(elementData.length==0){ - return true; - } - return false; - } - - public int size(){ - return elementData.length; - } -} diff --git a/group17/116665530/homework/src/com/coding/basic/MyStack.java b/group17/116665530/homework/src/com/coding/basic/MyStack.java deleted file mode 100644 index 194a8259d3..0000000000 --- a/group17/116665530/homework/src/com/coding/basic/MyStack.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding.basic; - -public class MyStack { - Object[] elementData; - private int size; - - public void push(Object o){ - elementData[size++]=o; - } - - public Object pop(){ - if(size>0) - { - elementData[--size]=null; - } - return null; - } - - public Object peek(){ - if(elementData.length == 0){ - return null; - } - return elementData[size - 1]; - } - public boolean isEmpty(){ - if(elementData.length == 0){ - return true; - } - return false; - } - public int size(){ - return elementData.length; - } -} diff --git a/group17/1204187480/code/homework/basic/pom.xml b/group17/1204187480/code/homework/basic/pom.xml deleted file mode 100644 index 17b2dea49e..0000000000 --- a/group17/1204187480/code/homework/basic/pom.xml +++ /dev/null @@ -1,12 +0,0 @@ - - 4.0.0 - basic - - com.coding - parent - 1.0-SNAPSHOT - ../parent/pom.xml - - - \ No newline at end of file diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java deleted file mode 100644 index d09d63c2fa..0000000000 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - private Iterator iterator = new ArrayListIterator(); - - private int length() { - return elementData.length; - } - - private static final int ENLARGE_LENGTH = 100; - - private Object[] enlarge(Object[] origin) { - return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH); - } - - private void enLargeElementData() { - if (size == length()) { - elementData = enlarge(elementData); - } - } - - public void add(Object o) { - enLargeElementData(); - elementData[size] = o; - size++; - } - - public void add(int index, Object o) { - checkForAdd(index); - enLargeElementData(); - // 备份 index 处及后面的数据 - Object[] elementsBehindIndex = backBehindElements(elementData, index); - // 给index处 设值 - elementData[index] = o; - // 追加 备份的数据 - appendElement(elementData, index, elementsBehindIndex); - size++; - } - - private void appendElement(Object[] origin, int pos, Object[] append) { - System.arraycopy(append, 0, origin, pos, append.length); - } - - private Object[] backBehindElements(Object[] elementData, int index) { - int backSize = size - index; - Object[] back = new Object[backSize]; - System.arraycopy(elementData, index, back, 0, backSize); - return back; - } - - public Object get(int index) { - checkIndex(index); - return elementData[index]; - } - - private void checkIndex(int index) { - if (index < 0 || index >= size) { - throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); - } - } - - private void checkForAdd(int index) { - if (index < 0 || index > size) { - throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); - } - } - - public Object remove(int index) { - checkIndex(index); - Object[] back = backBehindElements(elementData, index + 1); - System.arraycopy(back, 0, elementData, index, back.length); - Object ret = elementData[index]; - elementData[index] = null; - size--; - return ret; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return iterator; - } - - private class ArrayListIterator implements Iterator { - - int next = 0; - - @Override - public boolean hasNext() { - return next < size; - } - - @Override - public Object next() { - return elementData[next++]; - } - } - -} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 266eff3d56..0000000000 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java deleted file mode 100644 index 7174cb9cdf..0000000000 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private int size = 0; - private Iterator iterator = new LinkedListIterator(); - - - public void add(Object o) { - Node newNode = new Node(o, null); - if (head == null) { - head = newNode; - } else { - node(size - 1).next = newNode; - } - size++; - } - - public void add(int index, Object o) { - checkForAdd(index); - if (index == size) { - add(o); - }else { - Node newNode = new Node(o, null); - if (index == 0){ - addFirst(o); - } else { - Node preNode = node(index - 1); - Node now = preNode.next; - preNode.next = newNode; - newNode.next = now; - size++; - } - } - - } - - private Node node(int index) { - Node x = head; - for (int i = 0; i < index; i++) { - x = x.next; - } - return x; - } - - public Object get(int index) { - checkIndex(index); - return node(index).data; - } - - /** - * 让被删除的引用的持有者指向下一个节点 - * @param index - * @return - */ - public Object remove(int index) { - final Object ret; - checkIndex(index); - if (index == 0) { - Node removeNode = head; - ret = head.data; - head = removeNode.next; - } else { - Node pre = node(index - 1); - Node removeNode = pre.next; - ret = removeNode.data; - pre.next = removeNode.next; - } - size--; - return ret; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - head = new Node(o, head);; - size++; - } - - public void addLast(Object o) { - add(o); - } - - public Object removeFirst() { - if (size == 0){ - return null; - }else { - return remove(0); - } - } - - public Object removeLast() { - return remove(size - 1); - } - - public Iterator iterator() { - return iterator; - } - - private void checkIndex(int index) { - if (index < 0 || index >= size) { - throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); - } - } - - private void checkForAdd(int index) { - if (index < 0 || index > size) { - throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); - } - } - - private static class Node { - Object data; - Node next; - - public Node() { - } - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } - - private class LinkedListIterator implements Iterator{ - - private Node next; - - @Override - public boolean hasNext() { - return next != null; - } - - @Override - public Object next() { - if (next == null) { - throw new IndexOutOfBoundsException("there is no node in list"); - } - Node ret = next; - next = next.next; - return ret.data; - } - } -} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java deleted file mode 100644 index 10560f969e..0000000000 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class Queue { - - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - return elementData.remove(0); - } - - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java deleted file mode 100644 index 998ddf9768..0000000000 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (isEmpty()) { - throw new IllegalStateException("the stack is empty"); - } - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - if (isEmpty()) { - throw new IllegalStateException("the stack is empty"); - } - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty(){ - return size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArrayListTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArrayListTest.java deleted file mode 100644 index 95f0085b66..0000000000 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArrayListTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.api; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Created by luoziyihao on 2/25/17. - */ -public class ArrayListTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - public void testAdd(){ - List list = new ArrayList(Arrays.asList(0, 1, 2, 3)); - logger.info("list={}", list); - list.add(5, 2); - logger.info("list={}", list); - } -} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java deleted file mode 100644 index 6c96193d82..0000000000 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.api; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; - -/** - * Created by luoziyihao on 2/25/17. - */ -public class ArraysTest { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - - @Test - public void testCopyOf(){ - Object[] a = new Object[]{1, 2, 3, 4}; - Object[] b = Arrays.copyOf(a, 10); - logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b)); - } -} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java deleted file mode 100644 index 6a23cb125e..0000000000 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.api; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; - -/** - * Created by luoziyihao on 2/25/17. - */ -public class SystemTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - public void testArrayCopy() { - int[] a = new int[]{1, 2, 3, 4, 5, 6, 7}; - int[] b = new int[]{11, 22, 33, 44, 55, 66, 77}; - System.arraycopy(a, 2, b, 4, 3); - logger.info("b={}", Arrays.toString(b)); - - } -} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java deleted file mode 100644 index 656ff54c06..0000000000 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic; - -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * Created by luoziyihao on 2/25/17. - */ -public class ArrayListTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - - private List list = new ArrayList(); - - @Before - public void before() { - - } - - @Test - public void add() throws Exception { - list.add(1); - } - - @Test - public void get() throws Exception { - add(); - logger.info("{}", list.get(0)); - } - -} \ No newline at end of file diff --git a/group17/1204187480/code/homework/parent/pom.xml b/group17/1204187480/code/homework/parent/pom.xml deleted file mode 100644 index 7af48c6fed..0000000000 --- a/group17/1204187480/code/homework/parent/pom.xml +++ /dev/null @@ -1,95 +0,0 @@ - - 4.0.0 - - com.coding - parent - pom - 1.0-SNAPSHOT - https://github.com/luoziyihao/coding2017 - - - UTF-8 - UTF-8 - UTF-8 - 1.8 - 1.8 - 1.8 - 3.0 - 1.1.7 - 1.2 - 1.2.17 - 4.12 - - - - - - ch.qos.logback - logback-classic - ${logback-classic.version} - - - - commons-logging - commons-logging - ${commons-logging.version} - - - log4j - log4j - ${log4j.version} - - - - - junit - junit - ${junit.version} - - - - - - alimaven - aliyun maven - http://maven.aliyun.com/nexus/content/groups/public/ - - true - - - true - - - - - - alimaven - aliyun maven - http://maven.aliyun.com/nexus/content/groups/public/ - - true - - - true - - - - - - ${project.artifactId} - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${maven.compiler.source} - ${maven.compiler.target} - - - - - - \ No newline at end of file diff --git a/group17/1204187480/code/homework/pom.xml b/group17/1204187480/code/homework/pom.xml deleted file mode 100644 index df0626e528..0000000000 --- a/group17/1204187480/code/homework/pom.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - 4.0.0 - com.coding - coding2017 - 1.0-SNAPSHOT - pom - - parent - basic - - - diff --git "a/group17/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272" "b/group17/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272" deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/group17/1264835468/.gitignore b/group17/1264835468/.gitignore deleted file mode 100644 index 71f96b185c..0000000000 --- a/group17/1264835468/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/bin/ - -.classpath -.project -.gitignore \ No newline at end of file diff --git a/group17/1264835468/src/assignment/BinaryTree.java b/group17/1264835468/src/assignment/BinaryTree.java deleted file mode 100644 index 1d76a7ce2c..0000000000 --- a/group17/1264835468/src/assignment/BinaryTree.java +++ /dev/null @@ -1,154 +0,0 @@ -package assignment; - -// -public class BinaryTree> implements Iterable> { - private BinaryTreeNode root; - - public BinaryTree(T data) { - root = new BinaryTreeNode(data); - } - - public BinaryTree(BinaryTreeNode root) { - this.root = root; - } - - public BinaryTreeNode insert(T data) { - BinaryTreeNode node = new BinaryTreeNode(data); - if (root == null) - root = node; - else - insert(root, node); - return node; - } - - public BinaryTreeNode insert(BinaryTreeNode node) { - return insert(node.getData()); - } - - private void insert(BinaryTreeNode current, BinaryTreeNode node) { - - if (current.getData().compareTo(node.getData()) > 0) { - if (current.getLeft() == null) - current.setLeft(node); - else - insert(current.getLeft(), node); - } - else { - if (current.getRight() == null) - current.setRight(node); - else - insert(current.getRight(), node); - } - } - - @Override - public String toString() { - return new BFSNodeQueue().toString(); - } - - /** - * 广度优先遍历节点队列 - * - * @author Administrator - * - */ - private class BFSNodeQueue { - private MyQueue> nodeQueue; - - public BFSNodeQueue() { - nodeQueue = new MyQueue<>(); - } - - public boolean isEmpty() { - return nodeQueue.isEmpty(); - } - - public void enQueue(BinaryTreeNode node) { - if (node != null) nodeQueue.enQueue(node); - } - - // 出队同时把子节点入队 - public BinaryTreeNode deQueue() { - if (!isEmpty()) { - BinaryTreeNode first = nodeQueue.deQueue(); - enQueue(first.getLeft()); - enQueue(first.getRight()); - return first; - } - throw new QueueIsEmptyException(); - } - - // 把所有出队节点放进另一个队列中 - public MyQueue> getResult() { - prepare(); - MyQueue> result = new MyQueue<>(); - while (!isEmpty()) { - result.enQueue(deQueue()); - } - return result; - } - - private void prepare() { - clearQueue(); - enQueue(root); - } - - public void clearQueue() { - while (!isEmpty()) { - deQueue(); - } - } - - @Override - public String toString() { - StringBuilder stringBuilder = new StringBuilder(); - - Iterator> iterator = iterator(); - while (iterator.hasNext()) { - stringBuilder.append(iterator.next() + "\n"); - } - return stringBuilder.toString(); - } - } - - @Override - public Iterator> iterator() { - return new BFSIterator(); - } - - private class BFSIterator implements Iterator> { - MyArrayList> list; - Iterator> iterator; - - public BFSIterator() { - MyQueue> BFSQueue = new BFSNodeQueue().getResult(); - list = new MyArrayList<>(); - while (!BFSQueue.isEmpty()) { - list.add(BFSQueue.deQueue()); - } - iterator = list.iterator(); - } - - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public BinaryTreeNode next() { - return iterator.next(); - } - } - - public static void main(String[] args) { - BinaryTree binaryTree = new BinaryTree<>(5); - binaryTree.insert(6); - binaryTree.insert(7); - binaryTree.insert(4); - Iterator> iterator = binaryTree.iterator(); - while (iterator.hasNext()) { - System.out.println(iterator.next()); - } - System.out.println(binaryTree); - } -} diff --git a/group17/1264835468/src/assignment/BinaryTreeNode.java b/group17/1264835468/src/assignment/BinaryTreeNode.java deleted file mode 100644 index 02a162ae10..0000000000 --- a/group17/1264835468/src/assignment/BinaryTreeNode.java +++ /dev/null @@ -1,58 +0,0 @@ -package assignment; - -public class BinaryTreeNode> { - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(T data) { - this.data = data; - } - - public T getData() { - return data; - } - - public void setData(T data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - @Override - public String toString() { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("node:" + data); - // 非叶节点则加上左右子节点data - if (left != null || right != null) { - if (left != null) - stringBuilder.append(",left:" + left.data); - else - stringBuilder.append(",left:null"); - if (right != null) - stringBuilder.append(",right:" + right.data); - else - stringBuilder.append(",right:null"); - } - return stringBuilder.toString(); - } - - public static void main(String[] args) { - // BinaryTreeNode binaryTreeNode = new BinaryTreeNode<>(1); - } - -} diff --git a/group17/1264835468/src/assignment/Iterable.java b/group17/1264835468/src/assignment/Iterable.java deleted file mode 100644 index 403c5e9866..0000000000 --- a/group17/1264835468/src/assignment/Iterable.java +++ /dev/null @@ -1,6 +0,0 @@ -package assignment; - -// -public interface Iterable { - Iterator iterator(); -} diff --git a/group17/1264835468/src/assignment/Iterator.java b/group17/1264835468/src/assignment/Iterator.java deleted file mode 100644 index feb4e2066a..0000000000 --- a/group17/1264835468/src/assignment/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package assignment; - -public interface Iterator { - public boolean hasNext(); - - public E next(); -} diff --git a/group17/1264835468/src/assignment/List.java b/group17/1264835468/src/assignment/List.java deleted file mode 100644 index ba31dc333b..0000000000 --- a/group17/1264835468/src/assignment/List.java +++ /dev/null @@ -1,14 +0,0 @@ -package assignment; - -// -public interface List { - public void add(E o); - - public void add(int index, E o); - - public E get(int index); - - public E remove(int index); - - public int size(); -} diff --git a/group17/1264835468/src/assignment/MyArrayList.java b/group17/1264835468/src/assignment/MyArrayList.java deleted file mode 100644 index ea9ae87755..0000000000 --- a/group17/1264835468/src/assignment/MyArrayList.java +++ /dev/null @@ -1,110 +0,0 @@ -package assignment; - -import java.util.Arrays; - -public class MyArrayList implements List, Iterable { - private Object[] elementData; - private static final int DEFAULT_SIZE = 10; - private int size; - - public MyArrayList() { - this(DEFAULT_SIZE); - } - - public MyArrayList(int initSize) { - if (initSize < 0) { - throw new IllegalArgumentException(initSize + " < 0"); - } - if (initSize == 0) { - elementData = new Object[DEFAULT_SIZE]; - } - else { - elementData = new Object[initSize]; - } - size = 0; - } - - public void add(E o) { - growIfNeed(); - elementData[size++] = o; - } - - public void add(int index, E o) { - if (index < 0 || index > size) { - throw new IllegalArgumentException("index:" + index); - } - growIfNeed(); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - @SuppressWarnings("unchecked") - public E get(int index) { - rangeCheck(index); - return (E) elementData[index]; - } - - public E remove(int index) { - rangeCheck(index); - E target = get(index); - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - size--; - return target; - } - - public int size() { - return size; - } - - private void rangeCheck(int index) { - if (index >= size) { - throw new NoSuchElementException("index:" + index); - } - } - - private void growIfNeed() { - if (size == elementData.length) - grow(); - } - - private void grow() { - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - - @Override - public Iterator iterator() { - return new ArrayIterator<>(); - } - - private class ArrayIterator implements Iterator { - private int currentPos = 0; - - @Override - public boolean hasNext() { - return currentPos < size; - } - - @SuppressWarnings("unchecked") - @Override - public E next() { - rangeCheck(currentPos); - return (E) elementData[currentPos++]; - } - - } - - @Override - public String toString() { - return Arrays.toString(Arrays.copyOf(elementData, size)); - } - -} - -class NoSuchElementException extends RuntimeException { - - public NoSuchElementException(String string) { - super(string); - } - -} diff --git a/group17/1264835468/src/assignment/MyLinkedList.java b/group17/1264835468/src/assignment/MyLinkedList.java deleted file mode 100644 index b96a7e1d5b..0000000000 --- a/group17/1264835468/src/assignment/MyLinkedList.java +++ /dev/null @@ -1,144 +0,0 @@ -package assignment; - -public class MyLinkedList implements List, Iterable { - private Node head; - private int size; - - public MyLinkedList() { - size = 0; - } - - public void add(E o) { - if (head == null) - addFirst(o); - else - addLast(o); - } - - public void addFirst(E o) { - Node oldFirst = head; - head = new Node<>(o, oldFirst); - size++; - } - - public void addLast(E o) { - if (head == null) { - addFirst(o); - } - else { - Node oldLast = movePtrTo(size - 1); - oldLast.next = new Node<>(o, null); - size++; - } - - } - - public void add(int index, E o) { - if (index > size || index < 0) { - throw new IllegalArgumentException("index:" + index); - } - if (index == 0) { - addFirst(o); - return; - } - Node temp = movePtrTo(index - 1); - Node oldNext = temp.next; - Node newNext = new Node<>(o, oldNext); - temp.next = newNext; - size++; - } - - public E remove(int index) { - rangeCheck(index); - E data; - if (index == 0) { - data = head.data; - head = head.next; - } - else { - Node pre = movePtrTo(index - 1); - Node target = pre.next; - pre.next = target.next; - data = target.data; - } - size--; - return data; - } - - public E get(int index) { - rangeCheck(index); - return movePtrTo(index).data; - } - - public int size() { - return size; - } - - private Node movePtrTo(int index) { - Node resultNode = head; - for (int i = 0; i < index; i++) { - resultNode = resultNode.next; - } - return resultNode; - } - - private void rangeCheck(int index) { - if (index >= size) { - throw new NoSuchElementException("index:" + index); - } - } - - @Override - public String toString() { - StringBuilder stringBuilder = new StringBuilder('['); - Node temp = head; - while (temp != null) { - stringBuilder.append(String.valueOf(temp.toString()) + ","); - temp = temp.next; - } - stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length()); - stringBuilder.append(']'); - return stringBuilder.toString(); - } - - private static class Node { - private T data; - private Node next; - - public Node(T data, Node next) { - this.data = data; - this.next = next; - } - - @Override - public String toString() { - return data.toString(); - } - } - - @Override - public Iterator iterator() { - return new ListIterator(); - } - - private class ListIterator implements Iterator { - Node currentNode; - - public ListIterator() { - currentNode = head; - } - - @Override - public boolean hasNext() { - return currentNode.next != null; - } - - @Override - public E next() { - Node temp = currentNode; - currentNode = currentNode.next; - return temp.data; - } - - } -} \ No newline at end of file diff --git a/group17/1264835468/src/assignment/MyQueue.java b/group17/1264835468/src/assignment/MyQueue.java deleted file mode 100644 index c5e3e8ce88..0000000000 --- a/group17/1264835468/src/assignment/MyQueue.java +++ /dev/null @@ -1,34 +0,0 @@ -package assignment; - -public class MyQueue { - private MyLinkedList elementData = new MyLinkedList<>(); - - public void enQueue(T o) { - elementData.addLast(o); - } - - public T deQueue() { - if (!isEmpty()) { - return elementData.remove(0); - } - throw new QueueIsEmptyException(); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} - -class QueueIsEmptyException extends RuntimeException { - public QueueIsEmptyException() { - super(); - } - - public QueueIsEmptyException(String string) { - super(string); - } -} diff --git a/group17/1264835468/src/assignment/MyStack.java b/group17/1264835468/src/assignment/MyStack.java deleted file mode 100644 index 0c3d30337b..0000000000 --- a/group17/1264835468/src/assignment/MyStack.java +++ /dev/null @@ -1,39 +0,0 @@ -package assignment; - -public class MyStack { - private MyArrayList elementData = new MyArrayList<>(); - - public void push(T o) { - elementData.add(o); - } - - public T pop() { - if (!isEmpty()) { - T data = elementData.remove(elementData.size() - 1); - return data; - } - throw new StackIsEmptyException(); - } - - public T peek() { - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} - -class StackIsEmptyException extends RuntimeException { - public StackIsEmptyException() { - super(); - } - - public StackIsEmptyException(String string) { - super(string); - } -} diff --git a/group17/1282579502/.classpath b/group17/1282579502/.classpath deleted file mode 100644 index 3e0fb272a8..0000000000 --- a/group17/1282579502/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group17/1282579502/.gitignore b/group17/1282579502/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group17/1282579502/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group17/1282579502/.project b/group17/1282579502/.project deleted file mode 100644 index 8c3f97afde..0000000000 --- a/group17/1282579502/.project +++ /dev/null @@ -1,37 +0,0 @@ -<<<<<<< HEAD:group17/876385982/.project - - - 876385982 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - -======= - - - 1282579502Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - ->>>>>>> 907d4deeb1542a0f373ee6874add67184cd8332d:group17/1282579502/.project diff --git a/group17/1282579502/src/com/coding/basic/ArrayList.java b/group17/1282579502/src/com/coding/basic/ArrayList.java deleted file mode 100644 index c07b58281c..0000000000 --- a/group17/1282579502/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[8]; - - public int test = 10; - - public void add(Object o){ - if(size + 1 >elementData.length){ - expand(); - } - elementData[size] = o; - size++; - } - /** - * Parameters: - * index index at which the specified element is to be inserted - * element element to be inserted - * Throws: - * IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size()) - */ - - public void add(int index, Object o){ - if(index <0 || index > size()) throw new IndexOutOfBoundsException(index + ": Invalid Index"); - if(size()+1>elementData.length){ - expand(); - } - if(index < size()) - System.arraycopy(elementData, index, elementData, index+1, size() - index); - elementData[index] = o; - size ++; - } - - public Object get(int index){ - if(index <0 || index >= size()) throw new ArrayIndexOutOfBoundsException(index + ": Invalid Index."); - return elementData[index]; - } - - public Object remove(int index) { - if(index <0 || index >= size()) throw new ArrayIndexOutOfBoundsException(index + ": Invalid Index."); - Object item = elementData[index]; - if(size() == 1){ - size--; - }else{ - if(index o, return 1 - * this.data < o, return -1 - * this.data == o, return 0; - */ - public BinaryTreeNode insert(Object o){ - if(!( o instanceof Comparable)) throw new IllegalArgumentException(o + " is NOT comparable. "); - if(data == null) { - data = o; - return this; - } - - Comparable cdata = (Comparable) data; - if(cdata.compareTo(o)>0){ - if(left == null) { - left = new BinaryTreeNode(o); - return left; - } - else{ - return left.insert(o); - } - } - else if(cdata.compareTo(o)<0){ - if(right == null){ - right = new BinaryTreeNode(o); - return right; - }else{ - return right.insert(o); - } - } - else{ - throw new IllegalArgumentException(o + " encountered a duplication."); - } - } - -} diff --git a/group17/1282579502/src/com/coding/basic/Iterator.java b/group17/1282579502/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group17/1282579502/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group17/1282579502/src/com/coding/basic/LinkedList.java b/group17/1282579502/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 55db7e97bc..0000000000 --- a/group17/1282579502/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head = null; - private Node tail = null; - private int size = 0; - - public void add(Object o){ - if(head == null){ - head = new Node(o); - tail = head; - }else{ - tail.next = new Node(o); - tail = tail.next; - } - size ++; - } - /** - * Add to index from 0 to size - * Add to index at 0 is equivalent to addFirst - * Add to index at size is equivalent to add and addLast - * - */ - public void add(int index , Object o){ - if(index < 0 || index >size+1) throw new IndexOutOfBoundsException(index + ": Invalid Index"); - Node newNode = new Node(o); - //manage head node - if(index == 0){ - if(head == null){ - this.add(o); - } - else{ - newNode.next = head; - head = newNode; - size++; - } - } - else if (index == size){ - this.add(o); - } - else{ - Node prevNode = getNodeAt(index-1); - newNode.next = prevNode.next; - prevNode.next = newNode; - size ++; - } - } - public Object get(int index){ - Node c = getNodeAt(index); - if(c == null ) return null; - return c.data; - } - - private Node getNodeAt(int index){ - if(index < 0 || index >size-1) throw new IndexOutOfBoundsException(index + ": Invalid Index"); - Node c = head; - while(index-- > 0 ){ - if(c != null) c = c.next; - else return null; - } - return c; - } - - public Object remove(int index){ - if(index<0 || index >size-1) throw new IndexOutOfBoundsException(index + ": Invalid Index"); - Node ret = null; - if(index == 0){ - ret = head; - head = head.next; - size --; - }else if(index == size -1){ - Node nodeBeforeTail = getNodeAt(index -1); - ret = tail; - nodeBeforeTail.next = null; - size --; - }else{ - Node nodeBeforeTarget = getNodeAt(index -1); - Node target = nodeBeforeTarget.next; - ret = target; - nodeBeforeTarget.next = target.next; - size --; - } - - return ret.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - this.add(0, o); - } - - public void addLast(Object o){ - this.add(o); - } - - public Object removeFirst(){ - return remove(0); - } - - public Object removeLast(){ - return remove(size-1); - } - - public Iterator iterator(){ - return new LinkedListIterator(this); - } - - private class Node{ - public Object data = null; - public Node next = null; - public Node(Object o){ - data = o; - } - } - - private static class LinkedListIterator implements Iterator{ - - Object[] oArray = null; - int cursor = 0; - public LinkedListIterator(LinkedList ll){ - if(ll == null) throw new NullPointerException("Linkedlist Object is NULL"); - oArray = new Object[ll.size()]; - for(int i = 0; i< ll.size(); i++){ - oArray[i] = ll.get(i); - } - } - - @Override - public boolean hasNext() { - if(cursor < oArray.length){ - return true; - } - return false; - } - - @Override - public Object next() { - Object o = oArray[cursor]; - cursor ++; - return o; - } - - } -} diff --git a/group17/1282579502/src/com/coding/basic/List.java b/group17/1282579502/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group17/1282579502/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group17/1282579502/src/com/coding/basic/Queue.java b/group17/1282579502/src/com/coding/basic/Queue.java deleted file mode 100644 index b9cbd3c500..0000000000 --- a/group17/1282579502/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList ll = null; - - public Queue(){ - ll = new LinkedList(); - } - - public void enQueue(Object o){ - ll.add(o); - } - - public Object deQueue() throws IndexOutOfBoundsException{ - try{ - return ll.remove(0); - }catch(IndexOutOfBoundsException ie){ - throw new IndexOutOfBoundsException(ie.getMessage()); - } - - } - - public boolean isEmpty(){ - return (ll.size() == 0) ? true : false; - } - - public int size(){ - return ll.size(); - } -} diff --git a/group17/1282579502/src/com/coding/basic/Stack.java b/group17/1282579502/src/com/coding/basic/Stack.java deleted file mode 100644 index 7bfcd75ec3..0000000000 --- a/group17/1282579502/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList al = null; - - public Stack(){ - al = new ArrayList(); - } - - public void push(Object o){ - al.add(o); - } - - public Object pop(){ - return al.remove(al.size()-1); - } - - public Object peek(){ - return (al.size() == 0) ? null : al.get(al.size() -1); - } - - public boolean isEmpty(){ - return (al.size() == 0) ? true : false; - } - - public int size(){ - return al.size(); - } -} diff --git a/group17/1282579502/src/com/coding/basic/ut/ArrayListTest.java b/group17/1282579502/src/com/coding/basic/ut/ArrayListTest.java deleted file mode 100644 index 9bce65892b..0000000000 --- a/group17/1282579502/src/com/coding/basic/ut/ArrayListTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.coding.basic.ut; - -import static org.junit.Assert.*; - -import java.lang.reflect.Field; - -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.ArrayList; -import com.coding.basic.Iterator; - -public class ArrayListTest { - - ArrayList target; - Object[] elementDataField; - @Before - public void setUp() throws Exception { - target = new ArrayList(); - /* - * NOTE: getField only returns PUBLIC fields, getDeclaredField get all fields - Field[] allFields = target.getClass().getFields(); - System.out.println("Get all fields"); - for(Field tmpf : allFields){ - System.out.println(tmpf.getName()); - } - Field[] allDeclFields = target.getClass().getDeclaredFields(); - System.out.println("Get all declared fields"); - for(Field tmpf : allDeclFields){ - System.out.println(tmpf.getName()); - } - * - */ - try { - Field f = target.getClass().getDeclaredField("elementData"); - - f.setAccessible(true); - if(f.getType().isArray()){ - elementDataField = (Object[]) f.get(target); - } - } catch (NoSuchFieldException e) { - fail(e.getMessage()); - } catch (SecurityException e) { - fail(e.getMessage()); - } catch (IllegalArgumentException e) { - fail(e.getMessage()); - } catch (IllegalAccessException e) { - fail(e.getMessage()); - } - } - - @Test - public void testAddObject() { - Object item = new String("s1"); - target.add(item); - assertEquals(item, elementDataField[0]); - } - - @Test - public void testAddIndexObject() { - //fail("Not yet implemented"); - Object item0 = new String("s0"); - target.add(0, item0); - - Object item1 = new String("s1"); - target.add(0, item1); - - assertEquals(item1, elementDataField[0]); - assertEquals(item0, elementDataField[1]); - } - - @Test - public void testGet() { - target.add("0"); - Object o = target.get(0); - assertEquals("0", o); - assertNotEquals("2", 0); - } - - @Test - public void testRemove() { - String[] items = new String[]{"0","1","2"}; - for(int i = 0; i=0; i--){ - assertEquals(ll.get(i), items[items.length - 1 -i]); - } - - } - - @Test - public void testAddLast() { - LinkedList ll = new LinkedList(); - String[] items = new String[]{"0","1","2","3","4"}; - for(int i = 0 ; i< items.length; i++){ - ll.addLast(items[i] ); - } - //expect 0, 1, 2, 3, 4 - for(int i = 0; i= elementData.length) { - resize(2 * size); - } - elementData[size] = o; - size++; - } - - public void add(int index, Object o) { - if (index > size) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - } - if (size >= elementData.length) { - resize(2 * size); - } - for (int i = size; i > index; i--) { - elementData[i] = elementData[i - 1]; - } - elementData[index] = o; - size++; - } - - public Object get(int index) { - if (index >= size) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - } - return elementData[index]; - } - - public Object remove(int index) { - Object o = elementData[index]; - for (int i = index; i < size - 1; i++) { - elementData[i] = elementData[i + 1]; - } - elementData[size - 1] = null; - size--; - return o; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return null; - } - - private void resize(int n) { - Object[] temp = elementData; - elementData = new Object[n]; - for (int i = 0; i < temp.length; i++) { - elementData[i] = temp[i]; - } - } - -} diff --git a/group17/1540186032/First/src/BinaryTreeNode.java b/group17/1540186032/First/src/BinaryTreeNode.java deleted file mode 100644 index d9cf24d809..0000000000 --- a/group17/1540186032/First/src/BinaryTreeNode.java +++ /dev/null @@ -1,31 +0,0 @@ - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group17/1540186032/First/src/Iterator.java b/group17/1540186032/First/src/Iterator.java deleted file mode 100644 index b7d572d9d7..0000000000 --- a/group17/1540186032/First/src/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group17/1540186032/First/src/LinkedList.java b/group17/1540186032/First/src/LinkedList.java deleted file mode 100644 index 18c7978c6d..0000000000 --- a/group17/1540186032/First/src/LinkedList.java +++ /dev/null @@ -1,131 +0,0 @@ -public class LinkedList implements List { - public static void main(String[] args) { - LinkedList linkedList = new LinkedList(); - linkedList.add(0); - - System.out.println(linkedList.get(0)); - - } - - private Node first; - - private Node last; - - private int size = 0; - - public void add(Object o) { - Node oldLast = last; - last = new Node(); - last.data = o; - last.next = null; - if (oldLast != null) { - oldLast.next = last; - } - if (first == null) { - first = last; - } - size++; - } - - public void add(int index, Object o) { - if (index > size) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - } - if (index == 0) { - addFirst(o); - return; - } - if (index == size) { - addLast(o); - return; - } - Node curserNode = cursor(index - 1); - Node newNode = new Node(); - newNode.data = o; - newNode.next = curserNode.next; - curserNode.next = newNode; - size++; - } - - public Object get(int index) { - return cursor(index).data; - } - - public Object remove(int index) { - Node node = cursor(index - 1).next; - cursor(index - 1).next = node.next; - node.next = null; - return node.data; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node newNode = new Node(); - newNode.data = o; - if (first == null) { - first = newNode; - } else { - newNode.next = first; - first = newNode; - } - if (last == null) { - last = first; - } - size++; - } - - public void addLast(Object o) { - Node newNode = new Node(); - newNode.data = o; - if (last == null) { - last = newNode; - } else { - last.next = newNode; - last = newNode; - } - if (first == null) { - first = last; - } - size++; - } - - public Object removeFirst() { - Node node = first; - Node newFirst = first.next; - first.next = null; - first = newFirst; - size--; - return node.data; - } - - public Object removeLast() { - Node node = last; - Node newLast = cursor(size - 1); - newLast.next = null; - last = newLast; - size--; - return node.data; - } - - public Iterator iterator() { - return null; - } - - private Node cursor(int index) { - Node curserNode = first; - for (int i = 0; i < index; i++) { - curserNode = curserNode.next; - } - return curserNode; - } - - private static class Node { - Object data; - Node next; - - } -} diff --git a/group17/1540186032/First/src/List.java b/group17/1540186032/First/src/List.java deleted file mode 100644 index 7290dd72cf..0000000000 --- a/group17/1540186032/First/src/List.java +++ /dev/null @@ -1,8 +0,0 @@ - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group17/1540186032/First/src/Queue.java b/group17/1540186032/First/src/Queue.java deleted file mode 100644 index 4f6bcd41cb..0000000000 --- a/group17/1540186032/First/src/Queue.java +++ /dev/null @@ -1,23 +0,0 @@ - -public class Queue { - LinkedList elementData = new LinkedList(); - - public void enQueue(Object o) { - elementData.add(o); - } - - public Object deQueue() { - if (elementData.size() == 0) { - - } - return elementData.removeFirst(); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} diff --git a/group17/1540186032/First/src/Stack.java b/group17/1540186032/First/src/Stack.java deleted file mode 100644 index c6609c8db8..0000000000 --- a/group17/1540186032/First/src/Stack.java +++ /dev/null @@ -1,28 +0,0 @@ -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - if (elementData.size() == 0) { - throw new EmptyStackException(); - } - return elementData.remove(elementData.size() - 1); - } - - public Object peek() { - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} diff --git a/group17/176653813/1766538130226Lesson/.classpath b/group17/176653813/1766538130226Lesson/.classpath deleted file mode 100644 index b387714202..0000000000 --- a/group17/176653813/1766538130226Lesson/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group17/176653813/1766538130226Lesson/.gitignore b/group17/176653813/1766538130226Lesson/.gitignore deleted file mode 100644 index 3e2fcc7171..0000000000 --- a/group17/176653813/1766538130226Lesson/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group17/176653813/1766538130226Lesson/.project b/group17/176653813/1766538130226Lesson/.project deleted file mode 100644 index faf83f8e14..0000000000 --- a/group17/176653813/1766538130226Lesson/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 1766538130226Lesson - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group17/176653813/1766538130226Lesson/.settings/org.eclipse.jdt.core.prefs b/group17/176653813/1766538130226Lesson/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a87..0000000000 --- a/group17/176653813/1766538130226Lesson/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/ArrayList.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 484b1e5340..0000000000 --- a/group17/176653813/1766538130226Lesson/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - private Object[] obj = new Object[5]; - - @Override - public void add(Object o) { - if(this.size < 0 ) - System.out.print("Error"); - this.extend(100); - obj[this.size] = o; - this.size ++; - } - - @Override - public void add(int index, Object o) { - - if(index < 0) - System.out.println("Error"); - if(index < this.size){ - extend(100); - for(int i = this.size;i < index; i--){ - obj[i+1] = obj[i]; - } - obj[index] = o; - }else if(index >= size){ - extend(100); - obj[size] = o; - } - this.size++; - } - - @Override - public Object get(int index) { - if(index < 0 || index > size){ - System.out.println("Error"); - return null; - } - return obj[index]; - } - - @Override - public Object remove(int index) { - if(index < 0 || index > size){ - System.out.println("Error"); - return null; - } - for(int i = index;i <= size;i++){ - obj[i] = obj[i+1]; - } - size--; - return obj[index]; - } - - @Override - public int size() { - return size; - } - public int length(){ - return obj.length; - } - public void extend(int newLength){ - if (this.size >= obj.length){ - //չ - Object[] old = obj; - obj = new Object[size+newLength]; - for(int i = 0;i < size; i++){ - obj[i] = old[i]; - } - } - return; - } - public void Iteror(){ - for(int i = 0 ;i < size ; i++){ - System.out.println(obj[i]); - } - } -} diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/LinkList.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/LinkList.java deleted file mode 100644 index 6b7ebe0f81..0000000000 --- a/group17/176653813/1766538130226Lesson/src/com/coding/basic/LinkList.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.coding.basic; - -public class LinkList implements List{ - - private Node head; //ͷ㲻 - private static class Node{ - Object data; - Node next; - } - - @Override - public void add(Object o) { - //һû뵽 - if(null == head){ - head = new Node(); - head.next = null; - head.data = o; - }else{ - //β뷨 - //Node t = new Node(); - Node t; - Node ins = new Node(); - t = head; - while(t.next != null){ - t = t.next; - } - t.next = ins; - ins.next = null; - ins.data = o; - } - } - - @Override - public void add(int index, Object o) { - if(index < 0 ){ - System.out.println("Error"); - }else if(index == 0 || index == 1){ - Node t = new Node(); - t.next = head.next; - head.next = t; - t.data = o; - }else{ - Node t = new Node();//ǰڵ - Node p = new Node();//ǰһڵ - t = head.next; - for(int i = 1;i < index;i++){ - p = t; - t = t.next; - } - Node ins = new Node(); - p.next = ins; - ins.next = t; - ins.data = o; - } - - } - - @Override - public Object get(int index) { - if(index < 0 || head == null){ - System.out.println("Error"); - return null; - }else{ - Node t ; - t = head; - for(int i = 1;i < index;i++){ - t = t.next; - } - return t.data; - } - } - - @Override - public Object remove(int index) { - - return null; - } - - public void display(){ - if(head == null){ - System.out.println("No Data"); - }else{ - Node t ; - t = head; - while(t != null){ - System.out.println("******"+t.data); - t = t.next; - } - } - - } - @Override - public int size() { - return 0; - } -} diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/List.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/List.java deleted file mode 100644 index 2c3e428bf8..0000000000 --- a/group17/176653813/1766538130226Lesson/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List{ - public void add(Object o); - public void add(int index,Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/Queue.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/Queue.java deleted file mode 100644 index b1f9c85511..0000000000 --- a/group17/176653813/1766538130226Lesson/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkList elementData = new LinkList(); - private int front = 0; - private int rear = 0; - - - public void enQueue(Object o){ - elementData.add(o); - rear++; - } - public Object deQueue(){ - if(!isEmpty()){ - Object obj = elementData.remove(front); - front++; - return obj; - }else{ - System.out.println("Queue is empty"); - return null; - } - } - public boolean isEmpty(){ - if(front > rear){ - return true; - } - return false; - } - - public int size(){ - return rear-front+1; - } -} - diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/Stack.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/Stack.java deleted file mode 100644 index 27e4dc7db9..0000000000 --- a/group17/176653813/1766538130226Lesson/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic; - -public class Stack { - - // - private ArrayList elementData = new ArrayList(); - private int top = 0; - - public void push(Object o){ - elementData.add(o); - top++; - } - - public Object pop(){ - if(!isEmpty()){ - System.out.println("stack is empoty"); - return null; - } - Object obj = elementData.remove(top); - top--; - return obj; - } - - public Object peek(){ - return elementData.get(top); - } - - public boolean isEmpty(){ - if(top != 0){ - return true; - } - return false; - } - - public int size(){ - return top++; - } - - - -} diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/Test.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/Test.java deleted file mode 100644 index 50b9b144b7..0000000000 --- a/group17/176653813/1766538130226Lesson/src/com/coding/basic/Test.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.coding.basic; - -import static org.junit.Assert.*; - -public class Test { - - @org.junit.Test - public void test() { - -/* ArrayList al = new ArrayList(); - al.add(1); - al.add(2); - al.add(3); - al.add(4); - al.add(5); - al.add(200); - al.add(10,100); - al.Iteror(); - //System.out.println(al.length()); - //System.out.println(al.size()); - System.out.println("=================="); - al.remove(0); - al.Iteror();*/ - - LinkList ls = new LinkList(); - ls.add(100); - ls.add(300); - ls.add(500); - ls.add(1000); - ls.add(3,2000); - ls.display(); - System.out.println(ls.get(4)); - } - -} - diff --git a/group17/176653813/RemoteSystemsTempFiles/.project b/group17/176653813/RemoteSystemsTempFiles/.project deleted file mode 100644 index 7675629320..0000000000 --- a/group17/176653813/RemoteSystemsTempFiles/.project +++ /dev/null @@ -1,12 +0,0 @@ - - - RemoteSystemsTempFiles - - - - - - - org.eclipse.rse.ui.remoteSystemsTempNature - - diff --git a/group17/240094626/.gitignore b/group17/240094626/.gitignore deleted file mode 100644 index cf8e1e36d1..0000000000 --- a/group17/240094626/.gitignore +++ /dev/null @@ -1,45 +0,0 @@ -<<<<<<< HEAD:group17/.gitignore -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -#ide config -.metadata -.recommenders - -.classpath -.project -. -======= -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -#ide config -.metadata -.recommenders - -*.settings -*.project -*.classpath -*/.settings -/**/target/**/* ->>>>>>> 306b41b325671fb7420952ad0788ea6be114d674:group17/240094626/.gitignore diff --git a/group17/240094626/warm-up/.gitignore b/group17/240094626/warm-up/.gitignore deleted file mode 100644 index c7b6e44e1d..0000000000 --- a/group17/240094626/warm-up/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/bin/ -*.classpath -*.project -/.settings/ diff --git a/group17/240094626/warm-up/src/com/coding/basic/Iterator.java b/group17/240094626/warm-up/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group17/240094626/warm-up/src/com/coding/basic/List.java b/group17/240094626/warm-up/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group17/240094626/warm-up/src/com/coding/basic/impl/ArrayList.java b/group17/240094626/warm-up/src/com/coding/basic/impl/ArrayList.java deleted file mode 100644 index 6486868054..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/impl/ArrayList.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.coding.basic.impl; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -/** - * - * @描述: ArrayList简单实现 - * @作者:240094626 - * @创建日期:2017-2-20 - */ -public class ArrayList implements List { - - /** - * @comment:元素数组 - */ - private Object data[] = null; - - /** - * @comment:数组元素个数 - */ - private int size = 0; - - /** - * 无参构造函数,初始化容量为10的空列表 - */ - public ArrayList(){ - this(10); - } - - /** - * @param length - * 构造函数,初始化容量为length的空列表 - */ - public ArrayList(int length){ - if(length < 0){ - throw new IllegalArgumentException("初始容量参数非法:"+length); - } - data = new Object[length]; - } - - - /** - * @createTime: 2017-2-21 下午1:32:28 - * @param length - * @return:void - * @comment:列表结构扩展容量,每次增加原来的1/2容量 - */ - private void grow(int length){ - int oldLength = data.length; - if(length > oldLength){ - Object oldData[] = data; - int newLength = oldLength*3/2 + 1; - if(newLength < length){ - newLength = length; - } - data = new Object[newLength]; - System.arraycopy(oldData, 0, data, 0, oldLength); - } - } - - /** - * @createTime: 2017-2-21 下午1:32:05 - * @param index - * @return:void - * @comment:检验下标参数是否超限 - */ - private void check(int index) { - if( index >= size){ - throw new IndexOutOfBoundsException("Index:"+index+",size:"+size); - } - } - - @Override - public void add(Object o) { - grow(size+1); - data[size++]=o; - } - - @Override - public void add(int index, Object o) { - if( index > size || index < 0){ - throw new IndexOutOfBoundsException("Index:"+index+",size:"+size); - } - grow(size+1); - System.arraycopy(data, index, data, index+1, size-index); - data[index] = o; - size++; - - } - - @Override - public Object get(int index) { - check(index); - return data[index]; - } - - - - @Override - public Object remove(int index) { - check(index); - Object remove = data[index]; - System.arraycopy(data, index+1, data, index, size-index); - data[--size] = null; - return remove; - } - - @Override - public int size() { - return size; - } - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - for(int i =0; i 0){ - sb.append(","); - } - sb.append(data[i]); - } - return String.format("ArrayList {data=[%s], size=%d}", sb.toString(),size); - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - /** - * @描述: 简单实现迭代器 - * @作者:240094626 - * @创建日期:2017-2-21 - */ - private class ArrayListIterator implements Iterator{ - - /** - * @column:index - * @comment:当前位置下标 - */ - private int index; - - /** - * 无参构造,初始化迭代器的下标为0 - */ - public ArrayListIterator(){ - index = 0; - } - - @Override - public boolean hasNext() { - if(index < size){ - return true; - } - return false; - } - - @Override - public Object next() { - Object o = get(index++); - return o; - } - - } - -} - - diff --git a/group17/240094626/warm-up/src/com/coding/basic/impl/BinaryTree.java b/group17/240094626/warm-up/src/com/coding/basic/impl/BinaryTree.java deleted file mode 100644 index 41ec919b27..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/impl/BinaryTree.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.coding.basic.impl; - - -/** - * 二叉树简单实现(key为int类型) - * @author 240094626 - * - */ -public class BinaryTree { - /**根结点,初始化为空*/ - private Node rootNode = null; - - - /** - * 根据key值插入数据data为空的新节点 - * @param key - * @return - */ - public Node insert(int key){ - return insert(key,null); - } - - /** - * 根据key值插入数据data为o的新节点 - * @param key - * @param o - * @return - */ - public Node insert(int key ,Object o){ - Node newNode = new Node(key, o); - if(rootNode == null){ - rootNode = newNode; - return rootNode; - } - Node fatherNode = rootNode; - Node currentNode = rootNode; - while(currentNode != null){ - fatherNode = currentNode; - if(key < currentNode.key){ - currentNode = currentNode.left; - }else{ - currentNode = currentNode.right; - } - } - if(key < fatherNode.key){ - fatherNode.left = newNode; - }else{ - fatherNode.right = newNode; - } - size++; - return newNode; - } - - /** - * 根据key值查找结点 - * @param key - * @return - */ - public Node getNode(int key){ - return get(rootNode, key); - } - - /** - * 递归算法: 根据开始结点位置和key值查找节点 - * @param n - * @param key - * @return - */ - private Node get(Node n,int key){ - if(n == null){ - return null; - } - if(key < n.key){ - return get(n.left, key); - }else if(key > n.key){ - return get(n.left, key); - } - return n; - } - - - - - - - private static class Node{ - - int key; - Object data; - Node left; - Node right; - - public Node(int key, Object data) { - this.key = key; - this.data = data; - this.left = null; - this.right = null; - } - - @Override - public String toString() { - return "Node [key=" + key + ", data=" + data + "]"; - } - - - } - - - -} diff --git a/group17/240094626/warm-up/src/com/coding/basic/impl/LinkedList.java b/group17/240094626/warm-up/src/com/coding/basic/impl/LinkedList.java deleted file mode 100644 index d6284f9bec..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/impl/LinkedList.java +++ /dev/null @@ -1,205 +0,0 @@ -package com.coding.basic.impl; - -import java.util.NoSuchElementException; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -/** - * 双向链表简单实现 - * @author 240094626 - */ -public class LinkedList implements List { - /**头节点(空的)*/ - private Node header = new Node(null, null, null); - /**链表节点长度*/ - private int size = 0; - - - /** - * 无参构造函数,初始化header节点,前后均指向header节点,形成环形链表 - * 环形链表:为了使链表节点的开头是header,结尾也是header; - * 由于实现了List,那么链表就是有序的,根据下标查询时可借助环形特点双向查找,提升效率; - */ - public LinkedList() { - header.next = header.pre = header; - } - - - /** - * 将Object o 添加到 节点n之前 - * @param o - * @param n - */ - private void addBefore(Object o, Node n) { - Node newNode = new Node(o, n.pre, n); - newNode.next.pre = newNode; - newNode.pre.next = newNode; - size++; - } - - /** - * 根据下标位置查找结点 - * @param index - * @return - */ - private Node getNode(int index) { - if(index < 0 || index >= size){ - throw new IndexOutOfBoundsException("index:"+index); - } - // 查找从header开始 - Node n = header; - if(index <= (size >> 1)){ - // 往next方向找第index个节点 - for(int i=0; i <=index; i++){ - n = n.next; - } - }else{ - // 往pre方向找第size-index个节点 - for(int i=size-index; i >0; i--){ - n = n.pre; - } - } - return n; - } - - - /** - * 移除节点,从当前节点的前后节点间删除当前节点 - * @param n - * @return - */ - private Object remove(Node n){ - if(n == header){ - throw new NoSuchElementException("未找到节点"); - } - Object result = n.data; - n.pre.next = n.next; - n.next.pre = n.pre; - n.data = null; - size--; - return result; - } - - @Override - public void add(Object o) { - // 默认往header前添加 - addBefore(o,header); - } - - - @Override - public void add(int index, Object o) { - addBefore(o,index==size?header:getNode(index)); - } - - @Override - public Object get(int index) { - Node n = getNode(index); - return n.data; - } - - - @Override - public Object remove(int index) { - return remove(getNode(index)); - } - - - @Override - public int size() { - return size; - } - /** - * 环形链表结构,header.next就是第一个节点 - * @param o - */ - public void addFirst(Object o){ - addBefore(o, header.next); - } - /** - * 环形链表结构,header.pre就是最后一个节点 - * @param o - */ - public void addLast(Object o){ - addBefore(o, header); - } - public Object removeFirst(){ - return remove(header.next); - } - public Object removeLast(){ - return remove(header.pre); - } - - public Iterator iterator(){ - - return new LinkedListIterator(); - } - - - @Override - public String toString() { - Iterator it = iterator(); - StringBuilder sb = new StringBuilder(); - while(it.hasNext()){ - if(sb.length() > 0){ - sb.append(","); - } - sb.append(it.next()); - } - return "LinkedList {nodes=[" + sb + "], size=" + size + "}"; - } - - - private static class Node{ - Object data; - Node pre; - Node next; - - /** - * 链表节点,带参构造函数 - * @param data 节点内容 - * @param pre 上一个节点 - * @param next 下一个节点 - */ - public Node(Object data, Node pre, Node next) { - super(); - this.data = data; - this.pre = pre; - this.next = next; - } - - @Override - public String toString() { - return "Node {data=" + data + "}"; - } - - - - } - - private class LinkedListIterator implements Iterator{ - int index ; - - public LinkedListIterator() { - index = 0; - } - - @Override - public boolean hasNext() { - if(index < size){ - return true; - } - return false; - } - - @Override - public Object next() { - Node n = getNode(index++); - return n.data; - } - - } - - -} diff --git a/group17/240094626/warm-up/src/com/coding/basic/impl/Queue.java b/group17/240094626/warm-up/src/com/coding/basic/impl/Queue.java deleted file mode 100644 index 42fae9217c..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/impl/Queue.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coding.basic.impl; - -import com.coding.basic.Iterator; - -/** - * 队列简单实现 - * @author 240094626 - * - */ -public class Queue { - /**队列元素容器对象*/ - LinkedList elementData = new LinkedList(); - - /** - * 入队列 - * @param o - */ - public void enQueue(Object o){ - elementData.add(o); - } - - /** - * 出队列:先进先出,故取出链表首个节点 - * @return - */ - public Object deQueue(){ - return elementData.removeFirst(); - } - - public boolean isEmpty(){ - if(elementData.size() > 0 ){ - return false; - } - return true; - } - - public int size(){ - return elementData.size(); - } - - - @Override - public String toString() { - return "Queue {elementData=" + elementData + "}"; - } - - public Iterator iterator(){ - return new QueueIterator(); - } - - private class QueueIterator implements Iterator{ - - int index; - - public QueueIterator() { - index = 0; - } - - @Override - public boolean hasNext() { - if(index < elementData.size()){ - return true; - } - return false; - } - - @Override - public Object next() { - return elementData.get(index++); - } - - } -} diff --git a/group17/240094626/warm-up/src/com/coding/basic/impl/Stack.java b/group17/240094626/warm-up/src/com/coding/basic/impl/Stack.java deleted file mode 100644 index 786071f0a1..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/impl/Stack.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.coding.basic.impl; - -import com.coding.basic.Iterator; - -/** - * 栈的简单实现 - * @author 240094626 - */ -public class Stack { - /**长度可变的元素容器*/ - private ArrayList elementData = new ArrayList(); - - /** - * 压入栈 - * @param o - */ - public void push(Object o){ - elementData.add(o); - } - - /** - * 出栈(末尾元素),并移除 - * @return Object - */ - public Object pop(){ - return elementData.remove(elementData.size()-1); - } - - /** - * 取出栈(末尾元素),不移除 - * @return Object - */ - public Object peek(){ - return elementData.get(elementData.size()-1); - } - - /** - * 判断栈是否为空 - * @return boolean - */ - public boolean isEmpty(){ - return elementData.size() == 0 ? true : false; - } - - /** - * 栈的长度,既是容器ArrayList的长度 - * @return int - */ - public int size(){ - return elementData.size(); - } - - - - @Override - public String toString() { - return "Stack {elementData=" + elementData + "}"; - } - - public Iterator iterator(){ - return new StackIterator(); - } - - private class StackIterator implements Iterator{ - int index; - - public StackIterator() { - index = 0; - } - - @Override - public boolean hasNext() { - if(index < elementData.size()){ - return true; - } - return false; - } - - @Override - public Object next() { - return elementData.get(index++); - } - - - } -} \ No newline at end of file diff --git a/group17/240094626/warm-up/src/com/coding/basic/test/ArrayListTest.java b/group17/240094626/warm-up/src/com/coding/basic/test/ArrayListTest.java deleted file mode 100644 index 03419f7d0f..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/test/ArrayListTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.coding.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.runner.JUnitCore; -import org.junit.runner.Result; -import org.junit.runner.notification.Failure; - -import com.coding.basic.impl.ArrayList; - -/** - * ArrayList 简单测试 - * @author 240094626 - * - */ -public class ArrayListTest { - - - @Test - public void test() { - ArrayList list = new ArrayList(); - - System.out.println("******测试add(Object o ):添加第一个元素0******"); - list.add(0); - System.out.println("ArrayList print:"+list.toString()); - - System.out.println("******测试add(int index,Object o):添加第二个元素1******"); - list.add(1, 1); - System.out.println("ArrayList print:"+list.toString()); - - System.out.println("******测试remove(int index):删除第1个元素:0******"); - list.remove(0); - System.out.println("ArrayList print:"+list.toString()); - - System.out.println("******测试add(int Object o):添加第三个元素2******"); - list.add(2); - System.out.println("ArrayList print:"+list.toString()); - - - System.out.println("ArrayList size:"+list.size()); - - System.out.println("******测试get(int index):判断第1个元素是否为1******"); - assertEquals(1, list.get(0)); - } - - public static void main(String[] args) { - Result result = JUnitCore.runClasses(ArrayListTest.class); - for(Failure failure : result.getFailures()){ - System.out.println(failure.toString()); - } - System.out.println("test success!:"+result.wasSuccessful()); - } - -} diff --git a/group17/240094626/warm-up/src/com/coding/basic/test/LinkedListTest.java b/group17/240094626/warm-up/src/com/coding/basic/test/LinkedListTest.java deleted file mode 100644 index 25c8ed80c8..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/test/LinkedListTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coding.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.runner.JUnitCore; -import org.junit.runner.Result; -import org.junit.runner.notification.Failure; - -import com.coding.basic.impl.LinkedList; - -/** - * LinkedList 简单测试 - * @author 240094626 - * - */ -public class LinkedListTest { - - @Test - public void test() { - LinkedList list = new LinkedList(); - - System.out.println("******测试add(Object o ):添加第一个元素0******"); - list.add(0); - System.out.println("LinkedList print:"+list.toString()); - System.out.println("******测试add(int index,Object o):添加第二个元素1******"); - list.add(1); - System.out.println("******测试addLast(Object o):往链表最后添加元素3******"); - list.addLast(3); - System.out.println("******测试addFirst(Object o):往链表最前面添加元素5******"); - list.addFirst(5); - System.out.println("LinkedList print:"+list.toString()); - - System.out.println("******测试remove(int index):删除第4个元素:index=3******"); - list.remove(3); - System.out.println("LinkedList print:"+list.toString()); - - System.out.println("******测试addFirst(int Object o):链表最前面添加素2******"); - list.addFirst(2); - System.out.println("LinkedList print:"+list.toString()); - - // 断言第一个元素为0 - assertEquals(2, list.get(0)); - - list.addLast(3); - list.addFirst(5); - System.out.println("LinkedList print:"+list.toString()); - // 断言最后一个元素为3 - assertEquals(3,list.get(list.size()-1)); - } - - public static void main(String[] args) { - Result result = JUnitCore.runClasses(LinkedListTest.class); - for(Failure failure : result.getFailures()){ - System.out.println(failure.toString()); - } - System.out.println("test success!:"+result.wasSuccessful()); - } - -} diff --git a/group17/240094626/warm-up/src/com/coding/basic/test/QueueTest.java b/group17/240094626/warm-up/src/com/coding/basic/test/QueueTest.java deleted file mode 100644 index 6d653983bd..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/test/QueueTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.runner.JUnitCore; -import org.junit.runner.Result; -import org.junit.runner.notification.Failure; - -import com.coding.basic.impl.Queue; - -/** - * Queue 简单测试 - * @author 240094626 - * - */ -public class QueueTest { - - @Test - public void test() { - Queue queue = new Queue(); - - System.out.println("******测试enQueue(Object o):入队列元素a,b,c******"); - queue.enQueue("a"); - queue.enQueue("b"); - queue.enQueue("c"); - System.out.println("queue:"+queue.toString()); - - // 断言队列不为空 - assertEquals(false,queue.isEmpty()); - - // 断言出队列是a - System.out.println("******测试deQueue(Object o):出队列元素a******"); - assertEquals("a",queue.deQueue()); - System.out.println("queue:"+queue.toString()); - - // 断言出队列是b - System.out.println("******测试deQueue(Object o):出队列元素b******"); - assertEquals("b",queue.deQueue()); - System.out.println("queue:"+queue.toString()); - - // 断言出队列是c - assertEquals("c",queue.deQueue()); - - - - - } - - public static void main(String[] args) { - Result result = JUnitCore.runClasses(QueueTest.class); - for(Failure failure : result.getFailures()){ - System.out.println(failure.toString()); - } - System.out.println("test success!:"+result.wasSuccessful()); - } -} diff --git a/group17/240094626/warm-up/src/com/coding/basic/test/StackTest.java b/group17/240094626/warm-up/src/com/coding/basic/test/StackTest.java deleted file mode 100644 index 9b6c07b8f4..0000000000 --- a/group17/240094626/warm-up/src/com/coding/basic/test/StackTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.coding.basic.test; - -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.runner.JUnitCore; -import org.junit.runner.Result; -import org.junit.runner.notification.Failure; - -import com.coding.basic.Iterator; -import com.coding.basic.impl.Stack; - -/** - * stack 简单测试 - * @author 240094626 - * - */ -public class StackTest { - - @Test - public void test() { - Stack stack = new Stack(); - System.out.println("******测试push(Object o):压入第一个元素0******"); - stack.push(0); - System.out.println("Stack print:"+stack.toString()); - - System.out.println("******测试push(Object o):压入第二个元素2******"); - stack.push(2); - System.out.println("Stack print:"+stack.toString()); - - System.out.println("******测试peek():从栈尾取出2,不删除******"); - stack.peek(); - System.out.println("Stack print:"+stack.toString()); - - System.out.println("******测试peek():再次从栈尾取出2,不删除******"); - // 断言出栈为2 - assertEquals(2,stack.peek()); - // 断言size为2 - assertEquals(2,stack.size()); - - System.out.println("******测试pop():末尾元素2出栈,并移除******"); - // 断言出栈为2 - assertEquals(2,stack.pop()); - System.out.println("Stack print:"+stack.toString()); - - // 断言不为空 - assertEquals(false,stack.isEmpty()); - // 断言size为1 - assertEquals(1,stack.size()); - // 添加3,5 两个元素 - stack.push(3); - stack.push(5); - System.out.println("Stack print:"+stack.toString()); - // 测试迭代器 - Iterator it = stack.iterator(); - int i = 1; - while(it.hasNext()){ - System.out.println("第"+i+"个元素:"+it.next()); - i++; - } - - } - public static void main(String[] args) { - Result result = JUnitCore.runClasses(StackTest.class); - for(Failure failure : result.getFailures()){ - System.out.println(failure.toString()); - } - System.out.println("test success!:"+result.wasSuccessful()); - } - -} diff --git a/group17/51075907/HomeWork/.classpath b/group17/51075907/HomeWork/.classpath deleted file mode 100644 index d70658c4e7..0000000000 --- a/group17/51075907/HomeWork/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group17/51075907/HomeWork/.project b/group17/51075907/HomeWork/.project deleted file mode 100644 index f0440af423..0000000000 --- a/group17/51075907/HomeWork/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - HomeWork - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group17/51075907/HomeWork/.settings/org.eclipse.jdt.core.prefs b/group17/51075907/HomeWork/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 25bebf8de8..0000000000 --- a/group17/51075907/HomeWork/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.4 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning -org.eclipse.jdt.core.compiler.source=1.3 diff --git a/group17/51075907/HomeWork/src/day1_HomeWork/ArrayList.java b/group17/51075907/HomeWork/src/day1_HomeWork/ArrayList.java deleted file mode 100644 index 1d071a0b25..0000000000 --- a/group17/51075907/HomeWork/src/day1_HomeWork/ArrayList.java +++ /dev/null @@ -1,75 +0,0 @@ -package day1_HomeWork; - - - public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - //ռ䳬ǰС,֤ - public void ensureCapacity( int newCapacity) - { - if ( newCapacity < size) - return; - - Object [] old =elementData; - elementData =(Object []) new Object[newCapacity]; - for (int i=0; i index; i--) - elementData[i] =elementData [i-1]; - elementData[index]= o; - size ++; - - } - - public Object get(int index){ - if ( index<0 || index >=size()) - throw new ArrayIndexOutOfBoundsException(); - return elementData[index]; - } - - public Object remove(int index){ - Object remove_elementData=elementData[index]; - for ( int i=index;i size()) - throw new IndexOutOfBoundsException(); - - if (index < size()/2) - { - p=beginMarker.next; - for (int i =0;iindex;i--) - p=p.prev; - } - return p; - } - public Object remove(Node p){ - p.next.prev =p.prev; - p.prev.next=p.next; - int size; - size--; - int modCount; - modCount++; - return p.data; - } - - public int size(){ - return -1; - } - - public void addFirst(Node p,Object o){ - Node newNode= new Node (o,p.prev,p); - newNode.prev.next= newNode; - p.prev =newNode; - size++; - modCount++; - } - public void addLast(Object o){ - - } - public Object removeFirst(int index){ - return remove( get(index)); - } - public Object removeLast(){ - return null; - } - public java.util.Iterator iterator(){ - return new LinkedListIterator(); - } - - private class LinkedListIterator implements java.util.Iterator{ - private Node current=beginMarker.next; - private int expectedModCount=modCount; - private boolean okTORemove=false; - - public boolean haNext() - { - return current!= endMarker; - } - public Object next() - { - if (modCount !=expectedModCount) - throw new java.util.ConcurrentModificationException(); - if (!=hasNext()) - throw new java.util.NoSuchElementException(); - - - } - } - - - private static class Node{ - public Node(Object o, Node p, Node n) - { - data =o; next=n; prev=p; - } - public Object data; - public Node next; - public Node prev; - - } -} diff --git a/group17/51075907/HomeWork/src/day1_HomeWork/List.java b/group17/51075907/HomeWork/src/day1_HomeWork/List.java deleted file mode 100644 index 037b33142b..0000000000 --- a/group17/51075907/HomeWork/src/day1_HomeWork/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package day1_HomeWork; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group17/51075907/HomeWork/src/day1_HomeWork/Queue.java b/group17/51075907/HomeWork/src/day1_HomeWork/Queue.java deleted file mode 100644 index 5345e30297..0000000000 --- a/group17/51075907/HomeWork/src/day1_HomeWork/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package day1_HomeWork; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group17/51075907/HomeWork/src/day1_HomeWork/Stack.java b/group17/51075907/HomeWork/src/day1_HomeWork/Stack.java deleted file mode 100644 index c3f4d66bc3..0000000000 --- a/group17/51075907/HomeWork/src/day1_HomeWork/Stack.java +++ /dev/null @@ -1,23 +0,0 @@ -package day1_HomeWork; - - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group17/785396327/binarytree/BinaryTree.java b/group17/785396327/binarytree/BinaryTree.java deleted file mode 100644 index d55c65f8e4..0000000000 --- a/group17/785396327/binarytree/BinaryTree.java +++ /dev/null @@ -1,55 +0,0 @@ -package binarytree; - -/** - * Created by william on 2017/2/16. - */ -public class BinaryTree { - private Node root; - - class Node { - private Node left; - private Node right; - private Comparable data; - - public Node(Node left, Node right, Comparable data) { - this.left = left; - this.right = right; - this.data = data; - } - - private void add(Comparable data) { - if (this.data.compareTo(data) >= 0) - if (this.left == null) - this.left = new Node(null, null, data); - else - left.add(data); - else if (this.data.compareTo(data) < 0) - if (this.right == null) - this.right = new Node(null, null, data); - else - this.right.add(data); - } - - public Comparable getData() { - return this.data; - } - - public Node getLeft() { - return this.left; - } - - public Node getRight() { - return this.right; - } - } - - public void add(Comparable data) { - if (this.root == null) - root = new Node(null, null, data); - else this.root.add(data); - } - - public void printByType(SearchType type) { - type.printByType(this.root); - } -} diff --git a/group17/785396327/binarytree/DLRSearchType.java b/group17/785396327/binarytree/DLRSearchType.java deleted file mode 100644 index 7f9ba1c38d..0000000000 --- a/group17/785396327/binarytree/DLRSearchType.java +++ /dev/null @@ -1,16 +0,0 @@ -package binarytree; - -/** - * Created by william on 2017/2/18. - */ -public class DLRSearchType implements SearchType { - - @Override - public void printByType(BinaryTree.Node root) { - if (root != null) { - System.out.print(root.getData()+" "); - printByType(root.getLeft()); - printByType(root.getRight()); - } - } -} diff --git a/group17/785396327/binarytree/LDRSearchType.java b/group17/785396327/binarytree/LDRSearchType.java deleted file mode 100644 index f67b6dcb81..0000000000 --- a/group17/785396327/binarytree/LDRSearchType.java +++ /dev/null @@ -1,15 +0,0 @@ -package binarytree; - -/** - * Created by william on 2017/2/18. - */ -public class LDRSearchType implements SearchType { - @Override - public void printByType(BinaryTree.Node root) { - if (root != null) { - printByType(root.getLeft()); - System.out.print(root.getData() + " "); - printByType(root.getRight()); - } - } -} diff --git a/group17/785396327/binarytree/LFSearchType.java b/group17/785396327/binarytree/LFSearchType.java deleted file mode 100644 index e88e76b210..0000000000 --- a/group17/785396327/binarytree/LFSearchType.java +++ /dev/null @@ -1,27 +0,0 @@ -package binarytree; - -import java.util.LinkedList; - -/** - * Created by william on 2017/2/18. - */ -public class LFSearchType implements SearchType { - private LinkedList queue = new LinkedList<>(); - - @Override - public void printByType(BinaryTree.Node root) { - if (root == null) - return; - queue.offer(root); - while (!queue.isEmpty()) { - BinaryTree.Node curNode = queue.poll(); - System.out.print(curNode.getData() + " "); - if (curNode.getLeft() != null) - queue.offer(curNode.getLeft()); - if (curNode.getRight() != null) - queue.offer(curNode.getRight()); - } - - } - -} diff --git a/group17/785396327/binarytree/LRDSearchType.java b/group17/785396327/binarytree/LRDSearchType.java deleted file mode 100644 index dbd5f1e820..0000000000 --- a/group17/785396327/binarytree/LRDSearchType.java +++ /dev/null @@ -1,15 +0,0 @@ -package binarytree; - -/** - * Created by william on 2017/2/18. - */ -public class LRDSearchType implements SearchType { - @Override - public void printByType(BinaryTree.Node root) { - if (root != null) { - printByType(root.getLeft()); - printByType(root.getRight()); - System.out.print(root.getData() + " "); - } - } -} diff --git a/group17/785396327/binarytree/SearchType.java b/group17/785396327/binarytree/SearchType.java deleted file mode 100644 index 78f43d0c2d..0000000000 --- a/group17/785396327/binarytree/SearchType.java +++ /dev/null @@ -1,9 +0,0 @@ -package binarytree; - -/** - * Created by william on 2017/2/18. - */ -public interface SearchType { - - void printByType(T root); -} diff --git a/group17/785396327/list/ArrayList.java b/group17/785396327/list/ArrayList.java deleted file mode 100644 index f4e5f26f40..0000000000 --- a/group17/785396327/list/ArrayList.java +++ /dev/null @@ -1,135 +0,0 @@ -package list; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -/** - * Created by william on 2017/2/25. - */ -public class ArrayList implements List { - private static final int DEFAULT_CAPACITY = 10; - private int size; - private Object[] elementData; - - public ArrayList() { - elementData = new Object[DEFAULT_CAPACITY]; - } - - public ArrayList(int initialCapacity) { - if (initialCapacity < 0) - throw new RuntimeException("非法初始化大小参数!"); - elementData = new Object[initialCapacity]; - } - - public boolean add(T ele) { - grow(); - elementData[size] = ele; - size++; - return true; - } - - public T get(int index) { - checkBounds(index); - return (T) elementData[index]; - } - - public T remove(int index) { - checkBounds(index); - T removeEle = (T) elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index); - size--; - return removeEle; - } - - public boolean add(int index, T ele) { - checkBounds(index); - size++;//有效元素内容先加,保证长度极限情况grow在添加前生效 - grow(); - //将原本数组从待插入的index截取,将原本index后的有效值,复制到原本数组index+1之后 - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = ele; - return true; - } - - @Override - public boolean remove(T ele) { - int index; - if ((index = indexOf(ele)) == -1) - return false; - remove(index); - return true; - } - - private void checkBounds(int index) { - if (index < 0 || index >= size) - throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); - } - - public int size() { - return size; - } - - private void grow() { - if (size >= elementData.length) { - int curLen = elementData.length; - int newLen = curLen + (curLen >> 1) > Integer.MAX_VALUE ? Integer.MAX_VALUE : curLen + (curLen >> 1); - elementData = Arrays.copyOf(elementData, newLen); - } - } - - public boolean isEmpty() { - return size == 0; - } - - @Override - public boolean contains(T ele) { - return indexOf(ele) != -1; - } - - public int indexOf(T ele) { - for (int i = 0; i < size; i++) { - if (ele == null) - if (null == elementData[i]) - return i; - else if (ele.equals(elementData[i])) - return i; - } - return -1; - } - - public Iterator iterator() { - return new Itr(); - } - - private class Itr implements Iterator { - int cursor;//待遍历元素的下标 - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public T next() { - if (cursor >= size) - throw new NoSuchElementException(); - return (T) elementData[cursor++]; - } - - @Override - public void remove() { - if (cursor >= size) - throw new NoSuchElementException(); - ArrayList.this.remove(cursor--); - } - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder("[ "); - for (Object ele : elementData) { - sb.append(ele).append(" "); - } - return sb.append("]").toString(); - } -} diff --git a/group17/785396327/list/Iterator.java b/group17/785396327/list/Iterator.java deleted file mode 100644 index 382dbf0c84..0000000000 --- a/group17/785396327/list/Iterator.java +++ /dev/null @@ -1,13 +0,0 @@ -package list; - -/** - * Created by IBM on 2017/2/25. - */ -public interface Iterator { - - boolean hasNext(); - - T next(); - - void remove(); -} diff --git a/group17/785396327/list/LinkedList.java b/group17/785396327/list/LinkedList.java deleted file mode 100644 index c0cbaf7670..0000000000 --- a/group17/785396327/list/LinkedList.java +++ /dev/null @@ -1,163 +0,0 @@ -package list; - -/** - * Created by william on 2017/2/25. - */ -public class LinkedList implements List { - private int size; - private Node first; - private Node last; - - private static class Node { - Node next; - Node prev; - T data; - - Node(Node prev, Node next, T data) { - this.prev = prev; - this.next = next; - this.data = data; - } - } - - @Override - public int size() { - return this.size; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - @Override - public boolean contains(T ele) { - Node head = first; - while (head != null) { - if ((ele == null && head.data == null) || (ele.equals(head.data))) - return true; - head = head.next; - } - return false; - } - - @Override - public boolean add(T ele) { - if (first == null) - first = last = new Node(null, null, ele); - else { - //新添加节点的上一个节点是原来链表的最后一个节点 - Node addNode = new Node(last, null, ele); - //原来链表的最后一个节点的下一个节点需要指向新添加的节点 - last.next = addNode; - //更新最后一个节点为新添加的节点 - last = addNode; - } - size++; - return true; - } - - @Override - public boolean add(int index, T ele) { - checkBounds(index, true); - if (index == size) add(ele); - else { - Node head = first; - for (int i = 0; i < size; i++) { - if (i == index - 1)//得到要插入位置的前一个节点 - head.next = new Node(head, head.next, ele); - else - head = head.next; - } - } - size++; - return true; - } - - @Override - public boolean remove(T ele) { - if (!contains(ele)) - return false; - Node head = first; - Node prev = head.prev; - while (head != null) { - if ((ele == null && ele == head.data) || ele.equals(head.data)) { - prev.next = head.next; - size--; - return true; - } - prev = head; - head = head.next; - } - return false; - } - - @Override - public T remove(int index) { - checkBounds(index, false); - T removeEle = get(index); - remove(removeEle); - return removeEle; - } - - @Override - public T get(int index) { - checkBounds(index, false); - if (index > (size >> 1)) { - //索引位置大于1/2size,从后往前 - Node tail = last; - for (int i = size - 1; i >= 0; i--) { - if (i == index) - return (T) tail.data; - else - tail = tail.prev; - } - } else { - //从前往后 - Node head = first; - for (int i = 0; i < size; i++) { - if (i == index) - return (T) head.data; - else - head = head.next; - } - } - return null; - } - - @Override - public int indexOf(T ele) { - if (first == null) return -1; - Node head = first; - for (int i = 0; i < size; i++) { - if ((ele == null && ele == head.data) || ele.equals(head.data)) - return i; - head = head.next; - } - return -1; - } - - /** - * 指定位置查找元素和插入元素到指定位置IndexOutofBounds的判断标准不一样 - * - * @param index - * @param isInsert - */ - private void checkBounds(int index, boolean isInsert) { - if (isInsert && (index < 0 || index > size))//允许插入到最后一个元素之后,不能排除= - throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); - if (index < 0 || index >= size)//查询从0 --- size-1 - throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder("[ "); - Node head = first; - while (head != null) { - sb.append(head.data + " "); - head = head.next; - } - return sb.append("]").toString(); - } -} diff --git a/group17/785396327/list/List.java b/group17/785396327/list/List.java deleted file mode 100644 index 54fb72108d..0000000000 --- a/group17/785396327/list/List.java +++ /dev/null @@ -1,25 +0,0 @@ -package list; - -/** - * Created by william on 2017/2/25. - */ -public interface List { - - int size(); - - boolean isEmpty(); - - boolean contains(T ele); - - boolean add(T ele); - - boolean add(int index, T ele); - - boolean remove(T ele); - - T remove(int index); - - T get(int index); - - int indexOf(T ele); -} diff --git a/group17/785396327/queue/Queue.java b/group17/785396327/queue/Queue.java deleted file mode 100644 index 7e399961ed..0000000000 --- a/group17/785396327/queue/Queue.java +++ /dev/null @@ -1,41 +0,0 @@ -package queue; - -import java.util.NoSuchElementException; - -/** - * Created by william on 2017/2/25. - */ -public class Queue extends LinkedList { - - public boolean add(T ele) { - return add(ele); - } - - public T element() { - if (size() == 0) - throw new NoSuchElementException("队列中没有元素!"); - return get(0); - } - - public boolean offer(T ele) { - return add(ele); - } - - public T peek() { - if (size() == 0) - return null; - return get(0); - } - - public T poll() { - if (size() == 0) - return null; - return remove(0); - } - - public T remove() { - if (size() == 0) - throw new NoSuchElementException("队列中没有元素!"); - return remove(0); - } -} diff --git a/group17/785396327/stack/Stack.java b/group17/785396327/stack/Stack.java deleted file mode 100644 index 980ca2c0e6..0000000000 --- a/group17/785396327/stack/Stack.java +++ /dev/null @@ -1,29 +0,0 @@ -package stack; - -import java.util.EmptyStackException; - -/** - * Created by william on 2017/2/25. - */ -public class Stack extends ArrayList { - - public boolean empty() { - return isEmpty(); - } - - public T peek() { - if (size() == 0) - throw new EmptyStackException(); - return (T) get(0); - } - - public T pop() { - if (size() == 0) - throw new EmptyStackException(); - return (T) remove(0); - } - - public void push(T ele) { - add(0, ele); - } -} diff --git a/group17/82427129/.gitignore b/group17/82427129/.gitignore deleted file mode 100644 index ccfa635638..0000000000 --- a/group17/82427129/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/.metadata/ -/RemoteSystemsTempFiles/ - -/JavaUtil/.settings/ - -.classpath -.project diff --git a/group17/82427129/JavaUtil/.gitignore b/group17/82427129/JavaUtil/.gitignore deleted file mode 100644 index 24d64373c4..0000000000 --- a/group17/82427129/JavaUtil/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/group17/82427129/JavaUtil/pom.xml b/group17/82427129/JavaUtil/pom.xml deleted file mode 100644 index 6c95dbb077..0000000000 --- a/group17/82427129/JavaUtil/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - 4.0.0 - com.coding.basic - JavaUtil - 0.0.1-SNAPSHOT - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.7 - 1.7 - - - - - - - junit - junit - 4.7 - test - - - \ No newline at end of file diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java deleted file mode 100644 index d9f3d217f5..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData; - - private static Object[] EMPTY_ELEMENTDATA = {}; - - private static int INITIALCAPACITY = 10; - - public ArrayList(){ - elementData = EMPTY_ELEMENTDATA; - } - - public ArrayList(int initialCapacity){ - elementData = new Object[INITIALCAPACITY]; - } - - public void add(Object o){ - ensureCapacity(size+1); - elementData[size++] = o; - } - - public void add(int index, Object o){ - rangeCheckForAdd(index); - - ensureCapacity(size+1); - System.arraycopy(elementData, index, elementData, index+1, size-index); - elementData[index] = o; - size++; - } - - public Object set(int index, Object o){ - rangeCheck(index); - - Object oldValue = elementData[index]; - elementData[index] = o; - return oldValue; - } - - public Object get(int index){ - rangeCheck(index); - return elementData[index]; - } - - public Object remove(int index){ - rangeCheck(index); - Object oldValue = elementData[index]; - int movedLength = size - index - 1; - if(movedLength > 0)//ҪɾһԪʱҪƶ飬ֻҪһԪnull - System.arraycopy(elementData, index+1, elementData, index, size-index-1); - elementData[--size] = null; - return oldValue; - } - - private void rangeCheckForAdd(int index){ - if( index > size || index<0 ){ - throw new IndexOutOfBoundsException(outofIndex(index)); - } - } - private void rangeCheck(int index){ - if( index >= size || index < 0){ - throw new IndexOutOfBoundsException(outofIndex(index)); - } - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return null; - } - - private void ensureCapacity(int minCapacity){ - if(elementData == EMPTY_ELEMENTDATA){ - minCapacity = Math.max(minCapacity, INITIALCAPACITY);//addall״ӵͱINITIALCAPACITY - } - if(minCapacity - elementData.length > 0){ - grow(minCapacity); - } - } - - private void grow(int minCapcity){ - int oldCapacity = elementData.length; - int newCapcity = oldCapacity + (oldCapacity>>1); - if(newCapcity - minCapcity < 0){ - newCapcity = minCapcity; - } - elementData = Arrays.copyOf(elementData, newCapcity); - } - - private String outofIndex(int index){ - return "Index: "+index+", Size: "+size; - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/BinaryTreeNode.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 266eff3d56..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java deleted file mode 100644 index 2a63eee0fc..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,180 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - private int size = 0; - - private Node first; - - private Node last; - - public void add(Object o){ - add(size,o); - } - public void add(int index , Object o){ - rangeCheck(index); - - if(index == size){ - linkLast(o); - }else{ - linkBefore(o, indexOf(index)); - } - } - private void linkBefore(Object o ,Node succ){ - final Node prev = succ.prev; - final Node newNode = new Node(prev, o, succ); - succ.prev = newNode; - if(prev == null){ - first = newNode; - }else{ - prev.next = newNode; - } - size++; - } - private void linkLast(Object o){ - final Node succ = last; - final Node newNode = new Node(succ, o, null); - last = newNode; - if(succ == null){ - first = newNode; - }else{ - succ.next = newNode; - } - size++; - } - private void rangeCheck(int index) { - if(index > size|| index < 0 ) - throw new IndexOutOfBoundsException("Size"+size+":index"+index); - } - private void elementIndexCheck(int index){ - if(index >=size||index < 0) - throw new IndexOutOfBoundsException("Size"+size+":index"+index); - } - /** - * ȡ±ꡱΪindexֵ, - * indexΪsizeʱnull - * @param index - * @return - */ - private Node indexOf(int index){ - if(index < (this.size>>1) ){ - Node x = first; - for (int i = 0; i < index; i++) { - x = x.next; - } - return x; - }else{ - Node x = last; - for (int i = this.size-1; i > index; i--) { - x = x.prev; - } - return x; - } - } - - public Object get(int index){ - elementIndexCheck(index); - - return indexOf(index); - } - public Object remove(int index){ - elementIndexCheck(index); - - if(index == 0){ - return removeFirst(); - }else if(index == size) { - return removeLast(); - }else{ - return unlinkNode(indexOf(index)); - } - } - - private Object unlinkNode(Node node) { - final Node next = node.next; - final Node prev = node.prev; - final Object element = node.data; - if(next == null){ - last = node; - }else{ - next.prev = node; - node.next = next; - } - if(prev == null){ - first = node; - }else{ - prev.next = node; - node.prev = prev; - } - size--; - node.data = null; - - return element; - } - public int size(){ - return size; - } - - public void addFirst(Object o){ - linkBefore(o, first); - } - - public void addLast(Object o){ - linkLast(o); - } - - public Object removeFirst(){ - if(first == null) - throw new NoSuchElementException("first is null"); - - Object oldData = first.data; - final Node next = first.next; - first.data = null; - first.next = null;//GC - first = next; - - if(next == null){ - last = null; - }else{ - next.prev = null; - } - size--; - - return oldData; - } - - public Object removeLast(){ - if(last == null) - throw new NoSuchElementException("last is null"); - - Object oldData = last.data; - final Node prev = last.prev; - last.prev = null; - last.data = null;//GC - last = prev; - - if(prev == null){ - first = null; - }else{ - prev.next = null; - } - size--; - - return oldData; - } - - public Iterator iterator(){ - return null; - } - - private static class Node{ - Object data; - Node next; - Node prev; - Node(Node prev,Object data,Node next){ - this.data = data; - this.next = next; - this.prev = prev; - } - } -} \ No newline at end of file diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Queue.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Queue.java deleted file mode 100644 index b54ff5f56b..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Queue.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - elementData.addLast(o); - } - - public Object deQueue(){ - return elementData.removeLast(); - } - - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java deleted file mode 100644 index 7c00e1950c..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - int length = size(); - Object lastData = peek(); - elementData.remove(length - 1); - - return lastData; - } - - public Object peek(){ - if(size()<=0) - throw new EmptyStackException(); - - return elementData.get(size()-1); - } - public boolean isEmpty(){ - return size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group17/865797761/.classpath b/group17/865797761/.classpath deleted file mode 100644 index fceb4801b5..0000000000 --- a/group17/865797761/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group17/865797761/.gitignore b/group17/865797761/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group17/865797761/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group17/865797761/.project b/group17/865797761/.project deleted file mode 100644 index a78673e93c..0000000000 --- a/group17/865797761/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 865797761 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group17/865797761/.settings/org.eclipse.jdt.core.prefs b/group17/865797761/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group17/865797761/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group17/865797761/src/Collection/ArrayList.java b/group17/865797761/src/Collection/ArrayList.java deleted file mode 100644 index 2e9b68d0ea..0000000000 --- a/group17/865797761/src/Collection/ArrayList.java +++ /dev/null @@ -1,135 +0,0 @@ -package Collection ; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -/** - Created by william on 2017/2/25. - */ -public class ArrayList implements List { - private static final int DEFAULT_CAPACITY = 10; - private int size; - private Object[] elementData; - - public ArrayList() { - elementData = new Object[DEFAULT_CAPACITY]; - } - - public ArrayList(int initialCapacity) { - if (initialCapacity < 0) - throw new RuntimeException("ǷʼС!"); - elementData = new Object[initialCapacity]; - } - - public boolean add(T ele) { - grow(); - elementData[size] = ele; - size++; - return true; - } - - public T get(int index) { - checkBounds(index); - return (T) elementData[index]; - } - - public T remove(int index) { - checkBounds(index); - T removeEle = (T) elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index); - size--; - return removeEle; - } - - public boolean add(int index, T ele) { - checkBounds(index); - size++;//ЧԪȼӣ֤ȼgrowǰЧ - grow(); - //ԭӴindexȡԭindexЧֵƵԭindex+1֮ - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = ele; - return true; - } - - @Override - public boolean remove(T ele) { - int index; - if ((index = indexOf(ele)) == -1) - return false; - remove(index); - return true; - } - - private void checkBounds(int index) { - if (index < 0 || index >= size) - throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); - } - - public int size() { - return size; - } - - private void grow() { - if (size >= elementData.length) { - int curLen = elementData.length; - int newLen = curLen + (curLen >> 1) > Integer.MAX_VALUE ? Integer.MAX_VALUE : curLen + (curLen >> 1); - elementData = Arrays.copyOf(elementData, newLen); - } - } - - public boolean isEmpty() { - return size == 0; - } - - @Override - public boolean contains(T ele) { - return indexOf(ele) != -1; - } - - public int indexOf(T ele) { - for (int i = 0; i < size; i++) { - if (ele == null) - if (null == elementData[i]) - return i; - else if (ele.equals(elementData[i])) - return i; - } - return -1; - } - - public Iterator iterator() { - return new Itr(); - } - - private class Itr implements Iterator { - int cursor;//Ԫص± - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public T next() { - if (cursor >= size) - throw new NoSuchElementException(); - return (T) elementData[cursor++]; - } - - @Override - public void remove() { - if (cursor >= size) - throw new NoSuchElementException(); - ArrayList.this.remove(cursor--); - } - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder("[ "); - for (Object ele : elementData) { - sb.append(ele).append(" "); - } - return sb.append("]").toString(); - } -} \ No newline at end of file diff --git a/group17/865797761/src/Collection/Iterable.java b/group17/865797761/src/Collection/Iterable.java deleted file mode 100644 index 04955e1b6e..0000000000 --- a/group17/865797761/src/Collection/Iterable.java +++ /dev/null @@ -1,6 +0,0 @@ -package Collection; - -// -public interface Iterable { - Iterator iterator(); -} \ No newline at end of file diff --git a/group17/865797761/src/Collection/Iterator.java b/group17/865797761/src/Collection/Iterator.java deleted file mode 100644 index 5ff4bbaf79..0000000000 --- a/group17/865797761/src/Collection/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package Collection; - -public interface Iterator { - public boolean hasNext(); - - public E next(); -} \ No newline at end of file diff --git a/group17/865797761/src/Collection/List.java b/group17/865797761/src/Collection/List.java deleted file mode 100644 index eeef249f88..0000000000 --- a/group17/865797761/src/Collection/List.java +++ /dev/null @@ -1,14 +0,0 @@ -package Collection; - -// -public interface List { - public void add(E o); - - public void add(int index, E o); - - public E get(int index); - - public E remove(int index); - - public int size(); -} \ No newline at end of file diff --git a/group17/865797761/src/Collection/MyArrayList.java b/group17/865797761/src/Collection/MyArrayList.java deleted file mode 100644 index 50e2c24d01..0000000000 --- a/group17/865797761/src/Collection/MyArrayList.java +++ /dev/null @@ -1,110 +0,0 @@ -package Collection; - -import java.util.Arrays; - -public class MyArrayList implements List, Iterable { - private Object[] elementData; - private static final int DEFAULT_SIZE = 10; - private int size; - - public MyArrayList() { - this(DEFAULT_SIZE); - } - - public MyArrayList(int initSize) { - if (initSize < 0) { - throw new IllegalArgumentException(initSize + " < 0"); - } - if (initSize == 0) { - elementData = new Object[DEFAULT_SIZE]; - } - else { - elementData = new Object[initSize]; - } - size = 0; - } - - public void add(E o) { - growIfNeed(); - elementData[size++] = o; - } - - public void add(int index, E o) { - if (index < 0 || index > size) { - throw new IllegalArgumentException("index:" + index); - } - growIfNeed(); - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - @SuppressWarnings("unchecked") - public E get(int index) { - rangeCheck(index); - return (E) elementData[index]; - } - - public E remove(int index) { - rangeCheck(index); - E target = get(index); - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - size--; - return target; - } - - public int size() { - return size; - } - - private void rangeCheck(int index) { - if (index >= size) { - throw new NoSuchElementException("index:" + index); - } - } - - private void growIfNeed() { - if (size == elementData.length) - grow(); - } - - private void grow() { - elementData = Arrays.copyOf(elementData, elementData.length * 2); - } - - @Override - public Iterator iterator() { - return new ArrayIterator<>(); - } - - private class ArrayIterator implements Iterator { - private int currentPos = 0; - - @Override - public boolean hasNext() { - return currentPos < size; - } - - @SuppressWarnings("unchecked") - @Override - public E next() { - rangeCheck(currentPos); - return (E) elementData[currentPos++]; - } - - } - - @Override - public String toString() { - return Arrays.toString(Arrays.copyOf(elementData, size)); - } - -} - -class NoSuchElementException extends RuntimeException { - - public NoSuchElementException(String string) { - super(string); - } - -} \ No newline at end of file diff --git a/group17/865797761/src/Collection/MyLinkedList.java b/group17/865797761/src/Collection/MyLinkedList.java deleted file mode 100644 index cf7495ab4e..0000000000 --- a/group17/865797761/src/Collection/MyLinkedList.java +++ /dev/null @@ -1,144 +0,0 @@ -package Collection; - -public class MyLinkedList implements List, Iterable { - private Node head; - private int size; - - public MyLinkedList() { - size = 0; - } - - public void add(E o) { - if (head == null) - addFirst(o); - else - addLast(o); - } - - public void addFirst(E o) { - Node oldFirst = head; - head = new Node<>(o, oldFirst); - size++; - } - - public void addLast(E o) { - if (head == null) { - addFirst(o); - } - else { - Node oldLast = movePtrTo(size - 1); - oldLast.next = new Node<>(o, null); - size++; - } - - } - - public void add(int index, E o) { - if (index > size || index < 0) { - throw new IllegalArgumentException("index:" + index); - } - if (index == 0) { - addFirst(o); - return; - } - Node temp = movePtrTo(index - 1); - Node oldNext = temp.next; - Node newNext = new Node<>(o, oldNext); - temp.next = newNext; - size++; - } - - public E remove(int index) { - rangeCheck(index); - E data; - if (index == 0) { - data = head.data; - head = head.next; - } - else { - Node pre = movePtrTo(index - 1); - Node target = pre.next; - pre.next = target.next; - data = target.data; - } - size--; - return data; - } - - public E get(int index) { - rangeCheck(index); - return movePtrTo(index).data; - } - - public int size() { - return size; - } - - private Node movePtrTo(int index) { - Node resultNode = head; - for (int i = 0; i < index; i++) { - resultNode = resultNode.next; - } - return resultNode; - } - - private void rangeCheck(int index) { - if (index >= size) { - throw new NoSuchElementException("index:" + index); - } - } - - @Override - public String toString() { - StringBuilder stringBuilder = new StringBuilder('['); - Node temp = head; - while (temp != null) { - stringBuilder.append(String.valueOf(temp.toString()) + ","); - temp = temp.next; - } - stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length()); - stringBuilder.append(']'); - return stringBuilder.toString(); - } - - private static class Node { - private T data; - private Node next; - - public Node(T data, Node next) { - this.data = data; - this.next = next; - } - - @Override - public String toString() { - return data.toString(); - } - } - - @Override - public Iterator iterator() { - return new ListIterator(); - } - - private class ListIterator implements Iterator { - Node currentNode; - - public ListIterator() { - currentNode = head; - } - - @Override - public boolean hasNext() { - return currentNode.next != null; - } - - @Override - public E next() { - Node temp = currentNode; - currentNode = currentNode.next; - return temp.data; - } - - } -} diff --git a/group17/865797761/src/Collection/MyQueue.java b/group17/865797761/src/Collection/MyQueue.java deleted file mode 100644 index f24535e6be..0000000000 --- a/group17/865797761/src/Collection/MyQueue.java +++ /dev/null @@ -1,34 +0,0 @@ -package Collection; - -public class MyQueue { - private MyLinkedList elementData = new MyLinkedList<>(); - - public void enQueue(T o) { - elementData.addLast(o); - } - - public T deQueue() { - if (!isEmpty()) { - return elementData.remove(0); - } - throw new QueueIsEmptyException(); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} - -class QueueIsEmptyException extends RuntimeException { - public QueueIsEmptyException() { - super(); - } - - public QueueIsEmptyException(String string) { - super(string); - } -} \ No newline at end of file diff --git a/group17/876385982/.classpath b/group17/876385982/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group17/876385982/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group17/876385982/.gitignore b/group17/876385982/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group17/876385982/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group17/876385982/.project b/group17/876385982/.project deleted file mode 100644 index 4062c6c28f..0000000000 --- a/group17/876385982/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 876385982 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group17/876385982/src/test/Test.java b/group17/876385982/src/test/Test.java deleted file mode 100644 index 5eeddf17a3..0000000000 --- a/group17/876385982/src/test/Test.java +++ /dev/null @@ -1,10 +0,0 @@ -package test; - -public class Test { - - public static void main(String[] args) { - // TODO Auto-generated method stub - System.out.println("Test!"); - } - -} diff --git "a/group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md" "b/group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md" deleted file mode 100644 index 36b44b4aa8..0000000000 --- "a/group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md" +++ /dev/null @@ -1,56 +0,0 @@ -# 写一篇文章介绍cpu, 内存, 磁盘, 指令以及他们之间的关系 - -## 须知 ---- - -交作业时请在QQ 号后面填上各自的文章链接, 比如: - -51075907 http://m.blog.csdn.net/article/details?id=57083764 - -## 文章 ---- - -1204187480 - -102228177 http://note.youdao.com/noteshare?id=74a51e7f93461dfb77c69a1cf4755624&sub=004F10FA5D2046ABAA060F19C0D2A18F - -876385982 http://www.totoro-fly.com/?p=59 - -785396327 - -1059107701 - -240094626 - -82427129 http://blog.csdn.net/walk_er/article/details/57406278 - -296910598 - -1264835468 http://www.jianshu.com/p/191d731ec00a - -516886559 - -1282579502 https://www.evernote.com/shard/s413/sh/3af5f6a4-a580-4a49-b63c-90f5b178aca4/7cf052e3789c862e38d6d6b3cce1ceed - -614982500 - -865797761 - -1540186032 http://blog.csdn.net/mpx_xb/article/details/56679603 - -176653813 - -116665530 - -51075907 http://m.blog.csdn.net/article/details?id=57083764 - -1158154002 - -345450234 - -919764878 - -1368331120 - -517970312 - diff --git a/group17/group17.md b/group17/group17.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group17/group17.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group18/1078285863/javaStudy/src/basicStruct/BasicStruct.java b/group18/1078285863/javaStudy/src/basicStruct/BasicStruct.java deleted file mode 100644 index 1461dedf79..0000000000 --- a/group18/1078285863/javaStudy/src/basicStruct/BasicStruct.java +++ /dev/null @@ -1,11 +0,0 @@ -package basicStruct; -// - -public class BasicStruct { - - public static void main(String[] args) { - // TODO Auto-generated method stub - - } - -} diff --git a/group18/1078285863/javaStudy/src/simpleArrayList/SimpleArrayList.java b/group18/1078285863/javaStudy/src/simpleArrayList/SimpleArrayList.java deleted file mode 100644 index 689fdccaf5..0000000000 --- a/group18/1078285863/javaStudy/src/simpleArrayList/SimpleArrayList.java +++ /dev/null @@ -1,140 +0,0 @@ -package simpleArrayList; - -import java.util.ArrayList; -import java.util.Arrays; - -public class SimpleArrayList { - //洢array - private Object[] elementData; - - //Ĭ - public static final int default_capacity = 10; - - //arrayԪصĸ - private int size; - - //ĬϹ캯 - public SimpleArrayList(){ - //СĬΪ10 - this.elementData = new Object[default_capacity]; - } - - //ι캯,ԼָС - public SimpleArrayList(int initialCapacity) { - if(initialCapacity <= 0){ - //Ч - throw new IllegalArgumentException("IllegalArgument Error"); - } - if(initialCapacity < default_capacity) - { - initialCapacity = default_capacity; - } - - this.elementData = new Object[initialCapacity]; - } - - //Ԫ - public boolean Add(int index,Object o) - { - if(index > size || index <0) - { - return false; - } - - //Ԫ - for (int i = 0; i < size; i++) { - if(o.equals(elementData[i])) - { - //ƶԪصĸ - int nMove = size -index -1; - if(nMove > 0){ - System.arraycopy(elementData, index, elementData, index+1,nMove); - elementData[index] = null; - } - else { - return false; - } - } - } - - return true; - } - - //Ԫ - //ֵ:Ƿӳɹ - public boolean Add(Object obj) - { - if (null == obj) { - throw new IllegalArgumentException("invalid Argument!"); - } - //array - ensureCapacityInternal(size + 1); - - //βԪ = ֵ - elementData[size++] = obj; - - return true; - } - - public void clear() - { - //elementDataԪָNULL,ʹջ - for (int i = 0; i < elementData.length; i++) { - elementData[i] = null; - } - - //arrayԪظ - size = 0; - } - - //ƳarrayеԪ - public boolean remove(Object obj) - { - //elementData,Ԫ - for (int index = 0; index < size; index++) { - if(obj.equals(elementData[index]))//Ƿ - { - fastRemove(index); - return true; - } - } - return false; - } - - private void fastRemove(int index) { - //ƶԪصĸ - int numMoved = size - index - 1; - if (numMoved > 0) - //indexԴǰƶ - System.arraycopy(elementData, index+1, elementData, index,numMoved); - elementData[--size] = null; - } - - //ԪܴС - public int size() { - return size; - } - - public Object get(int index) { - //У - if(index > size || index < 0) - throw new IllegalArgumentException(); - - return elementData[index]; - } - - //漰ݿռ,ʱȲ - private void ensureCapacityInternal(int minCapacity) { - //,ǰ޷ʱ,Ƿ񳬹˵ǰij - System.out.println("element data length is "+elementData.length); - if(minCapacity - elementData.length > 0) - { - //Ϊǰ1.5 - int oldCapacity = elementData.length; - int newCapacity = oldCapacity *3/2; - - //ڲ,elementDataԪؿ - elementData = Arrays.copyOf(elementData, newCapacity); - } - } -} diff --git a/group18/1078285863/javaStudy/src/simpleLinkedList/SimpleLinkedList.java b/group18/1078285863/javaStudy/src/simpleLinkedList/SimpleLinkedList.java deleted file mode 100644 index 0f11532723..0000000000 --- a/group18/1078285863/javaStudy/src/simpleLinkedList/SimpleLinkedList.java +++ /dev/null @@ -1,197 +0,0 @@ -package simpleLinkedList; - -import java.util.Iterator; -import java.util.LinkedList; - -import javax.sound.sampled.Line; - -public class SimpleLinkedList { - //LinkedList - private int size = 0; - private Node head = null; - private Node tail = null; - - private static class Node{ - Object data; - Node next;//ָһԪ - Node prev; //ָǰһԪ - } - - public void add(Object o){ - addLast(o); - } - public void add(int index , Object o){ - //ҵindexλõԪ - Node tmp = null; - for (int i = 0; i < index; i++) { - tmp = tmp.next; - } - - Node pre = tmp.prev; - Node next = tmp.next; - - if (null == pre) { - addFirst(o); //ͷ - } - else if(null == next){ - addLast(o); //β - } - else { - add(o); - } - } - public Object get(int index){ - if (index > size || index <0) { - throw new IllegalArgumentException(); - } - - Node temp = null; - for(int i=0;i queueList = new LinkedList(); - public void enQueue(Object o){ - queueList.add(o); - } - - public Object deQueue(){ - return queueList.removeFirst(); - } - - public boolean isEmpty(){ - return queueList.isEmpty(); - } - - public int size(){ - return queueList.size(); - } -} \ No newline at end of file diff --git a/group18/1078285863/javaStudy/src/simpleStack/SimpleStack.java b/group18/1078285863/javaStudy/src/simpleStack/SimpleStack.java deleted file mode 100644 index bfbea7b1db..0000000000 --- a/group18/1078285863/javaStudy/src/simpleStack/SimpleStack.java +++ /dev/null @@ -1,44 +0,0 @@ -package simpleStack; - -import java.util.ArrayList; - -public class SimpleStack { -private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - //ж϶ǷΪ - Object obj = peek(); - if(obj != null) - { - elementData.remove(obj); - return obj; - } - else { - return null; - } - } - - public Object peek(){ - if(elementData.isEmpty()){ - return null; - } - else { - int lastIndex = elementData.size() -1; - Object obj = elementData.get(lastIndex); - return obj; - } - - } - public boolean isEmpty(){ - boolean bEmpty = false; - bEmpty = elementData.isEmpty()?true:false; - return bEmpty; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group18/1159828430/20170219/.classpath b/group18/1159828430/20170219/.classpath deleted file mode 100644 index 2d7497573f..0000000000 --- a/group18/1159828430/20170219/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group18/1159828430/20170219/.gitignore b/group18/1159828430/20170219/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group18/1159828430/20170219/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group18/1159828430/20170219/.project b/group18/1159828430/20170219/.project deleted file mode 100644 index da66c3a498..0000000000 --- a/group18/1159828430/20170219/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 20170219 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group18/1159828430/20170219/src/com/coding/basic/ArrayList.java b/group18/1159828430/20170219/src/com/coding/basic/ArrayList.java deleted file mode 100644 index c8db730110..0000000000 --- a/group18/1159828430/20170219/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -/** - * @author Hipple - * @Time:2017年2月20日 下午8:53:31 - * @version 1.0 - */ -public class ArrayList implements List { - - //元素数量 - private int size = 0; - - //默认容量 - private final int defaultCapacity = 10; - - //存储元素的容器 - private static Object[] elementData; - - //无参构造器 - public ArrayList(){ - elementData = new Object[defaultCapacity]; - } - - //指定容量的构造器 - public ArrayList(int capacity){ - if (capacity < 0) { - //非法参数 - throw new IllegalArgumentException("Illegal Capacity: "+ capacity); - } - elementData = new Object[capacity]; - } - - //添加元素 - public boolean add(Object o){ - ensureCapacityInternal(size + 1); - elementData[size++] = o; - return true; - } - - //添加元素到指定位置 - public void add(int index, Object o){ - rangeCheck(index); - //将当前位置及后续元素后移一位 - ensureCapacityInternal(size + 1); - System.arraycopy(elementData, index, elementData, index+1, size-index); - elementData[index] = o; - size++; - } - - //根据下表获取值 - public Object get(int index){ - rangeCheck(index); - return elementData[index]; - } - - //删除元素 - public Object remove(int index){ - rangeCheck(index); - Object oldValue = elementData[index]; - int numMoved = size - index - 1; - if (numMoved > 0) { - //要删除的元素不是最后一个时,将当前元素及后续元素左移一位 - System.arraycopy(elementData, index+1, elementData, index, numMoved); - } - elementData[--size] = null;//自动回收 - return oldValue; - } - - //删除元素 - public boolean remove(Object o) { - // 由于ArrayList中允许存放null,因此下面通过两种情况来分别处理。 - if (o == null) { - for (int index = 0; index < size; index++){ - if (elementData[index] == null) { - fastRemove(index); - return true; - } - } - } else { - for (int index = 0; index < size; index++){ - if (o.equals(elementData[index])) { - fastRemove(index); - return true; - } - } - } - return false; - } - - //返回现有元素数量 - public int size(){ - return size; - } - - //是否为空 - public boolean isEmpty(){ - return size == 0; - } - - public Iterator iterator(){ - return null; - } - - //动态增加ArrayList大小 - private void ensureCapacityInternal(int minCapacity) { - //当前数组无法再存放时将数组长度增加至原长度的1.5倍 - if (minCapacity - elementData.length > 0) { - int newCapacity = (elementData.length * 3)/2; - elementData = Arrays.copyOf(elementData, newCapacity); - } - - } - - //检查是否下标越界 - private void rangeCheck(int index){ - if (index < 0 || index > this.size) { - throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); - } - } - - //删除元素,与remove的 差别就是没有下标检查 - private void fastRemove(int index) { - int numMoved = size - index - 1; - if (numMoved > 0){ - System.arraycopy(elementData, index + 1, elementData, index, numMoved); - } - elementData[--size] = null; - } - -} -class testArrayList{ - public static void main(String[] args) { - ArrayList arrayList = new ArrayList(); - for (int i = 0; i < 10; i++) { - arrayList.add(i+1); - } - arrayList.add(5,15); - arrayList.remove(11); - for (int i = 0; i < arrayList.size(); i++) { - System.out.println("value is "+arrayList.get(i)); - } - } -} diff --git a/group18/1159828430/20170219/src/com/coding/basic/Iterator.java b/group18/1159828430/20170219/src/com/coding/basic/Iterator.java deleted file mode 100644 index 0ce3f762ba..0000000000 --- a/group18/1159828430/20170219/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.coding.basic; -/** - * @author Hipple - * @Time:2017年2月20日 下午8:56:05 - * @version 1.0 - */ -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} \ No newline at end of file diff --git a/group18/1159828430/20170219/src/com/coding/basic/LinkedList.java b/group18/1159828430/20170219/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 433715d5ad..0000000000 --- a/group18/1159828430/20170219/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,238 +0,0 @@ -package com.coding.basic; - -import java.util.NoSuchElementException; - -/** - * @author Hipple - * @Time:2017年2月21日 下午8:00:21 - * @version 1.0 - */ -public class LinkedList implements List { - - //头结点 - private Node first; - - //尾结点 - private Node last; - - //元素数量 - private int size = 0; - - //无参构造器 - public LinkedList(){ - } - - public boolean add(Object o){ - linkLast(o); - return true; - } - - public void add(int index , Object o){ - checkPositionIndex(index); - if (index == size) { - linkLast(o); - } else { - linkBefore(o, node(index)); - } - } - - public Object remove(int index){ - checkElementIndex(index); - return unlink(node(index)); - } - - public Object get(int index){ - checkElementIndex(index); - return node(index).data; - } - - public void addFirst(Object o){ - linkFirst(o); - } - - public void addLast(Object o){ - linkLast(o); - } - - public Object removeFirst(){ - final Node f = first; - if (f == null) { - throw new NoSuchElementException(); - } - return unlinkFirst(f); - } - - public Object removeLast(){ - final Node l = last; - if (l == null) { - throw new NoSuchElementException(); - } - return unlinkLast(l); - } - - public int size(){ - return size; - } - - //检查是否为空 - public boolean isEmpty(){ - return size == 0; - } - - //获取头节点 - public Object getFirst() { - final Node f = first; - if (f == null) - throw new NoSuchElementException(); - return f.data; - } - - public Iterator iterator(){ - return null; - } - - //头部增加节点 - private void linkFirst(Object data){ - final Node f = first;//f存储老的头部节点待用 - final Node newNode = new Node(null, data, first);//后项指针指向first,前项指针null - first = newNode;//将新节点变为头部节点 - if (f == null) {//头节点为null则代表链表为空,那么新节点也是既是头结点也是尾结点 - last = newNode; - } else {//老的头部节点前项指针指向新节点 - f.previous = newNode; - } - size++; - } - - //尾部增加节点 - private void linkLast(Object data){ - final Node l = last;//l存储老的尾部节点待用 - final Node newNode = new Node(last, data, null);//前项指针指向last,后项指针null - last = newNode;//将新节点变为尾部节点 - if (l == null) {//尾节点为null则代表链表为空,那么新节点也是既是头结点也是尾结点 - first = newNode; - } else {//老的尾部节点后项指针指向新节点 - l.next = newNode; - } - size++; - } - - //指定index插入节点 - private void linkBefore(Object o, Node oldNode){ - final Node pred = oldNode.previous; - final Node newNode = new Node(pred, o, oldNode); - oldNode.previous = newNode;//旧节点前项指针指向新节点 - if (pred == null) {//pred为null代表oldNode为头节点 - first = newNode; - } else { - pred.next = newNode; - } - size++; - - } - - //删除头部节点并返回节点值 - private Object unlinkFirst(Node f){ - final Object element = f.data;//保存头节点的值 - final Node next = f.next; - f.data = null;//GC自动回收 - f.next = null; - first = next;//将头节点的下一节点变为头节点 - if (next == null) {//如果next为空,则代表f同时为尾节点,此时整个链表为空 - last = null; - } else { - next.previous = null; - } - size--; - return element; - } - - //删除尾部节点并返回该节点的值 - private Object unlinkLast(Node l){ - final Object element = l.data;//保存尾节点的值 - final Node prev = l.previous; - l.previous = null; - l.data = null;//GC自动回收 - last = prev;//将尾节点的上一节点变为尾节点 - if (prev == null) {//如果prev为空,则代表l同时为头节点,此时整个链表为空 - first = null; - } else { - prev.next = null; - } - size--; - return element; - } - - //删除指定节点 - private Object unlink(Node x){ - final Object element = x.data; - final Node prev = x.previous; - final Node next = x.next; - if (prev == null) {//prev为空代表要删除的是头节点 - unlinkFirst(x); - } else {//prev后项指针指向next - prev.next = next; - x.previous = null; - } - if (next == null) {//next为空代表要删除的是尾节点 - unlinkLast(x); - } else {//next前项指针指向prev - next.previous = prev; - x.next = null; - } - x.data = null; - size--; - return element; - } - - //查找结点 - private Node node(int index){ - if (index < (size>>1)) {//判断循环方向 - Node x = first; - for (int i = 0; i < index; i++) { - x = x.next; - } - return x; - } else { - Node x = last; - for (int i = size - 1; i > index; i--) { - x = x.previous; - } - return x; - } - } - - //检查下标是否合法 - private void checkElementIndex(int index){ - if (!isElementIndex(index)) { - throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); - } - } - - private void checkPositionIndex(int index){ - if (!isPositionIndex(index)) { - throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); - } - } - - //检查该参数是否为现有元素的索引。 - private boolean isElementIndex(int index) { - return index >= 0 && index < size; - } - - //检查参数是否是迭代器或添加操作的有效位置的索引 - private boolean isPositionIndex(int index) { - return index >= 0 && index <= size; - } - - private static class Node{ - Object data; - Node next; - Node previous; - Node(Node previous, Object data, Node next) { - this.data = data; - this.next = next; - this.previous = previous; - } - } -} \ No newline at end of file diff --git a/group18/1159828430/20170219/src/com/coding/basic/List.java b/group18/1159828430/20170219/src/com/coding/basic/List.java deleted file mode 100644 index 08e0f9e2d5..0000000000 --- a/group18/1159828430/20170219/src/com/coding/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding.basic; -/** - * @author Hipple - * @Time:2017年2月20日 下午8:52:08 - * @version 1.0 - */ -public interface List { - public boolean add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} \ No newline at end of file diff --git a/group18/1159828430/20170219/src/com/coding/basic/Queue.java b/group18/1159828430/20170219/src/com/coding/basic/Queue.java deleted file mode 100644 index e91779fdb2..0000000000 --- a/group18/1159828430/20170219/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coding.basic; -/** - * @author Hipple - * @Time:2017年2月23日 下午11:00:00 - * @version 1.0 - */ - -public class Queue { - private LinkedList elementData = new LinkedList(); - - public Queue(){ - - } - - public void enQueue(Object o){ - elementData.addLast(o); - } - - public Object deQueue(){ - elementData.getFirst(); - return null; - } - - public boolean isEmpty(){ - return elementData.isEmpty(); - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group18/1159828430/20170219/src/com/coding/basic/Stack.java b/group18/1159828430/20170219/src/com/coding/basic/Stack.java deleted file mode 100644 index ef5b637050..0000000000 --- a/group18/1159828430/20170219/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic; - -import java.util.EmptyStackException; - -/** - * @author Hipple - * @Time:2017年2月23日 下午10:59:39 - * @version 1.0 - */ -public class Stack { - private ArrayList elementData = new ArrayList(); - - public Stack(){ - - } - - //入栈 - public void push(Object o){ - elementData.add(o); - } - - //出栈 - public Object pop(){ - if (elementData.isEmpty()) { - throw new EmptyStackException(); - } - final Object o = peek(); - elementData.remove(o);//重新写根据对象remove - return o; - } - - public Object peek(){ - if (elementData.isEmpty()) { - throw new EmptyStackException(); - } - final Object o = elementData.get(elementData.size()-1); - return o; - } - public boolean isEmpty(){ - return size() == 0; - } - public int size(){ - return elementData.size(); - } -} -class TestStack { - public static void main(String[] args){ - Stack myStack=new Stack(); - myStack.push("a"); - myStack.push(2); - myStack.push("123"); - myStack.push("ahu"); - while(!myStack.isEmpty()){ - System.out.println(myStack.pop()); - } - } -} diff --git a/group18/1159828430/README.md b/group18/1159828430/README.md deleted file mode 100644 index 387ebebf6d..0000000000 --- a/group18/1159828430/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# 2017编程提高群 -这里是1159828430 大连—书生 的代码提交区 diff --git a/group18/744888802/dataStructure/pom.xml b/group18/744888802/dataStructure/pom.xml deleted file mode 100644 index 3b262d6184..0000000000 --- a/group18/744888802/dataStructure/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - - dataStructure - dataStructure - 1.0-SNAPSHOT - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.6 - 1.6 - - - - - - - \ No newline at end of file diff --git a/group18/744888802/dataStructure/src/main/java/com/coding/basic/ArrayList.java b/group18/744888802/dataStructure/src/main/java/com/coding/basic/ArrayList.java deleted file mode 100644 index 728edc3500..0000000000 --- a/group18/744888802/dataStructure/src/main/java/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - //每次增加的长度 - private Integer addArrayLength = 10; - //初始 数组长度 - private Object[] elementData = new Object[10]; - - public void add(Object o){ - if(size < elementData.length) - { - elementData[size]=o; - }else{ - //扩容数组 - grow(); - elementData[size] = 0; - } - size++; - - } - public void add(int index, Object o){ - if(index>size) - { - throw new RuntimeException("ArrayIndexOutOfBoundsException"); - } - - //截取索引开始到原数组结尾 组成一个新的数组 - Object [] tempObjs = Arrays.copyOfRange(elementData,index,elementData.length); - //覆盖原有索引位置的对象 - elementData[index] = o; - //数组扩容 - elementData = Arrays.copyOf(elementData,elementData.length+1); - - //将临时生成的数组合并回原数组 - System.arraycopy(tempObjs,0,elementData,index+1,tempObjs.length); - size++; - } - - - public Object get(int index){ - return elementData[index]; - } - - public Object remove(int index){ - - if(index>size) - { - throw new RuntimeException("ArrayIndexOutOfBoundsException"); - } - - Object o = elementData[index]; - - //截取索引开始到原数组结尾 组成一个新的数组 - Object [] tempObjs = Arrays.copyOfRange(elementData,index+1,elementData.length); - elementData = Arrays.copyOf(elementData,elementData.length-1); - //将临时生成的数组合并回原数组 - System.arraycopy(tempObjs,0,elementData,index,tempObjs.length); - size--; - - return o; - } - - public int size(){ - return this.size; - } - - public Iterator iterator(){ - ArratListIterator arratListIterator = new ArratListIterator(this); - - return arratListIterator; - } - - private void grow(){ - elementData = Arrays.copyOf(elementData,elementData.length+addArrayLength); - } - - class ArratListIterator implements Iterator{ - - ArrayList arrayList = new ArrayList(); - - int index = 0; - - ArratListIterator(ArrayList arrayList){ - - this.arrayList = arrayList; - index = arrayList.size; - } - - @Override - public boolean hasNext() { - if(index == 0) - { - return false; - } - return true; - } - - @Override - public Object next() { - return this.arrayList.get(--index); - } - } - -} diff --git a/group18/744888802/dataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java b/group18/744888802/dataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 8fc6e03297..0000000000 --- a/group18/744888802/dataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o) { - - BinaryTreeNode binaryTreeNode = new BinaryTreeNode(); - binaryTreeNode.data = o; - - add(this, binaryTreeNode); - return this; - } - - private void add(BinaryTreeNode binaryTreeNodeOld, BinaryTreeNode binaryTreeNodeNew) { - if (binaryTreeNodeOld.data == null) { - binaryTreeNodeOld.data = binaryTreeNodeNew.data; - return; - } - - - if (binaryTreeNodeOld.left == null) { - binaryTreeNodeOld.left = binaryTreeNodeNew; - return; - } - if (binaryTreeNodeOld.right == null) { - if (comparator(binaryTreeNodeNew, binaryTreeNodeOld.left)){ - binaryTreeNodeOld.right = binaryTreeNodeNew; - }else{ - binaryTreeNodeOld.right = binaryTreeNodeOld.left; - binaryTreeNodeOld.left = binaryTreeNodeNew; - } - return; - } - - if(comparator(binaryTreeNodeOld.left, binaryTreeNodeNew)) - { - add(binaryTreeNodeOld.left,binaryTreeNodeNew); - return; - } - - if(comparator(binaryTreeNodeOld.right, binaryTreeNodeNew)){ - add(binaryTreeNodeOld.right,binaryTreeNodeNew); - return; - }else{ - binaryTreeNodeNew.left = binaryTreeNodeOld.right; - binaryTreeNodeOld.right = binaryTreeNodeNew; - } - - - - - } - - private boolean comparator(BinaryTreeNode binaryTreeNode1, BinaryTreeNode binaryTreeNode2) { - if ((Integer) binaryTreeNode1.getData() > (Integer) binaryTreeNode2.getData()) { - return true; - } - return false; - } - -} diff --git a/group18/744888802/dataStructure/src/main/java/com/coding/basic/Iterator.java b/group18/744888802/dataStructure/src/main/java/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group18/744888802/dataStructure/src/main/java/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group18/744888802/dataStructure/src/main/java/com/coding/basic/LinkedList.java b/group18/744888802/dataStructure/src/main/java/com/coding/basic/LinkedList.java deleted file mode 100644 index 098246a4bb..0000000000 --- a/group18/744888802/dataStructure/src/main/java/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private Node last; - - private int size = 0; - - public void add(Object o){ - addLast(o); - - } - public void add(int index , Object o){ - - Node node = new Node(); - node.data = o; - if(size == 0) - { - throw new NullPointerException(" linked list is null"); - } - if(index == 0) - { - node.next=head; - head = node; - } - Node nodeNow = head; - for(int i=1;i=size) - { - throw new IndexOutOfBoundsException(" this index too big by this list"); - } - - Node nodeNow = head; - for(int i=0;i=size) - { - throw new IndexOutOfBoundsException(" this index too big by this list"); - } - if(size == 0) - { - throw new NullPointerException("linked list is null"); - } - if(index == 0) - { - if(size == 1) - { - size = 0; - return head.data; - } - Object o = head.data; - head.next = null; - - head = head.next; - return o; - - } - Node result = null; - - - Node beforeNode = head; - Node nextNode = head.next; - for(int i=1;i elementData.length){ - elementData = Arrays.copyOf(elementData, elementData.length*2); - } - elementData[size-1] = o; - - } - public void add(int index, Object o){ - Object[] tmp = new Object[elementData.length]; - - if(index<0 || index >elementData.length-1){ - return; - } - if(++size > elementData.length){ - elementData = Arrays.copyOf(elementData, elementData.length*2); - tmp = new Object[elementData.length]; - } - System.arraycopy(elementData, 0, tmp, 0, index); - System.arraycopy(elementData, index, tmp, index+1, size-index); - tmp[index] = o; - elementData=tmp; - - } - - public Object get(int index){ - if(index<0 || index >elementData.length-1){ - return null; - } - return elementData[index]; - } - - public Object remove(int index){ - Object o=null; - o = elementData[index]; - if(--size%5 == 0){ - elementData = Arrays.copyOf(elementData, elementData.length/2); - }else if(index == size-1){ - elementData[index] = null; - }else if(index == size-1){ - - System.arraycopy(elementData, index+1, elementData, index, size-index-1); - } - - return o; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayIterator(this); - } - -} - - - - - - - - - - - - - - - - - - - diff --git a/group18/784140710/week01/src/com/coding/basic/BinaryTree.java b/group18/784140710/week01/src/com/coding/basic/BinaryTree.java deleted file mode 100644 index 01b7a90a43..0000000000 --- a/group18/784140710/week01/src/com/coding/basic/BinaryTree.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.coding.basic; - - -public class BinaryTree { - - private BinaryTreeNode root; - - public void insert(Integer o){ - BinaryTreeNode node = new BinaryTreeNode(o); - if(root == null){ - root = node; - }else{ - BinaryTreeNode current = root; - BinaryTreeNode parent; - - while(true){ - parent = current; - if(onode.getData()){ - node = node.getRight(); - }else{ - return node; - } - } - - return null; - } - - -} - - - - - - - - - - - - diff --git a/group18/784140710/week01/src/com/coding/basic/BinaryTreeNode.java b/group18/784140710/week01/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 15cbb94d28..0000000000 --- a/group18/784140710/week01/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.coding.basic; - - -public class BinaryTreeNode { - - private Integer data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(Integer data){ - this.data = data; - } - - public Integer getData() { - return data; - } - public void setData(Integer data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/group18/784140710/week01/src/com/coding/basic/Iterator.java b/group18/784140710/week01/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group18/784140710/week01/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group18/784140710/week01/src/com/coding/basic/LinkedList.java b/group18/784140710/week01/src/com/coding/basic/LinkedList.java deleted file mode 100644 index eb0b6fbeae..0000000000 --- a/group18/784140710/week01/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private int size = 0; - - public void add(Object o){ - ++size; - Node node = new Node(o); - - if(head == null){ - head = node; - return; - } - Node tmp = new Node(o); - tmp = head; - while(tmp.next!=null){ - tmp = tmp.next; - } - tmp.next = node; - } - public void add(int index , Object o){ - ++size; - Node node = new Node(o); - Node tmp = new Node(o); - tmp = head; - int i =0; - while(tmp.next!=null && i - - - - - - - diff --git a/group18/935542673/Coding/.gitignore b/group18/935542673/Coding/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group18/935542673/Coding/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group18/935542673/Coding/.project b/group18/935542673/Coding/.project deleted file mode 100644 index 8b11575db2..0000000000 --- a/group18/935542673/Coding/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - Coding - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyArrayListTest.java b/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyArrayListTest.java deleted file mode 100644 index f8bb390595..0000000000 --- a/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyArrayListTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.ikook.basic_data_structure; - -import static org.junit.Assert.*; - -import java.util.Date; - -import org.junit.Before; -import org.junit.Test; - -/** - * 此单元测试只测试了正常情况,一些异常情况没有测试。 - * @author ikook - */ -public class MyArrayListTest { - - private MyArrayList list; - - @Before - public void setUp() { - list = new MyArrayList(); - list.add("111"); - list.add("222"); - list.add(33); - list.add("444"); - list.add(new Date()); - list.add("666"); - list.add("777"); - list.add("888"); - list.add("999"); - } - - @Test - public void testAdd() { - //测试add(Object obj)方法 - list.add(100); - assertEquals(10, list.size()); - - //测试add(int index, Object obj)方法 - list.add(3, 444); - assertEquals(444, list.get(3)); - - assertEquals("444", list.get(4)); - assertEquals(11, list.size()); - } - - @Test - public void testIsEmpty() { - - assertEquals(false, list.isEmpty()); - } - - @Test - public void testGet() { - assertEquals("111", list.get(0)); - assertEquals(new Date(), list.get(4)); - } - - @Test - public void testRemove() { - - // 测试remove(int index)方法 - assertEquals(33, list.remove(2)); - assertEquals("444", list.get(2)); - - // 测试remove(Object obj)方法 - assertEquals(true, list.remove("222")); - assertEquals("444", list.get(1)); - } - - @Test - public void testSet() { - assertEquals(33, list.set(2, "333")); - assertEquals("333", list.get(2)); - } - - @Test - public void testIterator() { - int i = 0; - for(MyIterator iter = list.iterator(); iter.hasNext();) { - Object str = (Object) iter.next(); - assertEquals(list.get(i++), str); - } - - int j = list.size(); - for(MyIterator iter = list.iterator(); iter.hasNext();) { - iter.next(); - iter.remove(); - assertEquals( --j , list.size()); - } - } - -} diff --git a/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyBinarySearchTreeTest.java b/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyBinarySearchTreeTest.java deleted file mode 100644 index 59e1ad3797..0000000000 --- a/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyBinarySearchTreeTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.ikook.basic_data_structure; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -/** - * 此单元测试只测试了正常情况,一些异常情况没有测试。 - * @author ikook - */ -public class MyBinarySearchTreeTest { - - private MyBinarySearchTree tree; - - @Before - public void setUp() { - tree = new MyBinarySearchTree(); - - tree.insert(3); - tree.insert(8); - } - - @SuppressWarnings("static-access") - @Test - public void testInsert() { - tree.insert(1); - tree.insert(4); - tree.insert(6); - tree.insert(2); - tree.insert(10); - tree.insert(9); - - assertEquals("1 2 3 4 6 8 9 10 ", tree.inorderTraverse(tree.root)); - } - - @Test - public void testFind() { - tree.insert(1); - tree.insert(4); - tree.insert(6); - tree.insert(2); - tree.insert(10); - tree.insert(9); - - assertEquals(false, tree.find(5)); - assertEquals(true, tree.find(10)); - } - - @SuppressWarnings("static-access") - @Test - public void testDelete() { - tree.insert(1); - tree.insert(4); - tree.insert(6); - tree.insert(2); - tree.insert(10); - tree.insert(9); - - assertEquals(false, tree.delete(5)); - assertEquals(true, tree.delete(4)); - assertEquals("1 2 3 6 8 9 10 ", tree.inorderTraverse(tree.root)); - } -} diff --git a/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyLinkedListTest.java b/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyLinkedListTest.java deleted file mode 100644 index d479408183..0000000000 --- a/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyLinkedListTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.ikook.basic_data_structure; - -import static org.junit.Assert.*; - -import java.util.Date; - -import org.junit.Before; -import org.junit.Test; - -/** - * 此单元测试只测试了正常情况,一些异常情况没有测试。 - * @author ikook - */ -public class MyLinkedListTest { - - private MyLinkedList list; - - @Before - public void setUp() { - list = new MyLinkedList(); - list.add("111"); - list.add(222); - list.add("333"); - } - - @Test - public void testAddFirst() { - list.addFirst(444); - assertEquals(4, list.size()); - assertEquals(444, list.get(0)); - assertEquals(444, list.getFirst()); - - } - - @Test - public void testAddLast() { - list.addLast("444"); - assertEquals(4, list.size()); - assertEquals("444", list.getLast()); - assertEquals("444", list.get(3)); - } - - @Test - public void testAddObject() { - list.add(new Date()); - assertEquals(new Date(), list.get(3)); - } - - @Test - public void testAddIntObject() { - list.add(1, "222"); - assertEquals("222", list.get(1)); - assertEquals(4, list.size()); - } - - @Test - public void testSize() { - assertEquals(3, list.size()); - } - - @Test - public void testIsEmpty() { - assertEquals(false, list.isEmpty()); - - MyLinkedList list = new MyLinkedList(); - assertEquals(true, list.isEmpty()); - } - - @Test - public void testGetFirst() { - assertEquals("111", list.getFirst()); - } - - @Test - public void testGetLast() { - assertEquals("333", list.getLast()); - } - - @Test - public void testGet() { - assertEquals(222, list.get(1)); - } - - @Test - public void testSet() { - assertEquals(222, list.set(1, new Date())); - assertEquals(new Date(), list.get(1)); - } - - @Test - public void testRemoveFirst() { - assertEquals("111", list.removeFirst()); - assertEquals(222, list.getFirst()); - } - - @Test - public void testRemoveLast() { - assertEquals("333", list.removeLast()); - assertEquals(222, list.getLast()); - } - - @Test - public void testRemoveObject() { - assertEquals(true, list.remove((Integer) 222)); - assertEquals("333", list.get(1)); - } - - @Test - public void testRemoveInt() { - assertEquals(222, list.remove(1)); - assertEquals("333", list.get(1)); - - } - - @Test - public void testIterator() { - int i = 0; - for(MyIterator iter = list.iterator(); iter.hasNext();) { - Object str = (Object) iter.next(); - assertEquals(list.get(i++), str); - } - - int j = list.size(); - for(MyIterator iter = list.iterator(); iter.hasNext();) { - iter.next(); - iter.remove(); - assertEquals( --j , list.size()); - } - } - -} diff --git a/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyQueueTest.java b/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyQueueTest.java deleted file mode 100644 index 8fb8ba825f..0000000000 --- a/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyQueueTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.ikook.basic_data_structure; - -import static org.junit.Assert.*; - -import java.util.Date; - -import org.junit.Before; -import org.junit.Test; - -/** - * 此单元测试只测试了正常情况,一些异常情况没有测试。 - * @author ikook - */ -public class MyQueueTest { - - private MyQueue queue; - - @Before - public void setUp() { - queue = new MyQueue(); - - queue.enQueue(111); - queue.enQueue("222"); - queue.enQueue(new Date()); - } - - @Test - public void testEnQueue() { - queue.enQueue(444); - assertEquals(4, queue.size()); - } - - @Test - public void testDeQueue() { - assertEquals(111, queue.deQueue()); - } - - @Test - public void testSize() { - assertEquals(3, queue.size()); - - MyQueue queue = new MyQueue(); - assertEquals(0, queue.size()); - } - - @Test - public void testIsEmpty() { - assertEquals(false, queue.isEmpty()); - - MyQueue queue = new MyQueue(); - assertEquals(true, queue.isEmpty()); - } - -} diff --git a/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyStackTest.java b/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyStackTest.java deleted file mode 100644 index fe1084e343..0000000000 --- a/group18/935542673/Coding/junit/com/ikook/basic_data_structure/MyStackTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ikook.basic_data_structure; - -import static org.junit.Assert.*; - -import java.util.Date; - -import org.junit.Before; -import org.junit.Test; - -/** - * 此单元测试只测试了正常情况,一些异常情况没有测试。 - * @author ikook - */ -public class MyStackTest { - - private MyStack stack; - - @Before - public void setUp() { - stack = new MyStack(); - stack.push(111); - stack.push("222"); - stack.push(333); - stack.push(new Date()); - stack.push("555"); - } - - @Test - public void testPush() { - stack.push(93554); - assertEquals(6, stack.size()); - } - - @Test - public void testPop() { - assertEquals("555", stack.pop()); - assertEquals(4, stack.size()); - - assertEquals(new Date(), stack.pop()); - } - - @Test - public void testGetTop() { - assertEquals("555", stack.getTop()); - } - - @Test - public void testIsEmpty() { - assertEquals(false, stack.isEmpty()); - - MyStack stack = new MyStack(); - assertEquals(true, stack.isEmpty()); - } - -} diff --git a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyArrayList.java b/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyArrayList.java deleted file mode 100644 index 6891a76879..0000000000 --- a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyArrayList.java +++ /dev/null @@ -1,215 +0,0 @@ -package com.ikook.basic_data_structure; - -import java.util.ConcurrentModificationException; -import java.util.NoSuchElementException; - -/** - * @author ikook; QQ号码: 935542673 - */ -public class MyArrayList implements MyList{ - - private Object[] elementData; - - private int size; - - /** - * 使Object[]的长度默认为10; - */ - public MyArrayList() { - this(10); - } - - /** - * 在构造函数中初始化集合的长度 - * @param initialCapacity - */ - public MyArrayList(int initialCapacity) { - if(initialCapacity < 0) { - try { - throw new Exception(); - } catch (Exception e) { - e.printStackTrace(); - } - } - this.elementData = new Object[initialCapacity]; - } - - /** - * 在集合中添加元素 - * @param obj - */ - public void add(Object obj) { - - ensureCapacity(); - elementData[size++] = obj; - - } - - /** - * 添加元素到集合的指定位置 - * @param index - * @param obj - */ - public void add(int index, Object obj) { - rangeCheck(index); - ensureCapacity(); - - System.arraycopy(elementData, index, elementData, index + 1, size-index); - elementData[index] = obj; - size++; - } - - /** - * 返回集合的长度 - * @return - */ - public int size() { - return size; - } - - /** - * 判断集合是非为空 - * @return - */ - public boolean isEmpty() { - return size == 0; - } - - /** - * 获取集合指定位置的元素 - * @param index - * @return - */ - public Object get(int index) { - rangeCheck(index); - return elementData[index]; - } - - /** - * 删除指定位置的对象 - * @param index - */ - public Object remove(int index) { - - rangeCheck(index); - - Object oldValue = elementData[index]; - - int numMoved = size - index - 1; - if (numMoved > 0){ - System.arraycopy(elementData, index+1, elementData, index, - numMoved); - } - elementData[--size] = null; - - return oldValue; - } - - /** - * 删除指定的对象(Object 对象) - * @param obj - */ - public boolean remove(Object obj){ - for(int i = 0; i < size; i++) { - if(get(i).equals(obj)) { - remove(i); - return true; - } - } - return false; - } - - /** - * 更改集合中指定位置的元素,并返回原来的对象 - * @param index - * @param obj - * @return - */ - public Object set(int index, Object obj) { - rangeCheck(index); - - Object oldValue = elementData[index]; - elementData[index] = obj; - - return oldValue; - } - - /** - * 集合扩容封装类 - */ - private void ensureCapacity() { - if(size == elementData.length) { - Object[] newArray = new Object[size * 2 + 1]; - System.arraycopy(elementData, 0, newArray, 0, elementData.length); - elementData = newArray; - } - } - - /** - * 判断集合范围是否越界的封装类 - * @param index - */ - private void rangeCheck(int index) { - if(index < 0 || index >= size) { - try { - throw new Exception("索引异常"); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - /** - * 返回一个迭代器的实现 - * @return - */ - public MyIterator iterator() { - return new Iter(); - } - - /** - * 迭代器的实现类 - * @author ikook - */ - private class Iter implements MyIterator { - - int cursor; // 返回下一个元素的索引 - int lastRet = -1; // 返回最后一个元素的索引(始终指向刚遍历完的元素),如果没有元素了,则为 -1 - - @Override - public boolean hasNext() { - return cursor != size; // cursor 等于 size 则集合遍历完。 - } - - @Override - public Object next() { - - try{ - int i = cursor; - Object next = get(i); - lastRet = i; - cursor = i + 1; - return next; - } catch (IndexOutOfBoundsException e) { - throw new NoSuchElementException("没有找到指定的元素, 迭代器遍历失败"); - } - - } - - @Override - public void remove() { - if (lastRet < 0) { - throw new IllegalStateException("非法状态异常,删除失败"); - } - - try{ - MyArrayList.this.remove(lastRet); - cursor = lastRet; - lastRet = -1; - } catch (IndexOutOfBoundsException e) { - throw new ConcurrentModificationException("竞争者改变异常,删除失败"); - } - } - - } -} \ No newline at end of file diff --git a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyBinarySearchTree.java b/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyBinarySearchTree.java deleted file mode 100644 index d30be18a7a..0000000000 --- a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyBinarySearchTree.java +++ /dev/null @@ -1,200 +0,0 @@ -package com.ikook.basic_data_structure; - -/** - * @author ikook; QQ号码: 935542673 - */ -public class MyBinarySearchTree { - - public static Node root; - - public MyBinarySearchTree() { - root = null; - } - - /** - * 插入操作 - * @param id - */ - public void insert(int id) { - Node newNode = new Node(id); - if (root == null) { - root = newNode; - return; - } - Node current = root; //当前节点 - Node parent = null; //父节点,即上一个节点 - while (true) { - parent = current; - if (id < current.data) { - current = current.left; - if (current == null) { - parent.left = newNode; - return; - } - } else { - current = current.right; - if (current == null) { - parent.right = newNode; - return; - } - } - } - } - - /** - * 查找操作 - * @param id - * @return - */ - public boolean find(int id) { - Node current = root; - while (current != null) { - if (current.data == id) { - return true; - } else if (current.data > id) { - current = current.left; - } else { - current = current.right; - } - } - return false; - } - - /** - * 删除操作 - * @param id - * @return - */ - public boolean delete(int id) { - if (root == null) // 根节点为空,则树为空,返回false。 - return false; - else { - Node parent = root; - Node current = root; - boolean isLeftChild = false; // 是否在左子树,默认为false:即不在。 - // 找到删除点以及是否在左子树 - while (current.data != id) { - parent = current; - if (current.data > id) { - isLeftChild = true; - current = current.left; - } else { - isLeftChild = false; - current = current.right; - } - if (current == null) { - return false; - } - } - - // 如果删除节点的左节点为空,右节点也为空。 - if (current.left == null && current.right == null) { - if (current == root) { - root = null; - } - if (isLeftChild == true) { - parent.left = null; - } else { - parent.right = null; - } - } - // 如果删除节点只有一个子节点,则该节点为左节点或者右节点。 - else if (current.right == null) { - if (current == root) { - root = current.left; - } else if (isLeftChild) { - parent.left = current.left; - } else { - parent.right = current.left; - } - } else if (current.left == null) { - if (current == root) { - root = current.right; - } else if (isLeftChild) { - parent.left = current.right; - } else { - parent.right = current.right; - } - } - // 如果删除节点左节点右节点都不为空。 - else if (current.left != null && current.right != null) { - - // 寻找删除节点的后继者:这说明已经发现最小元素在右子树中 - Node successor = getSuccessor(current); - if (current == root) { - root = successor; - } else if (isLeftChild) { - parent.left = successor; - } else { - parent.right = successor; - } - successor.left = current.left; - } - return true; - } - } - - /** - * 获取删除节点的后继者:删除节点的后继者是在其右节点树中最小的节点 - * @param deleleNode - * @return - */ - private Node getSuccessor(Node deleleNode) { - Node successsor = null; - Node successsorParent = null; - Node current = deleleNode.right; - while (current != null) { - successsorParent = successsor; - successsor = current; - current = current.left; - } - // 检查后继者是否有右节点 - // 如果有右节点树,则将其添加到successorParent(后继者父节点)的左节点。 - if (successsor != deleleNode.right) { - successsorParent.left = successsor.right; - successsor.right = deleleNode.right; - } - return successsor; - } - - /** - * 显示二叉树 - * @param root - * @param sb - */ - private void display(Node root, StringBuilder sb) { - if (root != null) { - display(root.left, sb); - sb.append(root.data + " "); - display(root.right, sb); - } - } - - /** - * 中序遍历:左子树->根节点->右子树 - * @param root - * @return - */ - public String inorderTraverse(Node root) { - StringBuilder sb = new StringBuilder(); - this.display(root, sb); - return sb.toString(); - } -} - -/** - * 用于表示节点 - * @author ikook - */ -class Node { - - int data; - Node left; - Node right; - - public Node(int data) { - this.data = data; - left = null; - right = null; - } -} \ No newline at end of file diff --git a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyIterator.java b/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyIterator.java deleted file mode 100644 index 1fe7a69fcb..0000000000 --- a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyIterator.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ikook.basic_data_structure; - -/** - * @author ikook QQ号码: 935542673 - */ -public interface MyIterator { - - public boolean hasNext(); // 判断是否有元素没有被遍历 - - public Object next(); // 返回游标当前位置的元素并将游标移动到下一个位置 - - public void remove(); // 删除游标左边的元素,在执行完 next 之后该操作只能执行一次 - -} diff --git a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyLinkedList.java b/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyLinkedList.java deleted file mode 100644 index a255657911..0000000000 --- a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyLinkedList.java +++ /dev/null @@ -1,359 +0,0 @@ -package com.ikook.basic_data_structure; - -import java.util.NoSuchElementException; - -/** - * @author ikook; QQ号码: 935542673 - */ -public class MyLinkedList implements MyList{ - - private Node first; - private Node last; - private int size; - - /** - * 在链表的头部插入新的元素 - * @param obj - */ - public void addFirst(Object obj) { - final Node f = first; - final Node newNode = new Node(null, obj, f); - first = newNode; - if (f == null) - last = newNode; - else - f.previous = newNode; - size++; - } - - /** - * 在链表尾部插入新的元素 - * @param obj - */ - public void addLast(Object obj) { - final Node l = last; - final Node newNode = new Node(l, obj, null); - last = newNode; - if (l == null) - first = newNode; - else - l.next = newNode; - size++; - } - - /** - * 在链表中插入新的元素 - * @param obj - */ - public void add(Object obj) { - addLast(obj); - } - - /** - * 在指定位置插入新的元素 - * @param index - * @param obj - */ - public void add(int index, Object obj) { - if (!(index >= 0 && index <= size)) { - throw new IndexOutOfBoundsException("索引位置越界"); - } - - if (index == size) { - addLast(obj); - } else { - Node temp = node(index); - final Node pred = temp.previous; - final Node newNode = new Node(pred, obj, temp); - temp.previous = newNode; - if (pred == null) - first = newNode; - else - pred.next = newNode; - size++; - } - } - - /** - * 返回集合的size。 - * @return - */ - public int size() { - return size; - } - - /** - * 判断集合是非为空 - * @return - */ - public boolean isEmpty() { - return size == 0; - } - - /** - * 获取链表头部的元素 - * @return - */ - public Object getFirst() { - final Node f = first; - if (f == null) { - throw new NoSuchElementException("没有找到指定的元素"); - } - - return f.data; - } - - /** - * 获取链表尾部的元素 - * @return - */ - public Object getLast() { - final Node l = last; - if (l == null) { - throw new NoSuchElementException("没有找到指定的元素"); - } - - return l.data; - } - - /** - * 获取指定位置的元素 - * @param index - * @return - */ - public Object get(int index) { - rangeCheckElementIndex(index); - return node(index).data; - } - - /** - * 更改指定位置的元素 - * @param index - * @param element - * @return - */ - public Object set(int index, Object element) { - rangeCheckElementIndex(index); - Node temp = node(index); - Object oldValue = temp.data; - temp.data = element; - return oldValue; - } - - - /** - * 删除链表头部的元素 - * @return - */ - public Object removeFirst() { - final Node f = first; - if (f == null) { - throw new NoSuchElementException("没有找到指定的元素"); - } - - final Object element = f.data; - final Node next = f.next; - f.data = null; - f.next = null; - first = next; - if (next == null) { - last = null; - } else { - next.previous = null; - } - size--; - - return element; - } - - /** - * 删除链表尾部的元素 - * @return - */ - public Object removeLast() { - final Node l = last; - if (l == null){ - throw new NoSuchElementException("没有找到指定的元素"); - } - - final Object element = l.data; - final Node prev = l.previous; - l.data = null; - l.previous = null; - last = prev; - if (prev == null) { - first = null; - } else { - prev.next = null; - } - size--; - - return element; - } - - /** - * 删除指定元素 - * @param o - * @return - */ - public boolean remove(Object o) { - if (o == null) { - for (Node temp = first; temp != null; temp = temp.next) { - if (temp.data == null) { - deleteElement(temp); - return true; - } - } - } else { - for (Node temp = first; temp != null; temp = temp.next) { - if (o.equals(temp.data)) { - deleteElement(temp); - return true; - } - } - } - return false; - } - - /** - * 删除指定位置的元素 - * @param index - * @return - */ - public Object remove(int index) { - rangeCheckElementIndex(index); - return deleteElement(node(index)); - } - - /** - * 删除指定节点元素 - * @param temp - * @return - */ - private Object deleteElement(Node temp) { - final Object element = temp.data; - final Node next = temp.next; - final Node prev = temp.previous; - - if (prev == null) { - first = next; - } else { - prev.next = next; - temp.previous = null; - } - - if (next == null) { - last = prev; - } else { - next.previous = prev; - temp.next = null; - } - - temp.data = null; - size--; - - return element; - } - - /** - * 检查索引元素的范围 - * @param index - */ - private void rangeCheckElementIndex(int index) { - if (!(index >= 0 && index < size)) { - throw new IndexOutOfBoundsException("索引越界"); - } - } - - /** - * 返回指定索引位置的节点 - * @param index - * @return - */ - Node node(int index) { - if (index < (size >> 1)) { - Node temp = first; - for (int i = 0; i < index; i++) - temp = temp.next; - return temp; - } else { - Node temp = last; - for (int i = size - 1; i > index; i--) - temp = temp.previous; - return temp; - } - } - - /** - * 用于表示一个节点 - * @author ikook - */ - private static class Node { - Node previous; // 上一个节点 - Object data; - Node next; // 下一个节点 - - public Node(Node previous, Object data, Node next) { - this.previous = previous; - this.data = data; - this.next = next; - } - } - - /** - * 返回一个迭代器的实现类 - * @return - */ - public MyIterator iterator() { - return new LinkIter(); - } - - /** - * 迭代器的实现类 - * @author ikook - */ - private class LinkIter implements MyIterator { - private Node lastRet; //始终指向刚遍历完的节点 - private Node next; // 当前指向的节点 - private int nextIndex; //当前节点的索引值 - - LinkIter () { - next = node(0); - nextIndex = 0; - } - - @Override - public boolean hasNext() { - return nextIndex < size; - } - - @Override - public Object next() { - if(!hasNext()) { - throw new NoSuchElementException("没有找到指定的元素, 迭代器遍历失败"); - } - - lastRet = next; - next = next.next; - nextIndex++; - return lastRet.data; - } - - @Override - public void remove() { - if(lastRet == null) { - throw new IllegalStateException("非法状态异常,删除失败"); - } - - Node lastNext = lastRet.next; - deleteElement(lastRet); - if(next == lastRet) { - next = lastNext; - } else { - nextIndex--; - } - lastRet = null; - } - - } -} diff --git a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyList.java b/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyList.java deleted file mode 100644 index f1fa613d0e..0000000000 --- a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyList.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ikook.basic_data_structure; - -/** - * @author ikook QQ号码: 935542673 - */ -public interface MyList { - - public void add(Object o); - public void add(int index, Object o); - - public int size(); - - public boolean isEmpty(); - - public Object get(int index); - - public Object remove(int index); - public boolean remove(Object obj); - - public Object set(int index, Object obj); - -} diff --git a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyQueue.java b/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyQueue.java deleted file mode 100644 index 824d7579c6..0000000000 --- a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyQueue.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ikook.basic_data_structure; - -/** - * @author ikook; QQ号码: 935542673 - */ -public class MyQueue { - - private MyLinkedList queue = new MyLinkedList(); - - /** - * 入队操作 - * @param obj - */ - public void enQueue(Object obj) { - queue.addLast(obj); - } - - /** - * 出队操作 - * @return - */ - public Object deQueue() { - return queue.removeFirst(); - } - - /** - * 队列的长度 - * @return - */ - public int size() { - return queue.size(); - } - - /** - * 队列是否为空 - * @return - */ - public boolean isEmpty() { - return queue.isEmpty(); - } - -} diff --git a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyStack.java b/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyStack.java deleted file mode 100644 index 0ad6c05910..0000000000 --- a/group18/935542673/Coding/src/com/ikook/basic_data_structure/MyStack.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.ikook.basic_data_structure; - -/** - * @author ikook; QQ号码: 935542673 - */ -public class MyStack { - - private MyArrayList elementDate = new MyArrayList(); - - /** - * 入栈操作 - * @param obj - */ - public void push(Object obj) { - elementDate.add(obj); - } - - /** - * 出栈操作 - * @return - */ - public Object pop() { - emptyExce(); - return elementDate.remove(topIndex()); - } - - /** - * 获取栈顶元素 - * @return - */ - public Object getTop() { - emptyExce(); - return elementDate.get(topIndex()); - } - - /** - * 判断栈是否为空 - * @return - */ - public boolean isEmpty() { - return size() == 0; - } - - /** - * 获取栈的深度 - * @return - */ - public int size() { - return elementDate.size(); - } - - /** - * 栈顶元素所在索引封装类 - * @return - */ - private int topIndex() { - return size() - 1; - } - - /** - * 队列为空异常处理封装类 - */ - private void emptyExce() { - if (isEmpty()) { - try { - throw new Exception("队列为空"); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - -} diff --git a/group18/935542673/Coding/src/com/ikook/basic_data_structure/README.md b/group18/935542673/Coding/src/com/ikook/basic_data_structure/README.md deleted file mode 100644 index a565fb7148..0000000000 --- a/group18/935542673/Coding/src/com/ikook/basic_data_structure/README.md +++ /dev/null @@ -1,83 +0,0 @@ -## 2017编程提高社群作业:实现基本的数据结构(2017.2.19) - -1. 实现了ArrayList、LinkedList、Queue(依靠LinkedList实现)、Stack(依靠ArrayList实现) - - 1.1 ArrayList实现了一下方法: - - ``` - (1)add(Object): 添加元素到集合; - (2)add(int, Object): 添加元素到集合的指定位置; - (3)size(): 返回集合的大小,类型为 int; - (4)isEmpty(): 判断集合是否为空,类型为 boolean; - (5)get(int): 获取集合指定位置的元素; - (6)remove(int): 删除指定位置的对象; - (7)remove(Object): 删除指定的对象; - (8)set(int, Object): 更改集合中指定位置的元素,并返回原来的对象; - (9)iterator(): 返回一个迭代器的实现类。 - ``` - - 1.2 LinkedList实现了一下方法: - - ``` - (1)addFirst(Object): 在链表头部插入新的元素; - (2)addLast(Object): 在链表尾部插入新的元素; - (3)add(Object): 在链表中插入新的元素; - (4)add(int, Object): 在链表指定位置插入新的元素; - (5)size(): 返回链表的大小,类型为 int; - (6)isEmpty(): 判断链表是否为空,类型为 boolean; - (7)getFirst(): 获取链表头部的元素; - (8)getLast(): 获取链表尾部的元素; - (9)get(int): 获取链表指定位置的元素; - (10)set(int, Object): 更改链表中指定位置的元素,并返回原来的对象。 - (11)removeFirst(): 删除链表头部的元素; - (12)removeLast(int): 删除链表尾部的元素; - (13)remove(Object): 删除指定元素; - (14)remove(int): 删除指定位置的元素; - (15)iterator(): 返回一个迭代器的实现类。 - ``` - - 1.3 Queue实现了一下方法: - - ``` - (1)enQueue(Object): 入队操作; - (2)deQueue(): 出队操作; - (3)size(): 返回队列的长度; - (4)isEmpty(): 判断队列是否为空。 - ``` - - 1.4 Stack实现了一下方法: - - ``` - (1)push(Object):入栈操作; - (2)pop():出栈操作; - (3)getTop():获取栈顶元素; - (4)isEmpty():判断栈是否为空; - (5)size():获取栈的深度。 - ``` - ​ - -2. 实现了BinarySearchTree、Iterator接口 - - 2.1 BinarySearchTree实现了一下方法: - - ``` - (1)insert(int):插入操作; - (2)find(int):查找操作; - (3)delete(int):删除操作; - (4)inorderTraverse(Node):遍历操作,采用中序遍历。 - ``` - - 2.2 Iterator定义了一下方法: - - ``` - (1)hasNext():判断是否有元素没有被遍历; - (2)next():返回游标当前位置的元素并将游标移动到下一个位置; - (3)remove():删除游标左边的元素,在执行完 next 之后该操作只能执行一次。 - ``` - ​ - -3. 对应以上类做了单元测试 - - 说明:由于作业以实现基本的数据结构为主,则在实现单元测试时,只对正常情况进行了测试,一些异常情况并进行编写测试用例。 - - 点击查看: [unit test](https://github.com/china-kook/coding2017/tree/master/group18/935542673/Coding/junit/com/ikook/basic_data_structure) \ No newline at end of file diff --git "a/group18/935542673/Datum/\345\205\263\344\272\216.metadata\347\233\256\345\275\225\345\222\214.gitignore\344\275\277\347\224\250\347\232\204\351\227\256\351\242\230.docx" "b/group18/935542673/Datum/\345\205\263\344\272\216.metadata\347\233\256\345\275\225\345\222\214.gitignore\344\275\277\347\224\250\347\232\204\351\227\256\351\242\230.docx" deleted file mode 100644 index d169fd91bf6a6a0ade817eb981a37595454334b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82125 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 diff --git a/group18/group18.md b/group18/group18.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group18/group18.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group19/1294642551/.gitignore b/group19/1294642551/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group19/1294642551/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group19/1294642551/readme.txt b/group19/1294642551/readme.txt deleted file mode 100644 index 747e8550dc..0000000000 --- a/group19/1294642551/readme.txt +++ /dev/null @@ -1 +0,0 @@ -JaneZhou91's files \ No newline at end of file diff --git a/group19/1294642551/src/data_Structures/ArrayList.java b/group19/1294642551/src/data_Structures/ArrayList.java deleted file mode 100644 index fe0a8c1557..0000000000 --- a/group19/1294642551/src/data_Structures/ArrayList.java +++ /dev/null @@ -1,57 +0,0 @@ -package data_Structures; - - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - - public void add(Object o){ - - elementData[size] = o; - size++; - } - public void add(int index, Object o){ - - int temp = size; - while(temp > index) - { - elementData[temp] = elementData[temp-1]; - temp--; - } - - elementData[index] = o; - - size++; - - - } - - public Object get(int index){ - return elementData[index]; - } - - public Object remove(int index){ - - int temp = index; - while(temp < size-1) - { - elementData[temp] = elementData[temp+1]; - temp++; - } - size--; - - return elementData[index]; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group19/1294642551/src/data_Structures/LinkedList.java b/group19/1294642551/src/data_Structures/LinkedList.java deleted file mode 100644 index 5a1efb6d71..0000000000 --- a/group19/1294642551/src/data_Structures/LinkedList.java +++ /dev/null @@ -1,125 +0,0 @@ -package data_Structures; - - -public class LinkedList implements List { - - private Node head; - private int size; - - LinkedList() - { - size = 0; - } - - public void add(Object o){ - - Node newNode = new Node(o); - - if(head == null) - { - head = newNode; - } - else - { - Node tempNode = head; - while(tempNode.next != null) - { - tempNode = tempNode.next; - } - tempNode.next = newNode; - - } - - size++; - } - - public void add(int index , Object o){ - - Node newNode = new Node(o, getNode(index)); - getNode(index-1).next = newNode; - - size++; - - } - - public Node getNode(int index) - { - Node tempNode = head; - int i = 0; - while(i < index) - { - tempNode = tempNode.next; - i++; - } - - return tempNode; - } - - - - public Object get(int index){ - return getNode(index).data; - } - public Object remove(int index){ - - Node tempNode = getNode(index); - getNode(index - 1).next = getNode(index+1); - tempNode.next = null; - tempNode.data = null; - size--; - return getNode(index).data; - - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - - Node tempNode = head; - head = new Node(o); - head.next = tempNode; - - size++; - } - public void addLast(Object o){ - add(o); - - } - public Object removeFirst(){ - - Node tempNode = head; - head = getNode(1); - size--; - - return tempNode.data; - } - public Object removeLast(){ - getNode(size-1).next = null; - size--; - return getNode(size).data; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - Node(Object data, Node next ) - { - this.data = data; - this.next = next; - } - - Node(Object data) - { - this.data = data; - this.next = null; - } - - } -} diff --git a/group19/1294642551/src/data_Structures/List.java b/group19/1294642551/src/data_Structures/List.java deleted file mode 100644 index 2b7b51d97f..0000000000 --- a/group19/1294642551/src/data_Structures/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package data_Structures; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group19/1294642551/src/data_Structures/Queue.java b/group19/1294642551/src/data_Structures/Queue.java deleted file mode 100644 index 0926e3a31c..0000000000 --- a/group19/1294642551/src/data_Structures/Queue.java +++ /dev/null @@ -1,28 +0,0 @@ -package data_Structures; - -public class Queue { - - private LinkedList ll; - - Queue() - { - ll = new LinkedList(); - } - - public void enQueue(Object o){ - ll.add(o);; - } - - public Object deQueue(){ - return ll.removeFirst(); - } - - public boolean isEmpty(){ - int size = ll.size(); - return (size == 0); - } - - public int size(){ - return ll.size(); - } -} diff --git a/group19/1294642551/src/data_Structures/Stack.java b/group19/1294642551/src/data_Structures/Stack.java deleted file mode 100644 index 575e451451..0000000000 --- a/group19/1294642551/src/data_Structures/Stack.java +++ /dev/null @@ -1,29 +0,0 @@ -package data_Structures; - -public class Stack { -// private ArrayList elementData = new ArrayList(); - - private LinkedList ll; - Stack() - { - ll = new LinkedList(); - } - - public void push(Object o){ - ll.addLast(o); - } - - public Object pop(){ - return ll.removeLast(); - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return ll.size()==0; - } - public int size(){ - return ll.size(); - } -} diff --git a/group19/1592562638/.gitignore b/group19/1592562638/.gitignore deleted file mode 100644 index 0aca6d5fe8..0000000000 --- a/group19/1592562638/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -/bin/ -*.class -*.settings -*.project -*.classpath -*/.settings -*.iml -/.idea -/**/target/**/* \ No newline at end of file diff --git a/group19/1592562638/src/ArrayList_self.java b/group19/1592562638/src/ArrayList_self.java deleted file mode 100644 index eb46833962..0000000000 --- a/group19/1592562638/src/ArrayList_self.java +++ /dev/null @@ -1,126 +0,0 @@ -/*ƣ - * ԭļƣ - * Ҫ㣺 - * 1. ʵֻݽṹࣺArrayList - - */ -public class ArrayList_self implements KIList { - /***ʼС***/ - private final static int INIT_CAPACITY=12; - private Object[] mList=null; - - /***ǰ***/ - private int mCurrentCapacity=0; - /***Ԫظ***/ - private int mSize=0; - - public ArrayList_self(){ - mList=new Object[INIT_CAPACITY]; - mCurrentCapacity=INIT_CAPACITY; - } - - /** - * һԪصArrayListβ - * @param item - * */ - @Override - public void add(T item) { - // TODO Auto-generated method stub - if(mSize==mCurrentCapacity){ - expansion();// - } - mList[mSize]=item; - mSize++; - } - - /** - * һԪصָλãӲλüԪƶһλ - * @param index Ҫλ - * @param item - * */ - @Override - public void add(int index, T item) { - // TODO Auto-generated method stub - if (index<0 || index>=mSize) {//indexС0index >= 鵱ǰС - throw new IndexOutOfBoundsException();//׳Խ쳣 - } - if(mSize==mCurrentCapacity){ - expansion();// - } - Object[] newList=new Object[mCurrentCapacity]; - System.arraycopy(mList, 0, newList, 0, index); - System.arraycopy(mList, index, newList, index+1, mSize-index); - newList[index]=item; - mList=newList; - mSize++; - } - /** - * ƳָλõԪأԪǰƶһλ - * @param index - * */ - @Override - public T remove(int index) { - // TODO Auto-generated method stub - if(index<0 || index>=mSize){ - throw new IndexOutOfBoundsException(); - } - Object[] newList=new Object[mCurrentCapacity]; - System.arraycopy(mList, 0, newList, 0, index); - System.arraycopy(mList, index+1, newList, index, mSize - index); - - T tempT=(T) mList[index]; - mList=newList; - mSize--; - - return tempT; - } - /** - * ָλõԪ - * @param index - * @param item - * */ - @Override - public void set(int index, T item) { - // TODO Auto-generated method stub - if(index<0 || index>=mSize){ - throw new IndexOutOfBoundsException(); - } - mList[index]=item; - } - /** - * ȡָλõԪ - * @param index - * @return - * */ - @Override - public T get(int index) { - // TODO Auto-generated method stub - if(index<0 || index>=mSize){ - throw new IndexOutOfBoundsException(); - } - - return (T)mList[index]; - } - /** - * ȡǰij - * @return int - * */ - @Override - public int size() { - // TODO Auto-generated method stub - return mSize; - } - - /** - * ݣ mSize == mCurrentCapacity ʱ;ʱÿӵǰ50% - * */ - private void expansion() { - // TODO Auto-generated method stub - Object[] oldList=mList; - Object[] newList=new Object[mCurrentCapacity + (mCurrentCapacity >> 1)]; - System.arraycopy(oldList, 0, newList, 0, oldList.length); - mList=newList; - mCurrentCapacity=mCurrentCapacity + (mCurrentCapacity >> 1); - } - -} diff --git a/group19/1592562638/src/BinaryTreeNode_self.java b/group19/1592562638/src/BinaryTreeNode_self.java deleted file mode 100644 index 53ccf3bbdf..0000000000 --- a/group19/1592562638/src/BinaryTreeNode_self.java +++ /dev/null @@ -1,71 +0,0 @@ -/*ƣ - * ԭļƣ - * Ҫ㣺 - * 1. ʵֻݽṹࣺ - - */ -public class BinaryTreeNode_self { - private T data; - private BinaryTreeNode_self left; - private BinaryTreeNode_self right; - - //ȡڵ - public T getData(){ - return data; - } - - //ýڵ - public void setData(T item){ - this.data=item; - } - - //ȡڵ - public BinaryTreeNode_self getLeft(){ - return left; - } - - //ڵ - public void setLeft(BinaryTreeNode_self left){ - this.left=left; - } - - //ȡҽڵ - public BinaryTreeNode_self getRight(){ - return right; - } - - //ҽڵ - public void setRight(BinaryTreeNode_self right){ - this.right=right; - } - - //ӽڵ(֤ڵ<ڵ<ҽڵ) - public BinaryTreeNode_self insert(T item){ - Comparable co=(Comparable)item; - Comparable coData=(Comparable)data; - BinaryTreeNode_self result=null; - if(co.compareTo(data)>0){ - if(right==null){ - right=new BinaryTreeNode_self<>(); - right.data=item; - result=right; - return result; - } - else{ - right.insert(item); - } - } - else{ - if(left==null){ - left=new BinaryTreeNode_self<>(); - left.data=item; - result=left; - return result; - } - else{ - left.insert(item); - } - } - return result; - } -} diff --git a/group19/1592562638/src/CollectionTest.java b/group19/1592562638/src/CollectionTest.java deleted file mode 100644 index 9e6162949a..0000000000 --- a/group19/1592562638/src/CollectionTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/*ƣ - * ԭļƣ - * Ҫ㣺 - * 1. ʵֻݽṹࣺArrayListLinkedListQueueStackTree - - */ -public class CollectionTest { - - public static void main(String[] args) { - // TODO Auto-generated method stub - //ArrayList - ArrayList_self arrayList1=new ArrayList_self(); - for(int i=0;i<15;i++){ - arrayList1.add(new Name("An"+i, "Array")); - if(i>6){ - arrayList1.set(i, new Name("Bo"+i, "Array")); - } - System.out.println(arrayList1.get(i)); - } - - //LinkedList - LinkedList_self linkedList1=new LinkedList_self(); - for(int i=0;i<8;i++){ - linkedList1.add(new Name("An"+i, "Linked")); - if(i>3){ - linkedList1.set(i, new Name("Bo"+i, "Linked")); - } - System.out.println(linkedList1.get(i)); - } - - //Stack - Stack_self stack1=new Stack_self(); - for(int i=0;i<6;i++){ - stack1.push(new Name("An"+i, "Stack")); - if(i>3){ - System.out.println(stack1.peek()); - } - } - - //Queue - Queue_self queue1=new Queue_self(); - for(int i=0;i<6;i++){ - queue1.enQueue(new Name("An"+i, "Queue")); - if(i>3){ - System.out.println(queue1.deQueue()); - } - } - } - -} diff --git a/group19/1592562638/src/KIList.java b/group19/1592562638/src/KIList.java deleted file mode 100644 index 6dc4607499..0000000000 --- a/group19/1592562638/src/KIList.java +++ /dev/null @@ -1,18 +0,0 @@ -/*ƣ - * ԭļƣ - * Ҫ㣺 - * 1. ˳ӿ:ɾġ鹦 - - */ -public interface KIList { - public void add(T item); - public void add(int index, T item); - - public T remove(int index);//ֵɾԪ - - public void set(int index, T item); - - public T get(int index); - public int size(); - -} diff --git a/group19/1592562638/src/LinkedList_self.java b/group19/1592562638/src/LinkedList_self.java deleted file mode 100644 index ca394337fb..0000000000 --- a/group19/1592562638/src/LinkedList_self.java +++ /dev/null @@ -1,199 +0,0 @@ -/*ƣ - * ԭļƣ - * Ҫ㣺 - * 1. ʵֻݽṹࣺLinkedList - - */ -public class LinkedList_self implements KIList { - // һڲNode Node ʵĽڵ - public class Node { - public T data;// ڵ - public Node next;// ָһڵ - - // ޲ι - public Node() { - }; - - // ʼȫԹ - public Node(T data, Node next) { - this.data = data; - this.next = next; - } - } - - // ͷڵ - public Node header; - // βڵ - public Node tail; - // Ľڵ - public int size = 0; - - // - public LinkedList_self() { - header = null; - tail = null; - } - - // һָԪص - public LinkedList_self(T element) { - header = new Node(element, tail); - tail = header;// ֻһڵ㣬header tail ָýڵ - size++; - } - - /** - * һԪصArrayListβ - * @param item - */ - @Override - public void add(T item) { - // TODO Auto-generated method stub - // - if (header == null) { - header = new Node(item, tail); - tail = header; - } else { - // ½ڵ - Node newNode = new Node(item, null); - // βڵָ½ڵ - tail.next = newNode; - tail = newNode; - } - size++; - } - - /** - * һԪصָλãӲλüԪƶһλ - * - * @param index - * Ҫλ - * @param item - */ - @Override - public void add(int index, T item) { - // TODO Auto-generated method stub - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - // ǿ - if (header == null) { - add(item); - } else { - // indexΪ0ʱڱͷ - if (index == 0) { - addAtHeader(item); - } - else{ - //ȡǰýڵ - Node prev=getNodeByIndex(index-1); - //prevָ½ڵ㣬½ڵnextָprevnext - prev.next=new Node(item,prev.next); - size++; - } - } - } - - /** - * ƳָλõԪأԪǰƶһλ - * - * @param index - */ - @Override - public T remove(int index) { - // TODO Auto-generated method stub - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - - Node del = null; - // ɾͷ - if (index == 0) { - del = header; - header = header.next; - } else { - // ȡɾڵǰýڵ - Node prev = getNodeByIndex(index - 1); - del = prev.next; - prev.next = del.next; - del.next = null; - } - size--; - return del.data; - } - - /** - * ָλõԪ - * - * @param index - * @param item - */ - @Override - public void set(int index, T item) { - // TODO Auto-generated method stub - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - // headerڵ㿪ʼ - Node current = header; - for (int i = 0; i < size && current != null; i++) { - if (i == index) { - current.data = item; - } - current = current.next; - } - } - - /** - * ȡָλõԪ - * - * @param index - * @return - */ - @Override - public T get(int index) { - // TODO Auto-generated method stub - return getNodeByIndex(index).data; - } - - /** - * ij - * - * @param item - */ - @Override - public int size() { - // TODO Auto-generated method stub - return size; - } - - // indexȡָλõĽڵ - private Node getNodeByIndex(int index) { - // TODO Auto-generated method stub - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - // headerڵ㿪ʼ - Node current = header; - for (int i = 0; i < size && current != null; i++) { - if (i == index) { - return current; - } - current = current.next; - } - return null; - } - - // ͷ巨Ϊ½ڵ - private void addAtHeader(T item) { - // TODO Auto-generated method stub - //½ڵ㣬½ڵnext ָheader - //½ڵΪheader - Node newNode=new Node(item,header); - header=newNode; - //ǰǿ - if(tail==null){ - tail=header; - } - size++; - } -} diff --git a/group19/1592562638/src/Name.java b/group19/1592562638/src/Name.java deleted file mode 100644 index 2e3890133e..0000000000 --- a/group19/1592562638/src/Name.java +++ /dev/null @@ -1,36 +0,0 @@ - -public class Name implements Comparable { - private String firstName,lastName; - public Name(String firstName,String lastName){ - this.firstName=firstName; - this.lastName=lastName; - } - public String getFirstName() { - return firstName; - } - public void setFirstName(String firstName) { - this.firstName = firstName; - } - public String getLastName() { - return lastName; - } - public void setLastName(String lastName) { - this.lastName = lastName; - } - public String toString(){return firstName+" "+lastName;}//дtoString - - //дequalshashCode - public boolean equals(Name name){ - return (firstName.equals(name.firstName) && lastName.equals(name.lastName)); - } - public int hashCode(){ - return firstName.hashCode(); - } - - //дcompareTo - public int compareTo(Name o){ - int lastCmp=lastName.compareTo(o.lastName); - return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName)); - } - -} diff --git a/group19/1592562638/src/Queue_self.java b/group19/1592562638/src/Queue_self.java deleted file mode 100644 index 387b005060..0000000000 --- a/group19/1592562638/src/Queue_self.java +++ /dev/null @@ -1,37 +0,0 @@ -/*ƣ - * ԭļƣ - * Ҫ㣺 - * 1. ʵֻݽṹࣺQueue - - */ -public class Queue_self { - private LinkedList_self data; - private int size; - - //ʼ - public Queue_self(){ - data=new LinkedList_self(); - } - - // - public void enQueue(Object item){ - data.add((T)item); - size++; - } - - // - public T deQueue(){ - size--; - return data.remove(0); - } - - //ǷΪն - public boolean isEmpty(){ - return (size==0); - } - - //г - public int size(){ - return size; - } -} diff --git a/group19/1592562638/src/Stack_self.java b/group19/1592562638/src/Stack_self.java deleted file mode 100644 index e003c1be4a..0000000000 --- a/group19/1592562638/src/Stack_self.java +++ /dev/null @@ -1,42 +0,0 @@ -/*ƣ - * ԭļƣ - * Ҫ㣺 - * 1. ʵֻݽṹࣺStack - - */ -public class Stack_self { - private ArrayList_self elementData=new ArrayList_self(); - private int size=0; - - //ջ - public void push(Object item){ - elementData.add((T)item); - size++; - } - - //ջ - public Object pop(){ - if(size>0){ - size--; - return elementData.remove(size); - } - else{ - return null; - } - } - - //ȡջԪ - public Object peek(){ - return elementData.get(size-1); - } - - //жǷΪ - public boolean isEmpty(){ - return (size==0); - } - - //size - public int size(){ - return size; - } -} diff --git "a/group19/1592562638/\350\257\273\344\271\246\347\254\224\350\256\260/1\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206/\350\257\273\344\271\246\347\254\224\350\256\260_\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.pdf" "b/group19/1592562638/\350\257\273\344\271\246\347\254\224\350\256\260/1\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206/\350\257\273\344\271\246\347\254\224\350\256\260_\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.pdf" deleted file mode 100644 index 35e06b434a2fa68b67213357cc43050b0e75db95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 710498 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Νm30tyAPA* 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�Zr{ExVSOhD`}LEhtXIlg>oK$G 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

R3yV~e-iQ- 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�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 LLY!3!xPvI%3bQ5{OI9MG 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 E3#4 size || index < 0) { - throw new RuntimeException("Խ"); - } - } - - /** - * ȷǰӡ - */ - private void addSize(int index) { - if (index > size && size< elements.length-1) { - this.capacity = this.size + this.DEFAULT_SIZE; - Object[] newElemets = new Object[this.capacity]; - - System.arraycopy(elements,0,newElemets,0,elements.length); - - this.elements = newElemets; - } - } - - class IteratorImpl implements Iterator { - - private int curi = 0; - - @Override - public boolean hasNext() { - boolean bn = false; - if (curi < size) { - bn = true; - } - return bn; - } - - @Override - public Object next() { - if (!hasNext()) { - return null; - } - curi++; - return elements[curi]; - } - - } - -} diff --git a/group19/2558178127/src/com/coding/basic/Iterator.java b/group19/2558178127/src/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/group19/2558178127/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group19/2558178127/src/com/coding/basic/LinkedList.java b/group19/2558178127/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 415aa046d0..0000000000 --- a/group19/2558178127/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private int size; - //ͷԪ - private Node first; - //βԪ - private Node end; - - private int modcount; - - public void add(Object o){ - add(size(), o); - } - public void add(int index , Object o){ - addBefore(getNode(index),0); - } - public Object get(int index){ - return getNode(index).data; - } - - public Object remove(int index) { - Node n = getNode(index); - n.prev.next = n.next; - n.next.prev = n.prev; - size--; - modcount++; - return n.data; - } - - public int size(){ - return this.size; - } - - public void addFirst(Object o){ - Node node = getNode(0); - node.data = o; - node.next = head; - head = node; - size++; - modcount++; - } - public void addLast(Object o){ - add(size(), o); - } - public Object removeFirst(){ - return remove(head.next); - } - public Object removeLast(){ - return remove(head.prev); - } - public Iterator iterator(){ - return new LinkedListIterator(); - } - - //ִ - private void addBefore (Node p, Object o) { - Node newNode = new Node(o, p.prev, p); - newNode.prev.next = newNode; - p.prev = newNode; - modcount++; - } - - //ҽڵ - private Node getNode(int idx) { - Node p; - - if(idx <0 || idx > size()) { - throw new IndexOutOfBoundsException(); - } - - if(idx < size()/2) { - p = first.next; - for (int i = 0;i < idx;i++) { - p = p.next; - } - }else { - p = end; - for (int i = size();i>idx;i--) { - p = p.prev; - } - } - return p; - } - - public boolean remove(Object o) { - if (o==null) { - for (Node e = head.next; e != head; e = e.next) { - if (e.data==null) { - remove(e); - return true; - } - } - } else { - for (Node e = head.next; e != head; e = e.next) { - if (o.equals(e.data)) { - remove(e); - return true; - } - } - } - return false; - } - - - private static class Node { - Object data; - Node next; - Node prev; - - public Node(Object data, Node next, Node prev) { - this.data = data; - this.prev = prev; - this.next = next; - } - } - - private class LinkedListIterator implements Iterator { - - private Node current = first.next; - private int expectedModCount = modcount; - private boolean okToRemove = false; - - @Override - public boolean hasNext() { - return current != end; - } - - @Override - public Object next() { - Object nextData = current.data; - current = current.next; - okToRemove = true; - return nextData; - } - - } -} diff --git a/group19/2558178127/src/com/coding/basic/List.java b/group19/2558178127/src/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/group19/2558178127/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group19/2558178127/src/com/coding/basic/Queue.java b/group19/2558178127/src/com/coding/basic/Queue.java deleted file mode 100644 index 85ad907c4e..0000000000 --- a/group19/2558178127/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList list = new LinkedList(); - private int size = 0; - - public void enQueue(Object o){ - size++; - list.addLast(o); - } - - public Object deQueue(){ - size--; - return list.removeFirst(); - } - - public boolean isEmpty(){ - return size>0; - } - - public int size(){ - return size; - } -} diff --git a/group19/2558178127/src/com/coding/basic/Stack.java b/group19/2558178127/src/com/coding/basic/Stack.java deleted file mode 100644 index 8e50a38b38..0000000000 --- a/group19/2558178127/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - private int size; - - public void push(Object o){ - elementData.add(o); - size++; - } - - public Object pop(){ - if(size>0){ - size--; - return elementData.remove(size); - } - return null; - } - - public Object peek(){ - if(size>0) - elementData.get(size-1); - return null; - } - public boolean isEmpty(){ - return size>0; - } - public int size(){ - return size; - } -} diff --git a/group19/398129523/ArrayList b/group19/398129523/ArrayList deleted file mode 100644 index 4557672f10..0000000000 --- a/group19/398129523/ArrayList +++ /dev/null @@ -1,88 +0,0 @@ -package com.coding.work; - -import java.util.Arrays; -import java.util.Iterator; - - -public class ArrayList { - private Object[] elementData; - private int size; - - - public ArrayList(int init) { - // TODO Auto-generated constructor stub - if (init <= 0) { - throw new IllegalArgumentException(); - } - this.elementData = new Object[init]; - } - - public ArrayList(){ - this(10); //调用重载的构造函数 - } - - public void changeCapacity(int curCapacity) { - int oldCapacity = elementData.length; - if(curCapacity > oldCapacity){ - Object[] oldData = elementData; - int newCapacity = oldCapacity + oldCapacity >> 1; //右移一位除以2,相当于扩 扩大到1.5倍 - if (newCapacity elementData.length - 1) { - changeCapacity(index + 1); - } - elementData[index] = e; - size++; - return true; - } - - @SuppressWarnings("unchecked") - public E get(int index) { - if (index <= size - 1) { - return (E) elementData[index]; - - }else { - return null; - } - } - - @SuppressWarnings("unchecked") - public E remove(int index) { - if (index >= 0 && index <= size - 1) { - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - size--; - return (E) elementData[index]; - } - else { - return null; - } - } - - - - public int size() { - return size;//全局变量 - } - - //不会实现 - public Iterator iterator() { - return null; - - } - -} diff --git a/group19/398129523/LinkedList b/group19/398129523/LinkedList deleted file mode 100644 index 8cf3803e2b..0000000000 --- a/group19/398129523/LinkedList +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.work; - -public class LinkedList{ - private int size; - - private static class Node { - Object data; - Node next; - } - private Node head = new Node(); - private Node lastNode; - - public LinkedList(){ - head.next = null; - head.data = null; - lastNode = head; - } - - public void add(Object o) { - Node curnode = new Node(); - curnode.data = o; - curnode.next = null; - if (head.next == null) { - head.next = curnode; - lastNode = curnode; - size++; - }else { - lastNode.next = curnode; - size++; - } - - - } - public void add(int index , Object o) { - if (index > size - 1) { - for(int i = size - 1; i <= index; i++){ - Node curnode = new Node(); - lastNode.next = curnode; - lastNode = curnode; - } - lastNode.data = o; - } - - } - -} diff --git a/group19/398129523/Queue b/group19/398129523/Queue deleted file mode 100644 index e98ef838f4..0000000000 --- a/group19/398129523/Queue +++ /dev/null @@ -1,38 +0,0 @@ -package com.coding.work; - -import java.util.NoSuchElementException; - - - -public class Queue { - private Object[] elementdate; - private int size; - private int index; - - public void enQueue(Object o) { - if(o == null){ - throw new IllegalArgumentException(); - } - elementdate[index++] = o; - size = index + 1; - } - - public Object deQueue(){ - if (size == 0) { - throw new NoSuchElementException(); - }else{ - Object out = elementdate[0]; - System.arraycopy(elementdate, 1, elementdate, 0, size - 1); - return out; - } - } - - public boolean isEmpty(){ - - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/group19/398129523/Stack b/group19/398129523/Stack deleted file mode 100644 index 6d4d44dab9..0000000000 --- a/group19/398129523/Stack +++ /dev/null @@ -1,36 +0,0 @@ -package com.coding.work; - -import java.util.NoSuchElementException; - -public class Stack { - private Object[] elementdata; - private int size; - private int index; - - public void push(Object o) { - if (o == null) { - throw new IllegalArgumentException(); - - } - size = index + 1; - elementdata[index++] = o; - } - - public Object pop() { - if (size == 0) { - throw new NoSuchElementException(); - } - size --; - return elementdata[index--]; - } - - @SuppressWarnings("unused") - private boolean isEmpty() { - return size == 0; - } - - private int size() { - return size; - } - -} diff --git a/group19/527220084/xukai_coding/.gitignore b/group19/527220084/xukai_coding/.gitignore deleted file mode 100644 index ba13ec60db..0000000000 --- a/group19/527220084/xukai_coding/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*target -*.classpath -*.project -*.settings -*iml -.idea -*gen-* -rebel.xml \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/pom.xml b/group19/527220084/xukai_coding/coding-common/pom.xml deleted file mode 100644 index ab70ddd636..0000000000 --- a/group19/527220084/xukai_coding/coding-common/pom.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - - xukai.coding - org.xukai.coding - 1.0-SNAPSHOT - - 4.0.0 - jar - coding.common - - - - junit - junit - - - org.freemarker - freemarker - - - commons-beanutils - commons-beanutils - 1.8.0 - - - org.apache.commons - commons-compress - 1.8.1 - - - commons-lang - commons-lang - - - commons-logging - commons-logging - 1.2 - - - org.apache.commons - commons-lang3 - - - commons-io - commons-io - - - com.google.guava - guava - - - org.slf4j - slf4j-api - - - org.slf4j - slf4j-log4j12 - - - org.slf4j - jcl-over-slf4j - - - - - - - - - com.google.code.findbugs - jsr305 - 3.0.1 - - - cglib - cglib - - - joda-time - joda-time - - - - - - - - - - - javax.servlet - javax.servlet-api - - - org.springframework - spring-web - - - com.alibaba - fastjson - - - - \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/ArrayList.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/ArrayList.java deleted file mode 100644 index 0a8601c8ee..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/ArrayList.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.xukai.common; - - - -public class ArrayList implements List { - - private int size = 0; - - private static final int DEFAULT_CAPICITY = 10; - - public ArrayList() { - elementData = new Object[DEFAULT_CAPICITY]; - } - - public ArrayList(int size) { - elementData = new Object[size]; - } - - private Object[] elementData ; - - public void add(Object o){ - elementData[size] = o; - size++; - } - public void add(int index, Object o){ - if (index < 0 || index > size ) { - throw new ArrayIndexOutOfBoundsException(); - } else { - if (isNeedResize(index)) { - elementData = grown(elementData, Math.max(elementData.length << 1, index + 1)); - } - if(index < size){ - System.arraycopy(elementData,index,elementData,index+1,size-index); - } - elementData[index] = o; - } - size++; - } - - - - public Object get(int index){ - if (index > size-1 || index < 0) { - throw new ArrayIndexOutOfBoundsException(); - } - return elementData[index]; - } - - public Object remove(int index){ - if (index > size-1 || index < 0) { - throw new ArrayIndexOutOfBoundsException(); - } - Object result = elementData[index]; - size--; - System.arraycopy(elementData,index+1,elementData,index,size-index); - return result; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - class ArrayListIterator implements Iterator { - - private int pos = -1; - - @Override - public boolean hasNext() { - return pos < size - 1; - } - - @Override - public Object next() { - pos++; - return elementData[pos]; - } - } - - public void display(){ - System.out.print("["); - Iterator iterator = iterator(); - while (iterator.hasNext()){ - System.out.print(" " + iterator.next()); - } - System.out.print(" ]"); - } - - private boolean isNeedResize(int index){ - return index > elementData.length-1 || size > elementData.length-1; - } - - private Object[] grown(Object[] src,int capacity){ - Object[] des = new Object[capacity]; - System.arraycopy(elementData,0,des,0,elementData.length); - return des; - } - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/BinaryTreeNode.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/BinaryTreeNode.java deleted file mode 100644 index 2ff876cac5..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/BinaryTreeNode.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.xukai.common; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Comparable o){ - if (data == null) { - data = o; - return this; - } else { - BinaryTreeNode node = new BinaryTreeNode(); - node.data = o; - if (o.compareTo(data) < 0) { - if (left == null) { - left = node; - return node; - } else { - return left.insert(o); - } - } else { - if (right == null) { - right = node; - return node; - } else { - return right.insert(o); - } - } - } - } - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Iterator.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Iterator.java deleted file mode 100644 index d81ade6ba5..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.xukai.common; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/LinkedList.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/LinkedList.java deleted file mode 100644 index cb1585cecf..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/LinkedList.java +++ /dev/null @@ -1,163 +0,0 @@ -package org.xukai.common; - -public class LinkedList implements List { - - private Node head; - - private int size = 0; - - public void add(Object o){ - Node node = new Node(); - node.data = o; - if (head == null) { - head = node; - } else { - Node next = head.next; - if (next == null) { - head.next = node; - } else { - while (next.next != null){ - next = next.next; - } - next.next = node; - } - } - size++; - } - - public void add(int index , Object o){ - if (index < 0 || index > size ) { - throw new ArrayIndexOutOfBoundsException(); - } else { - size++; - Node node = new Node(); - node.data = o; - if (index == 0) { - node.next = head; - head = node; - return; - } - int pos = 1; - Node next = head; - //index 2 - while(index > pos){ - next = next.next; - pos++; - } - node.next = next.next; - next.next = node; - } - } - public Object get(int index){ - if (index < 0 || index > size ) { - throw new ArrayIndexOutOfBoundsException(); - } else { - if (index == 0) { - return head.data; - } - int pos = 1; - Node next = head; - //index 2 - while(index > pos){ - next = next.next; - pos++; - } - return next.data; - } - } - - public Object remove(int index){ - if (index < 0 || index > size - 1 ) { - throw new ArrayIndexOutOfBoundsException(); - } else { - if (index == 0) { - Node result = head; - head = head.next; - return result.data; - } - int pos = 1; - Node next = head; - //index 1 - while(index > pos){ - next = next.next; - pos++; - } - Node result = next.next; - next.next = next.next.next; - size--; - return result.data; - } - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node node = new Node(); - node.data = o; - node.next = head; - head = node; - size++; - } - - public void addLast(Object o){ - add(o); - } - - public Object removeFirst(){ - Node result = head; - head = head.next; - size--; - return result.data; - } - - public Object removeLast(){ - return remove(size-1); - } - - public Iterator iterator(){ - return new LinkedListIterator(); - } - - class LinkedListIterator implements Iterator { - - private Node currentNode ; - - @Override - public boolean hasNext() { - if (currentNode == null) { - if (head != null) { - return true; - } else { - return false; - } - } - return currentNode.next != null; - } - - @Override - public Object next() { - if (currentNode == null) { - currentNode = head; - return currentNode.data; - } - currentNode = currentNode.next; - return currentNode.data; - } - } - - public void display(){ - System.out.print("["); - Iterator iterator = iterator(); - while (iterator.hasNext()){ - System.out.print(" " + iterator.next()); - } - System.out.print(" ]"); - } - - private static class Node{ - Object data; - Node next; - } -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/List.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/List.java deleted file mode 100644 index ab5dcb4178..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.xukai.common; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Queue.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Queue.java deleted file mode 100644 index ad77cee9ae..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Queue.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.xukai.common; - -import java.util.NoSuchElementException; - -public class Queue { - - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - if (isEmpty()) { - throw new NoSuchElementException(); - } - return elementData.removeFirst(); - } - - public boolean isEmpty(){ - return elementData.size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Stack.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Stack.java deleted file mode 100644 index de705e1fec..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Stack.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.xukai.common; - -import java.util.EmptyStackException; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (isEmpty()) { - throw new EmptyStackException(); - } - return elementData.remove(elementData.size()-1); - } - - public Object peek(){ - if (isEmpty()) { - throw new EmptyStackException(); - } - return elementData.get(elementData.size()-1); - } - - public boolean isEmpty(){ - return elementData.size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/ArrayListTest.java b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/ArrayListTest.java deleted file mode 100644 index b14feb5ab4..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/ArrayListTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.xukai.common; - -import org.junit.Assert; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * @author xukai - * @desc - * @date 2017-02-20-下午 2:02 - */ -public class ArrayListTest { - - @Test - public void testAdd() throws Exception { - ArrayList list = new ArrayList(); - list.add("0"); - list.add("1"); - list.add("2"); - list.add("3"); - list.add("4"); - Assert.assertTrue(list.size() == 5); - list.add(0,"3"); - Assert.assertTrue(list.get(0).equals("3")); - Assert.assertTrue(list.size() == 6); - list.remove(5); - Assert.assertTrue(list.size() == 5); - list.display(); - } - - @Test - public void testAdd1() throws Exception { - - } - - @Test - public void testGet() throws Exception { - - } - - @Test - public void testRemove() throws Exception { - - } - - @Test - public void testSize() throws Exception { - - } - - @Test - public void testIterator() throws Exception { - ArrayList list = new ArrayList(); - list.add("0"); - list.add("1"); - list.add("2"); - list.add("3"); - list.add("4"); - Iterator iterator = list.iterator(); - while (iterator.hasNext()){ - System.out.println(iterator.next()); - } - } - - @Test - public void testDisplay() throws Exception { - - } -} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/BinaryTreeNodeTest.java b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/BinaryTreeNodeTest.java deleted file mode 100644 index cc85baaa97..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/BinaryTreeNodeTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.xukai.common; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * @author xukai - * @desc - * @date 2017-02-20-下午 5:02 - */ -public class BinaryTreeNodeTest { - - - @Test - public void testInsert() throws Exception { - BinaryTreeNode node = new BinaryTreeNode(); - node.insert(5); - node.insert(9); - node.insert(3); - node.insert(7); - node.insert(2); - node.insert(8); - node.insert(4); - node.insert(6); - node.insert(1); - } -} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/LinkedListTest.java b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/LinkedListTest.java deleted file mode 100644 index d31e3a70ec..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/LinkedListTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.xukai.common; - -import org.junit.Assert; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * @author xukai - * @desc - * @date 2017-02-20-下午 3:54 - */ -public class LinkedListTest { - - @Test - public void testAdd() throws Exception { - LinkedList list = new LinkedList(); - list.add("0"); - list.add("1"); - list.add("2"); - list.add("3"); - list.add("4"); - Assert.assertTrue(list.size() == 5); - list.add(0,"000"); - Assert.assertTrue( (list.get(0)).equals("000")); - Assert.assertTrue(list.size() == 6); - list.addFirst("111"); - Assert.assertTrue(list.get(0).equals("111")); - list.remove(5); - Assert.assertTrue(list.size() == 6); - list.addLast("111"); - Assert.assertTrue(list.size() == 7); - list.removeFirst(); - Assert.assertTrue(list.size() == 6); - list.removeLast(); - Assert.assertTrue(list.size() == 5); - list.remove(4); - Assert.assertTrue(list.size() == 4); - list.display(); - } - - @Test - public void testAdd1() throws Exception { - - } - - @Test - public void testGet() throws Exception { - - } - - @Test - public void testRemove() throws Exception { - - } - - @Test - public void testSize() throws Exception { - - } - - @Test - public void testAddFirst() throws Exception { - - } - - @Test - public void testAddLast() throws Exception { - - } - - @Test - public void testRemoveFirst() throws Exception { - - } - - @Test - public void testRemoveLast() throws Exception { - - } - - @Test - public void testIterator() throws Exception { - - } - - @Test - public void testDisplay() throws Exception { - - } -} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/QueueTest.java b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/QueueTest.java deleted file mode 100644 index fa1a6e9f2c..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/QueueTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.xukai.common; - -import org.junit.Assert; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * @author xukai - * @desc - * @date 2017-02-20-下午 4:36 - */ -public class QueueTest { - - @Test - public void testEnQueue() throws Exception { - Queue queue = new Queue(); - Assert.assertTrue(queue.isEmpty()); - queue.enQueue("0"); - queue.enQueue("1"); - queue.enQueue("2"); - queue.enQueue("3"); - Assert.assertTrue(!queue.isEmpty()); - Assert.assertTrue(queue.deQueue().equals("0")); - Assert.assertTrue(queue.deQueue().equals("1")); - Assert.assertTrue(queue.size() == 2); - queue.deQueue(); - queue.deQueue(); - Assert.assertTrue(queue.isEmpty()); - } - - @Test - public void testDeQueue() throws Exception { - - } - - @Test - public void testIsEmpty() throws Exception { - - } - - @Test - public void testSize() throws Exception { - - } -} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/StackTest.java b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/StackTest.java deleted file mode 100644 index 69fc9dee6e..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/StackTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.xukai.common; - -import org.junit.Assert; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * @author xukai - * @desc - * @date 2017-02-20-下午 4:20 - */ -public class StackTest { - - @Test - public void testPush() throws Exception { - Stack stack = new Stack(); - Assert.assertTrue(stack.isEmpty()); - stack.push("0"); - stack.push("1"); - stack.push("2"); - stack.push("3"); - Assert.assertTrue(!stack.isEmpty()); - Assert.assertTrue(stack.peek().equals("3")); - Assert.assertTrue(stack.pop().equals("3")); - Assert.assertTrue(stack.size() == 3); - stack.pop(); - stack.pop(); - stack.pop(); - Assert.assertTrue(stack.isEmpty()); - } - - @Test - public void testPop() throws Exception { - - } - - @Test - public void testPeek() throws Exception { - - } - - @Test - public void testIsEmpty() throws Exception { - - } - - @Test - public void testSize() throws Exception { - - } -} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/pom.xml b/group19/527220084/xukai_coding/pom.xml deleted file mode 100644 index f8e396ae46..0000000000 --- a/group19/527220084/xukai_coding/pom.xml +++ /dev/null @@ -1,422 +0,0 @@ - - - 4.0.0 - - org.xukai.coding - xukai.coding - pom - 1.0-SNAPSHOT - - coding-common - - - - UTF-8 - 3.15.0-GA - 3.7.0.Final - 4.1.6.RELEASE - 2.6 - 3.4 - 1.7 - 2.3.21 - 3.2.8 - 1.2.2 - 5.1.29 - - 1.3 - 17.0 - 1.0.11 - 4.11 - 2.1.1 - 2.1.2 - 3.4.5 - 1.1.38 - 2.2.2 - 1.2-GUAHAO - 1.1.1 - 2.3.2 - 2.4.4 - 1.9 - 2.9.6 - 1.8 - 10.2.0.4.0 - 2.2.1 - 1.7.2 - 1.3 - 1.6.6 - 1.6.6 - 3.1 - 4.0 - 2.8.0 - - - - - - - org.slf4j - jcl-over-slf4j - ${jcl-over-slf4j.version} - - - - cglib - cglib - ${cglib.version} - - - org.quartz-scheduler - quartz - ${quartz.version} - - - org.apache.zookeeper - zookeeper - ${zookeeper.version} - - - com.github.sgroschupf - zkclient - 0.1 - - - org.springframework - spring-org.xukai.core.org.xukai.core.aop - ${spring.version} - - - org.springframework - spring-aspects - ${spring.version} - - - org.springframework - spring-jdbc - ${spring.version} - - - org.springframework - spring-orm - ${spring.version} - - - org.springframework - spring-websocket - ${spring.version} - - - org.springframework - spring-messaging - ${spring.version} - - - org.springframework - spring-aop - ${spring.version} - - - org.springframework - spring-core - ${spring.version} - - - org.springframework - spring-webmvc - ${spring.version} - - - org.springframework - spring-web - ${spring.version} - - - org.springframework - spring-context-support - ${spring.version} - - - org.springframework - spring-context - ${spring.version} - - - org.springframework - spring-tx - ${spring.version} - - - org.springframework - spring-beans - ${spring.version} - - - org.springframework - spring-expression - ${spring.version} - - - - - - - - org.springframework - spring-oxm - ${spring.version} - - - org.springframework - spring-test - ${spring.version} - - - org.aspectj - aspectjweaver - ${aspectj.version} - - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - - com.google.guava - guava - ${guava.version} - - - org.mybatis - mybatis-spring - ${mybatis.spring.version} - - - org.slf4j - slf4j-log4j12 - ${slf4j-log4j12.version} - - - org.mybatis - mybatis - ${mybatis.version} - - - - mysql - mysql-connector-java - ${mysql.java.version} - - - com.oracle - ojdbc14 - ${oracle.version} - - - org.apache.velocity - velocity - ${velocity.version} - - - org.freemarker - freemarker - ${freemarker.version} - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - commons-lang - commons-lang - ${commons.lang.version} - - - org.apache.commons - commons-lang3 - ${commons.lang3.version} - - - commons-dbcp - commons-dbcp - ${commons.dbcp.version} - - - com.google.code.kaptcha - kaptcha - ${kaptcha.version} - - - com.alibaba - druid - ${druid.version} - - - org.slf4j - slf4j-api - 1.7.7 - - - org.apache.velocity - velocity-tools - 2.0 - - - log4j - log4j - 1.2.16 - - - dom4j - dom4j - 1.6.1 - - - javax.servlet - servlet-api - 2.5 - - - commons-codec - commons-codec - ${commons.codec} - - - commons-io - commons-io - 1.4 - - - javax.servlet - javax.servlet-api - 3.0.1 - - - junit - junit - ${junit.version} - - - org.apache.maven.plugins - maven-resources-plugin - 2.4.3 - - - com.alibaba - fastjson - ${fastjson.version} - - - com.greenline.common - greenline-common-util - ${greenline.common.util} - - - joda-time - joda-time - ${v.joda.time.version} - - - - javax.servlet - jsp-api - 2.0 - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - - redis.clients - jedis - ${jedis.version}} - - - - - - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${v.p.mvn.compiler} - - ${project.ud.jdk} - ${project.ud.jdk} - UTF-8 - - ${project.build.sourceDirectory} - - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.8 - - true - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8 - - utf-8 - utf-8 - - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.3 - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18.1 - - true - - - - - - - \ No newline at end of file diff --git "a/group19/604322962/cpu\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.txt" "b/group19/604322962/cpu\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.txt" deleted file mode 100644 index f20b27f7b0..0000000000 --- "a/group19/604322962/cpu\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.txt" +++ /dev/null @@ -1,3 +0,0 @@ - 指令就是计算机直接用来控制计算机运行的代码,我们编写的java代码,在实际运行时也会被计算机在底层转化为各式各样的指令。 - 而cpu就是负责读取并解释这些指令的设备,cpu主要由几大部分组长,包括运算器、控制器和寄存器,控制器负责把指令、数据读取寄存器,运算器负责运算寄存器中的数据。但由于内存容量有限,成本高,并且断电之后里面的一切数据都会丢失,导致内存并不能作为我们永久存储程序的地方,而硬盘的价格便宜、容量大、断电后仍能保存数据,就可以作为我们长期存储程序和其他数据的地方。当我们需要运行某一个程序的时候,就从硬盘中将对应的数据读取到内存中,然后CPU再从内存中读取执行。 - cpu如果直接读取硬盘数据,由于硬盘的速度比内存慢了太多,会导致计算机运算能力严重降低。 diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java deleted file mode 100644 index 3f2fa618c5..0000000000 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,53 +0,0 @@ -package main.java.com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - private static final int GORW_CAPACITY = 10; - public void add(Object o){ - if (sizeelementData.length) - throw new IndexOutOfBoundsException(); - } - -} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 2701270b5d..0000000000 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package main.java.com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java deleted file mode 100644 index 86643482fb..0000000000 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package main.java.com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java deleted file mode 100644 index 1d8b56ede4..0000000000 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,143 +0,0 @@ -package main.java.com.coding.basic; - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - private int size; - private Node tail; - public void add(Object obj){ - linkLast(obj); - } - - public void add(int index , Object obj){ - if (index<0 || index>size) - throw new IndexOutOfBoundsException(); - else { - if (index == size) - linkLast(obj); - else { - Node node = linkIndex(index);//获取指定index的Node - Node pred = node.prev; - Node newNode = new Node(node.prev,obj,node); - node.prev = newNode; - if (pred==null) - head = newNode; - else - node.prev.next = newNode;//原链表指定节点前一个的节点的next指向新节点 - size++; - } - } - } - public Object get(int index){ - return linkIndex(index); - } - public Object remove(int index){ - Node node = linkIndex(index);//获取指定index的Node - Node prev = node.prev; - Node next = node.next; - if (prev==null) { - //此时删除的节点为头节点 - head = next; - } else { - prev.next = next; - node.prev = null; - } - if (next==null) { - //此时删除节点为尾节点 - tail = prev; - } else { - next.prev = prev; - node.next = null; - } - node.data = null; - size--; - return node; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - Node newNode = new Node(null,o, head); - if (head == null) { - head = newNode; - } else { - newNode.next = head; - } - size++; - } - public void addLast(Object o){ - Node newNode = new Node(head,o, null); - if (head == null) { - head = newNode; - } else { - newNode.next = head; - } - size++; - } - public Object removeFirst(){ - if (head == null) { - throw new NoSuchElementException(); - } else { - Node next = head.next; - Object obj = head.data; - head.next = null; - head.data = null; - head = next; - if (next == null) { - tail = null; - } else { - next.prev = null; - } - size--; - return obj; - } - } - public Object removeLast(){ - tail = tail.prev; - head.next = null; - head.data = null; - return tail; - } - public Iterator iterator(){ - return null; - } - - /** - * 尾部添加一个节点 - * @param obj - */ - private void linkLast(Object obj){ - Node newNode = new Node(tail,obj, null); - if (tail == null) { - head = newNode; - tail = newNode; - } else - tail.next = newNode; - size++; - } - /** - * 获取指定index索引的Node节点 - * @param index - * @return - */ - private Node linkIndex(int index){ - Node n = head; - for (int i=0;i size - 1) { - index = size - 1; - } - } - - ensureCapacity(); - for (int i = size - 1; i >= index; i--) { - elements[i + 1] = elements[i]; - } - elements[index] = o; - size++; - } - - @Override - public void add(Object o) { - ensureCapacity(); - elements[size] = o; - size++; - } - - @Override - public Object get(int index) { - if (size < 1 || index < 0 || index > size - 1) { - throw new IndexOutOfBoundsException(); - } - return elements[index]; - } - - @Override - public Object remove(int index) { - if (size < 1 || index < 0 || index > size - 1) { - throw new IndexOutOfBoundsException(); - } - Object object = elements[index]; - for (int i = index; i < size - 1; i++) { - elements[i] = elements[i + 1]; - } - elements[size - 1] = null; - size--; - adjustCapacity(); // 调整数组至合适大小 - return object; - } - - @Override - public int size() { - return size; - } - - // 底层数组最多有2*EXTENDED_SIZE个多余空间 - private void adjustCapacity() { - if ((size + 2 * EXTENDED_SIZE) < elements.length) { - elements = Arrays.copyOf(elements, size + 2 * EXTENDED_SIZE); - } - } - - // 每次添加元素时,检查底层数组的长度,保证存储空间 - private void ensureCapacity() { - if (size == elements.length) { - elements = Arrays.copyOf(elements, elements.length + EXTENDED_SIZE); - } - } - - public Iterator iterator() { - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator { - - private int curIndex = 0; - - @Override - public boolean hasNext() { - if (size > 0 && curIndex < size) { - return true; - } - return false; - } - - @Override - public Object next() { - if (!hasNext()) { - throw new IndexOutOfBoundsException(); - } - Object object = elements[curIndex]; - curIndex++; - return object; - } - - } - -} diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/Iterator.java b/group19/709960951/CodeLearning/src/com/coding/basic/Iterator.java deleted file mode 100644 index b8c8e0ce6a..0000000000 --- a/group19/709960951/CodeLearning/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - boolean hasNext(); - Object next(); -} diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/LinkedList.java b/group19/709960951/CodeLearning/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 40374287c2..0000000000 --- a/group19/709960951/CodeLearning/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - private static class Node { - Object data; - Node next; - } - - private int size = 0; // 初始化size=0 - private Node head = null; - - @Override - public void add(Object o) { - Node node = new Node(); - node.data = o; - node.next = null; - if (head == null) { - head = node; - } else { - Node tail = head; - while (tail.next != null) { - tail = tail.next; - } - tail.next = node; - } - size++; - } - - @Override - public void add(int index, Object o) { - if (size < 1) { - index = 0; - } else { - if (index < 0) { - index = 0; - } - if (index > size - 1) { - index = size - 1; - } - } - Node p = null;// 插入位置的前一节点 - Node q = head; - while (index > 0) { - p = q; - q = q.next; - index--; - } - Node node = new Node(); - node.data = o; - node.next = null; - if (p == null) { - node.next = head; - head = node; - } else { - node.next = p.next; - p.next = node; - } - size++; - } - - @Override - public Object get(int index) { - if (index < 0 || index > size - 1) { - throw new IndexOutOfBoundsException(); - } - Node p = head; - while (index > 0) { - p = p.next; - index--; - } - return p.data; - } - - @Override - public Object remove(int index) { - if (index < 0 || index > size - 1) { - throw new IndexOutOfBoundsException(); - } - Node removeObj; - Node p = null; - Node q = head; - while (index > 0) { - p = q; - q = q.next; - index--; - } - if (p == null) { - removeObj = head; - head = head.next; - } else { - removeObj = p.next; - p.next = removeObj.next; - } - size--; - return removeObj.data; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object o) { - Node node = new Node(); - node.data = o; - - node.next = head; - - head = node; - size++; - } - - public void addLast(Object o) { - Node node = new Node(); - node.data = o; - - if (head == null) { - head = node; - } else { - Node p = head; - while (p.next != null) { - p = p.next; - } - p.next = node; - } - size++; - } - - public Object removeFirst() { - if (size < 1) { - throw new IndexOutOfBoundsException(); - } - Node removeObj = head; - head = head.next; - size--; - return removeObj.data; - } - - public Object removeLast() { - if (size < 1) { - throw new IndexOutOfBoundsException(); - } - Node removeObj; - if (head.next == null) { - removeObj = head; - head = null; - } else { - Node p = head; - while (p.next.next != null) { - p = p.next; - } - removeObj = p.next; - p.next = null; - } - size--; - return removeObj.data; - } - - public Iterator iterator() { - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator { - - Node curNode = head; - - @Override - public boolean hasNext() { - return curNode != null; - } - - @Override - public Object next() { - if (!hasNext()) { - throw new IndexOutOfBoundsException(); - } - Object object = curNode.data; - curNode = curNode.next; - return object; - } - - } -} diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/List.java b/group19/709960951/CodeLearning/src/com/coding/basic/List.java deleted file mode 100644 index e2f9e34aed..0000000000 --- a/group19/709960951/CodeLearning/src/com/coding/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding.basic; - -public interface List { - void add(Object o); - - void add(int index, Object o); - - Object get(int index); - - Object remove(int index); - - int size(); -} diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/Queue.java b/group19/709960951/CodeLearning/src/com/coding/basic/Queue.java deleted file mode 100644 index 8ef14734c7..0000000000 --- a/group19/709960951/CodeLearning/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList list = new LinkedList(); - - public void enQueue(Object o) { - list.addFirst(o); - } - - public Object deQueue() { - if (isEmpty()) { - throw new IndexOutOfBoundsException(); - } - Object object = list.removeLast(); - return object; - } - - public boolean isEmpty() { - return list.size() == 0; - } - - public int size() { - return list.size(); - } -} diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/Stack.java b/group19/709960951/CodeLearning/src/com/coding/basic/Stack.java deleted file mode 100644 index 046ce549f1..0000000000 --- a/group19/709960951/CodeLearning/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic; - - -public class Stack { - - private ArrayList list=new ArrayList(); - public void push(Object o) - { - list.add(o); - } - public Object pop() - { - if(isEmpty()) - { - throw new IndexOutOfBoundsException(); - } - return list.remove(list.size()-1); - } - public Object peak() - { - if(isEmpty()) - { - throw new IndexOutOfBoundsException(); - } - return list.get(list.size()-1); - } - - public boolean isEmpty() { - return list.size()==0; - } - - public int size() { - return list.size(); - } -} diff --git a/group19/972815123/src/com/coding/basic/ArrayList.java b/group19/972815123/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 3e8afb1ffc..0000000000 --- a/group19/972815123/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List, Iterator { - - private int size; - private Object[] data; - public ArrayList() { - data = new Object[10]; - } - - @Override - public void add(Object o) { - size = size(); - if(data.length <= size){ - grow(); - } - data[size] = o; - size++; - } - - /* (non-Javadoc) - * @see dataStructure.List#add(java.lang.Object, int) - * 在第index元素前插入元素 - */ - @Override - public void add(int index, Object o){ - if (index >= size()){ - return; - } - size = size(); - if(data.length <= size){ - grow(); - } - for(int i = size , len = size - index; i < len; i -- ){ - data[i] = data[i -1]; - } - data[index] = o; - size++; - } - - @Override - public Object get(int index) { - return data[index]; - } - - @Override - public int size() { - return size; - } - - @Override - public Object remove(int index) { - if (index >= size()){ - return null; - }else{ - Object o = data[index]; - for(int i = index; i < size; i ++){ - data[i] = data[i + 1]; - } - data[size] = null; - size--; - return o; - } - - } - - private void grow(){ - size = size(); - int length = 0; - if(size < 10000){ - length = size * 2; - }else{ - length = (int)(size * 1.5); - } - size = length; - - Object[] temData = new Object[length]; - for(int i = 0, j = data.length; i < j; i ++){ - temData[i] = data[i]; - } - data = temData; - } - - private int index = 0; - @Override - public boolean hasNext() { - return index < size; - } - - @Override - public Object next() { - index++; - return data[index - 1]; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder("["); - for(int i = 0; i < size; i++){ - sb.append(data[i].toString() + ","); - } - sb.append("]"); - return sb.toString(); - } - -} diff --git a/group19/972815123/src/com/coding/basic/BinaryTreeNode.java b/group19/972815123/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d6518342d4..0000000000 --- a/group19/972815123/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - Comparable co = (Comparable)o; - Comparable coData = (Comparable)data; - BinaryTreeNode result = null; - if(co.compareTo(data) > 0){ - if(null == right){ - right = new BinaryTreeNode(); - right.data = o; - result = right; - return right; - }else{ - right.insert(o); - } - }else{ - if(null == left){ - left = new BinaryTreeNode(); - left.data = o; - result = left; - return left; - }else{ - left.insert(o); - } - } - return result; - } -} diff --git a/group19/972815123/src/com/coding/basic/Iterator.java b/group19/972815123/src/com/coding/basic/Iterator.java deleted file mode 100644 index e7cbd474ec..0000000000 --- a/group19/972815123/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group19/972815123/src/com/coding/basic/LinkedList.java b/group19/972815123/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 04de763349..0000000000 --- a/group19/972815123/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List,Iterator { - - private Node head; - private Node last; - private int size = 0; - - public LinkedList() { - head = new Node(); - } - - @Override - public void add(Object o) { - Node newNode = new Node(); - Node last = head; - while(last.next != null){ - last = last.next; - } - last.next = newNode; - newNode.prev = last; - last = newNode; - size++; - } - - @Override - public void add(int index, Object o) { - Node newNode = new Node(); - Node indexNode = head ; - int i = 0; - while(i == index){ - indexNode = indexNode.next; - i++; - } - Node indexNextNode = indexNode.next; - indexNode.next = newNode; - newNode.prev = indexNode; - newNode.next = indexNextNode; - indexNextNode.prev = newNode; - size ++; - } - - @Override - public Object get(int index) { - Node indexNode = head; - int i = 0; - while(i == index){ - indexNode = indexNode.next; - i++; - } - return indexNode; - } - - @Override - public int size() { - return size; - } - - @Override - public Object remove(int index) { - Node indexNode = head ; - int i = 0; - while(i == index){ - - indexNode = indexNode.next; - i++; - } - Object o = indexNode.prev; - Node indexNextNode = indexNode.next; - Node indexPrevNode = indexNode.prev; - - indexNextNode.prev = indexPrevNode; - indexPrevNode.next = indexNextNode; - - indexNode.next = null; - indexNode.prev = null; - size--; - return o; - } - - public void addFirst(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = head; - head.prev = newNode; - head = newNode; - size ++; - } - public void addLast(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.prev = last; - last.next = newNode; - last = newNode; - size ++; - } - public Object removeFirst(){ - Node ret = head; - head = head.next; - head.prev = null; - size--; - return ret; - } - public Object removeLast(){ - Node ret = last; - last = last.prev; - last.next = null; - size--; - return ret; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - Node prev; - } - - private Node index = head; - @Override - public boolean hasNext() { - return index != null; - } - - @Override - public Object next() { - Node tem = index; - index = index.next; - return tem; - } -} diff --git a/group19/972815123/src/com/coding/basic/List.java b/group19/972815123/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group19/972815123/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group19/972815123/src/com/coding/basic/MainTest.java b/group19/972815123/src/com/coding/basic/MainTest.java deleted file mode 100644 index 504e2759e8..0000000000 --- a/group19/972815123/src/com/coding/basic/MainTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coding.basic; - -public class MainTest { - - public static void main(String[] args) { - ArrayList list = new ArrayList(); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add("this is the fifth"); - System.out.println(list); - System.out.println(list.size()); - System.out.println(list.get(3)); - - while(list.hasNext()){ - System.out.println(list.next()); - } - } - -} diff --git a/group19/972815123/src/com/coding/basic/Queue.java b/group19/972815123/src/com/coding/basic/Queue.java deleted file mode 100644 index 6f03f6052b..0000000000 --- a/group19/972815123/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coding.basic; - -public class Queue { - private LinkedList data; - private int size; - - public Queue(){ - data = new LinkedList(); - } - - public void enQueue(Object o){ - data.addLast(o); - size++; - } - - public Object deQueue(){ - size --; - return data.removeFirst(); - } - - public boolean isEmpty(){ - return size == 0; - } - - public int size(){ - return size; - } -} diff --git a/group19/972815123/src/com/coding/basic/Stack.java b/group19/972815123/src/com/coding/basic/Stack.java deleted file mode 100644 index fcfda97a71..0000000000 --- a/group19/972815123/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coding.basic; - -public class Stack { - -private ArrayList elementData = new ArrayList(); -private int size = 0; - - public void push(Object o){ - elementData.add(o); - size ++; - } - - public Object pop(){ - if(size > 0){ - size--; - return elementData.remove(size); - }else{ - return null; - } - } - - public Object peek(){ - return elementData.get(size); - } - public boolean isEmpty(){ - return size == 0; - } - public int size(){ - return size; - } -} diff --git a/group19/972815123/test.txt b/group19/972815123/test.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/group19/976180558/.gitignore b/group19/976180558/.gitignore deleted file mode 100644 index 3e2fcc7171..0000000000 --- a/group19/976180558/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group19/976180558/src/com/coding/basic/ArrayList.java b/group19/976180558/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 57412dcf7f..0000000000 --- a/group19/976180558/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group19/976180558/src/com/coding/basic/BinaryTreeNode.java b/group19/976180558/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 266eff3d56..0000000000 --- a/group19/976180558/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group19/976180558/src/com/coding/basic/Iterator.java b/group19/976180558/src/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/group19/976180558/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group19/976180558/src/com/coding/basic/LinkedList.java b/group19/976180558/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 1fd99bf26b..0000000000 --- a/group19/976180558/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group19/976180558/src/com/coding/basic/List.java b/group19/976180558/src/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/group19/976180558/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group19/976180558/src/com/coding/basic/Queue.java b/group19/976180558/src/com/coding/basic/Queue.java deleted file mode 100644 index 08d2d86b14..0000000000 --- a/group19/976180558/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group19/976180558/src/com/coding/basic/Stack.java b/group19/976180558/src/com/coding/basic/Stack.java deleted file mode 100644 index 4bfe28057f..0000000000 --- a/group19/976180558/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group19/group19.md b/group19/group19.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group19/group19.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group20/.gitignore b/group20/.gitignore deleted file mode 100644 index 389e717ef0..0000000000 --- a/group20/.gitignore +++ /dev/null @@ -1,43 +0,0 @@ -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ -target/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Intellij -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/dictionaries -.idea/libraries -.idea - -# Project generated files -.project -.settings -.classpath -.com -.metadata - -# Mac file -.DS_Store - -# Do not ignore .jar file -!*.jar diff --git a/group20/1040154728/1040154728Learning/src/SinglyLinkedList/LinkedList0.java b/group20/1040154728/1040154728Learning/src/SinglyLinkedList/LinkedList0.java deleted file mode 100644 index 7cdf1e7f26..0000000000 --- a/group20/1040154728/1040154728Learning/src/SinglyLinkedList/LinkedList0.java +++ /dev/null @@ -1,75 +0,0 @@ -package SinglyLinkedList; - -/** - * Created by Honoka on 2/16/2017. - */ -public class LinkedList0 { - //Node class represents a list node - private class Node - { - String value; - Node next; - /** - * Constructor - * @param val The element to store in this node. - * @param n The reference to the next node. - */ - Node (String val, Node n) - { - value = val; - next = n; - } - - /** - * Constructor - * @param val The element to store in this node. - */ - Node(String val) - { - value = val; - next = null; - } - } - //Reference to the first node in the list - private Node first = null; - /** - * Constructor - * Builds a linked list - */ - public LinkedList0() - { - //test - first = new Node("Apple"); - first.next = new Node("Peach"); - first.next.next = new Node("Kiwi"); - first = new Node("Blueberry",first); - - //Using an array to add elements into list - String[] fruits = {"Banana", "Cherry"}; - for (String f : fruits) - { - first = new Node(f, first); - } - } - /** - * print method - * traverses the list and prints all elements - */ - public void print() - { - Node reference = first; - while(reference != null) - { - System.out.println(reference.value + " "); - reference = reference.next; - } - } - - //Main test method - public static void main(String [] args) - { - LinkedList0 list = new LinkedList0(); - System.out.println("The elements inside this list are "); - list.print(); - } -} diff --git a/group20/1040154728/1040154728Learning/src/SinglyLinkedList2/LinkedList1.java b/group20/1040154728/1040154728Learning/src/SinglyLinkedList2/LinkedList1.java deleted file mode 100644 index 8c93bbc640..0000000000 --- a/group20/1040154728/1040154728Learning/src/SinglyLinkedList2/LinkedList1.java +++ /dev/null @@ -1,242 +0,0 @@ -package SinglyLinkedList2; -/** - * Created by Honoka on 2/16/2017. - */ -public class LinkedList1 { - private class Node - { - String value; - Node next; - - Node(String val, Node n) - { - value = val; - next = n; - } - Node(String val) - { - //Call the other(daddy(or sister(whatever))) constructor. - this(val, null); - } - } - - private Node first; // head - private Node last; //the last element in list - - public LinkedList1() - { - first = null; - last = null; - } - - /**This method checks to see - * if the list is empty - * @return true if list is empty - */ - public boolean isEmpty() - { - return first == null; - } - - /** - * size method returns the length of the list - * @return The number of the elements in the list - */ - public int size() - { - int counter = 0; - Node p = first; - while (p != null) - { - counter ++; - p = p.next; - } - return counter; - } - - /** - * add method add an element to the end of the list - * @param element the value to add - */ - public void add(String element) - { - if (isEmpty()) - { - //Obviously, add the element to the first position in the list - first = new Node(element); - last = first; - } - else - { - //add to the end of existing list - last.next = new Node(element); - last = last.next; - } - } - - /** - * add method, or you might call it insert method since it can - * add element to a specific position - * @param index The position at which to add the element - * @param element you should know what is this - */ - public void add (int index, String element) - { - if (index < 0 || index > size()) - { - String message = String.valueOf(index); - throw new IndexOutOfBoundsException(message); - } - - //index is at least 0 - if(index == 0) - { - //new element add to the head - first = new Node(element, first); - if (last == null) - { - last = first; - } - return; - } - //set a reference predecessor to point to the node that - //will be the predecessor of the new node - Node predecessor = first; - for (int k = 1; k <= index - 1; k++) - { - predecessor = predecessor.next; - } - //Splice in a node containing the new element - predecessor.next = new Node(element, predecessor.next); - - //if there is a new last element - if(predecessor.next.next == null) - last = predecessor.next; - } - - /** - * toString method, like print method, hopefully it will display the contents of the list - * @return say something I'm giving up on you( - */ - public String toString() - { - StringBuffer strBuilder = new StringBuffer(); - //Use p to walk down the list - Node p = first; - while (p != null) - { - strBuilder.append(p.value + "\n"); - p = p.next; - } - return strBuilder.toString(); - } - - /** - * remove method removes the element with the position you want - * @param index the position of the element that you want to remove - * @return the removed element - */ - public String remove (int index) - { - /* Index out of bounds */ - if (index < 0 || index >= size()) - { - String message = String.valueOf(index); - throw new IndexOutOfBoundsException(message); - } - String element = null; - if(index == 0) - { - //Removal of first item in the list - element = first.value; - first = first.next; - if (first == null) - { - last = null; - } - } - else - { - /* find the predecessor of the element to be removed */ - Node predecessor = first; - - /* Move predecessor forward index - 1 times */ - for (int k = 1; k <= index - 1; k++) - { - predecessor = predecessor.next; - /* Store the value to return */ - element = predecessor.next.value; - /* Route link around the node to be removed */ - predecessor.next = predecessor.next.next; - /* Check if predecessor is now last */ - if(predecessor.next == null) - { - last = predecessor; - } - } - } - return element; - } - - /** - * The remove method removes an element - * @param element the element to remove - * @return true if the remove succeeded - */ - public boolean remove(String element) - { - if (isEmpty()) - { - return false; - } - - if (element.equals(first.value)) - { - //Removal of first element in the list - first = first.next; - if(first == null) - { - last = null; - } - return true; - } - - /* Find the predecessor of the element to remove */ - Node predecessor = first; - while (predecessor.next != null && - !predecessor.next.value.equals(element)) - { - predecessor = predecessor.next; - } - /* predecessor.next == null OR predecessor.next.value is element */ - if(predecessor.next == null) - { - return false; - } - /* predecessor.next.value is element */ - predecessor.next = predecessor.next.next; - - /* check if predecessor is now last */ - if (predecessor.next == null) - { - last = predecessor; - } - return true; - } - - public static void main (String [] args) - { - LinkedList1 testList = new LinkedList1(); - testList.add("Apple"); - testList.add("Banana"); - testList.add(0,"Blueberry"); - testList.add(2,"Cherry"); - testList.add(4,"Peach"); - System.out.println("The list has : "); - System.out.println(testList); - testList.remove("Cherry"); - testList.remove(2); - System.out.println("The list has : "); - System.out.println(testList); - } -} diff --git a/group20/1040154728/1040154728Learning/src/honoka.md b/group20/1040154728/1040154728Learning/src/honoka.md deleted file mode 100644 index ff92a7f300..0000000000 --- a/group20/1040154728/1040154728Learning/src/honoka.md +++ /dev/null @@ -1,5 +0,0 @@ -##Honoka's blog link is down below. - -https://honokabiu.github.io/ - -Super simple... diff --git a/group20/1107837739/1107837739Learning/lib/hamcrest-core-1.3.jar b/group20/1107837739/1107837739Learning/lib/hamcrest-core-1.3.jar deleted file mode 100644 index 9d5fe16e3dd37ebe79a36f61f5d0e1a69a653a8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45024 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 UgpPtD2z>DYYp}SJr5?)v0beu;=l}o! diff --git a/group20/1107837739/1107837739Learning/lib/junit-4.12.jar b/group20/1107837739/1107837739Learning/lib/junit-4.12.jar deleted file mode 100644 index 3a7fc266c3e32283a2b21fe12166ebdcc33a1da1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314932 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

&R7;REBZd0NaNVcN6Eoy zzIyDIY@)aZyH0yJ8|zo4qI|P!k>nhi`Zs+K#eHSn4BvU z2F_MUiEGJpV~7jUWy?88U(!)p$SG*0Bt7)(WlFJN4P%Gsr2*ku;Ebl(GCe4tUG__< zk5Jg)60yMZQF%h7v_P2l4Gopa7w|D-hwRiRDn&GL9L_gtIFFZqVvEhaZDxb zntgQ!TPExEQL3=8-#I0_AHue9FMDrLgTXUaCdhynqpSSkp?`X5oI5dEIDIf{D@gvQ7^yh!n3poDBZ>f zkzY8ixg6vu@(ZrgefZV!s=Y*r!iKI!DYEy_#NT35br2bWn`s~f>YX9~s!RG&ZfX)F zWdyq%Zj@O8twnz90g}K+m&sXV(WUzW+4+Vws-T*fHFwLuFgd6C6`@qbO^X-^l*&d4 zGqP;;5++*!GJ9B#d)8YS1KKr033)JZEoNTN_r%9C!)vCSuoVY=zs8R%AhEB;%o?r4 z@g`d(V!=b8((9j{*gs~`+PcO3^l27NpXuTM-PHdw3sUC43?u4~Vf?`mNw#0DQkDS@ z3?l@Sfl;NW_BbfBqzXqwzPGZJ;5J_mJfA%FW~;5j3D6L0DL;P51{z_MPp5nx(x z@mUvp$h^`u@BVmuL+b%bK2wZoi01s}x^x6QTp{ zq%({Mu*6(s9GYq9pH!7h8vJo>Vjr1a6|#n!(n3 z2EE2bHizE4-{jzoM%_#(r@&b%l&^7=Z1jg(asRO9{Uh>!bGUw2LxeZlo+46Av-D2UtPC| zS@o^iL+O6^gOk46AtK*m8;P53AC5M!XU3;%m$`5Xq;Pd@SHD)5$kDV3{e3ycr7?{f zSGs&BLefL6Mc+`Ff@C*%T5hbFDN7*RY36h#1U@yT3S$Zd$N;=Y)T;6G}Z+#Wff$%zzxHoqN?xKrD2S zm4nNXk^})4&&tk0y5glciG5XZ(YU{km@(2Gu7iNQ=pE?*Az|xK$bSHeE80?+!F-qz zmQLKkIfYK^0y*|7fxGH{zb9$<;4p?61P#eWs^%1r9i-GUDU<`JWk#ivpc!z;8I|y|YL|5}UEYczRGv1^8X}V|wSqiim zY_HuvZ~^Y5cAu+*FB{1`Eh^*o^NOErSMGPN zR@lNcxrwN`);G_Tm!wdxHJpW0$`u||%NhoVd9d~H~DI5IqN zl*nal;=9X&?UOXD--7@-<5Xv^3(%zEsFAlNlc=?jnA2EtIT5q3p;6q=pSgG)LmCkm z!AciR@}VttRv@gJmiQ&06h#8;^V37uzbIPOo`e6Swb!QoNU3=4=C#Sg6e51wO8KZ2 zjL;C5@uJHjG*2e&xtPPl5-Hg6csToxTKx;o_foIZkl%vQEw;@!>bd)G@{koD?Sh0k zJzlJKja$dK>n7{Bwrn-<1%hS3KL_#%Abe89iDjwMY%`o1LM+Ozo{4t!TV`iGV3o)C zK*lwh9sT9fv!EA|6_kZ;ytWm5_5(y10iPJsQN$}%Bh)t$K z`x=iXRm<}u2>VW2y}Vwy?!j`u&T{?!Zk@M#+ZDtcB`&8>u>hkWjsgg=4sF@{Aw=t!{|6${0r&_YIRh+57|1EDdf#`Zdi((va3 zIyh0R!TW;>6Ud|AP(K1002ttDPQMlj4q7ro;8VixiH>aDIetD~WKTZd|1ZwoF+37( z+ZOJyzUs5z{hfF3XW!@CbAQy2`dPK+nrqH6 z#vJoy-R%>zhEm+1GdAVKNZKTUKMt1jPDzwD4Ck@&Mv8;DAolz#-*mbO){_Yh6p6aN z8WkuC+Vc8bE7>_iT z^S5{fNFosHGb8;fISub4r8=rX{$=+JkvR!h+E|+5V-1gJoDN~Z0u$nWvsAq5h zD4hnI7IfmW(p7oLl%e!hHys?(Z}Mj)SwC6#0<{9 zcxIC@GDAt2$}EB1xktfq%7+!W*=9u3Z|<+`Q6IUeCX?{rD}Iga9hqV`at&%wc`7Q+ zM&n`ME_v1%B7ITO5!Exe;W3@U!oajU9JUDGd>AU1M^sSf0Iaf|xin6ZK9rw`qzWvb z#y}tJX^90+^^+->o6O0)Co)L23Z;y269D{9Pi#+jr{b?cSCJjfi8B}CeBya(%~Q?Q zn|z?EpCRV(x=3f_tv+A&FeG5+dzmF6BKeB1wxJp}E(-jRX_4~kPqey&PjG<{Zem)u zx??b{c}5BUazgViu%{`>Euhq=m$r>hB{#?*v$^z+QDPzQ0@vbz$xm@}su}=MRArGNsM0cWtWwYmOW&kr zQFoWfwE9S?f8(%UqwEe18Z-JJYXb>a4UrU59eRrFAwE&FL)gO*Uy_e8pWxwAn9<2* z(7O4x3zfec?o;2=d^N6N(fi*hz(1E_WR1vw9M~|H0|znx=luMSOY#33PbtaTp)ex) zY*{y4vgH#dT`PeGC7=%=*ObFh_?1cQA}(|`HYyRSJax@(&I{FRCIMfE67wZBbkdtd{8~Gt9HnE(Yr? zlaPEDJV_RdyD=6jH0%*%+78BSHA-oUIn?~`FYp(zq#%ZC)ZHsR*q4i%V1q7g9>mm6 zcTN#j^fV#oHd$ z+d`<@&Tg@56w%|h&vQJ$*nKtzXd?()%zp?_mt4&_ssDRWO!r!+)B?LeBw%3B{a<#2 z|IKwr$NcGW5k)^#Y?@&_qg;&;H`QC^=#$b!lN=i>-K5!G?XL6Dhsc?e7dr z*vM6hliH4-P2{_-X@lLa|zY>0$wosZu#Zwtx2#C%NtEsRe)*)n2mRfR!J z7z9mQvc_3AsM?kA@iRIQ67H^yRd({a8%CT+V-qhCx~RVa zyXzGMlAjz)tO3zazv29_>3X~7##cs0>7QvhVxCOG+p`&Kr>i*UCDrX&VOM&ZH--~= z{0$3lTt-JXgKq{so@K2W#}sqT+_R>=z7cXw7NS_$-gHkk3?Iwtwc2~Nrwor<@Vv^? zx^W1;@7E`8UO7Z&>(fhPMLDrOseb$|oBlyLr4FTH?t$e+A=0N$1pn#c{58hm_}9#8 zwfZkN6jjuBJshq}2HNIeAv^RH6LiGX58FkMB>DB(m$0Fvrj1+Sf1Lon0@czyZRe+)rvi5d{S@Oo&Pnp<*x= zM^TSTdFdbk4F;KqvuaO{M77A^mSu7hid}v>2wvR3vH(3?%D9ccV2>i^_M|Ps?4~N> z_~v^6hRQ^Lr1u$kZPvl8G*GZjz43i)ei`+9O#yT%YL@93IJ=ofE4xb8U?z`eq`2Mv z2`=9qU96n_eNDiVN>lyOHLQx3#j;FV2<;5A^t$luZj?!fBDaxd2<}g|{SK>=YID1x zv)f>9a4NPmk~YOWo(&!X#50*M*r1JuB_Dvz8ajN}yPJake0SLS<+No0-1#>_roQFJN zjRjIhF?rX<3HMc-SOqZ!sg!^^$6cDhymOE7U0rHmd6F%>Bj5Fc&G5<3`SLFFDag@A z=0q|O?N;}G!)^xh5|#u&q3H6w8{u$}$`EwT?p3Vj2%nLfLIU#xZXsf$d1evLB#`>NN{|45sz1zXJ! zEx63Rnj{#sp<{U_QBTRr9hDIte@7Ss-{KkbnB}X8PCuFTY#ppNYS!`%G#^?TH|Hqc zSlXyy%PMo>X;^B!EH+>NF--T&4e4)I?_ggD3>NQbJ5=w=U7~Ij4dgu49}W|f?J2qr zlKsA4XKr|X4OAgfU&{c@zH>LszPrgjD(PVMJop?rC~CEd5JTgi#NLu=C=*1nefv$| z)$Ij(ud&~IRNki7-m0*m5`I!`EJV9k=VDVWDl2JsT#}&WL*Pay&;kZ zh<1wt8_8Ev=vhq20ID4p@>zPzpR_8z67xtWyk-$-F;)F^9V_aILdt=5hU9x})pkmi zeetb}Sae_-V)b+qz3En})ih8YQyuXbd<1WK`!ekqQxc&Ur1#?!9Tb(|FXR=CDq|;~ z`w6^SI~zd-QoItairUSR%eH+)kkrZL#t`Q#rmQxbm^P-~jDQswlCV5Fz#8PaG=Wcz zZ71a6!Q3ZtbUdSZ+v26;AAny1J|N2MJ~LdQX_kN;FDj=>k5AI4PFzwyAd1Mor37ZdevCQ#!Y=pWjIKg(xyt=nWM7 z%%-3(Z~P^$AYg=TS8&a!f$mH*eoWCkUQtEA#GzfJD(<`zCaJmz`wj7DHi}wD**A@| zS=#v4=MkT7ti^6Dq`59rrq>}*(aL(X^-r9JM2Z3`wBbSW4^VP9=SMH+poCL-zRKh9 z6Udmtw6mLv>Zzh{6sF3VgIP4#TH=hYW^nhetvcfSzZHrYlLlWUa8|Pi18C6ord}EZ z`&^6|DVw53*21h=TclN&-Bo;7+?#NDl?G+!rcIm;30)1yDHp{??=U?n4+6f=URSQm z@s2CMn#MYLUY*e2xQ-liNXDwrX>oh!swtK=5q#rQ-I=cVo}jAys>#}$yO}_O(Z(Az zGFl|2HDVU&y^PwBmQXyJIM!Iklxbj(I=EgfI3Ifcy^B_MdmR= zd7y0gHt6Ay?&2|@EpgeHY8K6UPkTsuG^s0+*gAf18E@9W+EqYgOtlVT> zyHR5cr9DDH8=bn1JoKG>;}HGFv<8YvrduA=KFr1RCy1aZzzqz_lCE-z-22R|BS>SzEpF z+Ll(UiEENDAhVCc2AFbXKQUXLiNgKNIi@Cj z$v>0oO-}Q6WJ)_0Brsk+RwOBV7(pnunlwZ<9OaPIyq@F*3LUpD-=r1+Ba!r5V|~;N zn1Ku_F$5VR5A0WOMg0S0mShcO=PQOBueD!8=0HJMw$aXnM3CGpeA{QU5;+y-V0GqJ zEP;N-al0xZ?4w|%{0;Z5LKlYNe4Lt5G?8CDvI~^^Sh=FrUO=kepe}QW;K!j;OsPf+ zrEm`Br5YBKMtiVf1_}YZm#cp11yLO18iMce|BdARu}9e8Sy;{j9?>}Pga4n7>aQ8c zzlvcO8Re5obp&Z+b!QczVOwEbAEc`g}d!j6Rxw{hR?$cnAzan(A?v7y_UAIVj&^ zrVj3!M_9PSD}#{D8iPZ4JPmLQ{UhyoDk+6sa*oaPJcF~EGvpZ|n9**_9_ulBbxOyz zmprd(UmM-6A@Mb4TG!4G4z-=#4g-^}Xc)bzQ)_9Vs{Nv_y!}cbo#2==gq3|p_e+H$ zdvh^qh%T!DoTY)O5VceTYY*IKt9*I~b+;(d={j1ald6rqz`)D@Oucv3noZd)pR?Q5#cnNubF?eNlK%EJqCO(!fu9GdNwB7THnNPN$F< zY(N~b(YoVqi6VE(R>}H{6^6B?F*ycZ`axvNzNm?-hnD;#_am=^6dPxIYv6$G0_%41 zj#DQq$b@5t z%0yZ(O)5JfJ^^En23CfUMkLd5D{WmT8;C1x1o|Y}y!joan?T-dD5E{E5K1R?Czk0g z<1ZE6H54#bB%k`zN5Xr5XCe(-GG)w{P@g+Zt#%hW-BFpCGbQ1pxF&FfVW4_v446Ih zgzulo8-BH8E+UpnN1<^Je1!*q_hIbal8T0mu#lVHBEj_-s)N8yJ( ziTQJHOn-`4E<;54TrFMoD?Yzd&pDu989gT#l}B#R?3KunyEm@9l?y|OhV~;FFfH~K zOH11JM~40mSNP-dxGGhAM?Y(<{OldfuN!8)LZA}+5{VtIu*9RP9kb-f6n3h`zOBWqUDHS7K7dR>iJu4OH;BQ)j4{L}rvue{OAyh-&}-c7?cUDz~&Q=Ny|BgIl1F z`{s@Dg=Msddymyo7evarsp zC!KE$z}-(rV|m~cy?_qKCW(@QA^1u5HCdrtAiH}mK^nFrp75CrdR=&}>l`vz4L^FA zq@2b=q4x`XEMm-zWL1GfNE&;x4CI7-5~F<3kta0?=?Th%k0b7HCPO9hk#I~$KKR7{{zyX}QOVlY8 z-|+f4oxE1R+w+9m!MIye>|i->h-%a=-No)U)uYHZ5xOT)9irM_hG7~A(jxv@#PU$4 zla=O~qYpIu9=m~5&jCT#aHy1Lf=evQaa(080cq5nZ?a4xyqps^iN!h=80~YnMO5RH z5jt3;+k`_S(?*E6(HRO*&V0r)>9dqr*EM3E8e;13(~<6-5mt9;vnHeiT;g0p)P!p`l|(`s%C;x;togWOKOiFI!V zQJaVK3@{7VV*U%u&o4N^oW=vx69;=yT>OzX^= z7TJ##71?`&grY%FZxwLG7gWo9(w%){+$HGsO;;xE2W?GrN{W-r0DLK)MoP7dx!;b* zQyX62jwcxSzxlkw>@ae{Kb!y3u*(ZrqB(0j@8iXP@@axdv3BK97^dL>UKXrAZXacCMH-ss_+STe}f`g=6wh`~vfW>8!Y^R%ijHwv1ax zS7ErSH8^ihVb#|+?B5KoV5#h;72lS&c>gVGEJ{gP@o)ICOrX)Ecx{kMFp8l(^l> z&ed;!qc;B>JPZrF4mz-ItpGxWg#W1^`eU)_0wj_CiI*oU>;6#$@Xn{uZQ5EuR1tv| zh_2a~?9K|f*HMN`{_M4J-?dnmYY}egob=6mr^!wrxdQ8&4wYV zv+vNZ&>{DQxAGdXVdE!cij(Cpp_)`$otk;-y3#O-%|j^bWo}hsPmFEeBsqqIImraNBYB{&<>R z&Ca3GPJL6$cnlIY}8I=%Btb$XVqnEr!PCvpp;6sXg z6Sk#JsU#aH&w9W!jDEy_Lm-WJxw94GjX_x_Xr5eIFOWLiV#_g1=SkLpt;hEL8~*$! zsD8-n)+qq9i7ha&2>w%0DgC1u{bx-109zg~AO~a7y6LKGU9JCy%=0j#W>0w{d8>pP zbe1o5z0TG|xeoqR_(NI{iRX`N$eyvT;DC(~Q(|g*YHE7ybgSDZ-mj?fgEGNT0AQ!49XhL`g(Xyp5(9*v#O5ISJlC2sdV9FJdub`mi3t75m4%vT4P% zf4h$16`}%Tb?AyehxL&YAkK>P1A%*NE;;eC1qMmR2Tvb95nfO=UODBIJBN%4`&u?@ zM>RLvFBD(W2PfA)hwt|4bm8BVP~;(mrfl6g)Rl2uSga4?S^)*43i24e3bLI=hHokl z&a(AN-y|v;FQ=eF7ia^qhsR8+!@tAPqCilo$A3rRvKlzU>+*BakN1c$qFK8~1(UFz zu^sLfZ7Et+7*gxoiCc7QzhYk5&o%x@&6!GKrWjt>QZKxe*B&{Umc=3*+lTS5J&%qF zM=%F4ua5xR1M2^D8n$-M7N!UI5V-Gz(ZIG;jzJ zRFR$liZ7wD(wbw2l3bEhXSH)!l*~-~Uv9)Xw`7f=ivu6~O`ooKkNKu#fr7Z$+)sE0 z!s4IFGG=0iEj%o7m->Hf@uNVb4={1M_8EYMouZGZ5z(5?)fA{Wv`fl_3ZRnS+tRK?aU9x zwA{Iz6zOx5E2Q(Nu4MN7qOV>!FD)*{-LFX~d`D7`e%}t#LD}!It`n|N!Q0v7qzlpk znDTm4S{S)&hURIFt`NdJ)Ux$jTpLJ_Ast2%#?@cZM$1*WUWOpu^ts>yF#^+5sGp2u zD$Ua&=wL~;Nmst((C}U@p`(w(x(Rb!73_5OnVv|LfR@*Ewy@lb%nR8bXRL_(ewY^u zrU?{T9j67#Ms=u>BHE~Ou}v$MhwQIztsI>}ACjxqQ$xpi$5N}tvO3yVB5*m> zKn?GD7%nbXCuF0*D!I(xys#AbL3-Y<^~gS8w)xw_Yl2ZrDDE}Cxhp0>Sf==sC_$>- zh7hu>mI5Yw(i);DRK&ZSvDVHH%7}ijGDLYnZUM3ZJ3khR1$oCWCa3&I+I#D^xQTwK z9Fb+IG%oq18+MP(QKCN|tNKcmiRsb6IHm6D-R&vpWTE_^SN>MXL(ig_s2c3;prUkJ za5m5}?u74s$erktEMt?O+YOCNP>wX@qBF?4<~ApdCxn44#kxkG6!frgQiI{s^f+&k z>D~7bRVv>z*FOwZ92$f4e&lcGQ3t7IH}Cmb7Bi22MwiPUiU(8k^Y?4Xtcy*N3fDkX z3K6diF#ZW)&x%g--`ssBEZ)_3?4FN+*!i;O=PWo2xL?mvv9Umg$DQRm(rs5QQ` zVtzGoC>WvkWz#NA^)T_AgwNw%JY>YyY9Q!2_s4ZxZT zbC(lB%Q2hOM531{8;q>VAC*Q{V+e3UK3k3PY;o7?8+Q)|>89EX2qM!lhWGK16=K#i zgO}Zko9Q#wS~-w~7G#6oqe1bO9#|*ZLb|Q_^i2d$@i$5dR{<55>A3UNtQrj(3;GD0_R z1k&Q7BxJ7*U8D&Hc$J=pADq+8!`v;lQB)b>=UI?Ji6Pl3#j5*yKeT(>!nP5D^)qSS z(gGNAwy(KfCahEYtZixR)!8}_4kW}&38koqk&y{a8YuS1ab8pV<^$+u*|_WFqcYxh z)C}uPmi02y?adT4svqpkjW!-bl$~(IoW1g)HU`Hg_=?+QDKo25OM$LsDhd&g6&(Q6 zMA3vo#X*J)ZZ57en8SEt*P+&_YV#arT+IQwkQIF>L%!j2&c)FT_yH72lAmRBl?^D> z_B&0?jQj|Darij(qp>#b0s>a(G#N7mlDg_F%nR9RGVtc1E{iIzryW^_JigY0Z%Hva z1aww~`R~R&-Te8MB?apiga#(9Rq?dZ2Mc2DiiNz<>DWUY^uJ~U^^mTA-SW}FYM9u_ zr&hKjt;;q#|QZp=Eii2fnsV1j(17 zANzPuIx`q3<^I0Kx_1XDz)9OUj?9>>X_X{x;dYrxb3uk+utBY3t4%_=4aV2sqvi*q z2M~%kVUg%04e8-J^b*F>f}O1m1g|L#1a?Sc<<_8ZaKN=Y9l|XK(;P1*Dn_cZG3bmg zsyK(II(*!Nr|m+k2WvTG*Ot6v^vo$dDu?1|i9Z@o)Zm)9*zN~wyx}I7dWz{B`c$HI zX*7Qwy*Z~VR3j?jrU?%ud6vbciXwE5!0!f(9TZ%{&{xB*c)8`pu#1R3Cb=h*d_fx* z``xny8FN@?akWWMA@)UAlk%O2v=;X}_vMj~^#bH?$6sl9zb+qOL2vRBHevEQM$EM9 zG8etD)n~AE(H2~1t?|DD8Iyqd8%VPqoD8v9S@(dgOp5Ma(N<+`$sc;=D9z0p5nL)L zD+qN$Bf<43UzFqp19Z`E96%oxeso;A(WLuxsAw`p&#m|3LwDN1%+V%!*so01MXW7S zh!aO=a0uIA4;mU2Zk~`KfOw(r+;z649PC);vkB-3?pbQb!Cpi(wn0inTvm|p+)>eF z3k{-$*(~qo_BQ0RIT{^)VN+zp*xLD2+uD0>BmB4ryuHJq+ldcH>?Ub6_>c3C~OFHsG;{M{Yd`@J0DUzY@^$e!X*mZSeo9;|*cL ztRbk_c=rf*#wpy7s@9%uGc&E5D0B?I>NC{4V8G0(F?L;AANw2a;R6#v!!&3#)%u%D zTz17ZMit&&i>PlO?>yqhQdVK^=rQisMK*C(B1{sIFJ5e#OGOGIyI>2|KZ3EB~+_q_0H{*B7 zOMT}ypeX*?ET2h1F@XFwX%KC14NMenGy8@WK{S$p850>#Y~e8{bvSyYa02Ov+^w^D zxP=2>gl0ae(C*fqL6CHeQZUG`MpRstH*O!i9JA7;WF@?!56kNAt+ULk?$tBxD!#O< z_rD?2e_p=?G24t^z-Ay6*kS&sJ(mB+*YBU*L9()}9dMh2Pi7mNgREt-Lbo(52zF=m zX)qW8iAqF}v8QFFGD8< zylnT0ZPvyBf&FKbVgEoyw04_KzRfN|e;-opx=*~QRQI?^1_MoKIW}adDABzDnk13R zjdjaMSnq^5lhwA_%}0~WoDPEVK(j@iHVOBk7RBYGM#3&ii2Ws;?+4lZsu@GeTz8&` zP85n2gS>{EM!Coc%RYz_$A6fCYS^^qnS)M}YrMVI91%KA02V#5f{ zhLL&7624ISVL%pE2ihD@JsvrcJ4=PiVmZ$2NpWz*fKz#*(>KCZ-UIQhv4(6Bhm29< zXQhL}COg2S;OCq`NbAq&Q=Dm`c7V-ZNFJ_tI1>YRh0TuP&wIv#i~LYLGH6C(i3&g^}YRquxgzSp@_Pb@a#mp9+k8p+I$N-+V!dij#I4M!av zkDnwvprU8eLWS>mEWSuCNp|FXgFC9mFFg9CukfLv#b&`)9_+8Kk+(|elKL*1fMJdq zq*LSpol1t3o3LQU;(d)`nG2W@T0I=HD!4C!Yh_`}3YuRt(aHB~>~Ybd?W*1N4BzZw z(kg0(%Itq;hVHUj@cp;Ru&*rkaX*1^yh{r&Uv z+#lT^pKjnbAx&=t+{W2tc$#jZsL|KZ)vzv%@LHAQ(Hy4gR;1?u_9_(VpDpr}Bmy@b zPtgL?fg!|ia`WM=BuV#~>7ZRkrB1sn+mTKQ_fachA1B1kNqAs1_70#e7*_g2qo__)b#eDKPsaiI&fT z2a0p8bw_z%(}G|vV6e+yC;D3Jt_;BNY`z7vFnlk&>H_ zz96kbQFfzeyx84O5Y4p=B`U7%3?!V2lC2DmU*}I}ZD^2pliFgqO&)Y>)#3RLM z`%D>r%Lw7)G;jZFCC)H#j{hfy{QuW6^p~1HS$X}>W*OehA~pvZt73(#;@}xJSDe5& z_fJ7VQt@#z_!5gx)s2!ZOl(@~s^j{EigE5cV9&tCGKoVQ;5F6R>r)ds>Dh0OZ{zBp zzRXw|BDAt<)*Bcs_Tg@@&N4d00(Qg1v;8H6Nw-ay!m&~UMWSE(c~a7A?>NxMzA0Yu z0~i|WWw@WPzVq_}k4_lN@$&4)=>Db_B%d$vz(97G3H#A-mmD0@~k^4P~R=z@WQzb#p++~xgWMe}n?L)1{&FAOB0qC%wb$R~A zOdh#FN1@^4b#6cA3r}$4DWHWOzpudR0mnDVi@p)N3(^JU15HEXAerhc6l8rD>gHp3j( z4%m}=pEW}uM6B}FJGdD&{QNv8-4t;I=lK@eS?9F=SVwH1QJ#__8)HpNdM+zrb% zS#h^9h$@AHjq{0vu2Ih`gy302aML6RI4GPbieEFx#irH#Z*vfL8dh|pz!UHU_SOHp zs)FSo6nODplWnHj8s^JNbbAojNprT8uo3PcXAtEHNf}VR1Fgj}r*ST+7q-x^pIN(q z!+Mh;!Si9}zLCDe{G1RP7fqzAmoz)d0#4dodpnu>zW)9V-@}pPQh?I&)sb<40a+Zc z&;b)OvA-=MlX0UjC}N$8468|YUP@IKu&8^*NFsfHRARB<1HdBP{iO_d=_~7A&KROI z>aZO3vxC;Vzj~d`4SxMrR8>VrpQGirz%~^uv(s_CDX#}qnA0i3hkQP_sc{@`R?{q* z**Q6Aa{T8q^@c8!I?dffQdWcoZDvi}qdzm%DYKtcc51sB?fkuQ`LCNMB@~so22tz> zeEIsWSqWyRfKz8HXRM*qeii>2BPVUNZbE(!sw*avfRjrxxPEgetjsWfnT@Ii%n)sB z>Z{x?8igXv-!Th}*G|h1xE>j}YKanIZ02`)9q8E|+Pk8JqEdLX&MHUw%2|!nDf`e~ zHvTWHW~zg{@K21zyKu^3ffHcP?ohHSm-yaj~kj*gZXnKbp z!z+M;CH68mdiHBQk%h)tW+pjg=o zh|X}dpMJ+EeY9Xv*dSph)MaX!1>EOuxCRw8ib$b^%MZhYE)>rItw^Nee@nAHGx1T))E zx2m*8bl(RF7>}0}PI}$$mAqHyRGtC{GaYQ^DZE(RHkd7PP}8K|zpV62l%x6IH0d$| z_ch6mYn0hlV@)-5t1%lJcUCQ{IS(g!eK1_8%BmZ@2Gtc`S352O5cn~Z*_qED;g;%b-YNBmhJ9<1y{D`KZG+QuhKoeYY6khK<|F@XZdy8m6|s6QGqxY9=$i!~t|z zwp}gii3sASpl`IB5>f?hb2A4uSOQqE9h#NgRa(D`%A)h4f-qmPt zD_O9EQe!*eq+CiU%~o8gJ>_sG$xJfJ?`L-C?R!0v#+t{FgI>0%CvT3MEo;V9Uo%d)9&89H`+Smq*Iwx3~o z78li`NM$CT$}c-FvyMEu-n8J`_Q{x^3`d0UWi8qxTw7ua3H77tEXJj1iAB(evFM~4 zqJ~59%`=4HfVOT`?6U%gG5noAOaIKXU80)v{_Mu;9i!?WDLh(QqK@l`BLU-aQeJ3h zha)FNfW~3r&pa6xtsmGk*-DvthR$X>-HQ$Yle9$Fwj%Lp!$DvV%l!#HUg?kmY7;iT zoQIzJrLQ?spC6LIK4*=JS4c;`SYM!sd3rWwickC`y@RW)CYW+s8KD5>+Tl(w4;)`j zcmIkgj|EGNLKf1paBBFNs^8i%nFH)pA4x0wBU4)26l3?IG8ajAq#OI!J{B(#N43Ng za{kk&z$c3?kqbb=k1EWp;_NVZNU(?YfwKOEejWOIqhs9ZJYJ4K)M^W+kvPE?h(MCA zE#o-8a!A}>ES*vppe%4?M{Eb%Sk4d;ddeVciQCvd6^;*T!jJ!XA4?>VIj!g?AC^qK zU^hgd)d;RZkHtQ_H!Ng!FV@7I7C~UB@y&?_q!2>eK65NYtag!0jspg!8>9Utr`FrV zFe)(tmGE_eRjL1W{**L~^7{QPV{lf@yU#K{TDbEOc~htx(>K8vq|5y5iQJhZQgbzs zAM@aN1S}lh>zrmp&jJ1W(hob-F%h*-@bMzV{@}Jw&Ntf$EJGe-p-{)I@&;m;;lFV@ z)b;I+%k6nPIdEf@FZL$rKPxdk7C&^z5VF-gWc2WE+eMuF_%fd1H(VsDbNzkH{7+qE zgIe%{0L(n`K+|uY|1tCY4do{JQxW|e=vHe$r<3W~}y29b%5eT^3Nof@;%lzrq%djoH~qI1035(uvxLX{)0mfc0% zNWd-Htx*2aMe&z2wx>C{O|qya-TP-ccKF!ki-*mQP0-wFM75svUoUEu67V)4v1ny ztPJT&o#JJyCI*O0f>+9R=5(yM_RS0rV}@|=O?agkxw8_&W(>sx9Iw;7kFn_5RN7*U zurBMgT)*zOd9Vd`Le|cWk|b-Jm1jM9o9cZwZbk|Ohmsz3$k#2j7pi*d7;RDi}Mc9$Mh=W4Of1)M}B1#K;Jb@zgy zZJ)V^iF3hOGn05Cs128JgOohvAWm*+bi25BB$IAWxpSR+G^ z{wAJX#t(Bk%rf(i76P*KVOl)PRi`ln9f=%yinIkG#6opP~q^_5+4H{%b$S$%ys1*?gKOxiNma+Q}qgz1V<^wfA^ zpsq9OV&u$k8K|BFE|V z!8h^~!6JwEzw>+ddEk$e;SHwu043$TMfC+aOjH0+P9ZMH7NnAFgazT7_rs6)z1#rS zlXnKf<|TH4XH0_a-&lDwzy9Sb*|*>iPEa^l`aD}*F2TALA}M&yFo0Y*<#aydYY$iZ&`W|RV(x>eoP($pDzu<)BM}844DHhFO zhx>@+gKAcc!Gy#WW>h5%VLRLvsS`}P{HAM<78l8+$d}@df5nFQ;U6hM6#Pk3XAqo> zve-)HoU+Iy6(O^DcEmA*FWDS&m(SxhErKzE`#FdrmnN0MMA)^EHq&2Tap0AxbJ}?O z6ve;DsUhwDK#^eHhA0-F!sqW&r9XK_zP>&61=xS(|F3&^)_>GBe-tbWKvKIgY3WkU z99{5LOgGpDPzl^iG8BX;A)|)($pgQmu~T?#;UVy(R`FXvxcOcne-FONcV<}Fp-@^I zF6O7H_R{06_WPIVY5h+*1!s)F!3_&PDu2Ri5*72ux>Ir_eSXj6@sAYot2HWyojhEKt9bkpBl8y}jPj2jWX(QjP0r|W1~*&gThT$s?F7?WE-uw( zNy|~IZ!5_jgisSR<#F3so+LUq?i%G;`wWn7_rf$==g}LzOskz1>4S#SX9usaMBJgT zY08>xs#!(tDuJy9m?gZQsqxmJcoud&?d=DJ!SVxDzgR&@Op%WD+U z&YHI@45}1lk&DaMP0t3@(=*qT-x=~wj}r^$b&5P-21t@S)n``#6Njuzk8%7lFO&W& zdE9#>X-7HR=0?W#ISPn*$^I zI~X+3^JPbzkdD&Ou&=-I`qydaypM0!w@(}cYEfJrNNhyb$XxA?S|vt@jy97gzXJr= zgVeS&Hl+85nP^q~4heh;hNl4VgKhX)r>G0$Tp!mtH^6X1NAu- zcR_`}!3X?{?;XCxtH;24 z$VV_3Tq!*J^;v=B<&}X*nmbGw5BEmI(#Md6#T}AiWu0r&^uMsTE+F;>nQUa!^$+Z= zk3rl02efepG>qwqD#iVTmrmHuZkdvLDFEDvekxJndt3*{F?n1Uv2R~Ftu|HEo=U~8 zbbRz)cepB!ZW~)hopoB9K_SHSKt{AnoAWE@T2GzgrdRBjfpnqG57q2t^S7|deE!S7 zur~sfdiptQud+Rn2dtD2N01+1aJE!V?7m?27Y~?(jaGT2d^}at&=_h`|!VtWk zL9@m`)K=%pm#FE0}MLR}`#71g|Iin9G>1nw0Zc# zsF?vkzIBf+RXQgw%-DIfw;A9W2iIJx47B9Ucf6Q%i>FXDM#p2ANZGm;{x1rE z3vG<&9uFNzB$X{JI$-v$NJg+AYXjli9I#c+o#CvthVlZA(W0{-NWTb9wKQC2LXPu5 z*8PJmJ~Q9YR&i>CiVy4O!NbK?dR^b-a446({HVCcwn21S{4(TYVy-?V*ZgEm_lP2UK z*P^)bet=JCa|=%1^B2D7KV*?w&OL+bGm0-zngAJqJ=i9=1|71FFzUi6`tWmRAOnEZ zEYCnze&M*EwBt=ZPm6#ne%j=WwoI{0;()t6euC4cxn>K1mQBbo&g{Ek9tAEye*^#5 zJXFl2P5XzBlm^;i(f{A{DgTO!M60X==i?E1<>swB;UDxUl7!agaFD4*Jg5lrg^Hw* zk~1oNT-oII%sV5k?ScpJZ`gSVZ+rf1>aE8~P{_Cti!d9?ahi%6Ueo{a?G^k6l$(#N zZWl1$pAuRM_pT`py;XIeVnBgET(2OGw5(+wGG~P)eV+m_bi2;VcTZxWv}hqSx@GLL zhH@FgLAs<_NQe_Z){(?{Vv8&x4&T?LRlLm0L{`jGlExnhkEg|QBu?bukloK%5S!^G z?AIl3%CGL&9Sb89HhKE?>Xk1{%CGsHUu{*wxniJ!|0OSm-y0zqwkg!+th7|K*wke> zqGprGlgb$zt5jWS%1i?{T})JS$rr~22OfL_kUUPI>a6_II`ZZu-X%kR)%@P)>R5o8 zQoX@lJukiNs=t!#un~h|5_xwnSs|pD?CR+x?Bua^sQw-9i!z*7d#U7CbPN$5+t1|D zHBhHR2#)=&A=`(0e&zf;Dhhe6*58y3TDY`IDLo}q;onA1Jq1( z=IX9WUX7_Wj?(>ql)YnkrCZiET1h3T*tTuEDz@rzq3cvj20c-7@#ZeFx^#r(GZ%EAfBRqCeRa?3^rY0e`xlMhz%0)OoCr zpQiwq`ZO?g2SiY8MC1B)B7bpIVs`Q#;e_wxhM&zdPi5l=#sN!xpp795O)Inbs<|s3 z%13^5B@*ALEwvgOSENqn`|$BQPc3ZA-?}*J>+3Umb{C0%?sjt6ZoK#|et7@RxE!{6 zzy+xhOl-LVX8`LO9#3gmJ{Z7zti#c}(*KF`rK1JK^=fWi*NyRfFc1TJP|AFd^e4~Z zAQ8g(l_5L4=cP*a&y)<3wY8z~w?em1dX76Mx^tU2wA%vN?x7hWQdcrw5gB5S1I-$P z`D?s`F~7IYe(y~i6;cj9s7GCRUVY}BaFn}jBe-5mSmWIroaKFk<(RylAaK7jdhL(M z+2#WH?DtH%?_=P<&IBB|55NFAC>ePQ$?`3&6OyGxP_AxxR>At0L4k|0Zq${7vl(;h zqK*O|6kzBs%@5Aj<~Zg@7C7c-mPcoJhZaWwf~BRI#YG?8m~S$R?01TdObOA0*a<5& zP5Jiu>9STMkD4HAo)3dvK7KoG$Rk^WHfe6G>#1Y?JDPR1GEzYa)3vNe-(W_8OK~p{ zZL3;5njYMq?ckEZnqqmi;))S4${M5%-JNTJMg z=rU0Qb6I@Hlv|HZnW@+WfKwTY{3`==Rwp0cHokmkQE8jJutD9U;X`_7#v+Ly$!@%H zs#siPHEt2$5^TR&_tB^EFXVHQC7TE5P|s40mI;f^1w^*A9ls}4K~u1?Ro7@HgM*c=kqmOU3!bo6a;N=;rBf?J0 zgG4!znJ#oDXP1kp^9hEQgK2OVwQn}tZ`gDUMjlaM%Sus@&5G;xXz!>uEITPG*5Xc4 zP+jJ>(G1<*r|i_Cn6i&NYzuP`^dObQP7$5WWl`tL5>R#= zU1V&JZ1;G=fl`=9HPNl%LC$>D;59$eD#?*g+16j-s;En`PCVyCJQ68wSt=db1i7+_ zrJzLOAwa#*WHyI+RW^g24i~Um@>*@u8r{Fy^qL3gAf=2ylAv&kk&Idu8=B!cq9#QP zw*WSn3?s8oUT3pYnH|jOV_m*5Tzn@uYw6H(^krmg#M(f0~BEVv`5^WKiS|L~Zx~2yy(sWKr)US|aw|;HoHTy|P za%Ll(c$<}2>Z8`N-&}oj=h*v|q%?UKY!>2sB)oZKXY>o}&oumR<6Eh5`A3M;Pxtra z%p)~T{J#dgn}RY&v4r(|aFEmmP*+=W6~NMQ7^oi6nqY9h%0wQ1qL+C}DLR%g-GXx5 zS%mfp_)Xn{{?q7k6&#c+qBqQqGoj!$fn3oz#Hq7GI3hD+nmOH{y@AFJD@DQ1aVe`m z$AE1i9(N*g27;vxl;SqZ+*#DQbO*+K-JCqBibUlEqLDi)=H5Yd=fN1AVcs^>d0Kp< z&5ayA--K`J$B)lh&=Z4P&}~y^g9NCrNNUJXHq6AIKO}%uPRe#{9KM5kYi=SvdQV%n zkL~`=JIvr}b~pIirTVa|Xbqdv-~>Ye@Q?1V>yIh^zB?-59M|n1m$z1KIz;}nX6oxs zuc~%vwlA~*MLUR%ZFCW602+L=9d+-3<{EAIk^lDZI=05fhu&{*sy}_X8t=mGU=Wzf zC=`Y$=mrRk<`$zYw~*NIWumCf2htML&cd<1kx>stV2ft+b265LIw-mhF-ZMpi=O01 z_U+p1>-+V-Cd8B*{)*~5iu2!&E$UYMn0}*n#T?j3kn#8M zPwA@)#Exq-RMn;cVujmhD=f6*Xj`&tp@OxI?|4BWdkre(T(|)OJPZQ#y~kN%S$6!wP+7;bKZVVK)RJ%W$;EAHSU$!?K&EmG{8R z(*yHQpj=_VxL44Uj`$9dDQA<^1)EWTh_CbQQqaG1{u57z3ulQMY|RuYZjiYZsb*H! zgs{?-oFojF;Tm!8dL$hLfP-q}#7tsMf0Hni2uFm6ZmPa!{(ClA5G2*TWcPBbLds}GCpg|N3Zw+oI#nGFwH6gRn$(1E?)BPs zS96?RJ*`!FZXLOTdAwxxYy?nJ3Cn3lUZsIuN^m*NQ;3AX64)=f58)n>xFEfG*t|NX z1SW$ z&jgkY#?Bwc(*iHLfJ3JY{X>LAUEeh<>bFQ;Fu(?QaPR`-B->yGo78pMx#0;HdYIXZV-uCm(Chmgg7}a z%z#B5wi(vs$9d@PK(9sp5)@oB2+JNtWC$gvGIGSJG~I%>p+~^)?I6~+>+YZGV-!%N z)x$T*|KM?g9D+I(WrK^xXd%ceZZZIM#^AW{ej8ZHtau`YbHfE}n?hxi7W0c_x~FsA zRJcRD-rnPp{uVegCE5scl?bV3cA^&H+lU%1T;2j|2lmVI=woxP)_V`)&&MV2t~uD2pfKwfQq_k&XB_A|8-@ zxJJCcj-yRKQsWHDZUzbhI;=;R%E#@h67{Xmv(%aW3WN5$46V+;TnZR{aFblA4EMWo zWI1uO-)h+?-Rd^#tE8$E^oGDy#VAb**lfS8=aQV@mS-hR1U2hxl+3g`M3oOZLsCG4 zjfAu-pjX(-=r6xfZuk}|oqE4v#Yr`)WD*3T%-@>SD5K`b4HkzYQ~BV9l??KFfe{p{ z&}RyJ?P?z8j`j_O!ohEgd~b1Rjg(2i3Lt-uU5-`jb=yZVMSmiVsv0PURjQyZ^202w89p>}#f zt~PasC=fVIsdE}8%oyr!7lBQghwj)9svI7)o5xLy5`l;uF-<7Tcr^5KFV9UM4>pUI z8L$)CTUPGzISRmPu>>$K)6|(~J}-ekFEkz=)8-Ew6l4gb)h%Izy23(n2m(2R=L{OZ zS4lnt79r4d94SYSjx@fsmv1jt*-|k)gaSM)qiQCN$xT4|&Tv7S2SQG!cTKQ*v zPzWq6|FK#Yv7V|si$g|-YF?TVm~Iy$>P;wFD2XIq0A1$hph)Aqw=})7f3I>WNJ@PL z;)QCs;F6HYN=6r5cajCXTDgB(;rsS}h4KxA0j=Q2uO($f6h~E2Spj4%XyhqW-fsef zLJ+0qD@DzHh-w^Guwn6z=8V!R(yMM~&BqYG7f;YNX3&arwb-&U4Dql~HsX$$jj7>n zErWN%g;O^ev?Bi62=bH#O)YE#=4pO6 zz(d`2IaK&gu}L*&XpYS2xW3>N{=O#EP4`Wu!?HJXuDyyNjTA-vSqM_wSfQ&{Yyf48w(3+qpJR= zzQ^pES>y ztQdpIq%TRQIyFcl=z4zJzS>{?t7E`SQ(;|Q@$m0tbUTGdx7fXx6%pn9S&MH_f6Yqf zr$vK|SbsUi>Fj3|$VbJbIQrrMgUc9Xk*<^~zztd*-|RLhi^y|G_>Q*y&GS(M+l(p1 zZBvKBDs%r93i%6#IKHtXp7;~Iv0uc)R`TbK`6-@lG}{|>$opCKe&=o7V^a!Rj^X$) zXzf8s`B53ob!g%+SW9Chrb6v^p22rhl^69w`tmuGB=LS8GxeZ70Kti7f1B)wXU{6c z`E13ME^}z`*T1?We}KPrfSn_h1C=%a^3x~2zty!aK-wr{11DPt1_1zY#qA%r1szrY z^%96`V`6RmKVSb@@+JWxXTPBieXME`ihlcsdId^6l@S;oKGl0zf|qvm2-;Vlt8*eK zo(UxKQ96Pdd)$0H4RPSj7-U~y1XIRmKRxIA`H}5-Z~gP*@fz(LI1V*xqB87{ifw*$ zl|yw!`M6O8R9@xFP$D&ynC-$Z&`ol(24Rn1sc+j2h3VSQ1KF&j&n*`QoU&RHT15k&0ovy^8pBr|NSETe6 zYcC7BD5N`ywBO-_m6f-r%%2TTWe#&cVZ@>(S_1q8mIlKs26N$qnhADbch4Y|>n14I zwe^AjTGdXoH8rL+5C+PYt55iMIf_5l0`h}Xqz}KvVQLXU3CQqITE)8aIp`GgCSjIi znBDMGu+qs}J?QkzFXb;S()kOu-H26SfeMjvNw>O%S&7EU(Q)r{2i9LEQ1Ak(9MN}L zBwtYc?%1%8Ac9&jZe^rC6rV8De6k5Hi+Ip=bm2J|(eN+H0dZm>UY@&DaTkFGUBnDW z#pqIdw!`=&i*mnXrsnB&3X|Y<24K&L*+7>Wh#GNxuE1#dU44VUM!B!Zg$#}5BYH&; zG6%&Manl*4?wTG&#DSEpFrzac%l%~qf4FW{Ub?|Sp!R^jXoJ03iKNpxIOHlZAK^M`(O73V0F{9C1=1YV?fWX@c{DeaQLH_A;g0Cw%H( zNHj&_DV3%T^}kQ=PP{;BdU*#}2O=-09LQ+S2iom?id!55?;HWv2fPPdli8kt_xFoQvrn>H#fZ;# ze1SgNYIY=G)!Mg21cNeTA@(o?qeC{}Fb*%Wm^quXjQ)?bk?k$T-(U=of(U=p1x>-| zXnI%aYtV<9Q>vqJW=`zwUmv}mYM-Bbar1aGW#zQ{a3o}J*=cPWHyP7Ws4hkXXSw}I z8;mzisSs{cr(I6BNesVf?2J_1baa&bL1HrHq1lZSH4gJ=Dk;_WO>Kelxb^NOqAh6= zUFQ7OSPFbRbCFi4syu_=bAS>Cw?s5H;|>w@*t)hvi={}F{-mL;2By_v-MIt}zxAHO zaY?)Us^!sRs?^KJGW{_m*?IM@E0apYz0;Zp3sPECN1?(wO^eGu$004OZC;tSy^L=P zxky!8c5J1M%sv#i!+;ip&2yc2`ABV`bo#WisHD9GdM%>q<*Ha0`!~3{Q4Ijcl-MfK z2BK@(2U2kzKGvbo$s+$pwFCl1?ptG^wq?$GfFvM#ePt$|D30wW-Xw`u(D|YP+6r(K z-AoqxeF)RAwtXs-L8)~7$NDD!5`^n+G(W#&zkMC{TPU{g;L)w$a9-#EPL~$R z0|@+f#dumu3^S@@bq>upGEt|{g!2SZ=UY>hkAj~-!`7n<%I~t${S?s1)WJ*KB ziE!2Q%UWXc{Nuyfyh?lhdEIO-6_ExCK({M){KBhia`lx4+`Z`RoSK;xFQdY3ud>29 zE{no1t^xuhpd!!CwpA|kyPp=@8kW8_ozNiKe$-z}{&pX@RKl6h9z0>kwpu^&a5;yj zq|xLmwq2TF2m{X!&8z1`jA|?knAm4NcryDfn?W8yd<@O4#4N)-oSu@J6$PVdO2UX5 z)#%6_b86TtX_cp8#iFy?1a{BHgvg1qzJ+cTAYY(=6a~}KYNc!AU69eXtjlfHu%3R2 zw;7R5&Ux| z7+5w*>g@nY7X>8QTRswY5MRsP<-phcpYs;@PTdoP-|I04IgwMlx!z?AW^(z*AE4d| zzxpxF;0^jz$;R6=P-XX8!gOsP_u+NFl@|SZCg&MP6|a29B*<6?{^8v0qVB z&fNOm$2EQMHS09g$=V?2n_?Jc=b=|* z)xn`O1hL;wyIof&G0>RWuUL^{{-~7{SlCg4)OoL`7zldStxjPiyO%KXegfJ*UM;TE zwvLJENdm0A=l)Nr#FhA){tVhbDuy5NWhUWIOPNPe+enZ{%5bbAWp8sA%V$eFa8 za|sDE+;xOY_21Pl@E6o!Q4d6({G#V>lQO~3{*|4pLbl+>x9}xW^F?{c^RJGPzXW$JjfSc@V9Vwm50*lbz@sQEf6=<*A^k|IhCW6yf2U(@hK8Zcl znfsSabe%&?avZ zJkoY4s8o7fwK|b($44+xlNeT$Rg~y_2LWzyY*X&gFld~Ok#-|J4%QMS0bjV z5fLh{!KVP9g$3e=V&&w;7CZbe!PB9ZyXXY{#kZiD7n$W5F0;!hC&9cMD4oLlCW36R z-;(+&{EM;CYYX%>gs^}qcB%($9(tlJjD8+1bP2D$o7y&uq~qt zCAZwBO_BygXMpvbmMyF3-`2KHG^gq%V4OWlIe4sV3{Qs>J|69u3nDh@!so>ws$pDQMgeOH|BvA36 z##(4drNRNo64(-fh}Ds+E{Z9%?WV3xTV_Xam<*ANKuoDL6Pv}AK=4KkmaH_#Y}bi2 zmiphmUQf_J{L3KF+~G7(Sy2^c>@aAkVYzfv?f;-$lb&~=tsRN|wTFN?qXkG{iJYSi z`3W6;ytc}5!ag23zZPskkeW?4G;OTe(d-qxMYnqU_Ib7`y~vIa!h6WR1!KZNQ?I&J zca#%WeAxV>jyanvnnv27Rd&(&%5?^!PdXxESkdx%wW@j28)*fJ3q#1$Px&s21iFWv zTNUSNC3l$}Zq-S1FnTi^SSHFlalt?_?$(+$;wpjR2fg3d{h9~!$slFNHwhogyNEkW z83mljUoaph+sx7G4P&mZ8;wyc7(%|E43^ajcX0wP5#lk6j@G|UMVYkdNha>pSyRJG zg&|VoGk)*kw6&^jtF|6qRcj0V+$Su}=JJw0LiP4Z0!De&@pE-gGo41t?As*`a}qa1 z?ueS5H~){SWbDt4tJ4C?Ai+1Z^U2<-z4~8!D}Id)YIh2WUJK&{4lw^D@3m`(+6}34fp-I^a&68-@bc+(G+Vu#pEDWmRW9vs6(>XnjPFjbd(2 zrreLme(dmmhmxLoRyOyJ(k#n{e8_xGyk$t1jXmG%gmQN@L&wvF;9x|tk&jOb^>VzW zinA3l=pqHyhiKu2wwRm(MJZi4`Br#s!ONjlTkMt8`LTp5GKhH(o@ z)9e@eT&IqI)Q5SFW%_};`=vwX$+DIHg$?&8e~$%qEMz*rfsjfWK<#J!zb5hjldg*z z7y{dC0LLvQX^PP-ZGqG7P!TL5gwkziBK~MQ(2IkE_LfWca~ znNQ@7Be)*eC88d+x+3D8P){BL)01{`I*kvIC3%nOJOm?Vmx&0DfJR*<_I3;B>)@rZ zfTSb_npgQIPwMP4c15UF<+VhqseY+Rdh(a0{s=5QsV3bnFSxSduLosMNAbWx= z*NPGeKm#p=M|6NXb2yJCF@VD~b{o1+-@K@MQ$jgBaa??*MtE@jH=0ZKMLH>#l$sL& zy~Squrgmy4F$%jcz=wpqRrZ!E2=2J)2hiOyRs_)xa?Wyy2bXuKC62o32Re7m6DDXC z4j)&yl}M7cwd-E|DmR+2doV<01-+9M6>1yN>(IwM3r}QpuO!dUr2n`%mVil~q#oL* zpZC?1=7^!_&M9wcqK^;0<$3xz(~3n>S?l>i?cY*L9K{xV#Gg++TrzB!1wA*yYm%PV zKi;C_@L;j9dS}uyt?-Mh$sh^8HCO{xxoQB&wToBDCa%e|-(jqii^VqXAOnPXt(^6h z8F*NdkLzpm?+7Q5m#?K7!Fw$+gppI>?UQ3=;Y%O4t0!5vqZ?Yn&`FtQuU;0!5Y<6# z45+Ko#8TYXjIlItJ53|sv1O6Idw|zhZ&~YQ(mpcIUSCIP6N1r07A_V%s#j~!J`jdo z5t)_#yjH=B#=tsj6xi9JiKZGyw1!tVKc_?_cc&3eNw(r7cu~j#z(Q>syYvqCpmW*? zYjB~a%T{es)Au+6r?ro*vxINHb@W+z{H(Gl@rL}nQh@*y|DIASCn)nQP9%j?uZiZ1 zLo*edm-z2`sOPTf!x5GI13GTFO?HT|VmMN6iFimpEWQv^gdSZs71q3sqA5ARr^Z4c zk^G{Q8v#LMxaWRTQDZ`R&$Fl*u?@;Vx`dIU@*>Q zg5eL4q!x$`p8glxUbx8Ey?8MXC=cwGy5*|}hY`oX+NOYVV|0Ml7ru~|``~zuL8X;0 zgH(S!KMjCAzvuBvIzT|sg6wi<46flz;>`emIswlcA*7iXC6GDXTdBpUIQ70 zaQ%27=vy_$6dFERk0oq;az}$y>JTV1Dwn4l`5gav_;Wxa=_0P`6+D_zmb2=^&rfY! z)5Q{x@L8h%J?H()-yH@Zk9L9*7%m%ul|SA8cZc!Mj#8qHE%F~k!cy*(p-l_P3(xYk z3xeJ)kG=h6x*hTQ>FG$@KWHJ>%IfudO8XNeyGYNFoCfGl|Ec22?4wOv0n8 zDcfpJ7U5+q<}mFes}LFsPUU@3=*@-YFM}m*u|mNefMveQ3qmYZI?8TLck+LAal= z*DUZFUG$t#`vx24>P#?=^ASD9C74>2_12CpUL9CcFvn-ikn$%33|1?HcbP4aNJoCH z5nIS4h>(nk55oI=*YTupwutf^bY9D4<8$bSR^{8&sfbI#d5vy>9696=?%D_)_oz*q zZY4N5KSy%b9)mbzUV;_yMEkbd`vzr`;ev3<2zJK!{T?!gq5&^nj(o9UX85UlUt_(f``&b}> z#*-CgQE?MgV&Ym2jPWq`9f{NrfdfB<$3UwCCY=KiH4)xo`C$EHdWQ^zY@|YL|88mF zxt(Uoz|iaq49$P1efobd)BZHILe+niWqhkeGB}`##MF;)C52wX%7_+~s{E*QKN|9q zil{PT!Z zq^ocJLP%T?jKeHNrOPP6$DHYXQ_PiCqV5W8w{^#w>_R6M`&F8a$>_EYQCsQ@taNJ5 z^Cm*&Oi~fcYh%Vuj6Y+|LiZNt;8aRm+H!ZDhGdw8Z=Sr|PX z)s~k6l)doRnagiGL*j}P(v*WKdo8jMnPGc`e-j5V8YG2PuoY*lXzvZwnPNOL2fIyB zmk#Dxp1iJdK%bY%B1y2*20^aAVrdFEYBR{fl7wM{wfFX&Q8I{!<(^JT-pvnD6eW*x zo5@E}tu|TvhXa)RJYUR-i2c8BNM)!A@$OhQeMNUJhreb0k+b_u9O@x=eidNg-Pwh) zGU~i~=8aRb%rvUb==Qw$sq1u8hWoyQu{K2);)TYiLw@>*q!anp~ z;CT+-uV>-kTV~X{wkC*bDrT~tdme1z9ca=QJ4^WDQ7j!l6l8|6A@(%$f{l8aVX+UM zMu-xHcS1}#2Vjg&tNWce6Y5Wv2l^E|VI2cjAz3;EIGlxpZ9^krvIIZGgolJaXXV<6gYbI4yc~4%XyV_RxAT?&+W0&} z%P<0jIV6oa!lFlqrydFO4oPBKQrStT<%n0!y}pb3Ylkw#KLr1XU4nFX4^joAq$m6x zz&|+e9cdL<%X30Kz7jR(To-vdWHF-z0UP*}P!ab0N9k}A;Xy<%e7buxnI7!fk0e*4 zCpq(%PX@CvXb&`}K^L64(H=`2cK$1*SFTgCMCiGC{+zP@AH@CBQ17FN#pahEp`5Z% zGymb(28bBK3xKgy2pCKMHw%|{Hng@d`fs&nmh!6XDiFa%3KYHv6&p~#1P|3crS~9jJm$+^2Rzwl`SN6vP!Afi6sOwE1nv02~j5@)*Icb{hx+0=k_1fsb| z)!T5Zc%L{fm%*HKm$F?SOE`u^umy**>lufdu0cN`V6N5H2~--pgV!4;kQ=m^%+jah zryLY9Q{T5v*66qBs(gin6#vR!Dr6=$D%-D<6 z;X~-D)&{F!U1a$`P%qTx5(mgYoE4qraamEs(cr0@^f0cDw2N$z{T}gUmH~74iNuN9 zEyo&T+6mx73nm+Hk?a;Rs&W*plrKvjPG=+bRc{ASc#^FRW*Zcsu*-aiw_ji_HkE20 zgPAN}Bm~(&EynG1GkP!o?2#I}YOr*^D%^^ns>0Hb&kh!tVi5SP!v#$ma`blC3rXBi zERlN$Z{ZXlY5dSjwPbJ3ENdlKf=g)j%?5K5|2)Ci?R$tZS(eppi_?gi#TA&2UaptW z?ji2VMrtFj}^d0P*Smn27N&lZ9kpHnjV&Gum zXbbo!YVW^dw|C?}*$d6tG+|u!M8Pns;P`}UHwCrb{2PMPkx?Wx5f1*rUpP>>>9z06 zKi0AMas?JkWS|erM8v;5p;9NWiHzRbxe=(ekuFHN&edwuuYif?AN7S~BbZSN4kdhPk#9r*3dsSzzvxFM`idga4@cRWUFlq-X3`6d0 z&eqts}Xd>YE zZ|5EkY%V8Eg@Rj2VS`^az!@#otc%xC{SRJ_{}tk8O}p*AH!Mqz-UY#@D!bk7?t$D0 zzi(D_&H|tTHxVzwRfWZcVVyzaiDA{?&m4mVs+vjZOr5_3wLl=9&@JLboXT0X+7p%v zuym4L{C0jYs#YFK>{*tUULSz=eWlxF*a9~mNesn_evcbds?39fS>L=O%9Qr@OYo4Q ztWTw-nLKvan+<2_8^@_F;k)Z=Usmsi$~nMYk*Z&kg3hmaV8QoQVX8L~M5^9yU~f%# zCw0?+AhnFeYGS_WbU-wwY%w~alnsFTBrz8*_;HMEt< z!tgByz7@Fij6E(Zn_52gauGN&Zm0zAw2Pu>oL!55AS?9x=>$wbt+zHck|KP>@w-{o z1z{>*JLPOd8}%Brlg*n<2qaRRd0D%YryXraiOk^)9gXjX*Bp%UQd^n{-WC@q>jp~~ zft&f+&84?n^OGWS*U^|41e?6U^51p0{R}=PTv&& zhF|}m;*kRiN6kR|@N00}ucsAma#;E&Hf1l(^dO?s;>H-4!ATcDaWq2*!n82XYo?vo zqIm;L*VKN@6qVRL95;m%#^5|M_p{hDV&-^?q5RRTw+oLfWXM_am@>GSLUzMV*iM?U z=_m)ff^DWTM*>YRqjC_vm2Lj}o184ohq0yuK9pExTzRn=n4p*koQ!kLJ4^fF2tQ&$ z;HtiLUW~wJy>F3p*1rFS*7(PrSjYL1D?6ZAynq1~^>6y~$G*cq1*2di1uB5(!``Um zIk|B<4x}(YJgi3&#v&^+P}6&EST?3O$X+|scyHvt{rs#jT_KDPMMulSGRZP|I@aOa z(FMZ!ZK5|gNCrj=y$O69h;-h48>EPu>BbC8g(^NH6{DGs55^p1SV{6Sb6;S&DkQ3* zzoky4Cw2CGoQQ9-YvH$-PS9{BTcB;jgL=$IGQKv~xT>ls2C_)?rouz}7Ro8-_d$EX zM@?W~RJcz6gk&`YJzxo{Cr0RfCMFOup&i4fRJ7DJjX2CsViFHnpE60BW@s(VB5>a2 z(C3gyU`EG~zAeP4HGU^JPP%BV^m{V6DLU8IRt0MsEaqf3PcYp-ck2M62e4%cOh#H> z*KKEV$by^t#whChB(AqyTmrxxjKIa{Zq5g3Ng3RHP`r$IN5VLpzmvXD-5b&sFq!nG zn(9N;OXGm5j4}BdK++NST|j6_!7`wz)`YVeZ3rONsSlB&%;1LI$PnH^{oPfXmwY)p z0iKL6@RYFsc0vNCK%R#G#lXdA+>rh-aQbY%q;$m|&9Lc+VjIl9;Ik^y48f1|FTUTu zO0KyvrhNa*aW;wR+i*Bv|M>!1>Mt&BqsJ7}975vE|`o>bmQoY|jr z=P|(0HYe3*WR<0+%cF%%e{L1U`pZ=D4T;%wvPqO9@LV&E8Z72Lj-NY!R)#V3@rkH4 zLoBe~MJg{m(pz4)=_YPVWmua10#~@xJ#h@ZInYSWn7O**zV1jIlN~Fbgh(xTgY?f!QnEdfl_6P0ss(Nvjz?4%*3};* z-y89tLEcIZwf*V+6Wy&Mcc2G{Z?CR% zIljNhTUFKBbaR&?T~FnunM}EHmQlKoL}%#Fv%Z}&s19(#`B{uYSwMf*6Byjlkx)2z zG;9Lm2b+WT&K0+Zx{F!K{0j-Rf~j?aFo2i+k$>AV0bHXOy{R@KF$OUZG+gg5CH%)0 zOZ2ERD=`1Yh6PfN{Y?q~&z$71H~;wbM+^L4#rCQziV5O}cLwX~ARQfDq7;lOU20K- z1r=p8y40#UBPwa3I(;wua$@BOU}=5IO`zk)JIr%G*K>CSf?IS0F4vG4zSkwe5r}$f zdf{n*E(i>)j%q{xaMfgs0kVB<(^F_8HI0h^%Bn4HBkllj2o1F0@Q!Z>1v<1x(MK!E z{dL)AkmgjQ%$Xzp=WW3>Q`{!|H?wGySJfHCvqy8S($pkVak?|MM`8W|I&$W0Bh82* z37?rJZMo(Su1>LYdK2Dhv!*GgUoGOx(7t zc^Jn;-dTQ@({)Cwow$ZGTJq#yyL1ZG@`@ZVCPRlXC0HhvrsaX%@9N(u1%fP@jz#!d zHB!9gI-xbJZay}=^Wsntnll1k0&eqDPu`|*aGHW+`#nS1mb?m`)#VcZ!zF^}4 z?7T|iILG>PF@|H(`O<4gWf#QL*8+4-Zi6|g;a+O=gkU|{Iwm$bMOiz-NU)!43$}&e zz)@Ayv8@xq2H(}b)+(q44DF9{64&f3|H`D!2+9=jZ?37x?e!;MdQ9!1cvK#+fy>#7 z4xYRU3TC)M3uveALKnAYX7{^qd#Q(!f{4*DH#ZOEzNLPnM?u@Mu=Qn^JXYQzr$fL# zK8rHaU~}mBKt7raNc$0V5PKxP;S$bGRQy@gy))@k`^mhr7s)5TF&Nh48&uKVbgMhD zPWDMQ4;$S(MTv>4&EVvOkCwSNO&bJ9&neCOQ%!^X`9|$MG3fV}Ssr;I+fp3fd?}ad z2C#I)QdB*$x&~?TlCCZFGT(UgTrFKY?|L0t6xNVcqn_9E17$J&Nk^*?-RHscJUKhC z_S!F=N8Y;Rl0@%-j+t*iC2y_ZoCvtx@S!d?EfUS7v*}1@V>o+2@}Nm^iX64P(Bj-4 zghC(vLLdje5C}eLXmWq6fsp|_khn(n?XCq^n+hw(Bn5Po#SoEx3aiy4V!E#okMs@+ z<&pL!FU$TQ=4)!h{Q%FUSds|22GdG2bOJwqFefO9ir?>#$h*SD|`zbZ2TUX}la8;v|dVb=}}VlXZR3O|og zj43Dp46Thz0$0`)SIj<@QP$U;?#-lwC`Vvx{-F37Pa@<{+JT+suwsAl33637aL}X8 zx7(-dP@~7CYwHGIGi{)w>WeFy{YTDMvi0#>mN<+f3pz{W3^%fCz!sP`mOF#{-V8zE zmn}2#X9X8|h@o8)s*b`p${cy}OeucW{UNSzKQjp``l+_<03BwNF_?D*!2`Xm*_j0G z45yCgL=FUW%&%Xucb@=ad=Z`UChMr0Go20D57REPJM0t4K7PrLog>#)Dicc4^VA27 zmVUD7K>0!I^K5IH6ng z7Ap}n09i)%9sDmh{0F8+I``PIG%(P~0R!FNd%P9^U@ibKux1c(0}dVk%>_GH0DrJB z_|pSNDU8bY0-Bo+EJ7-u(M(j@~DFd;Pv|eS_#tbf@Y|CXCeu@grQ{vesV^jCN=DX2K$PR^)!Ub-d_oi!dZCl2YiJZ#o z;xm4`c)<`cMo46x-=qU2w>PAIeGZ;2;@GcVgKNQVMF^<9OqjS9_N0wiPPAm2t4c<^ zC2iwOXdvigy&kBX(?$4Tbjn4;P1M(1a;%Ag7CQO3FyPbx(G4o6v*TC>#mw|V@%YRX ztx)hg|0ifFyYO`0MBx}^ispsB?XrDZ9v6XOR9?a&`vMitoSMTmUTy@o_s07-gPta; z0P68YXfa3SsvqTW$}B1Wa|8_Ee6tsZ`?l6PEHgrA^4UOw>0rG!N#>T+O z$lS!ikpYMcYwP;QUZ;$SqoaYDiOior{CPxKDq4=K%82jLhK5oKYluTtO6dy?+Fla* zMHoNApc0FyFpB+FP=fgxhku1tM$(y)rjfsr;~&BXLX9!6M#AiUTBnr~fVWcP7C3tgNYH&Na9 z82ma*hwsy2_}vpbV^y^0usY+Z`J;bYQ^)gC`q9>LXqxA>FtOKdVy91Gqme^G-L{c8 ziz9xIOjSf&^}fYu$uy%G0#>SaQ|97)itS7C0dM`o_4lnAW3yn5oSNCW2ltEAT=i&1 zNVW>KY(+eoln1QqFnCy{g2-nza*_@hlHS##9fL?j02xVUbqVQA_C=nPGerqo->-tB zG}fB0^IBG69qhWr3L{klqZm1`bc?4qIsEA;{RE}0!3G&#EvA{Gb5X)uY-H;8I^ zyJ41Hy56986OkT!oKy(Fxo^KGpK3%8OV^IPpoB*S0PcZMDNO#3zeCQIa2dcJ&vO zjFcw49s0ybqi;!($}ghXTTL|6fT0mdXe<;+yV3VzL|mUMZvP-ac`ejipaI9|o4e-k zYwym#6M^f;kRzBasC|HZ)FJp%jvox=Q+rWNMh#%v7+ko35EY0M-6hnMfV!{NEg=ay#=9G>B4(Zo0tFc z0aK>5u)b5Ws{LrYnjH^n2?Ry8 zbi8(#V?O?E8vKWI$S|%;bO1uwyZ~oZe+MuAFV4Z;&g2h(#J@R(Bo!Sc92HETWb3*b z>nB*$5-KVY9ArsKO>2;RI{66l2KKm>h3dY2QVsIuf%Pbohj*wBhfMpHD?zhFX6^u2 z?j459g|CL*ljrIC5fiK!o)hk0a~`~N9IqFD{>%n#2@VgZ+)zatMn|1Q@El(FI(#MgxuLS&saCExK$BSSR;x(D|7>7CX|4?RW?6dR@_9{snmuS;pnT z<$<#Ac+ChZPB?edb^&(Qjs;mTtQ8OHx=p3vFhHYkclBf-%)C5pz9t#XfS{bWjO&kn{kYMxT(D%`$W50;g23btnvn1GBJ zCds0$ivo5?7$10I6_h0FK8Rx!H1Cwb19)b4Trn%!uWYNl;R#OlXt1e)Atqe5zVyyG zi7b+oCzz92EV;t#V+y5i2I3p0S*aJzYW{Z2QGu%_EHe0lz}6AI$Qo&oxik~4+9QUI zzf~)`=qb^I0!Ofe0-j^}2#at;&fEOE!Dcks&M_-Y+98vJ~SFJ!E539<3tGQsvZcvT-88KS#a_o~#?Q zvxQ$iw8U`>kaGB@L;XLjy<>Ex?Ups1ifyxE+qP}nwpC%pb}F`QR&29k+h%>c&U3oY z)2I9G@s4+Ve=^3-{@1Gf>y5Q0 zm)E2GDW>mgfw})D_`|HkZ)J-f_Bh>Op)JdMq+$+JIm8UnU$ludLDcwjum>?H)zpP> z%Ct}ugpwnnP=?TVsFYHA>Xzh*E^sh`V?(KZSpk_+FL0(}G(t-@~E4Ksp^mOlvP7-S8;MW@X)6_hl}e2@<&TqAqCL zE0xhPYmvNJFGQ2l1MX?!O-P*k=;_$aPO`b!vtT-9wKtqIitR53b=EBq0Q`?()5(~8 z!hVue5r3B*49NaKQPmF4O-Vz?5AKjjdgr42?|{oB-ci+L`|sC@WIaR$dcB{ajLrqT4xD z_yKD5gl^oCRwz3cC@c+p4^9}4M^VVGsV0C*LlqA0C-_^2AR`?;lxcp{*`SESa^`PhTb59%genw%`A^e!s9|+SU?linjqAZ>DL1p5%qww0_fZGCF%`6+(W6XJWgJ& z&Hl!ivk?ZJvlI&KcUXG)eBCCj-CMuBA*(LLm0 zDifZ%#vZ8z=qg67#dAsxwkK{Q`r|5yeeZ55nWP6p=q=R(Omp1=INZt$9ac@3RQ;`^ES& zxkdeJ?M1kRfN~csk}^O^$wlKGQegazry$mO=M=OuAo=EoIFOQyvk z-OPljMTBBTo@n{KZu$hRrX_2pcevr$=13%Zc7ViE{ybA`Y>3_iqA73~&`f1yxr`#)h&ybIA2HxH(O)w@w(h1@+fZVN&6a5h`j?{$mhO~Xtk)USwRZFSG-AVUL+%YL zc>+v$=PoOUZZbj33|;A`Q24~!gkzN&mdA&j2P^%S_C>YnI{niNK5gxi;d$42rY=_~ zn4=?-Ki9JlX*`Zj6k-fXyy>GQi^NG4cqgs-knV@96oI=F*q^E0kbU3T0! zrs$~xgumQ-%!ruCNwzdfjE4(Tw9Eg~;XzH>qLNfPGYySS^MYa7VS>$i6}fs4*e0R_ zWV(@dhi9IXH?EdrRkIH)r+#hWN#nPK5Fjwg=mhLw_I^b`h;LS~54Eh|HF?D0>IG@X zb{-9rIGB4B(wv&=w${AE#H*dUURIaA%$=;s#*5+fRIclRp$+zkR;%871{h}gdx|;y zO7%&`{_mA~8~G!pb#`!TX?C79&V2Dji$k|xZxh#>2`DcP$q0iuHP5oqQt60s%hi00 zPpH>7tLYGg`&74m&I?0ty$Vc%yN7=?PPFm4%_CvF)~tgDcD_i>v8xcreIR z0}}EGa2YD*jlO4FOenV&AEl|WZ&K{-rQhj`!@EC{@Ps`WB|bd)q&{jBo3&5C4DCx< zTK3WC%bjjG$drnk@6AU){rqhNbjq%$X!r$-v(QqutoVTkAk@Z87H@On#*+EJ_T+D% zR?o0Yqu&#WenNLq%-C%{4FRKnsk<%c;dXOp{Ug+tEnM-gW>fdDzu0v%vAYH)MG;UP zY!T*c<7o|1qC)xwNYIE;>SbN_?j9@;;ow4-yA$?vz$53~<>=UN68+&Lq zP(dz;(L=t0={pWO1 zNmBEV#y<$xfgN7-~{tV*yZBZ@&8HlpU`lrFBG{!xG0w6lo z5dUr#`JY5b(81gSL{g_fh4Om#Xp?bYu55N0Gu>rVWvK?&2P zF_@vX)c-89>WBT)98ji#laQBXnA(aqd)-QW3cDW+_@Orv+nwaPu4M;`zzV@zdlnm0V5a|KcTNmQ){FZ6uj-|kCVe@&4=2HHa~CQe+W#6s@BQ&97+X@ z|K`lL9Z{XHHo0r2r=FXfJWv@>J@GUPp}Rp(gxhL5hn^O0NU?o!23AkJ7^ck-jV*en z*=;`KvZKrSg$zl@NjembMx$N52=7+ZVR@;>nxJg5NM>EKt^)qS8|i8a9iu&Zxg3_! zlvZk;xpg8S>kNIBhRwDxleM}F8E1YL!{Sd(x zT~x5pX^9~LD9~&cRT_H5W}RvIq)I2v_WC4-kKjtF`h9ZPBt2D#vAo>MVGh0il z;P3)mgT!ddJ7(W)_K$tS?EAKFAX?3~$*Q3WKc8e_qJFqm0P9M+I`Wpwr(*LmEdHv< z^sc_EvZ~W5FG!KS*N9&A(liK@oiS7ZeU+0(5nSc{)jjCr>#mRf@nek41Rq~26MY_U zsJN?4>$T5{Egm}ibY17hjW%+Hxr_B>VA+SqB=MIP$41{IESk)nmZHHr ziv;c;Jdwiz@K!RnT{uT)iy?|S180b7xu^obj*AUR^p-D7rp@$Ef~N@*jJCkj2c?Gg;Z?#En_q8sg99c%=QVsD#yt_t-*Fm_dN8fiY0VVvhv7 zfqoXV`;H8Olvbgu>RSTBT=%POT_PA(iAkAD1vT@!du7m$AwR)=NM2ozFEOWkB(G_m zz}Qx41R#Sh3NgVM0cJD&mIZTl`d`P!ykKBAKaj=5e9st~nQxp=3m9T&$ZNS=gVTBu zTKgtF1GZ-M#eL{d2xgWFjpF!fD0hZ?evb@%Z{*S)cEBU{(jN}ViE+*rq+hlaX^o5z zLqcZw$#ax`0v$k%Q}=9gPpd%- zyrwE$*33QfEbA`(Sdmnn&0&v5_XDBU-d;qKFAT5f$25mPkBRYtug0^7d zBo6Kh1_ve^x-f#+JdG8x!N|YcKA8pL+ry6z@*7N5Un}OI$4Fu!DhuBh&z%DER(Bl9 zK2TEM3qdvJ;{fZ`f&3CAz#Xvh!;z|NLx6j=mWEqr6G1R?y@d!X<&mb#>| z?pQ^lgICxHs!FU;Q_C4+PLH%5w0h_D$0Mi}sS?$ap*A&ff(}bOSLngs3v9a*J{!4}(o2B}f zwnE0@mXVakK@!`duNb9ISx-(=&UVwD=ARE+?wb(Tl0FMDo-`zm5S1jC1H0f;_|o~oq^k|44kj9M zyV4G(hocknxj%wqMB!q`@1lPENM7aS^b@4)UZ*+GNDVDZuKM__qZX!cJU zsPL$=eLrv<$*J`F(JPPqTqd-JwR|h9p6Bi~>#;tfDR=p0x&Fg)i#58)7ZtO~W}HB| zm6iFV^{#D@DV0+yt=cxpNnFl>(|77_vdA}x9L)$Ki&Htzdai!b_@GF0K8w*zdR>c(--p^jX+x6m^fBY%_u;bL`%D$^~ebD(D5 z>h8Q+W8aXG-eAMzF}nE_Tcch#p9%{!Sj7?1gn%NEy7J~X@FpVX7tb|E(rmc9Vt=aq z(Ugg8Y!OTSlmp*lMslaRiTGZQiwO;Bmg*P^7f_;jtR-GE>=3XJ^fR`QY{ces?INA* zV%V+tdh5ZA`yp^BLU8%y!QY*Ihspa~EjpwtT@@~3_6%UgpvyR2s+e7~h2P1fLwR$I zooKxI_Gjy@(W@HfAeXb$6WMn-1QR+Y6Y9>>ofFzV^e6`4O{FqV$V#&6wHe51pgfd~ z*Ur&SK>dpMjyS6K?4rgU6o*S3)PZ|uZlpV__rCbZ4a348rws;x(w#h``Bm+umFf(M zF8MUgf|ypIso1@Dt%j7V23cSMA zQ{g4M1@DNLFex;9?M5Fz!+d7+W^!!`i4LoFR@I(`j^*}hKOpf)dBM%?vpSyPVQr#q zeTG6K#B5CyX3gGYw_?h}oJmqR$->Q*g@3$^q9}had3$>s6vg+l)WXe+#OptCNghW2 z{nnb$yXE>0LU8;{&Zn~S!l<6nxBcpPolri0squSC*}`?qrHhqVWvzZlba0|Rv7{VN z((uv5J<$%3ZhK%lpPg87zpVwA1IeMi`_M!_AAGlLD_R*}{Fp^m=FKF_xv>VTSS<^# z(8I5!dN9PD=X?Nfk2UQ@1j|m};_Ih7U3q-ElT{Dgxg#Z|+cR!LgSp9=!d~l~A$DO< z$JDvk5NRgpb8djyS8{4wHu{Sd+Jzb4B$>!2`NS#Dz)P=A2b$RY1fI*3^P>ES@YgDC z+KnYEMz=dTuKVb<@L=b~ODOHNb_KjHIpx)gQQ>?h=RzUP@savS)_b4<{62I*W7=-C z6T+}}8&??m=eNi68CHrxH(Sr3ar7wA96YDS@M+XX$7W8{K?*)RpOi*p*c`$*pcwIQ zC`blO-e^^;c`b+)d#?G(#t25ogW&m#jESrhCfmgZm%{;&&KX`ri&=Q(U-bktc~F=v zT(40L1FB{mn7L}B&o1D=+pWRdvF`GEdkwidxM1vwnjP)IaOA3{g!pp+8TBF4yWKzx zvBa`p5ZFO*x1FD`zdac<0r9klet$9hChP-Wb7mOXNl4VIV*nHevz?5sqFw7L4pi_R z7)eHElPms~#=R&BgvO~}sN~rL<26WqHvY6Sm%5`NFxp40wk&YL3V1yl^ra+B{X`_OhUVd8XhRI~{Gx2qWJ1J~uU`KM|U(q`dzZvn5fwFIl zsaC6PsCDd9S3%Qzf``=-UGpAcYy>e@=-Ivj=8T?MVyt%*gsWTgaY2T!Ia1CBdT-WH zh+pj1m3~%LNVAXfaY&`$!Qje$|HgXs2wGiX@F|c|8PY9wOy!e?*!Pg_-lZl z47hNDqKK;dy;+VMwkRnQlIUxxt)SJHFSLP0MPbbcc@joG48mArafYEXB_hwj{1BvH zk_Mg&!wF2+o%3K*0~3;*ANkHIyB-fFuK2gQK_qf}38(g;ka;o~tuBW=qV_0b5y^n} zGi^ZoQDe_TR-^+r>q9d@Z_@vI)XA~Nvf!c z7Z?vx1E3&aEkyL%uw~p$$Pq&MrmnokASiGz&A$9{srE(DvRi}}F|bDB zi5YK@I6@b-l%hr1a%kD-kTye${L5k$Rb~<4C6&+{>dlyO;-%c125pu7?2(5(3@&RO zspUc4i1VsAxzL@kw|rU_&j*V1ptCikWGYwtugI>G;d-o*8l37tcbt!#Ky`QW9h)}h zg;Tf%Iecz}uO@8UF{`##x)r8P@f&_qk3<3}PMMEc`!6CD-v* z{uTEP>=LH+V@3TL3m$2urVfmD)p;N#lt2^17*lb;qNxaO_QXL}t8WgdG3T4Vd+-p5 z1399_vdgzz%H*~}w%K2@9mD9eka`;XaQm#k-%+Que*Z1;{SPCB7Kq)M0x(fnz=jja z|IA3G08t|@%AU?HrnY}oo2(olQ&|!A$3j!ZLr^x29#2auACEV(hyrM&w70*m@M!&; zo@XZ7hc*8Dmrn{tZ3I@tJ`=Nqm(Q1XV29{C+!D?yNUWa7Uuk?3YQeL3_9&@(FUbxs zb70A#>T_f5hii!WUdfnReS^veTb&iYE3I8ep$>@L-0bO7pP7B{n0?00(dtr3=c}l zI3Q{f@IMlH8H0 zj0F))xl~~Gb%}12j3#(v%545s{gwVWDv+Kz#_vI#GuyerW-bnqY43Yi$I~XjK<;DW z^X}@(A2=9J*WeI!j={jfdJky;^{2uNCa0)6&JEsb&1J z7(ovel3o*32R$vkg^<0Cd?ww=saSx;c=gci#be9GJ^F(v>)!lFrQ$lXPUO?4VTrpz zGN@QfM4N8Ieo=&2Sz`iows(r|hz99&Bi9M6>$(OkXO~#%!hrJ>Dp)W}hBh99~`LsOPiNd`y(AHya z7D7E)TZ#>w&Ut+#SC$J+LMOm(*ttwVLZ*nNc$(O+$CBtwPQ6q@HwG&*BblqzB!$X& z*UABG3r1kul6zy>OnpMKK!|_xmWiBUxtT}QVwkc+liAjh9zh>;(m{oFy;r;QJ=YME z7`vFUU|Sqc{zfJ!z#Mo_z1-|@WjRhXhHS``we+WmUIF1-Kxk}jZf@=lP)evUE>slD znDH1zIxL+P$Ke6|E_A6b+h>m=F=7S!>e46S1H{YhNLqRDrkNZl*Y1y{QR-AU&EyuH z#KmIE!&G>gh)a#2_KGa~_vw#403XCGFN7hg3XTW3Nn8`v5EDh_ z?O@~dC#00&uXX?%Gtv8)i_^#ZOC%zqQJL7Tkf#ypd@ak74RnpU^dF_DH z+sU$nj%4XlKJQ7Ido&dFG8F8AIyV-ZM?HOT_%tK?_t&P%H{jGSsBt7*Q;Uq8b z^zCM(1c!v*sAfjkZ$QrRB6#IZ{*Yt8~0l=?B@G5bv(!#WZ6`1lex z>WN4R5K|gZh%mZ;b}T4H-iy)P{@XOpFxXGA9)R}l0Fw1zeRck`-Tq$?j^*zF$M{da z1&DV<5k%#kPpQ@w*H(cBmP#I6n5#t`50dh*{5rdkpmLE&KYyW6tZAP3ar~R${s z#B%|xdvj)ExO~Ux)NtET_8TL!|L={>FC2ZD&}y}|p%`pq9+t)^-00ZodYT@Sz2<%H zE{GMkq~A%{5KY2F&E$G(7Q1OvELar_eKVs_E))P2X_mgD~HmJr2mLAe6nfj?e*|23cMzr6#0k!>Y=Lla9= z5~jZ%f3(t?R6pQ;_nO%Jkjnhhn=a)_BqrL8=uHs?q-tJDez)yf(FQVmT;XTxHki*f z$UB828|}g{I1{(G+0<%7`un?|F9=7U9X7Zcjf~-9AM%n+W#$S)-6#XzgNX)*3B}@j z?%5-RlvuS&JS6JVxlazLj65w=BLy7ePR1^AHgDn-+{3FMeoX+*sjvbU+wK0u^fHuWznb2!YM5 z30nMbJrB9l`W%`aDz?)IMW^tQWX(1<#PoK71iF$r;%``?(JTpRvD_H7 z5*32{yG%dQL>t83-@p8er~G+>VZxepIsl$B4VbA@|L;8I4DJ&P!_?J{g->+;m9L9UcQ878E zQT$^!Z5`6}aUzmtmtEeMoYS7(Q;(A3^7vN3BC%enMu3lG`PeY4ex}t>0k9e8gRA7+bSi?UL!@5z4Zd0d? zg4W`&+@Y-!=Mb_-x9l>k$e>++Ze`eGhi&(hLDw+TtIA+mR(VA(&!U=$zHPYl1uUcFsbc+oxWW}XdJ~!$~v1MC3U>h(n0I@lkDC`vfjCui|toQUz*o@ju zEk}JI&z?Og3ubYzRV!S!!0Oa)!|eLSExO1@LTR(1%HA|PlHH;VYYIde)DJbvl-p`7 z3OOHbP(qy6?0}dv@0%&1UAXR2C>kD5Ow}cJlhEk(ZMHoMovVFY6sO?GF5R2pK&v5N zLpIYzyu#DTw1}#EiErPRHxYnowYM&7(0}q(h#(OMk^AEFID|5CIh^ebt!5OG_aZD!>)NmFslOg&M!m-hU;^uV@gDj(P&6}H^0-^lUnMX6z*`&cp#cp_0}fNwM8zJ{J&^Afz3U%Kc8>gpRuyzS6-9AD<<%*{dICFS>c=!c`HC`T$mEbydwU>d{wu2E%3;1;k$J^ z0m8aD?>J{Qr`C(+7W@x{BW#I7oMUT&w`yrH458!xNpQINH`6P>?$wlv^`b)kd^hWn zCI#WwOb4(|yoH0V+!o(TX&1;3xWX7YL7I@SufUM}&Njs8bKVt&G^}JVhUFSM<4aF+*oQg7DiZCbML^{Wu>FWTO_V^5lF?fSXnY2Fb zKplMtK2Q*n3HYQgzuwUQ3#9(^ayIY{|1s5<#`yQ}-~V>ZIJw%GI@2ow{>qx#8ksu% zr=QWk_8XQ4b}B{!sLBH^ndCg5u5^Y1wE>!96c`+`>aez-DS)xxj*0nf zwpe`bzCOGS!8s$bu&HV(4AbdBBKCfYe}>>y`FD8nm9M#*`--mC`Xs`H_g(kaljqSB zxBbgL|CJw5E?f?k#c<2Z4W8e6O)dxmMd`46>g-w2gl}xy74s9wpw*ZWqxw)&tl$N4a6jroFM*-0kk#J<e%GM$$= zG}ep4UWY1LbEe|-q2NOjTBzI2BtyC5fyJvxQE{;t*e&ccUMBSDhbIy7@1dkF0|`qe z`xaD&97x1F$7({%#A*>J#we_=+jnGE}uid5xwE*e4` zbuO61F-4rOg+CW-9OIQ@48@E>FXDb_#FSQ)>afyMgkP7`kAID_gPJ|u{n}OT7CJ-% z`bbJn!A@-?CPW}})2(Q$+;}^t|e7AR(=845p;ibe% zC#b(ghn=S6IJ$4&@j#VUT1Vnj;a!Vq8J$~5+uZU|lR~q;cuD2HqZk@*9l5*t_@ahU zZ~#$#Pa3~Y(y5D~E;DjFI(wXUj*w_|{l=b~lF;;#V?wFJe73o<^kY<_D;lRoSjp8= z)W$@#m$7r{LPNu^8$R-v;|PF>@|of?E$s9(ptCh=^Nnbdtn^wCu zS=%*j?UVH^i-&Nx#@8*kTWwYK_513UTeGP=rUV&H$1cEOxCn+^AAMIt1g0G_7;F5F zIpj-4w~L4N(JDDeI#G_0u4MyYDL>iyPP8`_M|dt4(mR8tlYf&@<+nfY~2K1+k@ssY<&EDvdWG3yWkLk zs!t&Q>`Z(Iy|xLO5e)RwlJ; z<@-?VsbdBtSHx{aG=%C?LPx+=tF~0u8Z>OXB}m7Lz-Z8p;a1c7SQrF9LF&id&CqXd zyBSe2=QQ@{GZc^$MjvNqJz(hVk)R zN{(Aw+K6y-0gYH}*8n-f`Sd`yZxuj*RvmbPBioU6!!ml6l!=X47LShD2S@?xh6IaL zj#v|G_F-onGFbai!4WE1=0LjCsQnx{2}bBa&8u1njMrZ58|?Lpiagm;d;nt|*|%%7 z9e8K`K|&_t*?lLRs=79L#Tco4-W_)ZSMWtz5o&X!AA&Q+i$AN>YjyfA1%$Vu%SnF- zf;dx?_ylKcpzVZ4(55<0PMH5Tsu>GWZ`wx~S<+gM(QO5Ja}e=ZkZpETJhda&1Y;{e za-V~~x)}9X4XRN@CixkyoIeIh8qDE%koMJ*SP?@QqwcP{gQ+#YkXha(PWu0lBIjLB=BHB;7Nn{|aZuz<*+F^d_$7J~%BFiWn!by(yB-ljQq*~H0_NHjAZrr*iWBz}W zDt}nOq{Yd>AwXza0rvZ3{&%VJe`En9e+d{_S7#R?Q^7wp;h(%fRr^mP;4a$#DVRbPa-s~d=rY-*a1mZ30m>Dr`pvaWVi!kf(}Ot5GnEf*>g zuFKj;2sw+3B`YXv=uV5f)zpx;t=l8zb;>0gp_bl4zt)*dbPaWW(e7Z6Ra2;pAh%3F zKjCsZ4mrjU)-ONH2u6gX*u{1(QhazMM$%<|;(-s)C z>&clCRKFO6nhg74<*zs6#d;STD^pGl5Y`Aui7O%PUNB;b$)`SCTq;^JXEBYGq>N7c zc(41s1|O#7-PDpECT*DD6um=LOxm8DQ?v2ayZ2ZATCb2MdaB-Qr*_j-Jd0DWFEq^l z0^26yPRq8p<+ClDVpyk*umFl9r<*dEQFdu}j=RvfOCU^OgpF?0`du{iT)&@nvWz5F z1p#Rgdoqv?Y$K@3S)1LuBc&9oLy>*Mvxr?xjBy69%pQ7K`L+?dt8m8;mUAC#>2sPx zNuFS9{Bw$2e|D1LPYAodDdDXcVFpRu8#O*yGK;I4Hk?$tjEw{apG^ws0`NAk6kl z0D*!hZZ6*Q7dU=LtRA1~vQXFgh6FLk(O9+^Mj zer7!{hncJCcMr=Y^gvD?h@zln6kZ1jVq*O&p!15s4D%3pns6$42wh;(VqC$x;9 ziDk&b7K3HjutB2pY}wBb^@PnHt3=}tvtv>w8Qpuz3>%HS!Yk`@A@q!N7b!cZ(-yW2$*rbpZAW3@^Anz- zBYJz>lp6Bc+r0S|%J3=OR2~~E?gJIz;@z$NPpx*29mUkDvO!nrDS9lr^z?TK%V=qY zi;VQbNo&n}j?*qSp?S)VVT*`;NGc&7-ZG)H{4j53Po=HOSyU8-sbS{Tymo}neNL4M z{wrLEMO!ABg?&&pRkl0l(yY*{9hOTrmoI?>T^FsFO1kQETnoummTBfd!hEZ`u?Gt| z2%S?*G%n);vb87A`9_r)w_DL!0U7bH#>c`k{TrC*wIgvK)~&_d$@}r=gxHf@aKiaE zByNiw6B0w-*td+R4*DRnw|l=?EElSWNw+AjFwtTS+o+u^tv4`V*DmiiRI@T#`pF8} z`(0w|^HVQL`-k{@aK~y-pysQ~;IW?@3@H(7)Ud=71|OLYi@vSeC5WZyJ?dFKQt;jj zf|_v8R^`}nU9dnLOA-({2z&r#*H##3C^ahnJ4xj7@94vaWHi0JO^F; zl_?iF>UR-c%e?Alh2>*wAyWrlcqzyH^j)Hh0JDhmb5wDhZz*y3>jSh0Y-QJyuoYhc zmeKISF71NcyGZ30@Xk9U_Wu&1f2N#BaUh}ifRZT%bj;ZPZ%XE$@)Hm&FY4sSa7OLA-JL}z`0G5nm-@Zpf9OT`30SKLv> zfCck{DEB;IV1#44dgrUjAI?|l%x`zgEd)T1bv=QAOQmNkfqBL_@-94s%y`rzRvy)a z!-y49;;#^}B`+BjTxRUK3n~G7kO%3!PdY1yb-TPbKUJ@`BJ`9?rK-m1+bo?+jPZZ1 z-;u$j)D+H_p`OCd3JWolSkEDm3x@IR$!1cWWUTGFWl>`tvJaN}6Y_>)peRcWV~p)Q zTHvCs^f8~UryQ-PRy!9aRZx-Svtvf()z*T8XK}}zA$VXenXw>MU^K4XQvGljBM?5c zMhIRZ$c^<{@@BNl_Wx+Dgg|{{$jR3&;2n{6mw~qHl|uDpWlU(v*?Fm6S0r<<7+cVo-+~LOCL{zGYmd`kXW#A`2q{VMrm_} z*Sfh!a?ZtVHJdL@a$AGV)KBzNhTK_yJie$+4i}mobkiI};Uu+!G_$%Z4J(ncl?-@#jq0lxWcNaTCC_^+X~5o(lF@Hef|``@+%psg2(qvkXS&e;HAV}0fn zQ|l^9t<1k%Q>~sT^!j|uc`-#0{@vrPYQ45;;QvpM23+xUu{8bggY z%fX8XdYhpk?H2!lG)Y~d*cL$gX|7*pbZF0PZAVUj!swA$<?Fn$hB6wmGs{*LFlk_k6BF`@wUuLu*xJ=zvG#T5$<~LDQ(pZnNq^H+8WbGY)M0 z#-Y1XZ9LDAw}g5Lu8ptkb$i=Ugt{zzL2bW#o1JqB0HSGy`&(?f3_QCD{|V8o0Ep&} zp&o35?;k1S7_frgfi4&7WG3r>9_{P)_0?EUw?o^XM+h^|W47aSo^UEu@L%A=p0jTk zR{Bg^UTSuDD#Q*sr`KZr{st$wyXmUyURF(Rse3Aw%tFKT?We@!k}>DQ5r};~taKNX z0t)IzXla^t%DX#?dG2B1Cnh-JyaRhEDGjs9Z|v#=IZ{s=?=Z0jx&AncOep#2{vRft zB|pOmW8bhX5^~;4Bn#Ylsb0)Hhby09sd?k2wcmyqRvh)ut4b=e5Juu|O9(7Igc zvDkjU94Lh5)68yDg5@L_YZ*f`xijl#{C7*(ga^?<-Y@k z{sqwU*w(=R1ZYM8KtKHf==7JcZHTBzKS2OMn>Ahm?Z^WFy1NDd(1d>j=*&%806-4| z02&$P4?vUr4WJ9En-%{B(B;XyOcw!ae*k(o^ILNq-#-Al>RK|Y{2u^K{GR{~vorFy zq2wPQ(9$Wo^&1DszB3}fqY)A$!V;cA-W7+K=jYJJKrB6v(^r`Rq9F5b z^8E3tXUiW5mIy@*Wk|>b-!XBQ3@4#*^Fd@DOh#B5qEKx zHZhO2q1vu2A}^z2EGiEjnlf}Iq1&oF#@ZUTpL}^foJt-{GM!3Z86}v|)?z9nnVzBc zNySN;^}h2|gN-v^6li%Cj}{Z>RWn7IqSB*?5|{C6#aO%b zX-s}*j9F%R-U{6`<&1>|SO^H66%KWVZs-NKng}9Xp=)27!ExAPV?O`*c4pn}!uOOY zJ1csfm`62T#*z7yI;Zk@Rog87)E|82vgFNkjTJba(ansC1k*}T3l?x& z%#!_2sGkO_k>am1L$5don5#=!O;i`%LsP<8p_U=dR7qyjK}bRVAq97b%foboHTrZV zXwbd|qa^)jT->gWqo2yvHRj}+WlTdAGOSu5)eg!~4h*A6`dJ89r|!KxAec-|Ew$ZJ zLA!NwyUo zJ`Kp(V;a58p?O|mj{8TjCt{$vEe=JK^y*7ZKl&Lqp3w|3%W9TkH!(3PU!L2(wq%sN zEou7FMEDGr**u$=&r0jdrgxX9MvP5CNuT2 zI1eZ2C6GVw$9THz$Ke+-cmbLN>^%X0Fs;%(k8)lAETX?fS6w43#M42t1_o0PM;fRc zIpmr&#g5FjNFRo)XP*_H{xQhl=@EtcbhFDZ0!fdBUQ1ARO|DoBNt!&q-gkjKfGc{t zBJobn6Rr>GbzKd9%ARUKbv9*rEC1R2Oic;MRHqh5XC6`B} z!V(60nF550{gRQx@ghg2tvc$rPECpsR+u=td1WpoH@8*(%Vb)UDkuq;iga43F;#pR z1;W6)#Ow*3c#tDcKeVmq+l+}B|1!VzEW@W;R1WcX9C zyF`@MRe*w}2h1P!|6dFCuU7wGB1F#K?yn0(=33u8NA*56GnvBFr5*XrTagj+fBb1AQ<&7<+@Ed*=nW;1Sfau5h00poEi^}9i zh~qy~;!jrYfbRlLL&?0Jz<_$3K3i4_Nygh<8|lW4zRH)E8p`zgMa$yz>A(*chk)i3iw(@ zZ=G$m`i943FU^iPb`Vp=g}pa_4!O1DHM_yR9xsdUVMU>B8oCf95p=%P0Fn{|+c+ve zys6Mh3(xbQ>SEp2JWb%RwqrLAPk#o@72tB7aUWD46TgbyJ*{o1@cMiqAlV|C67A-J zA#7*S0Bd>Kp6xd1j5YNmSFi=Th)2{glSeMxLZXK*khf+v76arhaHsO#o3Ts`TqJR4 z{jTl(@vOjy4tBhisYlAK2LDKN6hYz@e|2%QzVhKPrcD8BroE-46J(N1BnIGuG9DB| zAjQGPj1qg`RY`ZLTpmQU}R9a0hWeCw;Xor;FS*x_}->fU$}9;iYWiF&*uNMvxeZ z%}#Uu8pL}hcI7vx=T(-fyOb23`C4ZEixuSomaT5k;de4C3{{z5MvL2%D6xSC&ghSn z2RB%h;m5&Qrpa2S2%>%tdzMnwN%U%(Sz&F=Zn(oz_X#*CGInjEQuxN2)WN*tG z#o-jcq?~JQ5!mKW_bq&ziS}(dUi~eTF!nNnDOltfJ)jUE>3hYjTq1tatrZTV_9zSY zP&c+omERIm1VoR)=ztJxi{QR1Mp#p5_z@Z z%$~6fw#7^Q__l1lBt1Oss*m8{SkhpKsI{C}LiQ($H5wk;exso1F4 zwkx*Hify~X8QZSdsn|)ywry8zR{mLg?Q_pM=iY;VKg`$p@Qu;G-g+CYx5k{F55ZtO zA^H9{t;wI8B47boY8{A#)qr$`%)fe5{3H4N|H1wN$%?Qgl5bOW^# zKZ(uz#Eclpygq~~a`EFNV@EZ?bwLCn(X|a8wxG*CqOE3KRH~)jP3=HtnWdHshCHGl`=!a_Xp6vMK zK`CNg_D`C!RD{frH<;%bdJSCl3H!l-+fD^W)_-ysFNq-g$3>S#@W@4>f?@tv%-Z*J z(k1B^P+qe`F!=E(-5}A1ThE9=Y=gKU{f@Awn0kXSd8${uy&)EaQ$Am=_{EC_N$*G! z2`;$BpGX@(a)_Q`G4?YTHXmE}ZuOjVSwx~u&@;^8TiC_xbqvfveJ3x3c4s~bm3w|71H6*~2@G5jlZ`x_ zYnb_5X94_Y#D6C+{uB|wozCP>5m^9>=zowU|1UZ8KdPX=^XRrf9v#`QiN5m>j}GBe zQ7pZ+tqlpRB!9{Le^k;|iW`0C5^tS5^b6kGuK5RK?$sY6y&$T7N%?!ivg*(E@k##M z@w2n>i>a?$ejrraQs^j!1=y;&2z9tlDC1%%y>G}a`|Rj!eA8EP#JVhWeR`%a#j|RF zX@DLULV;-?Dr3iCbsVqH64{u?O0{GCXi?sxt?}>%D?T7R!r}4EYruKkwYG^A|FNjV zZzxAAB@U0m9bc%%X(a{GcdNkTZxJMxd!*3K(SQLx1!X59@9Or^>L2r7^o9=Yb47pVam z25S!{ayGc9XT=Oc6BTd9*ut`X$_TMF<8dF>Eloh)uk4fr4e^NMJVL*#ZIHV{VzVrNnCw#hJKexQPfyJI`*vaT;`l}Kf(7q`1P5{#< zEEt0z(xHwPlSoImUql4IA_YfGv4PS@bYL|}{;TciPvQJ0g-W*4 zhIAhj_B)HY&aYzq7ZCj?aHyX4lmIyJJQ0Vw*B@&Va&l;rv**MMfwMAEXHCxdsw z2*Ex_WJf-fBSS}Pydb(ghA@sWzECsxMQM4YPz7_cnSrT|s4^)pYUotTe);5P=ANLfXHsLQKhjPXwOBm8NUL(erF%|3;9t{Fjjm>^iaZM8 zCT_K3WxV`+oYDCNnsoqy3|K2}o}Kl62zI;`x3HA171Yp$=-nmaDURRhbzgNvQ3;g4 zgV-p2_s}|1OdRa|Pv3E7{Vh&Sfg{u*(4kW8Up)&^Q)3%oJdK_CKL)1%$M+ny73Dul zZ31BmioWviyOXyHO&{x%s zUe_^a-cN>JV?hQTX#reO*e)ym%*BR$5opZ8jw~@MX<<8T zll=~uM@C$+l>m5L3U*zSu>D~A4kRw^6)d$COHL+9ZptzCO+X}txNW@~r9jw89$TeR#GhhN11-eG%UU8+@qKhKQr$#l@C3+ zy?QSJw{wCU2Z|H^{cR*;nY4;!xQLQ^Qq*}<*DT01JI|3D+pK8I0j+2q>PLI5?opXZ zLEIXq=m1A&o6Np`LuI?k5@sW&=ZGF2dgBCSy?PXBRjR}(XwbDrg*5-PLpmtJiix+H zK=pEHPBe3tEhkv=R-lTzjF0$m`AQ?Cl`2h10Uke3%r17{GLiFhR|A@c=?M#d^(>Ao zx@Uf6@Zmvl4Vu|*I4X})LVoNhx(aTwt8R}PA}dezP8&drfYU)mL|+2b8TSz9@Z+}V z3#D}@&tarY$3C-cW3uRKAdZN}+?$K{nyAe0qfBWWOg?J=^300~=-_IXdR;SY$-~S> zMWFepkyl$U&H7p;d*6eJRb*sU$%yEZ;4@}cod;D*$JKFidJ(iS!Qo9PCNs+-lS^jg zb_*b}KH;RyjcpK{KbQxYBjH8d2Q%VSqQy9YaC(xJ&)OL=jfWdNEnzE)BUq5D-3i+5 zh9I1CoV_eYb@G zEL?(j;b+0UD)*6wd)}ijO)BwPlk4+onk&ypQkCQj0fJ)a@ugv7FzMZl<%8uWMP+|K zD{WY{!J1CLK6C>v?R)hx0*3);c8kK%m+!*s3LBEF>$IuK4@G=OCGpC2RYf*r#|Wq{ zBta+#Zn`@X%wOJ-l_E()3D~5SV>hYJb&*m@W^(^yhmnJcWt|3g7Zo5@Q}|cw`tJkJ ze}-!RwtHbm4Jlm&^Q49-{nJ3_4^-=x6sAi6exYs7%T5|NXGq_Gd`IkhI{Uc|D~JjV z9~t#9*MU<-%{(33&hAcGK@5#bnmz}qg+qw$xOKDa9fz*`Sep1uEd=aJO51V`+NIR{<{O!Li|9boJ~?uM9x(*Q--gvRN4S4&RkE>>{EYg|~4m8KK1% zaAQD2(MV6R&ioxI1o9*xt-lstP|I)s{;(NP+KTYYccwzqe1K`aQUCPED+2sG84JR- zwj9@_tYh96BEhX!y#&v(n)fM-#$nC zCRM+G2D7U92Rft6hCwhZH%s6TrRcP1&Pr@*Gz25gG|e>PM8i3y_BtX0r7u>CMG zQ-bL~qsJ-J(JO(WsMD;{r0IWFvVaMJplZ_Q7-6QXKjZNRebsn@ezPf2FJpZNeOJmB zFi)jw(oIO`_rB?x^8R@STxxj6^2eD+J08Hgd146{SeM#mIAj~AoB?=e5AV`?`eb)= zKB;eF?$<7dvF6u&ESNFdCrSQ*zt# z4Dz?VT#XrBD!Xg4zIen~;^`lA_1;Efpq#Zex-L~}8N~?SVj5~es+<%TrBHHUl)~G| zQ5`dA#!vxXF?NzCBIKm)d#W-Xichp|KA4q~yQuxae5I^(Yvi`D3QaN^Gcxj;tM;#C zWuOxvE_GsX!f^M#4Tri7!h0VESOy1};;Ai_0dgp_x~YadNBJuvN&*geR2PUyZRg7H zC{HpNJHRWX^_Jw9lD#R)4Y$3DuqEP=2Cau2{hZpydzrsbtfTo^)SHl&h};??d!ce& z`4N8eTpd1`xV0V6g|TU@qb%>yO*u82WOWC~*6joI)%NKvA7)3aWM%j&a-GYYe(A{b zn^|ctT=OrwAnew~_#qr)_oe|{3CNSQE{ZF%Gvf2{a5-FUcAyE?l&3@p1a~P3Vy`rZ zrj}<6PD{U+Z(FH^nCJey{ch-yn{9(ufrdZDlqQ?!>2UuF5Ty_oDm}_H1(~1 z+|pA*yF^uY=bFNm=9t8D49;yVTI_pq!AXac-7lvLC;~@Kqm5;)_8cZ_#FRi6ul$w4 zTstpw2d^TXGBb2%@wb{fd*%$Amq1URzJ+Fy`JGFE&;-9pp7^9q9HPYPtVRl4NRhIg zVPlIXk8=W^$LR(0CplUwBKy2joWa>KtS~tTC0C9tnzqn0|Hm7>8lN)nr>vS5kY9mF zQ~EY%AI2L=u}f5>Sarp+ zSInJWvg83`TT?8#e%|Y+J3a}GaUA96OUQS;!y``=BGJpCmVU*;AuTVMbz@Df8%!L( zn6THhepCdyJr213AMy2pd=cxq)=ByUNE(G9_f)gc(_uuSa2jQl3It0`lWRz*9YqC6 z=LAPW18B0yRnx1aCJxy-_r~BVX~hyyDBy+t9eDPhtox0-w^UP{%y=iQVq4;#zsRew zu7A+`y~F>PDebx>d|Z}YJAmX(38<&lu1z#c-sAX z#rOo>e>pBoA%zC_GM(=HuyVB4Y=0^B@pN<)31Zi)p`;r+0<)SomKJg2D=V%(*nmI^ zhm$C5Qr(RZ^TR(R%VU}4Mk%Y?SgB#VP?3uqoe-;nGT#GLVZ=jwJ16Bj3R!>_-Mqj9 zsbt_Z3Z&SLAO|ZJtKV3CFp@<-0huR7&6yjv0#H1UW<^thi&h3oyh=fwut9WCLbjhWwBWqP^;&KDJDaWt=%Il2pUn=r}hEgR@io zEz8e&gKQCCxLRHn{VdL@I-*{LrL@plnh6NLC+Cc~QT_Q79g7X<@q`;c?d2JpZn;p$ zLsrROSE;PdT1s{vuUOzrtbp|v3nK!~;H;j?)fFmK(PVk;Br+qVpk(HBqm@~aoLsx9 ztW?vF0gf52@VlAElqTGf-R(Ci9sw zF|PH-f~RL_%AvL{Qp8KGcL{&>S?kN|7=WS1zLP|~5zSF$Rw_YuvyQDV1v#g-0j({a z@+NlN7cg4kBSpALMkit-}uy}H`Z9} zKLHI*D^tq~ZDlwqf{iU%?M)km^bqE}zU|wgl=E#A)pFo4&ye+BOyM;NR1r)&^O)Pm zmvA%ZMlKKVuA$rXSHLaqc?DugbTSoeo7tF3MJl_OW17h+T_7wAKdHf0eU7eT(O0?R z*^Ij`4s5<^3Ut3>cy1u0W!Y4@5)e?lA{J0~`1C--70C_hzGH_&M9USbz}1+-Q?#uz zE~V+rtqfoI4yPJ5`Xt+P^d#Kl$(O&4++|Yq?|Ca)#$uu&WKWO0^G^=+`l z57g#gMym}iB`CAbsVO7n>LZlSGRd%QXG;~;PY15~n_esS7j;|n{ygF-obKuX5@B10 zL*wpoIB4C&TOIenkaIQnBVvJ%Hg)p$Cp znXp+IwCpY_=i6qnjfk3Vhe*5oBXjn>!QI)9{d@1lZFXOvq>--m`rO&NV5oDRK-sq( zvA$5|-ur-8!5Gn#v|whoT01tPNPs!0Gk7If2b@Xs_;~B-+6s-QyB9<+d^6kK%09WuK7H|=;>&_{g1z5dq&1H49~;L#tSuAaZh-j0TEHyf zq7$Q*3#|gl`s0q<9Sdt`lFgp{AVJ4BXbr>N^KQ4CV2fW2>r(O%BgqAP8#^@?i{|5W zF9d_Z*IaH!{y6CCtufjc6G)pbjc(7{?PUjtzH#61xAor%@0ZsyEP78N*{1Rsc9`9x!ba-&=4#{UaYu%jq)zSfzwJTy*L%f;5qBky+}t!_jIPb%MNt~{ zi0L|G=52>O%X~|InmO)o4&q;!0-`%2H(mi-@aN1H62qarcRm!tZzA}Hu1u}|?1c*%ko||qaJt)F_eR2e0%&X94;&Isgp=)6ygPi^ z<2O&T{zN}=9M zp~_Cg*~4C2QQ76Nydu9Y;|@K#hHOeBxWC7!jZ{Nc@(&L+_5q&`!;UX4E&ZW3_NRoO zp(kr7m4hN#UnP76!wz-6N_^-FG%*Ezn$}Kwc~ru@NZsY1$W!x0>w6KTM4 z=(xD1h$Mj$+SZt-|89HYfz85ZvDp7{4v>=pPf0;LRgKZIJ;Tk^vDh z-8)qpeM%fC5NU=+#rzDf*^F*pKDrG5dCwwR$a$9I!cqa`?*=n}0KH5oFT5r&#nABo zN-_Mub^!k&wNy5B02(_139Y{@RsL$y$?DdBn)F6uVY&+sJ^3BvEQgx(tkjw&%Di#~ z_LmvtIMoLKSW6b$Vt`b(taJ}_m;Y8b<2G$2IsLHmb)xk%ukP44;tSq%KIvIZb#?no z{ztxtjiYtvqstG!cY+5I)SrpZj*i{ z%01FN2mLc&Iz}Ofl-lgy)9&WDvg;y5kROdTr% zwl2|asZi4Ylh&rR@EfT?vL2R6R;cgXO{e z^phpKw)iTJkk&K_T$3!Nv@3%~J;OZVDvMUNPV3woW}DVes=5R08GLd|)Q;(?SqHN5 zWmx0Z)wMDJkXLqi*UZ=TUg<$jnyvwNzMz%SBUc~BJ!lL;Be~w=2OQqAOvnd`o-G9$ zzd=L{&Je9#Zk?#$-^E`R2)@bA3)>runc`;_+eM#kRdcPR)iveuiWl4P3>HV19dfiA z=egT?wwGEb<$@nie?|;-++8z8q>Q|&2A~3q@$}hIwmPRavB*W zz_Xl5!WC-sEnSr#KBWkaCg8=lo>6Z5m0;Xd_0?1m?zCuBOTri{v$pYSM#oThy-_Zh zve|d39A|?X(s*iJ=!uRYqbZVf@3_f0u9K9vrum><)%gIU1H!gssb|h*qTTwi!?CC% zz7Iyw0Psw|zZVLhiAdIQT&=&GVO!cH5cc^^$TSU|c8RrvJv*au?EXZdG9 zH<9+6z$%-q4|vaO+@;dUr|3O_HjoXd8faoaqL7(TzuzR-U$S`PBSfN%!5qvnK#VxT zA;5o*x1LHNAuD67qnrQOMwS3Q$9#u)`iOggUnTsUwEOLuc$GYh@EeR+ukG1Ep-8WB z=}8MmZNQ|f%ZBHT!dvw(`C9|9S6G+0&j4(a-N1P&A~9Zl^3Q^e07q;Ii#`X!E986q zzF!ceJBYI0->W^o=T8{CoEkKQKS8+x|KYL|H;y4SS*e$6_-iGUQJjtX7ph<_NR+Bt ztO2EQrWOT0GW}V*S$PY&p%2kV+fr>Gg7);{cHL0>0@B~uJFaIaV>zRB<^-MY;6H`3 zABR{!O>0nEz_1KC#-JTj#Q2$+r)hCXl2C+;Z=Y3&Rv2cu-D*y(>b&jo9-xph!P$zL z(64`hfZuBhaURVf3M6MJKwh>8`0f_n`c&mlkb6s#W@n#Vhr61+p*&2$dwta$@*~En zbY7S6MOKLO;0d$v7l1zbG1|yw%f18{+sm*tHWvsZ6A1skQ`;jjDEI&e|H0?80`rN5T_X37%P(qW0)l-%I%+Vpu7c ztJjkaye<7pZ@#Dg&PPy9S~cq9!E=@iMMZzk6a&1?!f6M}sm<~F=Bu7;md*0-5cYdJ z=X@O^gS^jAdMuk&-|;Wi6akOdSHG2kAK&N(LLIO^m6&E3c7M8c;QaJR#T5xLRqW{& zgOjD64ndN>QC~4w7VG zaJs@)Q4isrxoSp6g~I z-3+(Gjl*}bMQDAk-f^olw`mC$>9rqIYDds2QZJn%C^(}vN?w*Con8uZ6WN57iZ|xd zuf!CT=zbGEIz!70BZQ$gdfd4x&>w>3U=t^VmI`a*JE6PO^fplznBkh(1_B3YyAIQv zF&SqobWp3TSQ%89vncSpJ#_&h@uj9wxP7=4cqGmb;p{6(&zKTf$-ya*-xFYA``M-A z={tjE4mEUy17^0pM6t_58=U&hdF_{s`-+LzNenU4+2ja6LF_ykCBD=I%Q*L_A=FDW zi%a6=!NRU1TL>JZs5wsw*Bb;=C#w3cLO?6e_JMV6u|yAJ>liN2k3`}VmoY8j3ka{W zdXutX@Rv`C#|Kw{->z8(ASFq*G$G7;g_T9Kd`~X~;9Zj`H9~K;f92V|_n$)5Rx_QI zs^wc{JD?%6g9w{#x_6jwaOs`HM6F!OK8trWSdSvyJHt9GoAeNd!)I+ADFoZlTA#^k zb{eS6BA`Flf;9^(kme0IH2Gqlqih=W>||(ZKWslL&X8+Dh0ETHi4}2(;Fmc~GHAkQ zQ*e&%|FB^IlQj6oM5ddQ$G2Zv)P+5uLa2Q2yu6}}G0@M~tcw%_vCs;g)y|4MjDt1O zE_D(+IANI0R@hxC)xNT-#TmF-t&qVpz)vYoPoOmzEMU=(0Jp?#S9y(Xj9DTh#)zb( zHzq*^*eEdK%*o%?##gOHYggsVz7Bfc;+8$2r12Yt@EdH2)^e~7DOe55tKbSONFsr6 z{f)OM4Z@ulie>Z_OZzP=R6_L)EY##pdEm#DHBM~#6C$C?wN6}X$^;e<4PC#Q?5-CE zim2(E{J`ZkGzRA`1;)4jJ(}Oaf@4pS5kE=Fch%R6ckQ2e7jEahsP>3xeusZ6V@fw2 z1Bot;kr|ES!@j##eP zSjQS@%JMmsYT$;oIQ^(pb$#UF!wMTO|m3H_E%_r>e$bCQ}uaZ3C~& zj9NTKGs6ZC*&~gwx4=0qI>2R~@3s3wOJda5a5T)?)B5;%64N6UM zL(F&Jq0p{!#ZY|rSs@g|tSu@7atGCdRb$~Q2U&Ch7#7|7jubFEWy{cET7pnvD}EUj zca82)mTvxs0xtp+D0X4$^H;M`VyEBH01QZ*;9tQ8N+1!O8Bt&50yE`mmv_wOT4RnC z+s~$P$kMg)GjNg+n5!(QI_Y7P2)_&Q?V95Qb*iH9|OY8%_d zrtZ(@K)KJq)uc02_~l6#@4#zip-jI6I)4YbCfQk3!XUshW`jZumMz){1^0d5*CqW-G%#=9(Wfea@rI}pp z^sW)YdL(fSP1Esow~xL=rPq=c#~m-dD-*wl;1{)>R=2CmqI6)bzW`i=7x8D>*@HH+ zU?vL58foRwg3fM44)4%{&7mn6i6`2uX_`in3Wfj~l>+N#$~I{NaRI*=E;6$M)_`Q# zO6h^iG30CkKYuQz)|@UMb-TSKEdB0N2nHGQ`YDm(b>c*X4v^?ONhb)eB&LYtc5+F- zubUDkcs#x(HTiQyHntV_l+#?%#jKMNB?wFFC%HlnrHdNB>}@ll&Kq)we~b0k;#>DO z$2={gx=u&Tm4%_I0ry->OsWc9^n_qFBw(8pl&ixNNWYvQ=UZ&Z8rEwZE6O_16jM39 zL#PSY@AdBKtRt_HywQf^K;w-~hokK;2>0rS;$6|ra)`R*L?0pBf&Lu9pXh5i^wC_L z&G@1-hOio{nXU+ydONu~k4{ATC*xW6tco6+4_soZ9JF zD9bQqJ+4Xg#Z{1Y-3g|w9n-}$jp-He%i`W&oJ-An+YfauGpT-zyKXmmW5Dsk;x+NY zFDpNvE;p9=+S8YOax{h$0jzk1Do$K=T2(0e0?1<(u3?D4mH@K;6Q<2Vu?+GK#@qU!oG)wz_LU{>d zSv_V-XU$oCi}TXoSoKmV`J2jJwA6POTEx=c)YlK=5V^$$r}C1mZglvHdM?$|mS9Sk zc3lIHe-RvWPCxRKfWlGPp8uS9INJJm%Ks0s@K_WS!~v8M%>sY)|2^gZCojm85aoy!Dj_oqEQXLXmyn)j+09UJ)NbR-;eNk zZx3PNJ*9c;w8eAe8V-p&YE@C>ejKl8;=-sB${LB_Ry1_oKh_DR{z!l&)z*e9Dk$sj z@y*ZHR{U->K)~3@A+xzhj|k2nlhBSlDUo!N=-D>D_;gqMTpx2WH!4u z^wZz8Tz|#|=AR4mO~8YP13rNNBB1i$#sz2K@}jA&shx{6Kt|5z$Vyt-VOVKIEeOU0_|nPkVJgzNeL{vv{Li6q@h3EElSflm zJGX~kyk9})shsz@;e>0Q3ocujQ(%drIhv9?xoh$Ej=q0m-+9;J`4t%NH+FrD#Jve) zedNs^Wt7i?x)Rwm8cT8(1g9h+P}~2V&|@qEM7TBG>Z^KacYvbY*QABniU;#;22}MA zf8+RR*0%{@RO{$fmL0%z^~Z?V>2y+gD(}C)kAIG%g~fzk5qK0dK@fF%19v{+S=1xg?tS=yxLqrQV5gTB}h6dkboJZ-y#6D7hJ#do% zH1ld0t;Sg$!o#5yfqJB9O+~nuwDe4!l9)xXi8kbv9wZ@zE1=US->@lH2GmnAqX~>j zWz%L$6^MxOZaz=@nJBO%%44&D%}gv;~eqh3(9 z;*90gIs2@6+PNd`uL3~7L{ z+~qacE11A5=mJmk@eX6sxd-;RT8T021a+=t95Zh*AsTt@3(A6IvaS#TV!4)_zQOl( z-+aOo--%a89w3^6BRr-YraU`IoL-l#kJtIR7N&NubaEx0ul zttVc@pO3qro(iyJt|$?|EnZ>ad{kWho(TH6$9*EeXz}%GSFD3bC6g8jK&26r!4y)x32Z2n$8&DYPwn>dl@|p6F%` zXKZeGuHh{hch*aWi4uZ&2;j;GjYz5t*Q5`Yp9%)g^NBQ5bA1AWoZ^sVR7?Vqf5z2l%2A! z2{7MlO!&CMr_k^oWc@~?s?@2-SUP`==ak~?^C2FuWx2Wsy$IF1M$DoT>|M=vvkq^}fs zijd@l&6d>anM_2N zC#S_jq3*>A%Ur9xBrnNIbVH56KJ z!iWyH7g%0B3pf9{y2di{JltTKcC=YJnnn}Z@JWj&8*2HHU{{>%bfR%zID?4jHPxBE zIQ>e2c$~DnAZ<_uKYy(N8+xN>?KmBeRFuQG{Bu;u1415reE^Yl!OgfQ53|+4qiHWg z4d+NVi#-Bb(Ugqe4IBGCS^p$om^d3xXj@it^a>73UzX|w95*JceY0UmXcL{JbOd{- z3VU$9_nZ@?VS=+9o7I_0DL1BJUB9a7#_B>c`YD_^YC_D08Q08)UADpuA#r9xpEewX zgx0Z_a)D=$rP!otL^8xuNsE3h)E;haG zE?LnGAqSL(o+#HTG4eJGS51>LduG5T1JXWT*A8eMmjgw4g7f3)WSN6gkLDVS(W*U! z>84*>@d;z^NukX{%n2qE6O{;MWw%4Ck`zO*6g_qR2 zXr>n+%74HOK(*IOXrQT~Br2w~eO5_K%ZU97uC*v%19oavN28wREi9%uHEd zkFYfh(etILbP!`XQ9CY|m77y*&8V)xdD}Mfku~hGz}870tIUa`mM{D{2g4>N#kxQj zz^jvY##Lm#e>M{$GlbEitl>P*C#QBg`lH-sJuK4&LvbOad`7J*<3|Ng%FG$};jcD@7UCM%nEA3h_pt;UeP_)ex~gF47L4m~_gg1Z)io6$|{YZSuu) zH+urtPp3Avc9xcQU$+{{Z1s36HVA3ENUIiFe@7ehp(s3Ha3&T0BA5Ch(Aq}U=q$M@ z9Pd6UHHvrZ$=9%!?+(VlH4}fWR+b18t5vW*5Sq|6!M2;9AWQr3bUIUQh|}k@4zLwk z5%VxI^T{@J8yj(cX&#M>j4MD*A0+Hc_+>xuN5Sg>tE%Y(hQi%3Q*6sS@tw=6PViSv zCQD|NXq0LDyx^)zey`vmhWEpAX{n~4&AzQ)@yC;s?W?8;Mnp4T5DuTL%Dma_5VJ^M zsBA%oEkKuBVwJd2)sGTgYF1=mX|b=%X2@hqGZKT;zm*iEq%zG@Iyicl;yISEe(U$h zP}Cbscd}Ipp{C#MmBlTNt*!N9Q>8{4%gYTPDR#44W|>Y$-`9aqi5@2R z3gTub=v0odeP|N9Qp<#B_B3(0rP+wW>d2D;+M-D2uBI&J zIGwAGUO`wUFiv5$;+5`$0TpSv+mDI1nN& z==`B2ef6482i1O^+8@iQQ?eA{u8%-5bQ^XaKM+p!Q@1ya=j>@{9HVUyu`D(e3jyxW z#$X-c=%WG<*FsE(4#L|SCU9L-TwQYd`aUQP%f4}9TSH2nfE%)8_gY&5QA2b8!Hi{= zuzdMb!7_HHu#s%Bfp;oyvL?E7gmq8_xtS!tr&X(L-!$#D(7ICrS@`++hk}lo6K6u9 z>M74y5VvLjBhuKd&W3FP+1_V}M^ND|kVwlQ(~h9(Zs=MhqWpG7VR!)}+8Qocsv>_Z zx#bXKAq8R5HWZ309vXb1Pmh`stQ|y3xMbq`{1X_I8iAzpG2@>nDm<61PH69*x8q*~{aas!~2)ncAD_73X4GJ6*_`LT1>}1ZYUA?v4ynHd57J zK$T}xIV^)cAz*znwq&@Rsh50XI#L~fJB<${@4xYZ|AKG2sc0Fa6W)*s;^z8A;wn&P z6?0j1-QRp~xwW_krNluFH6oQs%#B6q8bH90brY)b+XSQ>UmDH!L1oFaYTmbZ0oCoj zln;f&e-zDlt2nMj-eBMV`t2@4?pQWl+_#g zsRL=swpmsn<82m^$(vs?$CLP~vJO*bk8?Z$)9al2iv3#P34r5`DTpSN#eLhKfGK$# zo9FHnwk0EQ;8gE95cue^-yiJN<41&Y2zLUNbYu=MRx0qp> zpkbMS;rK_j(KEHA66b0iq*-5wvQ2-*cMF@U+V=8^`gyInv|nSL?Ly9MEs+}ot8x}s z2bk?x99}*-0(3tKXzhCL{9`NB8SZB>JjpjvDfgCt-8Lk9r1E@fS?FmdDy`~*%*f}o z4z22lfJJD@<=zJ!+!Yzm{{#&9W-=ohP~`(S@x?+b69O?X6bKUiu%;Z*x(rF>gd zf8rb7nx@!Mk#*L0nyO#8n?|Q;tU)`R(nyHdJ?l}~x~RSC`f6@$ z)48Q=1+NFCd34vlf2pRKblrM-sBfs9Qad{v$|&eN=YBc&^tvaP?H{8WpdCm5f%@AT z;x|vaOr;!m(Bk9J9VN&QB!K#-F&`Ld1+I<(cmI%H1qTwStH#Mww%qAkB`52=KVR~7e z{E3T`z>ONH^gP740k4LfEK#g5`Yn^5715_}xSpu-b!B8u(bOkUc%A~I9%l@-1l`bf za7Bd#Bk88#7FJc(Yxp<-Cw3MIb4|O;$9wQaGR~#t|7v zxfzy0@QPVe3<#WSq2+Xl)lrms`69B980&#q!Zi+rvY;zTVEK^c*5aziCVIJPnDQwN zlF?G6S|IE`6Ab>szS)-jO2>noj@Hs11UfrT*RtiCmHCP33t|BP{tx=sSKAZ@CTrf> zctbEadXu$L9OyNU;Vl!Hh4qE5zYk4+C>Dsfx?hk$%PcFP7@PfnJ<bwL+ zFyaa4K;YQn%264+wel1i8X&`EDz#zc*dy;)k0M5>FclptjnPQ35Z5277=6-4HTKXO zA}6qiv8dLChnz&``_`jN)9PmNLcWyjXTacnJIh=mLYp);izoqsD>C*q&c&XVPOBp2 zMDrrh)7DLDQcV3^#A41>m8s|2tv!Zm z%kf0)zFM+UW{hXR$Q=q3k*E{4yBUB?*C_3ab&uPDs->s;3umR4M7g(@a|)~Ra}$q7 zl6H&5ZAy^$=o*9lg|`}tIJm+}P8Tj&@clKuTxB9!$t4}<}y4PA53?PcdUxQ{Vs9HJb}A(~D0 z@YgmUm<_y2UFI!r*C9}}7UPTkZ}gSZlW!%Z6DfPwbj+U3efl{oi^Ms<8;YkAos0l3O;dussPfW7 z7OqR9BzL1yz7x9M%;g5n^YX;VDb0aqAr|lLAA2oz&>;jBkrw`7%hxS(%6Vn#!r*Qi zju41Iu{@>zkRMBcO%hwM&#fTOsL~bTJU%;d`9S8JZ4^Sdcx;+H_mm`%tMofi0I$Jz z?!o^kwBdaA0sdgif$%3Of$NLN1H;s0R)M^6Big)q82P}*1D(^^CVDNEbyRDGpU}kR zd&ZXCK!(A@#c=tawQf{pbop(vrS!JOqSBmBc2-?+?kos9?jz>!af=9sx4&(({~=@6 zFolP^fi&4HP#5+;*zx_1Dg)jte^I#qyjZeT|GBfS!KIA^2kEJT4pBtU2n|DnSz+`! z16?-QAV0U-)E2ASeP18WXJ%`M@rpIvfNADw*QW);}7TrlvIqHrY1N?xRfo6U{K;=35 zo$D5A&c##80D%VMiuL+@Du3S|xt*saz-!6@E~|HM#kIiZxY!Wm4y)BQCsm()XloV8 z9Y>qSZVRnA2cz0WJVmUBg>P#I;e_>K<)>ZOHa2;eDKB2+I_;|UNfZP#EfrJW6`dpK zw0ZnIm_oHOR?aL7KvP}QXN2*frQT>?mI1!;7SL+NCHz|>+VBTe>F5aB8vNK^jA@z# z*SZKq_3zo{Lz-;jJAx9l3mZZT*N=jXF}91hUObN#CSU2P?_`C*#3K@so8DF&VWYUb zcZimwdBnbYf*Y};=3AdRw5Egd7KM+orpx{3z&Np?7;jbz4eR4Cxd5|%w*HyoJjf~< zGd8|2+5?q<&|%3(Qa~PjZ^4{LlM`a>wP+vW9dp#z6cNDhZ#VtZZXHL`Gque$_?)@L zv8#;b(fL8~k~v%59#zQ~+A|KRftfN5oyCVl)dIfcIw5LJoKJ5L#g^^);}ZmcbWz*= zOlNtCD%khC8n&6l0%Y!f6ideu#n0gk$VjsyEy6)G!jvNnbseNQ6e~F|2r0OmB2?^k z(B$lGp;vZsKQa%I=4bE=hA~B{texZP5&2Ez)E4(>szC!N9?b(N3WNhFYN?LN^>}Zj z=rB~5M#Qr;m^(`(L-t)x(UQRDnN31JDNbF1b{3W*Y|Yeg32)ZiV8r{1e)WBOPxKRc zwOB_)b%PF(G01MP#Nuz^Pa_FKb@&QW7_RM>NK%0P-JS`AU5|bjGnz@uZVnsnhWt0k zzthKmdhPttUSuF}@rfR|#qhsp)5Sa-OpRT{Jd90&S#$Pwe|6k!H643AG4$Vq99rJ( z(Z)yWR1Fu9r(E*uvv_QS(}2Qh9{C1M1yT5*Wf7j{V=jZ+N zzSde3V~#n72@a=?73iJ5>4B%|#6G8^$-`vlI{<78GxO8l_a52AP7sDQ0U+6H4TE?5 zgzoA@l~cZrghQ?+o11$ei}Iw7=o;5tv}X*HbvmRc+-rgO=q$AZ1*2;L_!(`tr}NXU zf~6gHOKf&t@R7f zd`auP)7a0u{H`@|FE{Tm%Yc)X$#H8<8f7z9l}7X?0z1wRycu*zt|oEJ(KX`eN)2Fn zV1@OuHQD30<p;OaT1=jH{mqpgVGW$XAMm0j4Oz}HmyX6 z*?}r>T%+a++}sRcLAK2mjnvA3>xy3+uEQ_K&a8Ks4)Y3QMKVg}^3RNRux=oxSB<`| zb_-o7dtj&^x;NkA2pwjxrua}SF)hFsuEq2oh$=jCj4#Dxx84kk7F*bt9W}@9t80C$ zt{QwfSj0+WS7H6v9A|0c9QwNq17VG(CM9Eb-O|}rVgl~sE&6Y@s&wPJi(MT?&aiyb zZ09__p}jYBf|39gH8wX2xF>7K{fn1}h(A>|-KLI_;M>)BAWA659je@I!UJx4o1(Po zO&V8cw#%xc@h&P_@Q;qPloT1tQkNCZ4T*V_2Qz#^2q&vyQ6(p4 zGkwwyXTp2`mvm>eVlzJeIT^D4eBNyT>oQv0#>Lk1(+$PR%+}~1?>Zq?TNarfIcSrC z5Ttjj7RuYF3-Z$vP=;v(9YzOTOiHEwmtKVG`o2-qsFfr~2AEGGgqcAuZx^01SBCJ< zN)o{IZ0783W)b&!RF-Zh2q2)1o`5gM1&#vB)I|UlR0lc)Hu*}#+ zU^2sr>F4>)T>@^ZHb=`WGK{gxRVCll)fM1RwxEX$Muuo{U8gzZY7Wf4`h49<@cR`6 zA{9|`kCPud<2Oei9rB(G&`~u6z}p8Ya`8u5Qd%d9`;X zHo=b${I>|GOBsIp$@H#%OX8mx5WufVfB@{4v0aIhmY2Wnul-dKf#l{zm3>~1v`;xb z{{QtA`R}vT|1N*|DU6RL`k4co8d!taY(VVeej%AzvJgY%n2!*{|BM!(4zUmfg9}|4 z9imd76!8$hO~#8UD&@^dFjEeg6B{=ycrPY1U9e2cm*;cQJ#e3R%(xs&N%7fyyJ!6+ z9?v+m4YcY=7_XNYj|hWG9@ay3guE!EuM+6?^YbvLDwV5=9*Ffb{~U#GJ-sH1&PnIlCRz91vRSWDbJ}S0M%NrAUbRp{Yr2A%?;dB`KKtG;WLcD);^sK61rSuF7H`$0~ZW*Z7b80<>zbYTnWhu1>XG;q4H6{(+AB2uVJP z9l7sjgw^N4GQ|g=Lwc0og=gV=%y*)RdkY#TKCGmjV{kC09--^Fi4yS_W9rm7w@9?3 zR<-9Td*`E6K)E9l686U3mk$QciQf{0v`7dH%j-Q7h6w9BP{QPwX-KFfyq=% znEgg6f!y=h_vV=Ljgu)EQw!bUL=QL19=wT7Rp);V7y9-1m?~7R&Z;O>CtccKI z3fJ)s(Vw84*Ul~HDD>`g#|{ZD`4*~UsdOL4OT6S?gLOo7H4bTLpxD&s--(k~O?Bq2 z>kYDP`d-52IgugBnxAE6lhu<$=9@!PedkE4A_y}-DNv4`Aem+lQzEl_0hOwSiR)vt zL6pMeAR$1{uu}VROS;qP1z+gqHr-3K$#kU?r*Ts+ z`GqUeA-)E`lr7Tzo6o;Qf--Z{5uVRTu=rUA{u{Zxzx77{JrW4&TUqHFSQ#t+C+*@N z`J+NfU2#?p`CZ0L94jwg8lE*#MG`7M#LAB>QMrt#i!RSLDcY9~-+l)44eT97S6`%S z8pG@H({~sPGQQuKgJ&<(Lw4eM!Zp#u=k4tVrt7DUd2`Trah)J0rmdVXeHi)(vGL-y zNOSZ-LKviErE9hRcqN_~9a&|mGC*Oj*wl#cm4EDyF&Kfudh*6V1n@?~S}eMyKh-Q0?QL}Lqt--S7IgONM)Yi}F^E;S zbDCAnL^NGY8!h<( zB4YtVc{bo26^WHW7{t?OYewC=?M@4PRh<-|aAsXNvxr$MB6^r5mi8NWUq;@RDKmcbtar4AJS z_lkv%qB?k<3i&0J1IDMIP>6sS&GKpG4}mPpMmzeJO(~lK%D5y{M~OtoVJNTJ)VjQ3 zb|e?Rmm{-&XPj}fm^SE~L%hlmri|I?5E7i*p<=bEnvg>Zog*^w=mSZ2ZxIgxg+WOp zr?qbFo--c|DS;Eu`yWjoYCJs|ib=v4D{!0FeaiNDl_gc4qP5`;0EaUgiK z#Bj^bBG&{5F5~;^KoN#_5lZ5sUR$pNkH&xv)7Axj&ZY z!g5yol<#WvW4dV&HPOy@9`QcS7TIFnUn2s~5q)1{@nWdao zXCpy-?*$65F^Bn}_NOJh%<{bJXTNY1!}nhb;h5%BpX~t7rz<&koXUDif;-VIncioH zl$Ii|#5IV4OUH+donw#i@%4Crp%uRRa?7S}M;q zsV~CvhPHFAw8|=XN})rq_&{4Adj;SGn)jSqW&^<&%A$;PHk<(Pzg0;>wa|>#^q%7J zU^ukQ1GR&m3Y%;h^DTQCHbpA9S3kNQv1_H~{u04$q1|&`L{F-q`_;V`Q%_MOoj4+P zzn@sl-oD)cY?dvjd|tulJxJ_bFWg_v!f8X$usyr#TCIY8Kz2cAvW?Mqw~L6#ZW(_h z0W`UaA_iA`tEH8)u1`90u+{%wch^XCOn@=PfWgl9i%2>yvjDwzl&|dPnu30)Y(T#s4!v?sBOuehvKVwTYQok}aiIjB*U-XVtWQWE$l0~oy zjla`e6#aP3H;j!N8!-#Q9YsC^9fqr@_6G7_xWiwHY!aGJm|~x~Mi=hi($@abi~Ni3 zU8KsXF7`f(H#n+^n#d0Vu1APMlOo8wrWc--XVz~qQuD`^SFgQ3RY1-AS z&;R7MlUg^RSzAt@|foY7Db9rXTAy3KUVbo7|y{CK`vu>SIT zeaQx^FEVI_ZJb=vGe}SBpSLTJep}>h%)}SRO zh4tp+TX_&QAzHa`87UfDN+tp+)}2K$rmKlI<>cmp} zpb$lMT{qvrh{Ev(!erKYOSEG~_Mkn;s%wQ*RFg0pe-ZPn!+Z_HRJrk;w1(gp_(u(FX*2)G>A@^Ud|UtXh9|T5faW^m-Hk z4@{d6{n}Em4NLV}JWj2gyj$8*_T=GXRVzekWTzQu` z%9YE(F@o{Xt?Uw`3Jp@a%EIh<<3psl)h6F>$CFYF^;Nj|56m6^B!vfoEdb4Q+Rag( zPA4xXpT^dqLPQLBBo9mZv^sp=K!qFquvT|MP$To1KF_2C9VPk>-+mQ<3-<}gDXC1q zDlu-p=kbJ*CICOtGZ%t21L zze7u;2nl9obCva@_;PJedsuXaFM3kgk&oFX4B;lT1l5sYke!@oa=>GEa4t@IN*691 zS^6`)SU5!oX^^gO4B3C~@^!(u1R5!7r#dw63Dj2kI`wXnE{tS={*ww#gx6%sWe&qE z9BZULcuL~!t9$a45URTy$u;+~^3!=va-==(L{g+l%*tc7&(3Xv`rsACApE=D*%nvnQW2*7fEM+Dx`N?igT34DYUA~hT+PP!P zVUq^X{aVr$Q$=&R<+Q<#g!kicQ~C{LvKo1Tj>;XD`knN>KdqUDt};oh+A}<~exLog z`H^Ncm%{yV?+z?Tr1!$Z4NOg_&IKN&J%i>hNgL~RlqBPG%Qp~**lF0@%+Z!JE$G7N`yra&s07rb=Bk9fuqaH0&Z2WVuQLFYjiFoX`)QIyoyQ*ePB`dkKcCV1|*jdX^$$6&jjkE3AT?7#6t9j@0Tq_HVeOCC>qu;(^uJLBPgP;c3O^#Lq z)VO@yAD6(mPb|{#3+a~zMEDM?8C=4UMKWS7FC0yI^$zHaI)rg$3vW0SEgF2DnHE0_ zn8hhE4J(ubrJWArx$^8rXw$w_2jg*Aj<2m2Tl`kry5>j^c5C5YW(9`lmQ<(VRI9>i zvZZ!h0~y2Y`OuV_c(h9#e4vqzIM%C(P}b#fE$CsGwZG)RTYqd+bdAZ8eVe@k6&a$2 zl%@D0-y8tiS@Cw#-_j&$(3Z8^tK|M`1lA^(NotpTM#S8@_$_p3#YDc@4?I-soC34R zs59bqleXbSo`QSK?!NM?8SqQy9vWdm%%&Rt&)Z@-U#l1*>YU>-XQoKx*x9v~2~_{{%Q*fMsaCGsw|v1ZYn)~K{M?j>^WUL+4~zB=ugd75iKoS4T!4HA+Y1VpnpRiR z2P*w4x+Vvi`r$$am2>RGDfwbnef+bIw4>G_kOGNTLgKw6gyUeAn2i!4yjIG06NlH$ z{$5+}fHhy~J=l$o7X*c)Om$mYP&qX#f4{+qM0Mu zl;~NDJNz*Dj>1|&d&a?8d>%|i>u?w)6Xurc_m4?ObxJ*9Vb0bd8^uC^}yaMc4=^2vD6|A z!I{YX6A4gBVs&lIWCwHMZa2e>3;Gp&ce8IU4x`IWGUz2?Y zr)eSQAM$~u0S*#my75`G!w=#(vI%*pvZsK7E&(pGKH5`&%Gz_7Zy^Q$lLlKPBZm%+C}RgXRTVk_#lIGFhTck#_+s9^5xeYa1=`(SX0XXA zeet>#{3cm*)|_)Sw$_22vna>KgQBK)f<3I7T>qYZ*vXYD#nH;a{ECxnmX5WNHcN(M zy0U!U5^v1tQB>HZJ!mV4=opJxDbVn>97Ki5xS%ahV)-Q~Bi?qH$O@*;V7Pug@$$UB zj5d*nBMZOj`ZN9?-!=&8nW{TfSxn*6tnpfDp7@!!EwYxT$HlNg9X>J zO?!}_&k$Zm@z@DgQcKrT3l0oMmA6{ea0n;Z4g2wMX`*agXRHNot|uEu4+ArF6hxR0 z$SsyA`MG(JpaD98CcdGJG@ zcM8*&`b9{E&bJlw$-L>Kv?ZPe1Q{zb7Ic$sbz$8eGN_wE0$rlV9i1r3Gt;`$5!2S# zWx4ssmM38EA&=Gx%iOkSwD}B(oJn{pn01z~(-*}6o zvQpkOsZYoTQq!TFS)s6Jbl29NgMCHU7&x2E(_xq9ODq+ph3^iu1vRmF*XLGspNo8B*9S1?)IJ^w+9yk;~lk6inMcX<4sbaX#p-Wq(`l z=*D7~(NyJ76YA`(oa<12D#o}j&y|k!Wjr;9KKdHU-PS9FfiX<<4T(Fs54ZRwnC^4j zWZ1hRmeSHkC7=UGdS-Y>DufK2Fx9kLH&Jx}F~t=9-O%LJC(=I&nq4{a2JQ~JUQjO3 z`)THP{OCxvC``-^txsAiA(K3LNGMoosY};`N2sd^TDfs=u2)EX97u8OTmn95ElkC> z8=B!rXZ;*y<;c>oFY5C~^=FYgzVORN_ZQhq-nGTPj3)@8dvudFBUU zsBTF(cA;}cR1@JhFX;`HyZ{otGg8ce2rktY`iedp$UHv{c{*(t1i)f>*Wy;NKF7wG{0egbMul|D06)4vSrJ0rG1bOy zZ*hXe$#<8ZeWIQ$E(Tvkf7B=)o{*`P7ND`t3j9!hf?px87*^U{UK67psdG$jDU-+Q zDW3&{;t%Y(fOvCluwW1Xw5pVH!y~!|%iEU}woAl?TMx||4Q=g?SdzO}#<@^9Aar<- zg=_ty6#+H5t*W(0cMOtuPBqow)o?2uR=-c912DOMX+6_O8=2S*(;u_kwRy+%Sx)71 z&R+R|w!ka{@h{F%J@p&E_4ik^W6Fkkdt5h>S6huzS5m{W_#Shn$zP@0Hx4SwyCXR6Ysa!=O8WzuUaj{h$)33kB z=EK1j#0A{_A`?B6Ticc00eMDn<9Qddj=MIpsX}FxyE&l*ht$&kL?*k4UF>fCd( z`tqK<<*q@moP&9P^5IE!-&LIB-(`CIAfLI>@5DYZ+a}&A3Wk!yiQ?qN%dZ!QUyu}S z_n=Z1;b4V;vs!_@`}>sLh4fy6qpDDGl!b~dRBm4xq_`CNbuv$1RXsn#b>$O+wKO*5 zlShTlD=|#!6c5RB-B;PO=dj~F-Sy4oP_Kvvm90F;Sd*!9hW=SZH*ZAdq#3brw10pw zd>(FgA=*$*likt~s$RDi{B`L9W7hH0KDa@G*TO&t7Jp@diG?tUsU$)R&FYg1>j$%Q z;yor;(jriBz!_uWl3)UvA@s~%ZY0`#5IKF*=?nMCK>jCH6$Nyqj-0VDmXe&?7XP63IYH}a}xHa2l4{@y5-A`NY_-Qf}E1-S>P zR7a5RbqTxko4xet9+nWicoO#s(Ueex?4M zG5HrP7%7-{X#0uYBYYw%RR43`rs!<$^xwz3%G&=Sa@CaL604stC($WqB~OoMEh@B6 zSU^Bc9hk3-IOWG9HM{Dx;#6qK!}kH{)1~Squ3inF<@I>kyyS|Q8ZV`t8ocH)xqg`5 zKFQwle42&k^QAc;3p%}@7=-YNE7BY%3C8THrz`1cqzgrB-d=jp83Y4)ems3;UCdCY zLKjPHw-9KH{FVp=!wCnU*lGk4{M(;4iiED?%(HKVqKa>|A1vcnZCfpGT-O8VS(XmGPF$>0_M$%( z?N2H{H^sF@Jod=(3a+Hc{OyJxA6i2o_7F$pEy!1H&bgoGZe1%VxKmW=-lfpik~Cq| zp(;=wA;8FZlvk@pucC3iWI)%KNf3W?5{KoKVh`?R$t<{FuN4DgbmJs}6#FGK^K}$q zq2W(+ePk+2_pUvu&EXy#5+oyP^EDes*q#227uCklI{^l{nJqqLG7 z^Ys_2t|Kcdy0o;la6dZ-K^buTG8M+__MV8H?=xqhnyX9tZc^pD2&DMpd3@VGOuc=E zZ)A4Yosm?We`vef;LJKanQ0dOEV<-!%v*1ItYB_mTRC{l37LppS~sSxw_DHGJh7QG zMP+5x>|TIMB@C}RHDcGIi5WYdy$F5lh(r+M^*LKkSj$@qO?MX2C_ucA-g76v z&8c~OEGRok$}V2a<^Dq{k6&QL5t#d*_Q+=WTQkXlLY;LB!-0+k`#q%(opc zPx$X6TUjxeHA?*!H(gZu|@V3KdtShVQfCVn+VA+vNX%K^1KEjm-bKO`f0{ zu8aNIYJsDI2l>Jage>)05rkG#;m;7U_!{VB=l`iSneBpYL;&$po z+YY&9@g~}9LL@mI)H{P6b5P7Q$mIF0$+8*5Rl+fe%UfZ$XMM&~;((`O2N!1lseEj$ zY=;LXp;;Ffm#o(xASMD=1`z7cqrj!?K4dEII_#g?ok^Fw21AiGQwubL$c%p{Psy6H zLyWt55{99?u1|Io=}%%RAFQLuL`tDe+M*t(esg{Ixo zoblA`cUAIK?In@2R0HM@rK?7$CUSYieKnn{MPW*xoUKpt*cItx zAl{*e%NKyGu1L~W9>iqa701o373Bw0ebAgR(=}m`>l{qj@yzm=qhwz(haE&JTxYdt zjhnedKiIf46=q3};3e5;-6lT(`+d$-UW_6B=@v3t2knfF!@xMGonZ?Cwx1b{K~QX1 zXpKc^Lc{*Z4nfI6poT6eGZXSzq_d`m;9Z|F8;_HYZIh`_uc2^a%i>vQ#h}w?ST)tN zYngdX;gC0TMWJN*f~jQS$;{N`j%y3`+3m!Foahax7$@>I8B3a2kA2^TU6ld0Y}{#H z7jGxWSUp-eusd0C_2yl1-CBoxtkLMdh#YH>8%|(*#^8f|T}YdX5EBA2k+W&3WTBaC z2R71XN8D5Uk9)gA&?jE$3PjrQm^I);?R?%Z?`DMH4LW9lmTJy zPM&_QIBSKUbGYag0kxMZ3`7PW?N$0EIZUo=fvWj#D2Gm-pdQX=NbPuA#)yvub>$Zp zU~<{6!!wn|`m2T1ubqW?aI89h8K~1QIY7(l_r3(dqkS0H81j5Q^-NF#V#gWL z>M;$gm^LP}sDZd?F**}m79@UA8A`K0KNAtEqdtF!SI|7A))CRTLtv(Ex6vyDiB(t`fZ=xDuX?qNrF3>t;*k_Oz|w$^bw z-#NK-l<6Vu1oCd-p!m%F1?cwcI=!KoI={jAO#0HXes{wet5W{eystBB}Eq57;c1|0(3UUE#DJ-?GL!RQ{V5wS4&*1Ei;)9(1L z;elPGr=64u_qT4}5xAwMu}E=T;3h6gN#RR4O_mJ?wC?ZUA*$5nN>pt3P^U3J&@}hX zbDqC#yoUTxDr_+^EwHSi=dl@>@ugyF)f*XQAx52MqrvS0OEZ z#58njZ1vt|xw$y(n>F#1rxVNN1+81+CZLrhukP>ccT(DpJ07qe=J4~ZD-6Vy z^k~vVQ-%BOm`3Z?3c5+{w@DWRnctR{#%S}tl;%%3C=nMdoU2yDf(`N}jd zULV^`pw)D8F@X@z0l>j>3K_|u=fNj_!b4{9PuG`uv=3z`TSt48=Oi=~cO?{y;8@ha zYHKaWHwJJ&!EXWkkos|)9WTGR66v6{5?)hwIjg8lrm;R_>-qe=BM4I<%j`k~LOw&~ zXUj}RO3r*MSXE8R1b`do%rj0EW(O%?zY4q{Cq9^Pvt*^ohPn^3V<`+Nd0;oMWz={bUO(9+ZjLtyIoV23C73y`g2tYm&O-Se0Fb;*UYpG3 zIZ2(H?a34u)(PYiteR!^<&wfujx?=__?^aokF0W^|GLjzr$#U5ybNtIc|Q{0rM7ob z6E7#OE16VKW!M(4Cq|oJeEVnl7eix{1F645FSL0;tbaUC;l+=FV6l)N%t6y3@{5Pj zk|x<%_Q-b1yGOsURF{HDq{3k6V!zmo@a5f2bA}$(+XZy`AuoTb$#^0CK&VOpsZ(R7 z^QSCTDT0@xtq|9z##3l^0Cy%YPZOwZqYo@|@2Sf1{^n~w*&~ifbyn#*3LOlCv=mc= zmTFrS#^Q$z=@BJ;%UQ0;Uo`ed#B38Lb1kS1%qb+|kROy&xAgR0nHc?Vve zr@5!?eSy^NK0t0f%W}We4pp|}X6>h~Q>P-eT1=M|&2me1i7N;cZ`>eu=bTk|ISmoX z2_Haphg3@h+Fhm92^9ZweaCjh59H_D}Oaemi&tImfwCyzg8S zy(!>~T=;&F*I-OvFV{xh6`pL?LPUO>xgg#C7({1GeQky>GGqH#BW}8~dv^k=nz{8x zRFJt>!rQNvlD`L9wH_CrVT3H(mRx`9x6((coeOK%uoTJ6_ve033$us?j&xwVU$=+S zYfRV*79yo)&2z8G7tMz?53SvzCCs$OnXhtp0K-Z$$N4?-o+@#>rChRlW%AAf?&FI( zEk{$#{f+6Z>X=*bAN!^?l;*SO&Jm}_zsXSkHIc48E=&#kq*kE+duoOFC-iNuZ)NVT z{}=oHKlFqDNtIRnr~7vjb%k(sJY+5b!AyAV7PoISd>81fnL$m=6H|N*G;&{*2iTj~$T8Y_}PGN+?ItqYt`iBjG^Sv2>F_1%jEGy zE2lz+saZC&2{F}0wf#%7eXhB@TW9g9VoIs#C&rm1Ymtg$%dn1#JB*3XBqpnd_7!k_ z;kxk8YdH>9b_+B0a|5eP)D2B$2967@k#3Tiwt0|Uy8p$t_-o4}LCPO8`14*%e@fB( z8+_m&1D(Hj87ikLNUF&1BoI>QBH6!wn$71D1W495DuKy^(wc>!!k0a;5P?7kVWdm_ zzI!jDoznIC=3S@KZLD4K=iKt{>kD|pCJ%V^37)#i4o{D)_Q$bPAD<7TF7r3D zY=~WEwg9Z!wRmFUQ6cJ?=7QbEuQ*wl$$jzs5A{^8Mk&+wi(RJ8s^PByx$w#BK&sE# zxWwQhIHvw_GIKQ^297$&D_vzT>NvZ6+G0&M{)M|Q-mgK5j{Hz9j+dG0+q54GM&?aN=@wsx+fst~e|5kX7E zNyHm3@w+R>Ju~I!vS@^6Qf?TOtcK4(uHZ4X>Mc57?KXS`GZJpfQ?Wj0qfPrHFWPEG z-;8~FM$AeWzc1&5BrEb5Z0*O9$oz^3Pt-aV?Cw;KY z_%xn2{jwaXpZj|txDU$J92YzfVXD0C%myP_rO1O~Ji2NMh>XCbI&`NNiP42skH+8j z{_U$<(Cyqk`r?wqWP&C7K#_x^tXB$27O4ajh6wViEz`3yAi$iA($Cwz>z3YQxrs5c zHG^eAZ;NV~QDy_b93iQ}Hc&@n1m5}tI+e|r2kCORI+T#jVh6-2nJs9S0~;y)Xx7f) zF%j}q8k&19hOq{8v2W0zK{XMf#@-={IIownCPI|M6Uhyf1Cj)HH#D>eFc9mlsgja5 zo~KzC&P9I>)3MLx5u8hRjnlC>^XuOvCX9r( zb$|7=Uf-$q>{*bjUV1-k7kq>MVh|!G>VOtgs1)xdzCu%XbbM zTIk|Ooa^F8QtIMII)LZFE##P}v=`ZDTkP&@0h6`?Q?SWDIT+7cM~2}ZE zajpD;fT<1DvH*}i`AJ!loC>Ye>1;DfSTYUJ>0vv*;Mf2*5W3^~%nQtBv@aF;!4QTZ zdLYLbBpL#|hysyAeR~qWG?2DKFUfVG5mlxG zp;-G0egkoNOl2HQ=9T&D`?FKZDVRf0i9Ld<9Rw@e7U}2It!=_~4t8Vsi*ue-x4cEV zp`3k?b7m@Lh0?W8NE^Px1y{YI#s$VJR{P!K0V*e*+g2mH9*X`Cl;eZnmB~BuC6sTbEB0qXhfv>$g%r-d_ z-^#zm3PCSDjO;5zm(GM_uSsl_JnoV@kB>hH(5UzpDgS}4s4g|rLMIMQ0L?S;MO3+! zW%g%!c&Xi>QiB#g;&U4+tp91(--?yL2K6n-*#708KrhJWe$T&Ik^lb>>i<*zE+K*+ zvga@PJ2Pets8+|*o{FHIfp#*okZiy&H9=_z2%?H$$L+6N@yQDXl%~lT?^hol?Rc_Z z$PvK@;E{IXDzr#gB_w+Qt}LZmRH_;PpYn(p8=a80pU{gWvkR1Qm&R^&szG0UHIr_0 zArUI2$TJX9+er4GY0Xm+`NSF<%-&~^M3}QI^&PyMkr^l<>N=~FLCv5xErLbl5ID9) zj)KD*r1Y-qY7NvOe~dfj*)+^_%Cn zwROkCx<99nQCVMJj@;CGtnrxFuDA4i2esE6?Kg!-`#}W8u}go?yIx0s5xCN@Oo2g+ zIbrm04vIPEiV*0HG6ap zATjJ!@p&Ro#EXz{zA%W}Ixi_fEgWLozOv#AL>3{IPd{lMVknVj+JbHzIIsK4$ug*; zVN~N;a7L~oleAR#zV<5z7{{dQu7Lqkj{x5M>nGp31&)(87i4u{wCy4GAt}>4b!heb zrXYMz3lhA_$4r(}Z1vCu)#^iRSxHLv-dPj@pLuL z-eq-H9Z)iYrtTr&5%rpLy()XcmCBRc3zN#4=n9*X%3tAex{u-vPrcXpp%z-!&D5Iz z@P|`CzpdTTEkv+xZRghgK6&O=@*$*ba7-ChRRaB@eV&%>j*9thH88xK8RJ$ivcTf` zZ*;3K zj$>nC^SvsJe*^~W1;A65+Q?BV*M$pUBaA`8Y-lGtJUenL>L~q}JMP?F@b}|L4a9FT~^6&(38Y(qU;6tdR!i_x;iW zANM5Y>#1WAHPmDy|D=r2=a_pfNgrl!-{&UB^OrHe_JHQOy$b!%4dmkns`_hSSf_3C9z;`aC$|L8>9C*u~UE~eCUg=b}w2qEt! zU<;!#KF8qW7NMpCa>#c)CF_K?wmOH;IM;fGZ^?dz{Xq*?JYen?3ppz2p6LK=iH?Dg zLVY^<JT5foa4^A1A8FeU%STDKnST$OG%NiZf^A zUe%uH_~{d<+hsZ#^N@WAxGL-H)5Tv)u}ZT>410EPJ(y^pbiB;)F#UMGjOzTN)lbV2 z*31$%+f36>ipev7{F)Mk#UWy+I7sbTN$9_-?&(Wg*X&=F-(0qx$)ptvKC0kJ-Os8} zZuX?o>k3V(O^dAQ_X<6qdT6W38AB;B8l{!=s&ZIu9^B(t@jXT}D$ zN5!P4@dr98QgaVX%jJrU6uep+=#iSFOI`bfKV3|XO_RoGqa8t3G|5N<&TFVOdt;k* zMU&U1>TtHeNN{84cyB?GG_Gn9(^TR%G=8Os3>hvbmxv5N`?P9~-^teTBtAg#4Eoc{ zBxgw<_(`9qj4#GCOGC~&e ztdD~+&=@eezfYwo3ue8M8!%FO^ZmP}6Ijk1o`p)I_GA*K*Le6Fi7sj_o<#d17wM?+ z7RVSDnf_YWYjQSva7CQ&XtGH%Psgkwt+?uJwM91Y6})2*4igt$t+zD@4~FR~&Nr)u zzW{Ga7@S6Lq)YJFd^?8!5-b#q%b=OVDNfP64f&DP6~JiJ%%i6lr}(tMUi@~+F1t3n z{VV0tozy^5IHABT{E=xR(1CdRff*rSj;SRN)BRb93l4f$6dTb|;b@V;%$l?KwkYSM zHJHh^as?TV4{@F_B-DSbm3tinFQ~*-sd1(YxqVak1u9=I`j1$dpOyHFh29)1UM!bj z8%(X(EUWE>f66?XSV|pj^t*IRrm_u2EPJe5gh7N#5uJD{6b@^8uNz+l5sV_GcziCi zvzk<0AX5HUlTshTTWI#W7swQ^bO6x));0gVZwTCLcHYa(gKc?KCqG+~!q*&9yEe*o z3U=Al4k0OolK7DHz*C?tVrQ-QNb(4}td2Iu7!ZU=4IQKksIt*n7QA>q^=V6IPgqvp zNg*n~4Vxs&7a!3NQk$8A_#ljbH7Jh8;g%^jU;*Z!9%`RWGHe>pC5#KV)=Gw+g#`}@ zYjvj!G}7S_Zpxv6Lx)nyKhiCPv-wl?lOsd|ts}$;y|E`sbg<*>NrJZLc{y82_t`fx@Z;AwN7f zilLw3TzTa+%~O3FB#>t$Cyj@XltOF-19!)awP!3tA~s*5THmY4-0L zRIi!|2(fdmE}m#=Y$^kirU5{0x}e}NPO9SFxa{^53pcWOSQ*?m^Wn-vU!+Vi4pW@b zx$oZzm^RvYoHo;apzmxR9jK)^JAOMqxNan#Rrd`AT3~H2$5(SS--_11k>^5TX-VRi zuGt>vfh{`cZsag*&A2ykl(DC6t_U<7g~C`5kzEp zS(}uv_Cw4<%mO=*AD|nAG$mHTkmrHlm9I>gWzzl33LC(7joMbv>f@Jbv_M=z5+q>QR7Zqr(7eGM$=Yhw4q8k4< z!(L;1=g$cLsr_tj^{ES`@Q=@brg5cHg;_r2_e7nUprHb=JpwfZI_sDag0P=tC_c`1 zK@4L~ZwZO@0pfA3;=g}~M)@*+14i)tg4+kMz$oOC?Pk@rksfkxy1K|t{Kryz@?cN| z@&(Z}oN{tG+kp{LbP^rqc4YuNgvPf=qA{pPFN}4-Ps6Wp#zZw_f<1%~QN&dAVrzh1 ztja+;4JUy1>ZA4SY_shu_+q2RW+Hj{!%RJwKjWAdwB=Fb@*VX$BaWtJKLSyQfx;Mt zAb&g8?R>1UD|#-N>7w2db!ubHF)Ic5<^m8FSv>WBPsVI4J-H3rOjJ?n;Q zWT73B8Vx&76=uHjoV(1;TF1MJsvV9jaz1^w9=sr=4MCnB1|>Aqhv0Cwb8Fp~OAD-Y zPN7YwX494XS?(>^k$J@{svrD-?%_T_pWI_T1VUS-gX zlqKdh3RcQH9*{XIQ+nbkMVz}Jh)MJFNfd{ZutjVcVMeMFwC*ZSJC|JavtKAXwde1C z1#K4&X@(wAoR@ugf;CL)FXpjdw2ewK%#sjsPyp!br*z8*90|wRISs6?(21jXx&Mc= zcW~~sUA90c_QbYr+qP{_Y)@?4wr$(C?MWt@aFX2LoW0LE-?#7Hbx+-@x9a@^p6-6u z)4kSeYId)%u~Gti7C+JP9RhB-doy6(r9|VS@g{=@QyfUwfDo`wC?X`5rEbD$@v$SI z6{p;JmmrJy6^ReX`rm@Lph}$4Lr@9FNjPsI*N!6Iya7s7;@Y>XQu=dFQ9H&DxS%)% zZSH0EkcFLbO<~?>jiT9UJsdit??A1lt zoxu*Nl;-Z|3?P+J&4fsqDGMmUN+Nhlg3}f4mHTM|FT`sm-!oR-XB4WgG;3)W>$gf? z+ImK@_jxbYG*1QFjx+@O6gXB0m6zi58#8NA#rVuAvTNuuBA1jbG_D){YDHbg)ZN=I zZJ6t5L#(4_6ly%aFK$KZaI+j{wNv5h&d{wT>6u{6anH4muwyVu@30v@tyrh>N9ZlJ z_u4Mw(mmc{r8FA8v~ZA*%d}Z70@ODmn*h9{6?1;Cj!26=w5WcVsKLmSU~qFZ$4(Cq z4(~RHJSiPgEO$c0>wE&IIL_|TmSMqM5&J2O>jHor;QB3K!2=FE%0?|AhFeBw-0yW* zo^zG?@L+JHuwg9?A%d`sQ@MmPybakl*AOQ@qaI^!Rbx=O?t%uZHltr{@OZ*5ji$0f zHrodCK5Ki5bWS}Xiks;4HBy<-K&(PXGwHp)-{B#fTfC`vGl=o$XMUFj7tQ}7DoO}! z!7)tvkVwu;@tt6aAh!f7T(}vLtGn1K<9FCRICBqC^SW3^aFn7={$yEG+&jh3s03UQ z^!4up6NpNZGqlPrLhI7EC|RRm0%GW-Fo@wjC@y|&4Mi)yWA-w4?O8V-Qcg-osD&Ap z!kobBrX5i<&8j4r>#mSxB!1!y6HsZ?D7wR}4ZtV3w1kke*tv0U;h2u;(;KnRDrC5K znJDI)3ga$5BkgF8%kNKP)hbWqJ&`T&ER7I}X(g14X~}$~=`jf62-N<&!rtH(!&LjT zh@QuB+uj3N`yE{#hkwx}{DJpX5?M0ffMBNp1p9w7x&QBASN`W7$G?Vq@_)}|(4{7& z@|$76=<~|1S{#gJy!~$iZp-I`sKR3xxyqGW8!w$#f_#g^1q#Cd%fN)0mLmVxU7h(% z*5*^T9rLcQ_Y3$Q;sz;-LuZ(%wPvGDts8Wkwh$io$`q(9py!I^lBsSfrZvaMr+G%sY4r>lsg~r#m2Oy zJo3SvOlfnPS$u|&BqM6wQe;svf9&(&ndK0z zDtW?OOY=FQKqTR_n=Iza>G?>UjRxXH^vfsDY$6GlS(&UAQ4RQhfg>XJtJtr2=i6@lNqC~CX*en_QC6}GQkpCAp{+Wq1GujP=0OAP* z=08fQ1)ZE+Z2rsPO3l*F8n8>kgR7Y_{m zFb~=w9mp4i70j8?crd>adU(y6TeZIY*4M^l74Af-farGK6 z_oA|sW@GBEN$l!&j8VC%wb@*%I%3JmJ$UsLnA)b&6pr1ygj9~}?Nx0#X-kINVW?sb0J@(EbU*BrkxqG;*UuQyIwpf{_@i_)}GdTHp z?Hx!yQRtCJgR@V1^!&u}7}J9D(n22ETHK*7+hz8=xFvjYPjzS>uz$;C;$b8jIX89% zdYBRQ%dmnRY{Em#C5lRj?ucCpEVw$7iKZ~W5WSO@=yeFPkd1}_`TG2n6D3l;*wSn zvk$JhI|}-~OAw2x?oT86vcELOCx&8Fj93Zq78JQmtz@~SN-Ju<@F`&skI*IR> z%?NDbmu(z71EDXpQ9^bg!ctZ`Uxjq@D^$8bGn|#E3%XnbkCcEUQwJVc1w)KS=)nuq z9wjj238NCEKq4wGB7YN@LLTCU%5RU+MX0`LiRu9FVb-Yv$&sdd^pfo~^0yqP|F z3uW6HxlPR#$%z$g5n{HFJNI4iD6~aI0V`J$s#OC>K4AarwP$GgqG?IyhWt%;zkt+K zXxM9=U}YaQk3IX+lED;fDY&YgAoquGmXmHWyE`>2$K1NoSHx0N@+Zn63vW639X8%* zdWun^W4!`v>ZN8?A*Q%tI<*@(!%W@Py7iiAGM6dd^q)SMZu@rsTi3P$bq#S!Th<@& z9R33iiT^z?R5CTRR`zfL?8f=WYsd%C)EodbH9?l8sskwYU{KWe0!Er+hb&}RM4~C) z^5yI$(leM?U)3+f4hP_G3Zq(!BN&IKeWrP1$KRj5y&&p>;b4$88tS5wVS`nXO_5QN ztzZ+ml_a}I<7$>SVMqLZX)zjP%ZDu2eunKOxbb8hW%f*Vv%#AzkqZm&jsXp7Ey8!m z(UTB~Q_%ts^PURX*ZyLdE9jMtJka|l)qJQi6fL^O80bP_3$pJ>TZ5TGCsb^z-*ha1 z^x31-bE5Sc!4ffz*LxT3CZZ^9_KWP9n5%$-=9Y{u2UHgM>QySw0;Bs?+N~4q7-q^ zld=L%PZ@AKk^lP>{Kr(|57aSrB>AVWN3gQ49g-m66k()Shn0%7Dh2ARk0)&fqv2Ud zz*#MaUIiAP{B6$@Oh;iOZ)>0N-EYB=@uOw|fIfR$Hc)9HG`-!acP7j0CxCo%NbU!& zhb3V+D**fko^v1|X^M*q!d1cbjq8Fdhmj-}clLG@_SW$@OYkxbCeyI{(*5z=d8_pp z^Jiz#xa+WA=cx|Y1s)~q=R`Wdih~E>X78%Qm%diCeg)0hB&IB7!}Rx>N{RS6V$!p6oU6u8ZnZo%30cTsFl43wS|7?{>y7K zY4t3;9B1t(j_P6ba06}y$G2H+yS<3;Lpb5W7-3}a>$E!iqC&$0fd8|epI%Qh^u!SF z5r$N&YXspvKW)gCY!^mEt4U!Ayv=7)Y`A8Pj%JzgZ0bM=}hy$w|Qq zSxWsN_8)U$r50qXXT(F6iiS%;2`2NBhY=#bxYyW`j3gFwV3T4UQeByy`?wku0%chv z0!TfqoYB5H4P7*ygtgx5$B)fQ6vm4YPygVuV!N49wg$pPIoE?ms4z@{6qL+t!_Pyz z@hid*HK`8{4Kvq6{s5@aa>gjQ&c9uuBe`ffk(je5tU=+{5-zxlprJ{4B%s6#A!w55 zyQJI%$-#9t*@3ba%7N9F_x^9>{TVAxIunOq0HUrIKuM?m_mL-TXJc>ZXz65UE9?kR zk~mr#{-cIOt8F_0cBOyXG>+S*6bH8e0hbB(+^zdb1*26cXi5ZxR}Qx<|pbW#4k5Dc9ey_x%59fiB9j`X4*4*Ki{w5 zzliT+pY^AOw8C~pFLKRTV6Y>Mrs>RFq{Y1z`FC@e@9~t7xCqjrv#P*893=4Qtk{d< z?ZmI_u-@R6xahFn@R>P#6QJ@hF;dIwE;{HAibErjUv*r?Qihp2F+(pov{IowsQ&0^ z+tSKG-chxhAuR1Zn9-hzI$poSVN~^0aC>Iqr?YxGmwdFi^aBCMlFVV(- zvc9vnQt3yVysz3sX4g&;?nYjpNch#R>RRPl&2#1D+RgR~dOER{koMGRZ;}VSjo$IX zOUrA`k=tZldJOft^B$DHI9+n%y;&{qo^yGtgx-q9LR-PKDEk#Ek@Y9D#cT5mf3biz z+H{F3vizjDB!xuF6{9Te5^1sqikhnX(9^Ap=#te(0kHAGN|(i0Tv5n2?1DnvgsbFd zMnDs)34(;8nvC{jfz5>odiJSfL79_`l@*HB=8C|X`2gZ%!8Lo}MExH9kzmSrnydCs zS6Y*4=Z~!|WMQSrA!&Eb{uVhHEIu{|kX(u{$=rv$iw(E|mIulj(4JyUWG4)E2eLS; z3ao^61_u}+vN(N$VD0GFsK~4|85ls9ZI_z7#KtYMH2chOF%OMX2%DEy>@tfRkQKBXJK^&2Y*g2Xd!KLaw2>=De0z)!s%-|>}0D5;>qF;yq9OFyDGH%`r0 zeAc>(1NXZ4+-2xm*hk?R#u^Q#tldrnEzbh8xr3nwg>kd#0OQNf($6`qq$5o6_ea?>xy~lQ10{r8T zgdb)~R6W{5KE(COlafDseEY_*+oI`T0DC(++d{7tM^YL4T<9MKgqm}SeG$y#N%=!D zk6s>8$~i^0SIcxq)Hwp|o|}6HJ$fS#n^>akUiN-VWalzs5v=y1O<-~a4NBa#q^hJW z!P3ot!^5hU%M*|qN~Idl(v zqB{1X9Dkyty7RbJa;m!_Z$bX_SB2dP9VsZQ*XRDmhbGcPoaBo$YJgDNG(gVU@Cq-_ zq?L*)Cq7I&eo!)SP-84!e`t0(GR@@*R|(cWqWq2O1GhmQx}?46pmJ@yS6qpzT!9{S z7xEb)A9Mudi>q-0uTRVu8N@W0-^b4JrO-G!P)JxX!aiAX*nQ=oOY@K#?0(9?Ua;hl zrBc+#2pX!%yMB4^^57rx@Bh-8s5QnRa0kGx#s3VqR4g3r-2NEj{nJ6*Ctg~9Kmj3m zHfdo(SP)?tBH;`ivYzom3^JUtgQz3V&{C<+U%HOfM$tE=hK0`gXDriVK1UU90WZ~Cdlh%XCqWVhx7K$ezk#j@!Ky= z$>r^qWjn2$xL*<~fi*W!FCCXIQ9FKuA@;zVPE|dIuDnl*8^595yj%$`nLiK8ZFV6B zTp*8yy3Kht#C9FIkiCjIiet8?2=LOeCZwvh-q(;c@j*022HavCG} zFWPeL*oRW7a}iKDQMw3_kxB$7SXFY)g)kO(yTlXk*sE9v_c7GG7XW%Oube zh)sz|7d*D5sdnRsSmCN0K?B1-`_vR;gwUfVRP4{d%chy|A5EVxx#2B7&tpJ=FLt@C+mg<8` zxkeo14ZbPxl;ET6JykkOwa(LiTg!7P(vG7`^gXW-4~Gl5D9gd)39vf9_6UB5+>$+Z;_Bw^0N9_ zg`~z>1?b_Q7!ij*h$c+VvJD+IqwdXn?D6$X4lQ&M$frYjyI_1F&at4Yl zg8rm3STHc>%$;L@`4`te2sCn;YCw&_127y2{sSztHgt0O?*bF8G^_ky)2)z_=zib; z=mNipBHpyy1F)lkF-m24Qx5md600@2HB&b1P<|NtKKC2=n^;Hh%)AvfvniRK)}NzK zJKyPFJ`OM0zu3*e%?%xXvC?omk@SP(`E@%rN+#^2Ph|;@fu;Bq)X%*{+&?E-g!F!A zO)ct%IRLAtT539VP`&y)oidc%g<`CCz{1GO=Osu!BMk{@!RPz@)YBDkveqN?rj;|f=A%GCd=_6k$HvgQXo^$e^K0hp;rAxm5r}fD$Wn| zzg6i^r@JuiYsgnXRni7jrT<{?XyjsPZ35VHLoaD=3)n1d^8d2n`JZk#?e=v;i%Pyb zdRL3~RYWZkQXnIvrF&h_GuQT4moYABGdI~Ib;$w??;D8c!YK0+X=NJ1JEqeQpVO@L zm-o|C`Y+gL9`^RDqNqWB8+Czh`X z{kUWG2bwitgLl2R(*}`B6`4xo){zHSoPINS!lvAqiY|rp$!p{MUxRm!2h(`e-z0|) zd25R6Va!S22$Vxk-$h~v1GD0U%bD^~V+RfC4&&!6pIxhvXvIblc*~J}kA=wq-ntq4jWzK}hm-k-UduZ^JL%u;|0j4JqY}<|kU`izxIKw3wktd`| zw@eeioMBQZ*;co~8rdV$A@6vgnRQnkw=zJL9df1Gf8rX5oFuQn*&+!LtO83fSv!S{ zWh1q>#bARDPFYdx>1kk>f$1y0`Ulf1H&y(q)hLqGZUzpw?Kj(g`IoU_Z9ryH0-%&Y z07}V!n4AAkeEk=5l;v;!-qA|qQXql|KG{Q2m`}9Vn}QMrYmhrA@DX?<6m6h9u13h( zqd9ZThj;3pNGQL*@Jm&lW3GmAgjT38|LiW;)6>Jx1*$Tb5rr7Rm1!F@Sm;j*v<&&( zu|TzDFqSgG8nTt*ONIGbAvM{3)<8EMU*@%hS@jCHzZ|6Kkj>__pALjyBsheenc$}WRx2ZsptpfFlRC4Kx*JV6@+ndM0!(BF9_LQ#Vpw5WE z`*;sTR>N;e%tcvIJ4eZySsDxgZKWaxAz@tkEe^{_0|$Sgpu}83kTY9J8Z9!gOk}P9kuJy zs2y<>#}@j+3G?1)c9LSK-cOsUCr&X*5oxO-YBO6S>hNn%lre%d)3p@F3@wV(@xhgj zNB*;YiN+CEr^1wcD(S;)ZF%f+Rk>E>dcrBj%0*F7PL@r3&Nq+9it|e(lvQ?~_YAu< z)a`f%E<5hZb=F;`uBt=rlV^4yYVhO|lA?rKOXd~|!i++Jfq0L> z1(@$Pnr;&p4dpO(EhQO|6~Fs+i@(xPYfDf46A&Ge3_b26kb@#kILOjanFZfh#ev!~BG}Lnn@%hvm{S^UJ zc=e=i{wf9r(db>{dK!9*tnworz{spnqmSbP1Lx{E0YQzmtV}2xb)-d4$~nZ73bKct zd8+0(qh>dqoV&k%Xc4K%S`eiVX|nID+3Z%4R9qPI=997gHeH-U%18@|sr6_{bRS3{ z-MTs{kYu6|DVXmxW@1C}h7(uOmq}*Fltu#2P_--p&u$c z3z_eAqXasX!K2;GgH%Umhnu1NN`O`j)aOnB%(bDIKOKh85(^oB8m_ca%Y?8`-_@&X^AHi9r-4$9%9eFn+5!4y=c_UYF@4{0xpODp*KkvY8PDm zq!~Fb=}#0nC)pdDl!mX@w@YY6DzE6yJa7-JRJ&s+}_++-wt)NfPkgk zk7b55yTpC=@5QebuhX6R?vV=9fkbi$UxDKXo~3alqdy}syzVf++LSP9$KCV4KgBjl zzDpqd0{!Yh>quJ&-x{uCqACRK1_Da?dM!*Z7GER^vC4P{S|J0X3T}C~X5ccEzv8Y- zEgQiP_Djp;_Iuo|2Va(*j_6nFB*-hngCD=~-nTk(h(AEMBwg%U_TVZX{L=84QZ|%| z_rY`azZi#!@8dawMld{*D&f=_zLQ`&Dg^#=et@Ttjt8PBHb2{++%J|0If_R=+omZp zhC5es{_-wFuC}TfQSx1EwBm1)=_5^ z?z(zZv3MxYBs&4i*0E|Q0Jn%s^o3ThA+`*&&;%6!kO{^sBGoJ)iDJgH5aBWn7Mifk z+1@%`tUc(5lrY&>t0zQVQeISr+~0qB-TxU9*Jp%vbO5ePd%$)1ABYG4Q&0a1$NpAL zqm^`}u>n2#)gf!$)#v!M4f*Ekym}54Z)H%_AfYp1T7N#d1Vda+^T{99`JWR#Di-;% zK4-C1-Hq6ZSjBDdPgXOW02cB4`{|qf7rQz{qQ1f}vBEt4i(h7iRBn0tzWK2V+2~_m zeT7V(uBOZP%=(IA*i#tonX3Pg^iJRfrJllNsZXYB**qIMT*1AFx$i>WT+cD9DPeJ# z#L9%&twRoC%6!YlR<0UY$h1qmWMdoEKwi!(XL9nAneFtV86lFPfzsSv?Mouv=C03i zGRu+NPUv!rmN?h3evvA_dc{WG|8@mZ>sDb*tZR!&WZQhe_<2djBkQ!OPQI}_*T(rH zW;NpG3v*C#y$BR^9o{~e9+K;IeNRE^of7?X#9Ytk0u**4h{-{KJ{RT;hK1=nCd(Zkt|d-gC_&YX;l}6 zZj(HeUlxm2KXed1AKbHWWYKO>F+4v=r1h_`DaC3@78?M|u>i3A{{)+u{~iX)y7I_? zFj!2vZlI|y*1FMFX~I7nItzpf62X2mz!EA-INMYhVQSkZZR{-IAO73}>5=#c1*NO8 zQ^f+?IB}*O;7i?Zel6qs{_%m_M_k2K=dkD>tc{j}d*rY=fD7SPZ?vBi{02Mha$IQ< zNT_f3g8^luKgWc^Et#JEaKC1WxBgPmEFb$JxRtnx>5WD+>``@W?gHGi58eprU?R5Y zF?iI?`1nc^_b#=T^7GlFL)Vz%eC?_D8nojoJnpRW*R}sMK^ysRAbCftXyyn@PT%A& zx8}r{VwlZL{U&AEZm;JzOIO3U2ft3hm$~Wr9*+%+fccvg$lq;PZ$we73T~jRLhk9^ zVxU`_ycdXLmmDU>cbI78)Qk1At_W6q))mLcW@WGQ^V`yb4-cSgn0V5d9+sxhr*g?Q z%2@}k8EA@w+_Yei74vqTjGJhMEc4F`Or5bmebQm64+9}z;_%{9r;SzA-@SHrdcMXq zz@#(bc?KTWlMI5P^1%o@(GFdn8HAa7F0xIL!<&T&UE*AE5E5ru=J@#(6F{V{7$r0@ z$X8~f#=L{X>!6s~|Jm zMcPZJ@XQlw`}tpVDoUvSVq}0Ay95ki1pdG9o3*uwshJ^w%&cJNzh1 z@Um3_o~mjHA74{wX+SX!gtAyHDf8D(h>#Yg`-(|PnurO8$?JUz~oG97zZRVkqeL z%0sl_M`ZeZCzIsf>j#rIP`O0xK{iLB_7H9_cbMYWVG5*C2Es!%K^UoCNF#~}x9ve3 zyS{{m0h0wm_c}Yq7?l<)IhBMkMkS%&8? zukQ`lKfakJvK(@D7NmnsGd}YvKWPZaw>ei94f*{DdkQvqdM*|RC5_sU6H*n z>8V|o{aJI>A-2u{H#@hD9euAFf>>&++0kgpja_nrwCl~}R_0SmSz?Au(PPWH>?%5_ zvwjP*jakwl>Tj7dJzJ0ikQ_G} z>-I3g=77#3SQ(FD)`*uPmny%U^-FRcW~;0}V6E%_%o}^e1R0fT#Z!BL$T8He2}AOz z!GcIRS;p;TymwA}d6`m`~X`8-v*&rItr(@3+q$kV-1q~QrQ z>1BlBrtPz2B1zh*{G^YcTD0L(T40CO^<%M{+aw-ca)i{I z@{mZ+Jnj4v4HMr$c7&>diEl`psm54z#LHcONS&!?gq^4-IX|DKfT$2!cZBb&$r6Kb z{e$lEcWZ61T;F7++cdZk=g;DNrAH>U*|H65dVwC>4B5%#PyQo}nPx7V)|0heb}YW6 zBWCuMZ$Di|=key3!Yt^1I#;+fEUgr|O@w+57ouHdP!gB2vIImK=*)LXmdxN8A8u=b z*O#<=yyu^KiTgtK-?85!C%B5clUuyK%8mY(BY(3FQUOwasD+vLjW2s%m9-=4)*mp{ z+RfW013v>QdQh%=7|vz9A-)2?A*&|lQws4j6tQF%?FWu7z>ODqJ`45zFcBBQzsv5D0rC&X6b=Yz_v7I#N{|NQqDvCW|JG7_(eS;Yh zohus4s8@uPdr6XJMI6QkWzpoqjX(~ecR56D&LsfC*k=d!JpLe$;U1N5EQ2t8G|xDb zDARO?g|8h_(H^BZVHD}glxM2(RBiYBFD-&Um)>l$7i4@3;BzlGf=h<7Kz39_f36OcSlxUPxyEha~X|Koh&&=DCH zhvAhr%D&6aY{SpDy92ZbEvIDA?++6C6$ep*B?#$zqMvH{SI9M5w<#zSZlPOS27JeD zbK!7_{KJ?u90ppM9#9)!DjwkFm`ZYIGy`I)q}gVpgs&ikqdHzq*b*MNq%OdixD>-K zo6EH0JSh4qT+FVsWhUQ*gsXaX=nED*=kj+>tXW9oc99S%KJ{)bZ@bMb6SvA(<8wPa zaBhR?b&fghWeC=hk%xZ^6b9Man6miNrd+i9VgYsd&Oqh+ zm(JlI-cJpAg02DJ$maeJox{JFK>qFYl9hFx78DS8(SiN_2#N!C!J3m}rL^?VopHDy z!yg5?uFB+rYDltK&bLUuM*;M1d(!w9(%glG0IuwD8+(2daG^2YwJlrcY1Ve<%dfXh z`7f956@r7raF#Tc8uJLFhbZ5uF0c|T$}B20RBwX_+YLEWddCrJm!B|`Xx;iS?{Fvg zJNp%5BY6wWl}+*wAK|=q5mLPI!BBUbctV21q3>dpLIAws-J)-@$C1{0ehNW zzCOvi-S9*-V>%MqW73}pxQpjh78Cc z3ZGXj#EznWLoZEa$I48q?S7s+9ql>h%85V|?y!Qx9fSu>K4Y#hncfXLmKn@EOVc=I zdCc%f^mI9xtl5NnHB(_h6LGi9_4=?7JAU~FDSO%Be|B#p{ivCf?Jm7y8ZXEe+1WN) z$8VGSGEN>xCMIRZ>Y*gj z)C4)&sjl{DD6Wth6I}J^d`b+eEe2TgwOxS(LDM=eI-Zs-!#vDK?2-GRHse%5ZryT> zB;V0QaEsE2Rv|rzM%0v8;+*yXTrhP6fN{uvlD$B$Yq#M>bPDrbfqE$Qkq@Mt4W9@R zeSnNJmqF;qZH4DjkQ2&;oGB9%l3oB6@d>MN5{)5?`WGlE1Uue=dg4nnFHix#{3Z#7 zXhy@6gHSW}54&jEqai1{22?WtFGO zpz6CpXtyY)R-S1U+-o)2Syla)`;wD$((5*4%mOm>wn}cXoS$p3gOd39MaeGEw@a+P zwFj6jtn}_JsB&9;yB0*38vsyRWh~#)Li!ZcB6wO@lj0k|cC%1@Xo=y2gJOX*q7ZZy(vc&Kl=c)J zPcsgLQ?oXe@C7atkP1Le|RXoAMuF`Nuxrbi0Io(W?rvOnoh&sN2i?<@e3I zB81KV6HnF?MhTWuOO`t zZUg?X-MWyk-si){*yp3-Ri@qfCM@KbbSBr0`Y%Ip#ND1 z_75psi-?j?kYjSBk>ZkGUVP*#5fvB;Say9_;b)4ovOSCzx2>_#ND?q+ zI!8(1cQT8SO$P`!)2&2@T*3AIleA0D5LL4?z4Zfb9p-k`m56-W**PvNjS%+Hxm2$1 zEIso$Xje%F=NgO@_hWVTpvDn)8N|MIF80-SW6=9C3J=sj$<$%3IY61VggfEeyg7HfJ}WbeN*82*GS4-xA!YZJ2Q`B zbu5im@tX9&GOn?3)jF)YQvN4&?ZwgDBHBQ+&1_vY!^Go4y}#kvk7-yN(L!s7SvQI; zo%a!s>j;W~^~IzUU?tH_H|Kg2P@`Wtc+~5o&|xPk{?j5SER`oX_Jd_QS}9OEjxjN{NJs#P z_U?*zbykZ-3F}M2T|p=qySvHgK)J~y&OAWj6N~eSNu($aq}bE)IN=%_`hu{Rr=GRT z84?T`lIY(=e*TMmG&XNL_7jjf0)VUM?|r?0n>qhf3d>kJIscRGsIsYq3=jz;17jx~ zqd}tAA_@v2Y1C4n-v)@xqgD(%RHIDND(-ncfPZGcSSOJX zS>h=&FX?QZ<>buE5hX zMK_c-9jEfjzow|qeN#Qgt%lA?u0+epG0jfF9B$I|zg`lIn;!+jj0WAn#NqYjBsvrd3Nli@M)&xy=p@nPSVxgAXZ3Rc=IYh9qx8y zhM;7nquJY03P$G0zasQK~%z}T)jjvwZESi@cD>&gzj3XS6vt3y)$cZK)S{3+rs?9$MQw}pxGh* zwC$%4k%vu%Yd4O`3fIHNp|2;W_NAPqqOE#4?_us}C64D~#8SO^_Y^iUJc`PR-+ zi85S_?Od)%#aD01w+Zb+d`UjjZ0`*U(lnBqZJyw{L41B8`c*#99D6v2=n^-=h4fa) z?vrw;_ogeIeh9iKwx&ClK4m*rY;k*(vL6-8v8qg>(~I{oKRMjU?GxAp-UcFQbx!&7 z&d=!vT+JY+pBC*9JVVj^hwI%KK=t-u*%AF`EwZ7_AqKd^dPGK5?jh3T4{bUvJ|FHz zTc@berf*bx!Z7@S2Li+9T<1q5+cW1u58tQGhC!jG;#~=hQb@=oSi+SpYE0k`SWF)Y zBMD*EO=ed~#O#xSXAmmk)ENR)iv0^w9nN$A&RH;eD21p2Bvau3uWN|;9~qUbaw!LB zk$#jU*=nkl`vnkapf;l$ir#3^tPzDvDjGwHeaf~Pcbar+KMA>0e5P51XFPx512`wT zg4hHjG_1F0JN4XWPfq3b^812lhgU!0hcJ?#qtslPWw6<-}Rqkv06V{t;l<1qZWxeQUZJUOrW_K81RHn7K z<2HR8*xqNAmf#rOTcLB4ZIAtW_T~bM6V)u_Q9E#eO=a z&d2t=<_383>A`KkYucxfQpe6PxQ(*f{uD0GOL-GHM1Sl%iCYQ1)_Xi)rCT>0&mgOn z(WqhCWY9-umuZ}^{w}Pk&93tghKc#tTcE+I^9fjD)kZ@netXI-sa~USFQN#8t19f+8Ik;8g_e5}9KWU$GREFqP2M7DG-vRdelU+0q&V)j?sN1$!WL)~NmZ z0CKFHgYP2;X#-rj0dNc z7{k}5E(V$$m?*;p4qF$>lvoU=Be{#!4@VJdj_u!?+QC^;L_&woQ@eEq_j`uR15TjU4zl@UfMqaat__q04km{lq= zM$&nP=t{%^v7o$TZj1>ZkV}FO(=UY>Mmpygq8N^>ftm@-I)gevEz-Y>R=hvZL-=us z7;Bv4ehiRtW4r*dhCGepEGu-1JRalW-;48|oOjBtIZOmKwfkr8d&9u6j5=Vujfox1 zB_e2%eE#L>{RfAQK)^)O0utbl8NuJzX8qgSWj2*^@kD|e<$f(eo+zt)ZfGKbCBEP}5hdh`rnJ`Qw;|Z6b zb^%^3xaX1Tw`KGLtzAFoXTFi!x2+!LFMYT(Bf}LL)o}}+Z49ObS>K)qLLN&zBR>65 zC|iq6dMB%=_c($TDZ79LEAOa3ge;abiZv|Mkt6~4K0+XG7*!BD>0J2bff9;x{Q|3T zsDB$PB*|BtMW$qzaI*lFiZ|X8uok=VfR=guI7QPCBgRF>}Wp5@3?u`W93F%(D^H!^F#%BuDV0S$l{|_v0Jgyyk|B~Ce32!GIQPRL!BR~ zmecqNbc!Wy(U&{hxM^cltDuFW>Z72UD0&T!;F<${N5so;op_3+WX5B^55ZTKPq-0> zbJ+C7@HDrX;VEN~OcUjNq?gw7-w6tjX$iBk&{uj08w1>`?t}j;AjbWRs-0` z{|Li>hTlJpk4m7nO*(x>d%mF7=bfW?AHdj7B9xGCS9dnzUD(|T zbBbfLoIZm*E8_f|qLa*+gZ5tYXs4g;eoE(VoYnt*PwyA`JUpc8ZAKK_+OH{rDsST+%_FUY`)J1L_ZTlczB4SM{y9hSd+~@ zHJ^XaP$d<15tYA;Q#+o#2w5a&6vSM#@(#A-C|^esR=Ry6B1J{cFn!7b`o$w_M0Y zN4L_YZ=D5IzZY{m@+o)g5yr3 z$`iu0cg;3aG zD!-eQQ_C-Wpj_D|0ER*Jx&FMuyLi>gY4fg9e1UG3O-9&RBVH`IoCF@ZCz`LX_G-kr z#L+@}1-nTNn07?XJ0hOl{>G1duhoEj}0OHC;P`P>{$xmbz0G-_xIsMlQ zc*7e5)Tt%4rt;x}2^gngwd<^_+MsrDV4Z_p#ju9PHY? zZ@=fpgnJlK0MFu4B5ABEOC##^k_xpE{ee<|2PvWF+z0XsANc18!XUn`i1&ivkOA=M zl8dAO-d@^Q*3BV?TTUfQqog)m<*X=nz;ey+=HKy=y>u~8&+DK;dza#Gt&xa?uk6zU zDq(9adgVX=GBf)!$7K?>J5O`G939qD8qd@$e%#JRKlF(QHnmc4a%wzcT;^gHEesboN~f@wMF0Z%T^o&aXmSREwQTLkGfp(hbYso+dEJmNfEG4P) z{GlKLg%ZV^=dxyG*ajlDY`$sWgww3%QHEE}O~m&?%wVBdx%iOlzUoLV6O5o zwQTWtrINWO#g)UAVt~sj4@yX+VIJ~AngBiu0zL@w!2Yg+Qv}sT8D@l*%vJowr$%T+qP}n>e#kz+v?cq*tVT?oIdkC?_PVa zwQ7HRpZcoiQ#Jq2S@*b~F|Ki;30C|M-N=A0&NHL=0Uti&p}P&S@DBRJz(l6Qc>Z0D z3tq+!3J2U4eO!9h1Z|8A1-_LJ(5>V>Jd-G z>~EE>bRM>I&%B{J^gkDB@wcF2Gx@{SuoJ7fRywY@(z0R(B-*s-%Eb+*_0?g8@e)*- z?;DuG8XwwDFsMuR2R>v%_B71*^BfAV4=!{rpBYpOaQOa$nNTlhi^y0AXY+TE0N?L2bj=t_24 z!YG*di>W8%BN@p1fM&e}4|$XB%<=>XdYPTV9VQGw{>DT{yq=w~q-Ks#%zh;^ghbbL=}zHBkCNOMk^T)y zB#1mB@wQ@=wQPZe`q{&#WCuWMNu5Yfy#;p<%Q-`P8!dDHrSe||&w zTPCAm_T|vyyQ8#6cYyK@ba&EYwx;T7wl( zfL&+%ayKd6MXvSCwggpUbk;sL!pt*x{Ps0a-_(&^ZP+w&E7?bPZW4(CBikUzLQc1s zOIiAHwq|+;o|;6bt!kv6X2W0ZA)h=EEnA=&AX6!u^O!2&(%VR)%F{}-GH~De$W~(; zmi?6?)$i0wJEI0*TUKr&W3I-VR+!kfwF@zh$EVl5Q#X5#-v5v+(DBxb&IuZ}==^pD z!S&!IzN>Y7EH2uor~}iu_y&R>9BB52bJYk z00`vOt*dDIUe+3dc!|nY2Bvsp*%9(k#^f~yaH)03z=I_BuDRNS+VRdew+DQwPTe6kgf6j_w76v6Z?f+4dHt1 zsvC}rn@Z`@wAWg8q77@=5UD5=Pr7djT5@^1A|SkFzcGP-3$v}gSD=qSUGZu{I?XuG z&on_QB!jj)!uNIT>%xDoD)B)_x22%`M*6XN_(2<-t2%l7gkckBnlflmqb$huPoH03rM}*WlI(7=GFzj^dBX)Jr7&9#VPbHF=hh8BopgG{?8xQ?C zk|jxce!w+S;5Gy&qo8HTKvLQ8&LWSL$0N7`g$$r`1VG3R1*ewhBk)@^_h*XX$tqG6 zM`RM=9XTidWXDFwXUW9OD+0}1P|NL)-j#pE-J7qW59XIRFwn;D-m8Ufz z%VtCVI&)aVvez5qe*WU_seJDk;urYU)XqQH$3WM92X2RZv)`k(NxBN!b|G6YV5z#Q zVRnyM7=gV|LT5RYkSX$wDHK7&rJw@WtQ@I7Ov@SFm}?TL^$@#hHBQ@y80*hJN!I?l zhR&R{rc$7RfFiK~R!IM{ng8#uAz^?x{HDQ@FgfzJo(zKIXved>cZB28%l9E^rOoS$X8H3sYOhlPBD|u`ZBl6~1 z8*~Rj1@#s#+u7XBt*L9RdB?n$fyMcT_c{B|$6t|Qe0Tdn2;Vg5vC%e*g?6u~ecCnq zxnDlz&~iA+_jTLJ1O~NLH$&YY2E0+b)kX2@ULC^0wnqn_A8xIMl-v4DNCH;JQB?;DbHi-&1(J@qy*3APpg*mF@fT1473r@f8w= z(+LiEI7)W~!BDynSg2F?iO}dg(uWBYZ_5KmRYV+S<7V#Poj+c>3G{cLKdIN(W|Z$l zL*Lp7@{B_CmF`S=3U+Czdn4-_w(FXv*fG!9KVMPCE1J8{)2U)0ax@&D!w5g%FO0{!h;2*{f(#;sj($ zT4ktdO}ZoWx(URQ$amC9B;<7d7Lb4_>T(9%H76!G(zX00 zJnte~Q=AGo?2lD&T$LH{O;{Vz;+?V`t<@G*x)p`8Vq8`kRI#5eJ{nC$*_UeMR_-`& z`49{kLY`M>g0HZ=T(tH1jl2QW&J7rBN>64R^)3?#p8ie{p37W4I6v;mcu(m=xoTF> zbSpM;m=2i4fA(>j##Sh3a;n0!%IQj>QHzj-@@7YKs#^YvH+(*Itc)cQvmwlLpDb%p z&P)q@%+cf7$!hLO%n+$|)?XZJ=)D(7;r8@FhM-;I$FkRzv?j#BLIY_dCGCC06`6`_@0DCV|5!snBP&- zn}ar2f7>}*kGHeH=pRKzTl$ku!v})Dw{8~#TQ7vbYBib;+P8Rb^d%xxJ&69-t8yA^ zD(3vH@`ude%w2IPZ@bbU!!0TU4;|u!{dbh)W2nZPMh{I)5F}OWvbnFhhp4T2l`pO zP~;W{awJYZvYH@^?#wrOVs5A>3C62`D?-yYa2?vo#e9%hNUlHR6LmTO9OHlm-ocbxz}&-+KxU~-cRSUdEU{H*Xd148pN75Kx$LSD#azW*>>?YEY_1*NQv?)Gq0worsmzH(k(?G{c!`v> zow|;_AWs_A8yj1CrH8T|8L!Z@cxf<8Ns}4B?Z%uilDaf1b}G~0tet|TSfAmC^riPy z6ZMJKI71%pIPlsQp59-aP&BmWPmN+Qx!{U2o!8!NtI{n5XV~yh>N@&zpAC66nBJuAPVI9>ibFH< z%7L<>(fpUtk%jn}LW3`0*K^vWcY<0_Lub{u^o~rNT_7ZtY$tloQii%wp zNOcE0mu7?_${XA&UmL^L6+pvfX3>sz`HZo1orY3zeM!@9pN57?2V$u-YC&YaR29U% zxk4kP&)X%Qi&gGxf0Pc$xI0-Wc8byk`Iby#W|`RLM}JF0mr3ctoWK(x5~2-8$N{Qk zB+&IBYXQd?o6E2`%#G+ZClsJlVXvGME^0cH#RF}I3dbv8Qi&<@Qn@}YF|W~qF{F{^ zaB7cl2EhpU^QM#G>jlxCS7g83Ik1GC?jP5(j9R6mm(T2P+b&Y8oOMFIDpN!aE}dm9 zTyvm+@Bb&ftT^|P#f?BMA#q7*O~?G3+rCnSZK#U$GtZMp+8lP()_Emd{e%EI^+6?l zpQ~O#rGFW<|71hdavf!#52wr9IvtT{NkV$m50ZYT`Zl?IyHU($S~FCXdQ<2raB$rz z;o8m|(DU8r;z-%HEQ7I1(N)=dvvmpB*r^)|jGYGMb5Ws*)aK1N*lNv%OT z=RYhlm^!=SJ-Z^^=K{4yYr=E-Ypy13*4bKpAsYqB`z-IxBW?ZUY<3Nhpmy~*BC1Kt z2WpCI9zAiFp-IabTng2Encg>#H^n8&%RAV;y^P|E8$~`V7lmYGq-cBd!L1mOZ~H5kyX%I21O1@mfUqw~ z?+6Hd6LZ=nCq6fmlphPYQcOq{fm&|@t}93`FT``c)vAPC+V$dF_~Tt$AeS(s{v}&#&WE6$P4or8&VqOyBD* z{A3G6%6r$Y@EpJJMz6a6hs#~G5*CLLDqhOA9bq)neK10Ks2g4K+AvYdJ*I@>i{?G0 z5^8WNPk8cSVQ2n!DJjMhJ%)YJADqLL7|fJW(X_V3(6oPBq4=7rdshNl+6%z*ucXue zuC@Kgg#8Z)E4m*ZmO+!~aTPF80>$3S5>#8DvbG7JD_=veg@}icU+RY6hega)u=FI>BO^ zEvFP##y|&V!f?8hqZFf?uZ0sBHW~m4w*nNaO42vuEYW;A1tnC&*9wYAn5BMujIs6T zy$i8IHc(tlC@w|M2c>smKi12i|INAl)-qs80)X6^0%E(l{?~r~A3yr9*n+=Zm<$0h z!#~zX(f~hS)UWGims5@u=x_!Ff%smR@_iK0gh(D}T0&Z#bl4{?h%y!vd}#hYk)nuN zpPJ1M!-9xHN5jnwfcX1Fjsgs=>@2h)y0@Xm(7Oy1TXPX6kA#;uNIduJeuUEN17mlahY5d=Or~VFj3nN`y!YW6OlN z`hC`5*QvP1!z?z|4(_&IiGqy}u;T7*C~9R?uJG2|{#~Fc zijuhRqB@cu2~t~eD%2M3h_=F1V1&FyT{^@ZLoEDmmrV_S06EzArp<3*M9c)Ydakj5q>LhdN%Q`$zGJ7ZB7C*Fi^e$ z5q`}UejJ4J*vrc_WaK&5?#<`AwJ&3x4g0h>PbZMeok4?{N=o9-1h_@r`8Stdw=MjX%Vyd=+*!TJs*_5Um23a4>r~p_Dh#1F(|Yw>fo-_~nrJ zD(JZ09$8&@Py(^j4R$ZvL9xWTN~z$nfw$SpKA-?z2GiwgU&7o zrf>lH5x^%H@QB1%Zn1{gjtGu~!fDElQ5}g{MKl7*gmr2hoDPF12hJcb2=m)lsu5DR z&2A{`lJ3|>+`R9`yZe>fJptf;0rx9HDx(6GEl#L z*-cxc3Sq>;$C9xhAnzvHn=XjHioc@&^^5pU-H@0lVd&*Dj(Iy{ISy!~bNtt6hVxCw z^RFEH9ezLH*^we*DGk=aE#%TY&i0dhH6h?)5{-anQ*z@sX1fw&yb*STPm)6ziqp4--E6T4eUoN|23} zy>d({Y4jves=4QN*({YKX&l+5l(3$cgRd#L;Zt>JNgSAh8euRnbW{X}>td23SIFa9 zbCKe_1L%SqDB52Mm{>r6t}!nQ4HrKyOerl71CXK+-s)&1PYFC`xp-J-^9!17Q{pAq zs6W5^7&m11RjR71g!^~C8f}+m9_KmPIZYN?4lhcV^kNr^7fJUj8gn<=V&3#E&{t2Z z4tp#$_xIVRHb9+HB0Eg|%{rZeX7&3;txl+Ga%cJEo!9K~172%L4nK?!`L*`Ruqh%S zFAY=0R%$2PqdC)`9pF~P?Y0dDxb!##4JXa@nfCmIt}&Cs_Ml2zH6AdBg{^Iia}sW_ zXlfwm4#}FZ)laLX`e%&$?=i%zJU8o^wub03VUl<8bV^iH>XAeB4LLsl4TYxNF7})N z2s1JPuZ(|9as2Pzk$)e@e;mjdC0TnECd40dslmY^g_Bz0{s$1X%+{zQHg+V4Zy6(<_W0u!Vz*0sDk$+*j6KX|=+*l-8>!DE{r872$r zp)%@*7l&naEku^%i^mOX02$Yu>V_IcngBJZXL6aWU#i7P-_+4;Mc#tKlot_A5M^Uh zefbC>!lHueJa*fueJ$le#RrKG!+Ye}IuOr=_8>uKSMN807(LZtq7jjtYCpf0(R?$c zDU-T1CL`iQU44Htfcc_?IRQ1Ms@|9edqtzvT{JVRl{!>^XTKfyu+y=UCK=iz9LcXy zi1}4AUD~_!VcQGmtel*HwB=3}J9oluuNgNQz_?;&PKy_1*bt14P~5f}IZE7GgW|?^04Jp66Qag2$;TZMV#qD+mUjTnX3y8IY7e*; zpZ*=N|wu0M5h_;Q3!#2w{6y8xug@5y1V`*h;ih4!;R-f=A*4>`~t-Z)-j6S4EM?e&MTwCBKSg;EsM5 z}@j`M&HF3V1acAYMYU0{E@{OGg4Zxp>d}Zs$>nA0>du3*ru@cI;z^f`h z>21Al*LbPc`2Bg#`vc;DdxJG=hy$R)+*jonSr7t?o9W<5Grv~D&j>_4_6Ded&LbEdfhom<+jvF57&l*4;c6uE0H2ecjG&ik@;$*P(~0Ej}$- zu9RKtokG{1$-C)rRZy*lmT9NZ38X5XPKyTChAfa=%4lesMsm_^QAM&jv#Az?BPrX( z8Fjo+1y?)?`%h@=0KTJi$VW2H6eSJ+Kzp9vcm-L4TsgW;zr~Y96v*uCB?KA zgSR)?6qu2m5+z0)?2cA%VP72E946TVA6ubd@a>XY?%d zyP>jqMH}jKZK)Yr##(AORpTa|s49a?chb3&qG*eD9ija$(K9sTbH8G#`A^o4qTj4% z;GyiPtUL@ZT(N)0>suWN{u)Hs%Z?AmPDwiPZ2F{f)iz+o_0lL;_bg5?_Nc=^FfU}R zWT|;QCx+v`M;nY4D$#+M|3paSv@>8>?U?1}R(4vh${N3hwXzH7Is4MkRHJ+3ZHch- zxOgnKfTKxM?#;u-#a)b-w0|fM&xWJXF`VioV<;OLNL*EY^3WMzVhXXuW61P?V#vbm zuMb7}BfpgKf>tW~fz4pe(O3g1E3=E0n=U&MlhSUPF)_cB{zB(#zK@S5s>Y(dK;*Wre}=(c0RWxt)!n?7j^~~nU`DcZp=c};f}AM15O2So`@24+ChPX zPvU{{cjILizpM{Eo*+XlzQKejF|B~03~vh$u<@xdi*9buOZ-fZIUiHFHy<-J?(2Eo zla*4*eemp~Kz!CF-l;WI^SJyNg0L%&NP3f7O|8z;6|qWZk3?%p|1u#jVS45D;17OM zjAUnP3nXk~C%Br2Q8hz7k4yY@zEHklUy7o&?+(u{LcZ=4*Lik{5!a>fk8`Dj zu@oaUs78o>z`z?2;+hZY8Q~4s#fA;^W{VPh3Semy1AAL=3lt1l`+p*qaE*JA6~Q{o z?<+>{Th`hYd{RX-wIvy*=D{@aggqFh9(+hUh%N5B;z#7f4PBeoj!$889jo7sL7Y~9 zT~6S>19@*Fv|ZYi8!3mU5}wdEJ|SKa-Yuh%qmw%lP1Ug<9$%2#s~6vXuf?eQv|i=@ z8G8LX#b0lZ##{BV&OL&+El%~UewIiIlIFhq@Zr}ldO0W)ZRIDj)Gv!$5~e2kK>Ut1 zC1x4Pv%e$PNRN#B0ttb0%j9*V7M>~GLO`(7@OMvy;<2IjPapU(-C?W;Dg@o3S}h)mCj_+)8u zu0FBjb1@}QlzR}XdZQk7U_b458)n-QRI9%Q-x%`?NJoAiNPPX1!0#_+k^oR72qBqdTdu?PU?9sI4nQPMyVltc9m;`Z85#_Xe4jiCTYxjZmdmQdWfVj zxmAT4r^ZB9X=kK$7HOv%9$h*uIm1y*&gOB&xOGbnJ202^wy6YRKJb#I%Pj?|i=^2K zp!gItet?DMItxr|hjyK3(3fad$tzDLk3-S;GkBD$7M8EP;(f;CHat$Kk&n{xs)u%; zg)zbEC+7Lo$_sWWKe)Pm_CVcKj^fN|Vtg-}R?2T|*JiD(wN$raKE^DpI#v^P=M6K` z)9tYM^+Rt<(aDW$HDGDd?3Ka1s8-P#EV`g4z;IkF(R7LhwYKu4urNh+!#Q#UM)`8| zCxu^jQ-#H7U?k=~^*UmivE#V+;5QUl_VW~!M4{MeIsHU?i$Gx5b7X|cSNWhw+}x_u zQ8+Z-_F7`N82Z@^z}69#Q8UP z#4k#rBx0Gu)}VFL!c)>ldaD3!U(D%FV5WV`bj&*uBB4iC8MA;LY(>; z#!sXpmz4Wbdd&giaO_Yb7rYjw1Kms>5hogdLly8+8tc#A1J7fY!NF*SoCb`Fyo)GU z`L0HAZ?#Ltz5-Z&d?I6PiL>H&ZSs=ghT*+i1q~uJ?o717Wfo!(bp@0uQP6oLRubQ(p1<(MMEzRu=T>vqN|3MYdfYMf3!SZEbVVrW%1O=XxK}2Ku z6^}T#8Xit;C!#5?wggV&~00fQyFc^ixmkmo8 zKKgkZ5f}Hehw&i(Ns07;;+q`#YV4aF^?Kkth4eu2QI7mj0mK&}pR&8~A_G)*r^&=a zh3QN0Up922>@gq40!-Uy%;%$*?IY;p!{omN7-!6fZ(V?pvQfNeAQR1pPdpnk5zCSS z|9~;+JnnS>(eFv`UwSg>pcm_-526wDDhYk|QuFna|LWBXwBNOY((7X%zNKq;E=1T- zQ`qV-e(x*I`NYHNWWT!D+3KpW*OwQs3%tMnwk}xXxyfoY&AYye4fe%n%u$r=MhBm*dlYoWRtWp7i5aQOD~wCFR`yU2sK)7;&yry+vFU z^^f_@Jz7uG?cH`HoO78WgmXz{oanPp)J$R(Xn4BGx#^7z%=wUcF`XSgKCW_#_hB-y zl&y$zbe!45P!l6tFEOyZ%qf!lwzw4&n0E39mFSqPAL3%-t}K@EewX2ass*%twO!oc z2mp(TnO}{-V3FjkW1Rc_`GM=S@t>d8FY*Gn4yB8&U(1_aR|S@}noaT860%^>JuN(k z`w5HBqhrM#;_Twc!q%H+=Mv;CBwJ!q`83!mC(y_8e(L?VElze9a-?Bd2+^Z(O`7~X zr4%uWymnR%X3iq=q;R}Tn^k1rCzg}s%B8&zmjW76n3E0^SrVoY%`X&?W%Fpt^8$d2 z-j=AUMK~D0Aqu9%9Cfx_!(WX{&hfIGY`e&*!hX3@QQ~AFQz$0_XVQeG^c9>toP6zT z0vWKe07>fb!X=*L2Bf;Sed-4t@98{1F|AnlUyLX&n%&BIcSg2vak8WWE7ps{W;!1| z5gJsDA<;}T(u|ub(rqKfoEsneqvM!c*1#W8xjfgiCpe5@&dbavbEUnR7G-2rwY4i{ zVWe?nh=cb)B~4%zesy|+#i)o&rLwEN0SlvasU=AwH3g37XnKZJg(a?I%2K*(09^Vx zt2da5Jp*JRmQOaTGOf6=B2<#PtVO-C7|agUOey8Dy6DWCY{h1vu1iR?sCz{DI0=cH z_MN?JnarFOHAT)kn1cg5^+` z_VmlJ8R`;ZF_(^2(`{0$GGrT8St%sRZZ>g(Doe*dQ893!#5K~pwXjI#((6J`MeC$x zNj3wme$Yq`SQ{=Z(u`?tr^9Zd$)zC8Bl!_=XQHxW6W*q2YZucgTEExCIBi>%ioLfW z77`$?>H~36Do54`7a=0EvQOPwkd?5<#X&qF@99-!Pny7*kxpMDM#(32hK1X;U&=@O zTW6{hK;8(jt`A`|2xphYSv3fDc zP%2>Z8x@RhMQ=Vt6~6q144HbpK~5Bct^5Vew`QLVSJja}k=mCe)Dc%@F7i9IFHN{# z*p4|RDevVVfyxJxpVA#Zi?^XGd1& zmxdG5nTEI-i}j2j?q53qlPrnyHhUz8_bAG4>LywaTXqSNvs7BGx{fWmH(e;3UekAR zY#h0L)&OlA5BIya-Cud= zu5j4)hMKsRM74p*3o3)&hM_#HEQjW^R@DLf*#fOnFr-zXO4*`js!G|WhNhZsTti)@ zK&FPl_*@Ozo?)CmAV@i!KG}fHo)0dq7^Te=cY6V8&DUxSd|j%gEm482!*o5MRtfH6 zdRcvxR#L#E`Tm=2vcL-%GhvD zgeh9<=AcRlTwLLWSIG_dNSX$$OK$%-Z4<27r?ptT1+{un_Xd9WCB+p`Dv?X)s)Bx? zi|K&6N#?m_`>=k#uR8kkm5m`TN}V)l#cuO}Ij^N@bkCPzdbHHQ*)I^cdq6d<-XF

二月 27, 2017
+ */ +public class ArrayUtilTest { + ArrayUtil util = new ArrayUtil(); + + /** + * Method: reverseArray(int[] origin) + */ + @Test + public void testReverseArray() throws Exception { +//TODO: Test goes here... + int[][] arrays = { + {7, 9, 30, 3}, + {7, 9, 30, 3, 4}, + {5}, + {} + }; + for (int[] a : arrays) { + util.reverseArray(a); + } + + int[][] result = { + {3, 30, 9, 7}, + {4, 3, 30, 9, 7}, + {5}, + {} + }; + Assert.assertArrayEquals(arrays, result); + } + + /** + * Method: removeZero(int[] oldArray) + */ + @Test + public void testRemoveZero() throws Exception { +//TODO: Test goes here... + int[][] arrays = { + {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}, + {6, 6, 3, 5, 4}, + {0, 0, 0}, + {} + }; + + for (int i = 0; i < arrays.length; ++i) { + arrays[i] = util.removeZero(arrays[i]); + } + + int[][] result = { + {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}, + {6, 6, 3, 5, 4}, + {}, + {} + }; + Assert.assertArrayEquals(arrays, result); + } + + /** + * Method: merge(int[] array1, int[] array2) + */ + @Test + public void testMerge() throws Exception { +//TODO: Test goes here... + int[][] arrays1 = { + {3, 5, 7, 8}, + {2, 3, 4}, + {1, 2, 3, 3, 4, 5}, + {1, 2, 2}, + {}, + {} + }; + int[][] arrays2 = { + {4, 5, 6, 7}, + {6, 7, 8, 9, 9}, + {4, 4, 5, 7}, + {}, + {2, 2, 3}, + {} + }; + + int[][] merged = new int[arrays1.length][]; + for (int i = 0; i < arrays1.length; ++i) { + merged[i] = util.merge(arrays1[i], arrays2[i]); + } + + int[][] result = { + {3, 4, 5, 6, 7, 8}, + {2, 3, 4, 6, 7, 8, 9}, + {1, 2, 3, 4, 5, 7}, + {1, 2}, + {2, 3}, + {} + }; + Assert.assertArrayEquals(merged, result); + } + + /** + * Method: grow(int [] oldArray, int size) + */ + @Test + public void testGrow() throws Exception { +//TODO: Test goes here... + int[][] arrays = { + {2, 3, 6}, + {}, + {1} + }; + + int[] size = {3, 3, 0}; + + for (int i = 0; i < arrays.length; ++i) { + arrays[i] = util.grow(arrays[i], size[i]); + } + + int[][] result = { + {2, 3, 6, 0, 0, 0}, + {0, 0, 0}, + {1} + }; + Assert.assertArrayEquals(arrays, result); + } + + /** + * Method: fibonacci(int max) + */ + @Test + public void testFibonacci() throws Exception { +//TODO: Test goes here... + int[] max = {0, 1, 2, 15}; + + int[][] arrays = new int[max.length][]; + + for (int i = 0; i < arrays.length; ++i) { + arrays[i] = util.fibonacci(max[i]); + } + + int[][] result = { + {}, + {}, + {1, 1}, + {1, 1, 2, 3, 5, 8, 13} + }; + Assert.assertArrayEquals(arrays, result); + } + + /** + * Method: getPrimes(int max) + */ + @Test + public void testGetPrimes() throws Exception { +//TODO: Test goes here... + int[] max = {0, 1, 2, 3, 11}; + + int[][] arrays = new int[max.length][]; + + for (int i = 0; i < arrays.length; ++i) { + arrays[i] = util.getPrimes(max[i]); + } + + int[][] result = { + {}, + {}, + {}, + {2}, + {2, 3, 5, 7} + }; + Assert.assertArrayEquals(arrays, result); + } + + /** + * Method: getPerfectNumbers(int max) + */ + @Test + public void testGetPerfectNumbers() throws Exception { +//TODO: Test goes here... + int[] max = {0, 6, 7, 496, 497}; + + int[][] arrays = new int[max.length][]; + + for (int i = 0; i < arrays.length; ++i) { + arrays[i] = util.getPerfectNumbers(max[i]); + } + + int[][] result = { + {}, + {}, + {6}, + {6, 28}, + {6, 28, 496} + }; + Assert.assertArrayEquals(arrays, result); + } + + /** + * Method: join(int[] array, String seperator) + */ + @Test + public void testJoin() throws Exception { +//TODO: Test goes here... + int[][] arrays = { + {3, 8, 9}, + {5}, + {6, 6}, + {} + }; + + String[] sep = {"-", "**", "", "---"}; + String[] joined = new String[arrays.length]; + + for (int i = 0; i < arrays.length; ++i) { + joined[i] = util.join(arrays[i], sep[i]); + } + + String[] result = { + "3-8-9", + "5", + "66", + "" + }; + Assert.assertArrayEquals(joined, result); + } +} diff --git a/group01/895457260/code/src/datastructure/basic/ArrayList.java b/group01/895457260/code/src/datastructure/basic/ArrayList.java new file mode 100644 index 0000000000..28eb439c1b --- /dev/null +++ b/group01/895457260/code/src/datastructure/basic/ArrayList.java @@ -0,0 +1,136 @@ +package datastructure.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData; + + public ArrayList() { + elementData = new Object[100]; + } + + public ArrayList(int initCapacity) { + elementData = new Object[initCapacity]; + } + + public void add(Object o) { + autoGrow(); + elementData[size()] = o; + size++; + } + + public void add(int index, Object o) { + autoGrow(); + System.arraycopy(elementData, index, elementData, index + 1, size() - index); + elementData[index] = o; + size++; + } + + public Object get(int index) { + checkIndex(index); + return elementData[index]; + } + + public Object remove(int index) { + checkIndex(index); + Object removed = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size() - index - 1); + size--; + return removed; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new Iterator() { + int index = -1; + @Override + public boolean hasNext() { + return index + 1 < size(); + } + + @Override + public Object next() { + index++; + return elementData[index]; + } + }; + } + + private void autoGrow() { + if (size >= elementData.length) { + Object[] newArray = new Object[nextCapacity()]; + System.arraycopy(elementData, 0, newArray, 0, elementData.length); + elementData = newArray; + } + } + + private int nextCapacity() { + return elementData.length * 2; + } + + private void checkIndex(int index) { + if (index >= size() || index < 0) { + throw new IndexOutOfBoundsException(indexOutOfBoundMessage(index)); + } + } + + private String indexOutOfBoundMessage(int index) { + return "index: " + index + ", size: " + size(); + } + + public static void main(String[] args) { + ArrayList list = new ArrayList(); + for (int i = 0; i < 10; ++i) { + list.add(i); + list.add(10 - i); + } + System.out.println("------------------size"); + System.out.println("size: " + list.size()); + + System.out.println("------------------for(int i)"); + for (int i = 0; i < list.size(); ++i) { + System.out.print(list.get(i) + " "); + } + + System.out.println("\n-----------------iterator"); + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + System.out.print(iterator.next() + " "); + } + + System.out.println("\n-----------------add at index 0 100~104"); + for (int i = 100; i < 105; ++i) { + list.add(0, i); + } + list.print(); + System.out.println("-----------------add at last 200~204"); + for (int i = 200; i < 205; ++i) { + list.add(list.size(), i); + } + list.print(); + + System.out.println("-----------------removeFirst x4"); + for (int i = 0; i < 4; ++i) { + list.remove(0); + } + list.print(); + + System.out.println("\n-----------------removeLast x4"); + for (int i = 0; i < 4; ++i) { + list.remove(list.size() - 1); + } + list.print(); + } + + public void print() { + Iterator iterator = iterator(); + while (iterator.hasNext()) { + System.out.print(iterator.next() + " "); + } + System.out.println("\nsize: " + size()); + } +} diff --git a/group01/895457260/code/src/datastructure/basic/BinarySortedTree.java b/group01/895457260/code/src/datastructure/basic/BinarySortedTree.java new file mode 100644 index 0000000000..b251ff02ee --- /dev/null +++ b/group01/895457260/code/src/datastructure/basic/BinarySortedTree.java @@ -0,0 +1,61 @@ +package datastructure.basic; + +/** + * Created by Haochen on 2017/2/24. + * TODO: + */ +public class BinarySortedTree { + + private BinaryTreeNode root = null; + + public void traverse(Visitor visitor) { + traverse(root, visitor); + } + + private void traverse(BinaryTreeNode node, Visitor visitor) { + if (node == null) { + return; + } + traverse(node.getLeft(), visitor); + visitor.visit(node); + traverse(node.getRight(), visitor); + } + + public interface Visitor { + void visit(BinaryTreeNode node); + } + + //不递归的写法 + public void add(T o) { + //根节点空,直接加入 + if (root == null) { + root = new BinaryTreeNode(); + root.setData(o); + } else { + BinaryTreeNode target = root; + //从根结点不断向下比较target和o,o小则往左,o大则往右,相等不加入 + while (true) { + int compare = o.compareTo(target.getData()); + if (compare == 0) {//相等不加入 + return; + } else if (compare < 0) {//o小往左 + if (target.getLeft() == null) {//左空则加入 + target.setLeft(new BinaryTreeNode()); + target.getLeft().setData(o); + return; + } else {//不空继续比较 + target = target.getLeft(); + } + } else {//o大往右 + if (target.getRight() == null) { + target.setRight(new BinaryTreeNode()); + target.getRight().setData(o); + return; + } else { + target = target.getRight(); + } + } + } + } + } +} diff --git a/group01/895457260/code/src/datastructure/basic/BinaryTreeNode.java b/group01/895457260/code/src/datastructure/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d3a9ff377b --- /dev/null +++ b/group01/895457260/code/src/datastructure/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package datastructure.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group01/895457260/code/src/datastructure/basic/Iterator.java b/group01/895457260/code/src/datastructure/basic/Iterator.java new file mode 100644 index 0000000000..c1fb7ae8a5 --- /dev/null +++ b/group01/895457260/code/src/datastructure/basic/Iterator.java @@ -0,0 +1,6 @@ +package datastructure.basic; + +public interface Iterator { + boolean hasNext(); + Object next(); +} diff --git a/group01/895457260/code/src/datastructure/basic/LinkedList.java b/group01/895457260/code/src/datastructure/basic/LinkedList.java new file mode 100644 index 0000000000..174044c546 --- /dev/null +++ b/group01/895457260/code/src/datastructure/basic/LinkedList.java @@ -0,0 +1,132 @@ +package datastructure.basic; + +import datastructure.exception.EmptyListException; + +public class LinkedList implements List { + + private Node head; + private int size; + + public LinkedList() { + head = new Node(); + } + + @Override + public void add(Object o) { + addLast(o); + } + + @Override + public void add(int index , Object o) { + Node pre = findNode(index - 1); + Node node = new Node(); + node.data = o; + addNode(node, pre); + } + + @Override + public Object get(int index) { + checkIndex(index); + return findNode(index).data; + } + + @Override + public Object remove(int index) { + checkIndex(index); + Node pre = findNode(index - 1); + Node removed = pre.next; + removeNode(removed, pre); + return removed.data; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object o) { + Node node = new Node(); + node.data = o; + addNode(node, head); + } + + public void addLast(Object o) { + Node node = new Node(); + node.data = o; + Node pre = findNode(size() - 1); + addNode(node, pre); + } + + public Object removeFirst() { + if (size() == 0) { + throw new EmptyListException(); + } + Node removed = head.next; + removeNode(head.next, head); + return removed.data; + } + + public Object removeLast() { + if (size() == 0) { + throw new EmptyListException(); + } + return remove(size() - 1); + } + + @Override + public Iterator iterator() { + return new Iterator() { + Node node = head; + @Override + public boolean hasNext() { + return node.next != null; + } + + @Override + public Object next() { + node = node.next; + return node.data; + } + }; + } + + private static class Node{ + Object data; + Node next; + } + + private Node findNode(int index) { + if (index == -1) { + return head; + } else { + checkIndex(index); + } + Node node = head.next; + for (int i = 0; i < index; ++i) { + node = node.next; + } + return node; + } + + private void checkIndex(int index) { + if (index >= size() || index < 0) { + throw new IndexOutOfBoundsException(indexOutOfBoundMessage(index)); + } + } + + private String indexOutOfBoundMessage(int index) { + return "index: " + index + ", size: " + size(); + } + + private void addNode(Node node, Node pre) { + node.next = pre.next; + pre.next = node; + size++; + } + + private void removeNode(Node node, Node pre) { + pre.next = node.next; + node.next = null; + size--; + } +} diff --git a/group01/895457260/code/src/datastructure/basic/List.java b/group01/895457260/code/src/datastructure/basic/List.java new file mode 100644 index 0000000000..2f085701c5 --- /dev/null +++ b/group01/895457260/code/src/datastructure/basic/List.java @@ -0,0 +1,10 @@ +package datastructure.basic; + +public interface List { + void add(Object o); + void add(int index, Object o); + Object get(int index); + Object remove(int index); + int size(); + Iterator iterator(); +} diff --git a/group01/895457260/code/src/datastructure/basic/Queue.java b/group01/895457260/code/src/datastructure/basic/Queue.java new file mode 100644 index 0000000000..edd0a6a29e --- /dev/null +++ b/group01/895457260/code/src/datastructure/basic/Queue.java @@ -0,0 +1,68 @@ +package datastructure.basic; + +import datastructure.exception.EmptyQueueException; + +public class Queue { + //数组实现自增长的循环队列 + private Object[] array; + private int head = 0; + private int rear = 0; + + public Queue() { + this.array = new Object[10]; + } + + public Queue(int initCapacity) { + this.array = new Object[initCapacity]; + } + + public void enQueue(Object o) { + int target = mapIndex(rear); + autoGrow(); + array[target] = o; + rear++; + } + + public Object deQueue() { + if (isEmpty()) { + throw new EmptyQueueException(); + } + Object obj = array[mapIndex(head)]; + head++; + return obj; + } + + public boolean isEmpty() { + return head == rear; + } + + public int size() { + return rear - head; + } + + private int capacity() { + return array.length; + } + + private void autoGrow() { + if (size() >= capacity()) { + Object[] newArray = new Object[nextCapacity()]; + System.arraycopy(array, 0, newArray, 0, capacity()); + + int increase = nextCapacity() - capacity(); + int moveCount = size() - mapIndex(rear); + System.arraycopy(newArray, mapIndex(head), newArray, mapIndex(head) + increase, moveCount); + array = newArray; + head += increase; + rear += increase; + } + } + + private int nextCapacity() { + return capacity() * 2; + } + + private int mapIndex(int index) { + return index >= capacity() ? index % capacity() : index; + } +} diff --git a/group01/895457260/code/src/datastructure/basic/Stack.java b/group01/895457260/code/src/datastructure/basic/Stack.java new file mode 100644 index 0000000000..ab4fc874ae --- /dev/null +++ b/group01/895457260/code/src/datastructure/basic/Stack.java @@ -0,0 +1,32 @@ +package datastructure.basic; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + if (isEmpty()) { + throw new EmptyStackException(); + } + Object peek = peek(); + elementData.remove(elementData.size() - 1); + return peek; + } + + public Object peek() { + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group01/895457260/code/src/datastructure/exception/EmptyListException.java b/group01/895457260/code/src/datastructure/exception/EmptyListException.java new file mode 100644 index 0000000000..6f38ed6c43 --- /dev/null +++ b/group01/895457260/code/src/datastructure/exception/EmptyListException.java @@ -0,0 +1,8 @@ +package datastructure.exception; + +/** + * Created by Haochen on 2017/2/24. + * TODO: + */ +public class EmptyListException extends RuntimeException { +} diff --git a/group01/895457260/code/src/datastructure/exception/EmptyQueueException.java b/group01/895457260/code/src/datastructure/exception/EmptyQueueException.java new file mode 100644 index 0000000000..071a366ed8 --- /dev/null +++ b/group01/895457260/code/src/datastructure/exception/EmptyQueueException.java @@ -0,0 +1,7 @@ +package datastructure.exception; + +/** + * Created by Haochen on 2017/2/24. + * TODO: + */ +public class EmptyQueueException extends RuntimeException {} diff --git a/group01/895457260/code/src/datastructure/test/ArrayListTest.java b/group01/895457260/code/src/datastructure/test/ArrayListTest.java new file mode 100644 index 0000000000..3a3f742634 --- /dev/null +++ b/group01/895457260/code/src/datastructure/test/ArrayListTest.java @@ -0,0 +1,152 @@ +package datastructure.test; + +import datastructure.basic.ArrayList; +import datastructure.basic.Iterator; +import datastructure.basic.List; +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** + * ArrayList Tester. + * + * @author + * @version 1.0 + * @since
二月 24, 2017
+ */ +public class ArrayListTest { + + @Before + public void before() throws Exception { + } + + @After + public void after() throws Exception { + } + + protected final List getList() { + List list = createList(); + init(list); + return list; + } + + List createList() { + return new ArrayList(5); + } + + private void init(List list) { + for (int i = 1; i <= 5; ++i) { + list.add(i); + } + } + + protected final Object[] toArray(List list) { + Object[] array = new Object[list.size()]; + Iterator iterator = list.iterator(); + int pos = 0; + while (iterator.hasNext()) { + array[pos++] = iterator.next(); + } + return array; + } + + /** + * Method: add(Object o) + */ + @Test + public void testAddO() throws Exception { +//TODO: Test goes here... + List list = getList(); + for (int i = 6; i <= 10; ++i) { + list.add(i); + } + Assert.assertArrayEquals(toArray(list), new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); + Assert.assertEquals(list.size(), 10); + } + + /** + * Method: add(int index, Object o) + */ + @Test + public void testAddForIndexO() throws Exception { +//TODO: Test goes here... + List list = getList(); + int nowSize = list.size(); + int[] indexes = {nowSize + 1, -1, nowSize, nowSize, 0, 1}; + Object[] values = {0, 0, 300, 400, 100, 200}; + boolean[] exceptions = new boolean[indexes.length]; + for (int i = 0; i < indexes.length; ++i) { + try { + list.add(indexes[i], values[i]); + } catch (IndexOutOfBoundsException e) { + exceptions[i] = true; + } + } + Assert.assertArrayEquals(toArray(list), new Object[]{100, 200, 1, 2, 3, 4, 5, 400, 300}); + Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false}); + Assert.assertEquals(list.size(), nowSize + 4); + } + + /** + * Method: get(int index) + */ + @Test + public void testGet() throws Exception { +//TODO: Test goes here... + List list = getList(); + int nowSize = list.size(); + int[] indexes = {-1, nowSize, 0, 1, nowSize - 1, nowSize - 2}; + Object[] values = new Object[indexes.length]; + boolean[] exceptions = new boolean[indexes.length]; + for (int i = 0; i < indexes.length; ++i) { + try { + values[i] = list.get(indexes[i]); + } catch (IndexOutOfBoundsException e) { + exceptions[i] = true; + } + } + Assert.assertArrayEquals(values, new Object[]{null, null, 1, 2, 5, 4}); + Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false}); + Assert.assertEquals(list.size(), nowSize); + } + + /** + * Method: remove(int index) + */ + @Test + public void testRemove() throws Exception { +//TODO: Test goes here... + List list = getList(); + int nowSize = list.size(); + int[] indexes = {-1, nowSize, nowSize - 2, nowSize - 2, 1, 0}; + Object[] values = new Object[indexes.length]; + boolean[] exceptions = new boolean[indexes.length]; + for (int i = 0; i < indexes.length; ++i) { + try { + values[i] = list.remove(indexes[i]); + } catch (IndexOutOfBoundsException e) { + exceptions[i] = true; + } + } + Assert.assertArrayEquals(values, new Object[]{null, null, 4, 5, 2, 1}); + Assert.assertArrayEquals(exceptions, new boolean[]{true, true, false, false, false, false}); + Assert.assertEquals(list.size(), nowSize - 4); + } + + /** + * Method: iterator() + */ + @Test + public void testIterator() throws Exception { +//TODO: Test goes here... + List list = getList(); + Iterator iterator = list.iterator(); + Object[] values = new Object[list.size()]; + int pos = 0; + while (iterator.hasNext()) { + values[pos++] = iterator.next(); + } + Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5}); + } +} diff --git a/group01/895457260/code/src/datastructure/test/BinarySortedTreeTest.java b/group01/895457260/code/src/datastructure/test/BinarySortedTreeTest.java new file mode 100644 index 0000000000..f0374b2700 --- /dev/null +++ b/group01/895457260/code/src/datastructure/test/BinarySortedTreeTest.java @@ -0,0 +1,60 @@ +package datastructure.test; + +import datastructure.basic.BinarySortedTree; +import datastructure.basic.BinaryTreeNode; +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** + * BinarySortedTree Tester. + * + * @author + * @version 1.0 + * @since
二月 24, 2017
+ */ +public class BinarySortedTreeTest { + + @Before + public void before() throws Exception { + } + + @After + public void after() throws Exception { + } + + private BinarySortedTree getTree() { + return new BinarySortedTree<>(); + } + + /** + * Method: add(T o) + */ + @Test + public void testAdd() throws Exception { +//TODO: Test goes here... + BinarySortedTree tree = getTree(); + int[] addValues = {5, 3, 1, 7, 6, 4, 8}; + for (int i : addValues) { + tree.add(i); + } + + final Object[] left = new Object[addValues.length]; + final Object[] value = new Object[addValues.length]; + final Object[] right = new Object[addValues.length]; + tree.traverse(new BinarySortedTree.Visitor() { + int pos = 0; + @Override + public void visit(BinaryTreeNode node) { + left[pos] = node.getLeft() == null ? null : (int) node.getLeft().getData(); + value[pos] = node.getData(); + right[pos] = node.getRight() == null ? null : (int) node.getRight().getData(); + pos++; + } + }); + Assert.assertArrayEquals(left, new Object[]{null, 1, null, 3, null, 6, null}); + Assert.assertArrayEquals(value, new Object[]{1, 3, 4, 5, 6, 7, 8}); + Assert.assertArrayEquals(right, new Object[]{null, 4, null, 7, null, 8, null}); + } +} diff --git a/group01/895457260/code/src/datastructure/test/LinkedListTest.java b/group01/895457260/code/src/datastructure/test/LinkedListTest.java new file mode 100644 index 0000000000..43e080258c --- /dev/null +++ b/group01/895457260/code/src/datastructure/test/LinkedListTest.java @@ -0,0 +1,88 @@ +package datastructure.test; + +import datastructure.exception.EmptyListException; +import datastructure.basic.LinkedList; +import datastructure.basic.List; +import org.junit.Assert; +import org.junit.Test; + +/** + * LinkedList Tester. + * + * @author + * @version 1.0 + * @since
二月 24, 2017
+ */ +public class LinkedListTest extends ArrayListTest { + + @Override + List createList() { + return new LinkedList(); + } + + /** + * Method: addFirst(Object o) + */ + @Test + public void testAddFirst() throws Exception { +//TODO: Test goes here... + LinkedList list = (LinkedList) getList(); + list.addFirst(100); + Assert.assertArrayEquals(toArray(list), new Object[]{100, 1, 2, 3, 4, 5}); + } + + /** + * Method: addLast(Object o) + */ + @Test + public void testAddLast() throws Exception { +//TODO: Test goes here... + LinkedList list = (LinkedList) getList(); + list.addLast(100); + Assert.assertArrayEquals(toArray(list), new Object[]{1, 2, 3, 4, 5, 100}); + } + + /** + * Method: removeFirst() + */ + @Test + public void testRemoveFirst() throws Exception { +//TODO: Test goes here... + LinkedList list = (LinkedList) getList(); + int count = list.size() + 2; + Object[] values = new Object[count]; + boolean[] exceptions = new boolean[count]; + for (int i = 0; i < count; ++i) { + try { + values[i] = list.removeFirst(); + } catch (EmptyListException e) { + exceptions[i] = true; + } + } + Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5, null, null}); + Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true}); + Assert.assertArrayEquals(toArray(list), new Object[0]); + } + + /** + * Method: removeLast() + */ + @Test + public void testRemoveLast() throws Exception { +//TODO: Test goes here... + LinkedList list = (LinkedList) getList(); + int count = list.size() + 2; + Object[] values = new Object[count]; + boolean[] exceptions = new boolean[count]; + for (int i = 0; i < count; ++i) { + try { + values[i] = list.removeLast(); + } catch (EmptyListException e) { + exceptions[i] = true; + } + } + Assert.assertArrayEquals(values, new Object[]{5, 4, 3, 2, 1, null, null}); + Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true}); + Assert.assertArrayEquals(toArray(list), new Object[0]); + } +} diff --git a/group01/895457260/code/src/datastructure/test/QueueTest.java b/group01/895457260/code/src/datastructure/test/QueueTest.java new file mode 100644 index 0000000000..5a47f764a9 --- /dev/null +++ b/group01/895457260/code/src/datastructure/test/QueueTest.java @@ -0,0 +1,108 @@ +package datastructure.test; + +import datastructure.exception.EmptyQueueException; +import datastructure.basic.Queue; +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * Queue Tester. + * + * @author + * @version 1.0 + * @since
二月 24, 2017
+ */ +public class QueueTest { + + @Before + public void before() throws Exception { + } + + @After + public void after() throws Exception { + } + + private Queue getQueue() { + Queue queue = new Queue(5); + for (int i = 1; i <= 5; ++i) { + queue.enQueue(i); + } + return queue; + } + + private void assertQueue(Queue queue, Object[] actual) { + Class clazz = Queue.class; + Object[] array = null; + int head = 0; + int rear = 0; + Method mapIndex = null; + try { + Field arrayField = clazz.getDeclaredField("array"); + Field headField = clazz.getDeclaredField("head"); + Field rearField = clazz.getDeclaredField("rear"); + mapIndex = clazz.getDeclaredMethod("mapIndex", int.class); + arrayField.setAccessible(true); + headField.setAccessible(true); + rearField.setAccessible(true); + mapIndex.setAccessible(true); + array = (Object[]) arrayField.get(queue); + head = (int) headField.get(queue); + rear = (int) rearField.get(queue); + } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) { + e.printStackTrace(); + } + int size = queue.size(); + Object[] excepted = new Object[size]; + int pos = 0; + try { + while (head < rear) { + excepted[pos++] = array[(int) mapIndex.invoke(queue, head)]; + head++; + } + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + Assert.assertArrayEquals(excepted, actual); + } + + /** + * Method: enQueue(Object o) + */ + @Test + public void testEnQueue() throws Exception { +//TODO: Test goes here... + Queue queue = getQueue(); + for (int i = 6; i <= 10; ++i) { + queue.enQueue(i); + } + assertQueue(queue, new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); + } + + /** + * Method: deQueue() + */ + @Test + public void testDeQueue() throws Exception { +//TODO: Test goes here... + Queue queue = getQueue(); + int count = queue.size() + 2; + Object[] values = new Object[count]; + boolean[] exceptions = new boolean[count]; + for (int i = 0; i < count; ++i) { + try { + values[i] = queue.deQueue(); + } catch (EmptyQueueException e) { + exceptions[i] = true; + } + } + Assert.assertArrayEquals(values, new Object[]{1, 2, 3, 4, 5, null, null}); + Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true}); + assertQueue(queue, new Object[0]); + } +} diff --git a/group01/895457260/code/src/datastructure/test/StackTest.java b/group01/895457260/code/src/datastructure/test/StackTest.java new file mode 100644 index 0000000000..24d7db58d8 --- /dev/null +++ b/group01/895457260/code/src/datastructure/test/StackTest.java @@ -0,0 +1,93 @@ +package datastructure.test; + +import datastructure.basic.*; +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import java.lang.reflect.Field; +import java.util.EmptyStackException; + +/** + * Stack Tester. + * + * @author + * @version 1.0 + * @since
二月 24, 2017
+ */ +public class StackTest { + + @Before + public void before() throws Exception { + } + + @After + public void after() throws Exception { + } + + private Stack getStack() { + Stack stack = new Stack(); + for (int i = 1; i <= 5; ++i) { + stack.push(i); + } + return stack; + } + + private void assertStack(Stack stack, Object[] actual) { + Class clazz = Stack.class; + ArrayList elementData = null; + try { + Field field = clazz.getDeclaredField("elementData"); + field.setAccessible(true); + elementData = (ArrayList) field.get(stack); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + + Object[] excepted = null; + if (elementData != null) { + int size = stack.size(); + excepted = new Object[size]; + for (int i = 0; i < size; ++i) { + excepted[i] = elementData.get(i); + } + } + Assert.assertArrayEquals(excepted, actual); + } + + /** + * Method: push(Object o) + */ + @Test + public void testPush() throws Exception { +//TODO: Test goes here... + Stack stack = getStack(); + for (int i = 6; i <= 10; ++i) { + stack.push(i); + } + assertStack(stack, new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); + } + + /** + * Method: pop() + */ + @Test + public void testPop() throws Exception { +//TODO: Test goes here... + Stack stack = getStack(); + int count = stack.size() + 2; + Object[] values = new Object[count]; + boolean[] exceptions = new boolean[count]; + for (int i = 0; i < count; ++i) { + try { + values[i] = stack.pop(); + } catch (EmptyStackException e) { + exceptions[i] = true; + } + } + Assert.assertArrayEquals(values, new Object[]{5, 4, 3, 2, 1, null, null}); + Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true}); + assertStack(stack, new Object[0]); + } +} diff --git a/group01/895457260/code/src/datastructure/test/TestSuite.java b/group01/895457260/code/src/datastructure/test/TestSuite.java new file mode 100644 index 0000000000..d13bff3e5d --- /dev/null +++ b/group01/895457260/code/src/datastructure/test/TestSuite.java @@ -0,0 +1,13 @@ +package datastructure.test; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Created by Haochen on 2017/2/24. + * TODO: + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ArrayListTest.class, LinkedListTest.class, + BinarySortedTreeTest.class, QueueTest.class, StackTest.class}) +public class TestSuite {} diff --git a/group01/895457260/code/src/litestruts/Struts.java b/group01/895457260/code/src/litestruts/Struts.java new file mode 100644 index 0000000000..a84581b93c --- /dev/null +++ b/group01/895457260/code/src/litestruts/Struts.java @@ -0,0 +1,188 @@ +package litestruts; + +import datastructure.basic.ArrayList; +import litestruts.exception.XmlElementNotFoundException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Hashtable; +import java.util.Map; + +public class Struts { + + /* + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + public static View runAction(String actionName, Map parameters) { + //读取xml + Document document; + try { + document = loadXml(); + } catch (ParserConfigurationException | IOException | SAXException e) { + e.printStackTrace(); + return null; + } + + //获取所有action + Element struts = document.getDocumentElement(); + NodeList actionList = struts.getElementsByTagName("action"); + + //根据actionName找到相应action,创建View + try { + Element action = getAction(actionList, actionName); + return createView(action, parameters); + } catch (InvocationTargetException | XmlElementNotFoundException e) { + e.printStackTrace(); + return null; + } + } + + private static Element getAction(NodeList actionList, String name) throws XmlElementNotFoundException { + //根据actionName找到相应action + for (int i = 0; i < actionList.getLength(); ++i) { + Element action = (Element) actionList.item(i); + if (action.getAttribute("name").equals(name)) { + return action; + } + } + throw new XmlElementNotFoundException(elementNotFoundMessage("action", name)); + } + + private static View createView(Element action, Map parameters) + throws InvocationTargetException { + + String className = action.getAttribute("class"); + Class clazz; + Object object; + String executeResult; + try { + clazz = Class.forName(className); + object = clazz.newInstance(); + setParameters(object, parameters); + executeResult = execute(object); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | + InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + return null; + } + + NodeList resultList = action.getElementsByTagName("result"); + String jsp; + Map parameterMap; + try { + jsp = getJsp(resultList, executeResult); + parameterMap = createParameterMap(clazz, object); + } catch (XmlElementNotFoundException | IllegalAccessException e) { + e.printStackTrace(); + return null; + } + + View view = new View(); + view.setJsp(jsp); + view.setParameters(parameterMap); + return view; + } + + private static Map createParameterMap(Class clazz, Object object) + throws InvocationTargetException, IllegalAccessException { + //获取所有getter + Method[] getters = getAllGetters(clazz); + //创建parameter Map + Map parameterMap = new Hashtable<>(); + for (Method getter : getters) { + parameterMap.put(getAttributeName(getter.getName()), (String) getter.invoke(object)); + } + return parameterMap; + } + + private static String getJsp(NodeList resultList, String executeResult) throws XmlElementNotFoundException { + return getResult(resultList, executeResult).getTextContent(); + } + + private static Element getResult(NodeList resultList, String name) throws XmlElementNotFoundException { + for (int j = 0; j < resultList.getLength(); ++j) { + Element result = (Element) resultList.item(j); + if (result.getAttribute("name").equals(name)) { + return result; + } + } + throw new XmlElementNotFoundException(elementNotFoundMessage("result", name)); + } + + private static String elementNotFoundMessage(String elementName, String nameAttribute) { + return "\"" + elementName + "\" XML element not found: " + "attribute \"name\": " + nameAttribute; + } + + private static Method[] getAllGetters(Class clazz) { + Method[] methods = clazz.getDeclaredMethods(); + ArrayList list = new ArrayList(); + for (Method method : methods) { + if (method.getName().startsWith("get")) { + list.add(method); + } + } + + Method[] getters = new Method[list.size()]; + for (int i = 0; i < list.size(); ++i) { + getters[i] = (Method) list.get(i); + } + return getters; + } + + private static Document loadXml() throws ParserConfigurationException, IOException, SAXException { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder; + Document document; + builder = factory.newDocumentBuilder(); + document = builder.parse(new File("src/litestruts/struts.xml")); + return document; + } + + private static String execute(Object object) + throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { + Method execute = object.getClass().getDeclaredMethod("execute"); + return (String) execute.invoke(object); + } + + private static void setParameters(Object object, Map parameters) + throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { + for (Map.Entry entry : parameters.entrySet()) { + Method setter = object.getClass().getDeclaredMethod(getSetterName(entry.getKey()), String.class); + if (setter != null) { + setter.invoke(object, entry.getValue()); + } + } + } + + private static String getSetterName(String attributeName) { + return "set" + Character.toUpperCase(attributeName.charAt(0)) + attributeName.substring(1); + } + + private static String getAttributeName(String getterOrSetterName) { + String sub = getterOrSetterName.substring(3); + return Character.toLowerCase(sub.charAt(0)) + sub.substring(1); + } +} diff --git a/group01/895457260/code/src/litestruts/View.java b/group01/895457260/code/src/litestruts/View.java new file mode 100644 index 0000000000..1eed614744 --- /dev/null +++ b/group01/895457260/code/src/litestruts/View.java @@ -0,0 +1,23 @@ +package litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/895457260/code/src/litestruts/action/LoginAction.java b/group01/895457260/code/src/litestruts/action/LoginAction.java new file mode 100644 index 0000000000..9478c6931b --- /dev/null +++ b/group01/895457260/code/src/litestruts/action/LoginAction.java @@ -0,0 +1,39 @@ +package litestruts.action; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group01/895457260/code/src/litestruts/exception/XmlElementNotFoundException.java b/group01/895457260/code/src/litestruts/exception/XmlElementNotFoundException.java new file mode 100644 index 0000000000..f69309f7d0 --- /dev/null +++ b/group01/895457260/code/src/litestruts/exception/XmlElementNotFoundException.java @@ -0,0 +1,14 @@ +package litestruts.exception; + +/** + * Created by Haochen on 2017/2/27. + * TODO: + */ +public class XmlElementNotFoundException extends RuntimeException { + public XmlElementNotFoundException() { + } + + public XmlElementNotFoundException(String message) { + super(message); + } +} diff --git a/group01/895457260/code/src/litestruts/struts.xml b/group01/895457260/code/src/litestruts/struts.xml new file mode 100644 index 0000000000..aad7e3f7fc --- /dev/null +++ b/group01/895457260/code/src/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/895457260/code/src/litestruts/test/StrutsTest.java b/group01/895457260/code/src/litestruts/test/StrutsTest.java new file mode 100644 index 0000000000..0129a8ad31 --- /dev/null +++ b/group01/895457260/code/src/litestruts/test/StrutsTest.java @@ -0,0 +1,41 @@ +package litestruts.test; + +import litestruts.Struts; +import litestruts.View; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git a/group01/895457260/journal/week1.md b/group01/895457260/journal/week1.md new file mode 100644 index 0000000000..30e96532ab --- /dev/null +++ b/group01/895457260/journal/week1.md @@ -0,0 +1,34 @@ +# 简略描述CPU的工作方式 +  电脑,这个用法丰富而且功能异常强大的机器,也叫做计算机。计算机这个词听起来似乎并不能概括这种机器的功能,但它就是叫计算机。究其原因,无论多么复杂,多么神奇的功能,都能归结为大量的数据计算。加,减,乘,除,与,或,非……这些简单的计算经过组合,实现了令人眼花缭乱的效果。 +  那么计算机如何计算?这是第一个问题。 +  众所周知,计算机内部使用二进制,也就是0和1。而利用继电器(或晶体管)可以做成能处理二进制数的逻辑门(与/或/非门),用逻辑门可以组成加法器等各种器件(当然这些也是针对二进制的)。这些器件接受外部的二进制输入,再经过一系列变换,得到二进制的结果,最后传出外部。大学的“数字逻辑”这门课里已经花了大篇幅进行说明。 +## 如何进行计算:ALU +  首先要有一个东西,能从外部接受2个数据,然后把它们加减乘除与或非,再传出一个结果,而且还能随意控制到底做加法还是减法,还是别的。这个东西叫“ALU”,就是Arithmetic Logic Unit,算术逻辑单元。它实际上除了能接受2个数据进行计算以外,还能接受一堆别的数据(信号),用来控制做哪种计算,这些额外的输入就叫做“控制信号”。 +``` +    ALU +    输入:进行计算的数据2个 + 控制信号若干 +    输出:计算结果 +``` +  有了ALU,就可以做各种各样的计算。 +## 数据的来源和去处:内存 +  有一些数据来自你的内存条。内存实际上是存储器,可以保存二进制数,用于给ALU计算。这块存储器分为很多小格子,每个格子都有唯一编号称为“地址”,格子里能放一个数据。 +  存储器能接受至少3个输入:1地址、2数据、3读写控制端。有至少1个输出:1读出的数据。 +  举个例子:输入1表示了一个小格子,如果输入3为0表示读,那么就会输出这个格子里的数据,输入2会被忽略。如果输入3为1表示写,那么就会用输入2的数据覆盖掉格子里原有的数据,输出会被忽略。 +## ALU和内存交互:组成CPU +  要有某块逻辑电路把地址、数据、读写控制送给内存,然后获得内存里的数据传给ALU计算,再把结果送回内存。但ALU只能计算,这块逻辑电路不属于ALU,于是我们可以把ALU和这块逻辑电路放在一起,叫做CPU,Central Processing Unit,中央处理器。 +## 控制信号:指令译码 +  控制信号有很多个(每个控制信号都是1位二进制),如果把需要的控制信号一个一个并排放到内存里,那么势必导致内存空间的浪费(因为内存里一个格子能存放很多位二进制数),为此,我们另拿一块逻辑电路,让它接受一个内存格子的二进制输入,产生若干输出(就是那些控制信号)。这个逻辑电路就叫做“指令译码器”,把它放进CPU里。应该放进指令译码器的数据,称为“指令”。 +  于是整个计算过程就变成了: +``` +    1、从内存取出一个格子(是指令),放进指令译码器,得到若干组控制信号。 +    2、再从内存取出2个格子(是数据),传给ALU进行计算。 +    3、计算结果写回内存。 +``` +    (这个过程假设所有数据都来自内存,实际上并非这样) +## 区分指令和数据 +  这时又有新的问题产生了:1和2中同样是从内存取出格子,如何判断它是指令还是数据?CPU里还有一个东西叫“PC”,Program Counter,程序计数器。它能保存1个数,表示内存地址。从内存取指令,会把PC的地址送到内存,这时会控制内存的输出转向指令译码器。从内存取计算所用的数据,这个操作不使用PC的地址,那时内存的输出就不会指向指令译码器,而是直接传给ALU。 +## 更大的存储空间:硬盘 +  计算机通过某种方式不断重复上面的计算过程,只要内存里有正确排列的指令和数据,计算机就能自动工作,但是内存的容量比较小,不能存放过量的数据,于是就用到了硬盘。 +  硬盘的容量大,可以先把指令和数据放到硬盘里,需要时再由内存来取,读写硬盘和读写内存相似。 +  双击硬盘里的一个exe,exe中的指令和数据就会自动进入内存,然后由CPU做运算,结果还可以写回硬盘。 +(这篇文章忽略了寄存器、缓存、总线等构造,假设所有数据都必须来自内存) diff --git a/group01/932573198/20170220/.classpath b/group01/932573198/20170220/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group01/932573198/20170220/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group01/932573198/20170220/.gitignore b/group01/932573198/20170220/.gitignore new file mode 100644 index 0000000000..65776c32fc --- /dev/null +++ b/group01/932573198/20170220/.gitignore @@ -0,0 +1 @@ +/bin/ \ No newline at end of file diff --git a/group01/932573198/20170220/.project b/group01/932573198/20170220/.project new file mode 100644 index 0000000000..6c3be35f26 --- /dev/null +++ b/group01/932573198/20170220/.project @@ -0,0 +1,17 @@ + + + 20170220 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group01/932573198/20170220/.settings/org.eclipse.jdt.core.prefs b/group01/932573198/20170220/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group01/932573198/20170220/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group01/932573198/20170220/src/com/coding/basic/ArrayList.java b/group01/932573198/20170220/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..9980a4928a --- /dev/null +++ b/group01/932573198/20170220/src/com/coding/basic/ArrayList.java @@ -0,0 +1,92 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + /** + * 扩容 + */ + private void expansion() { + if (elementData.length <= size) + elementData = Arrays.copyOf(elementData, elementData.length * 3 / 2 + 1); + } + + /** + * 越界 + */ + private void outOfBoundsForAdd(int index) { + if (index > size || index < 0) + throw new IndexOutOfBoundsException("数组下标越界"); + } + + private void outOfBoundsForOther(int index) { + if (index >= size || index < 0) + throw new IndexOutOfBoundsException("数组下标越界"); + } + + public void add(Object o) { + expansion(); + elementData[size++] = o; + } + + public void add(int index, Object o) { + outOfBoundsForAdd(index); + expansion(); + for (int i = size - 1; i >= index; i--) { + elementData[i + 1] = elementData[i]; + } + elementData[index] = o; + size++; + } + + public Object get(int index) { + outOfBoundsForOther(index); + return elementData[index]; + } + + public Object remove(int index) { + outOfBoundsForOther(index); + Object re = elementData[index]; + for (int i = index; i < size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + elementData[size - 1] = null; + size--; + return re; + } + + public int size() { + return size; + } + + @Override + public String toString() { + return Arrays.toString(elementData); + } + + public Iterator iterator() { + return new ArrayIterator(); + } + + private class ArrayIterator implements Iterator { + + int pos = -1; + + @Override + public boolean hasNext() { + return size > ++pos ? true : false; + } + + @Override + public Object next() { + return elementData[pos]; + } + + } + +} diff --git a/group01/932573198/20170220/src/com/coding/basic/BinaryTree.java b/group01/932573198/20170220/src/com/coding/basic/BinaryTree.java new file mode 100644 index 0000000000..cda829de6a --- /dev/null +++ b/group01/932573198/20170220/src/com/coding/basic/BinaryTree.java @@ -0,0 +1,77 @@ +package com.coding.basic; + +public class BinaryTree { + + private BinaryTreeNode tNode; + + @Override + public String toString() { + return tNode + ""; + } + + public void insert(Object o) { + tNode = insert(o, tNode); + } + + public BinaryTreeNode insert(Object o, BinaryTreeNode node) { + if (node == null) { + node = new BinaryTreeNode(o); + } else { + int result = o.toString().compareTo(node.getData().toString()); + if (result < 0) + node.setLeft(insert(o, node.getLeft())); + if (result > 0) + node.setRight(insert(o, node.getRight())); + } + return node; + } + + private static class BinaryTreeNode { + + private BinaryTreeNode left; + + private Object data; + + private BinaryTreeNode right; + + public BinaryTreeNode() { + } + + public BinaryTreeNode(Object data) { + this.left = null; + this.data = data; + this.right = null; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + @Override + public String toString() { + return "[" + left + ", " + data + ", " + right + "]"; + } + + } + +} diff --git a/group01/932573198/20170220/src/com/coding/basic/Iterator.java b/group01/932573198/20170220/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e7cbd474ec --- /dev/null +++ b/group01/932573198/20170220/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group01/932573198/20170220/src/com/coding/basic/LinkedList.java b/group01/932573198/20170220/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..524a19929b --- /dev/null +++ b/group01/932573198/20170220/src/com/coding/basic/LinkedList.java @@ -0,0 +1,144 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private int size = 0; + + private Node head; + + + public Node getHead() { + return head; + } + + public LinkedList() { + this.head = new Node(); + } + + @Override + public String toString() { + return "[" + head + "]"; + } + + private void outOfBoundsForAdd(int index) { + if (index > size || index < 0) + throw new IndexOutOfBoundsException("数组下标越界"); + } + + private void outOfBoundsForOther(int index) { + if (index >= size || index < 0) + throw new IndexOutOfBoundsException("数组下标越界"); + } + + public void add(Object o) { + Node node = head; + while (node.next != null) { + node = node.next; + } + node.next = new Node(o); + size++; + } + + public void add(int index, Object o) { + outOfBoundsForAdd(index); + if(size == index) + add(o); + else{ + Node prevNode = head; + for (int i = 0; i < index; i++) { + prevNode = prevNode.next; + } + Node nextNode = prevNode.next; + Node node = new Node(o); + prevNode.next = node; + node.next = nextNode; + size++; + } + } + + public Object get(int index) { + outOfBoundsForOther(index); + Node node = head; + for (int i = 0; i <= index; i++) { + node = node.next; + } + return node.data; + } + + public Object remove(int index) { + outOfBoundsForOther(index); + Node prevNode = head; + for (int i = 0; i < index; i++) { + prevNode = prevNode.next; + } + Node node = prevNode.next; + prevNode.next = node.next; + size--; + return node.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newNode = new Node(o); + Node node = head.next; + head.next = newNode; + newNode.next = node; + size++; + } + + public void addLast(Object o) { + Node node = head; + while (node.next != null) { + node = node.next; + } + node.next = new Node(o); + size++; + } + + private void noSuchEle() { + if (head.next == null) + throw new NoSuchElementException("没有这个元素"); + } + + public Object removeFirst() { + noSuchEle(); + Node node = head.next; + head.next = node.next; + size--; + return node.data; + } + + public Object removeLast() { + noSuchEle(); + Node node = head; + for(int i=0;i + + + + + + + diff --git a/group01/932573198/20170227/.gitignore b/group01/932573198/20170227/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group01/932573198/20170227/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group01/932573198/20170227/.project b/group01/932573198/20170227/.project new file mode 100644 index 0000000000..9e91abf6c9 --- /dev/null +++ b/group01/932573198/20170227/.project @@ -0,0 +1,17 @@ + + + 20170227 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group01/932573198/20170227/.settings/org.eclipse.jdt.core.prefs b/group01/932573198/20170227/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group01/932573198/20170227/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group01/932573198/20170227/src/com/coderising/array/ArrayUtil.java b/group01/932573198/20170227/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..3a2f03b72f --- /dev/null +++ b/group01/932573198/20170227/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,225 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int l = origin.length, n; + for (int i = 0; i < l / 2; i++) { + n = origin[i]; + origin[i] = origin[l - 1 - i]; + origin[l - 1 - i] = n; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int n = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) + n++; + } + int[] newArray = new int[oldArray.length - n]; + for (int i = 0, j = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[j] = oldArray[i]; + j++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int n = 0; // 重复的整数个数 + for (int i = 0, j = 0; i < array1.length && j < array2.length;) { + int z = array1[i] - array2[j]; + if (z < 0) + i++; + else if (z > 0) + j++; + else { + i++; + j++; + n++; + } + } + int[] newArray = new int[array1.length + array2.length - n]; + + for (int i = 0, j = 0, k = 0; i < array1.length && j < array2.length;) { + int z = array1[i] - array2[j]; + if (z < 0) { + newArray[k] = array1[i]; + k++; + i++; + } else if (z > 0) { + newArray[k] = array2[j]; + k++; + j++; + } else { + newArray[k] = array1[i]; + k++; + i++; + j++; + } + // 判断循环是否即将结束,若结束则将另外一个数组未比较的元素放入新数组 + if (i >= array1.length) { + for (int a = j; a < array2.length; a++, k++) { + newArray[k] = array2[a]; + } + } + if (j >= array2.length) { + for (int a = i; a < array1.length; a++, k++) { + newArray[k] = array1[a]; + } + } + } + return newArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + int n = 0; + for (int i = 1, j = 1, k; i < max; n++) { + k = i + j; + i = j; + j = k; + } + int[] newArray = new int[n]; + if (n > 1) { + newArray[0] = 1; + newArray[1] = 1; + } + for (int i = 2; i < n; i++) { + newArray[i] = newArray[i - 1] + newArray[i - 2]; + } + return newArray; + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int n = 0; + for (int i = 2; i < max; i++) { + if (primeNumber(i)) + n++; + } + + int[] newArray = new int[n]; + for (int i = 2, j = 0; i < max; i++) { + if (primeNumber(i)) { + newArray[j++] = i; + } + } + return newArray; + } + + // 判断是否为素数 + public boolean primeNumber(int number) { + for (int i = 2; i < number; i++) { + if (number % i == 0) + return false; + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int n = 0; + for (int i = 6; i < max; i++) { + if (perfectNumber(i)) + n++; + } + + int[] newArray = new int[n]; + for (int i = 6, j = 0; i < max; i++) { + if (perfectNumber(i)) { + newArray[j++] = i; + } + } + return newArray; + } + + // 判断是否为完数 + public boolean perfectNumber(int number) { + int n = 0; + for (int i = 1; i <= number / 2; i++) { + if (number % i == 0) + n += i; + } + if (number != n) + return false; + return true; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + StringBuffer s = new StringBuffer(); + for (int i = 0; i < array.length; i++) { + s.append(String.valueOf(array[i])); + s.append("-"); + } + String str = s.substring(0, s.length() - 1); + return str; + } + +} diff --git a/group01/932573198/20170227/src/com/coderising/array/ArrayUtilTest.java b/group01/932573198/20170227/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..dba357bd82 --- /dev/null +++ b/group01/932573198/20170227/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,83 @@ +package com.coderising.array; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + + ArrayUtil util = null; + + @Before + public void setUp() throws Exception { + util = new ArrayUtil(); + } + + @Test + public void testReverseArray() { + int[] a = {1,2,3,4}; + int[] b = {4,3,2,1}; + util.reverseArray(a); + Assert.assertArrayEquals(b, a); + int[] c = {1,2,3,4,5}; + int[] d = {5,4,3,2,1}; + util.reverseArray(c); + Assert.assertArrayEquals(d, c); + } + + @Test + public void testRemoveZero() { + int[] oldArr = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] newArray = {1,3,4,5,6,6,5,4,7,6,7,5}; + int[] newArr = util.removeZero(oldArr); + Assert.assertArrayEquals(newArray, newArr); + } + + @Test + public void testMerge() { + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + int[] newArray = {3,4,5,6,7,8}; + int[] newArr = util.merge(a1, a2); + Assert.assertArrayEquals(newArray, newArr); + } + + @Test + public void testGrow() { + int[] oldArray = {2,3,6}; + int size = 3; + int[] newArray = {2,3,6,0,0,0}; + int[] newArr = util.grow(oldArray, size); + Assert.assertArrayEquals(newArray, newArr); + } + + @Test + public void testFibonacci() { + int[] arr1 = {1,1,2,3,5,8,13}; + Assert.assertArrayEquals(arr1, util.fibonacci(15)); + int[] arr2 = new int[0]; + Assert.assertArrayEquals(arr2, util.fibonacci(1)); + } + + @Test + public void testGetPrimes() { + int[] arr1 = {2,3,5,7,11,13,17,19}; + Assert.assertArrayEquals(arr1, util.getPrimes(23)); + int[] arr2 = new int[0]; + Assert.assertArrayEquals(arr2, util.getPrimes(2)); + } + + @Test + public void testGetPerfectNumbers() { + int[] arr = {6, 28, 496}; + Assert.assertArrayEquals(arr, util.getPerfectNumbers(497)); + } + + @Test + public void testJoin() { + int[] arr = {1,2,3,4,5}; + String s = "1-2-3-4-5"; + Assert.assertEquals(s, util.join(arr, "-")); + } + +} diff --git a/group01/932573198/20170227/src/com/coderising/litestruts/LoginAction.java b/group01/932573198/20170227/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..6451f9faae --- /dev/null +++ b/group01/932573198/20170227/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,48 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } + + @Override + public String toString() { + return "LoginAction [name=" + name + ", password=" + password + ", message=" + message + "]"; + } + +} diff --git a/group01/932573198/20170227/src/com/coderising/litestruts/Struts.java b/group01/932573198/20170227/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..95c55b5cac --- /dev/null +++ b/group01/932573198/20170227/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,175 @@ +package com.coderising.litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + * + */ + + View view = new View(); + /* + * 0、读取xml文件 + */ + String path = "src/com/coderising/litestruts/struts.xml"; + Document document = null; + try { + document = new SAXReader().read(path); + } catch (DocumentException e) { + e.printStackTrace(); + } + + /* + * 1、 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + */ + // 获取根节点 + Element root = document.getRootElement(); + // 遍历根节点下面的节点 + Iterator actionIt = root.elementIterator("action"); + while (actionIt.hasNext()) { + Element action = (Element) actionIt.next(); + if (action.attribute("name").getValue().equals(actionName)) { + String className = action.attribute("class").getValue(); + Class clazz = null; + try { + // 通过actionName找到className,并得到类 + clazz = Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + Object clazzObject = null; + try { + // 创建类的一个对象 + clazzObject = clazz.newInstance(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + // 遍历放参数的map + Set keySet = parameters.keySet(); + for (String key : keySet) { + // 拼接set方法的name + String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1, key.length()); + // 得到set方法对象 + Method setMethod = null; + try { + setMethod = clazz.getMethod(methodName, String.class); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } + try { + // 调用set方法,参数为parameters中对应的value + setMethod.invoke(clazzObject, parameters.get(key)); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + /* + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + */ + + Method executeMethod = null; + try { + // 得到exectue方法 + executeMethod = clazz.getMethod("execute"); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } + String string = null; + try { + // 调用exectue方法 + string = (String) executeMethod.invoke(clazzObject); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + /* + * 3、通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, + * 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + * 放到View对象的parameters + */ + + Map map = new HashMap<>(); + Method[] methods = clazz.getMethods(); + for (Method method : methods) { + if (method.getName().substring(0, 3).equals("get") && !method.getName().equals("getClass")) { + Object str = null; + try { + // 调用get方法 + str = method.invoke(clazzObject); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + map.put(method.getName().substring(3).toLowerCase(), str); + } + } + view.setParameters(map); + + /* + * 4、根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + */ + @SuppressWarnings("unchecked") + List elements = action.elements(); + for (Element element : elements) { + if (element.attribute("name").getValue().equals(string)) { + String jspName = element.getText(); + view.setJsp(jspName); + } + } + } + } + return view; + } + +} diff --git a/group01/932573198/20170227/src/com/coderising/litestruts/StrutsTest.java b/group01/932573198/20170227/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..f2426db6ea --- /dev/null +++ b/group01/932573198/20170227/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,38 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); // 密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group01/932573198/20170227/src/com/coderising/litestruts/View.java b/group01/932573198/20170227/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..88573df731 --- /dev/null +++ b/group01/932573198/20170227/src/com/coderising/litestruts/View.java @@ -0,0 +1,29 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } + + @Override + public String toString() { + return "View [jsp=" + jsp + ", parameters=" + parameters + "]"; + } + +} diff --git a/group01/932573198/20170227/src/com/coderising/litestruts/struts.xml b/group01/932573198/20170227/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..ff7623e6e1 --- /dev/null +++ b/group01/932573198/20170227/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/954958168/954958168.md b/group01/954958168/954958168.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group01/954958168/class01/BasicDataStructure/.gitignore b/group01/954958168/class01/BasicDataStructure/.gitignore new file mode 100644 index 0000000000..eb95f3ba7f --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/.gitignore @@ -0,0 +1,28 @@ +# Created by .ignore support plugin (hsz.mobi) +### Java template +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# Idea Files # +.idea +*.iml + diff --git a/group01/954958168/class01/BasicDataStructure/pom.xml b/group01/954958168/class01/BasicDataStructure/pom.xml new file mode 100644 index 0000000000..a224b2116f --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + com.aaront.execrise + coding2017 + 1.0.0-SNAPSHOT + jar + + + + UTF-8 + 1.8 + + + + + junit + junit + 4.12 + + + \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/ArrayList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/ArrayList.java new file mode 100644 index 0000000000..8d2d92f173 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/ArrayList.java @@ -0,0 +1,90 @@ +package com.aaront.exercise.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private static final double factor = 0.75; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + _ensureCapacityEnough(); + elementData[size++] = o; + } + + public void add(int index, Object o) { + if (index < 0 || index > size) throw new IndexOutOfBoundsException("index超出边界"); + _ensureCapacityEnough(); + int i = size; + for (; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + elementData[i] = o; + size++; + } + + private void _ensureCapacityEnough() { + if (size >= elementData.length) { + dilatancy(); + } + } + + private void dilatancy() { + int newLength = elementData.length + (int) (elementData.length * factor); + elementData = Arrays.copyOf(elementData, newLength); + } + + public Object get(int index) { + if(index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界"); + return elementData[index]; + } + + public Object remove(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界"); + Object element = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - 1 - index); + size--; + return element; + + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new ArrayListIterator(this); + } + + public Object[] toArray() { + Object[] objects = new Object[size]; + System.arraycopy(elementData, 0, objects, 0, size); + return objects; + } + + private static class ArrayListIterator implements Iterator { + + private ArrayList arrayList; + private int pos = 0; + + private ArrayListIterator(ArrayList arrayList) { + this.arrayList = arrayList; + } + + public boolean hasNext() { + return pos < arrayList.size(); + } + + public Object next() { + return arrayList.elementData[pos++]; + } + + public void remove() { + arrayList.remove(pos - 1); + pos--; + } + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/BinaryTree.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/BinaryTree.java new file mode 100644 index 0000000000..0738169a1e --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/BinaryTree.java @@ -0,0 +1,235 @@ +package com.aaront.exercise.basic; + +public class BinaryTree { + + private BinaryTreeNode head = new BinaryTreeNode(null); + private BinaryTreeNode root; + private int size; + private int index = 0; + + public static final int PREORDER = 0; + public static final int INORDER = 1; + public static final int POSTORDER = 2; + public static final int HIERARCHICAL = 3; + + public static final int RECURSION = 10; + public static final int ITERATION = 11; + + public void add(Integer o) { + BinaryTreeNode node = new BinaryTreeNode(o); + if (root == null) { + root = node; + head.setLeft(root); + } else { + insert(root, node); + } + size++; + } + + private void insert(BinaryTreeNode node, BinaryTreeNode newNode) { + // 要插入的节点插入当前节点的左子树 + if (node.getData() > newNode.getData()) { + if (node.getLeft() == null) { + node.setLeft(newNode); + } else { + insert(node.left, newNode); + } + } else { // 要插入的节点插入当前节点的右子树 + if (node.getRight() == null) { + node.setRight(newNode); + } else { + insert(node.right, newNode); + } + } + } + + public BinaryTreeNode search(int data) { + return search(data, ITERATION); + } + + public BinaryTreeNode search(int data, int method) { + switch (method) { + case RECURSION: + return findNodeRecursion(root, data); + case ITERATION: + return findNodeIteration(data); + default: + throw new IllegalArgumentException("不支持的查找方法"); + } + } + + private BinaryTreeNode findNodeRecursion(BinaryTreeNode node, int data) { + if (node == null) return null; + if (node.getData() == data) return node; + if (node.getData() > data) return findNodeRecursion(node.getLeft(), data); + return findNodeRecursion(node.getRight(), data); + } + + private BinaryTreeNode findNodeIteration(int data) { + BinaryTreeNode currentNode = root; + while (currentNode != null) { + if (currentNode.getData() == data) { + return currentNode; + } + if (currentNode.getData() > data) { + currentNode = currentNode.getLeft(); + } else { + currentNode = currentNode.getRight(); + } + } + return null; + } + + public BinaryTreeNode min() { + return findMin(root); + } + + private BinaryTreeNode findMin(BinaryTreeNode node) { + if (node == null) return null; + if (node.getLeft() == null) return node; + return findMin(node.getLeft()); + } + + public BinaryTreeNode max() { + return findMax(root); + } + + private BinaryTreeNode findMax(BinaryTreeNode node) { + if (node == null) return null; + if (node.getRight() == null) return node; + return findMax(node.getRight()); + } + + public void delete(Integer data) { + BinaryTreeNode node = search(data); + if (node == null) return; + BinaryTreeNode parentNode = searchParentNode(node); + if (parentNode == null) return; + // 删除叶子节点 + if (node.getLeft() == null && node.getRight() == null) { + if (parentNode.getLeft() == node) parentNode.setLeft(null); + else parentNode.setRight(null); + } else if (node.getLeft() != null && node.getRight() == null) { // 删除只有左子树的节点 + if (parentNode.getLeft() == node) parentNode.setLeft(node.getLeft()); + else parentNode.setRight(node.getLeft()); + } else if (node.getRight() != null && node.getLeft() == null) { // 删除只有右子树的节点 + if (parentNode.getLeft() == node) parentNode.setLeft(node.getRight()); + else parentNode.setRight(node.getRight()); + } else { // 删除有两个子树的节点 + BinaryTreeNode replace = findMin(node.getRight()); + BinaryTreeNode replaceParentNode = searchParentNode(replace); + replaceParentNode.setLeft(replace.getRight()); + node.setData(replace.getData()); + replace.setLeft(null); + replace.setRight(null); + } + size--; + } + + private BinaryTreeNode searchParentNode(BinaryTreeNode node) { + if (node == null) return null; + if (node == root) return head; + BinaryTreeNode current = root; + while (current != null) { + if (current.getLeft() == node || current.getRight() == node) return current; + if (current.getData().compareTo(node.getData()) > 0) current = current.getLeft(); + else current = current.getRight(); + } + return null; + } + + public int[] traversal() { + return traversal(PREORDER); + } + + public int[] traversal(int order) { + int[] datas = new int[size]; + if (order == PREORDER) { + preorderTraversal(root, datas); + } else if (order == INORDER) { + inorderTraversal(root, datas); + } else if (order == POSTORDER) { + postorderTraversal(root, datas); + } else { + hierarchicalTraversal(root, datas); + } + index = 0; + return datas; + } + + private void preorderTraversal(BinaryTreeNode node, int[] datas) { + if (node == null) { + return; + } + + datas[index++] = node.getData(); + preorderTraversal(node.getLeft(), datas); + preorderTraversal(node.getRight(), datas); + } + + private void inorderTraversal(BinaryTreeNode node, int[] datas) { + if (node == null) { + return; + } + + inorderTraversal(node.getLeft(), datas); + datas[index++] = node.getData(); + inorderTraversal(node.getRight(), datas); + } + + private void postorderTraversal(BinaryTreeNode node, int[] datas) { + if (node == null) { + return; + } + + postorderTraversal(node.getLeft(), datas); + postorderTraversal(node.getRight(), datas); + datas[index++] = node.getData(); + } + + private void hierarchicalTraversal(BinaryTreeNode node, int[] datas) { + if (node == null) return; + Queue queue = new Queue(); + queue.enQueue(node); + while (!queue.isEmpty()) { + BinaryTreeNode tmp = (BinaryTreeNode) queue.deQueue(); + datas[index++] = tmp.getData(); + if (tmp.getLeft() != null) queue.enQueue(tmp.getLeft()); + if (tmp.getRight() != null) queue.enQueue(tmp.getRight()); + } + } + + public class BinaryTreeNode { + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Integer data) { + this.data = data; + } + + public Integer getData() { + return data; + } + + public void setData(Integer data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Iterator.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Iterator.java new file mode 100644 index 0000000000..3b4f646d12 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Iterator.java @@ -0,0 +1,9 @@ +package com.aaront.exercise.basic; + +public interface Iterator { + boolean hasNext(); + + Object next(); + + void remove(); +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/LinkedList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/LinkedList.java new file mode 100644 index 0000000000..5f35379815 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/LinkedList.java @@ -0,0 +1,129 @@ +package com.aaront.exercise.basic; + +public class LinkedList implements List { + + private Node head = new Node(null); + private int size = 0; + + public void add(Object o) { + Node newNode = new Node(o); + Node first = head.next; + Node second = head; + while (first != null) { + second = first; + first = first.next; + } + second.next = newNode; + size++; + } + + public void add(int index, Object o) { + if (index < 0 || index > size) throw new IndexOutOfBoundsException("索引超出范围"); + Node first = head; + int i = 0; + while (i < index) { + first = first.next; + i++; + } + Node node = new Node(o); + node.next = first.next; + first.next = node; + size++; + } + + public Object get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException("索引超出范围"); + Node first = head.next; + int i = 0; + while (i < index) { + first = first.next; + i++; + } + return first.data; + } + + public Object remove(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException("索引超出范围"); + Node first = head; + int i = 0; + while (i < index) { + first = first.next; + i++; + } + Node element = first.next; + first.next = first.next.next; + size--; + return element.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + add(0, o); + } + + public void addLast(Object o) { + add(size, o); + } + + public Object removeFirst() { + return remove(0); + } + + public Object removeLast() { + return remove(size - 1); + } + + public Iterator iterator() { + return new LinkedListIterator(this); + } + + public Object[] toArray() { + Object[] objects = new Object[size]; + Node first = head.next; + int pos = 0; + while (first!= null) { + objects[pos++] = first.data; + first = first.next; + } + return objects; + } + + private static class LinkedListIterator implements Iterator { + + private int pos = 0; + private LinkedList linkedList; + + private LinkedListIterator(LinkedList linkList) { + this.linkedList = linkList; + } + + @Override + public boolean hasNext() { + return pos < linkedList.size(); + } + + @Override + public Object next() { + return linkedList.get(pos++); + } + + @Override + public void remove() { + linkedList.remove(pos - 1); + pos--; + } + } + + + private static class Node { + private Object data; + private Node next; + + private Node(Object data) { + this.data = data; + } + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/List.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/List.java new file mode 100644 index 0000000000..50cd2e6281 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/List.java @@ -0,0 +1,9 @@ +package com.aaront.exercise.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Queue.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Queue.java new file mode 100644 index 0000000000..72c713f68c --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Queue.java @@ -0,0 +1,26 @@ +package com.aaront.exercise.basic; + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o) { + linkedList.add(o); + } + + public Object deQueue() { + return linkedList.removeFirst(); + } + + public boolean isEmpty() { + return linkedList.size() == 0; + } + + public int size() { + return linkedList.size(); + } + + public Object[] toArray() { + return linkedList.toArray(); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Stack.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Stack.java new file mode 100644 index 0000000000..59a12f6cc7 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Stack.java @@ -0,0 +1,29 @@ +package com.aaront.exercise.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + return elementData.remove(elementData.size() - 1); + } + + public Object peek() { + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } + + public Object[] toArray() { + return elementData.toArray(); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericArrayList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericArrayList.java new file mode 100644 index 0000000000..9946adacee --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericArrayList.java @@ -0,0 +1,98 @@ +package com.aaront.exercise.generic; + +import java.util.Arrays; + +public class GenericArrayList implements GenericList { + + private int size = 0; + + private static final double factor = 0.75; + + private Object[] elementData = new Object[100]; + + public void add(T o) { + _ensureCapacityEnough(); + elementData[size++] = o; + } + + public void add(int index, T o) { + if (index < 0 || index > size) throw new IndexOutOfBoundsException("index超出边界"); + _ensureCapacityEnough(); + int i = size; + for (; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + elementData[i] = o; + size++; + } + + private void _ensureCapacityEnough() { + if (size >= elementData.length) { + dilatancy(); + } + } + + private void dilatancy() { + int newLength = elementData.length + (int) (elementData.length * factor); + elementData = Arrays.copyOf(elementData, newLength); + } + + public T get(int index) { + if(index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界"); + return (T) elementData[index]; + } + + public T remove(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界"); + Object element = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - 1 - index); + size--; + return (T) element; + + } + + public int size() { + return size; + } + + public GenericIterator iterator() { + return new ArrayListGenericIterator(this); + } + + public Object[] toArray() { + Object[] objects = new Object[size]; + System.arraycopy(elementData, 0, objects, 0, size); + return objects; + } + + public T[] toArray(T[] a) { + if (a.length < size) + // Make a new array of a's runtime type, but my contents: + return (T[]) Arrays.copyOf(elementData, size, a.getClass()); + System.arraycopy(elementData, 0, a, 0, size); + return a; + } + + private static class ArrayListGenericIterator implements GenericIterator { + + private GenericArrayList genericArrayList; + private int pos = 0; + + private ArrayListGenericIterator(GenericArrayList genericArrayList) { + this.genericArrayList = genericArrayList; + } + + public boolean hasNext() { + return pos < genericArrayList.size(); + } + + public T next() { + return (T) genericArrayList.elementData[pos++]; + } + + public void remove() { + genericArrayList.remove(pos - 1); + pos--; + } + } +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java new file mode 100644 index 0000000000..c47056a95d --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java @@ -0,0 +1,255 @@ +package com.aaront.exercise.generic; + +import java.util.Arrays; + +public class GenericBinaryTree> { + + private BinaryTreeNode head = new BinaryTreeNode<>(null); + private BinaryTreeNode root; + private int size; + private int index = 0; + public static final int PREORDER = 0; + public static final int INORDER = 1; + public static final int POSTORDER = 2; + public static final int HIERARCHICAL = 3; + + public static final int RECURSION = 10; + public static final int ITERATION = 11; + + public void add(T o) { + BinaryTreeNode node = new BinaryTreeNode<>(o); + if (root == null) { + root = node; + head.setLeft(root); + } else { + insert(root, node); + } + size++; + } + + private void insert(BinaryTreeNode node, BinaryTreeNode newNode) { + // 要插入的节点插入当前节点的左子树 + if (node.getData().compareTo(newNode.getData()) > 0) { + if (node.getLeft() == null) { + node.setLeft(newNode); + } else { + insert(node.left, newNode); + } + } else { // 要插入的节点插入当前节点的右子树 + if (node.getRight() == null) { + node.setRight(newNode); + } else { + insert(node.right, newNode); + } + } + } + + public BinaryTreeNode search(T data) { + return search(data, ITERATION); + } + + public BinaryTreeNode search(T data, int method) { + switch (method) { + case RECURSION: + return findNodeRecursion(root, data); + case ITERATION: + return findNodeIteration(data); + default: + throw new IllegalArgumentException("不支持的查找方法"); + } + } + + private BinaryTreeNode findNodeRecursion(BinaryTreeNode node, T data) { + if (node == null) return null; + if (node.getData().compareTo(data) == 0) return node; + if (node.getData().compareTo(data) > 0) return findNodeRecursion(node.getLeft(), data); + return findNodeRecursion(node.getRight(), data); + } + + private BinaryTreeNode findNodeIteration(T data) { + BinaryTreeNode currentNode = root; + while (currentNode != null) { + if (currentNode.getData().compareTo(data) == 0) { + return currentNode; + } + if (currentNode.getData().compareTo(data) > 0) { + currentNode = currentNode.getLeft(); + } else { + currentNode = currentNode.getRight(); + } + } + return null; + } + + public BinaryTreeNode min() { + return findMin(root); + } + + private BinaryTreeNode findMin(BinaryTreeNode node) { + if (node == null) return null; + if (node.getLeft() == null) return node; + return findMin(node.getLeft()); + } + + public BinaryTreeNode max() { + return findMax(root); + } + + private BinaryTreeNode findMax(BinaryTreeNode node) { + if (node == null) return null; + if (node.getRight() == null) return node; + return findMax(node.getRight()); + } + + public void delete(T data) { + BinaryTreeNode node = search(data); + if (node == null) return; + BinaryTreeNode parentNode = searchParentNode(node); + if (parentNode == null) return; + // 删除叶子节点 + if (node.getLeft() == null && node.getRight() == null) { + if (parentNode.getLeft() == node) parentNode.setLeft(null); + else parentNode.setRight(null); + } else if (node.getLeft() != null && node.getRight() == null) { // 删除只有左子树的节点 + if (parentNode.getLeft() == node) parentNode.setLeft(node.getLeft()); + else parentNode.setRight(node.getLeft()); + } else if (node.getRight() != null && node.getLeft() == null) { // 删除只有右子树的节点 + if (parentNode.getLeft() == node) parentNode.setLeft(node.getRight()); + else parentNode.setRight(node.getRight()); + } else { // 删除有两个子树的节点 + BinaryTreeNode replace = findMin(node.getRight()); + BinaryTreeNode replaceParentNode = searchParentNode(replace); + replaceParentNode.setLeft(replace.getRight()); + node.setData(replace.getData()); + replace.setLeft(null); + replace.setRight(null); + } + size--; + } + + private BinaryTreeNode searchParentNode(BinaryTreeNode node) { + if (node == null) return null; + if (node == root) return head; + BinaryTreeNode current = root; + while (current != null) { + if (current.getLeft() == node || current.getRight() == node) return current; + if (current.getData().compareTo(node.getData()) > 0) current = current.getLeft(); + else current = current.getRight(); + } + return null; + } + + public Object[] traversal() { + return traversal(PREORDER); + } + + public T[] traversal(T[] a) { + Object[] elementData = traversal(PREORDER); + return toArray(elementData, a); + } + + public T[] traversal(int order, T[] a) { + Object[] elementData = traversal(order); + return toArray(elementData, a); + } + + private T[] toArray(Object[] elementData, T[] a) { + if (a.length < size) + // Make a new array of a's runtime type, but my contents: + return (T[]) Arrays.copyOf(elementData, size, a.getClass()); + System.arraycopy(elementData, 0, a, 0, size); + return a; + } + + public Object[] traversal(int order) { + Object[] datas = new Object[size]; + if (order == PREORDER) { + preorderTraversal(root, datas); + } else if (order == INORDER) { + inorderTraversal(root, datas); + } else if (order == POSTORDER) { + postorderTraversal(root, datas); + } else { + hierarchicalTraversal(root, datas); + } + index = 0; + return datas; + } + + private void preorderTraversal(BinaryTreeNode node, Object[] datas) { + if (node == null) { + return; + } + + datas[index++] = node.getData(); + preorderTraversal(node.getLeft(), datas); + preorderTraversal(node.getRight(), datas); + } + + private void inorderTraversal(BinaryTreeNode node, Object[] datas) { + if (node == null) { + return; + } + + inorderTraversal(node.getLeft(), datas); + datas[index++] = node.getData(); + inorderTraversal(node.getRight(), datas); + } + + private void postorderTraversal(BinaryTreeNode node, Object[] datas) { + if (node == null) { + return; + } + + postorderTraversal(node.getLeft(), datas); + postorderTraversal(node.getRight(), datas); + datas[index++] = node.getData(); + } + + private void hierarchicalTraversal(BinaryTreeNode node, Object[] datas) { + if (node == null) return; + GenericQueue> queue = new GenericQueue<>(); + queue.enQueue(node); + while (!queue.isEmpty()) { + BinaryTreeNode tmp = queue.deQueue(); + datas[index++] = tmp.getData(); + if (tmp.getLeft() != null) queue.enQueue(tmp.getLeft()); + if (tmp.getRight() != null) queue.enQueue(tmp.getRight()); + } + } + + + class BinaryTreeNode> { + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data) { + this.data = data; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericIterator.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericIterator.java new file mode 100644 index 0000000000..7a570f7d13 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericIterator.java @@ -0,0 +1,9 @@ +package com.aaront.exercise.generic; + +public interface GenericIterator { + boolean hasNext(); + + T next(); + + void remove(); +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericLinkedList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericLinkedList.java new file mode 100644 index 0000000000..d8ccbee44f --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericLinkedList.java @@ -0,0 +1,140 @@ +package com.aaront.exercise.generic; + +import java.util.Arrays; + +public class GenericLinkedList implements GenericList { + + private Node head = new Node<>(null); + private int size = 0; + + public void add(T o) { + Node newNode = new Node<>(o); + Node first = head.next; + Node second = head; + while (first != null) { + second = first; + first = first.next; + } + second.next = newNode; + size++; + } + + public void add(int index, T o) { + if (index < 0 || index > size) throw new IndexOutOfBoundsException("索引超出范围"); + Node first = head; + int i = 0; + while (i < index) { + first = first.next; + i++; + } + Node node = new Node<>(o); + node.next = first.next; + first.next = node; + size++; + } + + public T get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException("索引超出范围"); + Node first = head.next; + int i = 0; + while (i < index) { + first = first.next; + i++; + } + return first.data; + } + + public T remove(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException("索引超出范围"); + Node first = head; + int i = 0; + while (i < index) { + first = first.next; + i++; + } + Node element = first.next; + first.next = first.next.next; + size--; + return element.data; + } + + public int size() { + return size; + } + + public void addFirst(T o) { + add(0, o); + } + + public void addLast(T o) { + add(size, o); + } + + public T removeFirst() { + return remove(0); + } + + public T removeLast() { + return remove(size - 1); + } + + public GenericIterator iterator() { + return new LinkedListGenericIterator<>(this); + } + + public Object[] toArray() { + Object[] objects = new Object[size]; + Node first = head.next; + int pos = 0; + while (first != null) { + objects[pos++] = first.data; + first = first.next; + } + return objects; + } + + public T[] toArray(T[] a) { + Object[] elementData = toArray(); + if (a.length < size) + // Make a new array of a's runtime type, but my contents: + return (T[]) Arrays.copyOf(elementData, size, a.getClass()); + System.arraycopy(elementData, 0, a, 0, size); + return a; + } + + private static class LinkedListGenericIterator implements GenericIterator { + + private int pos = 0; + private GenericLinkedList genericLinkedList; + + private LinkedListGenericIterator(GenericLinkedList linkList) { + this.genericLinkedList = linkList; + } + + @Override + public boolean hasNext() { + return pos < genericLinkedList.size(); + } + + @Override + public T next() { + return genericLinkedList.get(pos++); + } + + @Override + public void remove() { + genericLinkedList.remove(pos - 1); + pos--; + } + } + + + private static class Node { + private T data; + private Node next; + + private Node(T data) { + this.data = data; + } + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericList.java new file mode 100644 index 0000000000..03d70d91b4 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericList.java @@ -0,0 +1,9 @@ +package com.aaront.exercise.generic; + +public interface GenericList { + public void add(T o); + public void add(int index, T o); + public T get(int index); + public T remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericQueue.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericQueue.java new file mode 100644 index 0000000000..266e85a32f --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericQueue.java @@ -0,0 +1,30 @@ +package com.aaront.exercise.generic; + +public class GenericQueue { + + private GenericLinkedList linkedList = new GenericLinkedList<>(); + + public void enQueue(T o) { + linkedList.add(o); + } + + public T deQueue() { + return linkedList.removeFirst(); + } + + public boolean isEmpty() { + return linkedList.size() == 0; + } + + public int size() { + return linkedList.size(); + } + + public Object[] toArray() { + return linkedList.toArray(); + } + + public T[] toArray(T[] a) { + return linkedList.toArray(a); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericStack.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericStack.java new file mode 100644 index 0000000000..35465acfde --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericStack.java @@ -0,0 +1,33 @@ +package com.aaront.exercise.generic; + +public class GenericStack { + private GenericArrayList elementData = new GenericArrayList<>(); + + public void push(T o) { + elementData.add(o); + } + + public T pop() { + return elementData.remove(elementData.size() - 1); + } + + public T peek() { + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } + + public Object[] toArray() { + return elementData.toArray(); + } + + public T[] toArray(T[] a) { + return elementData.toArray(a); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/AllTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/AllTest.java new file mode 100644 index 0000000000..ebff633b23 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/AllTest.java @@ -0,0 +1,19 @@ +package com.aaront.execrise.basic; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * @author tonyhui + * @since 17/2/21 + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + ArrayListTest.class, + BinaryTreeTest.class, + LinkListTest.class, + QueueTest.class, + StackTest.class +}) +public class AllTest { +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java new file mode 100644 index 0000000000..156eb638c7 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java @@ -0,0 +1,69 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.ArrayList; +import com.aaront.exercise.basic.Iterator; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/2/20 + */ +public class ArrayListTest { + + private ArrayList arrayList = new ArrayList(); + + @Before + public void init() { + arrayList.add(1); + arrayList.add(2); + arrayList.add(3); + } + + @Test + public void testAdd() { + Assert.assertEquals(1, arrayList.get(0)); + Assert.assertEquals(2, arrayList.get(1)); + Assert.assertEquals(3, arrayList.get(2)); + Assert.assertEquals(3, arrayList.size()); + } + + @Test + public void testAddIndex() { + arrayList.add(1, 4); + arrayList.add(2, 5); + Assert.assertArrayEquals(new Object[]{1, 4, 5, 2, 3}, arrayList.toArray()); + } + + @Test + public void testToArray() { + Assert.assertArrayEquals(new Object[]{1, 2, 3}, arrayList.toArray()); + } + + @Test + public void testGet() { + Assert.assertEquals(3, arrayList.get(2)); + Assert.assertEquals(1, arrayList.get(0)); + Assert.assertEquals(2, arrayList.get(1)); + } + + @Test + public void testRemove() { + testAddIndex(); + arrayList.remove(2); + arrayList.add(4, 10); + arrayList.add(3, 9); + Assert.assertArrayEquals(new Object[]{1, 4, 2, 9, 3, 10}, arrayList.toArray()); + } + + @Test + public void testIterator() { + Iterator iterator = arrayList.iterator(); + while (iterator.hasNext()) { + iterator.next(); + iterator.remove(); + } + Assert.assertArrayEquals(new Object[]{}, arrayList.toArray()); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java new file mode 100644 index 0000000000..ebc8a9193b --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java @@ -0,0 +1,94 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.BinaryTree; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/2/20 + */ +public class BinaryTreeTest { + + private BinaryTree binaryTree = null; + + @Before + public void init() { + int[] datas = new int[]{9, 4, 5, 7, 1, 2, 3, 10, 17, 9}; + binaryTree = new BinaryTree(); + for (int data : datas) { + binaryTree.add(data); + } + } + + + @Test + public void testAdd() { + int[] preorderDatas = binaryTree.traversal(BinaryTree.PREORDER); + Assert.assertArrayEquals(new int[]{9, 4, 1, 2, 3, 5, 7, 10, 9, 17}, preorderDatas); + int[] inorderDatas = binaryTree.traversal(BinaryTree.INORDER); + Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5, 7, 9, 9, 10, 17}, inorderDatas); + int[] postorderDatas = binaryTree.traversal(BinaryTree.POSTORDER); + Assert.assertArrayEquals(new int[]{3, 2, 1, 7, 5, 4, 9, 17, 10, 9}, postorderDatas); + int[] hierarchicalDatas = binaryTree.traversal(BinaryTree.HIERARCHICAL); + Assert.assertArrayEquals(new int[]{9, 4, 10, 1, 5, 9, 17, 2, 7, 3}, hierarchicalDatas); + } + + @Test + public void testSearch() { + BinaryTree.BinaryTreeNode node1 = binaryTree.search(5, BinaryTree.RECURSION); + Assert.assertTrue(node1.getData() == 5); + BinaryTree.BinaryTreeNode node2 = binaryTree.search(17, BinaryTree.RECURSION); + Assert.assertTrue(node2.getData() == 17); + BinaryTree.BinaryTreeNode node3 = binaryTree.search(100, BinaryTree.RECURSION); + Assert.assertTrue(node3 == null); + } + + @Test + public void testMin() { + BinaryTree.BinaryTreeNode min = binaryTree.min(); + Assert.assertTrue(min.getData() == 1); + } + + @Test + public void testMax() { + BinaryTree.BinaryTreeNode max = binaryTree.max(); + Assert.assertTrue(max.getData() == 17); + } + + @Test + public void testDelete() { + buildTree(new int[]{50, 25, 12, 11, 40, 14, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88}); + // 删除叶子节点 + binaryTree.delete(11); + int[] preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88}, preOrderDatas); + binaryTree.delete(88); + preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82}, preOrderDatas); + + // 删除一个子节点的节点 + binaryTree.delete(70); + preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 80, 85, 82}, preOrderDatas); + binaryTree.delete(80); + preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new int[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas); + + // 删除两个子节点的节点 + binaryTree.delete(40); + preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new int[]{50, 25, 12, 14, 42, 35, 45, 44, 43, 75, 55, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas); + binaryTree.delete(50); + preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new int[]{55, 25, 12, 14, 42, 35, 45, 44, 43, 75, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas); + } + + private void buildTree(int[] datas) { + binaryTree = new BinaryTree(); + for (int data : datas) { + binaryTree.add(data); + } + } +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java new file mode 100644 index 0000000000..b1bfc6f1b8 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java @@ -0,0 +1,81 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.Iterator; +import com.aaront.exercise.basic.LinkedList; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/2/21 + */ +public class LinkListTest { + + private LinkedList linkedList = new LinkedList(); + + @Before + public void init() { + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + } + + @Test + public void testAdd() { + Assert.assertArrayEquals(new Object[]{1, 2, 3}, linkedList.toArray()); + } + + @Test + public void testAddIndex() { + linkedList.add(1, 10); + linkedList.add(0, 8); + Assert.assertArrayEquals(new Object[]{8, 1, 10, 2, 3}, linkedList.toArray()); + } + + @Test + public void testAddFirst() { + linkedList.addFirst(-1); + Assert.assertArrayEquals(new Object[]{-1, 1, 2, 3}, linkedList.toArray()); + } + + @Test + public void testAddLast() { + linkedList.addLast(99); + Assert.assertArrayEquals(new Object[]{1, 2, 3, 99}, linkedList.toArray()); + } + + @Test + public void testRemove() { + testAddIndex(); + linkedList.remove(1); + linkedList.remove(2); + linkedList.add(3, 3); + linkedList.add(1, 2); + Assert.assertArrayEquals(new Object[]{8, 2, 10, 3, 3}, linkedList.toArray()); + } + + @Test + public void testRemoveFirst() { + linkedList.removeFirst(); + linkedList.removeFirst(); + Assert.assertArrayEquals(new Object[]{3}, linkedList.toArray()); + } + + @Test + public void testRemoveLast() { + linkedList.removeLast(); + linkedList.removeLast(); + Assert.assertArrayEquals(new Object[]{1}, linkedList.toArray()); + } + + @Test + public void testIterator() { + Iterator iterator = linkedList.iterator(); + while (iterator.hasNext()) { + iterator.next(); + iterator.remove(); + } + Assert.assertArrayEquals(new Object[]{}, linkedList.toArray()); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java new file mode 100644 index 0000000000..273e1b9685 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java @@ -0,0 +1,33 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.Queue; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/2/21 + */ +public class QueueTest { + private Queue queue = new Queue(); + + @Before + public void init() { + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + } + + @Test + public void testEnqueue() { + Assert.assertArrayEquals(new Object[]{1, 2, 3}, queue.toArray()); + } + + @Test + public void testDequeue() { + queue.deQueue(); + queue.deQueue(); + Assert.assertArrayEquals(new Object[]{3}, queue.toArray()); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java new file mode 100644 index 0000000000..0fe5ca06b1 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java @@ -0,0 +1,46 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.Stack; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/2/21 + */ +public class StackTest { + + private Stack stack = new Stack(); + + @Before + public void init() { + stack.push(1); + stack.push(2); + stack.push(3); + } + + @Test + public void testPush() { + Assert.assertArrayEquals(new Object[]{1, 2, 3}, stack.toArray()); + } + + @Test + public void testPop() { + Object element1 = stack.pop(); + Assert.assertEquals(3, element1); + Object element2 = stack.pop(); + Assert.assertEquals(2, element2); + Assert.assertArrayEquals(new Object[]{1}, stack.toArray()); + } + + @Test + public void testPeek() { + Object element1 = stack.peek(); + Assert.assertEquals(3, element1); + Object element2 = stack.peek(); + Assert.assertEquals(3, element2); + Assert.assertArrayEquals(new Object[]{1, 2, 3}, stack.toArray()); + } + +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericAllTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericAllTest.java new file mode 100644 index 0000000000..66c071cf5c --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericAllTest.java @@ -0,0 +1,19 @@ +package com.aaront.execrise.generic; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * @author tonyhui + * @since 17/2/22 + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + GenericArrayListTest.class, + GenericLinkedListTest.class, + GenericQueueTest.class, + GenericStackTest.class, + GenericBinaryTreeTest.class +}) +public class GenericAllTest { +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java new file mode 100644 index 0000000000..a6376ce1dd --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java @@ -0,0 +1,76 @@ +package com.aaront.execrise.generic; + +import com.aaront.exercise.generic.GenericArrayList; +import com.aaront.exercise.generic.GenericIterator; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/2/22 + */ +public class GenericArrayListTest { + + private GenericArrayList arrayList = new GenericArrayList<>(); + + @Before + public void init() { + arrayList.add("1"); + arrayList.add("2"); + arrayList.add("3"); + } + + + @Test + public void testAdd() { + Assert.assertEquals("1", arrayList.get(0)); + Assert.assertEquals("2", arrayList.get(1)); + Assert.assertEquals("3", arrayList.get(2)); + Assert.assertEquals(3, arrayList.size()); + } + + @Test + public void testAddIndex() { + arrayList.add(1, "4"); + arrayList.add(2, "5"); + Assert.assertArrayEquals(new String[]{"1", "4", "5", "2", "3" }, arrayList.toArray()); + } + + @Test + public void testToArray() { + Assert.assertArrayEquals(new String[]{"1", "2", "3" }, arrayList.toArray()); + } + + @Test + public void testToGenericArray() { + Assert.assertArrayEquals(new String[]{"1", "2", "3" }, arrayList.toArray(new String[0])); + } + + @Test + public void testGet() { + Assert.assertEquals("3", arrayList.get(2)); + Assert.assertEquals("1", arrayList.get(0)); + Assert.assertEquals("2", arrayList.get(1)); + } + + @Test + public void testRemove() { + testAddIndex(); + arrayList.remove(2); + arrayList.add(4, "10"); + arrayList.add(3, "9"); + Assert.assertArrayEquals(new String[]{"1", "4", "2", "9", "3", "10" }, arrayList.toArray()); + } + + @Test + public void testIterator() { + GenericIterator genericIterator = arrayList.iterator(); + while (genericIterator.hasNext()) { + genericIterator.next(); + genericIterator.remove(); + } + Assert.assertArrayEquals(new String[]{}, arrayList.toArray()); + } + +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java new file mode 100644 index 0000000000..6c39ab07e7 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java @@ -0,0 +1,75 @@ +package com.aaront.execrise.generic; + +import com.aaront.exercise.generic.GenericBinaryTree; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/2/20 + */ +public class GenericBinaryTreeTest { + + @Before + public void init() { + String[] datas = new String[]{"9", "4", "5", "7", "1", "2", "3", "10", "17", "9" }; + GenericBinaryTree binaryTree = new GenericBinaryTree<>(); + for (String data : datas) { + binaryTree.add(data); + } + } + + @Test + public void testAdd() { + String[] datas = new String[]{"9", "4", "5", "7", "1", "2", "3", "10", "17", "9" }; + GenericBinaryTree binaryTree = new GenericBinaryTree<>(); + for (String data : datas) { + binaryTree.add(data); + } + String[] preorderDatas = binaryTree.traversal(GenericBinaryTree.PREORDER, new String[0]); + Assert.assertArrayEquals(new String[]{"9", "4", "1", "2", "10", "17", "3", "5", "7", "9" }, preorderDatas); + String[] inorderDatas = binaryTree.traversal(GenericBinaryTree.INORDER, new String[0]); + Assert.assertArrayEquals(new String[]{"1", "10", "17", "2", "3", "4", "5", "7", "9", "9" }, inorderDatas); + String[] postorderDatas = binaryTree.traversal(GenericBinaryTree.POSTORDER, new String[0]); + Assert.assertArrayEquals(new String[]{"17", "10", "3", "2", "1", "7", "5", "4", "9", "9" }, postorderDatas); + String[] hierarchicalDatas = binaryTree.traversal(GenericBinaryTree.HIERARCHICAL, new String[0]); + Assert.assertArrayEquals(new String[]{"9", "4", "9", "1", "5", "2", "7", "10", "3", "17" }, hierarchicalDatas); + } + + @Test + public void testDelete() { + GenericBinaryTree binaryTree = buildTree(new int[]{50, 25, 12, 11, 40, 14, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88}); + // 删除叶子节点 + binaryTree.delete(11); + Object[] preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82, 88}, preOrderDatas); + binaryTree.delete(88); + preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 70, 60, 65, 63, 61, 90, 80, 85, 82}, preOrderDatas); + + // 删除一个子节点的节点 + binaryTree.delete(70); + preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 80, 85, 82}, preOrderDatas); + binaryTree.delete(80); + preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new Object[]{50, 25, 12, 14, 40, 35, 45, 44, 43, 42, 75, 55, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas); + + // 删除两个子节点的节点 + binaryTree.delete(40); + preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new Object[]{50, 25, 12, 14, 42, 35, 45, 44, 43, 75, 55, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas); + binaryTree.delete(50); + preOrderDatas = binaryTree.traversal(); + Assert.assertArrayEquals(new Object[]{55, 25, 12, 14, 42, 35, 45, 44, 43, 75, 60, 65, 63, 61, 90, 85, 82}, preOrderDatas); + } + + private GenericBinaryTree buildTree(int[] datas) { + GenericBinaryTree binaryTree = new GenericBinaryTree<>(); + for (int data : datas) { + binaryTree.add(data); + } + return binaryTree; + } +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java new file mode 100644 index 0000000000..50aaf13527 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java @@ -0,0 +1,90 @@ +package com.aaront.execrise.generic; + +import com.aaront.exercise.generic.GenericLinkedList; +import com.aaront.exercise.generic.GenericIterator; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/2/22 + */ +public class GenericLinkedListTest { + private GenericLinkedList linkedList = new GenericLinkedList<>(); + + @Before + public void init() { + linkedList.add("1"); + linkedList.add("2"); + linkedList.add("3"); + } + + @Test + public void testAdd() { + Assert.assertArrayEquals(new String[]{"1", "2", "3" }, linkedList.toArray()); + } + + @Test + public void testAddIndex() { + linkedList.add(1, "10"); + linkedList.add(0, "8"); + Assert.assertArrayEquals(new String[]{"8", "1", "10", "2", "3" }, linkedList.toArray()); + } + + @Test + public void testAddFirst() { + linkedList.addFirst("-1"); + Assert.assertArrayEquals(new String[]{"-1", "1", "2", "3" }, linkedList.toArray()); + } + + @Test + public void testAddLast() { + linkedList.addLast("99"); + Assert.assertArrayEquals(new String[]{"1", "2", "3", "99" }, linkedList.toArray()); + } + + @Test + public void testRemove() { + testAddIndex(); + linkedList.remove(1); + linkedList.remove(2); + linkedList.add(3, "3"); + linkedList.add(1, "2"); + Assert.assertArrayEquals(new String[]{"8", "2", "10", "3", "3" }, linkedList.toArray()); + } + + @Test + public void testRemoveFirst() { + linkedList.removeFirst(); + linkedList.removeFirst(); + Assert.assertArrayEquals(new String[]{"3" }, linkedList.toArray()); + } + + @Test + public void testRemoveLast() { + linkedList.removeLast(); + linkedList.removeLast(); + Assert.assertArrayEquals(new String[]{"1" }, linkedList.toArray()); + } + + @Test + public void testToArray() { + Assert.assertArrayEquals(new String[]{"1", "2", "3" }, linkedList.toArray()); + } + + @Test + public void testToGenericArray() { + Assert.assertArrayEquals(new String[]{"1", "2", "3" }, linkedList.toArray(new String[0])); + } + + @Test + public void testIterator() { + GenericIterator genericIterator = linkedList.iterator(); + while (genericIterator.hasNext()) { + genericIterator.next(); + genericIterator.remove(); + } + Assert.assertArrayEquals(new String[]{}, linkedList.toArray()); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java new file mode 100644 index 0000000000..234cff5a02 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java @@ -0,0 +1,33 @@ +package com.aaront.execrise.generic; + +import com.aaront.exercise.generic.GenericQueue; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/2/21 + */ +public class GenericQueueTest { + private GenericQueue queue = new GenericQueue<>(); + + @Before + public void init() { + queue.enQueue("1"); + queue.enQueue("2"); + queue.enQueue("3"); + } + + @Test + public void testEnqueue() { + Assert.assertArrayEquals(new String[]{"1", "2", "3" }, queue.toArray()); + } + + @Test + public void testDequeue() { + queue.deQueue(); + queue.deQueue(); + Assert.assertArrayEquals(new String[]{"3" }, queue.toArray()); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java new file mode 100644 index 0000000000..58ca230766 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java @@ -0,0 +1,46 @@ +package com.aaront.execrise.generic; + +import com.aaront.exercise.generic.GenericStack; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/2/21 + */ +public class GenericStackTest { + + private GenericStack stack = new GenericStack<>(); + + @Before + public void init() { + stack.push("1"); + stack.push("2"); + stack.push("3"); + } + + @Test + public void testPush() { + Assert.assertArrayEquals(new String[]{"1", "2", "3" }, stack.toArray()); + } + + @Test + public void testPop() { + String element1 = stack.pop(); + Assert.assertEquals("3", element1); + String element2 = stack.pop(); + Assert.assertEquals("2", element2); + Assert.assertArrayEquals(new String[]{"1" }, stack.toArray()); + } + + @Test + public void testPeek() { + String element1 = stack.peek(); + Assert.assertEquals("3", element1); + String element2 = stack.peek(); + Assert.assertEquals("3", element2); + Assert.assertArrayEquals(new String[]{"1", "2", "3" }, stack.toArray()); + } + +} diff --git a/group01/954958168/class02/ArrayUtil/pom.xml b/group01/954958168/class02/ArrayUtil/pom.xml new file mode 100644 index 0000000000..4ef1e0c611 --- /dev/null +++ b/group01/954958168/class02/ArrayUtil/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + com.aaront.exercise + array-util + 1.0.0-SNAPSHOT + + + UTF-8 + 1.8 + + + + + junit + junit + 4.12 + + + + \ No newline at end of file diff --git a/group01/954958168/class02/ArrayUtil/src/main/java/com/aaront/exercise/ArrayUtil.java b/group01/954958168/class02/ArrayUtil/src/main/java/com/aaront/exercise/ArrayUtil.java new file mode 100644 index 0000000000..8e3112cd06 --- /dev/null +++ b/group01/954958168/class02/ArrayUtil/src/main/java/com/aaront/exercise/ArrayUtil.java @@ -0,0 +1,240 @@ +package com.aaront.exercise; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if (origin == null || origin.length == 0) return; + int head = 0; + int tail = origin.length - 1; + while (head < tail) { + origin[head] = origin[head] ^ origin[tail]; + origin[tail] = origin[head] ^ origin[tail]; + origin[head] = origin[head] ^ origin[tail]; + head++; + tail--; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + if (oldArray == null) return new int[0]; + int size = oldArray.length; + for (int i = 0; i < size; i++) { + if (oldArray[i] != 0) continue; + int j = i + 1; + for (; j < size; j++) { + if (oldArray[j] != 0) break; + } + size -= (j - i); + move(oldArray, i, j - i, size); + } + + int[] newArray = new int[size]; + for (int i = 0; i < size; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + private void move(int[] array, int start, int moveLen, int size) { + for (int i = start; i < size; i++) { + array[i] = array[i + moveLen]; + } + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int len1 = array1.length; + int len2 = array2.length; + int[] mergeArray = new int[len1 + len2]; + int i = 0; + int j = 0; + int k = 0; + for (; i < len1 && j < len2; ) { + if (array1[i] < array2[j]) { + mergeArray[k] = array1[i]; + i++; + } else if (array1[i] > array2[j]) { + mergeArray[k] = array2[j]; + j++; + } else { + mergeArray[k] = array1[i]; + i++; + j++; + } + k++; + } + while (i < len1) { + mergeArray[k++] = array1[i++]; + } + while (j < len2) { + mergeArray[k++] = array2[j++]; + } + return resize(mergeArray, k); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + if (oldArray == null) return new int[0]; + int[] newArray = new int[oldArray.length + size]; + int index = 0; + for (int len = oldArray.length; index < len; index++) { + newArray[index] = oldArray[index]; + } + for (int len = newArray.length; index < len; index++) { + newArray[index] = 0; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max <= 1) return new int[0]; + int[] elements = new int[10]; + elements[0] = 1; + elements[1] = 1; + int index = 1; + int sum; + while ((sum = elements[index] + elements[index - 1]) < max) { + if (index + 1 >= elements.length) elements = dilatation(elements); + elements[++index] = sum; + } + if (index < elements.length - 1) { + elements = resize(elements, index + 1); + } + return elements; + } + + private int[] dilatation(int[] origin) { + int len = origin.length; + int[] newArray = new int[len * 2]; + for (int i = 0; i < len; i++) { + newArray[i] = origin[i]; + } + return newArray; + } + + private int[] resize(int[] origin, int size) { + int[] newArray = new int[size]; + for (int i = 0; i < size; i++) { + newArray[i] = origin[i]; + } + return newArray; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int[] primes = new int[max]; + int index = 0; + for (int i = 2; i < max; i++) { + if (isPrimes(i)) { + primes[index++] = i; + } + } + return resize(primes, index); + } + + private boolean isPrimes(int num) { + for (int i = 2; i < num; i++) { + if (num % i == 0) return false; + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int[] perfectNumbers = new int[max]; + int index = 0; + for (int i = 1; i < max; i++) { + int[] factors = getFactors(i); + int sum = 0; + for (int factor : factors) { + sum += factor; + } + if (sum == i) perfectNumbers[index++] = i; + } + return resize(perfectNumbers, index); + } + + private int[] getFactors(int num) { + int[] factors = new int[num]; + int index = 0; + for (int i = 1; i < num; i++) { + if (num % i == 0) { + factors[index++] = i; + } + } + return resize(factors, index); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + if (array == null) return ""; + StringBuilder sb = new StringBuilder(""); + for(int i = 0, len = array.length;i + + 4.0.0 + + com.aaront.exercise + lite-struts + 1.0.0-SNAPSHOT + + + UTF-8 + 1.8 + + + + + junit + junit + 4.12 + + + commons-digester + commons-digester + 2.1 + + + org.apache.commons + commons-lang3 + 3.5 + + + + \ No newline at end of file diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LiteStruts.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LiteStruts.java new file mode 100644 index 0000000000..61bb4c1107 --- /dev/null +++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LiteStruts.java @@ -0,0 +1,122 @@ +package com.aaront.exercise; + +import com.aaront.exercise.pojo.Action; +import com.aaront.exercise.pojo.Result; +import com.aaront.exercise.pojo.Structs; +import org.apache.commons.digester.Digester; +import org.apache.commons.lang3.StringUtils; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + + +public class LiteStruts { + + private DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); + + public View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的execute 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + URL resource = readProfiles("struts.xml"); + Structs structs = parseXML(resource); + Action action = structs.getActions().stream().filter(a -> StringUtils.equals(a.getName(), actionName)).findAny().orElseThrow(() -> new RuntimeException("Action不存在")); + + try { + Class actionClass = Class.forName(action.getClazz()); + Object instance = actionClass.newInstance(); + parameters.entrySet().stream().filter(entry -> StringUtils.isNotBlank(entry.getKey())).forEach(entry -> { + String propertyName = entry.getKey(); + String propertyValue = entry.getValue(); + String setterMethodName = StringUtils.prependIfMissing(StringUtils.capitalize(propertyName), "set"); + try { + Class propertyType = actionClass.getDeclaredField(propertyName).getType(); + Method method = actionClass.getMethod(setterMethodName, propertyType); + method.invoke(instance, propertyValue); + } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + }); + Method execute = actionClass.getMethod("execute"); + + Object methodReturnValue = execute.invoke(instance); + String viewPath = action.getResults().stream().filter(result -> result.getName().equals(methodReturnValue)).map(Result::getValue).findAny().orElseThrow(() -> new RuntimeException("没有对应的view")); + Map map = new HashMap(); + Arrays.stream(actionClass.getDeclaredMethods()).filter(method -> method.getName().startsWith("get")).forEach(method -> { + try { + Object result = method.invoke(instance); + String propertyName = StringUtils.uncapitalize(method.getName().substring(3)); + map.put(propertyName, result); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + }); + View view = new View(); + view.setJsp(viewPath); + view.setParameters(map); + return view; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + throw new RuntimeException("处理Action的类不存在"); + } catch (InstantiationException | IllegalAccessException e) { + // TODO: 17/2/27 这里可以优化成遍历所有的构造函数之后再抛错 + e.printStackTrace(); + throw new RuntimeException("处理Action的类没有默认的构造函数"); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + throw new RuntimeException("处理Action的类没有execute函数"); + } catch (InvocationTargetException e) { + e.printStackTrace(); + throw new RuntimeException("调用execute方法出错"); + } + } + + private URL readProfiles(String filePath) { + ClassLoader classLoader = LiteStruts.class.getClassLoader(); + URL resource = classLoader.getResource(filePath); + if (resource == null) throw new RuntimeException("文件不存在"); + return resource; + } + + private Structs parseXML(URL resource) { + Digester digester = new Digester(); + digester.addObjectCreate("struts", Structs.class); + digester.addObjectCreate("struts/action", Action.class); + digester.addSetProperties("struts/action", new String[]{"name", "class" }, new String[]{"name", "clazz" }); + digester.addSetNext("struts/action", "addAction"); + digester.addObjectCreate("struts/action/result", Result.class); + digester.addSetProperties("struts/action/result"); + digester.addBeanPropertySetter("struts/action/result", "value"); + digester.addSetNext("struts/action/result", "addResult"); + try { + return (Structs) digester.parse(resource); + } catch (IOException | SAXException e) { + e.printStackTrace(); + throw new RuntimeException("解析XML文件出错"); + } + } +} diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LoginAction.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LoginAction.java new file mode 100644 index 0000000000..050df9b79c --- /dev/null +++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LoginAction.java @@ -0,0 +1,39 @@ +package com.aaront.exercise; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/View.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/View.java new file mode 100644 index 0000000000..f23425e5bd --- /dev/null +++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/View.java @@ -0,0 +1,26 @@ +package com.aaront.exercise; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Action.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Action.java new file mode 100644 index 0000000000..cc945a6614 --- /dev/null +++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Action.java @@ -0,0 +1,38 @@ +package com.aaront.exercise.pojo; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author tonyhui + * @since 17/2/27 + */ +public class Action { + private String name; + private String clazz; + private List results = new ArrayList<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClazz() { + return clazz; + } + + public void setClazz(String clazz) { + this.clazz = clazz; + } + + public void addResult(Result result) { + this.results.add(result); + } + + public List getResults() { + return results; + } +} diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Result.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Result.java new file mode 100644 index 0000000000..bdc78b0037 --- /dev/null +++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Result.java @@ -0,0 +1,26 @@ +package com.aaront.exercise.pojo; + +/** + * @author tonyhui + * @since 17/2/27 + */ +public class Result { + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Structs.java b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Structs.java new file mode 100644 index 0000000000..253a22d3e7 --- /dev/null +++ b/group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Structs.java @@ -0,0 +1,20 @@ +package com.aaront.exercise.pojo; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author tonyhui + * @since 17/2/27 + */ +public class Structs { + private List actions = new ArrayList<>(); + + public void addAction(Action action) { + actions.add(action); + } + + public List getActions() { + return actions; + } +} diff --git a/group01/954958168/class02/LiteStruts/src/main/resources/struts.xml b/group01/954958168/class02/LiteStruts/src/main/resources/struts.xml new file mode 100644 index 0000000000..b08dd37edd --- /dev/null +++ b/group01/954958168/class02/LiteStruts/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/954958168/class02/LiteStruts/src/test/java/com/aaront/exercise/StrutsTest.java b/group01/954958168/class02/LiteStruts/src/test/java/com/aaront/exercise/StrutsTest.java new file mode 100644 index 0000000000..12318b16c8 --- /dev/null +++ b/group01/954958168/class02/LiteStruts/src/test/java/com/aaront/exercise/StrutsTest.java @@ -0,0 +1,48 @@ +package com.aaront.exercise; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + +public class StrutsTest { + + private LiteStruts liteStruts; + + @Before + public void setUp() { + liteStruts = new LiteStruts(); + } + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + + View view = liteStruts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); //密码和预设的不一致 + + View view = liteStruts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group01/group01.md b/group01/group01.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group01/group01.md @@ -0,0 +1 @@ + diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/array/ArrayUtil.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/array/ArrayUtil.java new file mode 100644 index 0000000000..38c0889f32 --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/array/ArrayUtil.java @@ -0,0 +1,301 @@ +package com.github.Ven13.coding2017.array; + +public class ArrayUtil { + + /** + * һa , Ըֵû + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + int originalLen = origin.length; + + int len = originalLen; + + int temp; + + for(int i = 0; i < (originalLen/2); i++){ + + temp = origin[len - i - 1]; + + origin[len - i - 1] = origin[i]; + + origin[i] = temp; + + } + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + + // 鳤ȱ + int newLength = 0; + // 鳤ֵ + for (int i = 0; i < oldArray.length; i++) { + + if(oldArray[i] != 0) { + + newLength++; + + } + + } + + // + int[] newArray = new int[newLength]; + // ± + int n = 0; + // ת + for (int i = 0; i < oldArray.length; i++) { + + if(oldArray[i] != 0) { + + newArray[n] = oldArray[i];// ת + n++;// ±ƫ + + } + + } + + //ɵ + return newArray; + + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ + * a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + + int[] newArray = new int[array1.length + array2.length]; + + int k = 0; + + String inNum = ""; + + for(int i = 0; i < array1.length; i++) { + + for(int j = 0; j < array2.length; j++) { + + if (array1[i] < array2[j]) { + if (inNum.indexOf(array1[i] + "|") < 0) { + newArray[k++] = array1[i]; + inNum += array1[i] + "|"; + } + + } else if (array1[i] == array2[j]) { + if (inNum.indexOf(array1[i] + "|") < 0) { + newArray[k++] = array1[i]; + inNum += array1[i] + "|"; + } + } else { + if (i == array1.length - 1) { + if (inNum.indexOf(array1[i] + "|") < 0) { + newArray[k++] = array1[i]; + inNum += array1[i] + "|"; + } + } else { + if (inNum.indexOf(array2[j] + "|") < 0) { + newArray[k++] = array2[j]; + inNum += array2[j] + "|"; + } + } + + } + + } + + } + + return newArray; + } + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ + * oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + return newArray; + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ + * 磬 max = 15 , 򷵻صӦΪ [11235813] + * max = 1, 򷵻ؿ [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * Сڸֵmax + * max = 23, صΪ[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + + int[] newArray = new int[max]; + + int k = 0; + + boolean isN = true; + + if (max > 2) { + + for (int i = 2; i < max; i++) { + + isN = true; + + for (int j = 2; j < max; j++) { + + if (i % j == 0 && i != j) { + + isN = false; + + } + } + + if (isN) { + + newArray[k++] = i; + + } + + } + + } else if (max == 2) { + + newArray[0] = 2; + k++; + } else { + + return null; + + } + + int[] newArray2 = new int[k]; + + for(int i = 0; i < k; i ++) { + + newArray2[i] = newArray[i]; + + } + + return newArray2; + } + + /** + * ν ָǡõ֮ͣ6=1+2+3 + * һֵmax һ飬 Сmax + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + + int i, j, k; + + int sum; + + k = 0; + + for(i = 1; i <= max; i++) { + + + sum = 0; + + for(j = 1; j < i; j++) { + + if(i % j == 0) { + + sum += j; + + } + + } + + if(i == sum) + k++; + } + + int[] newArray = new int[k]; + + k = 0; + + for(i = 1; i <= max; i++) { + + + sum = 0; + + for(j = 1; j < i; j++) { + + if(i % j == 0) { + + sum += j; + + } + + } + + if(i == sum) { + + newArray[k] = i; + + k++; + + } + + } + + + return newArray; + } + + /** + * seperator array + * array= [3,8,9], seperator = "-" + * 򷵻ֵΪ"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + + String str = ""; + + for(int i = 0; i < array.length; i++) { + + str += array[i] + seperator; + + } + + str = str.substring(0, str.length() - 1); + + return str; + } + + + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/array/test/ArrayUtilTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/array/test/ArrayUtilTest.java new file mode 100644 index 0000000000..c9684fa326 --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/array/test/ArrayUtilTest.java @@ -0,0 +1,46 @@ +package com.github.Ven13.coding2017.array.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.github.Ven13.coding2017.array.ArrayUtil; + +public class ArrayUtilTest { + + @Test + public final void testMerge() { + ArrayUtil arrayUtil = new ArrayUtil(); + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + int[] a3 = {}; + a3 = arrayUtil.merge(a1, a2); + assertEquals(3, a3[0]); + assertEquals(4, a3[1]); + assertEquals(5, a3[2]); + assertEquals(6, a3[3]); + assertEquals(7, a3[4]); + assertEquals(8, a3[5]); + + } + + @Test + public final void testgetPrimes() { + ArrayUtil arrayUtil = new ArrayUtil(); + int max = 23; + int[] a1 = {}; + a1 = arrayUtil.getPrimes(max); + assertEquals(3, a1.length); + assertEquals(1, a1[0]); + assertEquals(2, a1[1]); + assertEquals(3, a1[2]); + } + + @Test + public final void testgetPerfectNumbers() { + ArrayUtil arrayUtil = new ArrayUtil(); + int max = 6; + int[] a1 = {}; + a1 = arrayUtil.getPerfectNumbers(max); + } +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/ArrayList.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/ArrayList.java new file mode 100644 index 0000000000..59ca0d34ee --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/ArrayList.java @@ -0,0 +1,97 @@ +package com.github.Ven13.coding2017.basic; + +public class ArrayList implements List { + + //ؼϴС + private int size = 0; + + //ȸһΪ10 + Object[] elementData = new Object[100]; + + @Override + //̬Ԫ + public void add(Object o) { + //жǷ + if(size == elementData.length) { + Object[] newObjects = new Object[elementData.length * 2]; + System.arraycopy(elementData, 0, newObjects, 0, elementData.length); + elementData = newObjects; + } + + //ΪӵԪָ± + elementData[size] = o; + size++; + } + + @Override + public void add(int index, Object o) { + //жǷ + if(size == elementData.length) { + Object[] newObjects = elementData; + this.elementData = new Object[elementData.length * 2]; + for(int j = 0; j < newObjects.length; j++) { + this.elementData[j] = newObjects[j]; + } + } + + for(int i = size - 1; i >= index; i--) { + elementData[i+1] = elementData[i]; + } + + elementData[index] = o; + size++; + } + + @Override + public Object get(int index) { + return elementData[index]; + } + + @Override + public Object remove(int index) { + if (index > size) { + return null; + }; + + int moveSize = size - index - 1; + + if (moveSize > 0) { + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + } + elementData[--size] = null; + + //for(int i = index; i < elementData.length; i++) { + // elementData[i] = elementData[i+1]; + //} + + return elementData; + } + + @Override + public int size() { + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + + private int currentIndex = 0; + + @Override + public boolean hasNext() { + if(currentIndex >= size) return false; + else return true; + } + + @Override + public Object next() { + Object o = elementData[currentIndex]; + currentIndex ++; + return o; + } + } + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/BinaryTreeNode.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..354b2ba7a0 --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.github.Ven13.coding2017.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Iterator.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..3cf6540e5e --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.github.Ven13.coding2017.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/LinkedList.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/LinkedList.java new file mode 100644 index 0000000000..adf30d89c2 --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/LinkedList.java @@ -0,0 +1,173 @@ +package com.github.Ven13.coding2017.basic; + +public class LinkedList implements List { + + //ʾij + private int size; + + //ͷԪ + private Node head; + //βԪ + private Node tail; + + //ʹڲʵÿһڵ㣬ÿڵһָһԪصnextԼdata + private static class Node { + public Object data; + public Node next; + + public Node(Object data) { + this.data = data; + } + } + + //Ĺ췽 + public LinkedList() { + } + + @Override + public void add(Object o) { + add(size, o); + } + + @Override + public void add(int index, Object o) { + if(index == 0) { + addFirst(o); + } else { + if(index >= size) { + addLast(o); + } else { + Node node = head; + for (int i = 1; i < index; i++) { + head = head.next; + } + Node nextNode = node.next; + Node temp = new Node(o); + node.next = temp; + temp.next = nextNode; + size++; + } + } + } + + //ǰ + public void addFirst(Object o) { + Node newNode = new Node(o); + newNode.next = head; + head = newNode; + size++; + if(tail == null) { + tail = head; + } + } + + //Ӻ + public void addLast(Object o) { + if(tail == null) { + tail = head = new Node(o); + } else { + Node newNode = new Node(o); + tail.next = newNode; + tail = tail.next; + } + size++; + } + + + @Override + public Object get(int index) { + Node node = head; + for(int i = 0; i < index; i++) { + node = node.next; + } + return node.data; + } + + @Override + public Object remove(int index) { + if(size == 0) { + throw new java.util.NoSuchElementException(); + } + if(index == 0) { + Node node = head; + Node temp = node.next; + head = temp; + size--; + return node.data; + } else { + if(index >= size) { + throw new java.util.NoSuchElementException(); + } else { + Node node = head; + for(int i = 1; i < index; i++) { + node = node.next; + } + Node temp = node.next; + node.next = temp.next; + size--; + return node.data; + } + } + + } + + @Override + public int size() { + return size; + } + + public Object removeFirst() { + //ͨͷָ봴ͷڵ + Node hNode = head; + if (hNode == null) { + throw new java.util.NoSuchElementException(); + } + Node nNode = hNode.next; + Object element = hNode.data; + + //Ƴ + hNode.data = null; + hNode.next = null; + head = nNode; + //жǷΪβڵ + if (nNode == null) { + tail = null; + }else { + nNode = null; + } + size --; + return element; + } + + public Object removeLast() { + return remove(size - 1); + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + + private Node node = head.next; + + @Override + public boolean hasNext() { + return node != tail; + } + + @Override + public Object next() { + + if(!hasNext()) { + throw new java.util.NoSuchElementException(); + } + Object nextData = node.data; + node = node.next; + return nextData; + } + + } + + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/List.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/List.java new file mode 100644 index 0000000000..02e4297a33 --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/List.java @@ -0,0 +1,11 @@ +package com.github.Ven13.coding2017.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + + public Iterator iterator(); +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Queue.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Queue.java new file mode 100644 index 0000000000..112299b5e9 --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Queue.java @@ -0,0 +1,30 @@ +package com.github.Ven13.coding2017.basic; + +public class Queue { + + private LinkedList list = new LinkedList(); + private int size = 0; + + public void enQueue(Object o){ + size++; + list.addLast(o); + } + + public Object deQueue(){ + size--; + return list.removeFirst(); + } + + public boolean isEmpty(){ + if(size == 0) { + return true; + } else { + return false; + } + } + + public int size(){ + return size; + } + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Stack.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Stack.java new file mode 100644 index 0000000000..c0a2658bb3 --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Stack.java @@ -0,0 +1,30 @@ +package com.github.Ven13.coding2017.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + + elementData.add(o); + } + + public Object pop(){ + Object o = null; + if(elementData.size() > 0) { + o = elementData.get(elementData.size() - 1); + elementData.remove(elementData.size() - 1); + } + return o; + } + + public Object peek(){ + return elementData.get(0); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ArrayListTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ArrayListTest.java new file mode 100644 index 0000000000..7f3f179f3b --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ArrayListTest.java @@ -0,0 +1,11 @@ +package com.github.Ven13.coding2017.basic.test; + +import org.junit.Before; + +import com.github.Ven13.coding2017.basic.*; + +public class ArrayListTest extends ListTest{ + + + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/LinkedListTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/LinkedListTest.java new file mode 100644 index 0000000000..c6bc65698c --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/LinkedListTest.java @@ -0,0 +1,100 @@ +package com.github.Ven13.coding2017.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.github.Ven13.coding2017.basic.ArrayList; +import com.github.Ven13.coding2017.basic.LinkedList; +import com.github.Ven13.coding2017.basic.List; + +public class LinkedListTest extends ListTest { + +private LinkedList aLinkedList; + + @Before + public void setUpLinkedList() { + List aList = new ArrayList(); + aList = new LinkedList(); + aLinkedList = new LinkedList(); + } + + @Test + public void testAddFirst() { + aLinkedList.addFirst(5); + assertEquals(5, aLinkedList.get(0)); + + aLinkedList.addFirst(6); + assertEquals(6, aLinkedList.get(0)); + assertEquals(5, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + + @Test + public void testAddLast() { + aLinkedList.addLast("hello"); + assertEquals("hello", aLinkedList.get(0)); + + aLinkedList.addLast("world"); + assertEquals("hello", aLinkedList.get(0)); + assertEquals("world", aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + + @Test + public void testRemoveFirst() { + aLinkedList.addLast("hello"); + aLinkedList.addLast("world"); + + aLinkedList.removeFirst(); + assertEquals("world", aLinkedList.get(0)); + assertEquals(1, aLinkedList.size()); + + aLinkedList.removeFirst(); + assertEquals(0, aLinkedList.size()); + } + + @Test + public void testRemoveLast() { + aLinkedList.addFirst("world"); + aLinkedList.addFirst("hello"); + + aLinkedList.removeLast(); + //assertEquals("hello", aLinkedList.get(0)); + assertEquals(1, aLinkedList.size()); + + aLinkedList.removeLast(); + assertEquals(0, aLinkedList.size()); + } + + @Test + public void testLinkedListFunctional() { + for (int i = 1; i < 4; i++) { + aLinkedList.add(i); // [1,2,3] + } + aLinkedList.remove(1); // [1,3] + + aLinkedList.add(1, 0); // [1,0,3] + for (int i=4; i<6; i++) { + aLinkedList.addFirst(i); // [5, 4, 1, 0, 3] + } + assertEquals(5, aLinkedList.size()); + assertEquals(5, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(0, aLinkedList.get(3)); + + + aLinkedList.remove(3); // [5, 4, 1, 3] + assertEquals(3, aLinkedList.get(aLinkedList.size()-1)); + aLinkedList.removeLast(); // [5, 4, 1] + assertEquals(1, aLinkedList.get(aLinkedList.size()-1)); + aLinkedList.removeFirst(); // [4,1] + + assertEquals(4, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + + } + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ListTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ListTest.java new file mode 100644 index 0000000000..6959da0421 --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ListTest.java @@ -0,0 +1,129 @@ +package com.github.Ven13.coding2017.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.*; + +import com.github.Ven13.coding2017.basic.ArrayList; +import com.github.Ven13.coding2017.basic.Iterator; +import com.github.Ven13.coding2017.basic.List; + +public class ListTest { + + //protected static List aList; + + @Test + public void testFunctional() { + + List aList = new ArrayList(); + + aList.add(1); + aList.add(2); + assertEquals(1, aList.get(0)); + assertEquals(2, aList.get(1)); + + aList.add(3); + aList.add(0, 5); + aList.add(2, 11); + assertEquals(5, aList.get(0)); + assertEquals(11, aList.get(2)); + + aList.add("hi"); + assertEquals("hi", aList.get(5)); + assertEquals(6, aList.size()); + + aList.remove(1); + assertEquals(11, aList.get(1)); + assertEquals(2, aList.get(2)); + + assertEquals(5, aList.size()); + } + + @Test + public void testAdd() { + + List aList = new ArrayList(); + + for (int i = 0; i < 100; i++) { + aList.add(i); + } + + assertEquals(0, aList.get(0)); + assertEquals(99, aList.get(99)); + assertEquals(44, aList.get(44)); + } + + @Test + public void testRemove() { + + List aList = new ArrayList(); + + aList.add(1); + aList.add(2); + aList.add(3); + aList.remove(3); + assertEquals(2, aList.size()); + + } + + @Test + public void testSize() { + + List aList = new ArrayList(); + + for (int i = 0; i < 10; i++) { + aList.add(i * 2); + } + + assertEquals(10, aList.size()); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testException() { + + List aList = new ArrayList(); + + expectedEx.expect(Exception.class); + + aList.remove(1); + aList.add(3); + aList.add(2, 5); + } + + @Test + public void testIterator() { + + List aList = new ArrayList(); + + Iterator it = aList.iterator(); + + assertEquals(false, it.hasNext()); + + aList.add(1); + aList.add(2); + aList.add(3); + + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(2, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + aList.remove(1); + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + expectedEx.expect(Exception.class); + it.next(); + } + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/QueueTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/QueueTest.java new file mode 100644 index 0000000000..965610cdce --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/QueueTest.java @@ -0,0 +1,36 @@ +package com.github.Ven13.coding2017.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.github.Ven13.coding2017.basic.Queue; + +public class QueueTest { + +private Queue queue; + + @Before + public void setUpQueue() { + queue = new Queue(); + } + + @Test + public void testQueueFunctional() { + assertEquals(true, queue.isEmpty()); + queue.enQueue(4); + queue.enQueue(2); + assertEquals(2, queue.size()); + assertEquals(false, queue.isEmpty()); + + int i = (Integer)queue.deQueue(); + assertEquals(4, i); + i = (Integer)queue.deQueue(); + assertEquals(2, i); + + assertEquals(0, queue.size()); + assertEquals(true, queue.isEmpty()); + } + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/StackTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/StackTest.java new file mode 100644 index 0000000000..9bbf41914f --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/StackTest.java @@ -0,0 +1,40 @@ +package com.github.Ven13.coding2017.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.github.Ven13.coding2017.basic.Stack; + +public class StackTest { + +private Stack stack; + + @Before + public void setUpStack() { + stack = new Stack(); + } + + @Test + public void testStackFunctional() { + assertEquals(true, stack.isEmpty()); + stack.push(4); + stack.push(2); + assertEquals(2, stack.size()); + assertEquals(false, stack.isEmpty()); + + int i = (Integer)stack.pop(); + assertEquals(2, i); + + i = (Integer)stack.peek(); + assertEquals(4, i); + + i = (Integer)stack.pop(); + assertEquals(4, i); + + assertEquals(0, stack.size()); + assertEquals(true, stack.isEmpty()); + } + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/LoginAction.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/LoginAction.java new file mode 100644 index 0000000000..d43bc2c452 --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/LoginAction.java @@ -0,0 +1,42 @@ +package com.github.Ven13.coding2017.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public void setMessage(String message) { + this.message = message; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/Struts.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/Struts.java new file mode 100644 index 0000000000..a9040e257d --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/Struts.java @@ -0,0 +1,166 @@ +package com.github.Ven13.coding2017.litestruts; + +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.io.File; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + View view = new View(); + + Map map = testParseXmlData(actionName, "/struts.xml"); + + String className = (String)map.get(actionName); + + String resultName = ""; + System.out.println(className); + + try { + Class c = Class.forName(className); + Object obj = c.newInstance(); + Method method = null; + + for (Map.Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + PropertyDescriptor pd = new PropertyDescriptor(key, c); + Method setMethod = pd.getWriteMethod(); + setMethod.invoke(obj, value); + } + + Method exec = c.getDeclaredMethod("execute"); + Object res = exec.invoke(obj); + if(res != null) { + resultName = (String)map.get(actionName + '|' + res); + view.setJsp(resultName); + } + Field[] fields = c.getDeclaredFields(); + for(Field f : fields){ + PropertyDescriptor descriptor = new PropertyDescriptor(f.getName(), c); + Method getMethod = descriptor.getReadMethod(); + Object value = getMethod.invoke(obj); + parameters.put(f.getName(), (String)value); + } + view.setParameters(parameters); + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (IntrospectionException e) { + System.out.println(e.toString()); + e.printStackTrace(); + } + + + return view; + } + + public static Document parse2Document(String xmlFilePath){ + SAXReader reader = new SAXReader(); + Document doc = null; + try { + InputStream inputStream = Class.class.getResourceAsStream(xmlFilePath); + doc = reader.read(inputStream); + } catch (DocumentException e) { + e.printStackTrace(); + } + return doc; + } + + public static Map testParseXmlData(String actionName, String xmlFilePath){ + //获取xml解析器对象 + //SAXReader reader = new SAXReader(); + //将xml解析为Document对象 + Document doc = parse2Document(xmlFilePath); + //获取文档的根元素 + Element root = doc.getRootElement(); + + //定义保存属性、值的map + Map map = new HashMap(); + + + //遍历当前元素(在此是根元素)的子元素 + + for (Iterator i_pe = root.elementIterator(); i_pe.hasNext();) { + + Element e_pe = (Element) i_pe.next(); + //获取当前元素的名字 + String act = e_pe.getName(); + //获取当前元素的name和class属性的值并分别赋给attName,attClass变量 + System.out.println(act); + String attName = e_pe.attributeValue("name"); + String attClass = e_pe.attributeValue("class"); + if (attName.equals(actionName)) { + map.put(attName, attClass); + + //Element e_res = e_pe.element("result"); + //System.out.println(e_res.getName()); + for (Iterator i_res = e_pe.elementIterator(); i_res.hasNext();) { + + Element e_re = (Element) i_res.next(); + //获取当前元素的名字 + String person_n = e_re.getName(); + //获取当前元素的name和class属性的值并分别赋给attName,attClass变量 + System.out.println(person_n); + String resName = e_re.attributeValue("name"); + String resClass = e_re.getStringValue(); + map.put(attName + '|' + resName, resClass); + + } + } + } + + return map; + + } + +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/StrutsTest.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/StrutsTest.java new file mode 100644 index 0000000000..a5a777be1c --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.github.Ven13.coding2017.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //瀵嗙爜鍜岄璁剧殑涓嶄竴鑷� + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/View.java b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/View.java new file mode 100644 index 0000000000..2b0997095c --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/View.java @@ -0,0 +1,23 @@ +package com.github.Ven13.coding2017.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/struts.xml b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/struts.xml new file mode 100644 index 0000000000..59ec89bb69 --- /dev/null +++ b/group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group02/106614649/106614649Learnin/src/struts.xml b/group02/106614649/106614649Learnin/src/struts.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/ArrayList.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/ArrayList.java new file mode 100644 index 0000000000..e50560cf1d --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/ArrayList.java @@ -0,0 +1,105 @@ +package com.github.FelixCJF.coding2017.basic; + + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + //容量增加 + ensureCapacity(size + 1); + //添加 + elementData[size ++] = o; + } + + public void add(int index, Object o){ + + //检查是否越界 + rangeCheck(index); + // 进行扩容检查 + ensureCapacity(size + 1); + // 对数组进行复制处理,目的就是空出index的位置插入element,并将index后的元素位移一个位置 + System. arraycopy(elementData, index, elementData, index + 1, + size - index); + // 将指定的index位置赋值为Object o + elementData[index] = o; + // 自增一位长度 + size++; + } + + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + + public Object remove(int index){ + // 数组越界检查 + rangeCheck(index); + // 取出要删除位置的元素,供返回使用 + Object oldValue = elementData[index]; + // 计算数组要复制的数量 + int numMoved = size - index - 1; + // 数组复制,就是将index之后的元素往前移动一个位置 + if (numMoved > 0) + System. arraycopy(elementData, index+1, elementData, index, + numMoved); + // 将数组最后一个元素置空(因为删除了一个元素,然后index后面的元素都向前移动了,所以最后一个就没用了),好让gc尽快回收 + // 不要忘了size减一 + elementData[--size] = null; + return oldValue; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + //内部类,实现Iterator + private class ArrayListIterator implements Iterator{ + + private int currentIndex = 0; //当前索引 + + public boolean hasNext() { + if (currentIndex >= size) { + return false; + } + return true; + } + + public Object next() { + Object object = elementData[currentIndex]; + currentIndex ++ ; + return object; + } + } + //扩容 + public void ensureCapacity( int minCapacity) { + // 当前数组的长度 + int oldCapacity = elementData .length; + // 最小需要的容量大于当前数组的长度则进行扩容 + if (minCapacity > oldCapacity) { + // 扩容 + int newCapacity = oldCapacity + (oldCapacity >> 1); + // 如果新扩容的数组长度还是比最小需要的容量小,则以最小需要的容量为长度进行扩容 + if (newCapacity < minCapacity) + newCapacity = minCapacity; + //数组复制 + Object[] elementData2 = new Object[newCapacity]; + for (int i = 0; i < oldCapacity; i++) { + elementData2[i] = elementData[i]; + } + elementData = elementData2; + } + } + //检查是否越界 + private void rangeCheck(int index){ + if (index < 0 || index >= this.size) { + throw new IndexOutOfBoundsException("index :" + index + "size :" + size); + } + } +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/BinaryTreeNode.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..ae972e30fe --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.github.FelixCJF.coding2017.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} \ No newline at end of file diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Iterator.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..6d8273d041 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.github.FelixCJF.coding2017.basic; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/LinkedList.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/LinkedList.java new file mode 100644 index 0000000000..bb321411a9 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/LinkedList.java @@ -0,0 +1,214 @@ +package com.github.FelixCJF.coding2017.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head;//头指针 + private Node last;//尾指针 + private int size = 0; + + public void add(Object o){ + addLast(o); + } + + public void add(int index , Object o){ + //检查是否越界 + checkIndex(index); + + Node indexNode = node(index); + + if (index == size) { + addLast(o); + } else { + final Node pred = indexNode.prv; + + final Node newNode = new Node(); + newNode.data = o; + newNode.next = indexNode; + newNode.prv = pred; + + indexNode.prv = newNode; + + if (pred == null) { + head = newNode; + } else { + pred.next = newNode; + } + } + size ++; + } + public Object get(int index){ + //检查是否越界 + checkIndex(index); + + Node indexNode = node(index); + + return indexNode.data; + } + public Object remove(int index){ + //检查是否越界 + checkIndex(index); + + Node indexNode = node(index); + Object element = indexNode.data; + Node pre = indexNode.prv; + Node next = indexNode.next; + + if (pre == null) { + head = next; + } else { + pre.next = next; + indexNode.prv = null; + } + + if (next == null) { + last = pre; + } else { + next.prv = pre; + indexNode.next = null; + } + + indexNode.data = null; + + size --; + + return element; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + //节点变量存放原来的头指针 + final Node oldHead = head; + //创建新的节点对象 + final Node newNode = new Node(); + newNode.data = o; + newNode.next = head; + newNode.prv = null; + //判断oldhead是否为null + if (oldHead == null) { + last = newNode; + }else { + //头指针指向新创建的节点对象 + oldHead.prv = newNode; + } + //将newNode变为头指针 + head = newNode; + size ++; + } + public void addLast(Object o){ + //节点新变量放原先的尾指针 + final Node oldLast = last; + //创建新节点,加入要添加的对象 + final Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + newNode.prv = oldLast; + if (oldLast == null) { + head = newNode; + } else { + //尾指针指向新创建的节点 + oldLast.next = newNode; + } + //newNode变为尾指针 + last = newNode; + size++; + } + public Object removeFirst(){ + //通过头指针创建头节点 + final Node hNode = head; + if (hNode == null) { + throw new NoSuchElementException(); + } + final Node next = hNode.next; + final Object element = hNode.data; + + //移除 + hNode.data = null; + hNode.next = null; + head = next; + //判断是否为尾节点 + if (next == null) { + last = null; + }else { + next.prv = null; + } + size --; + return element; + } + public Object removeLast(){ + //通过尾指针创建节点 + final Node lastNode = last; + if (lastNode == null) { + throw new NoSuchElementException(); + } + final Object element = lastNode.data; + final Node prve = lastNode.prv; + + //移除 + lastNode.data = null; + lastNode.prv = null; + last = prve; + + if (prve == null) { + head = null; + } else { + prve.next = null; + } + size --; + return element; + } + public Iterator iterator(){ + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator{ + + private Node currentNode = head;//当前节点 + + public boolean hasNext() { + if (currentNode == null) { + return false; + } + return true; + } + + public Object next() { + Object element = currentNode.data; + currentNode = currentNode.next; + return element; + } + + } + + //查找index节点,并返回该节点 + Node node(int index) { + // assert isElementIndex(index); + + if (index < (size >> 1)) { + Node x = head; + for (int i = 0; i < index; i++) + x = x.next; + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) + x = x.prv; + return x; + } + } + //检查索引 + private void checkIndex(int index){ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + } + private static class Node{ + Object data; + Node next; + Node prv; + } +} \ No newline at end of file diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/List.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/List.java new file mode 100644 index 0000000000..1bb2c68316 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/List.java @@ -0,0 +1,11 @@ +package com.github.FelixCJF.coding2017.basic; + + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + public Iterator iterator(); +} \ No newline at end of file diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Queue.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Queue.java new file mode 100644 index 0000000000..723d106595 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Queue.java @@ -0,0 +1,53 @@ +package com.github.FelixCJF.coding2017.basic; + + +public class Queue { + + private Node head;//头节点 + private Node last;//尾节点 + private int size;//记录节点 + + public void enQueue(Object o){ + //设置一个节点变量存放原先的尾节点 + final Node oldLast = last; + //创建一个新的节点 + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + //添加到队列 + if (isEmpty()) { + head = newNode; + } else { + oldLast.next = newNode; + } + //新节点变为尾节点 + last = newNode; + size ++; + } + + public Object deQueue(){ + + Object object = head.data; + + head = head.next; + + if (isEmpty()) { + last = null; + } + size --; + return object; + } + + public boolean isEmpty(){ + return head == null; + } + + public int size(){ + return size; + } + + private static class Node{ + Object data; + Node next; + } +} \ No newline at end of file diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Stack.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Stack.java new file mode 100644 index 0000000000..07b66cdff7 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Stack.java @@ -0,0 +1,34 @@ +package com.github.FelixCJF.coding2017.basic; + +import java.util.EmptyStackException; + +public class Stack { + + //存放栈内元素的容器 + private ArrayList elementData = new ArrayList(); + //记录栈内元素个数 + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (isEmpty()) { + throw new EmptyStackException(); + } + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + if (isEmpty()) { + throw new EmptyStackException(); + } + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ArrayListTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ArrayListTest.java new file mode 100644 index 0000000000..9484ce1527 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ArrayListTest.java @@ -0,0 +1,14 @@ +package com.github.FelixCJF.coding2017.basic.test; + +import org.junit.Before; + +import com.github.FelixCJF.coding2017.basic.ArrayList; + +public class ArrayListTest extends ListTest { + +/* @Before + public void setUpArrayList() { + aList = new ArrayList(); + }*/ + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/LinkedListTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/LinkedListTest.java new file mode 100644 index 0000000000..ce0c0d1c0d --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/LinkedListTest.java @@ -0,0 +1,100 @@ +package com.github.FelixCJF.coding2017.basic.test; + + + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.github.FelixCJF.coding2017.basic.ArrayList; +import com.github.FelixCJF.coding2017.basic.LinkedList; +import com.github.FelixCJF.coding2017.basic.List; + +public class LinkedListTest extends ListTest{ + + private LinkedList aLinkedList; + + @Before + public void setUpLinkedList() { + List aList = new ArrayList(); + aList = new LinkedList(); + aLinkedList = new LinkedList(); + } + + @Test + public void testAddFirst() { + aLinkedList.addFirst(5); + assertEquals(5, aLinkedList.get(0)); + + aLinkedList.addFirst(6); + assertEquals(6, aLinkedList.get(0)); + assertEquals(5, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + + @Test + public void testAddLast() { + aLinkedList.addLast("hello"); + assertEquals("hello", aLinkedList.get(0)); + + aLinkedList.addLast("world"); + assertEquals("hello", aLinkedList.get(0)); + assertEquals("world", aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + + @Test + public void testRemoveFirst() { + aLinkedList.addLast("hello"); + aLinkedList.addLast("world"); + + aLinkedList.removeFirst(); + assertEquals("world", aLinkedList.get(0)); + assertEquals(1, aLinkedList.size()); + + aLinkedList.removeFirst(); + assertEquals(0, aLinkedList.size()); + } + + @Test + public void testRemoveLast() { + aLinkedList.addFirst("world"); + aLinkedList.addFirst("hello"); + + aLinkedList.removeLast(); + assertEquals("hello", aLinkedList.get(0)); + assertEquals(1, aLinkedList.size()); + + aLinkedList.removeLast(); + assertEquals(0, aLinkedList.size()); + } + + @Test + public void testLinkedListFunctional() { + for (int i=1; i<4; i++) { + aLinkedList.add(i); // [1,2,3] + } + aLinkedList.remove(1); // [1,3] + + aLinkedList.add(1, 0); // [1,0,3] + for (int i=4; i<6; i++) { + aLinkedList.addFirst(i); // [5, 4, 1, 0, 3] + } + assertEquals(5, aLinkedList.size()); + assertEquals(5, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(0, aLinkedList.get(3)); + + aLinkedList.remove(3); // [5, 4, 1, 3] + assertEquals(3, aLinkedList.get(aLinkedList.size()-1)); + aLinkedList.removeLast(); // [5, 4, 1] + assertEquals(1, aLinkedList.get(aLinkedList.size()-1)); + aLinkedList.removeFirst(); // [4,1] + + assertEquals(4, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ListTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ListTest.java new file mode 100644 index 0000000000..b970372bbe --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ListTest.java @@ -0,0 +1,124 @@ +package com.github.FelixCJF.coding2017.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import com.github.FelixCJF.coding2017.basic.ArrayList; +import com.github.FelixCJF.coding2017.basic.Iterator; +import com.github.FelixCJF.coding2017.basic.List; + +public class ListTest { + + + //protected static List aList = new ArrayList(); + + @Test + public void testFunctional() { + List aList = new ArrayList(); + aList.add(1); + aList.add(2); + assertEquals(1, aList.get(0)); + assertEquals(2, aList.get(1)); + + aList.add(3); + aList.add(0, 5); + aList.add(2, 11); + assertEquals(5, aList.get(0)); + assertEquals(11, aList.get(2)); + + aList.add("hi"); + assertEquals("hi", aList.get(5)); + assertEquals(6, aList.size()); + + aList.remove(1); + assertEquals(11, aList.get(1)); + assertEquals(2, aList.get(2)); + + assertEquals(5, aList.size()); + } + + @Test + public void testAdd() { + List aList = new ArrayList(); + for (int i=0; i<100; i++) + aList.add(i); + assertEquals(0, aList.get(0)); + assertEquals(99, aList.get(99)); + assertEquals(44, aList.get(44)); + } + + @Test + public void testRemove() { + List aList = new ArrayList(); + aList.add(1); + aList.add(2); + aList.add(3); + int u = (Integer)aList.remove(2); + assertEquals(3, u); + assertEquals(2, aList.size()); + + aList.add(1, 5); + u = (Integer)aList.remove(0); + assertEquals(1, u); + assertEquals(5, aList.get(0)); + assertEquals(2, aList.get(1)); + assertEquals(2, aList.size()); + + aList.remove(0); + aList.remove(0); + assertEquals(0, aList.size()); + + + } + + @Test + public void testSize() { + List aList = new ArrayList(); + for (int i=0; i<10; i++) + aList.add(i*2); + assertEquals(10, aList.size()); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testException() { + List aList = new ArrayList(); + expectedEx.expect(Exception.class); + + aList.remove(1); + aList.add(3); + aList.add(2, 5); + expectedEx.expect(Exception.class); + } + + @Test + public void testIterator() { + List aList = new ArrayList(); + Iterator it = aList.iterator(); + assertEquals(false, it.hasNext()); + + aList.add(1); + aList.add(2); + aList.add(3); + + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(2, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + aList.remove(1); + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + } + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/QueueTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/QueueTest.java new file mode 100644 index 0000000000..49506c2b35 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/QueueTest.java @@ -0,0 +1,34 @@ +package com.github.FelixCJF.coding2017.basic.test; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; + +import com.github.FelixCJF.coding2017.basic.Queue; + +public class QueueTest { + private Queue queue; + + @Before + public void setUpQueue() { + queue = new Queue(); + } + + @Test + public void testQueueFunctional() { + assertEquals(true, queue.isEmpty()); + queue.enQueue(4); + queue.enQueue(2); + assertEquals(2, queue.size()); + assertEquals(false, queue.isEmpty()); + + int i = (Integer)queue.deQueue(); + assertEquals(4, i); + i = (Integer)queue.deQueue(); + assertEquals(2, i); + + assertEquals(0, queue.size()); + assertEquals(true, queue.isEmpty()); + } + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/StackTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/StackTest.java new file mode 100644 index 0000000000..6bb53571a5 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/StackTest.java @@ -0,0 +1,41 @@ +package com.github.FelixCJF.coding2017.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.github.FelixCJF.coding2017.basic.Stack; + + +public class StackTest { + + private Stack stack; + + @Before + public void setUpStack() { + stack = new Stack(); + } + + @Test + public void testStackFunctional() { + assertEquals(true, stack.isEmpty()); + stack.push(4); + stack.push(2); + assertEquals(2, stack.size()); + assertEquals(false, stack.isEmpty()); + + int i = (Integer)stack.pop(); + assertEquals(2, i); + + i = (Integer)stack.peek(); + assertEquals(4, i); + + i = (Integer)stack.pop(); + assertEquals(4, i); + + assertEquals(0, stack.size()); + assertEquals(true, stack.isEmpty()); + } + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/array/ArrayUtil.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..f60be05977 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/array/ArrayUtil.java @@ -0,0 +1,228 @@ +package com.github.FelixCJF.coding2017.coderising.array; + +import java.util.ArrayList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int array[] = new int[origin.length]; + for (int i = 0; i newArr[i+1]) { + int temp = newArr[i]; + newArr[i] = newArr[i+1]; + newArr[i + 1] = temp; + } + } + return newArr; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int newArr[] = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArr, 0, oldArray.length); + return newArr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int[] newArr; + int f1 = 0; + int f2 = 1; + int f = 0; + if (max < 2) { + return newArr = new int[0]; + } + ArrayList list = new ArrayList(); + for (int i = 2; f < max; i++) { + list.add(f2); + f = f1 + f2; + f1 = f2; + f2 = f; + } + newArr = new int[list.size()]; + for (int i = 0; i < newArr.length; i++) { + newArr[i] = (int) list.get(i); + } + return newArr; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + + ArrayList list = new ArrayList(); + + for (int i = 1; i < max; i++) { + if (isPrime(i)) { + list.add(i); + } + } + int[] newArr = new int[list.size()]; + for (int i = 0; i < newArr.length; i++) { + newArr[i] = (int) list.get(i); + } + return newArr; + } + //判断是否为素数 + private boolean isPrime(int a) { + + boolean flag = true; + + if (a < 2) {// 素数不小于2 + return false; + } else { + + for (int i = 2; i <= Math.sqrt(a); i++) { + + if (a % i == 0) {// 若能被整除,则说明不是素数,返回false + + flag = false; + break;// 跳出循环 + } + } + } + return flag; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int[] newArr; + if (max == 0) { + return newArr = new int[0]; + } + ArrayList list = new ArrayList(); + for (int i = 1; i < max; i++) { + if (isWanshu(i)) { + list.add(i); + } + } + newArr = new int[list.size()]; + for (int i = 0; i < newArr.length; i++) { + newArr[i] = (int) list.get(i); + } + return newArr; + } + //判断一个数是不是完数 + private boolean isWanshu(int n) + { + boolean flag=false; + int i,sum=0; + for(i=1;i<=n/2;i++) + { + if(n%i==0) + { + sum+=i; + } + } + if(sum==n) + { + flag=true; + } + return flag; + } + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + String string = ""; + for (int i = 0; i < array.length; i++) { + if (i == array.length - 1) { + string += array[i]; + } else { + string += array[i] + seperator; + } + } + return string; + } + + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/array/test/ArrayUtilTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/array/test/ArrayUtilTest.java new file mode 100644 index 0000000000..378e052164 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/array/test/ArrayUtilTest.java @@ -0,0 +1,148 @@ +package com.github.FelixCJF.coding2017.coderising.array.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import com.github.FelixCJF.coding2017.coderising.array.ArrayUtil; + + +public class ArrayUtilTest +{ + private ArrayUtil myArray; + @Before + public void setUp() throws Exception + { + myArray = new ArrayUtil(); + } + + @Test + public void testReverseArray() + { + int[] a = {1, 2, 1, 3, 5, 6}; + int[] b = {6, 5, 3, 1, 2, 1}; + int[] c = new int[0]; + + myArray.reverseArray(a); + assertArrayEquals(a, b); + + //对空数组进行反转 + myArray.reverseArray(c); + assertArrayEquals(c, new int[0]); + } + + @Test + public void testRemoveZero() + { + int[] oldArr= {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 1, 2, 0, 5}; + int b[] = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 1, 2, 5}; + int[] c = myArray.removeZero(oldArr); + assertArrayEquals(b, c); + + int[] d = new int[0]; + assertArrayEquals(d, new int[0]); + } + + @Test + public void testMerge() + { + int a1[] = {1, 2, 3, 4, 5}; + int b1[] = {3, 4, 5, 6, 7, 8}; + int c1[] = {1, 2, 3, 4, 5, 6, 7, 8}; + int[] newArray1 = myArray.merge(a1, b1); + assertArrayEquals(c1, newArray1); + + int a2[] = new int[0]; + int b2[] = {0, 2, 3, 6, 7, 8}; + int c2[] = {0, 2, 3, 6, 7, 8}; + int[] newArray2 = myArray.merge(a2, b2); + assertArrayEquals(c2, newArray2); + + int a3[] = {0, 2, 3, 6, 7, 8}; + int b3[] = new int[0]; + int c3[] = {0, 2, 3, 6, 7, 8}; + int[] newArray3 = myArray.merge(a3, b3); + assertArrayEquals(c3, newArray3); + + int[] a4 = new int[0]; + int[] b4 = new int[0]; + int[] newArray4 = myArray.merge(a4, b4); + assertArrayEquals(new int[0], newArray4); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + @Test + public void testGrow() + { + int[] a = {3, 5, 7, 8, 9}; + int[] b = {3, 5, 7, 8, 9, 0, 0, 0}; + int[] newArray = myArray.grow(a, 3); + assertArrayEquals(b, newArray); + + // size < 0 抛出异常 + expectedEx.expect(Exception.class); + int[] newArray1 = myArray.grow(a, -3); + assertArrayEquals(b, newArray1); + + } + + @Test + public void testFibonacci() + { + //max == 1时返回空数组 + int[] array1 = myArray.fibonacci(1); + int[] b = new int[0]; + assertArrayEquals(array1, b); + + + int[] array2= myArray.fibonacci(35); + int[] c = {1, 1, 2, 3, 5, 8, 13, 21, 34 }; + assertArrayEquals(c, array2); + } + + @Test + public void testGetPrimes() + { + int[] a = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 }; + int[] array1 = myArray.getPrimes(35); + assertArrayEquals(a, array1); + + //max <= 2的时候没有素数,数组为空数组 new int[0] + int[] array2 = myArray.getPrimes(1); + int[] b = new int[0]; + assertArrayEquals(array2, b); + } + + @Test + public void testGetPerfectNumbers() + { + int[] array = myArray.getPerfectNumbers(10000); + int[] a = {6, 28, 496, 8128 }; + assertArrayEquals(a, array); + } + + @Test + public void testJoin() + { + int[] Array0 = {3, 5, 7, 8, 9}; + String s0 = myArray.join(Array0, "-"); + String s1 = "3-5-7-8-9"; + assertEquals(s1, s0); + + int[] Array1 = {3}; + String s2 = myArray.join(Array1, "-"); + String s3 = "3"; + assertEquals(s2, s3); + + //传递空数组时,返回空数组 + int[] Array2 = new int[0]; + String s4 = myArray.join(Array2, "-"); + String s5 = ""; + assertEquals(s4, s5); + } + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/LoginAction.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/Struts.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..85e2e22de3 --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/Struts.java @@ -0,0 +1,34 @@ +package com.coderising.litestruts; + +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/StrutsTest.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/View.java b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/struts.xml b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..a6cfe43e6c --- /dev/null +++ b/group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyArrayList.java b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyArrayList.java new file mode 100644 index 0000000000..0063bd832d --- /dev/null +++ b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyArrayList.java @@ -0,0 +1,83 @@ +package com.github.lhpmatlab.coding2017.basic; + +/** + * Created by andy on 2017/2/18. + */ +public class MyArrayList { + + private Object[] initialArray = {}; + private Object[] dataArray; + private int initSize = 10; + private int arraySize; + public MyArrayList() { + dataArray = initialArray; + } + + public MyArrayList(int init) { + dataArray = new Object[init]; + } + + public void ensureCapacity(int newCapacity) { + if (newCapacity < arraySize) + return; + + Object[] old = dataArray; + dataArray = new Object[newCapacity]; + for (int i = 0; i < size(); i++) { + dataArray[i] = old[i]; + } + } + + public void add(T element) { + add(size(), element); + } + + public void add(int index, T element) { + if (size() == dataArray.length) { + ensureCapacity(size()*2 + 1); + } + for(int i=arraySize;i>index;i--) { + dataArray[i] = dataArray[i - 1]; + } + dataArray[index] = element; + arraySize++; + } + + public T delete(int index) { + if (index < 0 || index > arraySize) { + throw new ArrayIndexOutOfBoundsException(); + } + T removeElement = (T)dataArray[index]; + for (int i = index; i < size() -1; i++) { + dataArray[i] = dataArray[i + 1]; + } + arraySize--; + return removeElement; + } + + public T get(int index) { + if (index < 0 || index > arraySize) { + throw new ArrayIndexOutOfBoundsException(); + } + return (T)dataArray[index]; + } + + public T set(int index, T newElement) { + if (index < 0 || index > arraySize) { + throw new ArrayIndexOutOfBoundsException(); + } + T oldElement = (T) dataArray[index]; + dataArray[index] = newElement; + + return oldElement; + } + + public int size() { + return arraySize; + } + + public boolean isEmpty() { + return size() == 0; + } + +} diff --git a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyLinkedList.java b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyLinkedList.java new file mode 100644 index 0000000000..eaba26e23f --- /dev/null +++ b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyLinkedList.java @@ -0,0 +1,119 @@ +package com.github.lhpmatlab.coding2017.basic; + +/** + * Created by andy on 2017/2/18. + */ +public class MyLinkedList { + private class Node { + public Node pre; + public Node next; + public T data; + + public Node(Node pre,Node next,T data) { + this.pre = pre; + this.next = next; + this.data = data; + } + } + + private int dataSize; + + private Node head; + private Node tail; + + public MyLinkedList() { + head = new Node(null,null,null); + tail = new Node(head, null, null); + head.next = tail; + dataSize = 0; + } + + public void add(T t) { +// add(size(), t); + Node newNode = new Node<>(null, tail, t); + newNode.pre = tail.pre; + tail.pre.next = newNode; + tail.pre = newNode; + dataSize++; + + } + + /** + * 根据索引添加没有实现 + * @param index + * @param element + */ + public void add(int index,T element) { + //TODO 根据索引添加元素 +// addBefore(getNode(index,0,size()-1),element); +// if (index == dataSize) { +// add(element); +// } else { + // +// } + } + + public T get(int index) { + return getNode(index).data; + } + + public T set(int index, T newValue) { + Node node = getNode(index); + T oldData = node.data; + node.data = newValue; + return oldData; + } + + public T remove(int index) { + Node node = getNode(index); + node.next.pre = node.pre; + node.pre.next = node.next; + dataSize--; + + return node.data; + + } + + private void addBefore(Node node, T element) { +// newNode.pre.next = newNode; +// node.pre = newNode; + Node pre = node.pre; + Node newNode = new Node<>(node.pre, node, element); + node.pre = newNode; + pre.next = newNode; + + dataSize++; + } + + private Node getNode(int index) { + return getNode(index, 0, size()); + } + + private Node getNode(int index, int lower, int upper) { + Node p; + if (index < lower || index > upper) { + throw new IndexOutOfBoundsException(); + } + + if (index < size() / 2) { + p = head.next; + for (int i = 0; i < index; i++) { + p = p.next; + } + } else { + p = tail.pre; + for (int i = size()-1; i > index; i--) { + p = p.pre; + } + } + return p; + } + + public int size() { + return dataSize; + } + + public boolean isEmpty() { + return size() == 0; + } +} diff --git a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyQueue.java b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyQueue.java new file mode 100644 index 0000000000..fe0d2a671c --- /dev/null +++ b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyQueue.java @@ -0,0 +1,29 @@ +package com.github.lhpmatlab.coding2017.basic; + +/** + * Created by andy on 2017/2/22. + */ +public class MyQueue { + private MyLinkedList link = new MyLinkedList<>(); + + public void enQueue(T t) { + link.add(t); + } + + public T deQueue() { + if (size() <= 0) { + return null; + } + T t = link.get(0); + link.remove(0); + return t; + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return link.size(); + } +} diff --git a/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyStack.java b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyStack.java new file mode 100644 index 0000000000..7c3628f0d6 --- /dev/null +++ b/group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyStack.java @@ -0,0 +1,30 @@ +package com.github.lhpmatlab.coding2017.basic; + +/** + * Created by andy on 2017/2/22. + */ +public class MyStack { + private MyArrayList list = new MyArrayList<>(); + + public void push(T t) { + list.add(t); + } + + public T pop() { + if (size() <= 0) { + throw new IndexOutOfBoundsException(); + } + return list.delete(size() - 1); + } + + public T peek() { + return list.get(size() - 1); + } + + public boolean isEmpty() { + return list.size() == 0; + } + public int size() { + return list.size(); + } +} diff --git a/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyArrayListTest.java b/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyArrayListTest.java new file mode 100644 index 0000000000..8ea20d1675 --- /dev/null +++ b/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyArrayListTest.java @@ -0,0 +1,113 @@ +package com.github.lhpmatlab.coding2017.basic; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; + +public class MyArrayListTest { + private MyArrayList list; + + @Before + public void init(){ + list = new MyArrayList<>(); + } + + @Test + public void testEnsureCapacity() { + assertEquals("init list size is 0 ", list.size(), 0); + list.add("1"); + list.ensureCapacity(10); + assertEquals("ensureCapacity size is 10 ", list.size(),1); + } + + /** + * 在列表的末尾添加元素 + */ + @Test + public void testAddT() { + assertEquals("init list size is 0 ", list.size(), 0); + list.add("1"); + list.add("2"); + assertEquals("add list size ", list.size(), 2); + for (int i=0; i +* @since
���� 26, 2017
+* @version 1.0 +*/ +public class MyLinkedListTest { + private MyLinkedList linkedList; + + @Before + public void before() throws Exception { + linkedList = new MyLinkedList<>(); + } + + @After + public void after() throws Exception { + } + + /** + * + * Method: add(T t) + * + */ + @Test + public void testAddT() throws Exception { + assertEquals("init list size is 0 ", linkedList.size(), 0); + linkedList.add("1"); + linkedList.add("2"); + assertEquals("add list size ", linkedList.size(), 2); + for (int i=0; i +* @since
���� 26, 2017
+* @version 1.0 +*/ +public class MyQueueTest { + private MyQueue queue; + + @Before + public void init() throws Exception { + queue = new MyQueue<>(); + } + + /** + * + * Method: enQueue(T t) + * + */ + @Test + public void testEnQueue() throws Exception { + queue.enQueue("1"); + assertEquals("size ", queue.size(), 1); + } + + /** + * + * Method: deQueue() + * + */ + @Test + public void testDeQueue() throws Exception { + queue.enQueue("1"); + queue.enQueue("2"); +// queue.deQueue(); + assertEquals("dequeue element ",queue.deQueue(),"1"); + assertEquals("size ", queue.size(), 1); + + } + + /** + * + * Method: isEmpty() + * + */ + @Test + public void testIsEmpty() throws Exception { + assertEquals("isEmpty method",queue.isEmpty(),true); + } + + /** + * + * Method: size() + * + */ + @Test + public void testSize() throws Exception { + queue.enQueue("1"); + queue.enQueue("2"); + assertEquals("size method", queue.size(),2); + } + + +} diff --git a/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyStackTest.java b/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyStackTest.java new file mode 100644 index 0000000000..a90af5d720 --- /dev/null +++ b/group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyStackTest.java @@ -0,0 +1,104 @@ +package com.github.lhpmatlab.coding2017.basic; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import static org.junit.Assert.*; + +/** +* MyStack Tester. +* +* @author +* @since
���� 26, 2017
+* @version 1.0 +*/ +public class MyStackTest { + + MyStack stack; + + + @Before + public void init() throws Exception { + stack = new MyStack<>(); + } + + @After + public void after() throws Exception { + } + + /** + * + * Method: push(T t) + * + */ + @Test + public void testPush() throws Exception { + assertEquals("init stack ", stack.size(), 0); + stack.push("1"); + assertEquals("pust stack ", stack.size(),1); + } + + /** + * + * Method: pop() + * + */ + @Test + public void testPop() throws Exception { + assertEquals("init stack ", stack.size(), 0); + stack.push("1"); + stack.push("2"); + stack.pop(); + assertEquals("after pop ",stack.size(),1); + } + + /** + * + * Method: peek() + * + */ + @Test + public void testPeek() throws Exception { + assertEquals("init stack ", stack.size(), 0); + stack.push("1"); + stack.push("2"); + assertEquals("peek ", stack.peek(),"2"); + } + + /** + *测试判空方法 + * Method: isEmpty() + * + */ + @Test + public void testIsEmpty() throws Exception { + assertEquals("stack is empty ", stack.isEmpty(), true); + } + + /** + *测试判空方法,不为空的情况 + * Method: isEmpty() + * + */ + @Test + public void testIsNotEmpty() throws Exception { + stack.push("1"); + assertEquals("stack is empty ", stack.isEmpty(), false); + } + + /** + * + * Method: size() + * + */ + @Test + public void testSize() throws Exception { + assertEquals("init stack ", stack.size(), 0); + stack.push("1"); + stack.push("2"); + assertEquals("size is 2", stack.size(), 2); + } + + +} diff --git a/group02/527705641/.gitignore b/group02/527705641/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group02/527705641/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group02/527705641/src/com/github/fei9009/coderising0226/array/ArrayUtil.java b/group02/527705641/src/com/github/fei9009/coderising0226/array/ArrayUtil.java new file mode 100644 index 0000000000..123ed5bfcf --- /dev/null +++ b/group02/527705641/src/com/github/fei9009/coderising0226/array/ArrayUtil.java @@ -0,0 +1,218 @@ +package com.github.fei9009.coderising0226.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import com.sun.org.apache.bcel.internal.generic.ISTORE; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int i = 0, j = origin.length-1; + while(i < j){ + int tmp = origin[i]; + origin[i] = origin[j]; + origin[j] = tmp; + i++; + j--; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + if (oldArray == null || oldArray.length == 0){ + return oldArray; + } + int count = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + count++; + } + } + int[] newArray = new int[count]; + int j = 0; + for (int i = 0; i <= oldArray.length - 1; i++) { + if (oldArray[i] == 0) { + continue; + } + newArray[j++] = oldArray[i]; + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + if (array1 == null && array2 == null) { + return null; + } + if (array1 == null) { + return array2; + } + if (array2 == null) { + return array1; + } + int i=0, j=0, k=0; + int len1 = array1.length; + int len2 = array2.length; + int[] mergeArr = new int[len1+len2]; + while(true){ + if(i == len1 || j == len2) + break; + if(array1[i]array2[j]){ + mergeArr[k++] = array2[j++]; + }else{ + mergeArr[k++] = array1[i++]; + j++; + } + } + + for(;i list = new ArrayList<>(); + int f1 = 1, f2 = 1, f3; + list.add(f1); + list.add(f2); + while (f1 +f2 < max) { + f3 = f1 + f2; + list.add(f3); + f1 = f2; + f2 = f3; + } + int[] result = new int[list.size()]; + int j = 0; + for(Integer i : list) { + result[j++] = i; + } + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int[] a = new int[max]; + int k=0; + for (int z = 1; ztype){ + try { + Method met = obj.getClass().getMethod("set" + initStr(att), type); + met.invoke(obj, value); + }catch (Exception e){ + e.printStackTrace(); + } + } + + private static String getter(Object obj, String att){ + try { + Method met = obj.getClass().getMethod("get" + initStr(att)); + return (String)met.invoke(obj); + }catch (Exception e){ + e.printStackTrace(); + } + return null; + } + private static String initStr(String name) { + name = name.substring(0, 1).toUpperCase() + name.substring(1); + return name; + } + + private static String toLowerString(String name) { + name = name.substring(0, 1).toLowerCase() + name.substring(1); + return name; + } + + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + SAXReader saxReader = new SAXReader(); + try { + Document document = saxReader.read(new File("struts.xml")); + Element root = document.getRootElement(); + + + boolean flag = false; + String className = ""; + Element action = null; + for (Iterator iter = root.elementIterator(); iter.hasNext();) + { + Element e = (Element) iter.next(); + if(e.attributeValue("name").equals(actionName)){ + flag = true; + className = e.attributeValue("class"); + action = e; + break; + } + } + if(!flag) + throw new Exception(actionName+"未定义"); + + Class clz = Class.forName(className); + Constructor c = clz.getConstructor(); + Object obj = c.newInstance(); + + for (String in : parameters.keySet()) { + setter(obj,in,parameters.get(in), String.class); + } + Method exc = clz.getDeclaredMethod("execute"); + String res = (String)exc.invoke(obj); + + //获取所有getter方法 + //Get the methods + Method[] methods = clz.getDeclaredMethods(); + //Loop through the methods and print out their names + Map params = new HashMap(); + + for (Method method : methods) { + String name = method.getName(); + if(name.substring(0,3).equals("get")){ + params.put(toLowerString(name.substring(3)),getter(obj,toLowerString(name.substring(3)))); + } + } + View view = new View(); + view.setParameters(params); + //step 4 + flag = false; + Element result = null; + List actionChildList = action.elements("result"); + for (Iterator iter = action.elementIterator(); iter.hasNext();){ + Element e = (Element) iter.next(); + if(e.attributeValue("name").equals(res)){ + flag = true; + result = e; + break; + } + } + if(!flag) + throw new Exception(res+"undefined"); + view.setJsp(result.getText()); + return view; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/group02/527705641/src/com/github/fei9009/coderising0226/litestruts/StrutsTest.java b/group02/527705641/src/com/github/fei9009/coderising0226/litestruts/StrutsTest.java new file mode 100644 index 0000000000..e8dee13d47 --- /dev/null +++ b/group02/527705641/src/com/github/fei9009/coderising0226/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.github.fei9009.coderising0226.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group02/527705641/src/com/github/fei9009/coderising0226/litestruts/View.java b/group02/527705641/src/com/github/fei9009/coderising0226/litestruts/View.java new file mode 100644 index 0000000000..fa5cf8af6d --- /dev/null +++ b/group02/527705641/src/com/github/fei9009/coderising0226/litestruts/View.java @@ -0,0 +1,23 @@ +package com.github.fei9009.coderising0226.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group02/527705641/src/com/github/fei9009/coderising0226/litestruts/struts.xml b/group02/527705641/src/com/github/fei9009/coderising0226/litestruts/struts.xml new file mode 100644 index 0000000000..8ced26f89f --- /dev/null +++ b/group02/527705641/src/com/github/fei9009/coderising0226/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayList.java b/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayList.java new file mode 100644 index 0000000000..bbfd01a52e --- /dev/null +++ b/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayList.java @@ -0,0 +1,71 @@ +package com.github.fei9009.coding2017.basic; + +public class ArrayList implements List { + + private int size = 0; + private int capacity; + + private Object[] elementData = new Object[100]; + + public ArrayList() { + this.capacity = 20; + } + + private void extend() { + Object[] updatedElementData = new Object[this.elementData.length + this.capacity]; + System.arraycopy(this.elementData, 0, updatedElementData, 0, this.elementData.length); + this.elementData = updatedElementData; + } + + public void add(Object o){ + if (this.size == elementData.length) { + extend(); + } + elementData[size] = o; + this.size++; + } + + public void add(int index, Object o){ + if (this.size == elementData.length) { + extend(); + } + int i; + for (i = this.size - 1; i >= index; i--) { + this.elementData[i + 1] = this.elementData[i]; + } + this.elementData[i + 1] = o; + this.size++; + } + + public Object get(int index){ + if (index >= 0 && index < this.size) { + return this.elementData[index]; + }else { + return null; + } + } + + public Object remove(int index){ + if (index >= 0 && index < this.size) { + int i = 0; + Object deletedElement = this.elementData[index]; + for (i = index + 1; i < this.size; i++) { + this.elementData[i - 1] = this.elementData[i]; + } + this.elementData[i] = null; + this.size--; + return deletedElement; + }else { + return null; + } + } + + public int size(){ + return this.size; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayListTest.java b/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayListTest.java new file mode 100644 index 0000000000..6729460f06 --- /dev/null +++ b/group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayListTest.java @@ -0,0 +1,55 @@ +package com.github.fei9009.coding2017.basic; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class ArrayListTest { + + private static ArrayList testArray = new ArrayList(); + @Before + public void setUp() throws Exception { + //testArray.clear(); + } + + @Test + public void testArrayList() { + //fail("Not yet implemented"); + } + + @Test + public void testAddObject() { + testArray.add(10); + assertEquals(10, testArray.get(0)); + //fail("Not yet implemented"); + } + + @Test + public void testAddIntObject() { + testArray.add(10); + testArray.add(0, 3); + testArray.add(0, 2); + assertEquals(3, testArray.get(1)); + assertEquals(2, testArray.get(0)); + //fail("Not yet implemented"); + } + + @Test + public void testGet() { + testArray.add(10); + assertEquals(10, testArray.get(0)); + //fail("Not yet implemented"); + } + + @Test + public void testRemove() { + fail("Not yet implemented"); + } + + @Test + public void testSize() { + fail("Not yet implemented"); + } + +} diff --git a/group02/527705641/src/com/github/fei9009/coding2017/basic/BinaryTreeNode.java b/group02/527705641/src/com/github/fei9009/coding2017/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..4496ba859d --- /dev/null +++ b/group02/527705641/src/com/github/fei9009/coding2017/basic/BinaryTreeNode.java @@ -0,0 +1,57 @@ +package com.github.fei9009.coding2017.basic; + +public class BinaryTreeNode > { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Object o) { + data = o; + left = null; + right = null; + } + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + BinaryTreeNode node = new BinaryTreeNode(o); + boolean left = true; + BinaryTreeNode cur = this; + BinaryTreeNode pre = null; + while (cur != null) { + pre = cur; + if (node.getData().compareTo(cur.getData()) <= 0) { + cur = cur.left; + left = true; + } else { + cur = cur.right; + left = false; + } + } + if(left) { + pre.left = node; + } else { + pre.right = node; + } + return node; + } + +} diff --git a/group02/527705641/src/com/github/fei9009/coding2017/basic/Iterator.java b/group02/527705641/src/com/github/fei9009/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..b67d7d7482 --- /dev/null +++ b/group02/527705641/src/com/github/fei9009/coding2017/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.github.fei9009.coding2017.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group02/527705641/src/com/github/fei9009/coding2017/basic/LinkedList.java b/group02/527705641/src/com/github/fei9009/coding2017/basic/LinkedList.java new file mode 100644 index 0000000000..f5e1fde68d --- /dev/null +++ b/group02/527705641/src/com/github/fei9009/coding2017/basic/LinkedList.java @@ -0,0 +1,91 @@ +package com.github.fei9009.coding2017.basic; + +public class LinkedList implements List { + + private Node head; + private int size; + + public void add(Object o){ + add(size, o); + } + + public void add(int index , Object o){ + if (index > this.size || index < 0) { + throw new IndexOutOfBoundsException("index " + index + "beyond the size " + size ); + } + Node dummy = node(index); + Node newNode = new Node(o); + newNode.next = dummy; + if (index == 0) { + head = newNode; + } + else { + Node before = node(index-1); + before.next = newNode; + } + this.size++; + + } + + public Object get(int index){ + if (index >= this.size || index < 0) { + throw new IndexOutOfBoundsException("index " + index + "beyond the size " + size ); + } + Node node = node(index); + return node.data; + + } + public Object remove(int index){ + if (index >= this.size || index < 0) { + throw new IndexOutOfBoundsException("index " + index + "beyond the size " + size ); + } + Node delNode = node(index); + if (index == 0) + head = delNode.next; + else { + Node before = node(index-1); + before.next = delNode.next; + } + size--; + return delNode.data; + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + add(0, o); + } + public void addLast(Object o){ + add(o); + } + public Object removeFirst(){ + return remove(0); + } + + public Object removeLast(){ + return remove(this.size -1); + } + public Iterator iterator(){ + return null; + } + + Node node(int index) { + Node x = head; + for (int i=0; i + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/array/ArrayUtil.java b/group02/562768642/src/com/github/orajavac/coding2017/array/ArrayUtil.java new file mode 100644 index 0000000000..0a251b9aac --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/array/ArrayUtil.java @@ -0,0 +1,234 @@ +package com.github.orajavac.coding2017.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int temp; + int c=origin.length; + for (int i=0,j=origin.length-1;itarget[j+1]){ + t=target[j]; + target[j]=target[j+1]; + target[j+1]=t; + } + } + return removeZero(target); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] target = new int[size]; + for (int i=0;ielementData.length) + grow(elementData,size); + Object temp = null; + int len=elementData.length; + for (int i=0;iindex){ + temp=elementData[i]; + elementData[i]=old; //[4]=c + old=temp; + } + } + } + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + if (index==elementData.length-1){ //删除最后一个索引元素里的值 + elementData[index]=null; + }else{ + elementData[index]=null; + int len=elementData.length; + for (int i=0;iindex){ + if(i+1!=len){ + elementData[i]=elementData[i+1]; + }else{ //我们假设数组索引 0-3,那么数组长度是4,3+1==4,elementData[i+1]会报错 + elementData[i]=null; + } + } + } + } + return null; + } + + public int size(){ + size=0; + for (int i=0;i "); + c=c.next; + } + System.out.println(); + } + public Iterator iterator(){ + LinkedList l = new LinkedList(); + l.head=this.head; + return l; + } + + public boolean hasNext(){ + current = head; + if (current!=null){ + head = current.next; + return true; + } + return false; + } + + public Object next(){ + return current.data; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/List.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/List.java new file mode 100644 index 0000000000..56bade55ae --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/List.java @@ -0,0 +1,9 @@ +package com.github.orajavac.coding2017.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/Queue.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/Queue.java new file mode 100644 index 0000000000..3a3b9fbe5a --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/Queue.java @@ -0,0 +1,34 @@ +package com.github.orajavac.coding2017.basic; + +public class Queue { + +private ArrayList elementData = new ArrayList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + Object obj = elementData.get(0); + elementData.remove(0); + return obj; + } + + public ArrayList getElementData() { + return elementData; + } + + public void setElementData(ArrayList elementData) { + this.elementData = elementData; + } + + public boolean isEmpty(){ + if (elementData.size()>0) + return true; + return false; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/Stack.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/Stack.java new file mode 100644 index 0000000000..658cea3ad1 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/Stack.java @@ -0,0 +1,49 @@ +package com.github.orajavac.coding2017.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + int s=elementData.size(); + Object obj = null; + for (int i=s-1;i>=0;i--){ + if(elementData.get(i)!=null){ + obj = elementData.get(i); + elementData.remove(i); + break; + } + } + return obj; + } + + public Object peek(){ + int s=elementData.size(); + Object obj = null; + for (int i=s-1;i>=0;i--){ + if(elementData.get(i)!=null){ + obj = elementData.get(i); + break; + } + } + return obj; + } + public boolean isEmpty(){ + if (elementData.size()>0) + return true; + return false; + } + public int size(){ + return elementData.size(); + } + public ArrayList getElementData() { + return elementData; + } + + public void setElementData(ArrayList elementData) { + this.elementData = elementData; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/litestructs/LoginAction.java b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/LoginAction.java new file mode 100644 index 0000000000..eb6e7291c5 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/LoginAction.java @@ -0,0 +1,43 @@ +package com.github.orajavac.coding2017.litestructs; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public void setMessage(String message) { + this.message = message; + } + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/litestructs/Struts.java b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/Struts.java new file mode 100644 index 0000000000..23e5c41049 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/Struts.java @@ -0,0 +1,99 @@ +package com.github.orajavac.coding2017.litestructs; + +import java.beans.PropertyDescriptor; +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.List; +import java.util.Iterator; + +import org.dom4j.Attribute; +import org.dom4j.Element; +import org.dom4j.Document; +import org.dom4j.io.SAXReader; + + +public class Struts { + + private static Map xmlMap = new HashMap(); + + public static View runAction(String actionName, Map parameters) { + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + try{ + if(xmlMap.size()==0) + Struts.DOM4jParserXml(); + + StrutsXml sx = xmlMap.get(actionName); + Class clz = Class.forName(sx.getClassz()); + Object o = clz.newInstance(); + String key = null; + Method[] mets = clz.getDeclaredMethods(); + for (Method m : mets){ + if(m.getName().startsWith("set")){ + key = m.getName().substring(3,m.getName().length()).toLowerCase(); + m.invoke(o,parameters.get(key)); + } + } + Method m1 = clz.getDeclaredMethod("execute"); + String result = (String)m1.invoke(o); + Map param = new HashMap(); + Field[] fields = clz.getDeclaredFields(); + for(int i=0;i iterator = root.elementIterator(); + while(iterator.hasNext()){ + Element e = iterator.next(); + StrutsXml sx = new StrutsXml(); + sx.setName(e.attribute("name").getValue()); + sx.setClassz(e.attribute("class").getValue()); + xmlMap.put(e.attribute("name").getValue(), sx); + Iterator r = e.elementIterator("result"); + while(r.hasNext()){ + Element child = r.next(); + sx.getResult().put(child.attribute("name").getValue(), child.getTextTrim()); + } + } + }catch(Exception e){ + e.printStackTrace(); + } + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/litestructs/StrutsTest.java b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/StrutsTest.java new file mode 100644 index 0000000000..986b4d01ee --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/StrutsTest.java @@ -0,0 +1,43 @@ +package com.github.orajavac.coding2017.litestructs; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/litestructs/StrutsXml.java b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/StrutsXml.java new file mode 100644 index 0000000000..46c50d60e4 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/StrutsXml.java @@ -0,0 +1,28 @@ +package com.github.orajavac.coding2017.litestructs; + +import java.util.HashMap; +import java.util.Map; + +public class StrutsXml { + private String name; + private String classz; + private Map result = new HashMap(); + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getClassz() { + return classz; + } + public void setClassz(String classz) { + this.classz = classz; + } + public Map getResult() { + return result; + } + public void setResult(Map result) { + this.result = result; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/litestructs/View.java b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/View.java new file mode 100644 index 0000000000..9436803c96 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/View.java @@ -0,0 +1,23 @@ +package com.github.orajavac.coding2017.litestructs; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/litestructs/struts.xml b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/struts.xml new file mode 100644 index 0000000000..de099d1603 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/litestructs/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group02/609990377/DataStructure/.gitignore b/group02/609990377/DataStructure/.gitignore new file mode 100644 index 0000000000..fa968c2f2b --- /dev/null +++ b/group02/609990377/DataStructure/.gitignore @@ -0,0 +1,3 @@ +/bin/ +.classpath +.project diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/ArrayUtil.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/ArrayUtil.java new file mode 100644 index 0000000000..cc4bbb376c --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/ArrayUtil.java @@ -0,0 +1,294 @@ +package com.github.congcongcong250.coding2017.basic; + +import java.util.Arrays; +import java.util.ArrayList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + + int[] copy = origin.clone(); + int j, last = copy.length - 1; + + for (int i = last; i >= 0; i--) { + j = last - i; + origin[i] = copy[j]; + } + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + /* + * Method 1, traverse oldArray and count non-zero value, create new + * int[count], traverse again oldArray and insert to new one + */ + + /* + * Method 2, traverse olArray and insert non-zero value to an List, + * then List.toArray(). + */ + + // Method 3 + if(oldArray == null){ + return null; + } + int[] tmp = new int[oldArray.length]; + int count = 0; + + for (int v : oldArray) { + if (v != 0) { + tmp[count] = v; + count++; + } + } + + return Arrays.copyOf(tmp, count); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + if (array1 == null) { + if (array2 == null) { + return null; + } + return array2; + } else if (array2 == null) { + return array1; + } + + int l1 = array1.length, l2 = array2.length; + int[] whole = new int[l1 + l2]; + + int dupValue = 0; + int dupCount = 0; + boolean isDup = false; + + int j = 0; + // Traverse array1 + for (int i = 0; i < l1; i++) { + + // Get rid of duplicate value in array1 + if (isDup) { + if (array1[i] == dupValue) { + dupCount++; + continue; + } else { + isDup = false; + } + } + + while (j < l2) { + if (array1[i] > array2[j]) { + // If int from array1 is larger, add int from array2 first + whole[i + j - dupCount] = array2[j]; + j++; + continue; + } else if (array1[i] == array2[j]) { + // If equals, skip int from array2, and set duplicate value + isDup = true; + dupValue = array1[i]; + dupCount++; + j++; + continue; + } else if (array1[i] < array2[j]) { + // If smaller, break and add from in array1 + break; + } + } + whole[i + j - dupCount] = array1[i]; + } + + // Deal with left over in array2 + while (j < l2) { + whole[l1 + j - dupCount] = array2[j]; + j++; + } + + return Arrays.copyOf(whole, l1 + l2 - dupCount); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + checkGrowSize(size); + if (oldArray == null) { + return null; + } + int newlength = oldArray.length + size; + int[] res = new int[newlength]; + res = Arrays.copyOf(oldArray, newlength); + + return res; + } + + private void checkGrowSize(int size) { + if (size < 0) { + throw new IndexOutOfBoundsException( + "Negative size is not allowed in grow()"); + } + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max <= 1) { + return new int[0]; + } + + // Fib(47) == 2971215073 > INT_MAX; + int[] tmp = new int[46]; + tmp[0] = 1; + tmp[1] = 1; + + int next = 1 + 1; + int i = 1; + while (next < max) { + i++; + tmp[i] = next; + next = tmp[i] + tmp[i - 1]; + } + + return Arrays.copyOf(tmp, i + 1); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + if (max <= 2) { + return new int[0]; + } + + ArrayList primeList = new ArrayList(); + primeList.add(2); + + for (int candidate = 3; candidate < max; candidate += 2) { + // For every number smaller than max + int ceiling = (int) Math.floor(Math.sqrt(candidate)); + for (Integer prime : primeList) { + // Divided by every prime number smaller than sqrt(candidate) + if (candidate % prime == 0) { + // When reminder equals 0, candidate is not a prime + break; + } + if (prime > ceiling) { + // When every prime number <= sqrt(candidate), add candidate to primelist + primeList.add(candidate); + break; + } + } + } + + // Transfer primelist to int array + int[] res = arrayFromList(primeList); + + return res; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + if (max <= 2) { + return new int[0]; + } + + ArrayList perfectList = new ArrayList(); + + for (int candidate = 2; candidate < max; candidate++) { + int sum = 1; + int ceiling = (int) Math.floor(Math.sqrt(candidate)); + if (Math.sqrt(candidate) == ceiling) { + sum += ceiling; + } + // For each number smaller than max + for (int divisor = 2; divisor <= ceiling; divisor++) { + if (candidate % divisor == 0) { + sum += divisor; + sum += candidate / divisor; + } + if (sum > candidate) { + break; + } + } + if (sum == candidate) { + perfectList.add(candidate); + } + } + + // Transfer primelist to int array + int[] res = arrayFromList(perfectList); + + return res; + } + + private int[] arrayFromList(ArrayList list) { + int[] r = new int[list.size()]; + int j = 0; + for (Integer v : list) { + r[j++] = v; + } + return r; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + String res = ""; + if (array == null || array.length == 0) { + return res; + } + res += array[0]; + for (int i = 1; i < array.length; i++) { + res += seperator + array[i]; + } + return res; + } + +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WArrayList.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WArrayList.java new file mode 100644 index 0000000000..26c2dd5ab7 --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WArrayList.java @@ -0,0 +1,113 @@ +package com.github.congcongcong250.coding2017.basic; + +import java.util.Arrays; +import java.util.InputMismatchException; +import java.util.NoSuchElementException; + +public class WArrayList implements WList { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + public void add(Object o){ + + //check size limit + if(size + 1 > elementData.length){ + int newlength = elementData.length * 3 / 2 + 1; + elementData = Arrays.copyOf(elementData, newlength); + } + + elementData[size++] = o; + } + + public void add(int index, Object o){ + //index Check + checkIndex(index); + + //check size limit + if(size + 1 > elementData.length){ + int newlength = elementData.length * 3 / 2 + 1; + elementData = Arrays.copyOf(elementData, newlength); + } + + for(int i = ++size; i >= index; i-- ){ + elementData[i] = elementData[i-1]; + } + + elementData[index] = o; + + + } + + public Object get(int index){ + //index Check + checkIndex(index); + + return elementData[index]; + } + + public Object remove(int index){ + //index Check + checkIndex(index); + + Object old = elementData[index]; + for(int i = index; i < size-1 ; i++ ){ + elementData[i] = elementData[i+1]; + } + elementData[--size] = null; + return old; + } + + public int size(){ + return size; + } + + public WIterator wIterator(){ + return new Itr(); + } + + public void clear(){ + elementData = new Object[10]; + size = 0; + } + + private void checkIndex(int index){ + if(index >= size || index < 0){ + throw new IndexOutOfBoundsException("Index:"+index+" Size:"+size); + } + } + + + private class Itr implements WIterator{ + //index for next element to visit + private int cursor = 0; + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + if(cursor >= size){ + throw new NoSuchElementException(); + } + return elementData[cursor++]; + } + + @Override + public void remove() { + //Check bound + if(cursor == 0){ + throw new NoSuchElementException(); + } + + WArrayList.this.remove(--cursor); + + } + } + + + +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WBinaryTreeNode.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WBinaryTreeNode.java new file mode 100644 index 0000000000..18fe0c6242 --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WBinaryTreeNode.java @@ -0,0 +1,78 @@ +package com.github.congcongcong250.coding2017.basic; + +public class WBinaryTreeNode >{ + + private Object data; + private WBinaryTreeNode left; + private WBinaryTreeNode right; + + public WBinaryTreeNode(){ + data = null; + left = null; + right = null; + } + + public WBinaryTreeNode(Object obj){ + data = obj; + left = null; + right = null; + } + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public WBinaryTreeNode getLeft() { + return left; + } + public void setLeft(WBinaryTreeNode left) { + this.left = left; + } + public WBinaryTreeNode getRight() { + return right; + } + public void setRight(WBinaryTreeNode right) { + this.right = right; + } + + public void destroy(){ + this.data = null; + this.left = null; + this.right = null; + } + + public WBinaryTreeNode insert(Object o){ + //If is empty root + if(data == null){ + data = o; + return this; + } + + //If it is a normal root + WBinaryTreeNode in; + + if(o.compareTo(data) <= 0){ + if(left == null){ + in = new WBinaryTreeNode(o); + left = in; + }else{ + in = left.insert(o); + } + }else{ + if(right == null){ + in = new WBinaryTreeNode(o); + right = in; + }else{ + in = right.insert(o); + } + } + + assert (in == null):"Insert error"; + return in; + } + + + +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WIterator.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WIterator.java new file mode 100644 index 0000000000..d9faefd4b5 --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WIterator.java @@ -0,0 +1,8 @@ +package com.github.congcongcong250.coding2017.basic; + +public interface WIterator { + public boolean hasNext(); + public Object next(); + public void remove(); + +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WLinkedList.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WLinkedList.java new file mode 100644 index 0000000000..bac8daca4c --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WLinkedList.java @@ -0,0 +1,182 @@ +package com.github.congcongcong250.coding2017.basic; + +import java.util.NoSuchElementException; + +public class WLinkedList implements WList { + + private Node head; + private int size; + + public WLinkedList(){ + head = new Node(); + size = 0; + } + + public void add(Object o){ + addLast(o); + } + + public void add(int index , Object o){ + //Check bound + checkIndex(index); + + Node nx = this.find(index); + Node pr = nx.previous; + Node in = new Node(o,pr,nx); + nx.previous = in; + pr.next = in; + size++; + } + + public Object get(int index){ + //Check bound + checkIndex(index); + + return this.find(index).data; + } + + public Object remove(int index){ + //Check bound + checkIndex(index); + Node rem = this.find(index); + + Node pr = rem.previous; + Node nx = rem.next; + pr.next = nx; + nx.previous = pr; + + Object ret = rem.data; + rem.previous = null; + rem.next = null; + rem.data = null; + size--; + return ret; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node nx = head.next; + Node in = new Node(o,head, nx); + head.next = in; + nx.previous = in; + size++; + } + + public void addLast(Object o){ + Node last = head.previous; + Node in = new Node(o,last,head); + last.next = in; + head.previous = in; + + size++; + } + public Object removeFirst(){ + return remove(0); + } + public Object removeLast(){ + return remove(size-1); + } + public WIterator wIterator(){ + return new ListItr(); + } + public void clear(){ + for (Node x = head; x != null; ) { + Node next = x.next; + x.data = null; + x.next = null; + x.previous = null; + x = next; + } + } + + private void checkIndex(int index){ + if(index >= size || index < 0){ + throw new IndexOutOfBoundsException("Index:"+index+" Size:"+size); + } + } + + private Node find(int index){ + Node tra = head; + + //If index < size/2 + if( index < (size >> 1)){ + for(int i = 0; i <= index; i++){ + tra = tra.next; + } + }else{ + for(int i = size; i > index; i--){ + tra = tra.previous; + } + } + return tra; + } + + private static class Node{ + Object data; + Node next; + Node previous; + + public Node(){ + data = null; + next = this; + previous = this; + } + + public Node(Object obj,Node pre, Node nx){ + data = obj; + next = nx; + previous = pre; + } + + + } + + private class ListItr implements WIterator{ + //Point to next node + Node cursor; + int nextIndex; + + public ListItr(){ + cursor = head.next; + nextIndex = 0; + } + + @Override + public boolean hasNext() { + return nextIndex < size; + } + + @Override + public Object next() { + checkBound(); + Node re = cursor; + cursor = cursor.next; + nextIndex++; + return re.data; + } + + public Object previous() { + Node re = cursor.previous.previous; + cursor = cursor.previous; + nextIndex--; + return re.data; + } + + @Override + public void remove() { + //Check bound + checkBound(); + WLinkedList.this.remove(--nextIndex); + + } + + private void checkBound(){ + if(nextIndex >= size){ + throw new NoSuchElementException("Iterates to the end"); + } + } + } +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WList.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WList.java new file mode 100644 index 0000000000..03b11b22ef --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WList.java @@ -0,0 +1,9 @@ +package com.github.congcongcong250.coding2017.basic; + +public interface WList { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WQueue.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WQueue.java new file mode 100644 index 0000000000..0e98084762 --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WQueue.java @@ -0,0 +1,34 @@ +package com.github.congcongcong250.coding2017.basic; + +public class WQueue { + private WLinkedList elementData; + + public WQueue(){ + elementData = new WLinkedList(); + } + + public void enQueue(Object o){ + elementData.addFirst(o); + } + + public Object deQueue(){ + Object ret = elementData.removeLast(); + return ret; + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + + public boolean isEmpty(){ + return (elementData.size() == 0); + } + + public int size(){ + return elementData.size(); + } + + public void clear(){ + elementData.clear(); + } +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WStack.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WStack.java new file mode 100644 index 0000000000..e30b7eee33 --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WStack.java @@ -0,0 +1,32 @@ +package com.github.congcongcong250.coding2017.basic; + +public class WStack { + private WLinkedList elementData = new WLinkedList(); + + public WStack(){ + elementData = new WLinkedList(); + } + + public void push(Object o){ + elementData.addLast(o); + } + + public Object pop(){ + Object ret = elementData.removeLast(); + return ret; + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return (elementData.size() == 0); + } + public int size(){ + return elementData.size(); + } + + public void clear(){ + elementData.clear(); + } +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/ArrayUtilTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/ArrayUtilTest.java new file mode 100644 index 0000000000..d8b583095a --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/ArrayUtilTest.java @@ -0,0 +1,140 @@ +package com.github.congcongcong250.coding2017.basicTest; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import com.github.congcongcong250.coding2017.basic.ArrayUtil; + +public class ArrayUtilTest { + private ArrayUtil myArray; + + @Before + public void setUp() throws Exception { + myArray = new ArrayUtil(); + } + + @Test + public void testReverseArray() { + int[] origin = { 1, 2, 1, 3, 5, 6 }; + int[] reverse = { 6, 5, 3, 1, 2, 1 }; + + myArray.reverseArray(origin); + assertArrayEquals(origin, reverse); + + int[] empty = new int[0]; + myArray.reverseArray(empty); + assertArrayEquals(empty, new int[0]); + } + + @Test + public void testRemoveZero() { + int[] oldArray = { 1, 5, 0, 0, 6, 6, 0, 5, 4, 0, 7, 6, 7, 1, 2, 0 }; + int[] newArray = { 1, 5, 6, 6, 5, 4, 7, 6, 7, 1, 2 }; + int[] res = myArray.removeZero(oldArray); + assertArrayEquals(newArray, res); + + int[] nl = null; + int[] nll = myArray.removeZero(nl); + assertNull(nll); + } + + @Test + public void testMerge() { + int a1[] = { 1, 2, 3, 4, 5 }; + int b1[] = { 3, 4, 5, 6, 7, 8 }; + int c1[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int[] newArray1 = myArray.merge(a1, b1); + assertArrayEquals(c1, newArray1); + + int a2[] = new int[0]; + int b2[] = { 0, 2, 3, 6, 7, 8 }; + int c2[] = { 0, 2, 3, 6, 7, 8 }; + int[] newArray2 = myArray.merge(a2, b2); + assertArrayEquals(c2, newArray2); + + int a3[] = { 0, 2, 3, 6, 7, 8 }; + int b3[] = new int[0]; + int c3[] = { 0, 2, 3, 6, 7, 8 }; + int[] newArray3 = myArray.merge(a3, b3); + assertArrayEquals(c3, newArray3); + + int[] a4 = null; + int[] b4 = null; + int[] newArray4 = myArray.merge(a4, b4); + assertNull(newArray4); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testGrow() { + int[] a = { 3, 5, 7, 8, 9 }; + int[] b = { 3, 5, 7, 8, 9, 0, 0, 0 }; + int[] newArray = myArray.grow(a, 3); + assertArrayEquals(b, newArray); + + int[] c = null; + int[] newArray1 = myArray.grow(c, 3); + assertNull(newArray1); + + // size < 0 + expectedEx.expect(Exception.class); + myArray.grow(a, -3); + } + + @Test + public void testFibonacci() { + + int[] array1 = myArray.fibonacci(1); + int[] b = new int[0]; + assertArrayEquals(array1, b); + + int[] array2 = myArray.fibonacci(35); + int[] c = { 1, 1, 2, 3, 5, 8, 13, 21, 34 }; + assertArrayEquals(c, array2); + } + + @Test + public void testGetPrimes() { + int[] a = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 }; + int[] array1 = myArray.getPrimes(35); + assertArrayEquals(a, array1); + + int[] array2 = myArray.getPrimes(1); + int[] b = new int[0]; + assertArrayEquals(array2, b); + } + + @Test + public void testGetPerfectNumbers() { + int[] array = myArray.getPerfectNumbers(10000); + int[] a = { 6, 28, 496, 8128 }; + assertArrayEquals(a, array); + } + + @Test + public void testJoin() { + int[] a = { 3, 5, 7, 8, 9 }; + String s0 = myArray.join(a, "-"); + String s1 = "3-5-7-8-9"; + assertEquals(s1, s0); + + int[] a1 = { 3 }; + String s2 = myArray.join(a1, "-"); + String s3 = "3"; + assertEquals(s2, s3); + + int[] a0 = new int[0]; + String s4 = myArray.join(a0, "-"); + String s5 = ""; + assertEquals(s4, s5); + } + +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/TestRunner.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/TestRunner.java new file mode 100644 index 0000000000..31470679fd --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/TestRunner.java @@ -0,0 +1,41 @@ +/* + * An automatic runner for Junit test for DataStructure assignment + * */ +package com.github.congcongcong250.coding2017.basicTest; + + +import org.junit.runner.JUnitCore; +import org.junit.runner.Result; +import org.junit.runner.notification.Failure; + +public class TestRunner { + + public static void main(String[] args){ + WArrayListTest ALT = new WArrayListTest(); + test(ALT); + + WLinkedListTest LLT = new WLinkedListTest(); + test(LLT); + + WStackTest STT = new WStackTest(); + test(STT); + + WQueueTest QT = new WQueueTest(); + test(QT); + + WBinaryTreeNodeTest BTNT = new WBinaryTreeNodeTest(); + test(BTNT); + + } + + private static Result test(testCase tc){ + + Result result = JUnitCore.runClasses(tc.getClass()); + for (Failure failure : result.getFailures()) { + System.out.println(failure.toString()); + } + System.out.println(tc.getClass().toString()+ "\n>>> Test status: "+result.wasSuccessful()); + + return result; + } +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WArrayListTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WArrayListTest.java new file mode 100644 index 0000000000..ee437f5494 --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WArrayListTest.java @@ -0,0 +1,115 @@ +package com.github.congcongcong250.coding2017.basicTest; + +import static org.junit.Assert.*; + +import java.util.NoSuchElementException; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.congcongcong250.coding2017.basic.WArrayList; +import com.github.congcongcong250.coding2017.basic.WIterator; + +public class WArrayListTest implements testCase { + + WArrayList testlist = new WArrayList(); + + @Override + @Before + public void setUp() { + + for(int i = 0; i < 30; i++){ + testlist.add(i); + } + } + + @Override + @After + public void tearDown() { + testlist.clear(); + } + + @Override + @Test + public void testAdd() { + + assertEquals(0,testlist.get(0)); + assertEquals(11,testlist.get(11)); + assertEquals(20,testlist.get(20)); + assertEquals(29,testlist.get(29)); + assertEquals(30,testlist.size()); + + testlist.add(20, 100); + assertEquals(100,testlist.get(20)); + assertEquals(20,testlist.get(21)); + assertEquals(29,testlist.get(30)); + assertEquals(31,testlist.size()); + + } + + @Override + @Test + public void testRemove() { + + + assertEquals(6,testlist.get(6)); + assertEquals(30,testlist.size()); + testlist.remove(6); + assertEquals(7,testlist.get(6)); + assertEquals(29,testlist.size()); + assertEquals(21,testlist.get(20)); + assertEquals(5,testlist.get(5)); + } + + + @Test(expected=IndexOutOfBoundsException.class) + public void testgetneg(){ + + WArrayList emptyList = new WArrayList(); + Object o = emptyList.get(-1); + } + + @Test(expected=IndexOutOfBoundsException.class) + public void testgetout(){ + + Object o = testlist.get(31); + } + + @Test(expected=IndexOutOfBoundsException.class) + public void testremoveExp(){ + Object o = testlist.remove(31); + } + + @Override + @Test + public void testFunctional() { + WIterator itr = testlist.wIterator(); + assertTrue(itr.hasNext()); + for(int i = 0; i < 20; i++){ + assertEquals(i, itr.next()); + } + itr.remove(); + + assertTrue(itr.hasNext()); + assertEquals(20, itr.next()); + assertEquals(29, testlist.size()); + + for(int i = 21; i < 30; i++){ + assertEquals(i, itr.next()); + } + assertFalse(itr.hasNext()); + + boolean hasExp = false; + try{ + itr.next(); + }catch (NoSuchElementException e){ + hasExp = true; + } + assertTrue(hasExp); + } + + + + +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WBinaryTreeNodeTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WBinaryTreeNodeTest.java new file mode 100644 index 0000000000..4bcc7b0c8e --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WBinaryTreeNodeTest.java @@ -0,0 +1,69 @@ +package com.github.congcongcong250.coding2017.basicTest; + +import static org.junit.Assert.*; + +import java.util.NoSuchElementException; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.congcongcong250.coding2017.basic.WBinaryTreeNode; + +public class WBinaryTreeNodeTest implements testCase { + + WBinaryTreeNode node = new WBinaryTreeNode(); + + @Override + @Before + public void setUp() { + node.insert(10); + + } + + @Override + @After + public void tearDown() { + node.destroy(); + } + + @Override + @Test + public void testAdd() { + assertEquals(10,node.getData()); + node.insert(5); + assertEquals(5,node.getLeft().getData()); + node.insert(1); + node.insert(2); + node.insert(6); + node.insert(19); + node.insert(18); + /* + * 10 + * 5 19 + * 1 6 18 + * 2 + * + * */ + assertEquals(1,node.getLeft().getLeft().getData()); + assertEquals(2,node.getLeft().getLeft().getRight().getData()); + assertEquals(6,node.getLeft().getRight().getData()); + assertEquals(19,node.getRight().getData()); + assertEquals(18,node.getRight().getLeft().getData()); + } + + @Override + @Test + public void testRemove() { + // TODO Auto-generated method stub + + } + + @Override + @Test + public void testFunctional() { + // TODO Auto-generated method stub + + } + +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WLinkedListTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WLinkedListTest.java new file mode 100644 index 0000000000..f45daa6f35 --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WLinkedListTest.java @@ -0,0 +1,143 @@ +package com.github.congcongcong250.coding2017.basicTest; + +import static org.junit.Assert.*; + +import java.util.NoSuchElementException; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.congcongcong250.coding2017.basic.WArrayList; +import com.github.congcongcong250.coding2017.basic.WLinkedList; +import com.github.congcongcong250.coding2017.basic.WIterator; + +public class WLinkedListTest implements testCase { + + WLinkedList testlist = new WLinkedList(); + + @Override + @Before + public void setUp() { + for(int i = 0; i < 20;i++){ + testlist.add(i); + } + } + + @Override + @After + public void tearDown() { + testlist.clear(); + } + + @Override + @Test + public void testAdd() { + assertEquals(20,testlist.size()); + assertEquals(0,testlist.get(0)); + assertEquals(19,testlist.get(19)); + + testlist.add(11, 100); + assertEquals(21,testlist.size()); + assertEquals(5,testlist.get(5)); + assertEquals(100,testlist.get(11)); + assertEquals(18,testlist.get(19)); + + testlist.addFirst(200); + assertEquals(22,testlist.size()); + assertEquals(200,testlist.get(0)); + assertEquals(4,testlist.get(5)); + assertEquals(100,testlist.get(12)); + assertEquals(17,testlist.get(19)); + + testlist.addLast(300); + assertEquals(23,testlist.size()); + assertEquals(200,testlist.get(0)); + assertEquals(4,testlist.get(5)); + assertEquals(100,testlist.get(12)); + assertEquals(17,testlist.get(19)); + assertEquals(300,testlist.get(22)); + + } + + @Override + @Test + public void testRemove() { + assertEquals(20,testlist.size()); + assertEquals(0,testlist.get(0)); + assertEquals(19,testlist.get(19)); + + testlist.remove(10); + assertEquals(19,testlist.size()); + assertEquals(4,testlist.get(4)); + assertEquals(9,testlist.get(9)); + assertEquals(11,testlist.get(10)); + assertEquals(19,testlist.get(18)); + + testlist.removeFirst(); + assertEquals(18,testlist.size()); + assertEquals(1,testlist.get(0)); + assertEquals(12,testlist.get(10)); + assertEquals(19,testlist.get(17)); + + testlist.removeLast(); + assertEquals(17,testlist.size()); + assertEquals(1,testlist.get(0)); + assertEquals(12,testlist.get(10)); + assertEquals(18,testlist.get(16)); + + } + + @Test(expected=IndexOutOfBoundsException.class) + public void testgetneg(){ + + WLinkedList emptyList = new WLinkedList(); + Object o = emptyList.get(-2); + } + + @Test(expected=IndexOutOfBoundsException.class) + public void testgetout(){ + + Object o = testlist.get(31); + } + + @Test(expected=IndexOutOfBoundsException.class) + public void testremoveExp(){ + + Object o = testlist.remove(31); + } + + @Override + @Test + public void testFunctional() { + WIterator itr = testlist.wIterator(); + + assertTrue(itr.hasNext()); + for(int i = 0; i < 12; i++){ + assertEquals(i, itr.next()); + } + + //previous() function not yet defined in interface + + itr.remove(); + + assertTrue(itr.hasNext()); + assertEquals(12, itr.next()); + assertEquals(19, testlist.size()); + + for(int i = 13; i < 20; i++){ + assertEquals(i, itr.next()); + } + assertFalse(itr.hasNext()); + + boolean hasExp = false; + try{ + itr.next(); + }catch (NoSuchElementException e){ + hasExp = true; + } + assertTrue(hasExp); + + } + +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WQueueTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WQueueTest.java new file mode 100644 index 0000000000..48e84eb287 --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WQueueTest.java @@ -0,0 +1,76 @@ +package com.github.congcongcong250.coding2017.basicTest; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.congcongcong250.coding2017.basic.WQueue; + +public class WQueueTest implements testCase { + + WQueue testqueue = new WQueue(); + + @Override + @Before + public void setUp() { + + for(int i = 0; i < 20; i++){ + testqueue.enQueue(i); + } + } + + @Override + @After + public void tearDown() { + testqueue.clear(); + } + + + @Override + @Test + public void testAdd() { + assertEquals(20,testqueue.size()); + assertEquals(0,testqueue.peek()); + assertEquals(20,testqueue.size()); + assertFalse(testqueue.isEmpty()); + } + + @Override + @Test + public void testRemove() { + assertEquals(20,testqueue.size()); + assertEquals(0,testqueue.deQueue()); + assertEquals(19,testqueue.size()); + assertEquals(1,testqueue.peek()); + assertFalse(testqueue.isEmpty()); + } + + @Override + @Test + public void testFunctional() { + for(int i = 0; i < 20; i++){ + testqueue.deQueue(); + } + assertTrue(testqueue.isEmpty()); + testqueue.enQueue(100); + testqueue.enQueue(200); + assertEquals(100,testqueue.deQueue()); + testqueue.enQueue(400); + assertEquals(200,testqueue.deQueue()); + assertFalse(testqueue.isEmpty()); + assertEquals(400,testqueue.deQueue()); + + boolean hasExp = false; + try{ + testqueue.deQueue(); + }catch (IndexOutOfBoundsException e){ + hasExp = true; + } + assertTrue(hasExp); + } + +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WStackTest.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WStackTest.java new file mode 100644 index 0000000000..4dad0ec720 --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WStackTest.java @@ -0,0 +1,75 @@ +package com.github.congcongcong250.coding2017.basicTest; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.congcongcong250.coding2017.basic.WStack; + +public class WStackTest implements testCase { + + WStack teststack = new WStack(); + + @Override + @Before + public void setUp() { + + for(int i = 0; i < 20; i++){ + teststack.push(i); + } + } + + @Override + @After + public void tearDown() { + teststack.clear(); + } + + + @Override + @Test + public void testAdd() { + assertEquals(20,teststack.size()); + assertEquals(19,teststack.peek()); + assertEquals(20,teststack.size()); + assertFalse(teststack.isEmpty()); + } + + @Override + @Test + public void testRemove() { + assertEquals(20,teststack.size()); + assertEquals(19,teststack.pop()); + assertEquals(19,teststack.size()); + assertEquals(18,teststack.peek()); + assertFalse(teststack.isEmpty()); + } + + @Override + @Test + public void testFunctional() { + for(int i = 0; i < 20; i++){ + teststack.pop(); + } + assertTrue(teststack.isEmpty()); + teststack.push(100); + teststack.push(200); + assertEquals(200,teststack.pop()); + teststack.push(400); + assertEquals(400,teststack.pop()); + assertFalse(teststack.isEmpty()); + assertEquals(100,teststack.pop()); + + + boolean hasExp = false; + try{ + teststack.pop(); + }catch (IndexOutOfBoundsException e){ + hasExp = true; + } + assertTrue(hasExp); + } + +} diff --git a/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/testCase.java b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/testCase.java new file mode 100644 index 0000000000..17df6ee30e --- /dev/null +++ b/group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/testCase.java @@ -0,0 +1,21 @@ +package com.github.congcongcong250.coding2017.basicTest; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public interface testCase { + @Before + public void setUp(); + + @After + public void tearDown(); + + @Test + public void testAdd(); + + @Test + public void testRemove(); + + @Test + public void testFunctional(); +} diff --git a/group02/609990377/LiteStruts/.gitignore b/group02/609990377/LiteStruts/.gitignore new file mode 100644 index 0000000000..fa968c2f2b --- /dev/null +++ b/group02/609990377/LiteStruts/.gitignore @@ -0,0 +1,3 @@ +/bin/ +.classpath +.project diff --git a/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/LoginAction.java b/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/LoginAction.java new file mode 100644 index 0000000000..997dd19521 --- /dev/null +++ b/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/LoginAction.java @@ -0,0 +1,42 @@ +package com.github.congcongcong250.coding2017.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public void setMessage(String message){ + this.message = message; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/Struts.java b/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/Struts.java new file mode 100644 index 0000000000..a427b9ad95 --- /dev/null +++ b/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/Struts.java @@ -0,0 +1,120 @@ +package com.github.congcongcong250.coding2017.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.w3c.dom.*; +import org.xml.sax.SAXException; + +import javax.xml.parsers.*; + +import java.beans.PropertyDescriptor; +import java.io.*; +import java.lang.reflect.*; + +public class Struts { + + public static View runAction(String actionName, + Map parameters) { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + */ + + /* + * File f = new File("."); System.out.println(f.getAbsolutePath()); + */ + String filepath = "./src/com/github/congcongcong250/coding2017/litestruts/struts.xml"; + File inputFile = new File(filepath); + View view = new View(); + + try { + // Use DOM parser + Element e = getActionByName(actionName, inputFile); + + // Get class and entity by reflection + String clsName = e.getAttribute("class"); + Class clazz = Class.forName(clsName); + Object obj = clazz.newInstance(); + + // Set entity attributes from the parameters passed in + for (Map.Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + PropertyDescriptor pd = new PropertyDescriptor(key,clazz); + Method setMethod = pd.getWriteMethod(); + setMethod.invoke(obj, value); + } + + // Execute Login class, get result message + Method exec = clazz.getDeclaredMethod("execute"); + Object res = exec.invoke(obj); + + // Get result jsp address according to struts config + NodeList list = e.getElementsByTagName("result"); + for(int i = 0; i params = new HashMap(); + Field[] fields = clazz.getDeclaredFields(); + for(Field f : fields){ + PropertyDescriptor descriptor = new PropertyDescriptor(f.getName(),clazz); + Method getMethod = descriptor.getReadMethod(); + Object value = getMethod.invoke(obj); + params.put(f.getName(), value); + + } + view.setParameters(params); + + + + } catch (Exception e) { + e.printStackTrace(); + } + + // Return view + return view; + } + + private static Element getActionByName(String actionName, File inputFile) + throws ParserConfigurationException, SAXException, IOException { + + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(inputFile); + doc.getDocumentElement().normalize(); + + NodeList nList = doc.getElementsByTagName("action"); + for (int i = 0; i < nList.getLength(); i++) { + Node nNode = nList.item(i); + if (nNode.getNodeType() == Node.ELEMENT_NODE) { + Element eElement = (Element) nNode; + if (eElement.getAttribute("name").equalsIgnoreCase( + actionName.toLowerCase())) { + return eElement; + } + } + } + return null; + } + +} diff --git a/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/StrutsTest.java b/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/StrutsTest.java new file mode 100644 index 0000000000..ad9e980b70 --- /dev/null +++ b/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.github.congcongcong250.coding2017.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/View.java b/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/View.java new file mode 100644 index 0000000000..05d9c428c6 --- /dev/null +++ b/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/View.java @@ -0,0 +1,23 @@ +package com.github.congcongcong250.coding2017.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/struts.xml b/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/struts.xml new file mode 100644 index 0000000000..8edb2e3854 --- /dev/null +++ b/group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + diff --git a/group02/609990377/LiteStruts/src/struts.xml b/group02/609990377/LiteStruts/src/struts.xml new file mode 100644 index 0000000000..8edb2e3854 --- /dev/null +++ b/group02/609990377/LiteStruts/src/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + diff --git a/group02/727171008/.gitignore b/group02/727171008/.gitignore new file mode 100644 index 0000000000..0cfebaa908 --- /dev/null +++ b/group02/727171008/.gitignore @@ -0,0 +1,19 @@ +/bin/ +.idea/workspace.xml +.idea/dictionaries/myj.xml +.idea/ +.DS_Store +*.classpath +*.project +.settings +.project +.target +.classpath +**/.settings +**/.classpath +**/.eclipse +**/target/ +target/ +bin/ +.svn +*.iml \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java b/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java new file mode 100644 index 0000000000..a29fcdd193 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java @@ -0,0 +1,345 @@ +package com.github.HarryHook.coding2017.array; + +public class ArrayUtil +{ + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin) + { + for(int i=0, j = origin.length-1; i array2[j]) + { + newArray[count++] = array2[j++]; + } + else if(array1[i] == array2[j]) + { + newArray[count++] = array2[j++]; + i++; + } + } + while(i==array1.length && j 1) + { + s = s + seperator; + for(int i=1; i size || index < 0) + throw new IndexOutOfBoundsException( + "Index: " + index + ", Size: " + size); + ensureCapacity(size + 1); + //判断当前位置是否有元素,没有元素添加到当前位置;若有,当前元素及之后元素向右移 + if(elementData[index] == null) + { + elementData[index] = o; + } + else + { + for(int i=elementData.length-1; i>index; i--) + { + elementData[i] = elementData[i-1]; + } + elementData[index] = o; + } + size++; + + /* + //判断索引位置是否正确 + if (index > size || index < 0) + throw new IndexOutOfBoundsException( + "Index: " + index + ", Size: " + size); + //扩容检测 + ensureCapacity(size+1); + /* + * 对源数组进行复制处理(位移),从index + 1到size-index。 + * 主要目的就是空出index位置供数据插入, + * 即向右移动当前位于该位置的元素以及所有后续元素。 + + System.arraycopy(elementData, index, elementData, index + 1, + size - index); + //在指定位置赋值 + elementData[index] = 0; + size++; + + */ + } + + public Object get(int index) + { + //若index超出size应该抛出异常 + if(index >= size) + throw new IndexOutOfBoundsException( "Index: " + index + ", Size: " + size); + return elementData[index]; + + } + + public Object remove(int index) + { //涉及到元素移位 + Object oldValue = elementData[index]; + for(int i=index; i oldCapacity) + { + //Object oldData[] = elementData; //防止copyof()执行的过程中新内存或者其他进程分配内存时占用旧内存 + int newCapacity = (oldCapacity * 3)/2 + 1; //增加50%+1 + if (newCapacity < minCapacity) + newCapacity = minCapacity; + // minCapacity is usually close to size, so this is a win: + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + //返回数组的大小 + public int size() + { + return size; + } + + public Iterator iterator() + { + return new MyArrayListIterator(); + } + + private class MyArrayListIterator implements Iterator + { + private int cursor = 0; //记录索引位置 + public boolean hasNext() + { + return cursor != size; + } + public Object next() + { + try { + Object next = get(cursor); + cursor++; + return next; + + } catch (IndexOutOfBoundsException e) + { + throw new NoSuchElementException(); + } + + } + } + + public static void main(String[] args) + { + MyArrayList myArrays = new MyArrayList(); + myArrays.add(3); + myArrays.add(0, 11); + myArrays.add(1, 2); + myArrays.add(3, 5); + myArrays.add(2, 1); + myArrays.add(7); + Print(myArrays); + + for(int i = 0; i < 19; i++) + myArrays.add(i, 55); + + System.out.println("获取指定位置元素: " + myArrays.get(2)); + System.out.println("删除指定位置元素: " + myArrays.remove(1)); + System.out.println("当前元素个数:" + myArrays.size()); + + Print(myArrays); + + } + public static void Print(MyArrayList myArrays) + { + Iterator it = myArrays.iterator(); + System.out.println("对链表中的元素进行打印:"); + while(it.hasNext()) + System.out.print(it.next() + " "); + System.out.println(""); + System.out.println("当前元素个数: " + myArrays.size()); + + } + +} + diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java new file mode 100644 index 0000000000..5aeab57496 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java @@ -0,0 +1,219 @@ +/* + * created by Harry 2017-2-21 14:43:41 + * 实现简单的LinkedList + */ + +package com.github.HarryHook.coding2017.basic; + +public class MyLinkedList implements List +{ + private Node head = null; //头指针 + private int size = 0; + private static class Node + { + Object data; + Node next; + } + public void add(Object o) + { + addLast(o); + } + //在指定位置添加元素 + public void add(int index , Object o) + { + + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + //存在插入头结点的情况 + if(index == 0) + addFirst(o); + else + { //即 index != 0 的情况 + // p保存待插入节点的前一节点,x指向要插入的节点 + Node x = head; + Node p = null; + int i = 0; + while(i < index) + { + p = x; + x = x.next; + i++; + } + Node n = new Node(); + p.next = n; + n.next = x; + n.data = o; + size++; + } + + } + //返回指定位置元素 + public Object get(int index) + { + Node x = head; + int i = 0; + while(i < index && x != null) + { + x = x.next; + i++; + } + return x.data; + } + + //移除指定位置节点 + public Object remove(int index) + { + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + //先判断是否是头节点 + if( index == 0) + { + return removeFirst(); + } + else + { + Node x = head; + Node pre = null; + int i = 0; + while(i < index) + { + pre = x; + x = x.next; + i++; + } + Object Data = pre.next.data; + pre.next = x.next; + x = null; + size--; + return Data; + } + + } + //头部添加节点 + public void addFirst(Object o) + { + Node n = new Node(); + n.next = head; + head = n; + n.data = o; + size++; + } + //尾部添加节点 + public void addLast(Object o) + { + if (head == null) + { + head = new Node(); + head.data = o; + } + else + { + Node x = head; + while(x.next != null) + { + x = x.next; + } + Node n = new Node(); + x.next = n; + n.next = null; + n.data = o; + } + size++; + } + //移除第一个节点 + public Object removeFirst() + { + Node n = head; + Object Data = n.data; + head = head.next; + n = null; + size--; + return Data; + } + + //移除最后一个节点 + //removeLast()方法存在bug + public Object removeLast() + { + Node x = head; + Node p = null; + if(x.next == null) + { + return removeFirst(); + } + else + { + while(x.next != null) + { + p = x; + x = x.next; + } + Object Data = x.data; + p.next = null; + x = null; //删除最后一个节点 + size--; + return Data; + } + } + public int size(){ + return size; + } + public Iterator iterator() + { + return new MyLinkedListIterator(); + } + private class MyLinkedListIterator implements Iterator + { + private int cursor = 0; //记录索引位置 + public boolean hasNext() + { + return cursor != size; + } + public Object next() + { + Object next = get(cursor); + cursor ++; + return next; + } + } + public static void main(String[] args) + { + MyLinkedList myList = new MyLinkedList(); + myList.add(3); + myList.add(5); + myList.add(0, 4); + myList.add(2, 7); + myList.addFirst(1); + myList.addLast(6); + + Print(myList); + + System.out.println("当前指定位置元素: " + myList.get(1)); + System.out.println("移除指定位置元素: " + myList.remove(4)); + Print(myList); + + System.out.println("移除第一个节点元素: " + myList.removeLast()); + Print(myList); + System.out.println("移除最后一个节点元素: " + myList.removeLast()); + Print(myList); + System.out.println("移除最后一个节点元素: " + myList.removeLast()); + Print(myList); + System.out.println("移除最后一个节点元素: " + myList.removeLast()); + Print(myList); + System.out.println("移除最后一个节点元素: " + myList.removeLast()); + Print(myList); + + } + public static void Print(MyLinkedList myList) + { + Iterator it = myList.iterator(); + System.out.println("对链表中的元素进行打印:"); + while(it.hasNext()) + System.out.print(it.next() + " "); + System.out.println(""); + System.out.println("当前元素个数: " + myList.size()); + System.out.println(""); + } + + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java new file mode 100644 index 0000000000..9b713eaea9 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java @@ -0,0 +1,54 @@ +/* + * created by Harry 2017-2-22 13:06:43 + * 实现简单的队列 + */ +package com.github.HarryHook.coding2017.basic; +import java.util.*; +public class MyQueue +{ + private MyArrayList elementData = new MyArrayList(); + private int size = 0; + //入队 + public void enQueue(Object o) + { + elementData.add(o); + size++; + } + //出队 + public Object deQueue() + { + if(isEmpty()) + throw new NoSuchElementException(); + Object Data = elementData.remove(0); + size--; + return Data; + } + //判断队列是否为空 + public boolean isEmpty() + { + return size() == 0; + } + //队列中元素个数 + public int size() + { + return size; + } + public static void main(String[] args) + { + MyQueue mq = new MyQueue(); + mq.enQueue(1); + mq.enQueue(2); + mq.enQueue(3); + mq.enQueue(4); + System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); + System.out.println("队列中元素个数: " + mq.size()); + System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); + System.out.println("队列中元素个数: " + mq.size()); + System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); + System.out.println("队列中元素个数: " + mq.size()); + System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); + System.out.println("队列中元素个数: " + mq.size()); + //System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); + //System.out.println("队列中元素个数: " + mq.size()); + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java new file mode 100644 index 0000000000..c7f87c04e6 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java @@ -0,0 +1,59 @@ +/* + * created by Harry 2017-2-22 10:48:34 + * 实现简单的Stack + */ +package com.github.HarryHook.coding2017.basic; + +import java.util.*; + +public class MyStack +{ + private MyArrayList elementData = new MyArrayList(); + private int size = 0; + + //入栈操作 + public void push(Object o) + { + elementData.add(o); + size++; + } + //出栈操作 + public Object pop() + { + Object obj = peek(); + elementData.remove(size() - 1); + size--; + return obj; + } + //获取当前栈顶元素,不用出栈 + public Object peek() + { + if(isEmpty()) + throw new EmptyStackException(); + return elementData.get(size() - 1); + } + //判断栈是否为空 + public boolean isEmpty() + { + return size() == 0; + } + //返回栈内元素个数 + public int size(){ + return size; + } + + public static void main(String[] args) + { + MyStack ms = new MyStack(); + + ms.push(1); + ms.push(2); + ms.push(13); + System.out.println("当前栈顶元素是: " + ms.peek()); + System.out.println("出栈元素是: " + ms.pop()); + System.out.println("出栈元素是: " + ms.pop()); + ms.push(12); + System.out.println("出栈元素是: " + ms.pop()); + System.out.println("当前栈顶元素是: " + ms.peek()); + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java new file mode 100644 index 0000000000..340f79d240 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java @@ -0,0 +1,33 @@ +package com.github.HarryHook.coding2017.basic; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import com.github.HarryHook.coding2017.basic.MyQueue; + +public class QueueTest { + private MyQueue queue; + + @Before + public void setUpQueue() { + queue = new MyQueue(); + } + + @Test + public void testQueueFunctional() { + assertEquals(true, queue.isEmpty()); + queue.enQueue(4); + queue.enQueue(2); + assertEquals(2, queue.size()); + assertEquals(false, queue.isEmpty()); + + int i = (Integer)queue.deQueue(); + assertEquals(4, i); + i = (Integer)queue.deQueue(); + assertEquals(2, i); + + assertEquals(0, queue.size()); + assertEquals(true, queue.isEmpty()); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java new file mode 100644 index 0000000000..26160faef6 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java @@ -0,0 +1,40 @@ +package com.github.HarryHook.coding2017.basic; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.github.HarryHook.coding2017.basic.MyStack; + +public class StackTest { + + private MyStack stack; + + @Before + public void setUpStack() { + stack = new MyStack(); + } + + @Test + public void testStackFunctional() { + assertEquals(true, stack.isEmpty()); + stack.push(4); + stack.push(2); + assertEquals(2, stack.size()); + assertEquals(false, stack.isEmpty()); + + int i = (Integer)stack.pop(); + assertEquals(2, i); + + i = (Integer)stack.peek(); + assertEquals(4, i); + + i = (Integer)stack.pop(); + assertEquals(4, i); + + assertEquals(0, stack.size()); + assertEquals(true, stack.isEmpty()); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java new file mode 100644 index 0000000000..4b42b92093 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java @@ -0,0 +1,45 @@ +package com.github.HarryHook.coding2017.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction +{ + private String name ; + private String password; + private String message; + + public String getName() + { + return name; + } + + public String getPassword() + { + return password; + } + + public String execute() + { + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + public void setName(String name) + { + this.name = name; + } + public void setPassword(String password) + { + this.password = password; + } + public String getMessage() + { + return this.message; + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java new file mode 100644 index 0000000000..79f662699b --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java @@ -0,0 +1,109 @@ +package com.github.HarryHook.coding2017.litestruts; + +import java.io.File; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.DocumentBuilder; + +import org.w3c.dom.Attr; +import org.w3c.dom.Comment; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + + +public class Struts +{ + + public static View runAction(String actionName, Map parameters) + { + return null; + } + public static void main(String[] args) throws Exception + { + /* + Class clz = Class.forName("com.github.HarryHook.coding2017.litestruts.LoginAction"); + //创建类的实例 + Object obj = clz.newInstance(); + //得到方法的引用 + Method method = clz.getDeclaredMethod("setName", java.lang.String.class); + //调用该方法 + method.invoke(obj, "test"); + LoginAction b = (LoginAction) obj; + System.out.println(b.getName()); + + method = clz.getDeclaredMethod("setPassword", java.lang.String.class); + method.invoke(obj, "1234"); + b = (LoginAction) obj; + System.out.println(b.getPassword()); + */ + + //获得dom解析器工厂,用于创建具体的解析器 + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + //获得具体的dom解析器 + DocumentBuilder db = dbf.newDocumentBuilder(); + //解析一个xml文档,获得Document对象(根节点) + Document doc = db.parse(new File("src/com/github/HarryHook/coding2017/litestruts/struts.xml")); + //对文档进行解析 + Element root = doc.getDocumentElement(); + parseElement(root); + System.out.println(""); + + } + private static void parseElement(Element element) + { + String tagName = element.getNodeName(); + NodeList children = element.getChildNodes(); + System.out.print("<" + tagName); + + //element元素的所有属性所构成的NamedNodeMap队形,要对其进行判断 + NamedNodeMap nnm = element.getAttributes(); + + //如果元素存在属性 + if(nnm != null) + { + for(int i=0; i"); + + for(int i=0; i"); + } + } + System.out.print(""); + + } + + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java new file mode 100644 index 0000000000..458f2b190c --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java @@ -0,0 +1,57 @@ +package com.github.HarryHook.coding2017.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() + { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + View view; + + view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + + + + } + + @Test + public void testLoginActionFailed() + { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + try + { + View view; + + view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + + }catch(Exception e) + { + e.printStackTrace(); + } + + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java new file mode 100644 index 0000000000..5d1977d887 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java @@ -0,0 +1,31 @@ +package com.github.HarryHook.coding2017.litestruts; + +import java.util.Map; + +public class View +{ + private String jsp; + private Map parameters; + + //对应action获取Jsp + public String getJsp() + { + return jsp; + } + public View setJsp(String jsp) + { + this.jsp = jsp; + return this; + } + + //execute()获取对应参数 + public Map getParameters() + { + return parameters; + } + public View setParameters(Map parameters) + { + this.parameters = parameters; + return this; + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/struts.xml b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/struts.xml new file mode 100644 index 0000000000..7d2a8ed4ab --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Iterator.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..34d062b327 --- /dev/null +++ b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.github.ZhoufeifeiJAVA.coding2017.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/List.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/List.java new file mode 100644 index 0000000000..7a13f14c83 --- /dev/null +++ b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/List.java @@ -0,0 +1,9 @@ +package com.github.ZhoufeifeiJAVA.coding2017.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyArrayList.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyArrayList.java new file mode 100644 index 0000000000..0666530694 --- /dev/null +++ b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyArrayList.java @@ -0,0 +1,78 @@ +package com.github.ZhoufeifeiJAVA.coding2017.basic; + +public class MyArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + public void add(Object o){ + if(size == elementData.length){ + elementData = arrayGrow(elementData,size/2); + } + elementData[size] = o; + size ++; + } + public void add(int index, Object o)throws RuntimeException{ + if(index > size) + throw new RuntimeException("index is bigger than the size of MyArrayList"); + if(size == elementData.length){ + elementData = arrayGrow(elementData,size/2); + } + if(index == size) + add(o); + else{ + for(int i=size;i>index;i--){ + elementData[i] = elementData[i-1]; + } + elementData[index] = o; + } + size ++; + } + private Object[] arrayGrow(Object[] src,int size){ + Object[] target = new Object[src.length+size]; + System.arraycopy(src, 0, target, 0, src.length); + return target; + } + public Object get(int index){ + if(index >= size) + return null; + else + return elementData[index]; + } + + public Object remove(int index)throws IndexOutOfBoundsException{ + if(index>=size || index<0) + throw new IndexOutOfBoundsException("index is bigger than the size of MyArrayList"); + Object removeObject = elementData[index]; + for(int i=index;isize || index<0) + throw new IndexOutOfBoundsException("the index is bigger than the size of MyLinkedList"); + Node newNode = new Node(); + newNode.data = o; + if(index == 0){ + newNode.next = head; + head = newNode; + } + else{ + int i = 0; + Node pointer = head; + while(isize-1) + return null; + Node pointer = head; + while(index>0){ + pointer = pointer.next; + index --; + } + return pointer.data; + + } + public Object remove(int index)throws IndexOutOfBoundsException{ + if(index<0 || index>size-1) + throw new IndexOutOfBoundsException("the index is not legal"); + Node pointer = head; + if(index == 0){ + head = head.next; + size --; + return pointer.data; + } + else{ + while(index>1){ + pointer = pointer.next; + index --; + } + Node temp = pointer.next; + pointer.next = pointer.next.next; + size --; + return temp.data; + } + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + add(0,o); + } + public void addLast(Object o){ + add(size,o); + } + public Object removeFirst(){ + return remove(0); + } + public Object removeLast(){ + return remove(size-1); + } + + private static class Node{ + Object data; + Node next; + } + private class MyLinkedListIterator implements Iterator{ + private Node pointer; + MyLinkedListIterator(){ + pointer = head; + } + public boolean hasNext() { + if(pointer.next != null) + return true; + else + return false; + } + public Object next() { + Node temp = pointer; + pointer = pointer.next; + return temp.data; + } + } + public Iterator iterator(){ + return new MyLinkedListIterator(); + } + //public void showData(int index){ + // System.out.println("the data of "+index+" is "+get(index).data); + //} +} + + + + + + + diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyLinkedListTest.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyLinkedListTest.java new file mode 100644 index 0000000000..6d5ca14e70 --- /dev/null +++ b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyLinkedListTest.java @@ -0,0 +1,34 @@ +package com.github.ZhoufeifeiJAVA.coding2017.basic; +public class MyLinkedListTest{ + public static void main(String[] args){ + MyLinkedList al = new MyLinkedList(); + al.add("string0"); + al.add("string1"); + al.add("string2"); + al.add("string3"); + al.add("string4"); + al.add("string5"); + al.add("string6"); + al.add("string7"); + al.add("string8"); + al.add("string9"); + al.add("string10"); + al.add("string11"); + al.add("string12"); + al.add("string13"); + al.add("string14"); + al.add(11,"string10.5"); + sop(al.remove(4)); + sop(al.get(10)); + sop(al.get(11)); + sop(al.get(12)); + sop("the size of al is "+al.size()); + sop("the iterator method used,so the result is as follows:"); + for(Iterator it = al.iterator();it.hasNext();){ + sop(it.next()); + } + } + public static void sop(Object o){ + System.out.println(o); + } +} \ No newline at end of file diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Queue.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Queue.java new file mode 100644 index 0000000000..0ce735f150 --- /dev/null +++ b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Queue.java @@ -0,0 +1,26 @@ +package com.github.ZhoufeifeiJAVA.coding2017.basic; + +public class Queue { + private MyLinkedList llist = null; + Queue(){ + llist = new MyLinkedList(); + } + public void enQueue(Object o){ + llist.add(o); + } + + public Object deQueue(){ + return llist.removeFirst(); + } + + public boolean isEmpty(){ + if(llist.size() != 0) + return true; + else + return false; + } + + public int size(){ + return llist.size(); + } +} diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/QueueTest.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/QueueTest.java new file mode 100644 index 0000000000..95cc5117ff --- /dev/null +++ b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/QueueTest.java @@ -0,0 +1,17 @@ +package com.github.ZhoufeifeiJAVA.coding2017.basic; +public class QueueTest{ + public static void sop(Object o){ + System.out.println(o); + } + public static void main(String[] args){ + Queue q = new Queue(); + q.enQueue("String0"); + q.enQueue("String1"); + q.enQueue("String2"); + sop("the queue is not empty "+q.isEmpty()); + sop("the size of queue is "+q.size()); + sop("out queue "+q.deQueue()); + sop("out queue "+q.deQueue()); + sop("the size of queue is "+q.size()); + } +} \ No newline at end of file diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Stack.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Stack.java new file mode 100644 index 0000000000..3992f89f86 --- /dev/null +++ b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Stack.java @@ -0,0 +1,28 @@ +package com.github.ZhoufeifeiJAVA.coding2017.basic; + +public class Stack { + private MyLinkedList llist = null; + Stack(){ + llist = new MyLinkedList(); + } + public void push(Object o){ + llist.add(o); + } + + public Object pop(){ + return llist.removeLast(); + } + + public Object peek(){ + return llist.get(llist.size()-1); + } + public boolean isEmpty(){ + if(llist.size() != 0) + return true; + else + return false; + } + public int size(){ + return llist.size(); + } +} \ No newline at end of file diff --git a/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/StackTest.java b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/StackTest.java new file mode 100644 index 0000000000..4bcb60e35d --- /dev/null +++ b/group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/StackTest.java @@ -0,0 +1,17 @@ +package com.github.ZhoufeifeiJAVA.coding2017.basic; +public class StackTest{ + public static void sop(Object o){ + System.out.println(o); + } + public static void main(String[] args){ + Stack s = new Stack(); + s.push("String0"); + s.push("String1"); + s.push("String2"); + sop("the queue is not empty "+s.isEmpty()); + sop("the size of queue is "+s.size()); + sop("out queue "+s.pop()); + sop("just watch queue,not delete "+s.peek()); + sop("the size of queue is "+s.size()); + } +} \ No newline at end of file diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore new file mode 100644 index 0000000000..c24866af6d --- /dev/null +++ b/group02/812350401/.gitignore @@ -0,0 +1,3 @@ +/bin/ +/lib/ +/src/java_training diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/ArrayList.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/ArrayList.java new file mode 100644 index 0000000000..dd72d043fb --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/ArrayList.java @@ -0,0 +1,78 @@ +package com.github.miniyk2012.coding2017.basic; + +import java.util.Arrays; + + +public class ArrayList implements List { + + private int size = 0; + private int DEFAULT_LENGTH = 10; + + private Object[] elementData = new Object[DEFAULT_LENGTH]; + + public void add(Object o){ + ensureCapcacity(); + elementData[size++] = o; + } + public void add(int index, Object o){ + ensurnPosition(index); + ensureCapcacity(); + System.arraycopy(elementData, index, elementData, index + 1, + size - index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + ensureIndex(index); + return elementData[index]; + } + + public Object remove(int index){ + ensureIndex(index); + Object temp = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, + size - index - 1); + elementData[size-1] = null; + size--; + return temp; + } + + public void clear() { + elementData = new Object[DEFAULT_LENGTH]; + size = 0; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + Iterator iterator = new IteratorImp(this); + return iterator; + } + + private void ensureCapcacity() { + int oldLength = elementData.length; + if (size+1 > oldLength) { + elementData = Arrays.copyOf(elementData, 2*oldLength); + } + } + + private void ensureIndex(int index) { + if (index >= size || index < 0) + throw new ArrayIndexOutOfBoundsException(String.format("index %d out of bounds [0-%d)", index, size)); + } + + private void ensurnPosition(int index) { + if (index <0 || index>size) + throw new ArrayIndexOutOfBoundsException(String.format("position %d out of position [0-%d)", index, size)); + } + + @Override + public String toString() { + Object[] tempArray = Arrays.copyOf(elementData, size); + return Arrays.toString(tempArray); + } + +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/BinaryTreeNode.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..7c78767fb0 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/BinaryTreeNode.java @@ -0,0 +1,55 @@ +package com.github.miniyk2012.coding2017.basic; + +public class BinaryTreeNode > { + private E data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(E x) { + data = x; + } + public E getData() { + return data; + } + public void setData(E data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(E o){ + BinaryTreeNode node = new BinaryTreeNode(o); + boolean left = true; + BinaryTreeNode currentNode = this; + BinaryTreeNode previousNode = null; + + while (currentNode != null) { + previousNode = currentNode; + int compareTo = node.getData().compareTo(currentNode.getData()); + if (compareTo <= 0) { // 小于,往左插入 + currentNode = currentNode.left; + left = true; + } else { + currentNode = currentNode.right; + left = false; + } + } + if (left) { + previousNode.left = node; + } else { + previousNode.right = node; + } + return node; + } + +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Iterator.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..23424545e0 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.github.miniyk2012.coding2017.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/IteratorImp.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/IteratorImp.java new file mode 100644 index 0000000000..cfca8eaac7 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/IteratorImp.java @@ -0,0 +1,24 @@ +package com.github.miniyk2012.coding2017.basic; + +public class IteratorImp implements Iterator { + + private List aList; + private int cursor = 0; + + @Override + public boolean hasNext() { + return cursor != aList.size(); + } + + @Override + public Object next() { + int i = cursor; + Object next = aList.get(i); + cursor = i+1; + return next; + } + + public IteratorImp(List aList) { + this.aList = aList; + } +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/LinkedList.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/LinkedList.java new file mode 100644 index 0000000000..be9ea3de61 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/LinkedList.java @@ -0,0 +1,103 @@ +package com.github.miniyk2012.coding2017.basic; + +public class LinkedList implements List { + + private Node head; + private int size = 0; + + /** + * node接收的index一定是范围内的值,不可能越界 + * @param index + * @return a Node + */ + Node node(int index) { + Node x = head; + for (int i=0; i= size) + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); + } + + private void checkPositionIndex(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); + } +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/List.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/List.java new file mode 100644 index 0000000000..e6cd6619a7 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/List.java @@ -0,0 +1,10 @@ +package com.github.miniyk2012.coding2017.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + public Iterator iterator(); +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Queue.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Queue.java new file mode 100644 index 0000000000..9f22f2471d --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Queue.java @@ -0,0 +1,23 @@ +package com.github.miniyk2012.coding2017.basic; + +public class Queue { + + // 队列入口 -》1,2,3,4 -》队列出口 + private LinkedList aList = new LinkedList(); + + public void enQueue(Object o){ + aList.addFirst(o); + } + + public Object deQueue(){ + return aList.removeLast(); + } + + public boolean isEmpty(){ + return aList.size() == 0; + } + + public int size(){ + return aList.size(); + } +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Stack.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Stack.java new file mode 100644 index 0000000000..b2f2d6366b --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/Stack.java @@ -0,0 +1,25 @@ +package com.github.miniyk2012.coding2017.basic; + +public class Stack { + + // 栈顶 《-》 1,2,3,4 栈底 + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(0, o); + } + + public Object pop(){ + return elementData.remove(0); + } + + public Object peek(){ + return elementData.get(0); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ArrayListTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ArrayListTest.java new file mode 100644 index 0000000000..b308c6bfef --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ArrayListTest.java @@ -0,0 +1,14 @@ +package com.github.miniyk2012.coding2017.basic.test; + +import org.junit.Before; +import com.github.miniyk2012.coding2017.basic.ArrayList; + + +public class ArrayListTest extends ListTest { + + @Before + public void setUpArrayList() { + aList = new ArrayList(); + } + +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/BinaryTreeNodeTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..698506e2b5 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/BinaryTreeNodeTest.java @@ -0,0 +1,70 @@ +package com.github.miniyk2012.coding2017.basic.test; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import com.github.miniyk2012.coding2017.basic.BinaryTreeNode; + +public class BinaryTreeNodeTest { + + private BinaryTreeNode binaryTreeNode; + + /** + // 4 + // 1 5 + // 2 3 + */ + @Before + public void setUpBinaryTreeNode() { + binaryTreeNode = new BinaryTreeNode(4); + binaryTreeNode.insert(1); + binaryTreeNode.insert(3); + binaryTreeNode.insert(5); + binaryTreeNode.insert(2); + } + + @Test + public void testBinaryTreeNodeFunctional1() { + assertEquals(new Integer(4), binaryTreeNode.getData()); + assertEquals(new Integer(1), binaryTreeNode.getLeft().getData()); + assertEquals(new Integer(5), binaryTreeNode.getRight().getData()); + assertEquals(new Integer(3), binaryTreeNode.getLeft().getRight().getData()); + assertEquals(new Integer(2), binaryTreeNode.getLeft().getRight().getLeft().getData()); + } + + @Test + public void testBinaryTreeFunctional2() { + BinaryTreeNode node1 = binaryTreeNode.getLeft(); + assertEquals(new Integer(1), node1.getData()); + assertEquals(new Integer(3), node1.getRight().getData()); + assertEquals(new Integer(5), binaryTreeNode.getRight().getData()); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testBinaryTreeFunctional3() + { + BinaryTreeNode treeNode = new BinaryTreeNode(100); + treeNode.insert(10); + binaryTreeNode.setRight(treeNode); + // 4 + // 1 100 + // 2 3 10 + assertEquals(new Integer(4), binaryTreeNode.getData()); + assertEquals(new Integer(1), binaryTreeNode.getLeft().getData()); + assertEquals(new Integer(3), binaryTreeNode.getLeft().getRight().getData()); + assertEquals(new Integer(2), binaryTreeNode.getLeft().getRight().getLeft().getData()); + assertEquals(new Integer(100), binaryTreeNode.getRight().getData()); + assertEquals(new Integer(10), binaryTreeNode.getRight().getLeft().getData()); + + expectedEx.expect(Exception.class); + binaryTreeNode.getRight().getRight().getRight(); // null exception + binaryTreeNode.getRight().getRight().getLeft(); // null exception + } +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/LinkedListTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/LinkedListTest.java new file mode 100644 index 0000000000..487fd2ee00 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/LinkedListTest.java @@ -0,0 +1,93 @@ +package com.github.miniyk2012.coding2017.basic.test; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import com.github.miniyk2012.coding2017.basic.LinkedList; + +public class LinkedListTest extends ListTest{ + + private LinkedList aLinkedList; + + @Before + public void setUpLinkedList() { + aList = new LinkedList(); + aLinkedList = new LinkedList(); + } + + @Test + public void testAddFirst() { + aLinkedList.addFirst(5); + assertEquals(5, aLinkedList.get(0)); + + aLinkedList.addFirst(6); + assertEquals(6, aLinkedList.get(0)); + assertEquals(5, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + + @Test + public void testAddLast() { + aLinkedList.addLast("hello"); + assertEquals("hello", aLinkedList.get(0)); + + aLinkedList.addLast("world"); + assertEquals("hello", aLinkedList.get(0)); + assertEquals("world", aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + + @Test + public void testRemoveFirst() { + aLinkedList.addLast("hello"); + aLinkedList.addLast("world"); + + aLinkedList.removeFirst(); + assertEquals("world", aLinkedList.get(0)); + assertEquals(1, aLinkedList.size()); + + aLinkedList.removeFirst(); + assertEquals(0, aLinkedList.size()); + } + + @Test + public void testRemoveLast() { + aLinkedList.addFirst("world"); + aLinkedList.addFirst("hello"); + + aLinkedList.removeLast(); + assertEquals("hello", aLinkedList.get(0)); + assertEquals(1, aLinkedList.size()); + + aLinkedList.removeLast(); + assertEquals(0, aLinkedList.size()); + } + + @Test + public void testLinkedListFunctional() { + for (int i=1; i<4; i++) { + aLinkedList.add(i); // [1,2,3] + } + aLinkedList.remove(1); // [1,3] + + aLinkedList.add(1, 0); // [1,0,3] + for (int i=4; i<6; i++) { + aLinkedList.addFirst(i); // [5, 4, 1, 0, 3] + } + assertEquals(5, aLinkedList.size()); + assertEquals(5, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(0, aLinkedList.get(3)); + + aLinkedList.remove(3); // [5, 4, 1, 3] + assertEquals(3, aLinkedList.get(aLinkedList.size()-1)); + aLinkedList.removeLast(); // [5, 4, 1] + assertEquals(1, aLinkedList.get(aLinkedList.size()-1)); + aLinkedList.removeFirst(); // [4,1] + + assertEquals(4, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ListTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ListTest.java new file mode 100644 index 0000000000..587bf17f4d --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ListTest.java @@ -0,0 +1,117 @@ +package com.github.miniyk2012.coding2017.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import com.github.miniyk2012.coding2017.basic.Iterator; +import com.github.miniyk2012.coding2017.basic.List;; + +public class ListTest { + + protected static List aList; + + @Test + public void testFunctional() { + aList.add(1); + aList.add(2); + assertEquals(1, aList.get(0)); + assertEquals(2, aList.get(1)); + + aList.add(3); + aList.add(0, 5); + aList.add(2, 11); + assertEquals(5, aList.get(0)); + assertEquals(11, aList.get(2)); + + aList.add("hi"); + assertEquals("hi", aList.get(5)); + assertEquals(6, aList.size()); + + aList.remove(1); + assertEquals(11, aList.get(1)); + assertEquals(2, aList.get(2)); + + assertEquals(5, aList.size()); + } + + @Test + public void testAdd() { + for (int i=0; i<100; i++) + aList.add(i); + assertEquals(0, aList.get(0)); + assertEquals(99, aList.get(99)); + assertEquals(44, aList.get(44)); + } + + @Test + public void testRemove() { + aList.add(1); + aList.add(2); + aList.add(3); + int u = (Integer)aList.remove(2); + assertEquals(3, u); + assertEquals(2, aList.size()); + + aList.add(1, 5); + u = (Integer)aList.remove(0); + assertEquals(1, u); + assertEquals(5, aList.get(0)); + assertEquals(2, aList.get(1)); + assertEquals(2, aList.size()); + + aList.remove(0); + aList.remove(0); + assertEquals(0, aList.size()); + + + } + + @Test + public void testSize() { + for (int i=0; i<10; i++) + aList.add(i*2); + assertEquals(10, aList.size()); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testException() { + expectedEx.expect(Exception.class); + + aList.remove(1); + aList.add(3); + aList.add(2, 5); + } + + @Test + public void testIterator() { + Iterator it = aList.iterator(); + assertEquals(false, it.hasNext()); + + aList.add(1); + aList.add(2); + aList.add(3); + + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(2, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + aList.remove(1); + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + expectedEx.expect(Exception.class); + it.next(); + } + +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/QueueTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/QueueTest.java new file mode 100644 index 0000000000..67035c1dcf --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/QueueTest.java @@ -0,0 +1,33 @@ +package com.github.miniyk2012.coding2017.basic.test; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import com.github.miniyk2012.coding2017.basic.Queue; + +public class QueueTest { + private Queue queue; + + @Before + public void setUpQueue() { + queue = new Queue(); + } + + @Test + public void testQueueFunctional() { + assertEquals(true, queue.isEmpty()); + queue.enQueue(4); + queue.enQueue(2); + assertEquals(2, queue.size()); + assertEquals(false, queue.isEmpty()); + + int i = (Integer)queue.deQueue(); + assertEquals(4, i); + i = (Integer)queue.deQueue(); + assertEquals(2, i); + + assertEquals(0, queue.size()); + assertEquals(true, queue.isEmpty()); + } + +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/StackTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/StackTest.java new file mode 100644 index 0000000000..a9b4e14afd --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/StackTest.java @@ -0,0 +1,40 @@ +package com.github.miniyk2012.coding2017.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.github.miniyk2012.coding2017.basic.Stack; + +public class StackTest { + + private Stack stack; + + @Before + public void setUpStack() { + stack = new Stack(); + } + + @Test + public void testStackFunctional() { + assertEquals(true, stack.isEmpty()); + stack.push(4); + stack.push(2); + assertEquals(2, stack.size()); + assertEquals(false, stack.isEmpty()); + + int i = (Integer)stack.pop(); + assertEquals(2, i); + + i = (Integer)stack.peek(); + assertEquals(4, i); + + i = (Integer)stack.pop(); + assertEquals(4, i); + + assertEquals(0, stack.size()); + assertEquals(true, stack.isEmpty()); + } + +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/array/ArrayUtil.java b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..0845e60646 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/array/ArrayUtil.java @@ -0,0 +1,279 @@ +package com.github.miniyk2012.coding2017.coderising.array; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int size = origin.length; + if (size == 0) return; + int start = 0, end = size-1; + while (start < end) { + int temp = origin[start]; + origin[start++] = origin[end]; + origin[end--] = temp; + } + } + + /** + * 现在有如下的一个数组:int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray){ + if (oldArray==null) return null; + List list=new ArrayList<>(); + for (int e : oldArray) { + if (e != 0) { + list.add(e); + } + } + return list2Array(list); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + if (array1==null || array2==null) return null; + if (array1.length == 0) return Arrays.copyOf(array2, array2.length); + List list = array2List(array1); + int currentIndex = 0; + for (int e : array2) { + for (int index = currentIndex; index < list.size(); index++ ) { + currentIndex = index + 1; + if (list.get(index) == e) break; + if (list.get(index) > e) { + list.add(index, e); + break; + } + } + if (e > list.get(list.size()-1)) list.add(e); + } + return list2Array(list); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + * @throws Exception + */ + public int[] grow(int [] oldArray, int size) throws Exception{ + if (oldArray==null) return null; + if (size < 0) throw new Exception(); + int oldSize = oldArray.length; + int[] newArray = new int[size+oldSize]; + System.arraycopy(oldArray, 0, newArray, 0, oldSize); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if (max <= 1) return new int[0]; + int i = 1, j = 1; + List list = new ArrayList<>(); + list.add(i); + list.add(j); + int next = i+j; + while (max > next) { + list.add(next); + i = j; + j = next; + next = i+j; + } + return list2Array(list); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + // TODO 使用筛法,写的不好,有待改善 + if (max <= 2) return new int[0]; + List list = new ArrayList<>(); + int i; + for (i=2; i= 0) + list.remove(index); + k += currentNum; + } + currentNum = list.get(++i); + } + return list2Array(list); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + List list = new ArrayList<>(); + int[] factors; + for (int i=1; i list = new ArrayList<>(); + for (int i=1; i < num; i++) { + if(num % i == 0) list.add(i); + } + return list2Array(list); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + if (array.length == 0) return ""; + if (array.length == 1) return "" + array[0]; + StringBuilder s = new StringBuilder(); + for (int i=0; i转换为相同顺序和长度的int[] + * @param list + * @return + */ + private int[] list2Array(List list) { + int size = list.size(); + int[] newArray = new int[size]; + for (int i=0; i + * @param array + * @return + */ + private List array2List(int[] array) { + List list = new ArrayList<>(); + for (int e : array) { + list.add(e); + } + return list; + } + + public static void main(String []args) throws Exception { + ArrayUtil arrayUtil = new ArrayUtil(); + + // merge + int[] a1 = {1,2,3}, a2 = {-4,-2,2,3,4}; +// int[] a1 = {}, a2 = {}; +// int[] a1 = {1,2,3}, a2 = {}; +// int[] a1 = {}, a2 = {1,2,3}; +// int[] a1 = {4,5,6}, a2 = {1,2,3}; + int[] a3 = arrayUtil.merge(a1, a2); + System.out.println(Arrays.toString(a3)); + + // reverse +// a1 = new int[] {}; +// a1 = new int[] {4,}; +// a1 = new int[] {4,3,5,6,7,7,8}; + a1 = new int[] {4,3,5,6,7,7,8, 9}; + arrayUtil.reverseArray(a1); + System.out.println(Arrays.toString(a1)); + + // remove zero +// a1 = new int[] {}; +// a1 = new int[] {0,0}; + a1 = new int[] {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + a2 = arrayUtil.removeZero(a1); + System.out.println(Arrays.toString(a2)); + + // grow + a1 = new int[] {1,2,3}; + a2 = arrayUtil.grow(a1, 4); +// a2 = arrayUtil.grow(a1, 2); +// a2 = arrayUtil.grow(a1, 0); + System.out.println(Arrays.toString(a2)); + + // fibonacci + a1 = arrayUtil.fibonacci(15); +// a1 = arrayUtil.fibonacci(1); +// a1 = arrayUtil.fibonacci(2); +// a1 = arrayUtil.fibonacci(-2); + System.out.println(Arrays.toString(a1)); + + // prime + a1 = arrayUtil.getPrimes(2); +// a1 = arrayUtil.getPrimes(3); +// a1 = arrayUtil.getPrimes(8); +// a1 = arrayUtil.getPrimes(12); +// a1 = arrayUtil.getPrimes(23); +// a1 = arrayUtil.getPrimes(24); +// a1 = arrayUtil.getPrimes(50); + a1 = arrayUtil.getPrimes(100); + System.out.println(Arrays.toString(a1)); + + // perfectNumbers + a1 = arrayUtil.getPerfectNumbers(1000); + System.out.println(Arrays.toString(a1)); + + // join +// a1 = new int[] {}; +// a1 = new int[] {1}; + a1 = new int[] {1,2,3}; + String str = arrayUtil.join(a1, "-"); + System.out.println(str); + + } +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/array/test/ArrayUtilTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/array/test/ArrayUtilTest.java new file mode 100644 index 0000000000..58de9f3efb --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/array/test/ArrayUtilTest.java @@ -0,0 +1,156 @@ +package com.github.miniyk2012.coding2017.coderising.array.test; + +import static org.junit.Assert.*; + +import java.util.Arrays; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import com.github.miniyk2012.coding2017.coderising.array.ArrayUtil; + +public class ArrayUtilTest +{ + private ArrayUtil myArray; + + @Before + public void setUp() throws Exception + { + myArray = new ArrayUtil(); + } + + @Test + public void testReverseArray() + { + int[] a = {1, 2, 1, 3, 5, 6}; + int[] b = {6, 5, 3, 1, 2, 1}; + + myArray.reverseArray(a); + assertArrayEquals(a, b); + + int[] c = new int[0]; + myArray.reverseArray(c); + assertArrayEquals(c, new int[0]); + + } + + @Test + public void testRemoveZero() + { + int[] oldArr= {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 1, 2, 0, 5}; + int b[] = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 1, 2, 5}; + int[] c = myArray.removeZero(oldArr); + assertArrayEquals(b, c); + + int[] d = null; + int[] e = myArray.removeZero(d); + assertNull(e); + + } + + @Test + public void testMerge() + { + int a1[] = {1, 2, 3, 4, 5}; + int b1[] = {3, 4, 5, 6, 7, 8}; + int c1[] = {1, 2, 3, 4, 5, 6, 7, 8}; + int[] newArray1 = myArray.merge(a1, b1); + assertArrayEquals(c1, newArray1); + + int a2[] = new int[0]; + int b2[] = {0, 2, 3, 6, 7, 8}; + int c2[] = {0, 2, 3, 6, 7, 8}; + int[] newArray2 = myArray.merge(a2, b2); + assertArrayEquals(c2, newArray2); + + int a3[] = {0, 2, 3, 6, 7, 8}; + int b3[] = new int[0]; + int c3[] = {0, 2, 3, 6, 7, 8}; + int[] newArray3 = myArray.merge(a3, b3); + assertArrayEquals(c3, newArray3); + + int[] a4 = null; + int[] b4 = null; + int[] newArray4 = myArray.merge(a4, b4); + assertNull(newArray4); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testGrow() throws Exception + { + int[] a = {3, 5, 7, 8, 9}; + int [] oldA = Arrays.copyOf(a, a.length); + int[] b = {3, 5, 7, 8, 9, 0, 0, 0}; + int[] newArray = myArray.grow(a, 3); + assertArrayEquals(b, newArray); + assertArrayEquals(a, oldA); + + int[] c = null; + int[] newArray1 = myArray.grow(c, 3); + assertNull(newArray1); + + // size < 0 抛出异常 + expectedEx.expect(Exception.class); + myArray.grow(a, -3); + } + + @Test + public void testFibonacci() + { + //max == 1时返回空数组 + int[] array1 = myArray.fibonacci(1); + int[] b = new int[0]; + assertArrayEquals(array1, b); + + + int[] array2= myArray.fibonacci(35); + int[] c = {1, 1, 2, 3, 5, 8, 13, 21, 34 }; + assertArrayEquals(c, array2); + } + + @Test + public void testGetPrimes() + { + int[] a = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 }; + int[] array1 = myArray.getPrimes(35); + assertArrayEquals(a, array1); + + //max <= 2的时候没有素数,数组为空数组 + int[] array2 = myArray.getPrimes(1); + int[] b = new int[0]; + assertArrayEquals(array2, b); + } + + @Test + public void testGetPerfectNumbers() + { + int[] array = myArray.getPerfectNumbers(10000); + int[] a = {6, 28, 496, 8128 }; + assertArrayEquals(a, array); + } + + @Test + public void testJoin() + { + int[] Array0 = {3, 5, 7, 8, 9}; + String s0 = myArray.join(Array0, "-"); + String s1 = "3-5-7-8-9"; + assertEquals(s1, s0); + + int[] Array1 = {3}; + String s2 = myArray.join(Array1, "-"); + String s3 = "3"; + assertEquals(s2, s3); + + //传递空数组时,返回空字符串 + int[] Array2 = new int[0]; + String s4 = myArray.join(Array2, "-"); + String s5 = ""; + assertEquals(s4, s5); + } + +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/LoginAction.java b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..b0322078ee --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/LoginAction.java @@ -0,0 +1,48 @@ +package com.github.miniyk2012.coding2017.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public void setMessage(String message) { + this.message = message; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } + + @Override + public String toString() { + return "LoginAction [name=" + name + ", password=" + password + ", message=" + message + "]"; + } +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/LogoutAction.java b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/LogoutAction.java new file mode 100644 index 0000000000..3a8bf9fbc9 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/LogoutAction.java @@ -0,0 +1,48 @@ +package com.github.miniyk2012.coding2017.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LogoutAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return "LogoutAction [name=" + name + ", password=" + password + ", message=" + message + "]"; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "logout successful"; + return "success"; + } + this.message = "logout failed,please check your user/pwd"; + return "error"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..523f43b275 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java @@ -0,0 +1,173 @@ +package com.github.miniyk2012.coding2017.coderising.litestruts; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.logging.Logger; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.io.SAXReader; +import org.dom4j.Element; + + +public class Struts { + + /** dom4j object model representation of a xml document. Note: We use the interface(!) not its implementation */ + private static Document doc; + private static Element aElement; + private static Object object; + private static View view; + private static final Logger logger = Logger.getLogger(Struts.class.getName()); + + public static View runAction(String actionName, Map parameters) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + readXml(); + String retValue = processAction(actionName, parameters); + view = generateView(retValue); + return view; + } + + private static View generateView(String retValue) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + view = new View(); + Map map = getFields(); + String jsp = getJsp(retValue); + view.setParameters(map); + view.setJsp(jsp); + return view; + } + + private static String getJsp(String retValue) { + for (Iterator i = aElement.elementIterator( "result" ); i.hasNext();) { + Element result = (Element) i.next(); + if (result.attributeValue("name").equals(retValue)) { + return result.getText(); + } + } + return ""; + } + + /** + * @return + * @throws IntrospectionException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + private static Map getFields() + throws IntrospectionException, IllegalAccessException, InvocationTargetException { + Map map = new HashMap<>(); + Class clazz = object.getClass(); + Field[] fields = object.getClass().getDeclaredFields();//获得属性 + for (Field field : fields) { + PropertyDescriptor pd = new PropertyDescriptor(field.getName(), + clazz); + Method getMethod = pd.getReadMethod();//获得get方法 + String value = (String) getMethod.invoke(object);//执行get方法返回一个Object + map.put(field.getName(), value); + } + return map; + } + + private static void readXml() throws DocumentException { + String fileName = Thread.currentThread().getContextClassLoader().getResource("").getPath() + + "com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml"; + File aFile = new File(fileName); + SAXReader xmlReader = new SAXReader(); + doc = xmlReader.read(aFile); + } + + private static String processAction(String actionName, Map parameters) throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { + generateObject(actionName); + setFields(parameters); + return doExecute(); + } + + /** + * @return + * @throws NoSuchMethodException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + private static String doExecute() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + Class c = object.getClass(); + Method method = c.getMethod("execute"); + String ret = (String) method.invoke(object); + return ret; + } + + /** + * @param parameters + * @throws NoSuchMethodException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + private static void setFields(Map parameters) + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + for (Map.Entry entry: parameters.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + key = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); + Class c = object.getClass(); + Method method = c.getMethod(key, String.class); + method.invoke(object, value); + } + } + + /** + * @param actionName + * @throws InstantiationException + * @throws IllegalAccessException + * @throws ClassNotFoundException + */ + private static void generateObject(String actionName) + throws InstantiationException, IllegalAccessException, ClassNotFoundException { + Element root = doc.getRootElement(); + String className = null; + for ( Iterator i = root.elementIterator(); i.hasNext(); ) { + Element actionElement = (Element) i.next(); + if (actionElement.attributeValue("name").equals(actionName)) { + aElement = actionElement; + className = actionElement.attributeValue("class"); + break; + } + } + if (className == null) throw new InstantiationException("no such className"); + object = Class.forName(className).newInstance(); + } + + + public static void main(String args[]) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException + { + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + View view = runAction("login", params); + logger.info(view.toString()); + } + +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..04b3f612f1 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java @@ -0,0 +1,75 @@ +package com.github.miniyk2012.coding2017.coderising.litestruts; + +import java.beans.IntrospectionException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + + @Test + public void testLogoutActionSuccess() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + + String actionName = "logout"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/welcome.jsp", view.getJsp()); + Assert.assertEquals("logout successful", view.getParameters().get("message")); + } + + @Test + public void testLogoutActionFailed() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + String actionName = "logout"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/error.jsp", view.getJsp()); + Assert.assertEquals("logout failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/View.java b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/View.java new file mode 100644 index 0000000000..7dacd0d9fe --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/View.java @@ -0,0 +1,27 @@ +package com.github.miniyk2012.coding2017.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } + @Override + public String toString() { + return "View [jsp=" + jsp + ", parameters=" + parameters + "]"; + } +} diff --git a/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..4c93085704 --- /dev/null +++ b/group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group02/851113375/.gitignore b/group02/851113375/.gitignore new file mode 100644 index 0000000000..fa968c2f2b --- /dev/null +++ b/group02/851113375/.gitignore @@ -0,0 +1,3 @@ +/bin/ +.classpath +.project diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/array/ArrayUtil.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/array/ArrayUtil.java new file mode 100644 index 0000000000..05e26ebe51 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/array/ArrayUtil.java @@ -0,0 +1,228 @@ +package com.github.eloiseSJTU.coding2017.array; + +import java.security.InvalidParameterException; + +import com.github.eloiseSJTU.coding2017.basic.ArrayList; +import com.github.eloiseSJTU.coding2017.basic.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if (origin == null) { + return; + } + int left = 0; + int right = origin.length - 1; + while (left < right) { + int tmp = origin[left]; + origin[left] = origin[right]; + origin[right] = tmp; + left++; + right--; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + if (oldArray == null) { + return null; + } + int count = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + count++; + } + } + int[] newArray = new int[count]; + int index = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[index++] = oldArray[i]; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + if (array1 == null) { + return array2; + } + if (array2 == null) { + return array1; + } + int len1 = array1.length; + int len2 = array2.length; + ArrayList arrayList = new ArrayList(); + int i = 0; + int j = 0; + while (i < len1 && j < len2) { + if (array1[i] < array2[j]) { + arrayList.add(array1[i]); + i++; + } else if (array1[i] > array2[j]) { + arrayList.add(array2[j]); + j++; + } else { + arrayList.add(array1[i]); + i++; + j++; + } + } + while (i < len1) { + arrayList.add(array1[i++]); + } + while (j < len2) { + arrayList.add(array2[j++]); + } + return toArray(arrayList); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + if (oldArray == null) { + return null; + } + if (size < 0) { + throw new InvalidParameterException("size can't be negative"); + } + int[] newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max <= 1) { + return new int[0]; + } + ArrayList arrayList = new ArrayList(); + int a = 1; + arrayList.add(a); + int b = 1; + arrayList.add(b); + int c = a + b; + while (c < max) { + arrayList.add(c); + a = b; + b = c; + c = a + b; + } + + return toArray(arrayList); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + ArrayList arrayList = new ArrayList(); + for (int i = 2; i < max; i++) { + boolean pn = true; + for (int j = 0; j < arrayList.size(); j++) { + if (i % (int) arrayList.get(j) == 0) { + pn = false; + break; + } + } + if (pn) { + arrayList.add(i); + } + } + + return toArray(arrayList); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + ArrayList arrayList = new ArrayList(); + for (int i = 2; i < max; i++) { + int sum = 0; + for (int j = 1; j < i; j++) { + if (i % j == 0) { + sum += j; + } + } + if (sum == i) { + arrayList.add(i); + } + } + return toArray(arrayList); + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + if (array == null || array.length == 0) { + return ""; + } + StringBuffer stringBuffer = new StringBuffer(); + int i = 0; + for (; i < array.length - 1; i++) { + stringBuffer.append(array[i] + seperator); + } + stringBuffer.append(array[i]); + return stringBuffer.toString(); + } + + private int[] toArray(List list) { + int size = list.size(); + int[] result = new int[size]; + for (int i = 0; i < size; i++) { + result[i] = (int) list.get(i); + } + return result; + } + +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/array/test/ArrayUtilTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/array/test/ArrayUtilTest.java new file mode 100644 index 0000000000..88a5108d07 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/array/test/ArrayUtilTest.java @@ -0,0 +1,142 @@ +package com.github.eloiseSJTU.coding2017.array.test; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import com.github.eloiseSJTU.coding2017.array.ArrayUtil; + +public class ArrayUtilTest { + private ArrayUtil myArray; + + @Before + public void setUp() throws Exception { + myArray = new ArrayUtil(); + } + + @Test + public void testReverseArray() { + int[] a = { 1, 2, 1, 3, 5, 6 }; + int[] b = { 6, 5, 3, 1, 2, 1 }; + + myArray.reverseArray(a); + assertArrayEquals(a, b); + + int[] c = new int[0]; + myArray.reverseArray(c); + assertArrayEquals(c, new int[0]); + } + + @Test + public void testRemoveZero() { + int[] oldArr = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 1, 2, 0, 5 }; + int b[] = { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 1, 2, 5 }; + int[] c = myArray.removeZero(oldArr); + assertArrayEquals(b, c); + + int[] d = null; + int[] e = myArray.removeZero(d); + assertNull(e); + } + + @Test + public void testMerge() { + int a1[] = { 1, 2, 3, 4, 5 }; + int b1[] = { 3, 4, 5, 6, 7, 8 }; + int c1[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int[] newArray1 = myArray.merge(a1, b1); + assertArrayEquals(c1, newArray1); + + int a2[] = new int[0]; + int b2[] = { 0, 2, 3, 6, 7, 8 }; + int c2[] = { 0, 2, 3, 6, 7, 8 }; + int[] newArray2 = myArray.merge(a2, b2); + assertArrayEquals(c2, newArray2); + + int a3[] = { 0, 2, 3, 6, 7, 8 }; + int b3[] = new int[0]; + int c3[] = { 0, 2, 3, 6, 7, 8 }; + int[] newArray3 = myArray.merge(a3, b3); + assertArrayEquals(c3, newArray3); + + int[] a4 = null; + int[] b4 = null; + int[] newArray4 = myArray.merge(a4, b4); + assertNull(newArray4); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testGrow() { + int[] a = { 3, 5, 7, 8, 9 }; + int[] b = { 3, 5, 7, 8, 9, 0, 0, 0 }; + int[] newArray = myArray.grow(a, 3); + assertArrayEquals(b, newArray); + + int[] c = null; + int[] newArray1 = myArray.grow(c, 3); + assertNull(newArray1); + + // size < 0 抛出异常 + expectedEx.expect(Exception.class); + myArray.grow(a, -3); + } + + @Test + public void testFibonacci() { + // max == 1时返回空数组 + int[] array1 = myArray.fibonacci(1); + int[] b = new int[0]; + assertArrayEquals(array1, b); + + int[] array2 = myArray.fibonacci(35); + int[] c = { 1, 1, 2, 3, 5, 8, 13, 21, 34 }; + assertArrayEquals(c, array2); + } + + @Test + public void testGetPrimes() { + int[] a = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 }; + int[] array1 = myArray.getPrimes(35); + assertArrayEquals(a, array1); + + // max <= 2的时候没有素数,数组为空数组 + int[] array2 = myArray.getPrimes(1); + int[] b = new int[0]; + assertArrayEquals(array2, b); + } + + @Test + public void testGetPerfectNumbers() { + int[] array = myArray.getPerfectNumbers(10000); + int[] a = { 6, 28, 496, 8128 }; + assertArrayEquals(a, array); + } + + @Test + public void testJoin() { + int[] Array0 = { 3, 5, 7, 8, 9 }; + String s0 = myArray.join(Array0, "-"); + String s1 = "3-5-7-8-9"; + assertEquals(s1, s0); + + int[] Array1 = { 3 }; + String s2 = myArray.join(Array1, "-"); + String s3 = "3"; + assertEquals(s2, s3); + + // 传递空数组时,返回空字符串 + int[] Array2 = new int[0]; + String s4 = myArray.join(Array2, "-"); + String s5 = ""; + assertEquals(s4, s5); + } + +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/ArrayList.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/ArrayList.java new file mode 100644 index 0000000000..1aa396ce37 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/ArrayList.java @@ -0,0 +1,91 @@ + +package com.github.eloiseSJTU.coding2017.basic; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + ensureCapacity(size + 1); + + elementData[size++] = o; + } + + public void add(int index, Object o) { + checkBoundsForAdd(index); + + ensureCapacity(size + 1); + + if (index < size) { + System.arraycopy(elementData, index, elementData, index + 1, size - index); + } + elementData[index] = o; + size++; + } + + public Object get(int index) { + checkBounds(index); + + return elementData[index]; + } + + public Object remove(int index) { + checkBounds(index); + + Object o = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + elementData[--size] = null; + return o; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new Itr(); + } + + private class Itr implements Iterator { + + private int cur; + + @Override + public boolean hasNext() { + return cur != size; + } + + @Override + public Object next() { + if (cur >= size) { + throw new NoSuchElementException(); + } + return elementData[cur++]; + } + + } + + private void ensureCapacity(int capacity) { + if (capacity > elementData.length) { + capacity = elementData.length << 1; + elementData = Arrays.copyOf(elementData, capacity); + } + } + + private void checkBounds(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + } + + private void checkBoundsForAdd(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + } +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/BinaryTreeNode.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..9aa88f2155 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/BinaryTreeNode.java @@ -0,0 +1,72 @@ +package com.github.eloiseSJTU.coding2017.basic; + +public class BinaryTreeNode { + + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode() {} + + public BinaryTreeNode(Integer data, BinaryTreeNode left, BinaryTreeNode right) { + this.data = data; + this.left = left; + this.right = right; + } + + public Integer getData() { + return data; + } + + public void setData(Integer data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Integer o) { + if (data == null) { + data = o; + } else { + if (o < data) { + if (left == null) { + left = new BinaryTreeNode(o, null, null); + } else { + left = left.insert(o); + } + } else { + if (right == null) { + right = new BinaryTreeNode(o, null, null); + } else { + right = right.insert(o); + } + } + } + return this; + } + + public void print() { + if (left != null) { + left.print(); + } + System.out.println(data); + if (right != null) { + right.print(); + } + } + +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Iterator.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..c37495db66 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.github.eloiseSJTU.coding2017.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/LinkedList.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/LinkedList.java new file mode 100644 index 0000000000..19833b1853 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/LinkedList.java @@ -0,0 +1,170 @@ +package com.github.eloiseSJTU.coding2017.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private int size = 0; + + private Node head; + + public void add(Object o) { + addLast(o); + } + + public void add(int index, Object o) { + checkBoundsForAdd(index); + + if (index == 0) { + addFirst(o); + } else if (index == size) { + addLast(o); + } else { + Node cur = head; + while (--index > 0) { + cur = cur.next; + } + Node newNode = new Node(o, cur.next); + cur.next = newNode; + size++; + } + } + + public Object get(int index) { + checkBounds(index); + + Node cur = head; + while (index-- > 0) { + cur = cur.next; + } + return cur.data; + } + + public Object remove(int index) { + checkBounds(index); + + if (index == 0) { + return removeFirst(); + } else if (index == size - 1) { + return removeLast(); + } else { + Node cur = head; + int i = 0; + while (++i < index) { + cur = cur.next; + } + Node node = cur.next; + Object o = node.data; + cur.next = node.next; + node.data = null; + node.next = null; + size--; + return o; + } + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newNode = new Node(o, head); + head = newNode; + size++; + } + + public void addLast(Object o) { + Node newNode = new Node(o, null); + if (head == null) { + head = newNode; + } else { + Node cur = head; + while (cur.next != null) { + cur = cur.next; + } + cur.next = newNode; + } + size++; + } + + public Object removeFirst() { + if (head == null) { + throw new NoSuchElementException(); + } + + Object o = head.data; + Node node = head.next; + head.data = null; + head.next = null; + head = node; + size--; + return o; + } + + public Object removeLast() { + if (head == null) { + throw new NoSuchElementException(); + } + + if (head.next == null) { + return removeFirst(); + } + + Node cur = head; + int index = 0; + while (++index < size - 1) { + cur = cur.next; + } + Object o = cur.next.data; + cur.next.data = null; + cur.next = null; + size--; + return o; + } + + public Iterator iterator() { + return new Itr(); + } + + private class Itr implements Iterator { + + private Node cur = head; + + @Override + public boolean hasNext() { + return cur != null; + } + + @Override + public Object next() { + if (cur == null) { + throw new NoSuchElementException(); + } + Object o = cur.data; + cur = cur.next; + return o; + } + + } + + private static class Node { + Object data; + Node next; + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + private void checkBounds(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + } + + private void checkBoundsForAdd(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + } +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/List.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/List.java new file mode 100644 index 0000000000..2f6bdcc950 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/List.java @@ -0,0 +1,15 @@ +package com.github.eloiseSJTU.coding2017.basic; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); + + public Iterator iterator(); +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Queue.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Queue.java new file mode 100644 index 0000000000..96e6547548 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Queue.java @@ -0,0 +1,28 @@ +package com.github.eloiseSJTU.coding2017.basic; + +public class Queue { + + private int size = 0; + + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o) { + elementData.addLast(o); + size++; + } + + public Object deQueue() { + Object o = elementData.get(0); + elementData.removeFirst(); + size--; + return o; + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Stack.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Stack.java new file mode 100644 index 0000000000..22b5117842 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Stack.java @@ -0,0 +1,31 @@ +package com.github.eloiseSJTU.coding2017.basic; + +public class Stack { + + private int size = 0; + + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + size++; + } + + public Object pop() { + Object o = elementData.get(--size); + elementData.remove(size); + return o; + } + + public Object peek() { + return elementData.get(size - 1); + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ArrayListTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ArrayListTest.java new file mode 100644 index 0000000000..a2bd0cad69 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ArrayListTest.java @@ -0,0 +1,15 @@ +package com.github.eloiseSJTU.coding2017.basic.test; + +import org.junit.Before; + +import com.github.eloiseSJTU.coding2017.basic.ArrayList; + + +public class ArrayListTest extends ListTest { + + @Before + public void setUpArrayList() { + aList = new ArrayList(); + } + +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/BinaryTreeNodeTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..3da3cf3fa0 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/BinaryTreeNodeTest.java @@ -0,0 +1,34 @@ +package com.github.eloiseSJTU.coding2017.basic.test; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; + +import com.github.eloiseSJTU.coding2017.basic.BinaryTreeNode; + +public class BinaryTreeNodeTest { + + private BinaryTreeNode binaryTreeNode; + + @Before + public void setUpBinaryTreeNode() { + binaryTreeNode = new BinaryTreeNode(); + } + + @Test + public void testBinaryTreeNodeFunctional() { + binaryTreeNode.insert(4); + binaryTreeNode.insert(1); + binaryTreeNode.insert(3); + binaryTreeNode.insert(5); + binaryTreeNode.insert(2); + assertEquals(true, 4 == binaryTreeNode.getData()); + assertEquals(true, 1 == binaryTreeNode.getLeft().getData()); + assertEquals(true, 5 == binaryTreeNode.getRight().getData()); + assertEquals(true, 3 == binaryTreeNode.getLeft().getRight().getData()); + assertEquals(true, 2 == binaryTreeNode.getLeft().getRight().getLeft().getData()); + binaryTreeNode.print(); + } + +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/LinkedListTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/LinkedListTest.java new file mode 100644 index 0000000000..0ad905694c --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/LinkedListTest.java @@ -0,0 +1,93 @@ +package com.github.eloiseSJTU.coding2017.basic.test; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import com.github.eloiseSJTU.coding2017.basic.LinkedList; + +public class LinkedListTest extends ListTest{ + + private LinkedList aLinkedList; + + @Before + public void setUpLinkedList() { + aList = new LinkedList(); + aLinkedList = new LinkedList(); + } + + @Test + public void testAddFirst() { + aLinkedList.addFirst(5); + assertEquals(5, aLinkedList.get(0)); + + aLinkedList.addFirst(6); + assertEquals(6, aLinkedList.get(0)); + assertEquals(5, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + + @Test + public void testAddLast() { + aLinkedList.addLast("hello"); + assertEquals("hello", aLinkedList.get(0)); + + aLinkedList.addLast("world"); + assertEquals("hello", aLinkedList.get(0)); + assertEquals("world", aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + + @Test + public void testRemoveFirst() { + aLinkedList.addLast("hello"); + aLinkedList.addLast("world"); + + aLinkedList.removeFirst(); + assertEquals("world", aLinkedList.get(0)); + assertEquals(1, aLinkedList.size()); + + aLinkedList.removeFirst(); + assertEquals(0, aLinkedList.size()); + } + + @Test + public void testRemoveLast() { + aLinkedList.addFirst("world"); + aLinkedList.addFirst("hello"); + + aLinkedList.removeLast(); + assertEquals("hello", aLinkedList.get(0)); + assertEquals(1, aLinkedList.size()); + + aLinkedList.removeLast(); + assertEquals(0, aLinkedList.size()); + } + + @Test + public void testLinkedListFunctional() { + for (int i=1; i<4; i++) { + aLinkedList.add(i); // [1,2,3] + } + aLinkedList.remove(1); // [1,3] + + aLinkedList.add(1, 0); // [1,0,3] + for (int i=4; i<6; i++) { + aLinkedList.addFirst(i); // [5, 4, 1, 0, 3] + } + assertEquals(5, aLinkedList.size()); + assertEquals(5, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(0, aLinkedList.get(3)); + + aLinkedList.remove(3); // [5, 4, 1, 3] + assertEquals(3, aLinkedList.get(aLinkedList.size()-1)); + aLinkedList.removeLast(); // [5, 4, 1] + assertEquals(1, aLinkedList.get(aLinkedList.size()-1)); + aLinkedList.removeFirst(); // [4,1] + + assertEquals(4, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ListTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ListTest.java new file mode 100644 index 0000000000..956ecb9167 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ListTest.java @@ -0,0 +1,120 @@ +package com.github.eloiseSJTU.coding2017.basic.test; + +import static org.junit.Assert.assertEquals; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import com.github.eloiseSJTU.coding2017.basic.Iterator; +import com.github.eloiseSJTU.coding2017.basic.List;; + +public class ListTest { + + protected static List aList; + + @Test + public void testFunctional() { + aList.add(1); + aList.add(2); + assertEquals(1, aList.get(0)); + assertEquals(2, aList.get(1)); + + aList.add(3); + aList.add(0, 5); + aList.add(2, 11); + assertEquals(5, aList.get(0)); + assertEquals(11, aList.get(2)); + + aList.add("hi"); + assertEquals("hi", aList.get(5)); + assertEquals(6, aList.size()); + + aList.remove(1); + assertEquals(11, aList.get(1)); + assertEquals(2, aList.get(2)); + + assertEquals(5, aList.size()); + } + + @Test + public void testAdd() { + for (int i = 0; i < 1000; i++) + aList.add(i); + assertEquals(0, aList.get(0)); + assertEquals(100, aList.get(100)); + assertEquals(999, aList.get(999)); + } + + @Test + public void testRemove() { + aList.add(1); + aList.add(2); + aList.add(3); + int u = (Integer)aList.remove(2); + assertEquals(3, u); + assertEquals(2, aList.size()); + + aList.add(1, 5); + u = (Integer)aList.remove(0); + assertEquals(1, u); + assertEquals(5, aList.get(0)); + assertEquals(2, aList.get(1)); + assertEquals(2, aList.size()); + + aList.remove(0); + aList.remove(0); + assertEquals(0, aList.size()); + + + } + + @Test + public void testSize() { + for (int i = 0; i < 10; i++) + aList.add(i * 2); + assertEquals(10, aList.size()); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testException() { + expectedEx.expect(Exception.class); + aList.remove(1); + + aList.add(3); + + expectedEx.expect(Exception.class); + aList.add(2, 5); + } + + @Test + public void testIterator() { + Iterator it = aList.iterator(); + assertEquals(false, it.hasNext()); + + aList.add(1); + aList.add(2); + aList.add(3); + + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(2, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + aList.remove(1); + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + expectedEx.expect(Exception.class); + it.next(); + } + +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/QueueTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/QueueTest.java new file mode 100644 index 0000000000..39023e8aaa --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/QueueTest.java @@ -0,0 +1,33 @@ +package com.github.eloiseSJTU.coding2017.basic.test; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import com.github.eloiseSJTU.coding2017.basic.Queue; + +public class QueueTest { + private Queue queue; + + @Before + public void setUpQueue() { + queue = new Queue(); + } + + @Test + public void testQueueFunctional() { + assertEquals(true, queue.isEmpty()); + queue.enQueue(4); + queue.enQueue(2); + assertEquals(2, queue.size()); + assertEquals(false, queue.isEmpty()); + + int i = (Integer)queue.deQueue(); + assertEquals(4, i); + i = (Integer)queue.deQueue(); + assertEquals(2, i); + + assertEquals(0, queue.size()); + assertEquals(true, queue.isEmpty()); + } + +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/StackTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/StackTest.java new file mode 100644 index 0000000000..98d2bd9de9 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/StackTest.java @@ -0,0 +1,40 @@ +package com.github.eloiseSJTU.coding2017.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.github.eloiseSJTU.coding2017.basic.Stack; + +public class StackTest { + + private Stack stack; + + @Before + public void setUpStack() { + stack = new Stack(); + } + + @Test + public void testStackFunctional() { + assertEquals(true, stack.isEmpty()); + stack.push(4); + stack.push(2); + assertEquals(2, stack.size()); + assertEquals(false, stack.isEmpty()); + + int i = (Integer)stack.pop(); + assertEquals(2, i); + + i = (Integer)stack.peek(); + assertEquals(4, i); + + i = (Integer)stack.pop(); + assertEquals(4, i); + + assertEquals(0, stack.size()); + assertEquals(true, stack.isEmpty()); + } + +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/LoginAction.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/LoginAction.java new file mode 100644 index 0000000000..f95e054d95 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/LoginAction.java @@ -0,0 +1,46 @@ +package com.github.eloiseSJTU.coding2017.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/Struts.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/Struts.java new file mode 100644 index 0000000000..11df02b877 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/Struts.java @@ -0,0 +1,81 @@ +package com.github.eloiseSJTU.coding2017.litestruts; + +import java.beans.PropertyDescriptor; +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + View view = new View(); + SAXReader saxReader = new SAXReader(); + try { + // 0. 读取配置文件struts.xml + Document document = saxReader.read(new File(getPackagePath() + "struts.xml")); + Element struts = document.getRootElement(); + for (Iterator i = struts.elementIterator("action"); i.hasNext();) { + Element action = (Element) i.next(); + // 1. 根据actionName找到相对应的class,例如LoginAction,通过反射实例化(创建对象) + if (actionName.equals(action.attributeValue("name"))) { + String className = action.attributeValue("class"); + Class clazz = Class.forName(className); + Object object = clazz.newInstance(); + // 根据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + // ("name"="test", "password"="1234"),那就应该调用 + // setName和setPassword方法 + for (Map.Entry entry : parameters.entrySet()) { + PropertyDescriptor descriptor = new PropertyDescriptor(entry.getKey(), clazz); + Method method = descriptor.getWriteMethod(); + method.invoke(object, entry.getValue()); + } + // 2. 通过反射调用对象的execute方法,并获得返回值 + Method excute = clazz.getMethod("execute"); + String result = (String) excute.invoke(object); + // 3. 通过反射找到对象的所有getter方法(例如 getMessage),通过反射来调用, + // 把值和属性形成一个HashMap,例如{"message": "登录成功"}, + // 放到View对象的parameters + Map map = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + PropertyDescriptor descriptor = new PropertyDescriptor(field.getName(), clazz); + Method method = descriptor.getReadMethod(); + Object value = method.invoke(object); + map.put(field.getName(), value); + } + view.setParameters(map); + // 4. 根据struts.xml中的 配置,以及execute的返回值, + // 确定哪一个jsp放到View对象的jsp字段中。 + for (Iterator j = action.elementIterator("result"); j.hasNext();) { + Element element = (Element) j.next(); + if (result.equals(element.attributeValue("name"))) { + view.setJsp(element.getText()); + break; + } + } + break; + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + + return view; + } + + private static String getPackagePath() { + String path = Struts.class.getResource("").toString().replace("/", File.separator); + if (path.startsWith("file")) { + path = path.substring(5); + } + return path; + } + +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/View.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/View.java new file mode 100644 index 0000000000..093026d7c3 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/View.java @@ -0,0 +1,26 @@ +package com.github.eloiseSJTU.coding2017.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/struts.xml b/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/struts.xml new file mode 100644 index 0000000000..ba5aa33139 --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/test/StrutsTest.java b/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/test/StrutsTest.java new file mode 100644 index 0000000000..f52b71975f --- /dev/null +++ b/group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/test/StrutsTest.java @@ -0,0 +1,41 @@ +package com.github.eloiseSJTU.coding2017.litestruts.test; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +import com.github.eloiseSJTU.coding2017.litestruts.Struts; +import com.github.eloiseSJTU.coding2017.litestruts.View; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); // 密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/array/ArrayUtil.java b/group02/953840070/src/com/github/lqingchenl/coding2017/array/ArrayUtil.java new file mode 100644 index 0000000000..a221c781b5 --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/array/ArrayUtil.java @@ -0,0 +1,296 @@ +package com.github.lqingchenl.coding2017.array; + +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int length = origin.length; + + int[] b = new int[length]; + for (int i = 0; i < length; i++) { + b[i] = origin[i]; + } + for (int i = 0; i < length; i++) { + origin[length - i - 1] = b[i]; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + if (oldArray == null) { + return null; + } + int length = oldArray.length; + for (int i : oldArray) { + if (i == 0) { + length--; + } + } + + int[] newArray = new int[length]; + int j = 0; + for (int i : oldArray) { + if (i != 0) { + newArray[j] = i; + j++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + if (array1 == null || array1.length == 0) { + return array2; + } + if (array2 == null || array2.length == 0) { + return array1; + } + + Map map = new HashMap<>(); + + + int sameNum = 0; + for (int i : array1) { + for (int j : array2) { + if (i == j) { + sameNum++; + map.put(i, 1); + } + } + } + + int length = array1.length + array2.length - sameNum; + int[] newArray = new int[length]; + int index = 0; + + for (int i : array1) { + newArray[index] = i; + index++; + } + for (int j : array2) { + if (map.get(j) == null) { + newArray[index] = j; + index++; + } + } + + for (int i = 0; i < newArray.length - 1; i++) { + for (int j = i + 1; j < newArray.length; j++) { + if (newArray[i] > newArray[j]) { + int temp = newArray[j]; + newArray[j] = newArray[i]; + newArray[i] = temp; + } + } + } + + return newArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) throws Exception { + + if (oldArray == null) { + return null; + } + if (size < 0) { + throw new Exception("12"); + } + + int newLength = oldArray.length + size; + int[] newArray = new int[newLength]; + for (int i = 0; i < newLength; i++) { + if (i < oldArray.length) { + newArray[i] = oldArray[i]; + } else { + newArray[i] = 0; + } + + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max == 1) { + return new int[0]; + } + + int index = 0; + for (int i = 0; i < Integer.MAX_VALUE; i++) { + if (getFibonacci(i) > max) { + index = i; + break; + } + } + int[] array = new int[index]; + for (int i = 0; i < index; i++) { + array[i] = getFibonacci(i); + } + return array; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + if (max == 1) { + return new int[0]; + } + + int length = 0; + for (int i = 1; i <= max; i++) { + if (isPrime(i)) { + length++; + } + } + int[] array = new int[length]; + int j = 0; + for (int i = 1; i <= max; i++) { + if (isPrime(i)) { + array[j] = i; + j++; + } + } + + return array; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + StringBuffer stringBuffer = new StringBuffer(); + for (int i = 1; i <= max; i++) { + int temp = 0; + for (int n = 1; n < i / 2 + 1; n++) { + if (i % n == 0) { + temp += n; + } + } + if (temp == i) { + stringBuffer.append(i).append("-"); + } + } + String[] strArray = stringBuffer.toString().split("-"); + int length = stringBuffer.toString().split("-").length; + int[] intAarray = new int[length]; + for (int i=0; i= elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + } + + /** + * 往固定位置添加一个元素 + * + * @param index + * @param o + */ + public void add(int index, Object o) { + if (get(index - 1) == null) { //原来为空,添加到指定位置 + add(o); + return; + } + size++; + if (size >= elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + } + + /** + * 获取元素 + * + * @param index + * @return + */ + public Object get(int index) { + + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("索引越界"); + } + return elementData[index]; + } + + /** + * 移除元素 + * + * @param index + * @return + */ + public Object remove(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("索引越界"); + } + Object deleteData = elementData[index]; + if (index == size - 1) { + elementData[index] = null; + } else { + int movedCount = size - index; + System.arraycopy(elementData, index + 1, elementData, index, movedCount); + } + size--; + return deleteData; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return null; + } + +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayListTest.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayListTest.java new file mode 100644 index 0000000000..ebf29cf406 --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayListTest.java @@ -0,0 +1,69 @@ +package com.github.lqingchenl.coding2017.basic; + +import com.github.lqingchenl.coding2017.basic.ArrayList; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import static org.junit.Assert.assertEquals; + +/** + * ArrayList Tester. + */ +public class ArrayListTest { + + private static ArrayList testArray = new ArrayList(); + + /** + * Method: add(Object o) + */ + @Test + public void testAddO() throws Exception { + testArray.add(1); + testArray.add(2); + assertEquals(1, testArray.get(0)); + assertEquals(2, testArray.get(1)); + } + + /** + * Method: add(int index, Object o) + */ + @Test + public void testAddForIndexO() throws Exception { + testArray.add(1, 1); + testArray.add(2, 2); + assertEquals(1, testArray.get(0)); + assertEquals(2, testArray.get(1)); + } + + /** + * Method: get(int index) + */ + @Test + public void testGet() throws Exception { + testArray.add(1); + assertEquals(1, testArray.get(0)); + } + + /** + * Method: remove(int index) + */ + @Test + public void testRemove() throws Exception { + testArray.add(1); + testArray.add(2); + assertEquals(1, testArray.remove(0)); + assertEquals(2, testArray.remove(0)); + } + + /** + * Method: size() + */ + @Test + public void testSize() throws Exception { + testArray.add(1); + testArray.add(2); + assertEquals(2, testArray.size()); + } + +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Iterator.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..086e1cd342 --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.github.lqingchenl.coding2017.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedList.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedList.java new file mode 100644 index 0000000000..316cad2ee5 --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedList.java @@ -0,0 +1,118 @@ +package com.github.lqingchenl.coding2017.basic; + +public class LinkedList implements List { + + private int size = 0; + + private Node head; + + public void add(Object o) { + if (head == null) { + head = new Node(o); + } else { + Node nextNode = head; + while (nextNode.next != null) { + nextNode = nextNode.next; + } + nextNode.next = new Node(o); + } + size++; + } + + public void add(int index, Object o) { + if (index == 0) { + addFirst(o); + return; + } + Node oldNode = getNode(index - 1); + Node newNode = new Node(o); + newNode.next = oldNode.next; + oldNode.next = newNode; + size++; + } + + public Object get(int index) { + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node.data; + } + + public Node getNode(int index) { + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node; + } + + public Object remove(int index) { + if (index == 1) { + return removeFirst(); + } + Node fatherNode = getNode(index - 2); + Node oldNode = getNode(index - 1); + fatherNode.next = oldNode.next; + size--; + + return oldNode.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newNode = new Node(o); + newNode.next = head; + head = newNode; + size++; + } + + public void addLast(Object o) { + if (head == null) { + addFirst(o); + return; + } + Node newNode = new Node(o); + Node lastNode = getNode(size - 1); + lastNode.next = newNode; + size++; + } + + public Object removeFirst() { + Node oldHead = head; + Node secondNode = head.next; + head = secondNode; + size--; + return oldHead.data; + } + + public Object removeLast() { + if (size == 1) { + return removeFirst(); + } + Object data = get(size - 1); + Node oldNode = getNode(size - 2); + oldNode.next = null; + size--; + return data; + } + + public Iterator iterator() { + return null; + } + + + private static class Node { + Object data; + Node next; + + public Node(Object data) { + this.data = data; + } + + } + +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedListTest.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedListTest.java new file mode 100644 index 0000000000..0ef6290d28 --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedListTest.java @@ -0,0 +1,125 @@ +package com.github.lqingchenl.coding2017.basic; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class LinkedListTest { + + private static LinkedList testLinkedList = new LinkedList(); + + /** + * Method: add(Object o) + */ + @Test + public void testAdd() throws Exception { + testLinkedList.add(1); + testLinkedList.add(2); + assertEquals(1, testLinkedList.get(0)); + assertEquals(2, testLinkedList.get(1)); + } + + /** + * Method: add(int index, Object o) + */ + @Test + public void testAddForIndex() throws Exception { + testLinkedList.add(0, 0); + testLinkedList.add(1, 1); + testLinkedList.add(2, 2); + assertEquals(0, testLinkedList.get(0)); + assertEquals(1, testLinkedList.get(1)); + assertEquals(2, testLinkedList.get(2)); + } + + /** + * Method: get(int index) + */ + @Test + public void testGet() throws Exception { + testLinkedList.add(1); + testLinkedList.add(2); + assertEquals(1, testLinkedList.get(0)); + assertEquals(2, testLinkedList.get(1)); + } + + /** + * Method: getNode(int index) + */ + @Test + public void testGetNode() throws Exception { + testLinkedList.add(1); + testLinkedList.add(2); + assertNotNull(testLinkedList.get(0)); + } + + /** + * Method: remove(int index) + */ + @Test + public void testRemove() throws Exception { + testLinkedList.add(1); + testLinkedList.add(2); + assertEquals(1, testLinkedList.get(0)); + } + + /** + * Method: size() + */ + @Test + public void testSize() throws Exception { + testLinkedList.add(1); + testLinkedList.add(2); + assertEquals(2, testLinkedList.size()); + } + + /** + * Method: addFirst(Object o) + */ + @Test + public void testAddFirst() throws Exception { + testLinkedList.addFirst(1); + assertEquals(1, testLinkedList.get(0)); + } + + /** + * Method: addLast(Object o) + */ + @Test + public void testAddLast() throws Exception { + testLinkedList.addLast(1); + assertEquals(1, testLinkedList.get(0)); + } + + /** + * Method: removeFirst() + */ + @Test + public void testRemoveFirst() throws Exception { + testLinkedList.addFirst(1); + testLinkedList.addFirst(2); + assertEquals(2, testLinkedList.removeFirst()); + assertEquals(1, testLinkedList.removeFirst()); + } + + /** + * Method: removeLast() + */ + @Test + public void testRemoveLast() throws Exception { + testLinkedList.addFirst(1); + assertEquals(1, testLinkedList.removeLast()); + } + + /** + * Method: iterator() + */ + @Test + public void testIterator() throws Exception { + } + + +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/List.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/List.java new file mode 100644 index 0000000000..d993812b9a --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/List.java @@ -0,0 +1,9 @@ +package com.github.lqingchenl.coding2017.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Queue.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Queue.java new file mode 100644 index 0000000000..eb7f7e3cb0 --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Queue.java @@ -0,0 +1,28 @@ +package com.github.lqingchenl.coding2017.basic; + +public class Queue { + private LinkedList queue = new LinkedList(); + private int size; + + public void enQueue(Object o) { + queue.addLast(o); + size++; + } + + public Object deQueue() { + Object o = queue.removeFirst(); + size--; + return o; + } + + public boolean isEmpty() { + if (queue.size() == 0) + return true; + return false; + } + + public int size() { + return size; + } + +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/QueueTest.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/QueueTest.java new file mode 100644 index 0000000000..9b26b3cdcf --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/QueueTest.java @@ -0,0 +1,57 @@ +package com.github.lqingchenl.coding2017.basic; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import static org.junit.Assert.assertEquals; + +/** + * Queue Tester. + */ +public class QueueTest { + + private static Queue testQueue = new Queue(); + + /** + * Method: enQueue(Object o) + */ + @Test + public void testEnQueue() throws Exception { + testQueue.enQueue(1); + assertEquals(1, testQueue.deQueue()); + } + + /** + * Method: deQueue() + */ + @Test + public void testDeQueue() throws Exception { + testQueue.enQueue(1); + testQueue.enQueue(2); + assertEquals(1, testQueue.deQueue()); + assertEquals(2, testQueue.deQueue()); + } + + /** + * Method: isEmpty() + */ + @Test + public void testIsEmpty() throws Exception { + testQueue.enQueue(1); + assertEquals(1, testQueue.deQueue()); + assertEquals(true, testQueue.isEmpty()); + } + + /** + * Method: size() + */ + @Test + public void testSize() throws Exception { + testQueue.enQueue(1); + testQueue.enQueue(2); + assertEquals(2, testQueue.size()); + } + + +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Stack.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Stack.java new file mode 100644 index 0000000000..8b25283b40 --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/Stack.java @@ -0,0 +1,33 @@ +package com.github.lqingchenl.coding2017.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size = 0; + + public void push(Object o) { + elementData.add(o); + size++; + } + + public Object pop() { + Object o = elementData.get(size - 1); + elementData.remove(size - 1); + size--; + return o; + } + + public Object peek() { + return elementData.get(size - 1); + } + + public boolean isEmpty() { + if (elementData.size() == 0) + return true; + return false; + } + + public int size() { + return size; + } + +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/basic/StackTest.java b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/StackTest.java new file mode 100644 index 0000000000..b2d4935c4e --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/basic/StackTest.java @@ -0,0 +1,64 @@ +package com.github.lqingchenl.coding2017.basic; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import static org.junit.Assert.assertEquals; + +/** + * Stack Tester. + */ +public class StackTest { + + private static Stack testStack = new Stack(); + + /** + * Method: push(Object o) + */ + @Test + public void testPush() throws Exception { + testStack.push(1); + assertEquals(1, testStack.peek()); + } + + /** + * Method: pop() + */ + @Test + public void testPop() throws Exception { + testStack.push(1); + assertEquals(1, testStack.pop()); + } + + /** + * Method: peek() + */ + @Test + public void testPeek() throws Exception { + testStack.push(1); + assertEquals(1, testStack.peek()); + testStack.push(2); + assertEquals(2, testStack.peek()); + } + + /** + * Method: isEmpty() + */ + @Test + public void testIsEmpty() throws Exception { + testStack.push(1); + assertEquals(false, testStack.isEmpty()); + } + + /** + * Method: size() + */ + @Test + public void testSize() throws Exception { + testStack.push(1); + testStack.push(2); + assertEquals(2, testStack.size()); + } + +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/LoginAction.java b/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/LoginAction.java new file mode 100644 index 0000000000..efcb58f724 --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/LoginAction.java @@ -0,0 +1,44 @@ +package com.github.lqingchenl.coding2017.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/Struts.java b/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/Struts.java new file mode 100644 index 0000000000..e8c6d54b6b --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/Struts.java @@ -0,0 +1,74 @@ +package com.github.lqingchenl.coding2017.litestruts; + +import org.jsoup.Jsoup; +import org.jsoup.helper.StringUtil; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; + +import java.beans.PropertyDescriptor; +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + try { + Document d = Jsoup.parse(new File("src/com/github/lqingchenl/coding2017/litestruts/struts.xml"), "UTF-8"); //读取配置文件 + String classStr = null; + + Map resultMap = new HashMap<>(); + for (Element element : d.select("action")) { + if (element.attr("name").equals(actionName)) { + classStr = element.attr("class"); + for (Element element1 : element.select("result")) { + resultMap.put(element1.attr("name"), element1.text()); + } + } + } + + if (StringUtil.isBlank(classStr)) { + return null; + } + Class c = Class.forName(classStr); + Object object = c.newInstance(); //创建对象 + //写数据 setName和setPassword方法 + for (Map.Entry entry : parameters.entrySet()) { + PropertyDescriptor pd = new PropertyDescriptor(entry.getKey(), c);//使用java.beans.PropertyDescriptor获取Method进行方法调用 + Method method = pd.getWriteMethod();//获得写方法 + method.invoke(object, entry.getValue()); + } + + //通过反射,执行execute方法 + Method method = c.getDeclaredMethod("execute", null); + String result = (String) method.invoke(object); + +// 通过反射找到对象的所有getter方法(例如 getMessage),通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , +// 放到View对象的parameters + Map map = new HashMap<>(); + Field[] fields = c.getDeclaredFields(); + for (Field field : fields) { + PropertyDescriptor pd = new PropertyDescriptor(field.getName(), c); // message没有set方法,报错 + Method getMethod = pd.getReadMethod(); + String str = (String) getMethod.invoke(object); + map.put(field.getName(), str); + + } +// 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp,放到View对象的jsp字段中。 + View view = new View(); + view.setParameters(map); + String jsp = resultMap.get(result); + view.setJsp(jsp); + return view; + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/StrutsTest.java b/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/StrutsTest.java new file mode 100644 index 0000000000..e17b6154a2 --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/StrutsTest.java @@ -0,0 +1,40 @@ +package com.github.lqingchenl.coding2017.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/View.java b/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/View.java new file mode 100644 index 0000000000..487232ce7b --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/View.java @@ -0,0 +1,26 @@ +package com.github.lqingchenl.coding2017.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/struts.xml b/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/struts.xml new file mode 100644 index 0000000000..73218d4675 --- /dev/null +++ b/group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group02/group02.md b/group02/group02.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group02/group02.md @@ -0,0 +1 @@ + diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayList.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayList.java" new file mode 100644 index 0000000000..4a68cd276b --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayList.java" @@ -0,0 +1,102 @@ +package com.byhieg.coding2017; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + + public void add(Object o) { + isCapacityEnough(size + 1); + elementData[size++] = o; + } + + public void add(int index, Object o) { + checkForAdd(index); + isCapacityEnough(size + 1); + System.arraycopy(elementData,index,elementData,index + 1,size - index); + elementData[index] = o; + size++; + } + + private void checkForAdd(int index){ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("index不在指定范围内"); + } + + } + private void isCapacityEnough(int size) { + if (size > 100) { + explicitCapacity(size); + } + if (size < 0) { + throw new OutOfMemoryError(); + } + } + + private final static int MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8; + + public void explicitCapacity(int size) { + int newLength = elementData.length * 2; + if (newLength > (MAX_ARRAY_LENGTH)){ + newLength = (size > MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH); + } + elementData = Arrays.copyOf(elementData, newLength); + + } + + + public Object get(int index) { + checkRange(index); + return elementData[index]; + } + + private void checkRange(int index){ + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("index不在范围内"); + } + } + + public Object remove(int index) { + Object o = get(index); + //要保证后面的 index + 1是有效的 + int moveSize = size - index - 1; + if (moveSize > 0) { + System.arraycopy(elementData,index + 1,elementData,index, size - index); + } + elementData[--size] = null; + return o; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new MyIterator(); + } + + private class MyIterator implements Iterator { + + private int cursor = 0; + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + if (cursor >= size) { + throw new NoSuchElementException(); + } + return elementData[cursor++]; + } + } + + +} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTree.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTree.java" new file mode 100644 index 0000000000..26407d749a --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTree.java" @@ -0,0 +1,66 @@ +package com.byhieg.coding2017; + +/** + * Created by byhieg on 17/2/22. + * Mail to byhieg@gmail.com + */ + +public class BinaryTree { + + private BinaryTreeNode root = new BinaryTreeNode(); + + public BinaryTree(Object rootData){ + root = root.insert(rootData); + } + + + //左边的值小于等于父节点的值,右边的值大于父节点的值 + private void insertNode(BinaryTreeNode root, BinaryTreeNode node) { + int value = (int)node.getData(); + int rootValue = (int)root.getData(); + if (value <= rootValue){ + insertLeft(root,node); + }else { + insertRight(root,node); + } + } + + + public void insert(Object o) { + BinaryTreeNode node = new BinaryTreeNode(); + node = node.insert(o); + insertNode(root,node); + } + + private void insertLeft(BinaryTreeNode father, BinaryTreeNode node) { + if (father.getLeft() == null) { + father.setLeft(node); + }else{ + insertNode(father.getLeft(),node); + } + } + + private void insertRight(BinaryTreeNode father, BinaryTreeNode node) { + if (father.getRight() == null) { + father.setRight(node); + } else { + insertNode(father.getRight(),node); + } + } + + //前序遍历输出书 + private void preOrder(BinaryTreeNode node) { + if (node != null) { + System.out.println(node.getData()); + preOrder(node.getLeft()); + preOrder(node.getRight()); + } + } + + + //打印树 + public void printTree(){ + preOrder(root); + } + +} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTreeNode.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTreeNode.java" new file mode 100644 index 0000000000..67f70bb696 --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTreeNode.java" @@ -0,0 +1,42 @@ +package com.byhieg.coding2017; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + BinaryTreeNode node = new BinaryTreeNode(); + int value = (int)o; + node.setData(value); + node.setRight(null); + node.setLeft(null); + return node; + } + +} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Iterator.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Iterator.java" new file mode 100644 index 0000000000..beef5b5554 --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Iterator.java" @@ -0,0 +1,7 @@ +package com.byhieg.coding2017; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/LinkedList.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/LinkedList.java" new file mode 100644 index 0000000000..04b3f9f027 --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/LinkedList.java" @@ -0,0 +1,152 @@ +package com.byhieg.coding2017; + +import javax.swing.text.html.HTMLDocument; + +public class LinkedList implements List { + + private Node head; + int size = 0; + + public void add(Object o) { + addLast(o); + } + + public void add(int index, Object o) { + checkRangeForAdd(index); + if (index == size) { + addLast(o); + } + Node nextNode = node(index); + Node newNode = new Node(o, nextNode); + + Node prevNode; + if (index == 0) { + prevNode = null; + } else { + prevNode = node(index); + } + + + if (prevNode == null) { + head = newNode; + }else{ + prevNode.next = newNode; + } + + size++; + } + + + private Node node(int index) { + Node cursor = head; + for (int i = 0; i < index; i++) { + cursor = cursor.next; + } + return cursor; + } + + private void checkRangeForAdd(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("指定的index超过界限"); + } + } + + public Object get(int index) { + checkRange(index); + return node(index).data; + } + + private void checkRange(int index) { + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException("指定index超过界限"); + } + } + + public Object remove(int index) { + checkRange(index); + Node targetNode = node(index); + Object o = targetNode.data; + Node prevNode ; + Node nextNode = targetNode.next; + + if (index == 0) { + prevNode = null; + }else{ + prevNode = node(index - 1); + } + if (prevNode == null) { + head = nextNode; + targetNode.next = null; + }else { + prevNode.next = nextNode; + targetNode.next = null; + } + + targetNode.data = null; + size --; + return o; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node nextNode = head; + Node newNode = new Node(o, nextNode); + head = newNode; + size++; + } + + public void addLast(Object o) { + Node newNode = new Node(o, null); + if (size == 0) { + head = newNode; + }else{ + Node lastNode = node(size - 1); + lastNode.next = newNode; + } + size++; + } + + public Object removeFirst() { + return remove(0); + } + + public Object removeLast() { + return remove(size() - 1); + } + + public Iterator iterator() { + + return new MyIterator(); + } + + private class MyIterator implements Iterator { + + public Node cursor = head; + @Override + public boolean hasNext() { + return cursor != null; + } + + @Override + public Object next() { + Object o = cursor.data; + cursor = cursor.next; + return o; + } + } + + + + private static class Node { + Object data; + Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } +} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/List.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/List.java" new file mode 100644 index 0000000000..15c27c8cf2 --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/List.java" @@ -0,0 +1,13 @@ +package com.byhieg.coding2017; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Queue.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Queue.java" new file mode 100644 index 0000000000..f83ad337e7 --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Queue.java" @@ -0,0 +1,23 @@ +package com.byhieg.coding2017; + +public class Queue { + + private LinkedList list = new LinkedList(); + public void enQueue(Object o){ + list.addLast(o); + } + + public Object deQueue() { + Object value = list.get(0); + list.removeFirst(); + return value; + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return list.size(); + } +} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Stack.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Stack.java" new file mode 100644 index 0000000000..45b8530a8f --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Stack.java" @@ -0,0 +1,36 @@ +package com.byhieg.coding2017; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (size() == 0) { + throw new EmptyStackException(); + } + Object value = elementData.get(size() - 1); + elementData.remove(size() - 1); + return value; + } + + public Object peek(){ + if (size() == 0) { + throw new EmptyStackException(); + } + return elementData.get(size() - 1); + } + + public boolean isEmpty(){ + return size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayListTest.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayListTest.java" new file mode 100644 index 0000000000..b0b3b6704d --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayListTest.java" @@ -0,0 +1,81 @@ +package com.byhieg.coding2017test; + +import com.byhieg.coding2017.ArrayList; +import com.byhieg.coding2017.Iterator; +import junit.framework.TestCase; + +/** + * Created by byhieg on 17/2/22. + * Mail to byhieg@gmail.com + */ +public class ArrayListTest extends TestCase { + ArrayList arrayList = new ArrayList(); + + public void testAdd() throws Exception { + arrayList.add(1); + arrayList.add(null); + arrayList.add(-1); + arrayList.add("1"); + arrayList.add(true); + arrayList.add(Integer.MAX_VALUE); + arrayList.add(Integer.MIN_VALUE); + + + } + + public void testAdd1() throws Exception { +// arrayList.add(-1,0); +// arrayList.add(100,0); + arrayList.add(0,2); + arrayList.add(1,10); + arrayList.add(2,111); + } + + public void testGet() throws Exception { + for (int i = 0; i < 10 ; i++) { + arrayList.add(i); + } + + for (int i = 0 ; i < 10 ; i++) { + System.out.println(arrayList.get(i)); + } + } + + public void testRemove() throws Exception { + for (int i = 0; i < 10 ; i++) { + arrayList.add(i); + } + + for (int i = 0 ; i < 10 ; i++) { + System.out.println(arrayList.get(i)); + } + + for (int i = 0 ; i < 10 ; i++) { + arrayList.remove(9 - i); + } + + for (int i = 0 ; i < arrayList.size() ; i++) { + System.out.println(arrayList.get(i)); + } + } + + public void testSize() throws Exception { + for (int i = 0; i < 10 ; i++) { + arrayList.add(i); + } + System.out.println(arrayList.size()); + } + + public void testIterator() throws Exception { + for (int i = 0; i < 10 ; i++) { + arrayList.add(i); + } + + System.out.println("开始测试Iterator"); + Iterator iterator = arrayList.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } + +} \ No newline at end of file diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/BinaryTreeTest.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/BinaryTreeTest.java" new file mode 100644 index 0000000000..1945f2c695 --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/BinaryTreeTest.java" @@ -0,0 +1,24 @@ +package com.byhieg.coding2017test; + +import com.byhieg.coding2017.BinaryTree; +import com.byhieg.coding2017.BinaryTreeNode; +import junit.framework.TestCase; + +/** + * Created by byhieg on 17/2/22. + * Mail to byhieg@gmail.com + */ +public class BinaryTreeTest extends TestCase { + + public void testPrintTree() throws Exception { + BinaryTree tree = new BinaryTree(5); + tree.insert(2); + tree.insert(7); + tree.insert(1); + tree.insert(6); + tree.insert(4); + tree.insert(8); + tree.printTree(); + } + +} \ No newline at end of file diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/LinkedListTest.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/LinkedListTest.java" new file mode 100644 index 0000000000..61a78e150a --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/LinkedListTest.java" @@ -0,0 +1,122 @@ +package com.byhieg.coding2017test; + +import com.byhieg.coding2017.Iterator; +import com.byhieg.coding2017.LinkedList; +import com.sun.org.apache.bcel.internal.generic.INEG; +import junit.framework.TestCase; + +/** + * Created by byhieg on 17/2/22. + * Mail to byhieg@gmail.com + */ +public class LinkedListTest extends TestCase { + private LinkedList list = new LinkedList(); + public void testAdd() throws Exception { + list.add(null); + list.add(-1); + list.add(-2); + list.add(0x5); + list.add(true); + list.add("123"); + list.add(Integer.MAX_VALUE + 100000); + + } + + public void testAdd1() throws Exception { +// list.add(-1,100); +// list.add(20,111); + list.add(0,11); + list.add(1,"sad"); + list.add(2,"fas"); + + } + + public void testGet() throws Exception { + for (int i = 0 ; i < 10 ; i++) { + list.add(i,i + ""); + } + + for (int i = 0 ;i < list.size();i++) { + System.out.println(list.get(i)); + } + } + + public void testRemove() throws Exception { + for (int i = 0 ; i < 10 ; i++) { + list.add(i,i + ""); + } + + for (int i = 0 ; i < list.size() ; i++) { + list.remove(i); + } + + for (int i = 0 ;i < list.size();i++) { + System.out.println(list.get(i)); + } + } + + + public void testAddFirst() throws Exception { + list.addFirst("byhieg"); + list.addFirst("123412"); + list.addFirst("byhaieg"); + list.addFirst("byhfadas12ieg"); + list.addFirst("fas"); + for (int i = 0 ; i < list.size();i++) { + System.out.println(list.get(i)); + } + } + + public void testAddLast() throws Exception { + list.addLast("asga"); + list.addLast("124"); + list.addLast("fasd"); + list.addLast("fas"); + list.addLast("gasd2"); + + for (int i = 0 ; i < list.size();i++) { + System.out.println(list.get(i)); + } + + } + + public void testRemoveFirst() throws Exception { + list.addFirst("byhieg"); + list.addFirst("123412"); + list.addFirst("byhaieg"); + list.addFirst("byhfadas12ieg"); + list.addFirst("fas"); + for (int i = 0 ; i < list.size();i++) { + list.removeLast(); + } + + System.out.println(list.size()); + } + + public void testRemoveLast() throws Exception { + list.addLast("asga"); + list.addLast("124"); + list.addLast("fasd"); + list.addLast("fas"); + list.addLast("gasd2"); + for (int i = 0 ; i < list.size();i++) { + list.removeFirst(); + } + + System.out.println(list.size()); + } + + public void testIterator() throws Exception { + list.addLast("asga"); + list.addLast("124"); + list.addLast("fasd"); + list.addLast("fas"); + list.addLast("gasd2"); + + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } + +} \ No newline at end of file diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/QueueTest.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/QueueTest.java" new file mode 100644 index 0000000000..82d0fe2349 --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/QueueTest.java" @@ -0,0 +1,34 @@ +package com.byhieg.coding2017test; + +import com.byhieg.coding2017.Queue; +import junit.framework.TestCase; + +/** + * Created by byhieg on 17/2/22. + * Mail to byhieg@gmail.com + */ +public class QueueTest extends TestCase { + Queue queue = new Queue(); + + public void testEnQueue() throws Exception { + queue.enQueue(1); + queue.enQueue("true"); + queue.enQueue(true); + queue.enQueue(null); + queue.enQueue(-12341); + queue.enQueue(Integer.MIN_VALUE - 10000); + + } + + public void testDeQueue() throws Exception { + for (int i = 0 ; i < 10 ; i++) { + queue.enQueue(i); + } + + while (!queue.isEmpty()) { + System.out.println(queue.deQueue()); + } + } + + +} \ No newline at end of file diff --git "a/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/StackTest.java" "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/StackTest.java" new file mode 100644 index 0000000000..a81484251c --- /dev/null +++ "b/group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/StackTest.java" @@ -0,0 +1,52 @@ +package com.byhieg.coding2017test; + +import com.byhieg.coding2017.Stack; +import junit.framework.TestCase; + +/** + * Created by byhieg on 17/2/22. + * Mail to byhieg@gmail.com + */ +public class StackTest extends TestCase { + Stack stack = new Stack(); + + public void testPush() throws Exception { + stack.push(1); + stack.push("31231"); + stack.push(null); + stack.push(Integer.MAX_VALUE + 1000); + stack.push(Integer.MIN_VALUE - 1000000); + stack.push(true); + stack.push('a'); + } + + public void testPop() throws Exception { + int a = 1; + for (int i = 0; i < 10; i++) { + stack.push(a + i); + } + int size = stack.size(); + while (!stack.isEmpty()){ + System.out.println(stack.pop()); + } + } + + public void testPeek() throws Exception { + char a = 'a'; + for (int i = 0; i < 10; i++) { + stack.push(a + i); + } + + System.out.println("size的大小是" + stack.size()); + System.out.println(stack.peek()); + } + + public void testIsEmpty() throws Exception { + System.out.println(stack.isEmpty()); + stack.push(1); + System.out.println(stack.isEmpty()); + + } + + +} \ No newline at end of file diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayUtil.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayUtil.java" new file mode 100644 index 0000000000..94eeb194d4 --- /dev/null +++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayUtil.java" @@ -0,0 +1,203 @@ +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int tmp ; + int length = origin.length; + for (int i = 0 ; i < length / 2 ; i++) { + tmp = origin[i]; + origin[i] = origin[length - i - 1]; + origin[length - i - 1] = tmp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int size = oldArray.length; + int[] newArray = new int[size]; + int repeatTime = 0; + int count = 0; + for (int i = 0 ; i < oldArray.length;i++) { + if (oldArray[i] != 0) { + newArray[count++] = oldArray[i]; + }else{ + repeatTime++; + } + } + return Arrays.copyOf(newArray,newArray.length - repeatTime); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int[] newArray = new int[array1.length + array2.length]; + int count = 0; + int cursor = 0; + int last = 0; + int repeatTime = 0; + for (int i = 0 ; i < array1.length;i++) { + last = i; + int value1 = array1[i]; + if (value1 < array2[cursor]) { + newArray[count++] = value1; + }else{ + newArray[count++] = array2[cursor]; + if (value1 != array2[cursor]) { + i--; + }else{ + repeatTime++; + } + cursor++; + if (cursor == array2.length) { + break; + } + } + } + for (int i = cursor ; i < array2.length ;i++) { + if (newArray[count - 1] == array2[i]) { + continue; + } + newArray[count++] = array2[i]; + } + + for (int i = last;i < array1.length;i++) { + if (newArray[count - 1] == array1[i]) { + continue; + } + newArray[count++] = array1[i]; + } + return Arrays.copyOf(newArray,newArray.length - repeatTime); + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray,0,newArray,0,oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if (max == 1) { + return new int[]{}; + } + int num1 = 1; + int num2 = 1; + int next = 2; + int [] array = new int[max + 1]; + array[0] = num1; + int count = 1; + while (next <= max) { + array[count++] = num2; + next = num1 + num2; + num1 = num2; + num2 = next; + } + return Arrays.copyOf(array,count); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int[] primes = new int[max]; + int count = 0; + boolean isPrime = true; + for (int i = 2 ; i < max ;i ++) { + for (int j = 2 ; j < Math.sqrt(i);j++) { + if (i % j == 0){ + isPrime = false; + break; + } + } + + if (isPrime) { + primes[count++] = i; + } + + isPrime = true; + } + return Arrays.copyOf(primes,count); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int[] array = new int[max]; + int count = 0; + for (int i = 1 ; i < max ; i++) { + int sum = 0; + for (int j = 1 ; j < i;j++) { + if (i % j == 0) { + sum += j; + } + } + if (sum == i) { + array[count++] = i; + } + } + return Arrays.copyOf(array, count); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator){ + StringBuffer sb = new StringBuffer(); + for (int i = 0 ; i < array.length;i++) { + sb.append(array[i]); + if (i != array.length - 1) { + sb.append(seperator); + } + } + return sb.toString(); + } + + +} diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/LoginAction.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/LoginAction.java" new file mode 100644 index 0000000000..9d4a3a5a34 --- /dev/null +++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/LoginAction.java" @@ -0,0 +1,38 @@ + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/Struts.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/Struts.java" new file mode 100644 index 0000000000..69aa3f950e --- /dev/null +++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/Struts.java" @@ -0,0 +1,161 @@ + +import com.byhieg.utils.bexception.UncheckedException; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + //创建文件对象,ClassName,view对象等必备的对象以及得到params参数中所有的key-value + String fileName = "/Users/byhieg/IdeaProjects/learnjava/src/com/byhieg/coding2017/homework305/struts.xml"; + String className; + List keys = new ArrayList<>(); + List values = new ArrayList<>(); + Iterator iterator = parameters.entrySet().iterator(); + String[] methodNames = new String[parameters.size()]; + int i = 0; + + View view = new View(); + Map map = new HashMap(); + // 得到set方法的方法名 + while (iterator.hasNext()) { + Map.Entry entry = (Map.Entry) iterator.next(); + String key = entry.getKey(); + keys.add(key); + values.add(entry.getValue()); + methodNames[i++] = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); + } + + try { + //反射得到对象 + Element element = getTargetElement(actionName, fileName); + className = getClassName(element); + Class clz = Class.forName(className); + Object obj = clz.newInstance(); + + //根据上面的set方法名的数组,依次调用, + for (int j = 0; j < methodNames.length; j++) { + Method method = clz.getMethod(methodNames[j], String.class); + method.invoke(obj, values.get(j)); + } + + //执行execute方法 + Method method = clz.getMethod("execute"); + String result = (String) method.invoke(obj); + + //得到所有方法,判断哪些是get方法,是的话,生成需要的map + Method[] methods = clz.getMethods(); + for (Method item : methods) { + if (item.getName().contains("get")) { + String key = item.getName().substring(3).toLowerCase(); + Object value = item.invoke(obj); + map.put(key, value); + } + } + + view.setParameters(map); + + //根据result得到jsp,放入view对象中 + String jsp = getJsp(element, result); + view.setJsp(jsp); + + return view; + + } catch (DocumentException e) { + System.out.println("文件找不到"); + } catch (ClassNotFoundException e) { + System.out.println("找不到指定的类"); + } catch (InstantiationException | IllegalAccessException e) { + System.out.println("创建对象失败"); + } catch (NoSuchMethodException e) { + System.out.println("方法创建失败"); + } catch (InvocationTargetException e) { + System.out.println("方法执行失败"); + } + + + return view; + } + + + /** + * + * @param element 指定的的节点 + * @return 返回该节点对应的ClassName的值 + * @throws DocumentException 文件异常 + */ + + private static String getClassName(Element element) throws DocumentException { + return element.attribute(1).getValue(); + + + } + + /** + * + * @param actionName actionName + * @param fileName xml文件路径 + * @return 指定actionName对应的节点元素 + * @throws DocumentException 文件异常 + */ + private static Element getTargetElement(String actionName, String fileName) throws DocumentException { + SAXReader reader = new SAXReader(); + Document document = reader.read(new File(fileName)); + Element rootNode = document.getRootElement(); + List elements = rootNode.elements(); + for (Element item : elements) { + if (actionName.equals(item.attribute(0).getValue())) { + return item; + } + } + return null; + } + + /** + * 通过result,得到指定的JSP + * @param element actionName对象的节点 + * @param result result标签的name + * @return result标签的值 + */ + private static String getJsp(Element element,String result) { + List elements = element.elements(); + for (Element e : elements) { + if (result.equals(e.attribute(0).getValue())){ + return e.getTextTrim(); + } + } + + return null; + } + + +} diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/StrutsTest.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/StrutsTest.java" new file mode 100644 index 0000000000..7dac018654 --- /dev/null +++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/StrutsTest.java" @@ -0,0 +1,42 @@ + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/View.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/View.java" new file mode 100644 index 0000000000..9f17bdf5bf --- /dev/null +++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/View.java" @@ -0,0 +1,22 @@ + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/struts.xml" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/struts.xml" new file mode 100644 index 0000000000..463407f22f --- /dev/null +++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/struts.xml" @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + diff --git "a/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayUtilTest.java" "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayUtilTest.java" new file mode 100644 index 0000000000..df9ab466b1 --- /dev/null +++ "b/group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayUtilTest.java" @@ -0,0 +1,81 @@ +package com.byhieg.coding2017.homework305; + +import com.byhieg.utils.bprint.FullPrint; +import junit.framework.Assert; +import junit.framework.TestCase; + +/** + * Created by byhieg on 17/3/1. + * Mail to byhieg@gmail.com + */ +public class ArrayUtilTest extends TestCase { + public void testReverseArray() throws Exception { + int[] array = new int[]{1, 2, 4, 5}; + ArrayUtil util = new ArrayUtil(); + util.reverseArray(array); + for (int i = 0 ; i < array.length;i++) { + System.out.print(array[i]); + } + + } + + public void testRemoveZero() throws Exception { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + ArrayUtil util = new ArrayUtil(); + int [] newArray = util.removeZero(oldArr); + for (int i = 0 ; i < newArray.length;i++) { + System.out.print(newArray[i] + " "); + } + } + + public void testMerge() throws Exception { + int [] a1 = new int[]{3, 5,7,8,10,11}; + int [] a2 = new int[]{4, 5, 6,7}; + int[] newArray = new ArrayUtil().merge(a1,a2); + for (int i = 0 ; i < newArray.length;i++) { + System.out.print(newArray[i] + " "); + } + + } + + public void testGrow() throws Exception { + int[] a = new int[]{1, 2, 3, 4, 5}; + int [] newArray = new ArrayUtil().grow(a,3); + for (int i = 0 ; i < newArray.length;i++) { + System.out.print(newArray[i] + " "); + } + + } + + + public void testFibonacci()throws Exception { + int[] newArray = new ArrayUtil().fibonacci(2); + for (int i = 0 ; i < newArray.length;i++) { + System.out.print(newArray[i] + " "); + } + + } + + public void testgetPrimes() throws Exception { + int[] newArray = new ArrayUtil().getPrimes(23); + for (int i = 0 ; i < newArray.length;i++) { + System.out.print(newArray[i] + " "); + } + + } + + public void testgetPerfectNumbers() throws Exception { + int [] newArray = new ArrayUtil().getPerfectNumbers(100); + for (int i = 0 ; i < newArray.length;i++) { + System.out.print(newArray[i] + " "); + } + + } + + public void testJoin() throws Exception { + int[] a = new int[]{3, 8, 9}; + System.out.println(new ArrayUtil().join(a,"-")); + + } + +} \ No newline at end of file diff --git a/group03/1196051822/readme.md b/group03/1196051822/readme.md new file mode 100644 index 0000000000..fa4ad63f02 --- /dev/null +++ b/group03/1196051822/readme.md @@ -0,0 +1,5 @@ +# 说明 +这个文件夹是QQ:119601822 学员的代码文件夹。 +在每个作业代码包含src文件夹和test文件夹 +src文件夹内容均是Java代码,无执行的class文件。 +test文件夹内容时src文件夹代码的测试类的文件夹。 \ No newline at end of file diff --git a/group03/1360464792/.gitignore b/group03/1360464792/.gitignore new file mode 100644 index 0000000000..b3c9df97d1 --- /dev/null +++ b/group03/1360464792/.gitignore @@ -0,0 +1,34 @@ +# Created by .ignore support plugin (hsz.mobi) +### Java template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### maven +target \ No newline at end of file diff --git a/group03/1360464792/pom.xml b/group03/1360464792/pom.xml new file mode 100644 index 0000000000..fc16664c23 --- /dev/null +++ b/group03/1360464792/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + rui.study + coding2017 + 0.0.1-SNAPSHOT + + 学习数据结构 + + + 1.6 + UTF-8 + + + + + junit + junit + 4.12 + test + + + + dom4j + dom4j + 1.6.1 + + + + + + coding2017 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + ${java.version} + ${java.version} + ${encoding} + + + + + \ No newline at end of file diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/array/ArrayUtil.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..031b14fcef --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/array/ArrayUtil.java @@ -0,0 +1,230 @@ +package rui.study.coding2017.coderising.array; + +import java.util.Arrays; + +/** + * 创建于 2017-03-01. + * + * @author 赵睿 + */ +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public int[] reverseArray(int[] origin){ + int length=origin.length; + + int[] result=new int[length]; + int j=0; + for (int i = length-1; i >=0 ; i--) { + result[j]=origin[i]; + j++; + } + return result; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int length=oldArray.length; + int notZero=0; + int[] temArray=new int[length]; + for (int i = 0; i array2[j]){ + tempArr[tempSize]=array2[j]; + j++; + }else if(array1[i]==array2[j]){ + tempArr[tempSize]=array1[i]; + i++;j++; + }else { + tempArr[tempSize]=array1[i]; + i++; + } + tempSize++; + flag=j>array2.length-1||i>array1.length-1; + } + if(i<=j){ + for (; i < array1.length ; i++) { + tempArr[tempSize]=array1[i]; + tempSize++; + } + }else{ + for (; j < array2.length ; i++) { + tempArr[tempSize]=array2[i]; + tempSize++; + } + } + return Arrays.copyOf(tempArr,tempSize); + } + + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return Arrays.copyOf(oldArray,oldArray.length+size); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int[] empty={}; + int tempSize=0; + int temp[]=new int[max]; + + if(max<=1){ + return empty; + }else if(max==2){ + temp[0]=1; + temp[1]=1; + return temp; + }else{ + temp[0]=1; + temp[1]=1; + tempSize=2; + } + boolean flag=false; + while(!flag){ + int tempMax=temp[tempSize-2]+temp[tempSize-1]; + if(tempMax>max){ + flag=true; + }else{ + temp[tempSize++]=tempMax; + } + } + return Arrays.copyOf(temp,tempSize); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int temp[]=new int[max]; + int tempSize=0; + for (int i = 0; i < max; i++) { + if(isPrimes(i)){ + temp[tempSize++]=i; + } + } + return Arrays.copyOf(temp,tempSize); + } + + private boolean isPrimes(int num){ + if(num<2) return false; + if(num==2) return true; + if(num==3) return true; + for (int i = 2; i *i<=num; i++) { + if(num%i==0) { + return false; + } + } + return true; + } + + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int temp[] =new int[max]; + int tempSize=0; + + for (int i = 0; i < max; i++) { + if(isPerfectNumber(i)){ + temp[tempSize++]=i; + } + } + return Arrays.copyOf(temp,tempSize); + } + + private boolean isPerfectNumber(int num){ + if(num<1)return false; + if(num==1)return true; + int temp[] =new int[num]; + int tempSize=0; + temp[tempSize++]=1; + for (int i = 2; i < num; i++) { + if(num%i==0){ + temp[tempSize++]=i; + } + } + + int add=0; + for (int i = 0; i < tempSize; i++) { + add+=temp[i]; + } + if(add==num)return true; + return false; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder stringBuilder=new StringBuilder(); + + for (int i = 0; i < array.length-1; i++) { + stringBuilder.append(array[i]) + .append(seperator); + } + stringBuilder.append(array[array.length-1]); + return stringBuilder.toString(); + } +} \ No newline at end of file diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LoginAction.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LoginAction.java new file mode 100644 index 0000000000..2feac1cd83 --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LoginAction.java @@ -0,0 +1,39 @@ +package rui.study.coding2017.coderising.liteststruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LogoutAction.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LogoutAction.java new file mode 100644 index 0000000000..c74632c2b6 --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LogoutAction.java @@ -0,0 +1,39 @@ +package rui.study.coding2017.coderising.liteststruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LogoutAction { + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/Struts.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/Struts.java new file mode 100644 index 0000000000..0225b9ac36 --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/Struts.java @@ -0,0 +1,106 @@ +package rui.study.coding2017.coderising.liteststruts; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + View view=new View(); + try { + StrutsAction strutsAction= StrutsAction.getFormStrutsMap(actionName); + + Class clazz=strutsAction.getaClass(); + Object object=clazz.newInstance(); + + setActionValue(parameters,object); + String resultStr = execute(object); + getVlaue(view, object); + getJspPath(view, strutsAction, resultStr); + } catch (IOException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return view; + } + + /** + * + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + * @param parameters 请求参数 + * @param object 对象 + */ + private static void setActionValue(Map parameters, Object object) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + for (Map.Entry entry: parameters.entrySet()) { + String key=entry.getKey(); + String methodName="set"+key.substring(0,1).toUpperCase()+key.substring(1,key.length()); + Method method=object.getClass().getMethod(methodName,String.class); + method.invoke(object,entry.getValue()); + } + } + + /** + * 2. 通过反射调用对象的execute 方法, 并获得返回值,例如"success" + * @param object 反射生成的对象 + * @return 执行结果表示 + */ + private static String execute(Object object) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, IOException { + Method executeMethod=object.getClass().getMethod("execute"); + Object returnObj=executeMethod.invoke(object); + if(returnObj.getClass()!=String.class) throw new IOException("不支持非页面跳转类型"); + return (String) returnObj; + } + + + /** + * + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + * @param view 视图 + * @param object 反射之后的action类 + */ + private static void getVlaue(View view, Object object) throws IllegalAccessException, InvocationTargetException { + Map resultMap=new HashMap(); + Method[] methods=object.getClass().getDeclaredMethods(); + for (Method getMethod:methods) { + String methodName=getMethod.getName(); + if(methodName.contains("get")){ + Object o=getMethod.invoke(object); + String fileName=methodName.replace("get",""); + fileName=fileName.substring(0,1).toLowerCase()+fileName.substring(1,fileName.length()); + resultMap.put(fileName,o); + } + } + view.setParameters(resultMap); + } + + /** + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + * @param view 视图 + * @param strutsAction xml解析后的存储类 + * @param resultStr 结果表示 + */ + private static void getJspPath(View view, StrutsAction strutsAction, String resultStr) { + for (StrutsAction.Result result:strutsAction.getResults()) { + if(result.name.equals(resultStr))view.setJsp(result.jspPath); + } + } +} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/StrutsAction.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/StrutsAction.java new file mode 100644 index 0000000000..3f41707dcb --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/StrutsAction.java @@ -0,0 +1,127 @@ +package rui.study.coding2017.coderising.liteststruts; + + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 读取struct.xml.解析xml + * Created by 赵睿 on 2017/3/4. + */ +public class StrutsAction { + private String name; + private Class aClass; + private List results; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Class getaClass() { + return aClass; + } + + public void setaClass(Class aClass) { + this.aClass = aClass; + } + + class Result{ + String name; + String jspPath; + } + + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } + public void setResult(Result result) { + this.results.add(result); + } + + private static volatile Map strutsMap=new HashMap(); + + static void putStrutsMap(String key,Object obj){ + if(strutsMap.get(key)==null){ + synchronized (key){ + if(strutsMap.get(key)==null){ + synchronized (key){ + strutsMap.put(key,obj); + } + } + } + } + } + + static StrutsAction getFormStrutsMap(String key){ + return (StrutsAction) strutsMap.get(key); + } + + //0. 读取配置文件struts.xml + static { + try { + File strutsFile=new File(Struts.class.getResource("/struts.xml").getPath()); + Document document= new SAXReader().read(strutsFile); + Element element=document.getRootElement(); + if(!element.getName().equals("struts")) throw new IOException("不是一个struts.xml的配置文件"); + StrutsAction.listNodes(element,null); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + + static void listNodes(Element element, Object object) throws ClassNotFoundException { + List elements=element.elements(); + for (Element childEle:elements) { + if(childEle.getName().equals("action")) dealAction(childEle); + if(childEle.getName().equals("result")) dealResult(childEle, (StrutsAction) object); + } + + } + + static void dealAction(Element action) throws ClassNotFoundException { + StrutsAction strutsAction=new StrutsAction(); + List attributes=action.attributes(); + for (Attribute attribute:attributes) { + if(attribute.getName().equals("name")) strutsAction.setName(attribute.getValue()); + if(attribute.getName().equals("class")) strutsAction.setaClass(Class.forName(attribute.getValue())); + } + List results=new ArrayList(action.elements().size()); + strutsAction.setResults(results); + listNodes(action,strutsAction); + putStrutsMap(strutsAction.getName(),strutsAction); + } + + static void dealResult(Element element,StrutsAction strutsAction) { + StrutsAction.Result result=strutsAction.new Result(); + List attributes=element.attributes(); + for (Attribute attribute:attributes) { + if(attribute.getName().equals("name")) result.name=attribute.getValue(); + } + result.jspPath=element.getStringValue(); + strutsAction.setResult(result); + } +} + + diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/View.java b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/View.java new file mode 100644 index 0000000000..cb09758177 --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/View.java @@ -0,0 +1,23 @@ +package rui.study.coding2017.coderising.liteststruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/ArrayList.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/ArrayList.java new file mode 100644 index 0000000000..ddf5e49be2 --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/ArrayList.java @@ -0,0 +1,142 @@ +package rui.study.coding2017.coding.basic; + + +import java.util.Arrays; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size; + + private Object[] elementData; + + private static Object[] emptyObjects={}; + + private static int defaultCapacity=10; + + public void add(Object o){ + ensureCapacity(this.size+1); + elementData[size++]=o; + } + + public void add(int index, Object o){ + rangeCheckForAdd(index); + if(elementData[index]!=null){ + ensureCapacity(this.size+1); + //执行数组拷贝 + System.arraycopy(elementData,index,elementData,index+1,size-index); + size++; + } + elementData[index]=o; + } + + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + + public Object remove(int index){ + rangeCheck(index); + Object object=elementData[index]; + + int numMoved=size-index-1; + //如果是最后一位remove ,无需进行数组拷贝 + if(numMoved>0){ + System.arraycopy(elementData, index+1, elementData, index,numMoved); + } + elementData[--size]=null; + return object; + } + + public int size(){ + return this.size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + public ArrayList(){ + this.size=0; + this.elementData=emptyObjects; + } + + public ArrayList(int size){ + this.size=size; + if(size>0){ + this.elementData=new Object[size]; + }else if(size==0){ + this.elementData=emptyObjects; + }else{ + throw new IllegalArgumentException("非法容器大小 "+size); + } + + } + + /** + * 判断索引是否合法 + * @param index 索引 + */ + private void rangeCheckForAdd(int index) { + if(index>size||index<0)throw new IndexOutOfBoundsException("索引为"+index+",但是当前数组长度为:"+size); + } + + /** + * 判断索引是否合法 , + * @param index 索引 + */ + private void rangeCheck(int index) { + if(index>=size||index<0)throw new IndexOutOfBoundsException("索引为"+index+",但是当前数组长度为:"+size); + } + + + /** + * 确保当前数组能够长度能够容纳新的对象,如果不够,就自行增长 + * @param needLength 需要的数组长度 + */ + private void ensureCapacity(int needLength) { + if(elementData==emptyObjects){ + needLength = Math.max(defaultCapacity, needLength); + } + + if(needLength-elementData.length>0){ + this.grow(needLength); + } + } + + /** + * 数组扩容 + * @param needLength 需要的长度 + */ + private void grow(int needLength) { + int elementLength=elementData.length; + //扩容1.5倍 + int newLength=elementLength+(elementLength>>1); + + if(needLength-newLength>0){ + newLength=needLength; + } + this.elementData= Arrays.copyOf(this.elementData,newLength); + } + + private class ArrayListIterator implements Iterator{ + //游标,当前迭代器执行到何处了 + private int cursor=0; + + @Override + public boolean hasNext() { + return cursor!=size; + } + + @Override + public Object next() { + if (cursor >= size)throw new NoSuchElementException(); + Object[] elementData = ArrayList.this.elementData; + return elementData[cursor++]; + } + } + + + + +} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTree.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTree.java new file mode 100644 index 0000000000..f306da9cf0 --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTree.java @@ -0,0 +1,93 @@ +package rui.study.coding2017.coding.basic; + +/** + * 二叉树 + * Created by 赵睿 on 2017/2/25. + */ +public class BinaryTree { + private BinaryTreeNode root; + + private int size; + + public void insert(Comparable comparable){ + BinaryTreeNode binaryTreeNode=new BinaryTreeNode(comparable); + + if(this.root==null){ + this.root=binaryTreeNode; + }else { + boolean flag=false; + BinaryTreeNode cursorNode=root; + while(!flag){ + if(comparable.compareTo(cursorNode.getData())<0){ + if(cursorNode.getLeft()==null){ + cursorNode.setLeft(binaryTreeNode); + flag=true; + }else{ + cursorNode=cursorNode.getLeft(); + } + }else { + if(cursorNode.getRight()==null){ + cursorNode.setRight(binaryTreeNode); + flag=true; + }else{ + cursorNode=cursorNode.getRight(); + } + } + + } + } + size++; + } + + public LinkedList inorder(){ + LinkedList linkedList=new LinkedList(); + sortLeft(linkedList,root); + sortRight(linkedList,root); + return linkedList; + } + + private void sortRight(LinkedList linkedList,BinaryTreeNode binaryTreeNode){ + Queue queue=getRightList(binaryTreeNode); + while(!queue.isEmpty()){ + BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue(); + sortLeft(linkedList,queueNode); + } + + } + + private void sortLeft(LinkedList linkedList,BinaryTreeNode binaryTreeNode){ + Stack stack=getLeftList(binaryTreeNode); + while(!stack.isEmpty()) { + BinaryTreeNode stackNode = (BinaryTreeNode) stack.pop(); + linkedList.add(stackNode.getData()); + Queue queue = getRightList(stackNode); + while (!queue.isEmpty()) { + BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue(); + sortLeft(linkedList,queueNode); + } + } + linkedList.add(binaryTreeNode.getData()); + } + + + private Stack getLeftList(BinaryTreeNode binaryTreeNode){ + Stack stack=new Stack(); + while(binaryTreeNode.getLeft()!=null){ + binaryTreeNode=binaryTreeNode.getLeft(); + stack.push(binaryTreeNode); + } + return stack; + } + + private Queue getRightList(BinaryTreeNode binaryTreeNode){ + Queue queue=new Queue(); + while(binaryTreeNode.getRight()!=null){ + binaryTreeNode=binaryTreeNode.getRight(); + queue.enQueue(binaryTreeNode); + } + return queue; + } + + + +} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTreeNode.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..1d535da5ee --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTreeNode.java @@ -0,0 +1,40 @@ +package rui.study.coding2017.coding.basic; + +public class BinaryTreeNode { + + private Comparable data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Comparable getData() { + return data; + } + public void setData(Comparable data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode() { + } + + public BinaryTreeNode(Comparable data) { + this.data = data; + } + + public BinaryTreeNode(Comparable data, BinaryTreeNode left, BinaryTreeNode right) { + this.data = data; + this.left = left; + this.right = right; + } +} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Iterator.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Iterator.java new file mode 100644 index 0000000000..ee7dbc7683 --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package rui.study.coding2017.coding.basic; + + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/LinkedList.java b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/LinkedList.java new file mode 100644 index 0000000000..67cd9d5b91 --- /dev/null +++ b/group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/LinkedList.java @@ -0,0 +1,156 @@ +package rui.study.coding2017.coding.basic; + +/** + * 单向链表 + */ +public class LinkedList { + private Node head; + + private Node current; + + private int size; + + public LinkedList(){ + } + + public int size(){ + return size; + } + + public void add(Object o){ + Node newNode=new Node(o,null); + if(size==0){ + head=current=newNode; + } + current.next=newNode; + current=newNode; + size++; + } + + public void add(int index , Object o){ + checkIndexForAdd(index); + if(index==size){ + add(o); + }else{ + Node newNode=new Node(o,null); + if(index==0){ + newNode.next=head; + head=newNode; + }else{ + Node after=getIndexNode(index); + Node before=getIndexNode(index-1); + before.next=newNode; + newNode.next=after; + } + size++; + } + } + + + public Object get(int index){ + return getIndexNode(index).data; + } + + public void addFirst(Object obj){ + add(0,obj); + } + public void addLast(Object obj){ + if(size==0){ + add(obj); + }else { + add(size,obj); + } + } + + public Object remove(int index){ + checkIndex(index); + Node needRemove; + if(index==0){ + needRemove=head; + if(size==1){ + head=null; + }else{ + head=head.next; + } + }else{ + needRemove=getIndexNode(index); + Node before=getIndexNode(index-1); + before.next=needRemove.next; + if(index==size-1){ + current=before; + } + } + size--; + return needRemove.data; + } + public Object removeFirst(){ + return remove(0); + } + public Object removeLast(){ + return remove(size-1); + } + public Iterator iterator(){ + return new LinkedListIterator(); + } + + + public class LinkedListIterator implements Iterator{ + + private int cursor=0; + + private Node cursorNode=head; + + @Override + public boolean hasNext() { + return cursor!=size; + } + + @Override + public Object next() { + Object object=cursorNode.data; + cursorNode=cursorNode.next; + cursor++; + return object; + } + } + + private void checkIndexForAdd(int index){ + if(!(index>=0&&index<=size)){ + throw new IndexOutOfBoundsException("索引"+index+"越界!"); + } + } + private void checkIndex(int index){ + if(!(index>=0&&index + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coderising/array/ArrayUtilTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..9b5f3d8175 --- /dev/null +++ b/group03/1360464792/src/test/java/rui/study/coding2017/coderising/array/ArrayUtilTest.java @@ -0,0 +1,91 @@ +package rui.study.coding2017.coderising.array; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * 创建于 2017-03-01. + * + * @author 赵睿 + */ +public class ArrayUtilTest { + ArrayUtil arrayUtil=new ArrayUtil(); + + @Test + public void reverseArray() throws Exception { + int[] origin={7, 9 , 30, 3}; + origin=arrayUtil.reverseArray(origin); + for (Integer i:origin) { + System.out.println(i); + } + } + + @Test + public void removeZero() throws Exception { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + oldArr=arrayUtil.removeZero(oldArr); + for (Integer i:oldArr) { + System.out.println(i); + } + } + + @Test + public void merge() throws Exception { + int arr1[]={3, 5, 7,8}; + int arr2[]={4, 5, 6,7}; + + int oldArr[]=arrayUtil.merge(arr1,arr2); + for (Integer i:oldArr) { + System.out.println(i); + } + } + + @Test + public void grow() throws Exception { + int oldArr[]={2,3,6}; + oldArr=arrayUtil.grow(oldArr,3); + for (Integer i:oldArr) { + System.out.println(i); + } + } + + @Test + public void fibonacci() throws Exception { + for (Integer i:arrayUtil.fibonacci(0)) { + System.out.println(i); + } + for (Integer i:arrayUtil.fibonacci(1)) { + System.out.println(i); + } + System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>"); + for (Integer i:arrayUtil.fibonacci(2)) { + System.out.println(i); + } + System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>"); + for (Integer i:arrayUtil.fibonacci(15)) { + System.out.println(i); + } + } + + @Test + public void getPrimes() throws Exception { + for (Integer i:arrayUtil.getPrimes(100)) { + System.out.println(i); + } + } + + @Test + public void getPerfectNumbers() throws Exception { + for (Integer i:arrayUtil.getPerfectNumbers(1000)) { + System.out.println(i); + } + } + + @Test + public void join() throws Exception { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + System.out.println(arrayUtil.join(oldArr,"````")); + } + +} \ No newline at end of file diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coderising/liteststruts/StrutsTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coderising/liteststruts/StrutsTest.java new file mode 100644 index 0000000000..0f41c2ba4c --- /dev/null +++ b/group03/1360464792/src/test/java/rui/study/coding2017/coderising/liteststruts/StrutsTest.java @@ -0,0 +1,47 @@ +package rui.study.coding2017.coderising.liteststruts; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.*; + +/** + * 测试struts功能 + * Created by 赵睿 on 2017/3/4. + */ + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} \ No newline at end of file diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/ArrayListTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..7a753e14ce --- /dev/null +++ b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/ArrayListTest.java @@ -0,0 +1,80 @@ +package rui.study.coding2017.coding.basic; + +import org.junit.Test; + +/** + * 测试我的数组如何 + * Created by 赵睿 on 2017/2/24. + */ +public class ArrayListTest { + @Test + public void newArrayList(){ + System.out.println(new ArrayList().size()); + System.out.println(new ArrayList(0).size()); + System.out.println(new ArrayList(-1).size()); + } + + @Test + public void add() throws Exception { + ArrayList arrayList=new ArrayList(2); + arrayList.add(1); + arrayList.add(2); + System.out.println(arrayList.size()); + System.out.println(arrayList.get(0)); + System.out.println(arrayList.get(1)); + System.out.println(arrayList.get(2)); + System.out.println(arrayList.get(3)); + } + + @Test + public void add1() throws Exception { + ArrayList arrayList=new ArrayList(2); + arrayList.add(0); + arrayList.add(0,1); + arrayList.add(1,2); + System.out.println(arrayList.size()); + System.out.println(arrayList.get(0)); + System.out.println(arrayList.get(1)); + System.out.println(arrayList.get(2)); + System.out.println(arrayList.get(3)); + } + @Test + public void add2() throws Exception { + java.util.ArrayList arrayList=new java.util.ArrayList(2); + arrayList.add(0); + arrayList.add(0,1); + arrayList.add(1,2); + System.out.println(arrayList.size()); + System.out.println(arrayList.get(0)); + System.out.println(arrayList.get(1)); + System.out.println(arrayList.get(2)); + System.out.println(arrayList.get(3)); + } + + @Test + public void remove() throws Exception { + ArrayList arrayList=new ArrayList(2); + arrayList.add(0); + arrayList.add(0,1); + arrayList.add(1,2); + System.out.println(arrayList.size()); + System.out.println(arrayList.remove(1)); + System.out.println(arrayList.size()); + System.out.println(arrayList.get(0)); + System.out.println(arrayList.get(1)); + System.out.println(arrayList.get(2)); + } + + @Test + public void iterator() throws Exception { + ArrayList arrayList=new ArrayList(2); + arrayList.add(0); + arrayList.add(0,1); + arrayList.add(1,2); + Iterator iterator=arrayList.iterator(); + while(iterator.hasNext()){ + System.out.println(iterator.next()); + } + } + +} \ No newline at end of file diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/BinaryTreeTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/BinaryTreeTest.java new file mode 100644 index 0000000000..3c74302e47 --- /dev/null +++ b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/BinaryTreeTest.java @@ -0,0 +1,32 @@ +package rui.study.coding2017.coding.basic; + +import org.junit.Test; + +/** + * 二叉树测试 + * Created by 赵睿 on 2017/2/25. + */ +public class BinaryTreeTest { + @Test + public void insert() throws Exception { + BinaryTree binaryTree=new BinaryTree(); + binaryTree.insert(4); + binaryTree.insert(7); + binaryTree.insert(5); + binaryTree.insert(8); + binaryTree.insert(6); + binaryTree.insert(3); + binaryTree.insert(0); + binaryTree.insert(1); + binaryTree.insert(2); + LinkedList linkedList=binaryTree.inorder(); + + Iterator iterator=linkedList.iterator(); + while (iterator.hasNext()){ + System.out.println(iterator.next()); + } + } + + + +} \ No newline at end of file diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/LinkedListTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..5c78c9618f --- /dev/null +++ b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/LinkedListTest.java @@ -0,0 +1,138 @@ +package rui.study.coding2017.coding.basic; + +import org.junit.Test; + +/** + * 测试链表 + * Created by 赵睿 on 2017/2/24. + */ +public class LinkedListTest { + @Test + public void add() throws Exception { + LinkedList linkedList=new LinkedList(); + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + try { + System.out.println(linkedList.get(3)); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + System.out.println(linkedList.get(2)); + System.out.println(linkedList.get(1)); + System.out.println(linkedList.get(0)); + try { + System.out.println(linkedList.get(-1)); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + @Test + public void add1() throws Exception { + //当前位置是否移动 + LinkedList linkedList=new LinkedList(); + linkedList.add(0,0); + linkedList.add(1,1); + + linkedList.add(0,-1); + System.out.println(linkedList.size()); + linkedList.add(1,11); + System.out.println(linkedList.size()); + linkedList.add(2,22); + linkedList.add(23); + System.out.println(linkedList.size()); + + + System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>"); + Iterator iterator=linkedList.iterator(); + while (iterator.hasNext()){ + System.out.println(iterator.next()); + } + } + + + @Test + public void addFirst() throws Exception { + LinkedList linkedList=new LinkedList(); + linkedList.add(0,0); + linkedList.add(1,1); + linkedList.addFirst(-1); + + System.out.println(linkedList.size()); + + Iterator iterator=linkedList.iterator(); + while (iterator.hasNext()){ + System.out.println(iterator.next()); + } + } + + @Test + public void addLast() throws Exception { + LinkedList linkedList=new LinkedList(); + linkedList.add(0,0); + linkedList.add(1,1); + linkedList.addLast(2); + System.out.println(linkedList.size()); + + Iterator iterator=linkedList.iterator(); + while (iterator.hasNext()){ + System.out.println(iterator.next()); + } + + + } + + @Test + public void remove() throws Exception { + LinkedList linkedList=new LinkedList(); + linkedList.add(0,0); + linkedList.add(1,1); + System.out.println(linkedList.size()); + try { + linkedList.remove(2); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + linkedList.remove(1); + System.out.println(linkedList.size()); + linkedList.remove(0); + System.out.println(linkedList.size()); + try { + linkedList.remove(0); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + @Test + public void removeFirst() throws Exception { + LinkedList linkedList=new LinkedList(); + try { + linkedList.removeFirst(); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + linkedList.add(0,0); + linkedList.add(1,1); + linkedList.removeFirst(); + System.out.println(linkedList.size()); + + } + + @Test + public void removeLast() throws Exception { + LinkedList linkedList=new LinkedList(); + try { + linkedList.removeLast(); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + + linkedList.add(0,0); + linkedList.add(1,1); + linkedList.removeLast(); + System.out.println(linkedList.size()); + + } +} \ No newline at end of file diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/QueueTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/QueueTest.java new file mode 100644 index 0000000000..2b3631ad86 --- /dev/null +++ b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/QueueTest.java @@ -0,0 +1,37 @@ +package rui.study.coding2017.coding.basic; + +import org.junit.Test; + +/** + * 测试队列 + * Created by 赵睿 on 2017/2/25. + */ +public class QueueTest { + @Test + public void enQueue() throws Exception { + Queue queue=new Queue(); + queue.enQueue(1); + queue.enQueue(2); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + } + + + @Test + public void isEmpty() throws Exception { + Queue queue=new Queue(); + System.out.println(queue.isEmpty()); + queue.enQueue(1); + System.out.println(queue.isEmpty()); + } + + @Test + public void size() throws Exception { + Queue queue=new Queue(); + System.out.println(queue.size()); + queue.enQueue(1); + System.out.println(queue.size()); + } + +} \ No newline at end of file diff --git a/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/StackTest.java b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/StackTest.java new file mode 100644 index 0000000000..804510e85b --- /dev/null +++ b/group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/StackTest.java @@ -0,0 +1,52 @@ +package rui.study.coding2017.coding.basic; + +import org.junit.Test; + +/** + * 测试栈 + * Created by 赵睿 on 2017/2/25. + */ +public class StackTest { + @Test + public void push() throws Exception { + Stack stack=new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + + } + + @Test + public void peek() throws Exception { + Stack stack=new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + System.out.println(stack.peek()); + System.out.println(stack.peek()); + + + } + + @Test + public void isEmpty() throws Exception { + Stack stack=new Stack(); + System.out.println(stack.isEmpty()); + stack.push(1); + System.out.println(stack.isEmpty()); + + } + + @Test + public void size() throws Exception { + Stack stack=new Stack(); + System.out.println(stack.size()); + stack.push(1); + System.out.println(stack.size()); + } + +} \ No newline at end of file diff --git a/group03/172487938/Iterator.java b/group03/172487938/Iterator.java new file mode 100644 index 0000000000..e6187ad2fd --- /dev/null +++ b/group03/172487938/Iterator.java @@ -0,0 +1,7 @@ +package 基本数据结构; + +public interface Iterator { + public boolean hasNext(); + public E next(); + public void remove(); +} diff --git a/group03/172487938/MyArrayList.java b/group03/172487938/MyArrayList.java new file mode 100644 index 0000000000..0c00a277ff --- /dev/null +++ b/group03/172487938/MyArrayList.java @@ -0,0 +1,186 @@ +package 基本数据结构; + + +/** + * Created by LIANG on 2017/2/24. + */ +public class MyArrayList implements MyList +{ + public static final int INITIAL_CAPACITTY = 16; + private E[] data = (E[]) new Object[INITIAL_CAPACITTY]; + private static int size = 0; + + public MyArrayList(E[] objects) + { + + for (int i = 0; i < objects.length; i++) + { + add(objects[i]); + size++; + } + } + + public MyArrayList() {} + + ; + + public void ensureCapicity() + { + if (size >= data.length) + { + E[] newData = (E[]) new Object[size * 2]; + System.arraycopy(data, 0, newData, 0, data.length); + data = newData; + } + } + +// public boolean add(E e) +// { +// ensureCapicity(); +// if(e != null) +// data[size++] = e; +// return true; +// } + + public void add(E e) + { + add(size, e); + } + + @Override + public void add(int index, E e) + { + ensureCapicity(); + for (int i = size - 1; i >= index; i--) + { + data[i + 1] = data[i]; + } + data[index] = e; + size++; + } + + @Override + public E get(int index) + { + return data[index]; + } + + @Override + public E remove(int index) + { + checkIndex(index); + E e = data[index]; + for (int i = index; i < data.length - 1; i++) + data[i] = data[i + 1]; + + data[size - 1] = null; + size--; + return e; + + } + + private void checkIndex(int index) + { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("输入下标有误"); + } + + @Override + public int size() + { + return size; + } + + @Override + public void clear() + { + data = (E[]) new Object[INITIAL_CAPACITTY]; + size = 0; + } + + @Override + public int indexOf(E e) + { + for (int i = 0; i < size; i++) + { + if (e.equals(data[i])) + return i; + } + return -1; + } + + + @Override + public boolean isEmpty() + { + return size == 0; + } + + @Override + public E set(int index, E e) + { + checkIndex(index); + E temp = data[index]; + data[index] = e; + return temp; + } + + @Override + public boolean contains(E e) + { + for (int i = 0; i < size; i++) + { + if(data[i].equals(e)) + return true; + } + return false; + } + + public void trimToSize() + { + if (size != data.length) + { + E[] newData = (E[]) new Object[size]; + System.arraycopy(data, 0, newData, 0, size); + data = newData; + } + } + + @Override + public String toString() + { + StringBuilder result = new StringBuilder("["); + + for (int i = 0; i < size; i++) + { + result.append(data[i]); + if (i < size - 1) + result.append(","); + } + return result.toString() + "]"; + } + + private class ArrayListIterator implements Iterator + { + private int current = 0; + + @Override + public boolean hasNext() + { + return (current < size); + } + + @Override + public E next() + { + return data[current++]; + } + + @Override + public void remove() + { + MyArrayList.this.remove(current); + } + } + +} diff --git a/group03/172487938/MyLinkedList.java b/group03/172487938/MyLinkedList.java new file mode 100644 index 0000000000..609ab8c81d --- /dev/null +++ b/group03/172487938/MyLinkedList.java @@ -0,0 +1,274 @@ +package 基本数据结构; + +public class MyLinkedList implements MyList +{ + private Node head, tail; + private int size; + + public MyLinkedList() {} + + public MyLinkedList(E[] objects) + { + for (int i = 0; i < objects.length; i++) + { + add(objects[i]); +// size++; + } + } + + public E getFirst() + { + if (size == 0) + return null; + else + return head.element; + } + + public E getLast() + { + if (size == 0) + return null; + else + return tail.element; + } + + public void addFirst(E e) + { + Node newNode = new Node<>(e); + newNode.next = head; + head = newNode; + size++; + + if (tail == null) + tail = head; + } + + public void addLast(E e) + { + Node newNode = new Node<>(e); + + if (tail == null) + head = tail = newNode; + else + { + tail.next = newNode; + tail = tail.next; + } + size++; + } + + public void add(E e) + { + add(size, e); + } + + @Override + public void add(int index, E e) + { + if (index == 0) + { + addFirst(e); + } else if (index >= size) + { + addLast(e); + } else + { + Node current = head; + for (int i = 1; i < index; i++) + { + current = current.next; + } + Node temp = current.next; + current.next = new Node(e); + (current.next).next = temp; + size++; + } + } + + @Override + public E get(int index) + { + if (index < 0 || index > size - 1) + return null; + + Node current = head; + for (int i = 0; i < index; i++) + current = current.next; + + return current.element; + } + + @Override + public E remove(int index) + { + if (index < 0 || index >= size) + return null; + else if (index == 0) + { + E e = removeFirst(); + return e; + } else if (index == size - 1) + return removeLast(); + else + { + Node previous = head; + + for (int i = 1; i < index; i++) + { + previous = previous.next; + } + + Node current = previous.next; + previous.next = current.next; + size--; + return current.element; + } + } + + public E removeFirst() + { + if (size == 0) + return null; + else + { + Node temp = head; + head = head.next; + size--; + if (head == null) + tail = null; + return temp.element; + } + } + + public E removeLast() + { + if (size == 0) + return null; + else if (size == 1) + { + Node temp = head; + head = tail = null; + size = 0; + return temp.element; + } else + { + Node current = head; + + for (int i = 0; i < size - 2; i++) + current = current.next; + + Node temp = tail; + tail = current; + tail.next = null; + size--; + return temp.element; + } + } + + @Override + public int size() + { + return size; + } + + @Override + public void clear() + { + size = 0; + head = tail = null; + } + + @Override + public int indexOf(E e) + { + Node current = head; + for (int i = 0; i < size; i++) + { + if (current.element.equals(e)) + return i; + current = current.next; + } + return -1; + } + + @Override + public boolean isEmpty() + { + if (size != 0) + return false; + else + return true; + } + + @Override + public E set(int index, E e) + { + if (index < 0 || index > size - 1) + return null; + + Node current = head; + for (int i = 0; i < index; i++) + current = current.next; + + E temp = current.element; + current.element = e; + + return temp; + } + + @Override + public boolean contains(E e) + { + Node current = head; + for (int i = 0; i < size; i++) + { + if (current.element.equals(e)) + return true; + current = current.next; + } + return false; + } + + @Override + public String toString() + { + StringBuilder result = new StringBuilder("["); + + if (size == 0) + return null; + else + { + Node current = head; + for (int i = 0; i < size; i++) + { + try + { + result.append(current.element); + } catch (Exception e) + { + e.printStackTrace(); + } + current = current.next; + if (current != null) + { + result.append(", "); + } else + { + result.append("]"); + } + } + return result.toString(); + } + } + + public static class Node + { + E element; + Node next; + + public Node(E e) + { + this.element = e; + } + } +} \ No newline at end of file diff --git a/group03/172487938/MyList.java b/group03/172487938/MyList.java new file mode 100644 index 0000000000..5d16147855 --- /dev/null +++ b/group03/172487938/MyList.java @@ -0,0 +1,27 @@ +package 基本数据结构; + +/** + * Created by LIANG on 2017/2/24. + */ +public interface MyList +{ + + public void add(int index, E e); + + public E get(int index); + + public E remove(int index); + + public int size(); + + public void clear(); + + + public int indexOf(E e); + + public boolean isEmpty(); + + public E set(int index, E e); + + public boolean contains(E e); +} diff --git a/group03/172487938/Queue.java b/group03/172487938/Queue.java new file mode 100644 index 0000000000..af335f5274 --- /dev/null +++ b/group03/172487938/Queue.java @@ -0,0 +1,32 @@ +package 基本数据结构; + +import java.util.LinkedList; + +public class Queue +{ + + private LinkedList list = new LinkedList(); + + public void enQueue(Object o) + { + list.addLast(o); + } + + public Object deQueue() + { + return list.removeFirst(); + } + + public boolean isEmpty() + { + if(list.size() != 0) + return true; + else + return false; + } + + public int size() + { + return list.size(); + } +} diff --git a/group03/172487938/Stack.java b/group03/172487938/Stack.java new file mode 100644 index 0000000000..f1b67822b1 --- /dev/null +++ b/group03/172487938/Stack.java @@ -0,0 +1,37 @@ +package 基本数据结构; + +import java.util.ArrayList; + +public class Stack +{ + private ArrayList elementData = new ArrayList(); + + public void push(Object o) + { + elementData.add(o); + } + + public Object pop() + { + Object popElement = elementData.remove(elementData.size() - 1); + return popElement; + } + + public Object peek() + { + Object peekElement = elementData.get(size() - 1); + return peekElement; + } + + public boolean isEmpty() + { + if(elementData.size() != 0) + return false; + return true; + } + + public int size() + { + return elementData.size(); + } +} diff --git a/group03/172487938/TestMyArrayList.java b/group03/172487938/TestMyArrayList.java new file mode 100644 index 0000000000..dbf8b610e1 --- /dev/null +++ b/group03/172487938/TestMyArrayList.java @@ -0,0 +1,36 @@ +package 基本数据结构; + +/** + * Created by LIANG on 2017/2/24. + */ +public class TestMyArrayList +{ + public static void main(String[] args) + { + MyArrayList list = new MyArrayList<>(); + list.add("America"); + System.out.println(list); + + list.add("Canada"); + System.out.println(list); + + list.add("Tokoy"); + System.out.println(list); + + list.add("Shanghai"); + + + int size = list.size(); + System.out.println(size); + list.add(0,"China"); + System.out.println(list); + String[] str = {"Japan","England","France","HonKong","BeiJing"}; + for(String s:str) + list.add(s); + System.out.println(list); + + list.remove(3); + System.out.println(list); + + } +} diff --git a/group03/172487938/TestMyLinkedList.java b/group03/172487938/TestMyLinkedList.java new file mode 100644 index 0000000000..cd412ef646 --- /dev/null +++ b/group03/172487938/TestMyLinkedList.java @@ -0,0 +1,19 @@ +package 基本数据结构; + +/** + * Created by LIANG on 2017/2/25. + */ +public class TestMyLinkedList +{ + public static void main(String[] args) + { + String[] name = {"Tom", "George", "Peter", "Jean", "George", "Jane"}; + MyList list = new MyLinkedList(name); + + System.out.println(list.contains("George")); + System.out.println(list.get(3)); + System.out.println(list.indexOf("George")); + list.set(4, "Michael"); + System.out.println(list); + } +} diff --git a/group03/1753176091/bin/.gitignore b/group03/1753176091/bin/.gitignore new file mode 100644 index 0000000000..c2d9872a16 --- /dev/null +++ b/group03/1753176091/bin/.gitignore @@ -0,0 +1 @@ +/com/ diff --git a/group03/1753176091/src/com/coding/basic/ArrayList.java b/group03/1753176091/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..88e9ec8ce0 --- /dev/null +++ b/group03/1753176091/src/com/coding/basic/ArrayList.java @@ -0,0 +1,56 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + ensureCapacity(size + 1); + elementData[size++] = o; + } + + private void ensureCapacity(int minCapacity) { + if (minCapacity > 100) { + grow(elementData); + } + } + + private void grow(Object[] elementData) { + int oldLength = elementData.length; + int newLength = oldLength * 2; + Arrays.copyOf(elementData, newLength); + } + + public void add(int index, Object o) { + ensureCapacity(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + } + + public Object get(int index) { + if (index < 0 || index > elementData.length) { + throw new IndexOutOfBoundsException(); + } + return (Object) elementData[index]; + } + + public Object remove(int index) { + int lowLength = size - index - 1; + System.arraycopy(elementData, index + 1, elementData, index, lowLength); + elementData[--size] = null; + return (Object) elementData[index]; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return null; + } + +} diff --git a/group03/1753176091/src/com/coding/basic/BinaryTreeNode.java b/group03/1753176091/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group03/1753176091/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group03/1753176091/src/com/coding/basic/FileUtil.java b/group03/1753176091/src/com/coding/basic/FileUtil.java new file mode 100644 index 0000000000..856abf7249 --- /dev/null +++ b/group03/1753176091/src/com/coding/basic/FileUtil.java @@ -0,0 +1,68 @@ +package com.coding.basic; + + + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class FileUtil { + + public static String byteToHexString(byte[] codes ){ + + StringBuffer buffer = new StringBuffer(); + + for(int i=0;i= size || index < 0) { + throw new IndexOutOfBoundsException(); + } + Node newHead = new Node(o, null); + Node f = head; + for (int i = 0; i < index - 1; i++) { + f = f.next; + } + newHead.next = f.next; + f.next = newHead; + size++; + } + + public Object get(int index) { + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(); + } + Node f = head; + for (int i = 0; i < index; i++) { + f = f.next; + } + return f.data; + } + + public Object remove(int index) { + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(); + } + Node f = head; + for (int i = 0; i < index - 1; i++) { + f = f.next; + } + f.next = f.next.next; + final Node d = f.next; + final Object element = d.data; + d.data = null; + d.next = null; + size--; + return element; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newHead = new Node(o, head); + head = newHead; + size++; + } + + public void addLast(Object o) { + Node newHead = new Node(o, null); + Node f = head; + for (int i = 0; i < size - 1; i++) { + f = f.next; + } + f.next = newHead; + size++; + } + + public Object removeFirst() { + final Node f = head; + if (f == null) + throw new NoSuchElementException(); + final Object element = f.data; + head = f.next; + f.data = null; + f.next = null; + size--; + return element; + } + + public Object removeLast() { + Node f = head; + for (int i = 0; i < size - 2; i++) { + f = f.next; + } + Object element = f.next; + f.next = null; + size--; + return element; + } + + public Iterator iterator() { + return null; + } + + private static class Node { + Object data; + Node next; + + private Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } +} diff --git a/group03/1753176091/src/com/coding/basic/List.java b/group03/1753176091/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group03/1753176091/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group03/1753176091/src/com/coding/basic/Queue.java b/group03/1753176091/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..b5440dbade --- /dev/null +++ b/group03/1753176091/src/com/coding/basic/Queue.java @@ -0,0 +1,25 @@ +package com.coding.basic; + +public class Queue { + + private int size; + LinkedList elementData = new LinkedList(); + + public void enQueue(Object o) { + elementData.addLast(o); + size++; + } + + public Object deQueue() { + size--; + return elementData.removeFirst(); + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group03/1753176091/src/com/coding/basic/Stack.java b/group03/1753176091/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..0ca338f666 --- /dev/null +++ b/group03/1753176091/src/com/coding/basic/Stack.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size = 0; + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + if (size > 0) + return elementData.remove(size); + return null; + } + + public Object peek() { + return elementData.get(size); + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group03/2864885311/DS/.classpath b/group03/2864885311/DS/.classpath new file mode 100644 index 0000000000..6177796265 --- /dev/null +++ b/group03/2864885311/DS/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group03/2864885311/DS/.gitignore b/group03/2864885311/DS/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group03/2864885311/DS/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group03/2864885311/DS/.project b/group03/2864885311/DS/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group03/2864885311/DS/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group03/2864885311/DS/.settings/org.eclipse.jdt.core.prefs b/group03/2864885311/DS/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group03/2864885311/DS/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group03/2864885311/DS/src/com/coding/basic/ArrayList.java b/group03/2864885311/DS/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..31bc2649db --- /dev/null +++ b/group03/2864885311/DS/src/com/coding/basic/ArrayList.java @@ -0,0 +1,68 @@ +package com.coding.basic; +//import java.util.Iterator; + +//import java.util.List; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + //int int_inarry = 10; + grow(o); + + } + public void add(int index, Object o){ + + + + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + + private void grow(Object nbradd){ + + if (this.size>this.elementData.length){ + Object[] arrayRefVar = new Object[this.elementData.length+1]; + growcopy(nbradd,arrayRefVar); + }else{ + Object[] arrayRefVar = new Object[this.elementData.length]; + growcopy(nbradd,arrayRefVar); + } + } + private void growcopy(Object nbraddcopy,Object[] arrayRefVarcopy){ + System.arraycopy(this.elementData, 0, arrayRefVarcopy, 0, this.elementData.length); + this.elementData[0]=nbraddcopy; + System.arraycopy(arrayRefVarcopy, 0, this.elementData, 1, this.size+1); + this.size++; + } + private void instrgrow(int nbrindex,Object[] arraynbo,Object ino){ + + //Object[] arrayRefVar2 = new Object[nbrindex]; + Object[] arrayRefVar3 = new Object[this.size-nbrindex]; + + + System.arraycopy(this.elementData, nbrindex, arrayRefVar3, nbrindex, this.size); + this.elementData[nbrindex]=ino; + System.arraycopy(arrayRefVar3, 0, this.elementData, nbrindex+1, this.size); + + + } +} diff --git a/group03/2864885311/DS/src/com/coding/basic/BinaryTreeNode.java b/group03/2864885311/DS/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group03/2864885311/DS/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group03/2864885311/DS/src/com/coding/basic/Iterator.java b/group03/2864885311/DS/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group03/2864885311/DS/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group03/2864885311/DS/src/com/coding/basic/LinkedList.java b/group03/2864885311/DS/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..e2c4e5e795 --- /dev/null +++ b/group03/2864885311/DS/src/com/coding/basic/LinkedList.java @@ -0,0 +1,46 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group03/2864885311/DS/src/com/coding/basic/List.java b/group03/2864885311/DS/src/com/coding/basic/List.java new file mode 100644 index 0000000000..d47df585d9 --- /dev/null +++ b/group03/2864885311/DS/src/com/coding/basic/List.java @@ -0,0 +1,10 @@ +package com.coding.basic; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group03/2864885311/DS/src/com/coding/basic/Queue.java b/group03/2864885311/DS/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group03/2864885311/DS/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group03/2864885311/DS/src/com/coding/basic/Stack.java b/group03/2864885311/DS/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group03/2864885311/DS/src/com/coding/basic/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/ArrayList.java b/group03/345943980/2017Learning/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..fc3f85251a --- /dev/null +++ b/group03/345943980/2017Learning/src/com/coding/basic/ArrayList.java @@ -0,0 +1,91 @@ +package com.coding.basic; + +//import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; // 记录数组当前长度 + + private Object[] elementData = new Object[10]; // 初始长度 + + /* + * (non-Javadoc) + * + * @see com.coding.basic.List#add(java.lang.Object) + */ + public void add(Object o) { + if (size > elementData.length) { // size大于数组初始长度,需要对原数组进行扩容 + grow(elementData, 10); + } + this.elementData[size++] = o; + } + + /* + * 在指定下标位置插入元素 (non-Javadoc) + * + * @see com.coding.basic.List#add(int, java.lang.Object) + */ + public void add(int index, Object o) { + if (size > elementData.length) { // size大于数组初始长度,需要对原数组进行扩容 + grow(elementData, 10); + } + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index) { + // 1、先要判断index所在处有无值,没有则返回null + Object o = elementData[index]; + if (null == o) + throw new IndexOutOfBoundsException(); + return o; + } + + public Object remove(int index) { + Object oldVal = elementData[index]; // 保留要删除的元素 + int numMoved = size - index - 1; + if (numMoved > 0) { + System.arraycopy(elementData, index + 1, elementData, index, numMoved);// 讲移除位置之后的元素向前 挪动 + } + elementData[--size] = null; // 将数组末尾元素置为空 + return oldVal; + } + + /** + * 获取数组元素个数 + */ + public int size() { + return this.size; + } + + public Object[] grow(Object[] src, int size) { + // Arrays.copyOf(src, src.length+size); + Object[] target = new Object[src.length + size]; + System.arraycopy(src, 0, target, 0, src.length); + return target; + } + + public Iterator iterator() { + + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + + private int cursor=0; + @Override + public boolean hasNext() { + return size != cursor; + } + + @Override + public Object next() { + return elementData[cursor++]; + } + + } + +} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/BinaryTree.java b/group03/345943980/2017Learning/src/com/coding/basic/BinaryTree.java new file mode 100644 index 0000000000..94e757ba25 --- /dev/null +++ b/group03/345943980/2017Learning/src/com/coding/basic/BinaryTree.java @@ -0,0 +1,132 @@ +package com.coding.basic; + +/** + * 二叉树 + * + * @author cm + */ +public class BinaryTree { + + private BinaryTreeNode root; + + public BinaryTreeNode insert(Object o) { + BinaryTreeNode binaryTreeNode = new BinaryTreeNode(o); + if (null == root) { + root = new BinaryTreeNode(o); + } else { + boolean flag = false; + BinaryTreeNode cursorNode = root; + while (!flag) { + if (binaryTreeNode.compareTo(cursorNode) < 0) { + if (cursorNode.getLeft() == null) { + cursorNode.setLeft(binaryTreeNode); + flag = true; + } else { + cursorNode = cursorNode.getLeft(); + } + } else { + if (cursorNode.getRight() == null) { + cursorNode.setRight(binaryTreeNode); + flag = true; + } else { + cursorNode = cursorNode.getRight(); + } + } + } + } + return binaryTreeNode; + } + + public LinkedList inOrder() { + LinkedList linkedList = new LinkedList(); + sortLeft(linkedList, root); + sortRight(linkedList, root); + return linkedList; + } + + private void sortRight(LinkedList linkedList, BinaryTreeNode binaryTreeNode) { + Queue queue = getRightList(binaryTreeNode); + while (!queue.isEmpty()) { + BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue(); + sortLeft(linkedList, queueNode); + } + } + + private void sortLeft(LinkedList linkedList, BinaryTreeNode binaryTreeNode) { + Stack stack = getLeftList(binaryTreeNode); + while (!stack.isEmpty()) { + BinaryTreeNode stackNode = (BinaryTreeNode) stack.pop(); + linkedList.add(stackNode.getData()); + Queue queue = getRightList(stackNode); + while (!queue.isEmpty()) { + BinaryTreeNode queueNode = (BinaryTreeNode) queue.deQueue(); + sortLeft(linkedList, queueNode); + } + } + linkedList.add(binaryTreeNode.getData()); + } + + private Stack getLeftList(BinaryTreeNode binaryTreeNode) { + Stack stack = new Stack(); + while (binaryTreeNode.getLeft() != null) { + binaryTreeNode = binaryTreeNode.getLeft(); + stack.push(binaryTreeNode); + } + return stack; + } + + private Queue getRightList(BinaryTreeNode binaryTreeNode) { + Queue queue = new Queue(); + while (binaryTreeNode.getRight() != null) { + binaryTreeNode = binaryTreeNode.getRight(); + queue.enQueue(binaryTreeNode); + } + return queue; + } + + private class BinaryTreeNode implements Comparable { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode(Object o) { + setData(o); + } + + @Override + public int compareTo(BinaryTreeNode binaryTreeNode) { + Integer currVal = (Integer) root.getData(); + Integer compVal = (Integer) binaryTreeNode.getData(); + if (currVal < compVal) + return -1; + else if (currVal == compVal) + return 0; + else + return 1; + } + } +} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/Iterator.java b/group03/345943980/2017Learning/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group03/345943980/2017Learning/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/LinkedList.java b/group03/345943980/2017Learning/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..2ac413a010 --- /dev/null +++ b/group03/345943980/2017Learning/src/com/coding/basic/LinkedList.java @@ -0,0 +1,129 @@ +package com.coding.basic; + +/** + * 单向链表 + * + * @author Administrator + * + */ +public class LinkedList implements List { + + private Node head = new Node(null, null); + private int size = 0; + + public LinkedList() { + head.next = head; + } + + public void add(Object o) { + addLast(o); + } + + public void add(int index, Object o) { + // 1、检查是否在合理范围内 + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + Node currNode = findNodeByIndex(index); + Node newNode = new Node(o, currNode); + if (index == 0) { // 直接插入到第一个位置 + head = newNode; + } else { + Node preNode = findNodeByIndex(index - 1); + preNode.next = newNode; + } + size++; + } + + public Object get(int index) { + return findNodeByIndex(index).data; + } + + public Object remove(int index) { + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + Node targetNode = this.findNodeByIndex(index); + Object obj = targetNode.data; + if (index == 0) { + targetNode.data = null; + head = targetNode.next; + } else { + Node preNode = findNodeByIndex(index - 1); + preNode.next = targetNode.next; + } + // targetNode.data = null; + size--; + return obj; + } + + public int size() { + return this.size; + } + + public void addFirst(Object o) { + Node nextNode = head; + Node newNode = new Node(o, nextNode); + head = newNode; + size++; + } + + public void addLast(Object o) { + Node subNode = new Node(o, null); + if (size == 0) { + head = subNode; + } else { + Node lastNode = findNodeByIndex(size - 1); + lastNode.next = subNode; + } + size++; + } + + public Object removeFirst() { + return this.remove(0); + } + + public Object removeLast() { + return this.remove(size - 1); + } + + private Node findNodeByIndex(int index) { + Node lastNode = head; + for (int i = 0; i < index; i++) { + lastNode = lastNode.next; + } + return lastNode; + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + private class LinkedListIterator implements Iterator { + + private int cursor = 0; + private Node cursorNode = head; + + @Override + public boolean hasNext() { + return size != cursor; + } + + @Override + public Object next() { + Object obj = cursorNode.data; + cursorNode = cursorNode.next; + cursor++; + return obj; + } + + } +} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/List.java b/group03/345943980/2017Learning/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group03/345943980/2017Learning/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/Queue.java b/group03/345943980/2017Learning/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..e2b118af64 --- /dev/null +++ b/group03/345943980/2017Learning/src/com/coding/basic/Queue.java @@ -0,0 +1,42 @@ +package com.coding.basic; + +/** + * 队列(堆):特点,先进先出 + * + * @author Administrator + * + */ +public class Queue { + + private LinkedList linkedList = new LinkedList(); + private int size = 0; + + /** + * 入队列 + * + * @param o + */ + public void enQueue(Object obj) { + linkedList.add(obj); + size++; + } + + /** + * 出队列 + * + * @return + */ + public Object deQueue() { + Object obj = linkedList.remove(0); + size--; + return obj; + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group03/345943980/2017Learning/src/com/coding/basic/Stack.java b/group03/345943980/2017Learning/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..0f764120b0 --- /dev/null +++ b/group03/345943980/2017Learning/src/com/coding/basic/Stack.java @@ -0,0 +1,51 @@ +package com.coding.basic; + +/** + * 栈(堆栈),特点先进后出的特点 + * + * @author Administrator + * + */ +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size = 0; + + /** + * 在堆栈顶部中添加一个元素 + * + * @param o + */ + public void push(Object o) { + elementData.add(o); + size++; + } + + /** + * 在堆栈顶部移去一个元素 + * + * @return + */ + public Object pop() { + Object o = elementData.remove(size - 1); + size--; + return o; + + } + + /** + * 总是返回栈顶的元素 + * + * @return + */ + public Object peek() { + return elementData.get(size - 1); + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group03/345943980/2017Learning/src/com/coding/test/ArrayListTest.java b/group03/345943980/2017Learning/src/com/coding/test/ArrayListTest.java new file mode 100644 index 0000000000..ab373b51e7 --- /dev/null +++ b/group03/345943980/2017Learning/src/com/coding/test/ArrayListTest.java @@ -0,0 +1,48 @@ +package com.coding.test; + +import org.junit.Test; + +import com.coding.basic.ArrayList; + +public class ArrayListTest { + + @Test + public void test01(){ + ArrayList arrayList = new ArrayList(); + arrayList.add(1); + arrayList.add(100); + arrayList.add(0, 1000); + System.out.println(arrayList.size()); + for(int i =0;i array = new java.util.ArrayList(); + array.add(1); + array.add(1, 20); + System.out.println(array.size()); + for(Object o:array){ + System.out.println(o.toString()); + } + //System.out.println(array.get(100)); + } + + +} diff --git a/group03/345943980/2017Learning/src/com/coding/test/BinaryTreeTest.java b/group03/345943980/2017Learning/src/com/coding/test/BinaryTreeTest.java new file mode 100644 index 0000000000..e11454e468 --- /dev/null +++ b/group03/345943980/2017Learning/src/com/coding/test/BinaryTreeTest.java @@ -0,0 +1,25 @@ +package com.coding.test; + +import org.junit.Test; + +import com.coding.basic.BinaryTree; +import com.coding.basic.LinkedList; + +public class BinaryTreeTest { + + @Test + public void test01(){ + BinaryTree binaryTree = new BinaryTree(); + binaryTree.insert(5); + binaryTree.insert(2); + binaryTree.insert(7); + binaryTree.insert(1); + binaryTree.insert(4); + binaryTree.insert(6); + binaryTree.insert(8); + LinkedList linkedList=binaryTree.inOrder(); + for(int i=0;i + 4.0.0 + + org.lemon.cm + lite-struts-0226 + 0.0.1-SNAPSHOT + jar + + lite-struts-0226 + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 4.10 + test + + + + commons-digester + commons-digester + 2.1 + + + + dom4j + dom4j + 1.6.1 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.7 + 1.7 + + + + + diff --git a/group03/345943980/lite-struts-0226/src/main/java/com/coderising/array/ArrayUtil.java b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..a0760773e0 --- /dev/null +++ b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/array/ArrayUtil.java @@ -0,0 +1,258 @@ +package com.coderising.array; + +import java.util.Arrays; + +public class ArrayUtil { + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int[] target = new int[origin.length]; + for (int i = origin.length - 1, j = 0; i >= 0; i--, j++) { + target[j] = origin[i]; + } + System.out.println(Arrays.toString(target)); + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int[] newArr = new int[5]; // 数组初始化,默认给10个位置 + int size = 0; + + for (int i = 0; i < oldArray.length; i++) { + if (size >= newArr.length) { // 大于初始长度,对新数组进行扩容 + newArr = this.grow(newArr, 5); + } + if (oldArray[i] != 0) { + newArr[size] = oldArray[i]; + size++; + } + } + // 对结果数组进行排0处理 + int[] newArrary = new int[size]; + for (int i = 0, j = 0; i < newArr.length; i++) { + if (newArr[i] != 0) { + newArrary[j] = newArr[i]; + j++; + } + } + return newArrary; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 + * 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int[] array3 = new int[array1.length + array2.length]; + System.arraycopy(array1, 0, array3, 0, array1.length); + System.arraycopy(array2, 0, array3, array1.length, array2.length); + int temp = 0; + // 冒泡排序 + for (int i = array3.length - 1; i >= 0; i--) { + for (int j = 0; j < i; j++) { + if (array3[j] > array3[j + 1]) { + temp = array3[j + 1]; + array3[j + 1] = array3[j]; + array3[j] = temp; + } + } + } + // Arrays.sort(array3); + // System.out.println(Arrays.toString(array3)); + // 消除重复 + for (int i = array3.length - 1; i >= 0; i--) { + for (int j = 0; j < i; j++) { + if (array3[j] == array3[j + 1]) { + array3[j + 1] = 0; + } + } + } + // 去掉0值 + return removeZero(array3); + } + + /** + * 方法实现二 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] mergeMethod(int[] array1, int[] array2) { + int[] array3 = new int[array1.length + array2.length]; + System.arraycopy(array1, 0, array3, 0, array1.length); + System.arraycopy(array2, 0, array3, array1.length, array2.length); + int counts = 0; // 找出重复元素个数 + for (int i = 0; i < array3.length - 1; i++) { + for (int j = i + 1; j < array3.length; j++) { + if (array3[i] == array3[j]) { + counts++; + break; + } + } + } + // 消除重复 + int[] newArr = new int[array3.length - counts]; + int index = 0; + for (int i = 0; i < array3.length; i++) { + boolean flag = false; + for (int j = 0; j < newArr.length; j++) { + if (array3[i] == newArr[j]) { + flag = true; + break; + } + } + if (!flag) { + newArr[index++] = array3[i]; + } + } + // 排序 + Arrays.sort(newArr); + return newArr; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = + * 3,则返回的新数组为 [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + int a = 1, b = 1, c = 0, size = 2; + int[] array = new int[0]; + if (max <= 1) + return array; + array = new int[] { a, b }; + while (true) { + c = a + b; + a = b; + b = c; + if (c > max) + break; + // 对数组进行扩容 + array = ensureCapacity(size + 1, array); + array[size] = c; + size++; + } + return removeZero(array); + } + + private int[] ensureCapacity(int minCapacity, int[] array) { + if (minCapacity > array.length) { + int newCapacity = Math.max(minCapacity, array.length * 2); + int[] newDataArray = new int[newCapacity]; + System.arraycopy(array, 0, newDataArray, 0, array.length); + return newDataArray; + } + return array; + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int size = 0; + int[] array = new int[0]; + if (max < 2) { + return array; + } + for (int i = 2; i < max; i++) { + for (int j = 2; j <= i; j++) { + if (i % j == 0 && i != j) { + break; + } + if (i % j == 0 && i == j) { + array = this.ensureCapacity(size + 1, array); + array[size] = i; + size++; + } + } + } + return this.removeZero(array); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int size = 0; + int[] array = new int[0]; + if (max < 1) { + return array; + } + for (int i = 1; i <= max; i++) { + int sum = 0; + for (int j = 1; j < i / 2 + 1; j++) { + if (i % j == 0) { + sum += j; + } + } + if (i == sum) { + array = this.ensureCapacity(size + 1, array); + array[size] = i; + size++; + } + } + return this.removeZero(array); + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + StringBuilder sb = new StringBuilder(); + if (array == null || array.length == 0) { + return null; + } + for (int i = 0; i < array.length; i++) { + if (i == array.length - 1) { + sb.append(array[i]); + } else { + sb.append(array[i]).append(seperator); + } + } + return sb.toString(); + } + +} diff --git a/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/LoginAction.java b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..fe9c3b87aa --- /dev/null +++ b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,42 @@ +package com.coderising.litestruts; + +public class LoginAction { + + private String name; + private String password; + private String mssage; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMssage() { + return mssage; + } + + public void setMssage(String mssage) { + this.mssage = mssage; + } + + public String execute() { + if (this.getName().equals("test") && this.getPassword().equals("1234")) { + this.setMssage("login successful"); + return "success"; + } else { + this.setMssage("login failed,please check your user/pwd"); + return "fail"; + } + } +} diff --git a/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/Struts.java b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..579d64bf3a --- /dev/null +++ b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/Struts.java @@ -0,0 +1,139 @@ +package com.coderising.litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + + + @SuppressWarnings("unchecked") + public static View runAction(String actionName, Map parameters) { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + * ("name"="test" , "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + * 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, 放到View对象的jsp字段中。 + */ + View view = new View(); + Map map = new HashMap(); + SAXReader reader = new SAXReader(); + try { + Object obj = null; + Document document = reader.read(Struts.class.getResourceAsStream("/struts.xml")); + Element root = document.getRootElement(); + List elements = root.elements(); + Class clz = null; + for (Element element : elements) { + if (element.attributeValue("name").trim().equalsIgnoreCase(actionName)) { + String classStr = element.attributeValue("class"); + clz = Class.forName(classStr); + obj = clz.newInstance(); + for (Map.Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + String setMethod = "set" + key.substring(0, 1).toUpperCase() + + key.substring(1); + Method method = clz.getDeclaredMethod(setMethod, String.class); + method.invoke(obj, entry.getValue()); + } + List listElement = element.elements("result"); + for (Element subElement : listElement) { + map.put(subElement.attribute("name").getText(), subElement.getTextTrim()); + } + } + } + Method execMethod = clz.getDeclaredMethod("execute"); + String result = execMethod.invoke(obj).toString(); + Method msgMethod = clz.getDeclaredMethod("getMssage"); + String message = msgMethod.invoke(obj).toString(); + Map msgs = new HashMap(); + msgs.put("message", message); + view.setJsp(map.get(result)); + view.setParameters(msgs); + } catch (Exception e) { + e.printStackTrace(); + } + + return view; + } + + public static void main(String[] args) { + // Digester digester = new Digester(); + // // 指定它不要用DTD验证XML文档的合法性——这是因为我们没有为XML文档定义DTD + // digester.setValidating(false); + // digester.addObjectCreate("struts", Struts.class); + // digester.addObjectCreate("struts/action", LoginAction.class); + // digester.addBeanPropertySetter("struts/action/name"); + // //digester.addBeanPropertySetter("struts/action/class"); + // digester.addObjectCreate("struts/action/result", Result.class); + // digester.addBeanPropertySetter("struts/action/result/name"); + // digester.addBeanPropertySetter("struts/action/result/value"); + // Struts struts = null; + // try { + // struts = (Struts)digester.parse(Struts.class.getResourceAsStream("/struts.xml")); + // System.out.println(struts.actions.get(0).getName()); + // // /System.out.println(struts.actions.get(0).getActionClass()); + // } catch (IOException e) { + // e.printStackTrace(); + // } catch (SAXException e) { + // e.printStackTrace(); + // } + SAXReader reader = new SAXReader(); + try { + Document document = reader.read(Struts.class.getResourceAsStream("/struts.xml")); + Element root = document.getRootElement(); + // 获取某个节点的子节点 + Element element = root.element("action"); + String classStr = element.attributeValue("class"); + Class clz = Class.forName(classStr); + Object obj = clz.newInstance(); + Method medName = clz.getDeclaredMethod("setName", String.class); + medName.invoke(obj, "test"); + Method medPwd = clz.getDeclaredMethod("setPassword", String.class); + medPwd.invoke(obj, "123456"); + + Method medGetName = clz.getDeclaredMethod("getName"); + String username = medGetName.invoke(obj).toString(); + Method medGetPwd = clz.getDeclaredMethod("getPassword"); + String password = medGetPwd.invoke(obj).toString(); + System.out.println(username + "\t" + password); + + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} diff --git a/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/View.java b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..bda55ebe42 --- /dev/null +++ b/group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/View.java @@ -0,0 +1,27 @@ +package com.coderising.litestruts; + +import java.util.Map; + +@SuppressWarnings("rawtypes") +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group03/345943980/lite-struts-0226/src/main/resources/struts.xml b/group03/345943980/lite-struts-0226/src/main/resources/struts.xml new file mode 100644 index 0000000000..a7cb57e188 --- /dev/null +++ b/group03/345943980/lite-struts-0226/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/ArrayUtilTest.java b/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/ArrayUtilTest.java new file mode 100644 index 0000000000..e296c6c47a --- /dev/null +++ b/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/ArrayUtilTest.java @@ -0,0 +1,79 @@ +package com.coderising.litestruts; + +import static org.junit.Assert.*; + +import java.util.Arrays; + +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import com.coderising.array.ArrayUtil; + +public class ArrayUtilTest { + + private ArrayUtil arrayUtil = null; + + @Before + public void init() { + arrayUtil = new ArrayUtil(); + } + + @Test + public void testReverseArray() { + int[] origin = { 7, 9, 30, 3 }; + arrayUtil.reverseArray(origin); + origin = new int[] { 7, 9, 30, 3, 4 }; + arrayUtil.reverseArray(origin); + } + + @Test + public void testRemoveZero() { + int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 }; + assertArrayEquals(new int[] { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }, + arrayUtil.removeZero(oldArr)); + } + + @Test + public void testMerge() { + int[] array1 = { 3, 5, 7, 8 }; + int[] array2 = { 4, 5, 6, 7 }; + int[] array3 = { 3, 4, 5, 6, 7, 8 }; + assertArrayEquals(array3, arrayUtil.merge(array1, array2)); + assertArrayEquals(array3, arrayUtil.mergeMethod(array1, array2)); + } + + @Test + public void testGrow() { + int[] oldArray = { 2, 3, 6 }; + int[] newArray = arrayUtil.grow(oldArray, 3); + assertArrayEquals(new int[] { 2, 3, 6, 0, 0, 0 }, newArray); + } + + @Test + public void testFibonacci() { + assertArrayEquals(new int[] { 1, 1, 2, 3, 5, 8, 13 }, arrayUtil.fibonacci(15)); + assertArrayEquals(new int[0], arrayUtil.fibonacci(1)); + } + + @Test + public void testGetPrimes() { + System.out.println(Arrays.toString(arrayUtil.getPrimes(23))); + } + + @Test + public void testGetPerfectNumbers() { + assertArrayEquals(new int[]{6}, arrayUtil.getPerfectNumbers(6)); + } + + @Test + public void testJoin() { + int[] array = { 3, 8, 9 }; + Assert.assertEquals("3-8-9", arrayUtil.join(array, "-")); + } + @Test + public void main(){ + System.out.println(3 / 2 + 1); + } +} diff --git a/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/StrutsTest.java b/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..aa848f4e97 --- /dev/null +++ b/group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,38 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); // 密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", + view.getParameters().get("message")); + } +} diff --git a/group03/510782645/.gitignore b/group03/510782645/.gitignore new file mode 100644 index 0000000000..497b26f4df --- /dev/null +++ b/group03/510782645/.gitignore @@ -0,0 +1,46 @@ +# Class files +*.class + +# Package Files +*.jar +*.war +*.ear + +# Virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# Ignore web-site project +*web-site/ + +# Temporary files +.DS_STORE +*.log + +# Maven related +/*/target/ +target + +# Netbeans related +nb-configuration.xml +nbactions.xml +nbproject + +# Eclipse related +*.classpath +*.project +.settings + +# IntelliJ related +.idea +*.iml +*.ipr +*.iws + +# Jrebel related +rebel.xml +rebel-remote.xml + +# design model +*.eab + +.idea/workspace.xml diff --git a/group03/510782645/src/com/coding/basic/ArrayList.java b/group03/510782645/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..a8a9f990d4 --- /dev/null +++ b/group03/510782645/src/com/coding/basic/ArrayList.java @@ -0,0 +1,152 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.ConcurrentModificationException; + +public class ArrayList implements List { + /** + * 当数组进行add/remove时, 对modCount进行++ + */ + protected transient int modCount = 0; + /** + * 数组的大小 + */ + private int size = 0; + + /** + * 数组,用来存放ArrayList的内容。 + */ + private Object[] elementData; + + public ArrayList() { + this(10); + } + + public ArrayList(int intialSize) { + elementData = new Object[intialSize]; + } + + public void add(Object o) { + modCount++; + // 检测是否要扩容,当添加的元素大于数组的长度后, 扩容 + increment(size + 1); + elementData[size++] = o; + } + + public void add(int index, Object o) { + modCount++; + increment(size + 1); + /** + * @param src + * 源数组 + * @param srcPos + * 源数组要复制的起始位置 + * @param dest + * 目的数组 + * @param destPos + * 目的数组放置的起始位置 + * @param length + * 复制的长度 从index位置开始copy, + */ + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + } + + /** + * 验证是否要扩容。 + * + * @param capacity + */ + private void increment(int capacity) { + if (capacity - elementData.length > 0) { + grow(capacity); + } + } + + /** + * 扩容,扩容规则为:oldCapacity + oldCapacity/2 + * + * @param capacity + */ + private void grow(int capacity) { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + oldCapacity / 2; + elementData = Arrays.copyOf(elementData, newCapacity); + } + + public Object get(int index) throws Exception { + checkSize(index); + return elementData[index]; + } + + public Object remove(int index) throws Exception { + modCount++; + checkSize(index); + Object oldValue = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + //回收多出来的内存。 + elementData[size--] = null; + return oldValue; + } + + /** + * 验证给定的数组下标是否小于数组的长度。 + * + * @param index + * @return + */ + private void checkSize(int index) throws Exception { + if (index > size) { + // 数组下标越界异常。 + throw new IndexOutOfBoundsException(); + } + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new Itr(); + } + + private class Itr implements Iterator { + int cursor;//记录下一个元素的索引 + int lastReturn = -1;//记录最后一个元素的索引 + int expectCount = modCount; + + @Override + public boolean hasNext() { + return (cursor != size); + } + + @Override + public Object next() { + checkForComodification(); + int i = cursor; + Object[] elementData = ArrayList.this.elementData; + cursor = i+ 1; + return elementData[lastReturn = i]; + } + + /** + * 核心方法, 这里remove可以避免fail-fast快速失败原则。 + * @throws Exception + */ + public void remove() throws Exception { + checkForComodification(); + ArrayList.this.remove(lastReturn); + cursor = lastReturn; + lastReturn = -1; + expectCount = modCount; + } + + /** + * 验证fail-fast规则。 + */ + final void checkForComodification() { + if (modCount != expectCount) + throw new ConcurrentModificationException(); + } + } +} diff --git a/group03/510782645/src/com/coding/basic/BinaryTreeNode.java b/group03/510782645/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..1e279dd56a --- /dev/null +++ b/group03/510782645/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,83 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + static class Node { + Integer data; + Node parent; + Node left; + Node right; + + public Node(Integer data, Node parent, Node left, Node right) { + this.data = data; + this.parent = parent; + this.left = left; + this.right = right; + } + + public String toString(){ + return "[data=" + data + "]"; + } + + public boolean equals(Object obj){ + if(this == obj){ + return true; + } + + if(obj.getClass() == Node.class){ + Node target = (Node) obj; + return data.equals(target.data) && left == target.left + && right == target.right && parent == target.parent; + } + + return false; + } + } + private Node root; + + BinaryTreeNode() { + root = null; + } + + BinaryTreeNode(Integer data) { + root = new Node(data, null, null, null); + } + + /** + * 暂且使用Intenger作为节点数据。 + * @param o + */ + public void insert(Integer o) { + if (root == null) { + root = new Node(o, null, null, null); + } else { + Node current = root; + Node parent = null; + int cmp; + + //搜索合适的叶子节点,以该叶子节点为父节点添加新节点 + do { + parent = current; + cmp = o.compareTo(current.data); + + //如果新节点的值大于当前节点的值 + if (cmp > 0) { + //以当前节点的右子节点作为当前节点 + current = current.right; + } else { + current = current.left; + } + } while (current != null); + + //创建新节点 + Node newNode = new Node(o, parent, null, null); + + //如果新节点的值大于父节点的值 + if (cmp > 0) { + parent.right = newNode; + } else { + parent.left = newNode; + } + } + } +} diff --git a/group03/510782645/src/com/coding/basic/Iterator.java b/group03/510782645/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group03/510782645/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group03/510782645/src/com/coding/basic/LinkedList.java b/group03/510782645/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..2019f5c703 --- /dev/null +++ b/group03/510782645/src/com/coding/basic/LinkedList.java @@ -0,0 +1,202 @@ +package com.coding.basic; + +public class LinkedList implements List { + //链表的长度 + int size = 0; + private Node first; + private Node last; + + public void add(Object o){ + linkLast(o); + size++; + } + + /** + * 按照索引添加 + * @param index + * @param o + */ + public void add(int index , Object o){ + if (index == size) + linkLast(o); + else + linkBefore(o, node(index)); + } + + /** + * 向链表的最后添加元素 + * @param o + */ + private void linkLast(Object o) { + final Node l = last; + final Node newNode = new Node(o, l, null); + last = newNode; + if (l == null) + //如果只有一个元素, 那么设置链表的first为newNode + first = newNode; + else + l.next = newNode; + size++; + } + + /** + * 向链表指定位置添加元素 + * @param o + * @param node + */ + private void linkBefore(Object o, Node node) { + final Node pred = node.prev; + final Node newNode = new Node(o, pred, node); + node.prev = newNode; + if (pred == null) + first = newNode; + else + pred.next = newNode; + size++; + } + + /** + * 将元素添加到起始位置。 + * @param o + */ + private void linkFirst(Object o) { + final Node f = first; + final Node newNode = new Node(o, null, f); + first = newNode; + if (f == null) + last = newNode; + else + f.prev = newNode; + size++; + } + + /** + * 这里查找index节点时, 通过index与size/2的距离来判断是从前往后找还是从后往前找。 + * @param index + * @return + */ + Node node(int index) { + if (index < (size >> 1)) { + Node x = first; + for (int i = 0; i < index; i++) + x = x.next; + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) + x = x.prev; + return x; + } + } + + /** + * 直接调用node方法即可。 + * @param index + * @return + */ + public Object get(int index){ + return node(index); + } + + /** + * 根据下标删除 + * @param index + * @return + */ + public Object remove(int index){ + Node node = node(index); + return remove(node); + } + + /** + * 根据节点的data值来remove + * @param o + * @return + */ + public Object remove(Object o) { + if (o == null) { + for (Node x = first; x != null; x = x.next) { + if (x.data == null) { + return remove(x); + } + } + } else { + for (Node x = first; x != null; x = x.next) { + if (o.equals(x.data)) { + return remove(x); + } + } + } + return null; + } + + private Object remove(Node node){ + final Object obj = node.data; + final Node next = node.next; + final Node prev = node.prev; + //判断临界的地方,index为第一个元素, index为第二个元素 + if (node == first) { + first = next; + } else if (node == last) { + last = prev; + } else { + prev.next = next; + next.prev = prev; + + node.next = null; + node.prev = null; + } + + node.data = null; + size--; + return obj; + } + + public int size(){ + return -size; + } + + public void addFirst(Object o){ + linkFirst(o); + } + public void addLast(Object o){ + linkLast(o); + } + public Object removeFirst(){ + return remove(first); + } + + /** + * 获取但不删除栈顶元素,失败则抛出异常 + * @return + */ + public Object peekFirst() { + final Node f = first; + return (f == null) ? null : f.data; + } + + public Object removeLast(){ + return remove(last); + } + public Iterator iterator(){ + return null; + } + + /** + * Node内部实现类 + */ + private static class Node{ + Object data; + Node prev; + Node next; + + /** + * 使用内部类来实现链表的每一个节点,每个节点有一个指向下一个元素的next,指向上一个元素的prev,以及自身的data + */ + public Node(Object data, Node prev, Node next) { + this.data = data; + this.next = next; + this.prev = prev; + } + } +} diff --git a/group03/510782645/src/com/coding/basic/List.java b/group03/510782645/src/com/coding/basic/List.java new file mode 100644 index 0000000000..6aa2551499 --- /dev/null +++ b/group03/510782645/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index) throws Exception; + public Object remove(int index) throws Exception; + public int size(); +} diff --git a/group03/510782645/src/com/coding/basic/Queue.java b/group03/510782645/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..4ea6bf2fb3 --- /dev/null +++ b/group03/510782645/src/com/coding/basic/Queue.java @@ -0,0 +1,100 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +/** + * Queue的常用方法: + * add(Object o):向队尾插入元素,失败则抛出异常 + * offer(Object o):向队尾插入元素,失败则返回false + * remove():获取并删除队首元素,失败则抛出异常 + * poll():获取并删除队首元素,失败则返回null + * element():获取但不删除队首元素,失败则抛出异常 + * peek():获取但不删除队首元素,失败则返回null + */ +public class Queue { + /** + * Queue中存储的元素 + */ + private Object[] data; + /** + * head指向首端第一个有效元素 + */ + private int head; + /** + * tail指向尾端第一个可以插入元素的空位。 + */ + private int tail; + + /** + * 进队列 + */ + public void enQueue(Object o) { + addLast(o); + } + + /** + * 向队列的尾部添加元素 + */ + public void addLast(Object o) { + if (o == null) + throw new NullPointerException(); + data[tail] = o; + //这里可以避免数组是否越界。 + if ((tail = (tail + 1) & (data.length - 1)) == head) + doubleCapacity(); + } + + /** + * 检查是否要扩容。 + */ + private void doubleCapacity() { + assert head == tail; + int p = head; + int n = data.length; + int r = n - p; // head右边元素的个数 + int newCapacity = n << 1;//原空间的2倍 + if (newCapacity < 0) + throw new IllegalStateException("Sorry, deque too big"); + Object[] a = new Object[newCapacity]; + System.arraycopy(data, p, a, 0, r);//复制右半部分 + System.arraycopy(data, 0, a, r, p);//复制左半部分 + data = (Object[]) a; + head = 0; + tail = n; + } + + /** + * 出队列 + */ + public Object deQueue() { + return removeFirst(); + } + + /** + * 移除第一个元素 + */ + public Object removeFirst() { + Object x = pollFirst(); + if (x == null) + throw new NoSuchElementException(); + return x; + } + + public Object pollFirst() { + int h = head; + Object result = data[h]; // Element is null if deque empty + if (result == null) + return null; + data[h] = null; // Must null out slot + head = (h + 1) & (data.length - 1); + return result; + } + + public boolean isEmpty() { + return head == tail; + } + + public int size() { + return (tail - head) & (data.length - 1); + } +} diff --git a/group03/510782645/src/com/coding/basic/Stack.java b/group03/510782645/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..6c9384ab67 --- /dev/null +++ b/group03/510782645/src/com/coding/basic/Stack.java @@ -0,0 +1,39 @@ +package com.coding.basic; + +/** + * 堆栈是先进后出的结构。 + */ +public class Stack { + protected int elementCount; + private LinkedList elementData = new LinkedList(); + + /** + * 向栈顶插入元素,失败则抛出异常。同LikedList中的addFirst(); + * @param o + */ + public void push(Object o){ + elementData.addFirst(o); + } + + /** + * 获取并删除栈顶元素,失败则抛出异常。同LikedList中的removeFirst(); + * @return + */ + public Object pop(){ + return elementData.removeFirst(); + } + + /** + * 获取但不删除栈顶元素,失败则抛出异常. 同LinkedList中的peekFirst(); + * @return + */ + public Object peek(){ + return elementData.peekFirst(); + } + public boolean isEmpty(){ + return size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group03/569045298/pom.xml b/group03/569045298/pom.xml new file mode 100644 index 0000000000..c2a9dd870e --- /dev/null +++ b/group03/569045298/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + com.ztc + JavaLevelUp + war + 1.0-SNAPSHOT + JavaLevelUp Maven Webapp + http://maven.apache.org + + + + org.junit.jupiter + junit-jupiter-api + RELEASE + + + junit + junit + 4.12 + test + + + dom4j + dom4j + 1.6.1 + + + + + JavaLevelUp + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + diff --git a/group03/569045298/src/main/com/coderising/array/ArrayUtil.java b/group03/569045298/src/main/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..992e0652fb --- /dev/null +++ b/group03/569045298/src/main/com/coderising/array/ArrayUtil.java @@ -0,0 +1,175 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + */ + public int[] reverseArray(int[] origin) { + for (int i = 0; i < origin.length / 2; i++) { + int temp = origin[i]; + origin[i] = origin[origin.length - i - 1]; + origin[origin.length - i - 1] = temp; + } + return origin; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + */ + public int[] removeZero(int[] oldArray) { + int[] newArray = new int[oldArray.length]; + int index = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[index] = oldArray[i]; + index++; + } + } + int[] result = new int[index]; + System.arraycopy(newArray, 0, result, 0, index); + return result; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + */ + public int[] merge(int[] array1, int[] array2) { + Set set = new TreeSet<>(); + for (int i = 0; i < array1.length; i++) { + set.add(array1[i]); + } + for (int i = 0; i < array2.length; i++) { + set.add(array2[i]); + } + return set2Array(set); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + */ + public int[] fibonacci(int max) { + List list = new ArrayList<>(); + for (int i = 1; i < max; i++) { + int f = fibonacci2(i); + if (f >= max) { + break; + } else { + list.add(f); + } + } + return list2Array(list); + } + + public int fibonacci2(int n) { + if (n == 0) { + return 0; + } else if (n == 1) { + return 1; + } + return fibonacci2(n - 1) + fibonacci2(n - 2); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + */ + public int[] getPrimes(int max) { + List list = new ArrayList<>(); + for (int i = 2; i < max; i++) { + if (isPrime(i)) { + list.add(i); + } + } + return list2Array(list); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + */ + public int[] getPerfectNumbers(int max) { + List list = new ArrayList<>(); + for (int i = 1; i <= max; i++) { + int temp = 0; + for (int n = 1; n < i / 2 + 1; n++) { + if (i % n == 0) { + temp += n; + } + } + if (temp == i) { + list.add(i); + } + } + return list2Array(list); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + */ + public String join(int[] array, String seperator) { + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + if (i != 0) { + stringBuilder.append(seperator); + } + stringBuilder.append(array[i]); + } + return stringBuilder.toString(); + } + + private int[] list2Array(List list) { + int[] result = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + result[i] = list.get(i); + } + return result; + } + + private int[] set2Array(Set set) { + int[] result = new int[set.size()]; + Iterator iterator = set.iterator(); + int index = 0; + while (iterator.hasNext()) { + result[index++] = iterator.next(); + } + return result; + } + + private boolean isPrime(int num) { + for (int i = 2; i < num; i++) { + if (num % i == 0) { + return false; + } + } + return true; + } + +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/LoginAction.java b/group03/569045298/src/main/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..3c3de8ba91 --- /dev/null +++ b/group03/569045298/src/main/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,47 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + */ +public class LoginAction { + + private String name; + + private String password; + + private String message; + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/LogoutAction.java b/group03/569045298/src/main/com/coderising/litestruts/LogoutAction.java new file mode 100644 index 0000000000..3cee1f3824 --- /dev/null +++ b/group03/569045298/src/main/com/coderising/litestruts/LogoutAction.java @@ -0,0 +1,11 @@ +package com.coderising.litestruts; + +/** + * Created by zt on 2017/3/1. + */ +public class LogoutAction { + + public String execute() { + return "success"; + } +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/Struts.java b/group03/569045298/src/main/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..7ec84c9a2d --- /dev/null +++ b/group03/569045298/src/main/com/coderising/litestruts/Struts.java @@ -0,0 +1,156 @@ +package com.coderising.litestruts; + +import com.coderising.litestruts.StrutsBean.Action; +import com.coderising.litestruts.StrutsBean.Result; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * 模拟struts执行 + * 读取类似struts.xml文件,根据xml的定义创建相关的Action类来执行 + */ +public class Struts { + + private static final String FILE_PATH = "src/main/com/coderising/litestruts/struts.xml"; + + public View runAction(String actionName, Map parameters) { + // 视图 + View view = new View(); + // 读取配置文件struts.xml + Map actions = this.xmlToList(); + if (null == actions || actions.size() == 0) { + return null; + } + try { + // 根据actionName找到相对应的class + Action action = actions.get(actionName); + Class clazz = Class.forName(action.getClassName()); + // 通过反射实例化 + Object newInstance = clazz.newInstance(); + // 获得所有方法 + Map methodMap = new HashMap<>(); + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + methodMap.put(method.getName(), method); + } + // 根据parameters中的数据,调用对象的setter方法 + for (Map.Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + Method setterMethod = methodMap.get(settterMethodName(key)); + setterMethod.invoke(newInstance, value); + } + // 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method executeMethod = clazz.getMethod("execute"); + Object object = executeMethod.invoke(newInstance); + // 通过反射找到对象的所有getter方法 + Map map = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + if (fields != null && fields.length > 0) { + // 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + for (int i = 0; i < fields.length; i++) { + Field field = fields[i]; + String fieldName = field.getName(); + Method getterMethod = methodMap.get(gettterMethodName(fieldName)); + Object value = getterMethod.invoke(newInstance); + map.put(fieldName, value); + } + } + // 放到View对象的parameters中 + view.setParameters(map); + // 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp,放到View对象的jsp字段中 + List resultList = action.getResult(); + for (Result result : resultList) { + if (result.getName().equals(object)) { + view.setJsp(result.getValue()); + } + } + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } + return view; + } + + private Map xmlToList() { + Map map = new HashMap<>(); + SAXReader saxReader = new SAXReader(); + Document document; + try { + document = saxReader.read(new File(FILE_PATH)); + Element rootElement = document.getRootElement(); + Iterator iterator = rootElement.elementIterator("action"); + while (iterator.hasNext()) { + Action action = new Action(); + List results = new ArrayList<>(); + action.setResult(results); + Element element = iterator.next(); + List attributes = element.attributes(); + for (Attribute attribute : attributes) { + String attributeName = attribute.getName(); + if (attributeName.equals("name")) { + action.setName(attribute.getStringValue()); + } else if (attributeName.equals("class")) { + action.setClassName(attribute.getStringValue()); + } + } + Iterator iterator1 = element.elementIterator(); + while (iterator1.hasNext()) { + Result result = new Result(); + Element element1 = iterator1.next(); + List attributes1 = element1.attributes(); + for (Attribute attribute : attributes1) { + String attributeName = attribute.getName(); + if (attributeName.equals("name")) { + result.setName(attribute.getStringValue()); + } + } + result.setValue(element1.getStringValue()); + results.add(result); + } + map.put(action.getName(), action); + } + } catch (DocumentException e) { + e.printStackTrace(); + } + return map; + } + + private String gettterMethodName(String fieldName) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("get"); + stringBuilder.append(fieldName.substring(0, 1).toUpperCase()); + stringBuilder.append(fieldName.substring(1)); + return stringBuilder.toString(); + } + + private String settterMethodName(String fieldName) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("set"); + stringBuilder.append(fieldName.substring(0, 1).toUpperCase()); + stringBuilder.append(fieldName.substring(1)); + return stringBuilder.toString(); + } + +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Action.java b/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Action.java new file mode 100644 index 0000000000..1f7e5eea05 --- /dev/null +++ b/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Action.java @@ -0,0 +1,40 @@ +package com.coderising.litestruts.StrutsBean; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by zt on 2017/3/1. + */ +public class Action implements Serializable { + + private String name; + + private String className; + + private List result; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public List getResult() { + return result; + } + + public void setResult(List result) { + this.result = result; + } +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Result.java b/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Result.java new file mode 100644 index 0000000000..ef4c73b2bd --- /dev/null +++ b/group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Result.java @@ -0,0 +1,29 @@ +package com.coderising.litestruts.StrutsBean; + +import java.io.Serializable; + +/** + * Created by zt on 2017/3/1. + */ +public class Result implements Serializable { + + private String name; + + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/View.java b/group03/569045298/src/main/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..258285e4f3 --- /dev/null +++ b/group03/569045298/src/main/com/coderising/litestruts/View.java @@ -0,0 +1,28 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + + private String jsp; + + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/struts.xml b/group03/569045298/src/main/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..561e9693c1 --- /dev/null +++ b/group03/569045298/src/main/com/coderising/litestruts/struts.xml @@ -0,0 +1,14 @@ + + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + + /jsp/welcome.jsp + /jsp/error.jsp + + + \ No newline at end of file diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java b/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java new file mode 100644 index 0000000000..8d3de85e34 --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java @@ -0,0 +1,102 @@ +package com.coding.basic.datastructure; + + +/** + * Created by zt on 2017/2/19. + */ +public class ArrayList implements List { + + private static final int DEFAULT_CAPACITY = 10; + private int size = 0; + private Object[] elementData = null; + + public ArrayList() { + elementData = new Object[DEFAULT_CAPACITY]; + } + + public ArrayList(int initialCapacity) { + if (initialCapacity < 0) { + throw new RuntimeException("initialCapacity is smaller than zero"); + } + elementData = new Object[initialCapacity]; + } + + @Override + public void add(Object o) { + checkCapacity(size + 1); + elementData[size] = o; + size++; + } + + @Override + public void add(int index, Object o) { + checkCapacity(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + @Override + public Object get(int index) { + checkRange(index); + return elementData[index]; + } + + @Override + public Object remove(int index) { + Object removedObject = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, elementData.length - index - 1); + elementData[--size] = null; + return removedObject; + } + + @Override + public int size() { + return size; + } + + private void checkRange(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + } + + private void checkCapacity(int size) { + if (size > elementData.length) { + int newLength = elementData.length * 2; + Object[] newObject = new Object[newLength]; + System.arraycopy(elementData, 0, newObject, 0, elementData.length); + elementData = newObject; + } + } + + public Iterator iterator() { + return new ArrayListIterator(this); + } + + private class ArrayListIterator implements Iterator { + + private ArrayList arrayList = null; + private int position = 0; + + private ArrayListIterator(ArrayList arrayList) { + this.arrayList = arrayList; + } + + @Override + public boolean hasNext() { + return position < size(); + } + + @Override + public Object next() { + return get(position++); + } + + @Override + public Object remove() { + // TODO + return this.arrayList.remove(position--); + } + } +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/BinaryTreeNode.java b/group03/569045298/src/main/com/coding/basic/datastructure/BinaryTreeNode.java new file mode 100644 index 0000000000..b69f8932ed --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/BinaryTreeNode.java @@ -0,0 +1,41 @@ +package com.coding.basic.datastructure; + +/** + * Created by zt on 2017/2/19. + */ +public class BinaryTreeNode { + + private Object data; + + private BinaryTreeNode left; + + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object object) { + return null; + } +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/Iterator.java b/group03/569045298/src/main/com/coding/basic/datastructure/Iterator.java new file mode 100644 index 0000000000..8bf2ae7ed5 --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/Iterator.java @@ -0,0 +1,13 @@ +package com.coding.basic.datastructure; + +/** + * Created by zt on 2017/2/19. + */ +public interface Iterator { + + boolean hasNext(); + + Object next(); + + Object remove(); +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java b/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java new file mode 100644 index 0000000000..0f4ac3231b --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java @@ -0,0 +1,174 @@ +package com.coding.basic.datastructure; + +/** + * Created by zt on 2017/2/19. + */ +public class LinkedList implements List { + + private Node head; + + private Node tail; + + private int size = 0; + + public LinkedList() { + + } + + @Override + public void add(Object object) { + if (null == head) { + head = new Node(object); + head.next = null; + tail = head; + size++; + } else { + // 尾插法 + Node newNode = new Node(object); + tail.next = newNode; + tail = newNode; + tail.next = null; + size++; + } + } + + @Override + public void add(int index, Object object) { + checkRange(index); + if (null == head) { + add(object); + return; + } + if (index == 0) { + addFirst(object); + return; + } + Node pre = node(index - 1); + Node newNode = new Node(object); + newNode.next = pre.next; + pre.next = newNode; + size++; + } + + @Override + public Object get(int index) { + checkRange(index); + checkNodeNotNull(); + Node node = node(index); + return node.data; + } + + @Override + public Object remove(int index) { + checkRange(index); + checkNodeNotNull(); + Object object; + if (index == 0) { + object = removeFirst(); + return object; + } + Node pre = node(index - 1); + object = pre.next.data; + pre.next = pre.next.next; + size--; + return object; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object object) { + if (null == head) { + head = new Node(object); + head.next = null; + size++; + } else { + Node firstNode = new Node(object); + firstNode.next = head; + head = firstNode; + size++; + } + } + + public Object removeFirst() { + checkNodeNotNull(); + Object oldValue = head.data; + head = head.next; + size--; + return oldValue; + } + + public Object removeLast() { + checkNodeNotNull(); + Object oldValue; + if (size == 1) { + oldValue = head.data; + head = null; + return oldValue; + } + Node pre = node(size() - 2); + oldValue = pre.next.data; + pre.next = null; + size--; + return oldValue; + } + + private void checkRange(int index) { + if (index > size - 1 || index < 0) { + throw new IndexOutOfBoundsException(); + } + } + + private void checkNodeNotNull() { + if (null == head) { + throw new NullPointerException(); + } + } + + private Node node(int index) { + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node; + } + + private static class Node { + Node next; + private Object data; + + public Node() { + + } + + public Node(Object data) { + this.data = data; + } + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + public Node(Object data, Node next, Node prev) { + this.data = data; + this.next = next; + } + } + + /*@Override + public void add(Object object) { + if (null == head) { + head = new Node(object); + head.next = null; + } else { + // 头插法 + Node nextNode = new Node(object); + nextNode.next = head.next; + head.next = nextNode; + } + }*/ + +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/List.java b/group03/569045298/src/main/com/coding/basic/datastructure/List.java new file mode 100644 index 0000000000..4d9292f156 --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/List.java @@ -0,0 +1,17 @@ +package com.coding.basic.datastructure; + +/** + * Created by zt on 2017/2/19. + */ +public interface List { + + void add(Object o); + + void add(int index, Object o); + + Object get(int index); + + Object remove(int index); + + int size(); +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/Queue.java b/group03/569045298/src/main/com/coding/basic/datastructure/Queue.java new file mode 100644 index 0000000000..d3d4ebfbab --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/Queue.java @@ -0,0 +1,43 @@ +package com.coding.basic.datastructure; + + +/** + * Created by zt on 2017/2/19. + */ +public class Queue { + + private ArrayList elementData; + + private int size; + + public Queue() { + elementData = new ArrayList(); + } + + public void enQueue(Object object) { + elementData.add(object); + size++; + } + + public Object deQueue() { + checkIsEmpty(); + Object object = elementData.get(0); + elementData.remove(0); + size--; + return object; + } + + private void checkIsEmpty() { + if (elementData.size() == 0) { + throw new RuntimeException("queue is empty"); + } + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return size; + } +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/Stack.java b/group03/569045298/src/main/com/coding/basic/datastructure/Stack.java new file mode 100644 index 0000000000..c8dbc6b3af --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/Stack.java @@ -0,0 +1,47 @@ +package com.coding.basic.datastructure; + +/** + * Created by zt on 2017/2/19. + */ +public class Stack { + + private ArrayList elementData = null; + + private int size = 0; + + public Stack() { + elementData = new ArrayList(); + } + + public void push(Object object) { + elementData.add(object); + size++; + } + + public Object pop() { + checkIsEmpty(); + Object peekObject = peek(); + elementData.remove(size - 1); + size--; + return peekObject; + } + + public Object peek() { + checkIsEmpty(); + return elementData.get(size - 1); + } + + private void checkIsEmpty() { + if (isEmpty()) { + throw new RuntimeException("stack is empty"); + } + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return size; + } +} diff --git a/group03/569045298/src/test/coderising/array/ArrayUtilTest.java b/group03/569045298/src/test/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..52638781aa --- /dev/null +++ b/group03/569045298/src/test/coderising/array/ArrayUtilTest.java @@ -0,0 +1,86 @@ +package coderising.array; + +import com.coderising.array.ArrayUtil; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by zt on 2017/2/27. + */ +public class ArrayUtilTest { + + private ArrayUtil arrayUtil = null; + + @Before + public void setUp() { + arrayUtil = new ArrayUtil(); + } + + @Test + public void testReverseArray() { + int[] a = {7, 9, 30, 3}; + int[] expectedReversedA = {3, 30, 9, 7}; + Assert.assertArrayEquals(expectedReversedA, arrayUtil.reverseArray(a)); + int[] b = {7, 9, 30, 3, 4}; + int[] expectedReversedB = {4, 3, 30, 9, 7}; + Assert.assertArrayEquals(expectedReversedB, arrayUtil.reverseArray(b)); + } + + @Test + public void testRemoveZero() { + int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + int[] expected = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}; + Assert.assertArrayEquals(expected, arrayUtil.removeZero(oldArr)); + } + + @Test + public void testFibonacci() { + int max = 1; + int[] expected = {}; + Assert.assertArrayEquals(expected, arrayUtil.fibonacci(max)); + int max2 = 15; + int[] expected2 = {1, 1, 2, 3, 5, 8, 13}; + Assert.assertArrayEquals(expected2, arrayUtil.fibonacci(max2)); + } + + @Test + public void testGetPrimes() { + int[] expected = {2, 3, 5, 7, 11, 13, 17, 19}; + int max = 23; + Assert.assertArrayEquals(expected, arrayUtil.getPrimes(max)); + } + + @Test + public void testMerge() { + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + int[] expected = {3, 4, 5, 6, 7, 8}; + Assert.assertArrayEquals(expected, arrayUtil.merge(a1, a2)); + } + + @Test + public void testGetPerfectNumbers() { + int max = 6; + arrayUtil.getPerfectNumbers(max); + } + + @Test + public void testGrow() { + int[] oldArray = {2, 3, 6}; + int size = 3; + int[] newArray = arrayUtil.grow(oldArray, size); + int[] expected = {2, 3, 6, 0, 0, 0}; + Assert.assertArrayEquals(expected, newArray); + } + + @Test + public void testJoin() { + int[] array = {3, 8, 9}; + String seperator = "-"; + String joinedString = arrayUtil.join(array, seperator); + Assert.assertEquals("3-8-9", joinedString); + } + +} diff --git a/group03/569045298/src/test/coderising/litestruts/StrutsTest.java b/group03/569045298/src/test/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..61c25c3648 --- /dev/null +++ b/group03/569045298/src/test/coderising/litestruts/StrutsTest.java @@ -0,0 +1,46 @@ +package coderising.litestruts; + +import com.coderising.litestruts.Struts; +import com.coderising.litestruts.View; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + +public class StrutsTest { + + private Struts struts; + + @Before + public void setUp() { + struts = new Struts(); + } + + @Test + public void testLoginActionSuccess() { + String actionName = "login"; + Map params = new HashMap<>(); + params.put("name", "test"); + params.put("password", "1234"); + View view = struts.runAction(actionName, params); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap<>(); + params.put("name", "test"); + // 密码和预设的不一致 + params.put("password", "123456"); + View view = struts.runAction(actionName, params); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java b/group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java new file mode 100644 index 0000000000..9f90242595 --- /dev/null +++ b/group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java @@ -0,0 +1,66 @@ +package com.coding.basic.datastructure; + +import org.junit.Test; + +/** + * Created by zt on 2017/2/19. + */ +public class TestDataStructure { + + @Test + public void testLinedList() { + LinkedList list = new LinkedList(); + for (int i = 0; i < 5; i++) { + list.add(i); + } + list.add(0, -1); + list.remove(1); + list.removeLast(); + list.addFirst(999); + list.removeFirst(); + System.out.println("list size : " + list.size()); + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + java.util.LinkedList list1 = new java.util.LinkedList(); + list1.add(0, 2); + System.out.print(list1.get(0)); + } + + @Test + public void testStack() { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.pop(); + System.out.println(stack.size()); + Object obj = stack.peek(); + } + + @Test + public void testQueue() { + Queue queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + Object object = queue.deQueue(); + System.out.println("dqueue object : " + object); + System.out.println(queue.isEmpty()); + System.out.println(queue.size()); + } + + @Test + public void testArrayList() { + List arrayList = new ArrayList(); + for (int i = 0; i < 30; i++) { + arrayList.add(i); + } + arrayList.add(0, -2); + arrayList.add(1, -1); + System.out.println(arrayList.remove(1)); + System.out.println("ArrayList size : " + arrayList.size()); + for (int i = 0; i < arrayList.size(); i++) { + System.out.println(arrayList.get(i)); + } + } +} diff --git a/group03/58555264/pom.xml b/group03/58555264/pom.xml new file mode 100644 index 0000000000..ede0dc4997 --- /dev/null +++ b/group03/58555264/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.circle + 58555264 + 1.0-SNAPSHOT + jar + + 58555264 + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + + + junit + junit + 4.11 + + + diff --git a/group03/58555264/src/main/java/com/circle/algorithm/ArrayUtil.java b/group03/58555264/src/main/java/com/circle/algorithm/ArrayUtil.java new file mode 100644 index 0000000000..3bfae82039 --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/algorithm/ArrayUtil.java @@ -0,0 +1,151 @@ +package com.circle.algorithm; + +import java.util.Arrays; + +/** + * Created by keweiyang on 2017/3/1. + */ +public class ArrayUtil { + + /** + * 给定一个整形数组a,对该数组的值进行置换 + * 例如:a=[7,9,30,3],置换后为[3,30,9,7] + * 如果 a=[7,9,30,3,4],置换后为【4,3,30,9,7】 + * + * @param origin + */ + public void reverseArray(int[] origin) { + int first = 0; + int last = origin.length - 1; + + while (first < last) { + swap(origin, first, last); + first++; + last--; + } + + } + + private void swap(int[] origin, int first, int last) { + int temp = origin[last]; + origin[last] = origin[first]; + origin[first] = temp; + } + + + /** + * 现有如下一个数组:int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray) { + int size = 0; + for (int i : oldArray) { + if (i != 0) { + + size++; + } + } + int[] newArray = new int[size]; + + int currentIndex = 0; + for (int i : oldArray) { + if (i != 0) { + + newArray[currentIndex++] = i; + } + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21.。。。,给定一个最大值,返回小于该值的数列 + * 例如:max=15,则返回的数组应该为[1,1,2,3,5,8,13] + * max =1,则返回孔数组[] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + + int[] array = new int[max]; + int i = 1; + while (max > fun(i)) { + + array[i] = fun(i); + i++; + } + + + return removeZero(array); + } + + private int fun(int i) { + if (i == 1 || i == 2) { + return 1; + } + return fun(i - 1) + fun(i - 2); + } + + /** + * 返回小于给定最大值max的所有素数(质数)数组 + * 例如max=23,返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int[] arr = new int[max]; + int k = 0; + if (max < 2) { + return null; + } else { + for (int i = 2; i < max; i++) { + boolean flag = false; + int j = i-1; + while (j > 1) { + if (i % j == 0) { + flag = true; + break; + } + j--; + + } + if (!flag) { + arr[k++] = i; + } + + + } + } + /* for (int i : arr) { + System.out.println(i); + }*/ + return removeZero(arr); + } + + /** + * 用seperator把数组array给连接起来 + * 例如array=[3,8,9],seperator="-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + StringBuilder builder = new StringBuilder(); + + for (int i = 0; i < array.length; i++) { + builder.append(array[i]); + builder.append(seperator); + } + builder.deleteCharAt(builder.length() - 1); + return builder.toString(); + } + + +} diff --git a/group03/58555264/src/main/java/com/circle/algorithm/Reverse.java b/group03/58555264/src/main/java/com/circle/algorithm/Reverse.java new file mode 100644 index 0000000000..387fd863b5 --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/algorithm/Reverse.java @@ -0,0 +1,30 @@ +package com.circle.algorithm; + +/** + * Created by keweiyang on 2017/3/1. + * Problem: + Given an input string, reverse the string word by word. + For example, + Given s = “the sky is blue”, + return “blue is sky the”. + */ +public class Reverse { + + public void reverse(String string) { + + char[] cs = string.toCharArray(); + char[] newChar = new char[cs.length]; + for(int i=0;i> list = new ArrayList<>(); + + for (int i = 0; i < as.length; i++) { + for (int j = i + 1; j < as.length; j++) { + int k = as.length - 1; + + + while (target != as[i] + as[j] + as[k]) { + if (target < as[i] + as[j] + as[k]) { + k--; + if (j > k) { + break; + } + } else if (target > as[i] + as[j] + as[k]) { + break; + } + } + + if (target == as[i] + as[j] + as[k]) { + Integer[] arr = new Integer[3]; + arr[0] = as[i]; + arr[1] = as[j]; + arr[2] = as[k]; + list.add(Arrays.asList(arr)); + } + + + + } + } + + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + + } + } + + public static void main(String[] args) { + Sum sum = new Sum(); + int[] as = new int[]{-1, 0, 1, 2, -1, -4}; + Arrays.sort(as); + + sum.sum(as, 0); + + } +} diff --git a/group03/58555264/src/main/java/com/circle/collection/ArrayList.java b/group03/58555264/src/main/java/com/circle/collection/ArrayList.java new file mode 100644 index 0000000000..26ac64b863 --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/collection/ArrayList.java @@ -0,0 +1,168 @@ +package com.circle.collection; + +import java.util.Arrays; + +/** + * Created by keweiyang on 2017/2/25. + * 自定义ArrayList + */ +public class ArrayList implements List { + java.util.ArrayList list; + private Object[] elementData = null; + private int currentIndex = -1; + + public ArrayList(int length) { + if (length < 0) { + throw new RuntimeException("数组初始化大小必须大于0"); + } + elementData = new Object[length]; + } + + /** + * 在数组最后一位插入数据 + * + * @param object + */ + public void add(Object object) { + //1:先判断数组是否越界,由于其他函数也会用到,所以提取为一个函数 + ensureCapacity(); + //2:执行插入操作 + currentIndex++; + elementData[currentIndex] = object; + } + + + /** + * 给数组动态扩容 + */ + public void ensureCapacity() { + if (currentIndex + 2 > elementData.length) { +// Object[] newObjects = new Object[elementData.length * 2 + 2]; + elementData = Arrays.copyOf(elementData, elementData.length * 2 + 2); + //System.arraycopy(elementData, 0, newObjects, 0, newObjects.length); + } + } + + /** + * 在数组指定位置(任意位置)插入数据 + * + * @param index + * @param object + */ + public void add(int index, Object object) { + + rangeCheck(index); + ensureCapacity(); + //如果index>currentIndex,并且在数组范围内,则插入 + if (index > currentIndex && index <= elementData.length) { + currentIndex = index; + elementData[currentIndex] = object; + currentIndex++; + + } else if (index >= 0 && index < currentIndex) { + //如果0<=index< currentIndex,则将index和之后的数据往后面移动 + + for (int i = currentIndex; i >= index; i--) { + elementData[i + 1] = elementData[i]; + } + elementData[index] = object; + currentIndex++; + } else { + //如果index=currentIndex,则调用add(Object o) + add(object); + } + + + } + + public Object[] toArray() { + Object[] array = new Object[currentIndex]; + System.arraycopy(elementData, 0, array, 0, currentIndex); + return array; + } + + private void rangeCheck(int index) { + if (index < 0 || index > elementData.length - 1) { + throw new ArrayIndexOutOfBoundsException("输入索引位置越界"); + } + } + + /** + * 获取指定位置数据 + * + * @param index + * @return + */ + public Object get(int index) { + rangeCheck(index); + return elementData[index]; + } + + /** + * 删除指定位置数据 + * + * @param index + * @return 返回要删除的数据 + */ + public Object remove(int index) { + + rangeCheck(index); + Object temp = elementData[index]; + for (int i = index + 1; i <= currentIndex; i++) { + elementData[i - 1] = elementData[i]; + } + + elementData[currentIndex] = null; + currentIndex--; + return temp; + } + + /** + * 防止内存泄露 + */ + public void clear() { + for(int i=0;i<=currentIndex;i++) { + elementData[i] = null; + } + currentIndex = -1; + } + + /** + * 返回数组长度 + * + * @return + */ + public int size() { + return currentIndex + 1; + } + + /** + * 遍历ArrayList + * + * @return + */ + public Iterator iterator() { + + return new Iterator() { + + int pos = -1; + + public boolean hasNext() { + if (pos + 1 <= currentIndex) { + return true; + } + return false; + } + + public Object next() { + if (hasNext()) { + pos++; + return elementData[pos]; + } + return null; + } + }; + } + + +} diff --git a/group03/58555264/src/main/java/com/circle/collection/BinaryTree.java b/group03/58555264/src/main/java/com/circle/collection/BinaryTree.java new file mode 100644 index 0000000000..ccb05b965f --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/collection/BinaryTree.java @@ -0,0 +1,280 @@ +package com.circle.collection; + +/** + * Created by keweiyang on 2017/2/25. + * 自定义二叉树 + */ +public class BinaryTree { + + private Node root; + + /** + * 查找某个节点 + * + * @param key + * @return + */ + public Node get(int key) { + Node currentNode = root; + + if (currentNode == null) { + throw new RuntimeException("这棵二叉树为空二叉树"); + } else { + while (currentNode.getId()!= key) { + if (currentNode.getId() > key) { + currentNode = currentNode.getLeftChild(); + } else { + currentNode.getRightChild(); + } + + if (currentNode == null) { + return null; + } + } + } + + return currentNode; + } + + /** + * 插入一个节点 + * + * @param id + * @param data + */ + public void insert(int id, Object data) { + Node newNode = new Node(id, data); + //1:先找到插入位置 + Node parentNode = null; + Node currentNode = root; + if (root == null) { + root = newNode; + } else { + while (true) { + parentNode = currentNode; + if (currentNode.getId() > id) { + currentNode = currentNode.getLeftChild(); + if (currentNode == null) { + //如果没有左子节点,则插入 + parentNode.setLeftChild(newNode); + return; + } + } else { + currentNode = currentNode.getRightChild(); + if (currentNode == null) { + //如果没有右子节点,则插入 + parentNode.setRightChild(newNode); + return; + } + + } + } + } + } + + /** + * 删除节点 + * @param key + */ + public boolean delete(int key) { + //根据key找到对应的节点 + // 1、如果该节点不存在就抛出异常 + Node parentNode = null; + Node currentNode = root; + boolean isLeftNode = false; + if (currentNode == null) { + throw new RuntimeException("二叉树为空"); + }else{ + while (currentNode.getId() != key) { + parentNode = currentNode; + if (currentNode.getId() < key) { + currentNode = currentNode.getRightChild(); + isLeftNode = false; + }else{ + currentNode = currentNode.getLeftChild(); + isLeftNode = true; + } + + if (currentNode == null) { + return false; + } + } + } + + + //2、下面讨论该节点存在 + // 2.1如果该节点的左右子节点都不存在,则直接删除该节点 + if (currentNode.getRightChild() == null && currentNode.getLeftChild() == null) { + this.noChild(currentNode, parentNode, isLeftNode); + } + // 2.2如果该节点的只存在一个子节点 + //2.2.1 如果存在左节点 + if (currentNode.getRightChild() == null) { + this.oneLeftChild(currentNode,parentNode,isLeftNode); + } + //2.2.2 如果存在右节点 + if (currentNode.getLeftChild() == null) { + this.oneRightChild(currentNode, parentNode, isLeftNode); + } + //2.3 如果左右孩子都存在,则直接拿右孩子中最小的节点替换该节点 + if (currentNode.getLeftChild() != null && currentNode.getRightChild() != null) { + this.bothChild(currentNode, parentNode, isLeftNode); + } + return false; + + } + + private void bothChild(Node currentNode, Node parentNode, boolean flag) { + //找到中序后继节点 + if (flag) { + Node node = this.successor(currentNode); + node.setLeftChild(currentNode.getLeftChild()); + + parentNode.setLeftChild(node); + + + }else{ + Node node = this.successor(currentNode); + node.setRightChild(currentNode.getRightChild()); + + parentNode.setRightChild(node); + + } + } + + private Node successor(Node currentNode) { + //由于当前节点的左右子节点都存在,所以current一定存在 + Node parent = currentNode; + Node current = currentNode.getRightChild(); + + while (current != null) { + parent = current; + current = current.getLeftChild(); + } + + return parent; + + } + + private void oneRightChild(Node currentNode, Node parentNode, boolean flag) { + if (flag) { + parentNode.setRightChild(currentNode.getLeftChild()); + + }else{ + parentNode.setRightChild(currentNode.getRightChild()); + + } + } + + private void oneLeftChild(Node currentNode, Node parentNode, boolean flag) { + if (flag) { + parentNode.setLeftChild(currentNode.getLeftChild()); + + }else{ + parentNode.setLeftChild(currentNode.getRightChild()); + + } + } + + private void noChild(Node currentNode, Node parentNode, boolean flag) { + if (flag) { + parentNode.setLeftChild(null); + + }else{ + parentNode.setRightChild(null); + + } + } + + /** + * 前序 + * + * @param node + */ + public void preOrder(Node node) { + if (node != null) { + System.out.println(node.getId() + "--- "); + preOrder(node.getLeftChild()); + preOrder(node.getRightChild()); + + } + } + + /** + * 中序 + * + * @param node + */ + public void inOrder(Node node) { + if (node != null) { + inOrder(node.getLeftChild()); + System.out.println(node.getId() + "--"); + inOrder(node.getRightChild()); + + } + } + + /** + * 后序 + * + * @param node + */ + public void postOrder(Node node) { + if (node != null) { + postOrder(node.getLeftChild()); + postOrder(node.getRightChild()); + System.out.println(node.getId() + "---"); + } + } + + private class Node { + private int id; + private Object data; + private Node leftChild; + private Node rightChild; + + + public Node(int id, Object data) { + this.id = id; + this.data = data; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public Node getLeftChild() { + return leftChild; + } + + public void setLeftChild(Node leftChild) { + this.leftChild = leftChild; + } + + public Node getRightChild() { + return rightChild; + } + + public void setRightChild(Node rightChild) { + this.rightChild = rightChild; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @Override + public String toString() { + + return "id= " + id + " , data= " + data; + } + } +} diff --git a/group03/58555264/src/main/java/com/circle/collection/Iterator.java b/group03/58555264/src/main/java/com/circle/collection/Iterator.java new file mode 100644 index 0000000000..52616dfc27 --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/collection/Iterator.java @@ -0,0 +1,11 @@ +package com.circle.collection; + +/** + * Created by keweiyang on 2017/2/25. + * Iterator对外暴露2个接口,隐藏了具体实现(数组or链表) + */ +public interface Iterator { + boolean hasNext(); + + Object next(); +} diff --git a/group03/58555264/src/main/java/com/circle/collection/LinkedList.java b/group03/58555264/src/main/java/com/circle/collection/LinkedList.java new file mode 100644 index 0000000000..328414aa88 --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/collection/LinkedList.java @@ -0,0 +1,218 @@ +package com.circle.collection; + +/** + * Created by keweiyang on 2017/2/25. + */ +public class LinkedList implements List{ + java.util.LinkedList list; + + private Node first = null; + + private int currentIndex = -1;//主要用于统计链表长度 + + //注意Node是静态内部类 + private static class Node { + + Object data; + Node nextNode; + + public Node(Object obj) { + this.data = obj; + } + + public Node getNextNode() { + return nextNode; + } + + public void setNextNode(Node nextNode) { + this.nextNode = nextNode; + } + + @Override + public String toString() { + return "data= " + data; + } + } + + /** + * 插入 + * + * @param o + */ + public void add(Object o) { + //1:生成一个Node + Node newNode = new Node(o); + Node currentNode = first; + //2:插入Node + if (currentNode == null) { + first = newNode; + } else { + while (currentNode.getNextNode() != null) { + currentNode = currentNode.getNextNode(); + } + currentNode.setNextNode(newNode); + + } + currentIndex++; + } + + /** + * 在指定位置插入节点 + * + * @param index + * @param o + */ + public void add(int index, Object o) { + + Node newNode = new Node(o); + + if (index < 0 || index > currentIndex + 1) { + throw new RuntimeException("索引不正确"); + } + + Node currentNode = first; + Node previousNode = currentNode; + int pos = 0; + while (currentNode != null && pos != index) { + previousNode = currentNode; + currentNode = currentNode.getNextNode(); + pos++; + } + + previousNode.setNextNode(newNode); + newNode.setNextNode(currentNode); + currentIndex++; + + } + + public Object get(int index) { + + rangeCheck(index); + Node node = first; + int pos = 0; + + while (node != null && pos != index) { + + node = node.getNextNode(); + pos++; + } + return node; + } + + private void rangeCheck(int index) { + if (index < 0 || index > currentIndex) { + throw new RuntimeException("索引不正确"); + } + } + + public Object remove(int index) { + + //1:获取要删除的节点 + rangeCheck(index); + Node currentNode = first; + + + if (index == 0) { + + currentNode = first; + first = first.getNextNode(); + }else{ + Node previousNode = first; + int pos = 0; + while (currentNode != null && pos != index) { + previousNode = currentNode; + currentNode = currentNode.getNextNode(); + pos++; + } + + //2:执行删除操作 + previousNode.setNextNode(currentNode.getNextNode()); + } + + currentIndex--; + + return currentNode; + } + + public int size() { + return currentIndex + 1; + } + + public void addFirst(Object o) { + Node newNode = new Node(o); + if (first == null) { + first = newNode; + } else { + newNode.setNextNode(first); + first = newNode; + } + currentIndex++; + } + + public void addLast(Object o) { + + Node newNode = new Node(o); + Node currentNode = first; + if (currentNode == null) { + first=newNode; + } else { + while (currentNode.getNextNode() != null) { + currentNode = currentNode.getNextNode(); + } + currentNode.setNextNode(newNode); + + } + currentIndex++; + + } + + public Object removeFirst() { + + Node node = first; + if (first == null) { + throw new RuntimeException("链表长度为0,不能执行这步操作"); + } else { + first = first.getNextNode(); + } + currentIndex--; + return node; + } + + public Object removeLast() { + Node currentNode = first; + Node previousNode = currentNode; + if (currentNode == null) { + throw new RuntimeException("链表长度为0,不能执行这步操作"); + } else { + while (currentNode.getNextNode() != null) { + previousNode = currentNode; + currentNode = currentNode.getNextNode(); + } + previousNode.setNextNode(null); + + } + currentIndex--; + return currentNode; + } + + public Iterator iterator() { + return new Iterator() { + int pos = -1; + + public boolean hasNext() { + if (pos + 1 <= currentIndex) { + return true; + } + return false; + } + + public Object next() { + if (hasNext()) { + pos++; + return get(pos); + } + return null; + } + }; + } +} diff --git a/group03/58555264/src/main/java/com/circle/collection/List.java b/group03/58555264/src/main/java/com/circle/collection/List.java new file mode 100644 index 0000000000..3c15767b48 --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/collection/List.java @@ -0,0 +1,17 @@ +package com.circle.collection; + +/** + * Created by keweiyang on 2017/2/25. + */ +public interface List { + void add(Object o); + + void add(int index, Object o); + + Object get(int index); + + Object remove(int index); + + int size(); + +} diff --git a/group03/58555264/src/main/java/com/circle/collection/Queue.java b/group03/58555264/src/main/java/com/circle/collection/Queue.java new file mode 100644 index 0000000000..6e67a1c524 --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/collection/Queue.java @@ -0,0 +1,25 @@ +package com.circle.collection; + +/** + * Created by keweiyang on 2017/2/25. + */ +public class Queue { + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o) { + + elementData.addLast(o); + } + + public Object deQueue() { + return elementData.removeFirst(); + } + + public boolean isEmpty() { + return elementData.size() <= 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group03/58555264/src/main/java/com/circle/collection/Stack.java b/group03/58555264/src/main/java/com/circle/collection/Stack.java new file mode 100644 index 0000000000..d57bac0841 --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/collection/Stack.java @@ -0,0 +1,58 @@ +package com.circle.collection; + +/** + * Created by keweiyang on 2017/2/25. + * 自定义Stack,此Stack是基于ArrayList实现的 + */ +public class Stack { + + private ArrayList elementData = new ArrayList(4); + + /** + * 入栈 + * + * @param o + */ + public void push(Object o) { + + elementData.add(o); + } + + /** + * 出栈 + * + * @return + */ + public Object pop() { + Object ret = null; + if (elementData.size() > 0) { + ret = elementData.remove(elementData.size() - 1); + }else{ + throw new RuntimeException("栈中没有元素"); + } + return ret; + } + + /** + * 获取栈顶元素 + * + * @return + */ + public Object peek() { + Object ret = null; + if (elementData.size() > 0) { + ret = elementData.get(elementData.size() - 1); + } else { + throw new RuntimeException("栈中没有元素"); + } + return ret; + } + + public boolean isEmpty() { + return elementData.size() <= 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group03/58555264/src/main/java/com/circle/struts/ActionEntity.java b/group03/58555264/src/main/java/com/circle/struts/ActionEntity.java new file mode 100644 index 0000000000..8326e7c81a --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/struts/ActionEntity.java @@ -0,0 +1,59 @@ +package com.circle.struts; + +import java.util.*; + +/** + * Created by keweiyang on 2017/3/2. + */ +class ActionEntity { + + private String name; + private String className; + + private Map resultMap = new HashMap<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public Map getResultMap() { + return resultMap; + } + + public void setResultMap(Map resultMap) { + this.resultMap = resultMap; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("name= "); + builder.append(this.name); + builder.append(" ,className= "); + builder.append(this.className); + + + for (Map.Entry entry : resultMap.entrySet()) { + builder.append(" , resultName= "); + builder.append(entry.getKey()); + builder.append(" , jsp= "); + builder.append(entry.getValue()); + } + + + return builder.toString(); + } + +} diff --git a/group03/58555264/src/main/java/com/circle/struts/LoginAction.java b/group03/58555264/src/main/java/com/circle/struts/LoginAction.java new file mode 100644 index 0000000000..8fb042c28a --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/struts/LoginAction.java @@ -0,0 +1,39 @@ +package com.circle.struts; + +/** + * Created by keweiyang on 2017/3/5. + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group03/58555264/src/main/java/com/circle/struts/Struts.java b/group03/58555264/src/main/java/com/circle/struts/Struts.java new file mode 100644 index 0000000000..7424a9bb6a --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/struts/Struts.java @@ -0,0 +1,233 @@ +package com.circle.struts; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by keweiyang on 2017/3/2. + */ +public class Struts { + + private final static String D = "1234"; + + private List actionEntityList = new ArrayList<>(); + + private ActionEntity actionEntity = null; + + /** + * @param actionName action方法名称 例如:LoginAction + * @param parameters 参数map,例如:name->liuxin,password->1234 + * @param pathName 文件路径 + * @return + */ + public View runAction(String actionName, Map parameters, String pathName) { + /** + * 0.读取配置文件struts.xml + * + * 1.根据actionName找到对应的class,例如LoginActon,通过反射实例化(创建对象),然后根据parameters中的数据,调用 + * 对象的setter方法,例如parameters中的数据是("name"="liuxin","password"="1234"),那就调用setName和setPassword方法 + * + * 2.通过反射调用对象的execute方法,并获得返回值,例如:"success" + * + * 3. 通过反射找到对象的所有getter方法(例如getMessage),通过反射调用,把值和属性形成一个HashMap,例如{"message":"登录成功"}, + * 放到View对象的parameters + * + * 4. 根据struts.xml中的配置,以及execute的返回值,确定哪一个jsp,放到View对象的jsp对象中 + * + */ + + try { + //1:读取struts.xml + this.getActionEntityList(pathName); + //2:获取对应的classpath + String classPath = initParameter(actionName, parameters); + //3:反射 + View view = createClass(classPath, parameters); + return view; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + + } + + /** + * 将map中的key值修改为setxxx,并且获取classpath + * + * @param actionName + * @param mapParameters + * @return + */ + private String initParameter(String actionName, Map mapParameters) { + if (actionName == null || actionName.trim().length() == 0) { + + throw new IllegalStateException("actionName为空"); + } + if (mapParameters == null || mapParameters.size() == 0) { + throw new IllegalStateException("参数为空"); + } + + String classpath = ""; + for (ActionEntity entity : this.actionEntityList) { + if (entity.getName().equals(actionName)) { + this.actionEntity = entity; + classpath = entity.getClassName(); + break; + + } + } + + + Map map = new HashMap<>(); + for (Map.Entry entry : mapParameters.entrySet()) { + String methodName = "set" + entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1); + map.put(methodName, entry.getValue()); + } + + mapParameters.clear(); + for (Map.Entry entry : map.entrySet()) { + mapParameters.put(entry.getKey(), entry.getValue()); + } + + + return classpath; + } + + private View createClass(String classpath, Map mapParameters) throws Exception { + View view = null; + if (classpath.equals("")) { + + throw new IllegalStateException("classPath为空"); + } + + Class clazz = Class.forName(classpath); + Object obj = clazz.newInstance(); + Method[] methods = clazz.getDeclaredMethods(); + Field[] fields = clazz.getDeclaredFields(); + + // 先调用setter方法 + for (Map.Entry entry : mapParameters.entrySet()) { + Method method = clazz.getDeclaredMethod(entry.getKey(), String.class); + if (method != null) { + method.invoke(obj, entry.getValue()); + } + + } + + // 再调用execute方法 +// if (obj instanceof LoginAction) { + Method method = clazz.getDeclaredMethod("execute"); + String ret = (String) method.invoke(obj, null); + + Map retMap = this.actionEntity.getResultMap(); + for (Map.Entry result : retMap.entrySet()) { + if (ret.equals(result.getKey())) { + Map map = new HashMap<>(); + System.out.println(result.getValue()); + + this.showView(methods, fields, obj, clazz, map); + view = new View(); + view.setJsp(result.getValue()); + view.setParameters(map); + System.out.println(view.toString()); + break; + } +// } + + } + return view; + } + + private void showView(Method[] methods, Field[] fields, Object object, Class clazz, Map map) throws Exception { + + + String[] ss = new String[fields.length]; + Method[] ms = new Method[methods.length]; + for (int i = 0; i < fields.length; i++) { + ss[i] = fields[i].getName(); + } + + for (int i = 0; i < ss.length; i++) { + String str = ss[i]; + ss[i] = "get" + ss[i].substring(0, 1).toUpperCase() + ss[i].substring(1); + + + ms[i] = clazz.getDeclaredMethod(ss[i], null); + String returnType = (String) ms[i].invoke(object, null); + map.put(str, returnType); +// System.out.println(returnType.toString()); + } + + + } + + /** + * 读取指定路径 + * + * @param pathName 文件路径 + * @return + */ + private List getActionEntityList(String pathName) { + //读取struts.xml配置文件 + if (pathName == null || pathName.trim().length() == 0) { + throw new IllegalStateException("pathName为空"); + } + Document document = XmlUtil.getDocument(pathName); + Map resultMap = null; + + if (document.hasChildNodes()) { + NodeList nodeList = document.getElementsByTagName("struts"); + for (int i = 0; i < nodeList.getLength(); i++) { + Element rootEle = (Element) nodeList.item(i); + + if (rootEle.hasChildNodes()) { + NodeList childList = rootEle.getElementsByTagName("action"); + + for (int j = 0; j < childList.getLength(); j++) { + Element childEle = (Element) childList.item(j); + ActionEntity actionEntity = new ActionEntity(); + + String name = childEle.getAttribute("name"); + String className = childEle.getAttribute("class"); + actionEntity.setClassName(className); + actionEntity.setName(name); + + if (childEle.hasChildNodes()) { + NodeList grandSonList = childEle.getElementsByTagName("result"); + resultMap = new HashMap<>(); + for (int k = 0; k < grandSonList.getLength(); k++) { + Element resultEle = (Element) grandSonList.item(k); + String resultName = resultEle.getAttribute("name"); + String value = resultEle.getTextContent(); + resultMap.put(resultName, value); + } + } + actionEntity.setResultMap(resultMap); + + actionEntityList.add(actionEntity); + } + } + } + } + return actionEntityList; + } + + +} diff --git a/group03/58555264/src/main/java/com/circle/struts/View.java b/group03/58555264/src/main/java/com/circle/struts/View.java new file mode 100644 index 0000000000..d1bf62c405 --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/struts/View.java @@ -0,0 +1,44 @@ +package com.circle.struts; + +import java.util.Map; + +/** + * Created by keweiyang on 2017/3/2. + */ +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public void setJsp(String jsp) { + this.jsp = jsp; + } + + public Map getParameters() { + return parameters; + } + + public void setParameters(Map parameters) { + this.parameters = parameters; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("jsp= "); + builder.append(this.jsp); + + for (Map.Entry entry : parameters.entrySet()) { + builder.append(" , "); + builder.append(entry.getKey()); + builder.append(" = "); + builder.append(entry.getValue()); + } + + + return builder.toString(); + } +} diff --git a/group03/58555264/src/main/java/com/circle/struts/XmlUtil.java b/group03/58555264/src/main/java/com/circle/struts/XmlUtil.java new file mode 100644 index 0000000000..aeb43d5bb8 --- /dev/null +++ b/group03/58555264/src/main/java/com/circle/struts/XmlUtil.java @@ -0,0 +1,43 @@ +package com.circle.struts; + +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; + +/** + * Created by keweiyang on 2017/3/5. + * 解析XML文件,向外提供Docuemnt对象 + */ +public class XmlUtil { + + private XmlUtil() { + + } + + public static Document getDocument(String fileName) { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + DocumentBuilder builder = factory.newDocumentBuilder(); + + //读当前文件路径下的 + Document doc = builder.parse(fileName); + + //去掉document的空格 + doc.normalize(); + return doc; + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } +} + + diff --git a/group03/58555264/src/test/java/com/circle/algorithm/ArrayUtilTest.java b/group03/58555264/src/test/java/com/circle/algorithm/ArrayUtilTest.java new file mode 100644 index 0000000000..8df45c15b6 --- /dev/null +++ b/group03/58555264/src/test/java/com/circle/algorithm/ArrayUtilTest.java @@ -0,0 +1,57 @@ +package com.circle.algorithm; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by keweiyang on 2017/3/5. + */ +public class ArrayUtilTest { + + ArrayUtil util = new ArrayUtil(); + + @Test + public void reverseArray() throws Exception { + int[] origin = new int[]{7, 9, 30, 3, 4}; + util.reverseArray(origin); + for (int i : origin) { + System.out.println(i); + } + } + + @Test + public void removeZero() throws Exception { + int[] origin = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] newArray = util.removeZero(origin); + for (int i : newArray) { + System.out.println(i); + + } + + } + + @Test + public void fibonacci() throws Exception { + int[] newArray = util.fibonacci(15); + for (int i : newArray) { + System.out.println(i); + } + } + + @Test + public void getPrimes() throws Exception { + int[] newArray = util.getPrimes(23); + for (int i : newArray) { + System.out.println(i); + } + + } + + @Test + public void join() throws Exception { + int[] origin = new int[]{3,8,9}; + System.out.println(util.join(origin, "-")); + } + +} \ No newline at end of file diff --git a/group03/58555264/src/test/java/com/circle/collection/ArrayListTest.java b/group03/58555264/src/test/java/com/circle/collection/ArrayListTest.java new file mode 100644 index 0000000000..7a31fc5590 --- /dev/null +++ b/group03/58555264/src/test/java/com/circle/collection/ArrayListTest.java @@ -0,0 +1,80 @@ +package com.circle.collection; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by keweiyang on 2017/2/25. + */ +public class ArrayListTest { + private ArrayList list = null; + +// @Test + public void add() throws Exception { + list = new ArrayList(3); + list.add(1); + list.add(2); + list.add(3); + //测试自动扩容 + list.add(4); + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } + +// @Test + public void add1() throws Exception { + list = new ArrayList(10); + list.add(1); + list.add(2); + list.add(3); + //测试自动扩容 + list.add(4); + list.add(5, 5); + list.add(4, 6); + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + + } + +// @Test + public void get() throws Exception { + list = new ArrayList(10); + list.add(1); + list.add(2); + list.add(3); + + System.out.println(list.get(1)); + + } + +// @Test + public void remove() throws Exception { + list = new ArrayList(10); + list.add(1); + list.add(2); + list.add(3); + + System.out.println(list.remove(1)); + System.out.println("------------>"); + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } + + @Test + public void size() throws Exception { + list = new ArrayList(10); + list.add(1); + list.add(2); + list.add(3); + + System.out.println("size= "+list.size()); + } + +} \ No newline at end of file diff --git a/group03/58555264/src/test/java/com/circle/collection/BinaryTreeTest.java b/group03/58555264/src/test/java/com/circle/collection/BinaryTreeTest.java new file mode 100644 index 0000000000..7db0f9dc96 --- /dev/null +++ b/group03/58555264/src/test/java/com/circle/collection/BinaryTreeTest.java @@ -0,0 +1,74 @@ +package com.circle.collection; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by keweiyang on 2017/2/25. + */ +public class BinaryTreeTest { + + private BinaryTree tree; + + @Test + public void get() throws Exception { + tree = new BinaryTree(); + tree.insert(5, 5); + tree.insert(6, 6); + System.out.println(tree.get(5)); + + } + + @Test + public void insert() throws Exception { + tree = new BinaryTree(); + tree.insert(5, 5); + tree.insert(6, 6); + + } + + @Test + public void preOrder() throws Exception { + tree = new BinaryTree(); + tree.insert(5, 5); + tree.insert(6, 6); + tree.preOrder(tree.get(5)); + + } + + @Test + public void inOrder() throws Exception { + tree = new BinaryTree(); + tree.insert(5, 5); + tree.insert(6, 6); + tree.insert(4, 4); + tree.inOrder(tree.get(5)); + } + + @Test + public void postOrder() throws Exception { + tree = new BinaryTree(); + tree.insert(5, 5); + tree.insert(6, 6); + tree.insert(4, 4); + tree.postOrder(tree.get(5)); + } + + @Test + public void delete() throws Exception { + tree = new BinaryTree(); + tree.insert(7, 7); + tree.insert(5, 5); + tree.insert(10, 10); + tree.insert(2, 2); + tree.insert(6, 6); + tree.insert(11, 11); + tree.insert(13, 13); + tree.inOrder(tree.get(7)); + + tree.delete(10); + tree.inOrder(tree.get(7)); + + } +} \ No newline at end of file diff --git a/group03/58555264/src/test/java/com/circle/collection/LinkedListTest.java b/group03/58555264/src/test/java/com/circle/collection/LinkedListTest.java new file mode 100644 index 0000000000..05d99641c1 --- /dev/null +++ b/group03/58555264/src/test/java/com/circle/collection/LinkedListTest.java @@ -0,0 +1,160 @@ +package com.circle.collection; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by keweiyang on 2017/2/25. + */ +public class LinkedListTest { + private LinkedList list = null; + +// @Test + public void add() throws Exception { + + list = new LinkedList(); + + list.add(1); + list.add(2); + + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + + } + } + + @Test + public void add1() throws Exception { + list = new LinkedList(); + list.add(1); + list.add(2); + list.add(1, 3); + + list.add(3, 4); + //索引不正确情况 + list.add(6,6); + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + + } + + } + + @Test + public void get() throws Exception { + list = new LinkedList(); + list.add(1); + list.add(2); + + System.out.println(list.get(0)); + System.out.println(list.get(1)); + + } + + @Test + public void remove() throws Exception { + list = new LinkedList(); + list.add(1); + list.add(2); + list.remove(1); + + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + + } + + + } + + @Test + public void size() throws Exception { + list = new LinkedList(); + list.add(1); + list.add(2); + System.out.println("size= "+ list.size()); + } + + @Test + public void addFirst() throws Exception { + list = new LinkedList(); + list.add(1); + list.add(2); + list.addFirst("123"); + + + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + + } + + list.remove(0); + System.out.println("---------------");; + it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + + } + } + + @Test + public void addLast() throws Exception { + list = new LinkedList(); + list.addFirst(1); + list.addLast(2); + list.add(3); + list.addLast(4); + list.addFirst(0); + + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + + } + + } + + @Test + public void removeFirst() throws Exception { + + list = new LinkedList(); + list.addFirst(1); + list.addLast(2); + list.add(3); + list.addLast(4); + list.addFirst(0); + list.removeFirst(); + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } + + + + @Test + public void removeLast() throws Exception { + list = new LinkedList(); + list.addFirst(1); + list.addLast(2); + list.add(3); + list.addLast(4); + list.addFirst(0); + list.removeLast(); + list.removeLast(); + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } + + @Test + public void iterator() throws Exception { + + } + +} \ No newline at end of file diff --git a/group03/58555264/src/test/java/com/circle/collection/QueueTest.java b/group03/58555264/src/test/java/com/circle/collection/QueueTest.java new file mode 100644 index 0000000000..6c35605e18 --- /dev/null +++ b/group03/58555264/src/test/java/com/circle/collection/QueueTest.java @@ -0,0 +1,49 @@ +package com.circle.collection; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by keweiyang on 2017/2/25. + */ +public class QueueTest { + + private Queue queue = null; + + @Test + public void enQueue() throws Exception { + queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(4); + System.out.println(queue.deQueue()); + } + + @Test + public void deQueue() throws Exception { + + queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + System.out.println(queue.deQueue()); + } + + @Test + public void isEmpty() throws Exception { + queue = new Queue(); +// queue.enQueue(1); +// queue.enQueue(2); + System.out.println(queue.isEmpty()); + } + + @Test + public void size() throws Exception { + + queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + System.out.println(queue.size()); + } + +} \ No newline at end of file diff --git a/group03/58555264/src/test/java/com/circle/collection/StackTest.java b/group03/58555264/src/test/java/com/circle/collection/StackTest.java new file mode 100644 index 0000000000..6ec7a3c4ca --- /dev/null +++ b/group03/58555264/src/test/java/com/circle/collection/StackTest.java @@ -0,0 +1,63 @@ +package com.circle.collection; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by keweiyang on 2017/2/25. + */ +public class StackTest { + private Stack stack = null; + + + @Test + public void push() throws Exception { + stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + System.out.println(stack.pop()); + } + + @Test + public void pop() throws Exception { + stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.pop(); + System.out.println(stack.pop()); + } + + @Test + public void peek() throws Exception { + + stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + System.out.println(stack.peek()); + + } + + @Test + public void isEmpty() throws Exception { + + stack = new Stack(); + System.out.println(stack.isEmpty()); + + } + + @Test + public void size() throws Exception { + + stack = new Stack(); + stack.push(1); + System.out.println(stack.size()); + } + +} \ No newline at end of file diff --git a/group03/58555264/src/test/java/com/circle/struts/StrutsTest.java b/group03/58555264/src/test/java/com/circle/struts/StrutsTest.java new file mode 100644 index 0000000000..d5dcb972cd --- /dev/null +++ b/group03/58555264/src/test/java/com/circle/struts/StrutsTest.java @@ -0,0 +1,51 @@ +package com.circle.struts; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.*; + +/** + * Created by keweiyang on 2017/3/5. + */ +public class StrutsTest { + Map map = null; + Struts struts = null; + String pathName = null; + String actionName = null; + + + + @Test + public void runAction() throws Exception { + map = new HashMap<>(); + struts = new Struts(); + map.put("name", "test"); + map.put("password", "1234"); + actionName = "login"; + pathName = "src/main/resources/struts.xml"; + + View view = struts.runAction(actionName, map, pathName); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws Exception { + map = new HashMap<>(); + struts = new Struts(); + map.put("name", "test"); + map.put("password", "12345"); + actionName = "login"; + pathName = "src/main/resources/struts.xml"; + + View view = struts.runAction(actionName, map, pathName); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} \ No newline at end of file diff --git a/group03/617187912/Learning02/.classpath b/group03/617187912/Learning02/.classpath new file mode 100644 index 0000000000..07c9acc328 --- /dev/null +++ b/group03/617187912/Learning02/.classpath @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/group03/617187912/Learning02/.gitignore b/group03/617187912/Learning02/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group03/617187912/Learning02/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group03/617187912/Learning02/.project b/group03/617187912/Learning02/.project new file mode 100644 index 0000000000..12dfa1118c --- /dev/null +++ b/group03/617187912/Learning02/.project @@ -0,0 +1,17 @@ + + + 617187912Learning02 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group03/617187912/Learning02/.settings/org.eclipse.core.resources.prefs b/group03/617187912/Learning02/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/group03/617187912/Learning02/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/group03/617187912/Learning02/.settings/org.eclipse.jdt.core.prefs b/group03/617187912/Learning02/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group03/617187912/Learning02/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group03/617187912/Learning02/src/com/coderising/array/ArrayUtil.java b/group03/617187912/Learning02/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..28f7f0ccc0 --- /dev/null +++ b/group03/617187912/Learning02/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,197 @@ +package com.coderising.array; + +import java.awt.Dialog.ModalExclusionType; +import java.awt.Dimension; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Dictionary; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringJoiner; +import java.util.TreeSet; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static int[] reverseArray(int[] origin) { + int length = origin.length; + int[] nArr = new int[length]; + for (int i = 0; i < length; i++) { + nArr[i] = origin[length - i - 1]; + } + return nArr; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + int[] newArray = new int[oldArray.length]; + int size = 0; + for (int i : oldArray) { + if (i != 0) { + newArray[size] = i; + size++; + } + } + return Arrays.copyOf(newArray, size); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2) { + Set set = new TreeSet(); + for (int i = 0; i < array1.length; i++) { + set.add(array1[i]); + } + for (int i = 0; i < array2.length; i++) { + set.add(array2[i]); + } + int[] newArray = new int[set.size()]; + int j = 0; + for (Integer i : set) { + newArray[j++] = i; + } + return newArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max <= 1) { + return null; + } + int[] arrFib = new int[max / 2 + 2]; + int current = 0; + int temp = 1; + int pre = 1; + int next = 2; + arrFib[current++] = 1; + arrFib[current++] = 1; + do { + arrFib[current++] = next; + temp = pre; + pre = next; + next = next + temp; + } while (next <= max); + return Arrays.copyOf(arrFib, current); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + if (max < 2) { + return null; + } + int[] arrPrimes = new int[max]; + int current = 0; + arrPrimes[current++] = 2; + Boolean isPrime = true; + for (int i = 3; i < max; i++) { + isPrime = true; + for (Integer j : arrPrimes) { + if (j == 0) { + break; + } + if (i % j == 0) { + isPrime = false; + break; + } + } + if (isPrime == true) { + arrPrimes[current++] = i; + } + } + System.out.println(current); + return Arrays.copyOf(arrPrimes, current); + + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + if (max < 6) { + return null; + } + int[] arrPerNums = new int[max / 6 + 1]; + int current = 0; + arrPerNums[current++] = 6; + for (int i = 7; i < max; i++) { + int sum = 1; + for (int j = 2; j < i / 2+1; j++) { + if (i % j == 0) { + sum += j; + } + } + if (sum == i) { + arrPerNums[current++] = i; + } + } + return Arrays.copyOf(arrPerNums, current); + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + sb.append("-"); + sb.append(array[i]); + } + return sb.toString().substring(1); + } + +} diff --git a/group03/617187912/Learning02/src/com/coderising/array/ArrayUtilTest.java b/group03/617187912/Learning02/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..64a7bf9553 --- /dev/null +++ b/group03/617187912/Learning02/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,85 @@ +package com.coderising.array; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void testReverseArray() { + int[] a = { 7, 9, 30, 3 }; + int[] b = ArrayUtil.reverseArray(a); + int[] c = ArrayUtil.reverseArray(b); + assertArrayEquals(a, c); + } + + @Test + public void testRemoveZero() { + int[] arrOld={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] arrTarget={1,3,4,5,6,6,5,4,7,6,7,5}; + int[] arrResult =ArrayUtil.removeZero(arrOld); + assertArrayEquals(arrTarget,arrResult); + } + + @Test + public void testMerge() { + int[] a1 = {3, 5, 7,8}; + int[] a2 = {4, 5, 6,7}; + int[] arrTarget = {3,4,5,6,7,8}; + int[] arrResult = ArrayUtil.merge(a1, a2); + assertArrayEquals(arrTarget, arrResult); + } + + @Test + public void testGrow() { + int[] arrOld = {2,3,6}; + int[] arrTarget = {2,3,6,0,0,0}; + int[] arrResult = ArrayUtil.grow(arrOld, 3); + assertArrayEquals(arrTarget, arrResult); + } + + @Test + public void testFibonacci() { + int max = 1; + assertNull(ArrayUtil.fibonacci(max)); + max =15; + int[] arrTarget = {1,1,2,3,5,8,13}; + int[] arrResult = ArrayUtil.fibonacci(max); + assertArrayEquals(arrTarget,arrResult); + } + + @Test + public void testGetPrimes() { + int max = 1; + assertNull(ArrayUtil.getPrimes(max)); + max =23; + int[] arrTarget = {2,3,5,7,11,13,17,19}; + int[] arrResult = ArrayUtil.getPrimes(max); + assertArrayEquals(arrTarget,arrResult); + } + + @Test + public void testGetPerfectNumbers() { + int max = 5; + assertNull(ArrayUtil.getPerfectNumbers(max)); + max =8129; + int[] arrTarget = {6,28,496,8128}; + int[] arrResult = ArrayUtil.getPerfectNumbers(max); + assertArrayEquals(arrTarget,arrResult); + } + + @Test + public void testJoin() { + int[] arrOld ={3,8,9}; + String target = "3-8-9"; + String result = ArrayUtil.join(arrOld, "-"); + assertEquals(target, result); + } + +} diff --git a/group03/617187912/Learning02/src/com/coderising/litestruts/LoginAction.java b/group03/617187912/Learning02/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group03/617187912/Learning02/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group03/617187912/Learning02/src/com/coderising/litestruts/Struts.java b/group03/617187912/Learning02/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..175bb2ecad --- /dev/null +++ b/group03/617187912/Learning02/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,119 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + + public static View runAction(String actionName, Map parameters) + throws ClassNotFoundException, DocumentException, InstantiationException, IllegalAccessException, + NoSuchMethodException, InvocationTargetException { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + * + */ + String[] methodNames = createSetMethodNames(parameters); + Struts.class.getResourceAsStream("/struts.xml"); + Element element = getTargetElement(actionName); + String className = element.attribute(1).getValue(); + Class clz = Class.forName(className); + Object obj = clz.newInstance(); + invokeObjectSetter(parameters, methodNames, clz, obj); + View view = new View(); + view.setParameters(createGetterMap(clz, obj)); + setViewJsp(view, element, clz, obj); + return view; + } + + private static String[] createSetMethodNames(Map parameters) { + String[] methodNames = new String[parameters.size()]; + int i = 0; + for (String key : parameters.keySet()) { + methodNames[i++] = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); + } + return methodNames; + } + + private static void setViewJsp(View view, Element element, Class clz, Object obj) + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + view.setJsp(getJsp(element, executeToGetResult(clz, obj))); + } + + private static Map createGetterMap(Class clz, Object obj) throws IllegalAccessException, InvocationTargetException { + Map map = new HashMap(); + Method[] methods = clz.getMethods(); + for (Method item : methods) { + if (item.getName().contains("get")) { + String key = item.getName().substring(3).toLowerCase(); + Object value = item.invoke(obj); + map.put(key, value); + } + } + return map; + } + + private static String executeToGetResult(Class clz, Object obj) + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + Method method = clz.getMethod("execute"); + String result = (String) method.invoke(obj); + return result; + } + + private static void invokeObjectSetter(Map parameters, + String[] methodNames, Class clz, Object obj) + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + for (String key : methodNames) { + Method method = clz.getMethod(key, String.class); + method.invoke(obj, parameters.get(key)); + } + } + + private static Element getTargetElement(String actionName) throws DocumentException { + SAXReader reader = new SAXReader(); + InputStream inputStream =Struts.class.getResourceAsStream("/struts.xml"); + Document document = reader.read(inputStream); + Element rootNode = document.getRootElement(); + List elements = rootNode.elements(); + for (Element item : elements) { + if (actionName.equals(item.attribute(0).getValue())) { + return item; + } + } + return null; + } + + private static String getJsp(Element element, String result) { + List elements = element.elements(); + for (Element e : elements) { + if (result.equals(e.attribute(0).getValue())) { + return e.getTextTrim(); + } + } + return null; + } +} diff --git a/group03/617187912/Learning02/src/com/coderising/litestruts/StrutsTest.java b/group03/617187912/Learning02/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..66dc565ed3 --- /dev/null +++ b/group03/617187912/Learning02/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,49 @@ +package com.coderising.litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws ClassNotFoundException, + InstantiationException, IllegalAccessException, NoSuchMethodException, + InvocationTargetException, DocumentException { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws ClassNotFoundException, + InstantiationException, IllegalAccessException, NoSuchMethodException, + InvocationTargetException, DocumentException { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group03/617187912/Learning02/src/com/coderising/litestruts/View.java b/group03/617187912/Learning02/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group03/617187912/Learning02/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group03/617187912/Learning02/src/com/coderising/litestruts/struts.xml b/group03/617187912/Learning02/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group03/617187912/Learning02/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group03/617187912/Learning02/src/com/coding/basic/ArrayList.java b/group03/617187912/Learning02/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..9e22bd0c0b --- /dev/null +++ b/group03/617187912/Learning02/src/com/coding/basic/ArrayList.java @@ -0,0 +1,117 @@ +package com.coding.basic; + + +import java.util.Arrays; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData; + + public ArrayList(){ + this(64); + } + + public ArrayList(int intSize) { + elementData = new Object[intSize]; + } + + public void add(Object o) { + checkMaxSize(); + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + checkMaxSize(); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + private void checkIndexRange(int index) { + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException("index超出数组界限?"); + } + } + + private void checkMaxSize() { + if (size >= elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + } + + public Object get(int index) { + checkIndexRange(index); + return elementData[index]; + } + + public Object remove(int index) { + Object o = get(index); + if (index == size - 1) { + elementData[index] = null; + } else { + System.arraycopy(elementData, index + 1, elementData, index, size - index); + } + size--; + return o; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new MyIterator(); + } + + private class MyIterator implements Iterator { + + private int current = 0; + + @Override + public boolean hasNext() { + return current != size; + } + + @Override + public Object next() { + if (current >= size) { + throw new NoSuchElementException(); + } + return elementData[current++]; + } + } + + public static void main(String[] args) { + ArrayList arrayList = new ArrayList(5); + arrayList.add(1); + arrayList.add(2); + arrayList.add(3); + arrayList.add(4); + arrayList.add(5); + arrayList.add(6); + System.out.println(arrayList.get(1)); + arrayList.add(1, 100); + System.out.println(arrayList.get(1)); + System.out.println(arrayList.size); + System.out.println(arrayList.remove(2)); + System.out.println(arrayList.get(2)); + + + ArrayList mixArraylist = new ArrayList(5); + mixArraylist.add("String"); + mixArraylist.add(100); + mixArraylist.add('f'); + mixArraylist.add(3.1f); + mixArraylist.add(4L); + System.out.println(mixArraylist.get(1)); + mixArraylist.add(1, 101); + System.out.println(mixArraylist.get(1)); + System.out.println(mixArraylist.size); + System.out.println(mixArraylist.remove(2)); + System.out.println(mixArraylist.get(2)); + } +} \ No newline at end of file diff --git a/group03/617187912/Learning02/src/com/coding/basic/BinaryTreeNode.java b/group03/617187912/Learning02/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..7b6479d535 --- /dev/null +++ b/group03/617187912/Learning02/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,33 @@ +package com.coding.basic; + + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group03/617187912/Learning02/src/com/coding/basic/Iterator.java b/group03/617187912/Learning02/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..017cbc4240 --- /dev/null +++ b/group03/617187912/Learning02/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group03/617187912/Learning02/src/com/coding/basic/LinkedList.java b/group03/617187912/Learning02/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..88a4c6c31b --- /dev/null +++ b/group03/617187912/Learning02/src/com/coding/basic/LinkedList.java @@ -0,0 +1,137 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + private int size; + + public void add(Object o) { + addLast(o); + } + + public void add(int index, Object o) { + checkIndexRange(index); + if (index == 0) { + head = new Node(o, head); + size++; + } else { + Node nd = getNode(index-1); + nd.next = new Node(o, nd.next); + size++; + } + } + + public Object get(int index) { + return getNode(index).data; + } + + private Node getNode(int index) { + Node nd = head; + for (int i = 0; i < index; i++) { + nd = nd.next; + } + return nd; + } + + public Object remove(int index) { + if (size == 0) { + throw new NoSuchElementException(); + } + checkIndexRange(index); + if (index == 0) { + Object o = head.data; + head = head.next; + size--; + return o; + } else { + Node nd = getNode(index - 1); + Object o = nd.next.data; + nd.next = nd.next.next; + size--; + return o; + } + } + + private void checkIndexRange(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("index超出数组界限?"); + } + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + add(0, o); + } + + public void addLast(Object o) { + if (size == 0) { + addFirst(o); + } else { + add(size, o); + } + } + + public Object removeFirst() { + return remove(0); + } + + public Object removeLast() { + return remove(size - 1); + } + + public Iterator iterator() { + return new MyIterator(); + } + + private class MyIterator implements Iterator { + + public Node current = head; + + @Override + public boolean hasNext() { + return current != null; + } + + @Override + public Object next() { + Object o = current.data; + current = current.next; + return o; + } + } + + private static class Node { + Object data; + Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + public static void main(String[] args) { + LinkedList list = new LinkedList(); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + for (int i = 0; i < list.size; i++) { + System.out.println(list.get(i)); + } + System.out.println(list.get(2)); + list.add(2, 100); + System.out.println(list.get(2)); + list.addFirst(10); + System.out.println(list.get(2)); + list.addLast(100); + System.out.println(list.remove(1)); + System.out.println(list.removeFirst()); + System.out.println(list.removeLast()); + } +} diff --git a/group03/617187912/Learning02/src/com/coding/basic/List.java b/group03/617187912/Learning02/src/com/coding/basic/List.java new file mode 100644 index 0000000000..cd5130be3b --- /dev/null +++ b/group03/617187912/Learning02/src/com/coding/basic/List.java @@ -0,0 +1,10 @@ +package com.coding.basic; + + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group03/617187912/Learning02/src/com/coding/basic/Queue.java b/group03/617187912/Learning02/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..39e1a8b60b --- /dev/null +++ b/group03/617187912/Learning02/src/com/coding/basic/Queue.java @@ -0,0 +1,33 @@ +package com.coding.basic; + + +public class Queue { + private LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o) { + linkedList.add(o); + } + + public Object deQueue() { + return linkedList.removeFirst(); + } + + public boolean isEmpty() { + return linkedList.size() ==0; + } + + public int size() { + return linkedList.size(); + } + public static void main(String[] args) { + Queue que = new Queue(); + que.enQueue(10); + que.enQueue(11); + que.enQueue(12); + System.out.println(que.deQueue()); + System.out.println(que.isEmpty()); + que.deQueue(); + que.deQueue(); + System.out.println(que.isEmpty()); + } +} diff --git a/group03/617187912/Learning02/src/com/coding/basic/Stack.java b/group03/617187912/Learning02/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..1ee047ba4a --- /dev/null +++ b/group03/617187912/Learning02/src/com/coding/basic/Stack.java @@ -0,0 +1,48 @@ +package com.coding.basic; + + +import java.util.EmptyStackException; + +import javax.lang.model.element.QualifiedNameable; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + checkIsEmpty(); + return elementData.remove(size()-1); + } + + private void checkIsEmpty() { + if (isEmpty()){ + throw new EmptyStackException(); + } + } + + public Object peek(){ + checkIsEmpty(); + return elementData.get(size()-1); + } + public boolean isEmpty(){ + return elementData.size()==0; + } + public int size(){ + return elementData.size(); + } + public static void main(String[] args) { + Stack que = new Stack(); + que.push(10); + que.push(11); + que.push(12); + System.out.println(que.peek()); + System.out.println(que.isEmpty()); + System.out.println(que.pop()); + System.out.println(que.pop()); + que.pop(); + System.out.println(que.isEmpty()); + } +} diff --git a/group03/617187912/Learning201702/.classpath b/group03/617187912/Learning201702/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group03/617187912/Learning201702/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group03/617187912/Learning201702/.gitignore b/group03/617187912/Learning201702/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group03/617187912/Learning201702/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group03/617187912/Learning201702/.project b/group03/617187912/Learning201702/.project new file mode 100644 index 0000000000..b3dfe82232 --- /dev/null +++ b/group03/617187912/Learning201702/.project @@ -0,0 +1,17 @@ + + + 617187912Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group03/617187912/Learning201702/.settings/org.eclipse.core.resources.prefs b/group03/617187912/Learning201702/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/group03/617187912/Learning201702/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/group03/617187912/Learning201702/src/com/coding/basic/ArrayList.java b/group03/617187912/Learning201702/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..517f614f71 --- /dev/null +++ b/group03/617187912/Learning201702/src/com/coding/basic/ArrayList.java @@ -0,0 +1,47 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + if (size>=elementData.length){ + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + elementData[size] = o; + size+=1; + } + public void add(int index, Object o){ + if (size>=elementData.length){ + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + System.arraycopy(elementData, index, + elementData, index+1, size-index); + elementData[index]=o; + size+=1; + } + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + System.arraycopy(elementData, index+1, + elementData, index, size-index); + size-=1; + return elementData; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + +} \ No newline at end of file diff --git a/group03/617187912/Learning201702/src/com/coding/basic/BinaryTreeNode.java b/group03/617187912/Learning201702/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group03/617187912/Learning201702/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group03/617187912/Learning201702/src/com/coding/basic/Iterator.java b/group03/617187912/Learning201702/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group03/617187912/Learning201702/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group03/617187912/Learning201702/src/com/coding/basic/LinkedList.java b/group03/617187912/Learning201702/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..e2c4e5e795 --- /dev/null +++ b/group03/617187912/Learning201702/src/com/coding/basic/LinkedList.java @@ -0,0 +1,46 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group03/617187912/Learning201702/src/com/coding/basic/List.java b/group03/617187912/Learning201702/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group03/617187912/Learning201702/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group03/617187912/Learning201702/src/com/coding/basic/Queue.java b/group03/617187912/Learning201702/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group03/617187912/Learning201702/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group03/617187912/Learning201702/src/com/coding/basic/Stack.java b/group03/617187912/Learning201702/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group03/617187912/Learning201702/src/com/coding/basic/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group03/619224754/.classpath b/group03/619224754/.classpath new file mode 100644 index 0000000000..310c94b783 --- /dev/null +++ b/group03/619224754/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/group03/619224754/.gitignore b/group03/619224754/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group03/619224754/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group03/619224754/.project b/group03/619224754/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group03/619224754/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group03/619224754/.settings/org.eclipse.jdt.core.prefs b/group03/619224754/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group03/619224754/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group03/619224754/src/Main/Main.java b/group03/619224754/src/Main/Main.java new file mode 100644 index 0000000000..2419e8fa45 --- /dev/null +++ b/group03/619224754/src/Main/Main.java @@ -0,0 +1,5 @@ +package Main; + +public class Main { + +} diff --git a/group03/619224754/src/com/coderising/array/ArrayUtil.java b/group03/619224754/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..a3f51130f9 --- /dev/null +++ b/group03/619224754/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,202 @@ +package com.coderising.array; + +import java.util.Arrays; + +import com.coding.basic.ArrayList; +import com.coding.basic.Iterator; + +public class ArrayUtil { + + /** + * һa , Ըֵû 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] a = + * [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int[] copy = Arrays.copyOf(origin, origin.length); + for (int i = 0; i < copy.length; i++) { + origin[i] = copy[origin.length - i]; + } + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + ArrayList list = new ArrayList(); + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + list.add(oldArray[i]); + } + } + + int[] newArray = new int[list.size()]; + Iterator it = list.iterator(); + for (int i = 0; i < newArray.length; i++) { + newArray[i] = Integer.parseInt(list.get(i).toString()); + } + + return null; + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + ArrayList list = new ArrayList(); + int i = 0, j = 0; + + while (i < array1.length && j < array2.length) { + if (array1[i] < array2[j]) { + list.add(array1[i]); + i++; + } else { + list.add(array1[j]); + j++; + } + } + + if (i < array1.length) { + for (; i < array1.length; i++) { + list.add(array1[i]); + } + } else { + for (; j < array2.length; j++) { + list.add(array2[i]); + } + } + + int[] mergedArr = new int[list.size()]; + for (int m = 0; m < list.size(); m++) { + mergedArr[m] = Integer.parseInt(list.get(m).toString()); + } + + return null; + } + + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + for (int i = oldArray.length - 1; i < newArray.length - 1; i++) { + newArray[i] = 0; + } + + return newArray; + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ 磬 max = 15 , + * 򷵻صӦΪ [11235813] max = 1, 򷵻ؿ [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if(max == 1) { + return new int[0]; + } + + int a = 1; + int b = 1; + ArrayList list = new ArrayList(); + list.add(a); + list.add(b); + int i = 2; + while (a < 15) { + int next = Integer.parseInt(list.get(i - 1).toString()) + + Integer.parseInt(list.get(i - 2).toString()); + list.add(next); + i++; + } + + int[] arrInt = new int[list.size()]; + for(int j = 0; j < list.size(); j++) { + arrInt[j] = Integer.parseInt(list.get(j).toString()); + } + + return arrInt; + } + + /** + * Сڸֵmax max = 23, صΪ[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + ArrayList list = new ArrayList(); + for(int i = 0; i < max; i++) { + if(isPrime(i)) { + list.add(i); + } + } + + + return null; + } + + + private static boolean isPrime(int n) { + if (n <= 1) { + return false; + } + int k = (int) Math.sqrt(n); + for (int i = 2; i <= k; i++) { + if(n % i == 0) { + return false; + } + } + return true; + } + + /** + * ν ָǡõ֮ͣ6=1+2+3 һֵmax һ飬 Сmax + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + return null; + } + + /** + * seperator array array= [3,8,9], seperator = "-" 򷵻ֵΪ"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + String retString = ""; + for (int i = 0; i < array.length; i++) { + retString += seperator + array[i]; + } + + retString = retString.substring(1); + + return retString; + } + +} \ No newline at end of file diff --git a/group03/619224754/src/com/coderising/litestruts/LoginAction.java b/group03/619224754/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..43674ac7c8 --- /dev/null +++ b/group03/619224754/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * һչʾ¼ҵ࣬ еû붼Ӳġ + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} \ No newline at end of file diff --git a/group03/619224754/src/com/coderising/litestruts/LogoutAction.java b/group03/619224754/src/com/coderising/litestruts/LogoutAction.java new file mode 100644 index 0000000000..5afc869c1c --- /dev/null +++ b/group03/619224754/src/com/coderising/litestruts/LogoutAction.java @@ -0,0 +1,5 @@ +package com.coderising.litestruts; + +public class LogoutAction { + +} diff --git a/group03/619224754/src/com/coderising/litestruts/Struts.java b/group03/619224754/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..378fa96871 --- /dev/null +++ b/group03/619224754/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,88 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; + +public class Struts { + + public static View runAction(String actionName, + Map parameters) throws Exception { + View view = new View(); + // InputStream inputStream = new FileInputStream(new + // File("D:/git/coding2017/group03/619224754/src/com/coderising/litestruts/struts.xml")); + SAXReader saxReader = new SAXReader(); + Document document = saxReader + .read(new File( + "D:/git/coding2017/group03/619224754/src/com/coderising/litestruts/struts.xml")); + + Element rootElement = document.getRootElement(); + List lstAction = rootElement.selectNodes("action"); + Iterator it = lstAction.iterator(); + while (it.hasNext()) { + Element actionElement = (Element) it.next(); + String name = actionElement.attributeValue("name"); + if (name.equals(actionName)) { + String actionClass = actionElement.attributeValue("class"); + Class classType = Class.forName(actionClass); + Object obj = classType.newInstance(); + for (String key : parameters.keySet()) { + String value = parameters.get(key); + String strMethod = getFiledSetMethod(key); + Method setMethod = classType.getMethod(strMethod, String.class); + setMethod.invoke(obj, value); + } + Method excuteMethod = classType.getMethod("execute"); + Object retValue = excuteMethod.invoke(obj); + Node resultNode = actionElement + .selectSingleNode("result[@name='" + retValue.toString() + "']"); + view.setJsp(resultNode.getText()); + Map result = new HashMap (); + + Method msessageMethod = classType.getMethod("getMessage"); + Object message = msessageMethod.invoke(obj); + result.put("message", message.toString()); + view.setParameters(result); + } + } + + /* + * + * 0. ȡļstruts.xml + * + * 1. actionNameҵӦclass LoginAction, ͨʵ + * parametersеݣösetter parametersе ("name"="test" , + * "password"="1234") , ǾӦõ setNamesetPassword + * + * 2. ͨöexectue ÷ֵ"success" + * + * 3. ͨҵgetter getMessage, ͨã ֵγһHashMap , + * {"message": "¼ɹ"} , ŵViewparameters + * + * 4. struts.xmlе ,Լexecuteķֵ ȷһjsp + * ŵViewjspֶС + */ + + return view; + } + + public static String getFiledSetMethod(String filedName) { + String methodName = ""; + methodName = "set" + filedName.toUpperCase().substring(0, 1) + + filedName.substring(1); + return methodName; + } +} \ No newline at end of file diff --git a/group03/619224754/src/com/coderising/litestruts/StrutsTest.java b/group03/619224754/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..319168afbd --- /dev/null +++ b/group03/619224754/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; +import com.coderising.litestruts.View; + + + + +public class StrutsTest { + +// @Test +// public void testLoginActionSuccess() throws Exception { +// +// String actionName = "login"; +// +// Map params = new HashMap(); +// params.put("name","test"); +// params.put("password","1234"); +// +// +// View view = Struts.runAction(actionName,params); +// +// Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); +// Assert.assertEquals("login successful", view.getParameters().get("message")); +// } + + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //ԤIJһ + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git a/group03/619224754/src/com/coderising/litestruts/View.java b/group03/619224754/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..f68a8c438b --- /dev/null +++ b/group03/619224754/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group03/619224754/src/com/coderising/litestruts/struts.xml b/group03/619224754/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group03/619224754/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group03/619224754/src/com/coding/basic/ArrayList.java b/group03/619224754/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..05fc412f93 --- /dev/null +++ b/group03/619224754/src/com/coding/basic/ArrayList.java @@ -0,0 +1,75 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + if(elementData.length == size) { + Object[] arrTaget = new Object[size * 2]; + System.arraycopy(elementData, 0, arrTaget, 0, size); + this.elementData = arrTaget; + } + + elementData[size++] = o; + } + + public void add(int index, Object o){ + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("Index out of bound"); + } + Object[] arrTarget = new Object[size - index]; + System.arraycopy(elementData, index, arrTarget, 0, size - index); + elementData[index] = o; + System.arraycopy(arrTarget, 0, elementData, index + 1, size - index); + } + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + Object retObj = elementData[index]; + + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("Index out of bound"); + } + else if(index == size) { + elementData[index] = null; + } + else { + System.arraycopy(elementData, index + 1, elementData, index, size - index); + } + + size--; + return retObj; + } + + public int size(){ + return this.size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + + private int cursor = 0; + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return this.cursor != size; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + return elementData[this.cursor++]; + } + } + +} diff --git a/group03/619224754/src/com/coding/basic/BinaryTreeNode.java b/group03/619224754/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..58005fb1b4 --- /dev/null +++ b/group03/619224754/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,80 @@ +package com.coding.basic; + +import java.util.Comparator; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + BinaryTreeNode treeNode = new BinaryTreeNode(); + treeNode.data = o; + int intO = Integer.parseInt(o.toString()); + int intData = Integer.parseInt(this.data.toString()); + if(intO > intData){ + if(this.right == null){ + this.right = treeNode; + } + else { + this.right.insert(o); + } + } + else { + if(this.left == null) { + this.left = treeNode; + } + else { + this.left.insert(o); + } + } + return treeNode; + } + + private class MyComparator implements Comparator { + + @Override + public int compare(BinaryTreeNode arg0, BinaryTreeNode arg1) { + // TODO Auto-generated method stub + int int0 = Integer.parseInt(arg0.data.toString()); + int int1 = Integer.parseInt(arg1.data.toString()); + if(int0 > int1) { + return 1; + } + else if(int0 < int1){ + return -1; + } + + return 0; + + } + + + } + +} diff --git a/group03/619224754/src/com/coding/basic/Iterator.java b/group03/619224754/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group03/619224754/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group03/619224754/src/com/coding/basic/LinkedList.java b/group03/619224754/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..8ca8159baf --- /dev/null +++ b/group03/619224754/src/com/coding/basic/LinkedList.java @@ -0,0 +1,182 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o) { + if(head == null) { + head = new Node(); + head.data = o; + } + else { + Node newNode = new Node(); + newNode.data = o; + Node lastNode = head; + while(head.next != null) { + lastNode = head.next; + } + lastNode.next = newNode; + } + } + + public void add(int index , Object o) { + if(index >= this.size()) + throw new IndexOutOfBoundsException("Index out of bound"); + + Node newNode = new Node(); + newNode.data = o; + if(index == 0) { + newNode.next = this.head; + this.head = newNode; + } + else if(index == this.size()) { + Node curNode = this.head; + while(curNode.next != null){ + curNode = curNode.next; + } + curNode.next = newNode; + } + else { + Node beforeNode = this.head; + Node afterNode = null; + for(int i = 1; i < index; i++) { + beforeNode = head.next; + } + afterNode = beforeNode.next; + newNode.next = afterNode; + beforeNode.next = newNode; + } + } + + public Object get(int index){ + Node retNode = this.head; + + if(index < 0){ + throw new IndexOutOfBoundsException("Index out of bound"); + } + + if(index != 0) { + for(int i = 0; i < index; i++) { + retNode = retNode.next; + } + } + + return retNode.data; + } + + public Object remove(int index){ + Node beforeNode = null; + Node afterNode = null; + Node removedNode = null; + if(index == 0) { + removedNode = this.head; + this.head = this.head.next; + } + else { + for(int i = 1; i < index; i++) { + beforeNode = head.next; + } + removedNode = beforeNode.next; + afterNode = removedNode.next; + beforeNode.next = afterNode; + } + + + return removedNode.data; + } + + public int size(){ + int i = 0; + if(this.head == null) + return 0; + + Node curNode = this.head; + while(curNode != null){ + curNode = curNode.next; + i++; + } + return i; + } + + public void addFirst(Object o){ + Node firstNode = new Node(); + firstNode.data = o; + firstNode.next = this.head; + this.head = firstNode; + } + + public void addLast(Object o){ + Node newNode = new Node(); + newNode.data = o; + if(this.size() == 0){ + this.head = newNode; + } + + Node curNode = this.head; + while(curNode.next != null) { + curNode = curNode.next; + } + curNode.next = newNode; + } + + public Object removeFirst() { + Node retNode = this.head; + this.head = this.head.next; + + return retNode; + } + + public Object removeLast() { + Node curNode = null; + if(this.size() == 0) { + curNode = null; + } + else if(this.size() == 1) { + curNode = this.head; + this.head = null; + return curNode; + } + else { + Node beforeNode = this.head; + for (int i = 1; i < this.size() - 1; i++) { + beforeNode = beforeNode.next; + } + curNode = beforeNode.next; + beforeNode.next = null; + } + + return curNode; + } + + public Iterator iterator(){ + return null; + } + + private class LinkedListIterator implements Iterator { + + private Node curNode = head; + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return this.curNode.next != null; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + return this.curNode.next; + } + + + + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group03/619224754/src/com/coding/basic/List.java b/group03/619224754/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group03/619224754/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group03/619224754/src/com/coding/basic/Queue.java b/group03/619224754/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..de53482312 --- /dev/null +++ b/group03/619224754/src/com/coding/basic/Queue.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList list = new LinkedList(); + + public void enQueue(Object o){ + list.addLast(o); + } + + public Object deQueue(){ + Object ret = list.removeFirst(); + return ret; + } + + public boolean isEmpty(){ + return list.size() == 0; + } + + public int size(){ + return list.size(); + } +} diff --git a/group03/619224754/src/com/coding/basic/Stack.java b/group03/619224754/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..cf10ecc1b3 --- /dev/null +++ b/group03/619224754/src/com/coding/basic/Stack.java @@ -0,0 +1,25 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + this.elementData.add(o); + } + + public Object pop(){ + Object ret = this.elementData.remove(this.elementData.size() - 1); + return ret; + } + + public Object peek(){ + Object ret = this.elementData.get(this.elementData.size() - 1); + return null; + } + public boolean isEmpty(){ + return this.elementData.size() == 0; + } + public int size(){ + return this.elementData.size(); + } +} diff --git a/group03/619224754/src/test/ArrayListTest.java b/group03/619224754/src/test/ArrayListTest.java new file mode 100644 index 0000000000..9d9e014379 --- /dev/null +++ b/group03/619224754/src/test/ArrayListTest.java @@ -0,0 +1,62 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Test; + +import com.coding.basic.ArrayList; +import com.coding.basic.Iterator; + + + +public class ArrayListTest { + + @Test + public void testAdd() { + ArrayList array = new ArrayList(); + for (int i = 0; i < 105; i++) { + array.add(i); + } + + Assert.assertEquals("Shoule be the same", 105, array.size()); + } + + @Test + public void testAddIndex() { + ArrayList array = new ArrayList(); + for (int i = 0; i < 105; i++) { + array.add(i); + } + + array.add(100, 100); + Assert.assertEquals("Shoule be the same", 100, array.get(100)); + Assert.assertEquals("Shoule be the same", 100, array.get(101)); + } + + @Test + public void testRemove() { + ArrayList array = new ArrayList(); + for (int i = 0; i < 105; i++) { + array.add(i); + } + + Assert.assertEquals("Shoule be the same", 100, array.remove(100)); + Assert.assertEquals("Shoule be the same", 104, array.size()); + } + + @Test + public void testIterator() { + ArrayList array = new ArrayList(); + for (int i = 0; i < 105; i++) { + array.add(i); + } + Iterator iterator = array.iterator(); + int j = 0; + while(iterator.hasNext()){ + Assert.assertEquals("Shoule be the same", iterator.next(), array.get(j)); + j++; + } + } + +} diff --git a/group03/619224754/src/test/BinaryTreeNodeTest.java b/group03/619224754/src/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..24d76fa271 --- /dev/null +++ b/group03/619224754/src/test/BinaryTreeNodeTest.java @@ -0,0 +1,25 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Test; + +import com.coding.basic.BinaryTreeNode; + +public class BinaryTreeNodeTest { + + @Test + public void test() { + BinaryTreeNode rootNode = new BinaryTreeNode(); + rootNode.setData(6); + rootNode.insert(5); + rootNode.insert(9); + rootNode.insert(7); + + Assert.assertEquals("Shoule be the same", 5, rootNode.getLeft().getData()); + Assert.assertEquals("Shoule be the same", 9, rootNode.getRight().getData()); + Assert.assertEquals("Shoule be the same", 7, rootNode.getRight().getLeft().getData()); + } + +} diff --git a/group03/619224754/src/test/LinkedListTest.java b/group03/619224754/src/test/LinkedListTest.java new file mode 100644 index 0000000000..30727bbc1c --- /dev/null +++ b/group03/619224754/src/test/LinkedListTest.java @@ -0,0 +1,103 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Test; + +import com.coding.basic.Iterator; +import com.coding.basic.LinkedList; + +public class LinkedListTest { + + private LinkedList list = new LinkedList(); + + @Test + public void testAddObject() { + list.add(1); + list.add(2); + Assert.assertEquals("Test", 1, list.get(0)); + Assert.assertEquals("Test", 2, list.get(1)); + } + + @Test + public void testAddIntObject() { + list.add(1); + list.add(2); + list.add(1, 2); + list.add(1, 4); + Assert.assertEquals("Test", 4, list.get(1)); + Assert.assertEquals("Test", 2, list.get(2)); + } + + @Test + public void testGet() { + list.add(1); + list.add(2); + Assert.assertEquals("Test", 1, list.get(0)); + Assert.assertEquals("Test", 2, list.get(1)); + } + + @Test + public void testRemove() { + list.add(1); + list.add(2); + list.remove(0); + Assert.assertEquals("Test", 2, list.get(0)); + } + + @Test + public void testSize() { + list.add(1); + list.add(2); + list.remove(0); + Assert.assertEquals("Test", 1, list.size()); + } + + @Test + public void testAddFirst() { + list.add(1); + list.add(2); + list.addFirst(3); + Assert.assertEquals("Test", 3, list.get(0)); + } + + @Test + public void testAddLast() { + list.add(1); + list.add(2); + list.addLast(3); + Assert.assertEquals("Test", 3, list.get(2)); + } + + @Test + public void testRemoveFirst() { + list.add(1); + list.add(2); + list.removeFirst(); + Assert.assertEquals("Test", 2, list.get(0)); + } + + @Test + public void testRemoveLast() { + list.add(1); + list.add(2); + list.removeLast(); + Assert.assertEquals("Test", 1, list.size()); + } + + @Test + public void testIterator() { + int i = 0; + for (i = 0; i < 3; i++) { + list.add(i); + } + + Iterator iterator = list.iterator(); + i = 0; + while(iterator.hasNext()) { + Assert.assertEquals("Shoule be the same", i, iterator.next()); + } + } + +} diff --git a/group03/664269713/DataStructure/.gitignore b/group03/664269713/DataStructure/.gitignore new file mode 100644 index 0000000000..fb921cf6e9 --- /dev/null +++ b/group03/664269713/DataStructure/.gitignore @@ -0,0 +1,3 @@ +/bin/ +/.classpath +/.project \ No newline at end of file diff --git a/group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java b/group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java new file mode 100644 index 0000000000..0af37b9d4e --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java @@ -0,0 +1,101 @@ +package com.ace.coding; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + checkArrayLength(); + elementData[size++] = o; + } + + private void checkArrayLength(){ + if(elementData.length < size() + 1){ + // expand the origin length of the array + int newLength = size * 2 + 1; + elementData = Arrays.copyOf(elementData, newLength); + } + } + + private void checkIndex(int index){ + if(index < 0 || index >= size()){ + throw new IndexOutOfBoundsException("Index " + index + " is invalid."); + } + } + + public void add(int index, Object o){ + checkIndex(index); + checkArrayLength(); + System.arraycopy(elementData, index, elementData, index+1, size() - index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + checkIndex(index); + return elementData[index]; + } + + public Object remove(int index){ + checkIndex(index); + Object obj = elementData[index]; + if(index == size() - 1){ + elementData[index] = null; + } else { + System.arraycopy(elementData, index + 1, elementData, index, size() - index - 1); + } + size--; + return obj; + } + + public int size(){ + return size; + } + + public boolean contains(Object o){ + for (int i = 0; i < elementData.length; i++) { + if(elementData[i] == o){ + return true; + } + } + return false; + } + + public Iterator iterator(){ + return null; +// return new ListIterator(); + } + + public int[] listToArray(ArrayList arrayList){ + int[] newArray = new int[arrayList.size()]; + for (int k = 0; k < newArray.length; k++) { + newArray[k] = (int)arrayList.get(k); + } + return newArray; + } + + /*private class ListIterator implements Iterator{ + private int index = 0; + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return index != size; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + if(index >= size){ + throw new IndexOutOfBoundsException("There's no next element."); + } + return elementData[index++]; + } + + }*/ + +} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/BinaryTreeNode.java b/group03/664269713/DataStructure/src/com/ace/coding/BinaryTreeNode.java new file mode 100644 index 0000000000..e6253b221c --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/coding/BinaryTreeNode.java @@ -0,0 +1,61 @@ +package com.ace.coding; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode rootNode; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + BinaryTreeNode newNode = new BinaryTreeNode(); + newNode.setData(o); + + if(rootNode == null){ + rootNode = newNode; + rootNode.data = data; + left = null; + right = null; + } else { + BinaryTreeNode currentNode = rootNode; + while(true){ + BinaryTreeNode pNode = currentNode; + if((int)newNode.getData() > (int)currentNode.getData()){ + currentNode = currentNode.right; + if(currentNode.right == null){ + pNode.right = newNode; + return newNode; + } + } else { + currentNode = currentNode.left; + if(currentNode.left == null){ + pNode.left = newNode; + return newNode; + } + } + } + + } + return newNode; + } + +} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/Iterator.java b/group03/664269713/DataStructure/src/com/ace/coding/Iterator.java new file mode 100644 index 0000000000..09c5442076 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/coding/Iterator.java @@ -0,0 +1,7 @@ +package com.ace.coding; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/LinkedList.java b/group03/664269713/DataStructure/src/com/ace/coding/LinkedList.java new file mode 100644 index 0000000000..351a6a8277 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/coding/LinkedList.java @@ -0,0 +1,123 @@ +package com.ace.coding; + +public class LinkedList implements List { + private Node head = null; + private int size = 0; + + public void add(Object o){ + Node newNode = new Node(); + newNode.data = o; + if(head == null){ + head = newNode; + } else { + Node pNode = head; + while(pNode.next != null){ + pNode = pNode.next; + } + pNode.next = newNode; + } + size++; + } + + public void add(int index , Object o){ + checkLinkedListIndex(index); + + Node newNode = new Node(); + newNode.data = o; + Node pNode = getNode(index); + newNode.next = pNode.next; + pNode.next = newNode; + + size++; + } + + private Node getNode(int index){ + Node pNode = head; + for(int i = 0; i < index; i++){ + pNode = pNode.next; + } + return pNode; + } + + public Object get(int index){ + Node pNode = getNode(index); + return pNode.data; + } + public Object remove(int index){ + checkLinkedListIndex(index); + + Node pNode = head; + for(int i = 0; i < index - 1; i++){ + pNode = pNode.next; + } + Node tempNode = getNode(index); + pNode.next = tempNode.next; + size--; + return tempNode.data; + } + + + public void addFirst(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = head; + head = newNode; + size++; + } + public void addLast(Object o){ + Node newNode = new Node(); + newNode.data = o; + Node pNode = getNode(size() - 1); + pNode.next = newNode; + size++; + } + public Object removeFirst(){ + Node pNode = head; + head = pNode.next; + size--; + return pNode.data; + } + public Object removeLast(){ + Object obj = remove(size() - 1); + return obj; + } + + public int size(){ + return size; + } + + private void checkLinkedListIndex(int index){ + if(index < 0 || index >= size()){ + throw new IndexOutOfBoundsException("The index " + index + " is invalid."); + } + } + + public Iterator iterator(){ + return null; +// return new ListIterator(); + } + + /*private class ListIterator implements Iterator{ + private Node pNode = head; + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return pNode.next != null; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + Object obj = pNode.data; + pNode = pNode.next; + return obj; + } + + }*/ + + private static class Node{ + Object data; + Node next; + } +} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/List.java b/group03/664269713/DataStructure/src/com/ace/coding/List.java new file mode 100644 index 0000000000..33bddf1899 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/coding/List.java @@ -0,0 +1,9 @@ +package com.ace.coding; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/Queue.java b/group03/664269713/DataStructure/src/com/ace/coding/Queue.java new file mode 100644 index 0000000000..15bcf5d497 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/coding/Queue.java @@ -0,0 +1,27 @@ +package com.ace.coding; + +public class Queue { + private ArrayList arrayList = new ArrayList(); + private int size = 0; + + public void enQueue(Object data){ + arrayList.add(size(), data); + size++; + } + + public Object deQueue(){ + if(isEmpty()){ + throw new IndexOutOfBoundsException("The Queue is Empty."); + } + size--; + return arrayList.remove(0); + } + + public boolean isEmpty(){ + return size()>0; + } + + public int size(){ + return size; + } +} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/Stack.java b/group03/664269713/DataStructure/src/com/ace/coding/Stack.java new file mode 100644 index 0000000000..4ef1f68084 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/coding/Stack.java @@ -0,0 +1,36 @@ +package com.ace.coding; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size = 0; + + public void push(Object o){ + elementData.add(o); + size++; + } + + public Object pop(){ + checkStack(); + Object obj = elementData.remove(size()-1); + size--; + return obj; + } + + public Object peek(){ + checkStack(); + return elementData.get(size()-1); + } + + private void checkStack(){ + if(isEmpty()){ + throw new IndexOutOfBoundsException("This stack is empty"); + } + } + + public boolean isEmpty(){ + return size == 0; + } + public int size(){ + return size; + } +} diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtil.java b/group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtil.java new file mode 100644 index 0000000000..63b2fb0866 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtil.java @@ -0,0 +1,223 @@ +package com.ace.homework2; + +import java.util.Arrays; + +import com.ace.coding.ArrayList; + +public class ArrayUtil { + /** + * һa , Ըֵû + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + for(int i = 0; i < origin.length/2; i++){ + int temp = origin[i]; + origin[i] = origin[origin.length - 1 - i]; + origin[origin.length - 1 - i] = temp; + } + + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int newLength = 0; + for(int i:oldArray){ + if(i != 0){ + newLength++; + } + } + int[] newArray = new int[newLength]; + int newArrayIndex = 0; + for(int j = 0; j < oldArray.length; j++){ + if(oldArray[j] != 0){ + newArray[newArrayIndex] = oldArray[j]; + newArrayIndex++; + } + } + return newArray; + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ + * a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + ArrayList arrayList = new ArrayList(); + for (int i = 0; i < array1.length; i++) { + arrayList.add(array1[i]); + } + for (int j = 0; j < array2.length; j++) { + if(!arrayList.contains(array2[j])){ + arrayList.add(array2[j]); + } + } + int[] newArray = new int[arrayList.size()]; + for (int k = 0; k < newArray.length; k++) { + newArray[k] = (int)arrayList.get(k); + } + Arrays.sort(newArray); + return newArray; + } + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ + * oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int newLength = oldArray.length + size; + int[] newArray = new int[newLength]; + for(int i = 0; i < newLength; i++){ + if(i < oldArray.length){ + newArray[i] = oldArray[i]; + } else { + newArray[i] = 0; + } + } + return newArray; + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ + * 磬 max = 15 , 򷵻صӦΪ [11235813] + * max = 1, 򷵻ؿ [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int num = 1; + ArrayList arrayList = new ArrayList(); + while(getFibonacci(num) < max){ + arrayList.add(getFibonacci(num)); + num++; + } + int[] newArray = toArray(arrayList); + return newArray; + } + + private int getFibonacci(int num){ + if(num == 1){ + return 1; + } else if(num == 2){ + return 1; + } else { + return getFibonacci(num-1) + getFibonacci(num-2); + } + } + + + /** + * Сڸֵmax + * max = 23, صΪ[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + ArrayList arrayList = new ArrayList(); + arrayList.add(2); + for(int i = 3; i <= max; i++){ + int temp = (int)Math.sqrt(i)+1; + for(int j = 2; j <= temp; j++){ + if(i % j ==0){ + break; + } + if(j == temp){ + arrayList.add(i); + } + } + } + int[] newArray = toArray(arrayList); + return newArray; + } + + + + /** + * ν ָǡõ֮ͣ6=1+2+3 + * һֵmax һ飬 Сmax + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + ArrayList arrayList = new ArrayList(); + for (int i = 2; i <= max; i++) { + if(getPerfectNumber(i)){ + arrayList.add(i); + } + } + int[] newArray = toArray(arrayList); + return newArray; + } + + public boolean getPerfectNumber(int num){ + ArrayList arrayList = new ArrayList(); + for(int i = 1; i <= num/2 ; i++){ + if(num % i == 0){ + arrayList.add(i); + } + } + int sum = 0; + for(int j = 0; j < arrayList.size(); j++){ + sum = sum + (int)arrayList.get(j); + } + return sum == num; + } + + + /** + * seperator array + * array= [3,8,9], seperator = "-" + * 򷵻ֵΪ"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder stringBuilder = new StringBuilder(); + for(int i = 0; i < array.length; i++){ + if(i ,Լexecuteķֵ ȷһjsp ŵViewjspֶС + */ + private static final String STRUTS_XML = "struts.xml"; + private static final String NAME = "name"; + private static final String CLASS = "class"; + private static final String EXECUTE = "execute"; + private static final String GET = "get"; + private static final String SET = "set"; + + private static List getStrutsList() { + List strutsObjList = new ArrayList(); + URL path = Struts.class.getResource(STRUTS_XML); + File f = new File(path.getFile()); + SAXReader saxReader = new SAXReader(); + try { + Document document = saxReader.read(f); + Element strutsNode = document.getRootElement(); + Iterator actionIterator = strutsNode.elementIterator(); + while (actionIterator.hasNext()) { + Element actionNode = (Element) actionIterator.next(); + StrutsObj strutsObj = new StrutsObj(); + strutsObj.setName(actionNode.attributeValue(NAME)); + strutsObj.setClassName(actionNode.attributeValue(CLASS)); + + Iterator resultIterator = actionNode.elementIterator(); + Map map = new HashMap(); + while (resultIterator.hasNext()) { + Element resultNode = (Element) resultIterator.next(); + map.put(resultNode.attributeValue(NAME), resultNode.getStringValue()); + } + strutsObj.setMap(map); + strutsObjList.add(strutsObj); + } + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return strutsObjList; + }; + + public static View runAction(String actionName, Map parameters) { + List lists = getStrutsList(); + View view = new View(); + for (int i = 0; i < lists.size(); i++) { + StrutsObj strutsObj = lists.get(i); + + if (actionName.equals(strutsObj.getName())) { + + try { + Class clazz = Class.forName(lists.get(i).getClassName()); + Object obj = clazz.newInstance(); + for (Map.Entry entry : parameters.entrySet()) { + String methodName = SET + entry.getKey().substring(0, 1).toUpperCase() + + entry.getKey().substring(1); + clazz.getMethod(methodName, String.class).invoke(obj, entry.getValue()); + } + + String status = (String) clazz.getMethod(EXECUTE).invoke(obj); + Map strutsMap = strutsObj.getMap(); + for (Map.Entry entry : strutsMap.entrySet()) { + if (entry.getKey().equals(status)) { + view.setJsp(entry.getValue()); + break; + } + } + + Map map = new HashMap(); + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().startsWith(GET)) { + String tempString = method.getName().substring(3); + String resultkey = tempString.substring(0, 1).toLowerCase() + tempString.substring(1); + String resultValue = (String) method.invoke(obj); + map.put(resultkey, resultValue); + break; + } + + } + view.setParameters(map); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchMethodException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + return view; + } + /*URL path = Struts.class.getResource(STRUTS_XML); + File f = new File(path.getFile()); + SAXReader saxReader = new SAXReader(); + View view = new View(); + try { + Document document = saxReader.read(f); + Element strutsNode = document.getRootElement(); + Iterator actionIterator = strutsNode.elementIterator(); + while(actionIterator.hasNext()){ + Element actionNode = (Element)actionIterator.next(); + + if(actionName.equals(actionNode.attributeValue("name"))){ + String className = actionNode.attributeValue("class"); + Class clazz = Class.forName(className); + LoginAction loginAction = (LoginAction) clazz.newInstance(); + for(Map.Entry entry:parameters.entrySet()){ + String methodName = "set" + entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1); + clazz.getMethod(methodName, String.class).invoke(loginAction, entry.getValue()); + } + + String status = (String) clazz.getMethod("execute").invoke(loginAction); + + Map map = new HashMap(); + + Method[] methods = clazz.getDeclaredMethods(); + for(Method method: methods){ + if(method.getName().startsWith("get")){ + String tempString = method.getName().substring(3); + String resultkey = tempString.substring(0, 1).toLowerCase() + tempString.substring(1); + String resultValue = (String)method.invoke(loginAction); + map.put(resultkey, resultValue); + } + + } + + view.setParameters(map); + Iterator resultIterator = actionNode.elementIterator(); + while(resultIterator.hasNext()){ + Element resultNode = (Element) resultIterator.next(); + if(status.equals(resultNode.attributeValue("name"))){ + view.setJsp(resultNode.getStringValue()); + return view; + } + } + } + } + } catch (DocumentException e) { + System.out.println(e.getMessage()); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchMethodException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }*/ + +} \ No newline at end of file diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/StrutsObj.java b/group03/664269713/DataStructure/src/com/ace/homework2/StrutsObj.java new file mode 100644 index 0000000000..f1db3ed2f8 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/homework2/StrutsObj.java @@ -0,0 +1,29 @@ +package com.ace.homework2; + +import java.util.Map; + +public class StrutsObj { + private String name; + private String className; + private Map map; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getClassName() { + return className; + } + public void setClassName(String className) { + this.className = className; + } + public Map getMap() { + return map; + } + public void setMap(Map map) { + this.map = map; + } + +} diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/View.java b/group03/664269713/DataStructure/src/com/ace/homework2/View.java new file mode 100644 index 0000000000..33304451d1 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/homework2/View.java @@ -0,0 +1,23 @@ +package com.ace.homework2; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group03/664269713/DataStructure/src/com/ace/homework2/struts.xml b/group03/664269713/DataStructure/src/com/ace/homework2/struts.xml new file mode 100644 index 0000000000..7f4ca75bb3 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/homework2/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group03/763878069/.classpath b/group03/763878069/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group03/763878069/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group03/763878069/.gitignore b/group03/763878069/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group03/763878069/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group03/763878069/.project b/group03/763878069/.project new file mode 100644 index 0000000000..14ea6baea5 --- /dev/null +++ b/group03/763878069/.project @@ -0,0 +1,17 @@ + + + SimpleDataStructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group03/763878069/src/cmj/datastructure/list/ArrayList.java b/group03/763878069/src/cmj/datastructure/list/ArrayList.java new file mode 100644 index 0000000000..21286512d0 --- /dev/null +++ b/group03/763878069/src/cmj/datastructure/list/ArrayList.java @@ -0,0 +1,154 @@ +package cmj.datastructure.list; + +import java.util.Arrays; +import java.util.Collection; + +public class ArrayList implements List { + private transient Object[] elementData; + private int size; + + /** + * ArrayList初始化无参数构造函数 + */ + public ArrayList() { + this(10); + } + + /** + * ArrayList带容量的构造函数 + * + * @param initialCapacity初始化容量 + */ + public ArrayList(int initialCapacity) { + super(); + if (initialCapacity < 0) + throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); + // 新建一个数组 + this.elementData = new Object[initialCapacity]; + } + + /** + * 检查数组的容量 + * + * @param neededMinCapacity所需最小的容量 + */ + public void ensureCapacity(int neededMinCapacity) { + int currCapacity = elementData.length;// 获取当前数据的全部容量 + // 需要扩容的情况 + if (neededMinCapacity > currCapacity) { + int newCapacity = (currCapacity * 3) / 2 + 1;// 计算新的容量 + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + /** + * 添加数据 + * + * @param o要添加的元素 + * @return 是否添加成功 + */ + public void add(Object o) { + // 确定ArrayList的容量大小 + ensureCapacity(size + 1); // Increments modCount!! + // 添加o到ArrayList中 + elementData[size++] = o; + } + + /** + * 就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。 + * + * @param index要用于检查的索引 + */ + private void RangeCheck(int index) { + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + " 超出访问范围"); + } + + /** + * 向指定的位置添加元素 + * + * @param index + * @param o + */ + public void add(int index, Object o) { + RangeCheck(index); + ensureCapacity(size + 1);// 检查容量 + + /* 将原数组从第index个位置复制到原数组第index+1个位置上,一共移动size-index(也就是后面剩下的)个元素 */ + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public boolean addAll(Collection c) { + Object[] a = c.toArray(); + int growthNum = a.length; + ensureCapacity(size + growthNum); // Increments modCount + System.arraycopy(a, 0, elementData, size, growthNum); + size += growthNum; + return growthNum != 0; + } + + public Object get(int index) { + RangeCheck(index); + return elementData[index]; + + } + + public Object remove(int index) { + RangeCheck(index); + int numMoved = size - index - 1;// 删除后需要移动的对象 + Object RemovedValue = elementData[index]; + if (numMoved > 0) + System.arraycopy(elementData, index + 1, elementData, index, numMoved); + elementData[--size] = null; + return RemovedValue; + } + + public int size() { + return size; + } + + @Override + public String toString() { + String arraylist = "["; + for (int i = 0; i < size; i++) { + if (i == size - 1) { + arraylist += elementData[i].toString() + "]"; + } else { + arraylist += elementData[i].toString() + " ,"; + } + } + return arraylist; + } + + public static void main(String[] args) { + ArrayList arrayList = new ArrayList(5); + arrayList.add(1); + arrayList.add(2); + arrayList.add(3); + arrayList.add(4); + arrayList.add(5); + arrayList.add(6); + System.out.println(arrayList); + arrayList.add(1, 1234); + System.out.println(arrayList); + arrayList.remove(1); + System.out.println(arrayList); + System.out.println(arrayList.get(5)); + + ArrayList stringArraylist = new ArrayList(3); + stringArraylist.add("Hello "); + stringArraylist.add("string "); + stringArraylist.add("arraylist"); + System.out.println(stringArraylist); + + ArrayList mixArraylist = new ArrayList(5); + mixArraylist.add("String"); + mixArraylist.add(1); + mixArraylist.add('f'); + mixArraylist.add(3.1f); + mixArraylist.add(4L); + System.out.println(mixArraylist); + } +} diff --git a/group03/763878069/src/cmj/datastructure/list/LinkedList.java b/group03/763878069/src/cmj/datastructure/list/LinkedList.java new file mode 100644 index 0000000000..c36197b360 --- /dev/null +++ b/group03/763878069/src/cmj/datastructure/list/LinkedList.java @@ -0,0 +1,208 @@ +package cmj.datastructure.list; + +public class LinkedList implements List { + + private Node head;// 头结点 + private Node current;// 尾结点 + private int size; + + public LinkedList() { + // 头指针和尾指针都指向头结点 + head = new Node(null, null); + current = head; + } + + /** + * 添加元素 + * + * @param o——用于添加的元素 + */ + public void add(Object o) { + Node node = new Node(o, null);// 新建一个结点 + current.next = node;// 尾指针指向它 + current = current.next;// 尾指针指向最后一个元素 + size++; + } + + /** + * 在第index个位置插入元素 + * + * @param index——要插入的位置 + * @param o——用于插入的对象 + */ + public void add(int index, Object o) { + Node node = new Node(o, null);// 新建一个结点 + if (index == 0) { + addFirst(o); + } else { + Node curr = (Node) this.get(index - 1);// 获得前一个结点 + Node behind = (Node) this.get(index);// 获得后一个结点 + // 在这两个结点之间插入新的元素,修改引用指向 + curr.next = node; + node.next = behind; + size++; + } + + } + + /** + * 随机访问index位置上的元素 + * + * @param index——元素的位置 + * @return——对应的元素 + */ + public Object get(int index) { + RangeCheck(index);// 检查索引是否越界 + Node curr = head;// 得到头结点的引用 + // 从头结点开始遍历到第index个元素 + for (int i = 0; i <= index; i++) + curr = curr.next; + return curr; + } + + /** + * 删除第index个位置上的元素 + * + * @param index + * @return + */ + public Object remove(int index) { + RangeCheck(index);// 检查索引是否越界 + if (0 == index) { + return removeFirst(); + } else { + Node toRemove = (Node) this.get(index);// 获得要删除的结点 + Node preRemove = (Node) this.get(index - 1);// 获得前一个结点 + preRemove.next = toRemove.next;// 将前一个结点指向要删除的结点的下一个结点 + size--; + return toRemove; + } + + } + + /** + * 获取元素的大小 + * + * @return + */ + public int size() { + return size; + } + + /** + * 在链表头部增加元素 + * + * @param o——要增加的元素 + */ + public void addFirst(Object o) { + Node node = new Node(o, null);// 新建一个结点 + node.next = head.next;// 结点指向第一个元素 + head.next = node;// 将头结点指向它 + size++; + } + + /** + * 在链表末尾添加元素 + * + * @param o——要添加的元素 + */ + public void addLast(Object o) { + Node node = new Node(o, null);// 新建一个结点 + current.next.next = node;// 尾结点的next指向新建的结点 + current.next = node;// 尾结点引用指向向新结点 + size++; + } + + /** + * 移除第一个元素 + * + * @return——移除元素 + */ + public Object removeFirst() { + Node curr = head.next;// 新建一个引用记录第一个结点 + head.next = curr.next;// 头指针移动到原第二个元素上 + size--; + return curr; + } + + /** + * 移除最后一个元素 + * + * @return——移除元素 + */ + public Object removeLast() { + Node remove = current.next; + Node pre = (Node) this.get(size - 2);// 获得倒数第二个结点 + current.next = pre; + pre.next = null; + size--; + return remove; + } + + /** + * 就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。 + * + * @param index要用于检查的索引 + */ + private void RangeCheck(int index) { + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + " 超出访问范围"); + } + + /** + * 重写toString()方法 + */ + @Override + public String toString() { + String linkedlist = "["; + Node visit = head; + while (visit.next != null) { + visit = visit.next; + if (visit.next == null) { + linkedlist += visit.data.toString() + "]"; + } else { + linkedlist += visit.data.toString() + "--->"; + } + } + return linkedlist; + } + + /** + * 结点内部类,主要要声明为static的 + * + * @author think + * + */ + private static class Node { + Object data; + Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + } + + public static void main(String[] args) { + LinkedList list = new LinkedList(); + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + System.out.println(list); + System.out.println(((Node) list.get(3)).data); + list.add(4, "4"); + System.out.println(list); + list.add(0, "0"); + System.out.println(list); + list.addLast("last"); + System.out.println(list); + System.out.println("Removed:" + ((Node) list.remove(1)).data); + System.out.println(list); + System.out.println("Removed:" + ((Node) list.removeFirst()).data); + System.out.println(list); + System.out.println("Removed:" + ((Node) list.removeLast()).data); + System.out.println(list); + } +} diff --git a/group03/763878069/src/cmj/datastructure/list/List.java b/group03/763878069/src/cmj/datastructure/list/List.java new file mode 100644 index 0000000000..8e58ed10f4 --- /dev/null +++ b/group03/763878069/src/cmj/datastructure/list/List.java @@ -0,0 +1,13 @@ +package cmj.datastructure.list; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} \ No newline at end of file diff --git a/group03/763878069/src/cmj/datastructure/list/Queue.java b/group03/763878069/src/cmj/datastructure/list/Queue.java new file mode 100644 index 0000000000..88d8a32e38 --- /dev/null +++ b/group03/763878069/src/cmj/datastructure/list/Queue.java @@ -0,0 +1,128 @@ +package cmj.datastructure.list; + +import java.util.Arrays; + +public class Queue { + + private transient Object[] elementData; + private int size; + + /** 数组的头部,即 下次删除数据的 index */ + private int head; + /** 数组的尾部,即 下次插入数据的 index */ + private int tail; + + /** + * Queue 初始化无参数构造函数 + */ + public Queue() { + this(10); + } + + /** + * Queue带容量的构造函数 + * + * @param initialCapacity初始化容量 + */ + public Queue(int initialCapacity) { + super(); + if (initialCapacity < 0) + throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); + // 新建一个数组 + this.elementData = new Object[initialCapacity]; + this.head = 0; + this.tail = 0; + this.size = 0; + + } + + /** + * 检查数组的容量 + * + * @param neededMinCapacity所需最小的容量 + */ + public void ensureCapacity(int neededMinCapacity) { + int currCapacity = elementData.length;// 获取当前数据的全部容量 + // 需要扩容的情况 + if (neededMinCapacity > currCapacity) { + int newCapacity = (currCapacity * 3) / 2 + 1;// 计算新的容量 + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + /** + * 添加数据到尾部 + * + * @param o——要添加的数据 + */ + public void enQueue(Object o) { + // 确定ArrayList的容量大小 + ensureCapacity(size + 1); // Increments modCount!! + // 添加o到ArrayList中 + elementData[tail] = o; + size++; + tail++; + } + + /** + * 删除数据 从头部 + * + * @return——被删除的数据 + */ + public Object deQueue() { + if (isEmpty()) { + throw new RuntimeException("队列为空"); + } + Object deleted = (Object) elementData[head]; + elementData[head] = null; + size--; + head++; + return deleted; + } + + public boolean isEmpty() { + return size <= 0 ? true : false; + } + + public int size() { + return size; + } + + @Override + public String toString() { + if (isEmpty()) { + return "[空队列]"; + } + String arraylist = "["; + for (int i = head; i < tail; i++) { + if (i == tail - 1) { + arraylist += elementData[i].toString() + "]"; + } else { + arraylist += elementData[i].toString() + "--->"; + } + } + return arraylist; + } + + public static void main(String[] args) { + Queue queue = new Queue(4); + queue.enQueue("one"); + queue.enQueue("two"); + queue.enQueue("three"); + queue.enQueue("four"); + queue.enQueue("five"); + System.out.println(queue); + queue.deQueue(); + System.out.println(queue); + queue.deQueue(); + System.out.println(queue); + queue.deQueue(); + System.out.println(queue); + queue.deQueue(); + System.out.println(queue); + queue.deQueue(); + System.out.println(queue); + + } + +} \ No newline at end of file diff --git a/group03/763878069/src/cmj/datastructure/list/Stack.java b/group03/763878069/src/cmj/datastructure/list/Stack.java new file mode 100644 index 0000000000..bc16af0203 --- /dev/null +++ b/group03/763878069/src/cmj/datastructure/list/Stack.java @@ -0,0 +1,58 @@ +package cmj.datastructure.list; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + private int size; + + public void push(Object o) { + elementData.add(o); + size++; + } + + public Object pop() { + Object pop = elementData.get(elementData.size()); + elementData.remove(size - 1); + size--; + return pop; + } + + public Object peek() { + if (size == 0) { + throw new RuntimeException("栈为空"); + } + return elementData.get(size - 1); + } + + public boolean isEmpty() { + return size <= 0 ? true : false; + } + + public int size() { + return size; + } + + @Override + public String toString() { + return "Stack [elementData=" + elementData + ", size=" + size + "]"; + } + + public static void main(String[] args) { + Stack stack = new Stack(); + stack.push("a"); + stack.push("b"); + stack.push("c"); + stack.push("d"); + stack.push("e"); + System.out.println(stack); + + stack.pop(); + System.out.println(stack); + stack.pop(); + System.out.println(stack); + stack.pop(); + System.out.println(stack); + + } + +} \ No newline at end of file diff --git a/group03/763878069/src/cmj/datastructure/tree/BSTree.java b/group03/763878069/src/cmj/datastructure/tree/BSTree.java new file mode 100644 index 0000000000..25a822a1a1 --- /dev/null +++ b/group03/763878069/src/cmj/datastructure/tree/BSTree.java @@ -0,0 +1,191 @@ +package cmj.datastructure.tree; + +/** + * 二叉搜索树 + * + * @author think + * + */ +public class BSTree { + private Node root;// 根结点 + + public BSTree() { + root = null; + } + + public void insert(Node node, int data) { + if (null == root) { + root = new Node(data); + } else { + if (data < node.data) { + if (null == node.left) { + + node.left = new Node(data); + } else { + insert(node.left, data); + } + } else { + if (node.right == null) { + node.right = new Node(data); + } else { + insert(node.right, data); + } + } + } + } + + /** + * 前序遍历 + * + * @param node + */ + public void preOrder(Node node) { + if (node != null) { + System.out.println(node.data); + preOrder(node.left); + preOrder(node.right); + } + } + + /** + * 中序遍历 + * + * @param node + */ + public void inOrder(Node node) { + if (node != null) { + inOrder(node.left); + System.out.println(node.data); + inOrder(node.right); + } + } + + /** + * 后序遍历 + * + * @param node + */ + public void postOrder(Node node) { + if (node != null) { + postOrder(node.left); + postOrder(node.right); + System.out.println(node.data); + } + } + + // 删除节点分三种方式删除节点 + // 1、删除没有子节点的节点,直接让该节点的父节点的左节点或右节点指向空 + // 2、删除有一个子节点的节点,直接让该节点的父节点指向被删除节点的剩余节点 + // 3、删除有三个节点的子节点,找到要删除节点的后继节点, 用该节点替代删除的节点 + public boolean delete(int data) { + // 首先查找节点,并记录该节点的父节点引用 + Node current = root; + Node parent = root; + boolean isLeftNode = true; + while (current.data != data) { + parent = current; + if (data < current.data) { + isLeftNode = true; + current = current.left; + } else { + isLeftNode = false; + current = current.right; + } + } + if (current == null) { + System.out.println("没有找到要删除的节点!"); + return false; + } + // 下面分三种情况删除节点 + if (current.left == null && current.right == null) { // 要删除的节点没有子节点 + if (current == root) { // 根节点就删除整棵树 + root = null; + } else if (isLeftNode) { // 如果是左节点,做节点指向空 + parent.left = null; + } else { // 如果是右节点,右节点指向空 + parent.right = null; + } + } else if (current.left == null) { // 要删除的节点只有右节点 + if (current == root) { + root = current.right; + } else if (isLeftNode) { + parent.left = current.right; + } else { + parent.right = current.right; + } + } else if (current.right == null) { // 要删除的节点只有左节点 + if (current == root) { + root = current.left; + } else if (isLeftNode) { + parent.left = current.left; + } else { + parent.right = current.left; + } + } else { // 要删除的节点有两个节点 + Node successor = findSuccessor(current); + if (current == root) { + root = successor; + } else if (isLeftNode) { + parent.left = successor; + } else { + parent.right = successor; + } + successor.left = current.left; + } + return true; + } + + /** + * 找结点(x)的后继结点。即,查找"二叉树中数据值大于该结点"的"最小结点"。 + * + * @param delNode——要删除的结点 + * @return + */ + private Node findSuccessor(Node delNode) { + Node parent = delNode; + Node successor = delNode; + Node current = delNode.right; + /* 找到要删除结点的右子树的最左叶子结点,就是比要删除的数据大的最小结点 */ + while (current != null) { + parent = successor; + successor = current; + current = current.left; + } + + if (successor != delNode.right) { + parent.left = successor.right; + successor.right = delNode.right; + } + return successor; + } + + /** + * 内部结点类 + * + * @author think + * + */ + private class Node { + private Node left; + private Node right; + private int data; + + public Node(int data) { + this.left = null; + this.right = null; + this.data = data; + } + } + + public static void main(String[] args) { + int[] a = { 2, 4, 12, 45, 21, 6, 111, 1, 23, 45 }; + BSTree bTree = new BSTree(); + for (int i = 0; i < a.length; i++) { + bTree.insert(bTree.root, a[i]); + } + bTree.preOrder(bTree.root); + bTree.inOrder(bTree.root); + bTree.postOrder(bTree.root); + } + +} diff --git a/group03/763878069/src/cmj/datastructure/tree/BinaryTree.java b/group03/763878069/src/cmj/datastructure/tree/BinaryTree.java new file mode 100644 index 0000000000..421d342f36 --- /dev/null +++ b/group03/763878069/src/cmj/datastructure/tree/BinaryTree.java @@ -0,0 +1,185 @@ +package cmj.datastructure.tree; + +public class BinaryTree { + private Node root;// 根结点 + + public BinaryTree() { + root = null; + } + + public void insert(Node node, int data) { + if (null == root) { + root = new Node(data); + } else { + if (data < node.data) { + if (null == node.left) { + + node.left = new Node(data); + } else { + insert(node.left, data); + } + } else { + if (node.right == null) { + node.right = new Node(data); + } else { + insert(node.right, data); + } + } + } + } + + /** + * 前序遍历 + * + * @param node + */ + public void preOrder(Node node) { + if (node != null) { + System.out.println(node.data); + preOrder(node.left); + preOrder(node.right); + } + } + + /** + * 中序遍历 + * + * @param node + */ + public void inOrder(Node node) { + if (node != null) { + inOrder(node.left); + System.out.println(node.data); + inOrder(node.right); + } + } + + /** + * 后序遍历 + * + * @param node + */ + public void postOrder(Node node) { + if (node != null) { + postOrder(node.left); + postOrder(node.right); + System.out.println(node.data); + } + } + + // 删除节点分三种方式删除节点 + // 1、删除没有子节点的节点,直接让该节点的父节点的左节点或右节点指向空 + // 2、删除有一个子节点的节点,直接让该节点的父节点指向被删除节点的剩余节点 + // 3、删除有三个节点的子节点,找到要删除节点的后继节点, 用该节点替代删除的节点 + public boolean delete(int data) { + // 首先查找节点,并记录该节点的父节点引用 + Node current = root; + Node parent = root; + boolean isLeftNode = true; + while (current.data != data) { + parent = current; + if (data < current.data) { + isLeftNode = true; + current = current.left; + } else { + isLeftNode = false; + current = current.right; + } + } + if (current == null) { + System.out.println("没有找到要删除的节点!"); + return false; + } + // 下面分三种情况删除节点 + if (current.left == null && current.right == null) { // 要删除的节点没有子节点 + if (current == root) { // 根节点就删除整棵树 + root = null; + } else if (isLeftNode) { // 如果是左节点,做节点指向空 + parent.left = null; + } else { // 如果是右节点,右节点指向空 + parent.right = null; + } + } else if (current.left == null) { // 要删除的节点只有右节点 + if (current == root) { + root = current.right; + } else if (isLeftNode) { + parent.left = current.right; + } else { + parent.right = current.right; + } + } else if (current.right == null) { // 要删除的节点只有左节点 + if (current == root) { + root = current.left; + } else if (isLeftNode) { + parent.left = current.left; + } else { + parent.right = current.left; + } + } else { // 要删除的节点有两个节点 + Node successor = findSuccessor(current); + if (current == root) { + root = successor; + } else if (isLeftNode) { + parent.left = successor; + } else { + parent.right = successor; + } + successor.left = current.left; + } + return true; + } + + /** + * 找结点(x)的后继结点。即,查找"二叉树中数据值大于该结点"的"最小结点"。 + * + * @param delNode——要删除的结点 + * @return + */ + private Node findSuccessor(Node delNode) { + Node parent = delNode; + Node successor = delNode; + Node current = delNode.right; + /* 找到要删除结点的右子树的最左叶子结点,就是比要删除的数据大的最小结点 */ + while (current != null) { + parent = successor; + successor = current; + current = current.left; + } + + if (successor != delNode.right) { + parent.left = successor.right; + successor.right = delNode.right; + } + return successor; + } + + /** + * 内部结点类 + * + * @author think + * + */ + private class Node { + private Node left; + private Node right; + private int data; + + public Node(int data) { + this.left = null; + this.right = null; + this.data = data; + } + } + + public static void main(String[] args) { + int[] a = { 2, 4, 12, 45, 21, 6, 111 }; + BinaryTree bTree = new BinaryTree(); + for (int i = 0; i < a.length; i++) { + bTree.insert(bTree.root, a[i]); + } + bTree.preOrder(bTree.root); + bTree.inOrder(bTree.root); + bTree.postOrder(bTree.root); + } + +} diff --git a/group03/894844916/coding2017-01/.classpath b/group03/894844916/coding2017-01/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group03/894844916/coding2017-01/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group03/894844916/coding2017-01/.project b/group03/894844916/coding2017-01/.project new file mode 100644 index 0000000000..02ffec3472 --- /dev/null +++ b/group03/894844916/coding2017-01/.project @@ -0,0 +1,17 @@ + + + coding2017-01 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group03/894844916/coding2017-01/.settings/org.eclipse.jdt.core.prefs b/group03/894844916/coding2017-01/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group03/894844916/coding2017-01/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group03/894844916/coding2017-01/src/com/coding/basic/ArrayList.java b/group03/894844916/coding2017-01/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..4e6a216239 --- /dev/null +++ b/group03/894844916/coding2017-01/src/com/coding/basic/ArrayList.java @@ -0,0 +1,149 @@ +/** + * + */ +package com.coding.basic; + +/** + * @author patchouli + * + */ +public class ArrayList implements List { + + /** + * 数组列表初始默认容量100. + */ + private static final int DEFAULT_CAPACITY=100; + + /** + * 数组列表中元素的数量。 + */ + private int size = 0; + + /** + * 数组列表当前容量 + */ + private int capacity; + + /** + * 存放元素的数组。 + */ + private Object[] elementData; + + /** + * 默认构造函数,构造一个初始容量为100的数组列表 + */ + public ArrayList() { + capacity=DEFAULT_CAPACITY; + elementData=new Object[DEFAULT_CAPACITY]; + } + + /* + * (non-Javadoc) + * + * @see nusub.coding2017.basic.List#add(java.lang.Object) + */ + @Override + public void add(Object o) { + expand(); + elementData[size]=o; + size=size++; + } + + /* + * (non-Javadoc) + * + * @see nusub.coding2017.basic.List#add(int, java.lang.Object) + */ + @Override + public void add(int index, Object o) throws ListIndexException { + if (index==size) { + add(o); + return; + } + if (0<=index&&indexindex; i--) { + elementData[i]=elementData[i-1]; + } + elementData[index]=o; + return; + } + throw new ListIndexException("index不在[0,size]之间"); + } + + /** + * index在[0,size)之间返回通过数组下标访问的方式获取位置index处的元素,index超出这个范围抛出ListIndexException。 + * @param index 元素的位置 + * @return 获取的对象 + * @throws ListIndexException + */ + @Override + public Object get(int index) throws ListIndexException { + if (0<=index&&index + * + */ +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(){} + + public BinaryTreeNode(Object data){ + this.data=data; + left=null; + right=null; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + if (o.toString().compareTo(data.toString())<0) { + if (left==null) { + left=new BinaryTreeNode(o); + return left; + } + insert(o); + } + else { + if (right==null) { + right=new BinaryTreeNode(o); + return right; + } + insert(o); + } + return null; + } + +} diff --git a/group03/894844916/coding2017-01/src/com/coding/basic/Iterator.java b/group03/894844916/coding2017-01/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..66aeba3bb9 --- /dev/null +++ b/group03/894844916/coding2017-01/src/com/coding/basic/Iterator.java @@ -0,0 +1,22 @@ +/** + * + */ +package com.coding.basic; + +/** + * @author patchouli + * + */ +public interface Iterator { + /** + * 集合中存在下一个元素返回true,不存在下一个元素返回false。 + * @return + */ + public boolean hasNext(); + + /** + * 返回集合中下一个元素 + * @return + */ + public Object next(); +} diff --git a/group03/894844916/coding2017-01/src/com/coding/basic/LinkedList.java b/group03/894844916/coding2017-01/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..8ba061664d --- /dev/null +++ b/group03/894844916/coding2017-01/src/com/coding/basic/LinkedList.java @@ -0,0 +1,168 @@ +/** + * + */ +package com.coding.basic; + +/** + * @author patchouli + * + */ +public class LinkedList implements List, Iterator { + + private Node head; + private Node current=head; + private int size=0; + + /* (non-Javadoc) + * @see nusub.coding2017.basic.Iterator#hasNext() + */ + @Override + public boolean hasNext() { + if (current.next==null) { + return false; + } + return true; + } + + /* (non-Javadoc) + * @see nusub.coding2017.basic.Iterator#next() + */ + @Override + public Object next() { + current=current.next; + return current; + } + + /** + * 从头结点遍历,找到最后一个节点,最后一个节点引用下一个元素。最后把current指向头结点。 + * @param o 要添加的对象 + */ + @Override + public void add(Object o) { + Node node=new LinkedList.Node(); + node.data=o; + if (head==null) { + head=node; + current=head; + size++; + return; + } + while (hasNext()) { + next(); + } + current.next=node; + current=head; + size++; + } + + /** + * 在指定的位置插入一个元素,并把当前节点指向head。 + * @throws ListIndexException + */ + @Override + public void add(int index, Object o) throws ListIndexException { + if (index<0||index>size) { + throw new ListIndexException("index必须在[0,size]之间"); + } + Node node=new LinkedList.Node(); + node.data=o; + if (index==0) { + node.next=current; + head=node; + current=node; + } + else{ + int i=0; + while (i=size) { + throw new ListIndexException("index必须在[0,size)之间"); + } + if (index==0) { + return current; + } + int i=0; + while (i=size) { + throw new ListIndexException("index必须在[0,size)之间"); + } + if (size==0) { + return null; + } + Node node=null; + if (index==0) { + node=current; + current=current.next; + } + else if (index + 4.0.0 + + nusubmarine + coding2017-02 + 0.0.1-SNAPSHOT + jar + + coding2017-02 + http://maven.apache.org + + + UTF-8 + 4.7 + 1.6.1 + + + + + dom4j + dom4j + ${dom4j.version} + + + junit + junit + ${junit.version} + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + diff --git a/group03/894844916/coding2017-02/src/main/java/com/coderising/array/ArrayUntil.java b/group03/894844916/coding2017-02/src/main/java/com/coderising/array/ArrayUntil.java new file mode 100644 index 0000000000..1dc089ccfe --- /dev/null +++ b/group03/894844916/coding2017-02/src/main/java/com/coderising/array/ArrayUntil.java @@ -0,0 +1,256 @@ +/** + * + */ +package com.coderising.array; + +/** + * @author patchouli + * + */ +public class ArrayUntil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int size = origin.length; + if (size == 0 || size == 1) { + return; + } + int temp = 0; + for (int i = 0; i < size / 2; i++) { + temp = origin[i]; + origin[i] = origin[size - 1 - i]; + origin[size - 1 - i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int size = oldArray.length; + if (size == 0) { + return new int[0]; + } + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) { + size--; + } + } + if (size == 0) { + return new int[0]; + } + int[] noZero = new int[size]; + for (int i = 0, j = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + noZero[j] = oldArray[i]; + j++; + } + } + return noZero; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3,5,7,8] a2 = [4,5,6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + if (array1.length == 0) { + return array2; + } + if (array2.length == 0) { + return array1; + } + int size = array1.length + array2.length; + int[] merged = new int[size]; + int i=0,j=0,k=0; + while (iarray2[j]) { + merged[k]=array2[j]; + j++; + } + else { + merged[k]=array1[i]; + i++; + j++; + } + k++; + } + if (i==array1.length-1) { + System.arraycopy(array2, j, merged, k, array2.length-j); + k=k+array2.length-j; + } + if (i==array2.length-1) { + System.arraycopy(array1, i, merged, k, array1.length-i); + k=k+array1.length-i; + } + size = k; + int[] newArray = new int[size]; + System.arraycopy(merged, 0, newArray, 0, size); + return newArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max == 1) { + return new int[0]; + } + int[] fib = { 1, 1 }; + int size = 2; + int capacity = 2; + int i = 1; + while (fib[i] < max) { + if (size == capacity) { + fib = grow(fib, capacity); + capacity = fib.length; + } + fib[i + 1] = fib[i - 1] + fib[i]; + i++; + size++; + } + int[] newFib = new int[size-1]; + System.arraycopy(fib, 0, newFib, 0, size-1); + return newFib; + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + if (max < 2) { + return new int[0]; + } + int[] primes = new int[] { 2 }; + if (max ==3) { + return primes; + } + int size = 1; + int capacity = 1; + int number = 3; + boolean prime = true; + while (primes[size - 1] < max) { + for (int i = 2; i < number; i++) { + if (number % i == 0) { + prime = false; + break; + } + } + if (prime == true) { + if (size == capacity) { + primes = grow(primes, capacity); + capacity = primes.length; + } + primes[size] = number; + size++; + } + number++; + prime = true; + } + int[] newPrimes = new int[size - 1]; + System.arraycopy(primes, 0, newPrimes, 0, size-1); + return newPrimes; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int number = 2; + int size = 0; + int capacity = 10; + int[] perfectNumbers = new int[capacity]; + while (number < max) { + int capa = 10; + int i = 0; + int[] factor = new int[capa]; + int sum = 0; + for (int j = 1; j <= number / 2; j++) { + if (number % j == 0) { + if (i == capa) { + factor = grow(factor, capa); + capa = factor.length; + } + factor[i] = j; + sum += j; + i++; + } + } + if (sum == number && number != max) { + if (size == capacity) { + perfectNumbers = grow(perfectNumbers, capacity); + capacity = perfectNumbers.length; + } + perfectNumbers[size] = number; + size++; + } + number++; + } + int[] newPerfactNumber = new int[size]; + System.arraycopy(perfectNumbers, 0, newPerfactNumber, 0, size); + return newPerfactNumber; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + StringBuffer stringBuffer = new StringBuffer(); + for (int i = 0; i < array.length; i++) { + stringBuffer.append(array[i]); + if (i != array.length - 1) { + stringBuffer.append(seperator); + } + } + return stringBuffer.toString(); + } +} diff --git a/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/LoginAction.java b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..5f41f42c62 --- /dev/null +++ b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,42 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/Struts.java b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..ab39929f2a --- /dev/null +++ b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/Struts.java @@ -0,0 +1,118 @@ +package com.coderising.litestruts; + +/** + * @author patchouli + */ +import java.io.File; +import java.io.FileNotFoundException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + private static final String ELEMENT_ACTION = "action"; + private static final String ELEMENT_RESULT = "result"; + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction,通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + * ("name"="test","password"="1234"), 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message":"登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, 放到View对象的jsp字段中。 + * + */ + public static View runAction(String actionName, Map parameters) + throws FileNotFoundException, URISyntaxException, DocumentException, ClassNotFoundException { + SAXReader reader = new SAXReader(); + URL url = ClassLoader.getSystemResource("struts.xml"); + File file = new File(url.toURI()); + if (!file.exists()) { + throw new FileNotFoundException("struts.xml"); + } + Document document = reader.read(file); + Element strutsElement = document.getRootElement(); + Map viewParameters = new HashMap<>(); + String jsp = ""; + String result = ""; + for (Element actionElement : (List) strutsElement.elements(ELEMENT_ACTION)) { + String name = actionElement.attribute("name").getText(); + if (name.equals(actionName)) { + String className = actionElement.attribute("class").getText(); + Class cls = Class.forName(className); + Object actionObject = null; + try { + actionObject = cls.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + for (Map.Entry entry : parameters.entrySet()) { + + try { + String str = entry.getKey(); + str = str.replace(str.substring(0, 1), str.substring(0, 1).toUpperCase()); + Method method = cls.getDeclaredMethod("set" + str, String.class); + try { + method.invoke(actionObject, entry.getValue()); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } catch (NoSuchMethodException | SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + try { + Method method = cls.getDeclaredMethod("execute"); + try { + result = (String) method.invoke(actionObject); + Method[] methods = cls.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + String methodName = methods[i].getName(); + if (methodName.startsWith("get")) { + String value = (String) methods[i].invoke(actionObject); + String key = methodName.substring(3); + key = key.replace(key.substring(0, 1), key.substring(0, 1).toLowerCase()); + viewParameters.put(key, value); + } + } + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } catch (NoSuchMethodException | SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + for (Element resultElement : (List) actionElement.elements(ELEMENT_RESULT)) { + String resultName = resultElement.attribute("name").getText(); + if (resultName.equals(result)) { + jsp = resultElement.getText(); + } + } + } + } + View view = new View(); + view.setJsp(jsp); + view.setParameters(viewParameters); + return view; + } +} diff --git a/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/View.java b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..be50f467ed --- /dev/null +++ b/group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/View.java @@ -0,0 +1,29 @@ +package com.coderising.litestruts; + +/** + * @author patchouli + */ +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group03/894844916/coding2017-02/src/main/resources/struts.xml b/group03/894844916/coding2017-02/src/main/resources/struts.xml new file mode 100644 index 0000000000..ff7623e6e1 --- /dev/null +++ b/group03/894844916/coding2017-02/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group03/894844916/coding2017-02/src/test/java/com/coderising/array/ArrayUntilTest.java b/group03/894844916/coding2017-02/src/test/java/com/coderising/array/ArrayUntilTest.java new file mode 100644 index 0000000000..b4fda5aee7 --- /dev/null +++ b/group03/894844916/coding2017-02/src/test/java/com/coderising/array/ArrayUntilTest.java @@ -0,0 +1,124 @@ +package com.coderising.array; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class ArrayUntilTest { + + ArrayUntil arrayUntil=new ArrayUntil(); + + @Test + public void testReverseArray() { + int[] arr1={7,9,30,3}; + int[] reArr1={3,30,9,7}; + int[] arr2={7,9,30,3,4}; + int[] reArr2={4,3,30,9,7}; + + arrayUntil.reverseArray(arr1); + arrayUntil.reverseArray(arr2); + assertArrayEquals(reArr1,arr1); + assertArrayEquals(reArr2,arr2); + } + + @Test + public void testRemoveZero() { + int oldArr1[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int newArr1[]={1,3,4,5,6,6,5,4,7,6,7,5}; + int oldArr2[]={0,0,0,0,0,0}; + int newArr2[]={}; + + assertArrayEquals(newArr1, arrayUntil.removeZero(oldArr1)); + assertArrayEquals(newArr2, arrayUntil.removeZero(oldArr2)); + } + + @Test + public void testMerge() { + int[] a1={3,5,7,8}; + int[] b1={4,5,6,7}; + int[] c1={3,4,5,6,7,8}; + + int[] a2={}; + int[] b2={4,5,6,7}; + int[] c2={4,5,6,7}; + + int[] a3={3,5,7,8}; + int[] b3={}; + int[] c3={3,5,7,8}; + + int[] a4={}; + int[] b4={}; + int[] c4={}; + + assertArrayEquals(c1, arrayUntil.merge(a1, b1)); + assertArrayEquals(c2, arrayUntil.merge(a2, b2)); + assertArrayEquals(c3, arrayUntil.merge(a3, b3)); + assertArrayEquals(c4, arrayUntil.merge(a4, b4)); + } + + @Test + public void testGrow() { + int[] oldArray={2,3,6}; + int[] newArray={2,3,6,0,0,0}; + int size=3; + + assertArrayEquals(newArray, arrayUntil.grow(oldArray, size)); + } + + @Test + public void testFibonacci() { + int max1=1; + int max2=15; + int max3=21; + + int[] fib1={}; + int[] fib2={1,1,2,3,5,8,13}; + int[] fib3={1,1,2,3,5,8,13}; + + assertArrayEquals(fib1, arrayUntil.fibonacci(max1)); + assertArrayEquals(fib2, arrayUntil.fibonacci(max2)); + assertArrayEquals(fib3, arrayUntil.fibonacci(max3)); + } + + @Test + public void testGetPrimes() { + int max1=1; + int max2=3; + int max3=7; + int max4=23; + + int[] primes1={}; + int[] primes2={2}; + int[] primes3={2,3,5}; + int[] primes4={2,3,5,7,11,13,17,19}; + + assertArrayEquals(primes1, arrayUntil.getPrimes(max1)); + assertArrayEquals(primes2, arrayUntil.getPrimes(max2)); + assertArrayEquals(primes3, arrayUntil.getPrimes(max3)); + assertArrayEquals(primes4, arrayUntil.getPrimes(max4)); + } + + @Test + public void testGetPerfectNumbers() { + int max1=6; + int max2=28; + int max3=500; + int[] perfectNumbers1={}; + int[] perfectNumbers2={6}; + int[] perfectNumbers3={6,28,496}; + + assertArrayEquals(perfectNumbers1, arrayUntil.getPerfectNumbers(max1)); + assertArrayEquals(perfectNumbers2, arrayUntil.getPerfectNumbers(max2)); + assertArrayEquals(perfectNumbers3, arrayUntil.getPerfectNumbers(max3)); + } + + @Test + public void testJoin() { + String seperator="-"; + int[] arr={3,8,9}; + String string="3-8-9"; + + assertEquals(string,arrayUntil.join(arr, seperator)); + } + +} diff --git a/group03/894844916/coding2017-02/src/test/java/com/coderising/litestruts/StrutsTest.java b/group03/894844916/coding2017-02/src/test/java/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..47e41f8f89 --- /dev/null +++ b/group03/894844916/coding2017-02/src/test/java/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,41 @@ +package com.coderising.litestruts; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws FileNotFoundException, URISyntaxException, DocumentException, ClassNotFoundException { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws FileNotFoundException, URISyntaxException, DocumentException, ClassNotFoundException { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); // 密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group03/group03.md b/group03/group03.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group03/group03.md @@ -0,0 +1 @@ + diff --git a/group04/1020483199/1020483199Learning/.classpath b/group04/1020483199/1020483199Learning/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group04/1020483199/1020483199Learning/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group04/1020483199/1020483199Learning/.gitignore b/group04/1020483199/1020483199Learning/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/1020483199/1020483199Learning/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/1020483199/1020483199Learning/.project b/group04/1020483199/1020483199Learning/.project new file mode 100644 index 0000000000..1ee8060dd3 --- /dev/null +++ b/group04/1020483199/1020483199Learning/.project @@ -0,0 +1,17 @@ + + + 1020483199Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/1020483199/1020483199Learning/.settings/org.eclipse.core.resources.prefs b/group04/1020483199/1020483199Learning/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..f7e195b54e --- /dev/null +++ b/group04/1020483199/1020483199Learning/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/com/coding/basic=UTF-8 +encoding/=UTF-8 diff --git a/group04/1020483199/1020483199Learning/.settings/org.eclipse.jdt.core.prefs b/group04/1020483199/1020483199Learning/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group04/1020483199/1020483199Learning/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/ArrayList.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..a61325db63 --- /dev/null +++ b/group04/1020483199/1020483199Learning/src/com/coding/basic/ArrayList.java @@ -0,0 +1,128 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + + private int size = 0; + + private transient Object[] elementData = new Object[100]; + /** + * 向数组中添加某个元素 + */ + public void add(Object o){ + /** + * 数组扩容判断 + */ + ensureSize(size+1); + elementData[size++] = o; + } + /** + * 向指定位置数组中添加某个元素 + */ + public void add(int index, Object o){ + if(index<0||index>size){ + throw new IndexOutOfBoundsException("数组越界"); + } + ensureSize(size+1); + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + } + /** + * 获取数组中某个位置元素 + */ + public Object get(int index){ + if(index<0||index>elementData.length){ + return null; + }else{ + return elementData[index]; + } + + } + /** + * 移除数组中指定位置元素 + */ + public Object remove(int index){ + if(index<0||index>elementData.length){ + return null; + }else{ + int newLength = size-index-1; + if (newLength>0) + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + elementData[--size] = null; + return elementData; + } + } + /** + * 获取当前数组的大小 + */ + public int size(){ + if(size>0){ + return this.size; + }else{ + return 0; + } + } + /** + * 利用arraylist实现迭代器 + * @return + */ + public Iterator iterator(){ + + return new ArrayListIterator(); + } + private class ArrayListIterator implements Iterator{ + int cursor; + int lastReset = -1; + @Override + public boolean hasNext() { + return size!=cursor; + } + + @Override + public Object next() { + //标记索引当前位置 + int i = cursor; + if(i>size){ + throw new NoSuchElementException(); + } + Object[] newData = elementData; + if(i>newData.length){ + throw new ConcurrentModificationException(); + } + cursor = i + 1; + return newData[lastReset = i]; + } + + } + + + /** + * @author sulei + * @param minCapcity + */ + public void ensureSize(int minCapcity){ + if(minCapcity>elementData.length){ + grow(minCapcity); + } + } + + /** + * @author sulei + * @param autoCapcity + */ + public void grow(int autoCapcity){ + int oldLength = elementData.length; + if(autoCapcity>oldLength){ + Object[] oldData = elementData; + int newLength = (oldLength * 3)/2 + 1; + if(autoCapcity>newLength){ + newLength=autoCapcity; + } + elementData = Arrays.copyOf(elementData, newLength); + } + } +} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/BinaryTreeNode.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..48026be26c --- /dev/null +++ b/group04/1020483199/1020483199Learning/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,82 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + //存放当前树 + private BinaryTreeNode primary; + + public BinaryTreeNode getPrimary() { + return primary; + } + + public void setPrimary(BinaryTreeNode primary) { + this.primary = primary; + } + + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + /** + * 在二叉树中插入 + * @param o + * @return + */ + public BinaryTreeNode insert(Object o){ + if(o==null){ + throw new IllegalArgumentException("二叉树的元素不能为空!"); + } + //新建要插入的节点 + BinaryTreeNode bt = new BinaryTreeNode(); + bt.setData(o); + int value = (int)o; + //当原始二叉树为空时 + if(primary==null){ + primary = bt; + }else{ + BinaryTreeNode bi = primary; + while(true){ + if(value<(int)bi.data){ + if(bi.left==null){ + bi.setLeft(bt); + break; + }else{ + bi=bi.left; + } + }else if(value>(int)bi.data){ + if(bi.right==null){ + bi.setRight(bt); + break; + }else{ + bi=bi.right; + } + + }else{ + System.out.println("当前元素在二叉树已存在"); + break; + } + } + } + + return bt; + } + +} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/Iterator.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group04/1020483199/1020483199Learning/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/LinkedList.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..a85c311f72 --- /dev/null +++ b/group04/1020483199/1020483199Learning/src/com/coding/basic/LinkedList.java @@ -0,0 +1,175 @@ +package com.coding.basic; + +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + /** + * 当前节点的大小 + */ + private int size; + /** + * 头节点 + */ + private Node header; + /** + * 尾节点 + */ + private Node end; + + + + public void add(Object o){ + if(header==null){ + header = new Node(); + header.data = o; + end = header; + }else{ + Node n = new Node(); + n.data = o; + end.next = n; + n.previous=end; + end = n; + } + size++; + } + public void add(int index,Object o){ + judge(index); + Node n = new Node(); + n.data = o; + Node temp = header; + for(int i = 0;isize){ + throw new NoSuchElementException(); + } + Node n = header; + for(int j = 0;j < i;j ++){ + n = n.next; + } + cursor = i + 1; + lastReset = i; + return n.data; + } + + } + + + /** + * 判断数组是否越界方法 + */ + public void judge(int index){ + if(index<0||index>=size){ + throw new IndexOutOfBoundsException("数组越界"); + } + } + /** + * @author sulei + */ + private static class Node{ + Object data;//当前节点数据 + Node next;//下一个节点 + Node previous;//上一个节点 + } +} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/List.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group04/1020483199/1020483199Learning/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/Queue.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..b9a26bb40e --- /dev/null +++ b/group04/1020483199/1020483199Learning/src/com/coding/basic/Queue.java @@ -0,0 +1,40 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class Queue { + /** + * 队列长度 + */ + private int size; + + private LinkedList elementData = new LinkedList(); + /** + * 入队操作[向栈尾插入] + * @param o + */ + public void enQueue(Object o){ + elementData.add(o); + size++; + } + + public Object deQueue(){ + Object obj = elementData.removeFirst(); + size--; + return obj; + } + + public boolean isEmpty(){ + if(size==0){ + return true; + }else{ + return false; + } + + } + + public int size(){ + return size; + } + +} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/basic/Stack.java b/group04/1020483199/1020483199Learning/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..535922bb35 --- /dev/null +++ b/group04/1020483199/1020483199Learning/src/com/coding/basic/Stack.java @@ -0,0 +1,38 @@ +package com.coding.basic; + +public class Stack { + /** + * 当前栈的大小 + */ + private int size; + + private ArrayList elementData = new ArrayList(); + /** + * 压栈 + * @param o + */ + public void push(Object o){ + elementData.add(o); + size++; + } + /** + * 出栈 + * @return + */ + public Object pop(){ + return elementData.remove(--size); + } + /** + * 返回栈顶元素 + * @return + */ + public Object peek(){ + return elementData.get(size-1); + } + public boolean isEmpty(){ + return size==0; + } + public int size(){ + return size; + } +} diff --git a/group04/1020483199/1020483199Learning/src/com/coding/test/JavaTest.java b/group04/1020483199/1020483199Learning/src/com/coding/test/JavaTest.java new file mode 100644 index 0000000000..045e3d7a48 --- /dev/null +++ b/group04/1020483199/1020483199Learning/src/com/coding/test/JavaTest.java @@ -0,0 +1,223 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import java.math.BigDecimal; + +import org.junit.Test; + +import com.coding.basic.ArrayList; +import com.coding.basic.BinaryTreeNode; +import com.coding.basic.Iterator; +import com.coding.basic.LinkedList; +import com.coding.basic.List; +import com.coding.basic.Queue; +import com.coding.basic.Stack; + + + +public class JavaTest { + /** + * List集合单元测试内容 + */ + @Test + public void test() { + List list = new ArrayList(); + list.add(0, "aa"); + } + + @Test + public void test1() { + List list = new ArrayList(); + list.add("aa"); + System.out.println(list.get(0)); + } + + @Test + public void test2() { + List list = new ArrayList(); + list.add("aa"); + System.out.println(list.get(0)); + list.remove(0); + System.out.println(list.get(0)); + } + + @Test + public void test3() { + List list = new ArrayList(); + list.add("aa"); + System.out.println(list.size()); + list.add("aa"); + System.out.println(list.size()); + } + + @Test + public void test4() { + ArrayList list = new ArrayList(); + Integer [] str={11,22}; + list.add(str); + Iterator it = list.iterator(); + while(it.hasNext()){ + System.out.println(it.next()); + + } + LinkedList ll = new LinkedList(); + } + + /** + * LinkedList测试 + */ + @Test + public void test5() { + List list = new LinkedList(); + list.add("aa"); + list.add("bb"); + list.add("cc"); + System.out.println(list.get(1)); + } + + @Test + public void test6() { + List list = new LinkedList(); + list.add("aa"); + list.add("bb"); + list.add("cc"); + list.add(2, "ff"); + System.out.println(list.get(3)); + } + + @Test + public void test7() { + List list = new LinkedList(); + list.add("aa"); + list.add("bb"); + list.add("cc"); + list.remove(2); + System.out.println(list.get(0)+"----"+list.get(1)); + } + + @Test + public void test8() { + LinkedList list = new LinkedList(); + list.add("aa"); + list.add("bb"); + list.add("cc"); + System.out.println(list.get(0)); + list.addFirst("haha"); + System.out.println(list.get(0)); + } + + @Test + public void test9() { + LinkedList list = new LinkedList(); + list.add("aa"); + list.add("bb"); + list.add("cc"); + list.addLast("haha"); + System.out.println(list.get(3)); + } + + @Test + public void test10() { + LinkedList list = new LinkedList(); + list.add("aa"); + list.add("bb"); + list.add("cc"); + list.removeFirst(); + System.out.println(list.get(0)); + } + + @Test + public void test11() { + LinkedList list = new LinkedList(); + list.add("aa"); + list.add("bb"); + list.add("cc"); + list.removeLast(); + System.out.println(list.get(2)); + } + + @Test + public void test12() { + LinkedList list = new LinkedList(); + list.add("aa"); + list.add("bb"); + list.add("cc"); + Iterator it = list.iterator(); + while(it!=null&&it.hasNext()){ + System.out.println(it.next()); + } + } + + /** + * Queue集合测试 + */ + @Test + public void test13() { + Queue q = new Queue(); + System.out.println(q.size()+"------"+q.isEmpty()); + q.enQueue("aaa"); + q.enQueue("bbb"); + q.enQueue("ccc"); + System.out.println(q.size()+"------"+q.isEmpty()); + q.deQueue(); + System.out.println(q.size()+"------"+q.isEmpty()); + } + + /** + * Stack集合测试 + */ + @Test + public void test14() { + Stack q = new Stack(); + System.out.println(q.isEmpty()); + System.out.println(q.size()); + q.push("aa"); + q.push("bb"); + q.push("cc"); + q.push("dd"); + System.out.println(q.size()); + q.pop(); + System.out.println(q.size()); + System.out.println(q.peek()); + q.pop(); + System.out.println(q.size()); + System.out.println(q.peek()); + System.out.println(q.isEmpty()); + } + + /** + * BinaryTree测试 + */ + @Test + public void test15(){ + BinaryTreeNode bt = new BinaryTreeNode(); + Integer[] data={3,2,5,4,6,8}; + for(Integer i=0;i=1;i--){ + if(y%i==0&&x%i==0){ + maxValue = i; + break; + } + } + System.out.println(x/maxValue+"比"+y/maxValue); + + } + + + +} diff --git a/group04/1020483199/RemoteSystemsTempFiles/.project b/group04/1020483199/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000000..5447a64fa9 --- /dev/null +++ b/group04/1020483199/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group04/1020483199/SecondHomeWork/.classpath b/group04/1020483199/SecondHomeWork/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group04/1020483199/SecondHomeWork/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group04/1020483199/SecondHomeWork/.project b/group04/1020483199/SecondHomeWork/.project new file mode 100644 index 0000000000..53ed6ead25 --- /dev/null +++ b/group04/1020483199/SecondHomeWork/.project @@ -0,0 +1,17 @@ + + + SecondHomeWork + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/1020483199/SecondHomeWork/.settings/org.eclipse.jdt.core.prefs b/group04/1020483199/SecondHomeWork/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..8000cd6ca6 --- /dev/null +++ b/group04/1020483199/SecondHomeWork/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/group04/1020483199/SecondHomeWork/bin/com/basic/litestruts/struts.xml b/group04/1020483199/SecondHomeWork/bin/com/basic/litestruts/struts.xml new file mode 100644 index 0000000000..8038c576e8 --- /dev/null +++ b/group04/1020483199/SecondHomeWork/bin/com/basic/litestruts/struts.xml @@ -0,0 +1,21 @@ + + + + + + + /jsp/homepage.jsp + + /jsp/showLogin.jsp + + + + + + /jsp/welcome.jsp + + /jsp/error.jsp + + + + diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/coding/ArrayUtil.java b/group04/1020483199/SecondHomeWork/src/com/basic/coding/ArrayUtil.java new file mode 100644 index 0000000000..95a5871afb --- /dev/null +++ b/group04/1020483199/SecondHomeWork/src/com/basic/coding/ArrayUtil.java @@ -0,0 +1,282 @@ +package com.basic.coding; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class ArrayUtil { + /** + + * һa , Ըֵû + + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + + * @param origin + + * @return + + */ + + public void reverseArray(int[] origin){ + /** + * Сڵһԭij + */ + if(origin.length>1){ + int Arrlength = (origin.length%2==0)?origin.length/2:(origin.length-1)/2; + for(int i = 0;i set = new HashSet(); + for(int x:newArray){ + set.add(x); + } + /** + * ʱsetѾһظݵļ + */ + //int[] noRepeat = (int[])set.toArray(new int[set.size()]); + //Object[] array = set.toArray(); + Integer[] array = set.toArray(new Integer[set.size()]); + Arrays.sort(array); + int[] sortArray=new int[array.length]; + for(int i=0;i1){ + for(int i = 1;i=max){ + index = i-1; + break; + } + } + int[] newArray = new int[index]; + for(int j = 0;j parameters){ + /* + 0. ȡļstruts.xml + 1. actionNameҵӦclassLoginAction,ͨʵ + parametersеݣösetter parametersе + ("name"="test","password"="1234"), + ǾӦõ setNamesetPassword + 2. ͨöexectue ÷ֵ"success" + 3. ͨҵgetter getMessage, + ͨã ֵγһHashMap , {"message": "¼ɹ"} , + ŵViewparameters + 4. struts.xmlе ,Լexecuteķֵ ȷһjsp + ŵViewjspֶС + */ + View v = new View();//һviewڶķ + //1.һDocumentBuilderFactory + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + //2.һDocumentBuilder + DocumentBuilder db = null; + + + try { + db = dbf.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } + //3.ͨdocumentBuilderxmlļ + Document document = null; + try { + document = db.parse("src/com/basic/litestruts/struts.xml"); + } catch (SAXException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + NodeList nodeList = document.getElementsByTagName("action"); + //System.out.println(nodeList.getLength()); + + for(int i = 0;i fn = Class.forName(className); + Object obj = fn.newInstance();//Ķ + Method methodSetName = fn.getMethod("setName", String.class); + Method methodSetPwd = fn.getMethod("setPassword", String.class); + for(Map.Entry m :parameters.entrySet()){ + if(m.getKey().equals("name")){ + methodSetName.invoke(obj, m.getValue()); + } + if(m.getKey().equals("password")){ + methodSetPwd.invoke(obj, m.getValue()); + } + } + /** + * excutesuccess + */ + Object returnValue = fn.getMethod("execute", null).invoke(obj, null); + System.out.println(returnValue.toString());//ӡֵ + /** + * ͨҵgetter + */ + //Ȼ + Field[] fd = fn.getDeclaredFields(); + + Map newMap = new HashMap(); + for(int m = 0;m , + * Լexecuteķֵ ȷһjsp + ŵViewjspֶ + */ + NodeList childNodes = currentAction.getChildNodes(); + for(int q = 0;q params = new HashMap(); + + params.put("name","test"); + + params.put("password","1234"); + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + + Assert.assertEquals("login successful", view.getParameters().get("message")); + + } + + @Test + + public void testLoginActionFailed() { + + String actionName = "login"; + + Map params = new HashMap(); + + params.put("name","test"); + + params.put("password","123456"); //ԤIJһ + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + + } + + @Test + public void testAccessible() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ + View v = new View(); + System.out.println(v.getJsp()); + Class class1 = v.getClass(); + Field declaredField = class1.getDeclaredField("jsp"); + declaredField.setAccessible(true); + declaredField.set(v, "fff"); + System.out.println(v.getJsp()); + + + } +} diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/View.java b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/View.java new file mode 100644 index 0000000000..b32c28b1bb --- /dev/null +++ b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/View.java @@ -0,0 +1,37 @@ +package com.basic.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + + private Map parameters; + + public String getJsp() { + + return jsp; + + } + + public View setJsp(String jsp) { + + this.jsp = jsp; + + return this; + + } + + public Map getParameters() { + + return parameters; + + } + + public View setParameters(Map parameters) { + + this.parameters = parameters; + + return this; + + } +} diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/struts.xml b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/struts.xml new file mode 100644 index 0000000000..8038c576e8 --- /dev/null +++ b/group04/1020483199/SecondHomeWork/src/com/basic/litestruts/struts.xml @@ -0,0 +1,21 @@ + + + + + + + /jsp/homepage.jsp + + /jsp/showLogin.jsp + + + + + + /jsp/welcome.jsp + + /jsp/error.jsp + + + + diff --git a/group04/1020483199/SecondHomeWork/src/com/basic/test/JavaTest.java b/group04/1020483199/SecondHomeWork/src/com/basic/test/JavaTest.java new file mode 100644 index 0000000000..efd34b873b --- /dev/null +++ b/group04/1020483199/SecondHomeWork/src/com/basic/test/JavaTest.java @@ -0,0 +1,95 @@ +package com.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.basic.coding.ArrayUtil; + +public class JavaTest { + + @Test + public void test() { + ArrayUtil ary = new ArrayUtil(); + int[] origin = {1,2,3,4,5}; + ary.reverseArray(origin); + for(int i=0;iInteger.MAX_VALUE) + throw new IllegalArgumentException("非法容量: " + capacity); + elementData = new Object[capacity]; + } + + + public void add(Object o){ + /*判断是否需要扩容*/ + ensureCapacity(size + 1); + elementData[size++] = o; + } + + public void add(int index, Object o){ + checkIndex(index); + /*判断是否需要扩容*/ + ensureCapacity(size + 1); + /*将index->size的元素依次向右移一个位置*/ + System.arraycopy(elementData, index, elementData, index+1, size-index); + /*插入o的值*/ + elementData[index] = o; + size++; + } + + + public Object get(int index){ + + checkIndex(index); + return elementData[index]; + } + + public Object remove(int index){ + + checkIndex(index); + Object value = elementData[index]; + /*将index+1 -> size的元素依次向左移一个位置*/ + System.arraycopy(elementData,index+1, elementData, index, size-index-1); + elementData[--size]=null; //释放最后一个元素,同时size减一; + return value; + } + + public int size(){ + return this.size; + } + + public Iterator iterator(){ + return null; + } + /* 确认容量是否足够,也可以直接调用手动扩容*/ + public void ensureCapacity(int minCapacity){ + int oldCapacity = elementData.length; + /*容量不足需要扩容*/ + if(oldCapacity < minCapacity){ + int newCapacity = oldCapacity * 2; //扩大2倍 + if (newCapacity < minCapacity){ + newCapacity = minCapacity; //扩容后仍不足,取最大值 + } + System.out.println("数据扩容至: " + newCapacity); + elementData = Arrays.copyOf(elementData, newCapacity); + } + + } + + private void checkIndex(int index){ + if (index<0 || index>= size) + throw new IndexOutOfBoundsException ("index非法: " + index); + } + @Override + public String toString(){ + + StringBuffer sb = new StringBuffer(""); + for(int i=0; i "); + } + return sb.toString(); + } +} diff --git a/group04/120549547/base/src/com/coding/basic/BinaryTreeNode.java b/group04/120549547/base/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group04/120549547/base/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group04/120549547/base/src/com/coding/basic/Iterator.java b/group04/120549547/base/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group04/120549547/base/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/120549547/base/src/com/coding/basic/LinkedList.java b/group04/120549547/base/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..edfbcc1007 --- /dev/null +++ b/group04/120549547/base/src/com/coding/basic/LinkedList.java @@ -0,0 +1,127 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size; + /*创建一个带头节点的单链表*/ + public LinkedList(){ + head = new Node(null); + } + + /*添加一个元素(尾插法)*/ + public void add(Object o){ + + Node node = new Node(o); + Node pos = head; + //找到最后一个元素位置 + while(pos.next != null){ + pos = pos.next; + } + pos.next = node; + size++; + + } + + /*在index位置插入*/ + public void add(int index , Object o){ + //判断索引是否合法 + checkIndex(index); + Node node = new Node(o); + Node pos = head; + //找到插入位置 + while(index-- != 0){ + pos = pos.next; + } + node.next = pos.next; + pos.next = node; + size++; + + } + public Object get(int index){ + checkIndex(index); + if(this.isEmpty()){ + throw new IllegalArgumentException ("链表为空"); + } + Node pos = head.next; //pos指向要获取的节点 + while(index-- !=0){ + pos = pos.next; + } + + return pos.data; + } + public Object remove(int index){ + checkIndex(index); + if(this.isEmpty()){ + throw new IllegalArgumentException ("链表为空"); + } + + Node pos = head; //pos指向要删除的前一个结点 + while(index-- != 0){ + pos = pos.next; + } + Node value = pos.next; //要删除的节点 + pos.next = value.next; + size--; + return value.data; + + + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + this.add(o); + } + public Object removeFirst(){ + if(this.isEmpty()){ + throw new IllegalArgumentException ("链表为空"); + } + return remove(0); + } + public Object removeLast(){ + if(this.isEmpty()){ + throw new IllegalArgumentException ("链表为空"); + } + return remove(size-1); + } + + public boolean isEmpty(){ + return size == 0; + } + public Iterator iterator(){ + return null; + } + + private void checkIndex(int index){ + if (index<0 || index>=size ){ + throw new IllegalArgumentException ("index不合法: " + index ); + } + } + + @Override + public String toString(){ + + StringBuffer sb = new StringBuffer(""); + for(int i=0; i "); + } + return sb.toString(); + } + + private static class Node{ + public Object data; + public Node next; + + public Node(Object data){ + this.data = data; + this.next = null; + } + + } +} diff --git a/group04/120549547/base/src/com/coding/basic/List.java b/group04/120549547/base/src/com/coding/basic/List.java new file mode 100644 index 0000000000..d47df585d9 --- /dev/null +++ b/group04/120549547/base/src/com/coding/basic/List.java @@ -0,0 +1,10 @@ +package com.coding.basic; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/120549547/base/src/com/coding/basic/Main.java b/group04/120549547/base/src/com/coding/basic/Main.java new file mode 100644 index 0000000000..de8a0b0990 --- /dev/null +++ b/group04/120549547/base/src/com/coding/basic/Main.java @@ -0,0 +1,85 @@ +package com.coding.basic; +import com.coding.basic.*; + +class Main{ + + public static void main(String[] args){ + System.out.println("数组测试开始"); + ArrayListTest(); + System.out.println("----------------分割线----------------"); + System.out.println("链表测试开始"); + LinkedListTest(); + System.out.println("----------------分割线----------------"); + System.out.println("栈测试开始"); + StatckTest(); + System.out.println("----------------分割线----------------"); + System.out.println("队测试开始"); + QueueTest(); + } + + public static void ArrayListTest(){ + ArrayList list = new ArrayList(2); + list.add("HelloBobi0"); + list.add("HelloBobi1"); + list.add("HelloBobi2"); + list.add("HelloBobi3"); + list.add("HelloBobi4"); + list.add("HelloBobi5"); + System.out.println((String)list.get(0)); + System.out.println((String)list.get(4)); + list.add(3, "Hei Man"); + list.remove(5); + System.out.println(list); + System.out.println("size:=" + list.size()); + } + + public static void LinkedListTest(){ + LinkedList ll = new LinkedList(); + + + ll.add("SingleDog0"); + ll.add("SingleDog1"); + ll.add("SingleDog2"); + ll.add("SingleDog3"); + ll.add("SingleDog4"); + ll.add("SingleDog5"); + + System.out.println((String)(ll.get(1))); + System.out.println(ll); + System.out.println("size:=" + ll.size()); + ll.remove(0); + ll.removeFirst(); + ll.removeLast(); + System.out.println(ll); + } + + public static void StatckTest(){ + Stack stack = new Stack(); + stack.push("虾师傅0"); + stack.push("虾师傅1"); + stack.push("虾师傅2"); + stack.push("虾师傅3"); + stack.push("虾师傅4"); + + stack.pop(); + System.out.println(stack.peek()); + System.out.println(stack); + + } + public static void QueueTest(){ + Queue queue = new Queue(); + queue.enQueue("龙师傅0"); + queue.enQueue("龙师傅1"); + queue.enQueue("龙师傅2"); + queue.enQueue("龙师傅3"); + queue.enQueue("龙师傅4"); + + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.size()); + + + } +} \ No newline at end of file diff --git a/group04/120549547/base/src/com/coding/basic/Queue.java b/group04/120549547/base/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..8f86f7492c --- /dev/null +++ b/group04/120549547/base/src/com/coding/basic/Queue.java @@ -0,0 +1,29 @@ +package com.coding.basic; +import com.coding.basic.*; +public class Queue { + private LinkedList list; + + public Queue(){ + list = new LinkedList(); + } + /*入队*/ + public void enQueue(Object o){ + list.addLast(o); + } + + /*出队*/ + public Object deQueue(){ + if (isEmpty()){ + System.out.println("队空"); + } + return list.removeFirst(); + } + + public boolean isEmpty(){ + return list.isEmpty(); + } + + public int size(){ + return list.size(); + } +} diff --git a/group04/120549547/base/src/com/coding/basic/Stack.java b/group04/120549547/base/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..f7d3bba3db --- /dev/null +++ b/group04/120549547/base/src/com/coding/basic/Stack.java @@ -0,0 +1,37 @@ +package com.coding.basic; +import com.coding.basic.LinkedList; + +public class Stack { + private LinkedList list; + + public Stack(){ + list = new LinkedList(); + } + + public void push(Object o){ + list.addLast(o); + } + + public Object pop(){ + if(isEmpty()){ + System.out.println("栈空"); + } + return list.removeLast(); + + } + + public Object peek(){ + return list.get(list.size()-1); + } + public boolean isEmpty(){ + return list.isEmpty(); + } + public int size(){ + return list.size(); + } + + @Override + public String toString(){ + return list.toString(); + } +} diff --git a/group04/120549547/my.txt b/group04/120549547/my.txt new file mode 100644 index 0000000000..3da1ec26e9 --- /dev/null +++ b/group04/120549547/my.txt @@ -0,0 +1 @@ +HelloWorld diff --git a/group04/120549547/shell.sh b/group04/120549547/shell.sh new file mode 100644 index 0000000000..ab61214ddd --- /dev/null +++ b/group04/120549547/shell.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +git remote -v +read anykey +echo "抓取上游代码" +git fetch upstream +echo "代码合并" +git merge upstream/master +read anykey +echo "添加代码" +git add -A . +read anykey +git commit -m "bobi" + +echo "推送到githup" +read anykey +git push origin master +read anykey diff --git a/group04/1299310140/src/com/coderising/array/ArrayUtil.java b/group04/1299310140/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..cd8cb5dab7 --- /dev/null +++ b/group04/1299310140/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,276 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static void reverseArray(int[] origin){ + int temp; + for(int i = 0;i < origin.length;i++){ + if(i >= origin.length-1-i){ + break; + } + temp = origin[i]; + origin[i] = origin[origin.length-1-i]; + origin[origin.length-1-i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public static int[] removeZero(int[] oldArray){ + ArrayList list = new ArrayList(); + for(int i = 0;i < oldArray.length;i++){ + if(oldArray[i] != 0){ + list.add(oldArray[i]); + } + } + int[] result = listToArray(list); + return result; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + public static int[] merge(int[] array1, int[] array2){//参数数组均有序且无重复值 + ArrayList list = new ArrayList(); + int i = 0;//array1 + int j = 0;//array2 + while(i < array1.length && j < array2.length){ + if(array1[i] == array2[j]){ + list.add(array1[i]); + i++; + j++; + }else if(array1[i] < array2[j]){ + list.add(array1[i]); + i++; + }else{//array1[i] > array2[j] + list.add(array2[j]); + j++; + } + }//while结束 + + //此时(i == array1.length && j == array2.length)or + //(i == array1.length && j < array2.length)or + //(i < array1.length && j == array2.length) + while(i < array1.length){ + list.add(array1[i]); + i++; + } + while(j < array2.length){ + list.add(array2[j]); + j++; + } + + int[] result = listToArray(list); + return result; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int [] oldArray, int size){ + return Arrays.copyOf(oldArray, oldArray.length + size); +// int[] result = new int[oldArray.length + size]; +// System.arraycopy(oldArray, 0, result, 0, oldArray.length); +// return result; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + if(max < 2){//max=1 特殊 + return new int[0]; + } + int one = 1; + int two = 1; + int temp = 0; + int i = 2; + while(one + two < max){ + temp = two; + two = one + two; + one = temp; + i++; + } + int[] result = new int[i]; + result[0] = 1; + result[1] = 1; + for(int j = 2;j < result.length;j++){ + result[j] = result[j-1] + result[j-2]; + } + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public static int[] getPrimes(int max){//max:3 return:[2] + if(max <= 2){ + return new int[0]; + } + ArrayList list = new ArrayList(); + for(int i = 2;i < max;i++){ + if(isPrimes(i)){ + list.add(i); + } + } + int[] result = listToArray(list); + return result; + } + + /* + * 判断一个数是不是质数 + */ + public static Boolean isPrimes(int data){ + if(data < 2){ + return false; + } + for(int i = 2;i < data;i++){ + if(data % i == 0){ + return false; + } + if(i * i > data){ + break; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max){ + ArrayList list = new ArrayList(); + for(int i = 6;i < max;i++){ + if(isPerfectNumber(i)){ + list.add(i); + } + } + int[] result = listToArray(list); + return result; + } + + /* + * ArrayList ---> int[] + */ + public static int[] listToArray(ArrayList list){ + int[] result = new int[list.size()]; + for(int j = 0;j < result.length;j++){ + result[j] = (int) list.get(j); + } + return result; + } + + /* + * 判断一个数是不是完数 + */ + public static Boolean isPerfectNumber(int data){ + if(data < 6){ + return false; + } + int sum = 1; + for(int i = 2;i < data;i++){ + if(i * i > data){ + break; + } + if(data % i == 0){ + if(i == data/i){ + sum = sum + i; + }else{ + sum = sum + i + data/i; + } +// sum = sum + i; + if(sum > data){ + return false; + } + } + }//for + if(sum == data){ + return true; + }else{//sum < data + return false; + } + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator){ + StringBuffer result = new StringBuffer(); + for(int i = 0;i < array.length;i++){ + result.append(array[i]); + result.append(seperator); + } + + String res = result.toString(); + if(array.length > 0){ + res = res.substring(0, result.length()-seperator.length());//删除最后一个seperator + } + return res; + } + + /* + * 数组转字符串 格式:[]or[1]or[1 2] + */ + public static String arrayToString(int[] array){ + StringBuffer result = new StringBuffer(); + result.append("["); + for(int i = 0;i < array.length;i++){ + result.append(array[i]); + result.append(" "); + } + String res = result.toString(); + if(array.length > 0){ + res = res.substring(0, result.length()-1);//删除最后一个空格 + } + res = res + "]"; + return res; + } + + public static void main(String[] args){ + System.out.println(new Date()); + int[] a1 = getPerfectNumbers(2000000); + System.out.println(arrayToString(a1)); + System.out.println(new Date()); + } +} diff --git a/group04/1299310140/src/com/coderising/litestruts/Struts.java b/group04/1299310140/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..7c7a35426b --- /dev/null +++ b/group04/1299310140/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,180 @@ +package com.coderising.litestruts; + +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + View view = new View(); + + //0.读取配置文件struts.xml,根据actionName找到相对应的class , 例如LoginAction, + Document document = getDocument("src/com/coderising/litestruts/struts.xml"); + String className = getAttrValue(document,"/struts/action[@name=\""+actionName+"\"]/@class"); +// System.out.println(className); + + //1.通过反射实例化(创建对象) + Class cla = null; + Object obj = null; + Method executeMethod = null; + try { + cla = Class.forName(className); + obj = cla.newInstance(); + //获得该类的所有属性 + Field[] fields = cla.getDeclaredFields(); + + //2.根据parameters中的数据,调用对象的setter方法 + for(Field field:fields){ + if(parameters.get(field.getName()) == null){ + continue; + } + PropertyDescriptor pd = new PropertyDescriptor(field.getName(), cla); + //获得set方法 + Method myset = pd.getWriteMethod(); + myset.invoke(obj, parameters.get(field.getName())); + } + + //3.通过反射调用对象的exectue 方法, 并获得返回值 + executeMethod = cla.getDeclaredMethod("execute"); + String executeReturn = (String) executeMethod.invoke(obj); + + //4.通过反射找到对象的所有getter方法,通过反射来调用, 把值和属性形成一个HashMap,放到View对象的parameters + Map viewparameters = new HashMap(); + for(Field field:fields){ + //获得get方法 +// PropertyDescriptor pd = new PropertyDescriptor(field.getName(), cla); +// Method myget = pd.getReadMethod(); +// Object getValue = myget.invoke(obj); +// System.out.println("field:"+field.getName()+"---getValue:"+getValue); + + //因为没有setMessage,所以换一种方式实现 + Method myget = cla.getDeclaredMethod("get"+captureName(field.getName())); + Object getValue = myget.invoke(obj); + viewparameters.put(field.getName(), (String) getValue); +// System.out.println("field:"+field.getName()+"---getValue:"+getValue); + } + view.setParameters(viewparameters); + + //5.根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp,放到View对象的jsp字段中。 + String viewjsp = getTextValue(document,"/struts/action[@name=\""+actionName+"\"]/result[@name=\""+executeReturn+"\"]"); + view.setJsp(viewjsp); + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IntrospectionException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return view; + } + + /* + * 根据xml文件的路径获取其Document + */ + public static Document getDocument(String file){ + SAXReader saxReader = new SAXReader(); + Document document = null; + try { + document = saxReader.read(new File(file)); + } catch (DocumentException e) { + e.printStackTrace(); + } + return document; + } + + /* + * 获取给定属性节点的值 + */ + public static String getAttrValue(Document doc,String attrNode){ + List list = doc.selectNodes(attrNode); + Iterator iterator = list.iterator(); + if(iterator.hasNext()){ + Attribute attr = (Attribute) iterator.next(); + return attr.getValue(); + } + + //没有找到给定的属性节点则返回null + return null; + } + + /* + * 获取给定xml节点的文本值 + */ + public static String getTextValue(Document doc,String node){ + List list = doc.selectNodes(node); + Iterator iterator = list.iterator(); + if(iterator.hasNext()){ + Element element = (Element) iterator.next(); + return element.getText(); + } + + //没有找到给定的xml节点则返回null + return null; + } + + //首字母大写 + public static String captureName(String name) { +// name = name.substring(0, 1).toUpperCase() + name.substring(1); +// return name; + char[] cs=name.toCharArray(); + cs[0]-=32; + return String.valueOf(cs); + } + + public static void main(String[] args){ + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + runAction(actionName,params); + } + +} diff --git a/group04/1299310140/src/com/coding/basic/ArrayList.java b/group04/1299310140/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..cd4a88198c --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/ArrayList.java @@ -0,0 +1,125 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + private Object[] elementData = new Object[10]; + + public void add(Object o){ + if(size < this.elementData.length){//加至末尾,size+1 + this.elementData[size] = o; + size++; + }else{//扩张数组,然后加至末尾,size+1 + this.elementData = grow(this.elementData,10); + this.elementData[size] = o; + size++; + } + } + + public void add(int index, Object o){//-1 this.size){//index小于0or大于size,参数错误 + return; + } + if(size >= this.elementData.length){//当前数组容量已满,需扩张 + this.elementData = grow(this.elementData, 10); + } + + //此时只需考虑将o加至index处(0= index;i--){ + this.elementData[i] = this.elementData[i-1]; + } + this.elementData[index] = o; + this.size++; + }else{//直接插入o,size+1 + this.elementData[index] = o; + this.size++; + } + + } + + public Object get(int index){//-1= this.size){//index小于0or大于等于size,参数错误 + return null; + } + return this.elementData[index]; + } + + public Object remove(int index){//-1= this.size){//index小于0or大于等于size,参数错误 + return null; + } + + Object o = this.elementData[index];//o保存被移除的值 + //此时只需考虑将index处的o移除 + for(int i = index;i < this.size-1;i++){ + this.elementData[i] = this.elementData[i+1]; + } + this.size--; + return o; + } + + public int size(){ + return this.size; + } + + public Iterator iterator(){ + return new ArrayListIterator(this); + } + + public static class ArrayListIterator implements Iterator{ + private ArrayList list; + private int pres; + + public ArrayListIterator(ArrayList list) { + super(); + this.list = list; + this.pres = 0; + } + + @Override + public boolean hasNext() { + if(this.pres < this.list.size()){ + return true; + }else{ + return false; + } + } + + @Override + public Object next() { + Object o = this.list.get(this.pres); + this.pres++; + return o; + } + + } + + /* + * 说明:扩张数组 + * 参数:被扩张的原数组,扩张的增加数(扩张后数组的大小为原数组的长度+增加数) + * 返回值:扩张后的数组 + */ + private static Object[] grow(Object[] src,int size){ +// return Arrays.copyOf(src, src.length + size); + Object[] target = new Object[src.length + size]; + System.arraycopy(src, 0, target, 0, src.length); + return target; + } + + public String toString(){ + String result = "["; + if(this.size == 0){ + result = result + "]"; + return result; + }else{ + for(int i = 0;i < size;i++){ + result = result + this.elementData[i] + ","; + } + result = result.substring(0,result.length()-1); + result = result + "]"; + return result; + } + } + +} diff --git a/group04/1299310140/src/com/coding/basic/BinaryTreeNode.java b/group04/1299310140/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..caed44d70b --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,73 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + if(this.data == null){//根节点为空 + this.data = o; + }else{//根节点非空 + BinaryTreeNode pres = this; + BinaryTreeNode insertNode = new BinaryTreeNode(); + insertNode.setData(o); + while(pres != null){ + if((int)o < (int)pres.data){//插入值<当前值,pres向左移动,或者将插入节点挂在当前节点左边 + if(pres.left == null){ + pres.left = insertNode; + break; + } + pres = pres.left; + }else{//插入值>=当前值,pres向右移动,或者将插入节点挂在当前节点右边 + if(pres.right == null){ + pres.right = insertNode; + break; + } + pres = pres.right; + } + } + } + return null; + } + + public void print(){ + if(this.data == null){ + return; + }else{ + if(this.left !=null){ + this.left.print(); + } + System.out.print(this.data); + System.out.print(" "); + if(this.right != null){ + this.right.print(); + } + } + } +} diff --git a/group04/1299310140/src/com/coding/basic/LinkedList.java b/group04/1299310140/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..cfb0d34636 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/LinkedList.java @@ -0,0 +1,211 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size = 0; + + public void add(Object o){ + if(this.size == 0){//size为0,给head赋值 + this.head = new Node(o); + size++; + }else{//将o加至链表末尾 + Node Last = new Node(o); + Node pres = this.head; + while(pres.next != null){ + pres = pres.next; + } + pres.next = Last; + size++; + } + } + + public void add(int index , Object o){//index:0~size + if(index < 0 || index > this.size){//index小于0or大于size,参数错误 + return; + } + if(index == 0){//将o加至链表头部 + //size为0时,index必为0,执行该分支 + Node first = new Node(o); + first.next = this.head; + this.head = first; + size++; + }else if(index == size){//将o加至链表末尾 + //index == size != 0时,执行该分支 + Node Last = new Node(o); + Node pres = this.head; + while(pres.next != null){ + pres = pres.next; + } + pres.next = Last; + size++; + }else{ + //0= this.size){//index小于0or大于等于size,参数错误 + return null; + } + + Node pres = this.head;//pres指向0 + for(int i = 0;i < index;i++){ + pres = pres.next; + } + //此时pres指向index + return pres.data; + } + + public Object remove(int index){//index:0~size-1 + if(index < 0 || index >= this.size){//index小于0or大于等于size,参数错误 + return null; + } + + Object o = null; + if(index == 0){//删除头节点 + o = this.head.data; + this.head = this.head.next; + size--; + }else{//删除头节点以外的其他节点 + Node pres = this.head;//pres指向0 + for(int i = 0;i < index-1;i++){ + pres = pres.next; + } + + //此时pres指向index-1 + o = pres.next.data; + pres.next = pres.next.next; + size--; + } + return o; + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){//同add(int 0 , Object o) + Node first = new Node(o); + first.next = this.head; + this.head = first; + size++; + } + + public void addLast(Object o){//同add(int size , Object o) + if(this.size == 0){ + this.head = new Node(o); + size++; + }else{//size>=1 + Node Last = new Node(o); + Node pres = this.head; + while(pres.next != null){ + pres = pres.next; + } + pres.next = Last; + size++; + } + } + + public Object removeFirst(){//同remove(int 0) + if(this.size == 0){ + return null; + } + + Object o = this.head.data; + this.head = this.head.next; + size--; + return o; + } + + public Object removeLast(){ + if(this.size == 0){ + return null; + } + + Object o = null; + if(this.size == 1){//size==1 + o = this.head.data; + this.head = null; + this.size--; + }else{//size>=2 + Node pres = this.head; + while(pres.next.next != null){ + pres = pres.next; + } + o = pres.next.data; + pres.next = null; + size--; + } + return o; + } + + public Iterator iterator(){ + return new LinkedListIterator(this); + } + + private static class LinkedListIterator implements Iterator{ +// private LinkedList list; + private Node pres; + + public LinkedListIterator(LinkedList list) { + super(); +// this.list = list; + this.pres = list.head; + } + + @Override + public boolean hasNext() { + if(this.pres != null){ + return true; + }else{ + return false; + } + } + + @Override + public Object next() { + Object o = this.pres.data; + pres = pres.next; + return o; + } + + } + + private static class Node{ + Object data; + Node next; + + public Node(Object data) { + super(); + this.data = data; + } + } + + public String toString(){ + String result = "["; + if(this.size == 0){ + result = result + "]"; + return result; + }else{ + Node pres = this.head; + while(pres != null){ + result = result + pres.data + ","; + pres = pres.next; + } + result = result.substring(0,result.length()-1); + result = result + "]"; + return result; + } + } +} diff --git a/group04/1299310140/src/com/coding/basic/Queue.java b/group04/1299310140/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..c6a2c30b77 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/Queue.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +public class Queue { + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + this.elementData.addLast(o); + } + + public Object deQueue(){ + return this.elementData.removeFirst(); + } + + public boolean isEmpty(){ + if(this.elementData.size() == 0){ + return true; + }else{ + return false; + } + } + + public int size(){ + return this.elementData.size(); + } + + public String toString(){ + return this.elementData.toString(); + } +} diff --git a/group04/1299310140/src/com/coding/basic/Stack.java b/group04/1299310140/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..848ed142e0 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/Stack.java @@ -0,0 +1,34 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + this.elementData.add(o); + } + + public Object pop(){ + return this.elementData.remove(this.elementData.size()-1); + } + + public Object peek(){ + return this.elementData.get(this.elementData.size()-1); + } + + public boolean isEmpty(){ + if(this.elementData.size() == 0){ + return true; + }else{ + return false; + } + } + + public int size(){ + return this.elementData.size(); + } + + public String toString(){ + return this.elementData.toString(); + } + +} diff --git a/group04/1751801281/.classpath b/group04/1751801281/.classpath new file mode 100644 index 0000000000..e72ef7c0d4 --- /dev/null +++ b/group04/1751801281/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group04/1751801281/.gitignore b/group04/1751801281/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/1751801281/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/1751801281/.project b/group04/1751801281/.project new file mode 100644 index 0000000000..767083b86b --- /dev/null +++ b/group04/1751801281/.project @@ -0,0 +1,17 @@ + + + 1751801281Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/1751801281/src/com/coding/basic/ArrayList.java b/group04/1751801281/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..68bc111bc4 --- /dev/null +++ b/group04/1751801281/src/com/coding/basic/ArrayList.java @@ -0,0 +1,100 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + public void add(Object o) { + // 进行扩容检查 + ensureCapacity(size + 1); + elementData[size++] = o; + } + + public void add(int index, Object o) { + if (index > size || index < 0) + throw new IndexOutOfBoundsException("数组越界异常"); + ensureCapacity(size + 1); + // 对数组进行复制处理,目的就是空出index的位置插入o,并将index后的元素位移一个位置 + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index) { + if (index < 0 || index > elementData.length) { + return null; + } else if (index > size && index < elementData.length) { + return null; + } else { + return elementData[index]; + } + } + + public Object remove(int index) { + if (index < 0 || index > elementData.length) { + return null; + } else { + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + elementData[--size] = null; + return elementData[index]; + } + } + + public int size() { + return size; + } + + public void ensureCapacity(int minCapacity) { + if (minCapacity > elementData.length) { + grow(minCapacity); + } + } + + public void grow(int minCapacity) { + // 当前数组的长度 + int oldCapacity = elementData.length; + // 最小需要的容量大于当前数组的长度则进行扩容 + if (minCapacity > oldCapacity) { + Object oldData[] = elementData; + // 新扩容的数组长度为旧容量的1.5倍+1 + int newCapacity = (oldCapacity * 3) / 2 + 1; + // 如果新扩容的数组长度还是比最小需要的容量小,则以最小需要的容量为长度进行扩容 + if (newCapacity < minCapacity) + newCapacity = minCapacity; + // 进行数据拷贝,Arrays.copyOf底层实现是System.arrayCopy() + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + public Iterator iterator() { + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + int cursor; // index of next element to return + int lastRet = -1; // index of last element returned; -1 if no such + + public boolean hasNext() { + return cursor != size; + } + + public Object next() { + int i = cursor; + if (i >= size) + throw new NoSuchElementException(); + Object[] elementData = ArrayList.this.elementData; + if (i >= elementData.length) + throw new ConcurrentModificationException(); + cursor = i + 1; + return elementData[lastRet = i]; + } + } +} diff --git a/group04/1751801281/src/com/coding/basic/Iterator.java b/group04/1751801281/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e7cbd474ec --- /dev/null +++ b/group04/1751801281/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group04/1751801281/src/com/coding/basic/LinkedList.java b/group04/1751801281/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..3fca710056 --- /dev/null +++ b/group04/1751801281/src/com/coding/basic/LinkedList.java @@ -0,0 +1,133 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + private Node tail; + private int size; + + private static class Node { + Object data; + Node next; + Node previous; + } + + public void add(Object o) { + if (head == null) { + head = new Node(); + head.data = o; + tail = head; + } else { + Node oldtail = tail; + tail = new Node(); + tail.data = o; + tail.next = null; + tail.previous = oldtail; + oldtail.next = tail; + } + size++; + } + + public void add(int index, Object o) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("数组越界异常"); + } else if (index == size) { + Node oldtail = tail; + tail = new Node(); + tail.data = o; + tail.previous = oldtail; + oldtail.next = tail; + size++; + } else { + + } + size++; + } + + public Object get(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("数组越界异常"); + } + for (int i = 0; i < index; i++) { + head = head.next; + } + return head.data; + } + + public Object remove(int index) { + + return null; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node oldhead = head; + head = new Node(); + head.data = o; + head.next = oldhead; + head.previous = null; + oldhead.previous = head; + size++; + } + + public void addLast(Object o) { + Node oldtail = tail; + tail = new Node(); + tail.data = o; + tail.previous = oldtail; + tail.next = null; + oldtail.next = tail; + size++; + } + + public Object removeFirst() { + Object data = head.data; + head = head.next; + head.previous = null; + size--; + return data; + } + + public Object removeLast() { + Object data = tail.data; + tail = tail.previous; + tail.next = null; + size--; + return data; + } + + public Iterator iterator() { + + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + int cursor; + int lastReset = -1; + + @Override + public boolean hasNext() { + return size != cursor; + } + + @Override + public Object next() { + int i = cursor; + if (i > size) { + throw new NoSuchElementException(); + } + Node n = head; + for (int j = 0; j < i; j++) { + n = n.next; + } + cursor = i + 1; + lastReset = i; + return n.data; + } + } +} \ No newline at end of file diff --git a/group04/1751801281/src/com/coding/basic/List.java b/group04/1751801281/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group04/1751801281/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/1751801281/src/com/coding/basic/Queue.java b/group04/1751801281/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..2c513f5b6b --- /dev/null +++ b/group04/1751801281/src/com/coding/basic/Queue.java @@ -0,0 +1,27 @@ +package com.coding.basic; + +public class Queue { + + private int size; + + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o) { + elementData.add(o); + size++; + } + + public Object deQueue() { + size--; + return elementData.removeFirst(); + + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group04/1751801281/src/com/coding/basic/Stack.java b/group04/1751801281/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..28852147e8 --- /dev/null +++ b/group04/1751801281/src/com/coding/basic/Stack.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + private int size; + + public void push(Object o) { + elementData.add(o); + size++; + } + + public Object pop() { + return elementData.remove(--size); + } + + public Object peek() { + return elementData.get(size - 1); + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group04/1751801281/test/com/coding/basic/ArrayListTest.java b/group04/1751801281/test/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..ed7c6549ed --- /dev/null +++ b/group04/1751801281/test/com/coding/basic/ArrayListTest.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +import org.junit.Test; + +public class ArrayListTest { + + @Test + public void testArrayList(){ + ArrayList list = new ArrayList(); + list.add("0"); + list.add("1"); + list.add("2"); + list.add("3"); + list.add("4"); + list.add("5"); + list.add("6"); + list.add("7"); + list.add("8"); + list.add(2,"9"); + list.add("10"); + list.add(3,"11"); + System.out.println(list.get(3)); + System.out.println("======"); + Iterator it = list.iterator(); + while(it.hasNext()){ + System.out.print(it.next()+" "); + } + + } +} diff --git a/group04/1751801281/test/com/coding/basic/LinkedListTeat.java b/group04/1751801281/test/com/coding/basic/LinkedListTeat.java new file mode 100644 index 0000000000..ac1b0c118e --- /dev/null +++ b/group04/1751801281/test/com/coding/basic/LinkedListTeat.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +import org.junit.Test; + +public class LinkedListTeat { + + @Test + public void testLinkedList(){ + LinkedList list = new LinkedList(); + list.add("0"); + list.add("1"); + list.add("2"); + list.add(1, "3"); + list.addFirst("4"); + list.addLast("5"); + list.removeFirst(); + list.removeLast(); + System.out.println(list.get(0)); + System.out.println(list.get(1)); + System.out.println(list.get(2)); + System.out.println(list.get(1)); + System.out.println("========"); + + Iterator it = list.iterator(); + while(it.hasNext()){ + System.out.print(it.next()+" "); + } + } +} diff --git a/group04/1751801281/test/com/coding/basic/QueueTest.java b/group04/1751801281/test/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..ba2be4262b --- /dev/null +++ b/group04/1751801281/test/com/coding/basic/QueueTest.java @@ -0,0 +1,16 @@ +package com.coding.basic; + +import org.junit.Test; + +public class QueueTest { + + @Test + public void testQueue(){ + Queue q = new Queue(); + q.enQueue("a"); + q.enQueue("b"); + q.enQueue("c"); + q.deQueue(); + System.out.println(q.size()); + } +} diff --git a/group04/1751801281/test/com/coding/basic/StackTest.java b/group04/1751801281/test/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..a133f0ec1f --- /dev/null +++ b/group04/1751801281/test/com/coding/basic/StackTest.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +import org.junit.Test; + +public class StackTest { + + @Test + public void testStack() { + Stack s = new Stack(); + s.push("0"); + s.push("1"); + s.push("2"); + s.push("3"); + s.push("4"); + System.out.println(s.pop()); + System.out.println(s.peek()); + + } +} diff --git a/group04/1796244932/.gitignore b/group04/1796244932/.gitignore new file mode 100644 index 0000000000..b241c62e19 --- /dev/null +++ b/group04/1796244932/.gitignore @@ -0,0 +1,138 @@ +.metadata/ +RemoteSystemsTempFiles/ +.recommenders/ + +*.iml + +# Created by https://www.gitignore.io/api/eclipse,intellij,java + +### Eclipse ### + +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +*/.idea/ +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# End of https://www.gitignore.io/api/eclipse,intellij,java diff --git a/group04/1796244932/learn01/.gitignore b/group04/1796244932/learn01/.gitignore new file mode 100644 index 0000000000..83ef0e8099 --- /dev/null +++ b/group04/1796244932/learn01/.gitignore @@ -0,0 +1,6 @@ +.settings/ +/target/ +.classpath +.project +/bin/ + diff --git a/group04/1796244932/learn01/pom.xml b/group04/1796244932/learn01/pom.xml new file mode 100644 index 0000000000..06c26f00c8 --- /dev/null +++ b/group04/1796244932/learn01/pom.xml @@ -0,0 +1,53 @@ + + 4.0.0 + + com.dudy + learn01 + 0.0.1-SNAPSHOT + jar + + learn01 + http://maven.apache.org + + + UTF-8 + + + + + + dom4j + dom4j + 1.6 + + + junit + junit + 4.11 + test + + + org.junit.jupiter + junit-jupiter-api + RELEASE + + + + + + + + jdk-1.8 + + true + 1.8 + + + 1.8 + 1.8 + 1.8 + + + + diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java new file mode 100644 index 0000000000..5a8e82aaaf --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java @@ -0,0 +1,124 @@ +package com.dudy.learn01.base; + +import java.util.Arrays; + +public class MyArrayList implements MyList { + + private int size = 0; + + private Object[] elementData = new Object[16]; + + /** + * 增加元素: ①数组没满之前,直接添加到最后,满了扩容添加 + */ + public void add(Object o) { + // 检查是否需要扩容 + this.checkGrow(size + 1); + elementData[size++] = o; + } + + /** + * 检查是否需要扩容 + * + * @param newSize + */ + private void checkGrow(int newSize) { + if (newSize > elementData.length) { + this.grow(elementData); + } + } + + /** + * 扩容 + * + * @param oldElementData + */ + private void grow(Object[] oldElementData) { + int lenth = (int) (oldElementData.length * 1.5); + elementData = Arrays.copyOf(oldElementData, lenth); + } + + /** + * 根据索引添加:①同 add ② 可能会出现 index 超出当前位置的情况 ③往 中间插入时需要移位 + */ + public void add(int index, Object o) { + // 检查是否需要扩容 + if (index > size || index < 0) { + throw new RuntimeException("Index: " + index + ", Size: " + size); + } + this.checkGrow(size + 1); + // 循环移位 + int tmp = size; + for (int i = 0; i < size - index; i++) { + elementData[tmp] = elementData[tmp - 1]; + tmp--; + } + // 索引位置赋值 + elementData[index] = o; + size++; + } + + /** + * 直接返回相应数组下标就好 + */ + public Object get(int index) { + return elementData[index]; + } + + /** + * 删除元素:①注意移位 + */ + public Object remove(int index) { + // 检查是否需要扩容 + if (index > size || index < 0) { + throw new RuntimeException("Index: " + index + ", Size: " + size); + } + Object desc = elementData[index]; + + for (int i = 0; i < size - index; i++) { + elementData[index] = elementData[index+1]; + index++; + } + size--; + return desc; + } + + public int size() { + return this.size; + } + + public MyIterator iterator() { + + + return new MyItr(); + } + + public class MyItr implements MyIterator{ + + int cursor; + + + + public boolean hasNext() { + return cursor != size; + } + + public Object next() { + + return elementData[cursor++]; + } + } + + + + @Override + public String toString() { + StringBuffer str = new StringBuffer(); + str.append("["); + for (int i = 0; i < size; i++) { + str.append(elementData[i]+","); + } + str.append("]"); + return str.toString(); + } +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayUtil.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayUtil.java new file mode 100644 index 0000000000..f5f6535e17 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayUtil.java @@ -0,0 +1,194 @@ +package com.dudy.learn01.base; + +import java.util.*; + +public class MyArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static void reverseArray(int[] origin){ + // + for (int i = 0; i < origin.length / 2; i++) { + int temp = origin[i]; + origin[i] = origin[origin.length-1-i]; + origin[origin.length-1-i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray){ + int count = 0; + + + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i] == 0){ + count++; + } + } + + int resArray[] = new int[oldArray.length - count]; + int j = 0; + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i] > 0){ + resArray[j++] = oldArray[i]; + } + } + + return resArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + + Set set = new HashSet(); + + for (int i = 0;i restList = new ArrayList(); + restList.add(1); + restList.add(1); + + while ((restList.get(restList.size() -2 ) + restList.get(restList.size() -1) )< max){ + restList.add(restList.get(restList.size() -2) + restList.get(restList.size() -1) ); + } + + return restList.toArray(new Integer[]{}); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public static Integer[] getPrimes(int max){ + + List list = new ArrayList<>(); + + for (int i = 1; i< max;i++){ + if (isPrime(i)){ + list.add(i); + } + } + return list.toArray(new Integer[]{}); + } + + private static boolean isPrime(int num) { + + boolean flag = true; + for (int i = 2; i< num ;i++){ + if(num % i == 0){ + flag = false; + } + } + + return flag; + + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public static Integer[] getPerfectNumbers(int max){ + + List list = new ArrayList(); + for (int i = 1; i< max; i++){ + int tmp = 0; + for (int j = 1; j < i/2 + 1 ;j++){ + if (i % j == 0) + tmp += j; + } + + if(tmp == i){ + list.add(i); + } + } + + + return list.toArray(new Integer[]{}); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param seperator + * @return + */ + public static String join(int[] array, String seperator){ + StringBuilder builder = new StringBuilder(); + for (int i = 0; i< array.length - 1 ; i++){ + builder.append(array[i]).append(seperator); + } + builder.append(array[array.length-1]); + return builder.toString(); + } + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java new file mode 100644 index 0000000000..cfc06bc0d2 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java @@ -0,0 +1,71 @@ +package com.dudy.learn01.base; + +public class MyBinaryTree { + + private Node root; + + public Node getRoot() { + return root; + } + + static class Node { + private int data; + private Node left; + private Node right; + + public Node(int data) { + this.data = data; + } + + } + + public Node insert(int o) { + Node newNode = new Node(o); + + if (root == null) { + root = newNode; + return newNode; + } + Node currentNode = root; + + while (true) { + // System.out.println("currentNode: " + currentNode.data ); + if (o <= currentNode.data) { // left + + if (currentNode.left != null) { + currentNode = currentNode.left; + } else { + currentNode.left = newNode; + // System.out.println("left return ..."); + // System.out.println(""); + return newNode; + } + } else { // right + if (currentNode.right != null) { + currentNode = currentNode.right; + } else { + currentNode.right = newNode; + // System.out.println("right return ..."); + // System.out.println(""); + return newNode; + } + } + + } + + } + + public void display(Node root) { + + System.out.print(root.data + " "); + if (root.left != null) { + display(root.left); + } + if (root.right != null) { + display(root.right); + } + } + + + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyIterator.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyIterator.java new file mode 100644 index 0000000000..e53306fa03 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyIterator.java @@ -0,0 +1,6 @@ +package com.dudy.learn01.base; +public interface MyIterator { + public boolean hasNext(); + public Object next(); + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java new file mode 100644 index 0000000000..60254997aa --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java @@ -0,0 +1,132 @@ +package com.dudy.learn01.base; + + +public class MyLinkedList implements MyList { + + private int size = 0; + + private Node head; + + public void add(Object o) { + Node newNode = new Node(o); + newNode.next = head;// next --> head + head = newNode; // head --> newNode + size++; + } + + public void add(int index, Object o) { + checkRange(index); + Node current = getCurrentNode(index); + Node newNode = new Node(o); + newNode.next = current.next;//new next --> next + current.next = newNode; // next -->new + size++; + } + + private Node getCurrentNode(int index) {// 获取当前节点 + Node current = head; + for(int i = 0; i< size-index -1; i++){ + current = current.next; + } + return current; + } + + private void checkRange(int index) { + if(index > size || index < 0){ + throw new RuntimeException("indexOutOfException:" + "Index: " + index + ", Size: " + size); + } + } + + public Object get(int index) { + checkRange(index); + Node node = getCurrentNode(index); + return node.data; + } + + public Object remove(int index) { + if(size < 1){// ①没有元素的情况 + throw new RuntimeException("NoSuchElementException: size= " + size); + } + if(index == 0) return removeFirst(); + if(index == size - 1) return removeLast(); + + Node node = getCurrentNode(index+1); + node.next = node.next.next; + size--; + return node.data; + } + + public int size() { + return size; + } + + public void addLast(Object o) { + add(o); + } + + public void addFirst(Object o) { + Node current = head; + while(current.next != null){// 找到最后一个节点 + current = current.next; + } + Node newNode = new Node(o); + current.next = newNode; + size++; + } + + public Object removeFirst() { + Node currentNode = getCurrentNode(1); + Node tmp = currentNode.next; + currentNode.next = null; + size--; + return tmp ==null? currentNode.data:tmp.data;// 可能只有一个数据 + } + + public Object removeLast() { + Node tmp = head; + head = head.next; + size--; + return tmp.data; + } + + public MyIterator iterator() { + return new MyLinkedListItr(); + } + + + public class MyLinkedListItr implements MyIterator { + + int cursor; + + public boolean hasNext() { + return cursor != size; + } + + public Object next() { + Node currentNode = getCurrentNode(cursor++); + return currentNode.data; + } + } + + private static class Node { + Object data; + Node next; + public Node() { + } + public Node(Object data) { + this.data = data; + } + } + + + private void displayLink() {// 自己调试使用 + Node current = head; + while(current != null){ + System.out.print(current.data); + current = current.next; + } + System.out.println(""); + } + + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyList.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyList.java new file mode 100644 index 0000000000..455727381d --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyList.java @@ -0,0 +1,8 @@ +package com.dudy.learn01.base; +public interface MyList { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java new file mode 100644 index 0000000000..25b9da93f2 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java @@ -0,0 +1,22 @@ +package com.dudy.learn01.base; +public class MyQueue { + + private MyLinkedList elementData = new MyLinkedList(); + + public void enQueue(Object o){ + elementData.addLast(o); + } + + public Object deQueue(){ + + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + return elementData.size() == 0 ; + } + + public int size(){ + return elementData.size(); + } +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java new file mode 100644 index 0000000000..e59c366e0a --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java @@ -0,0 +1,26 @@ +package com.dudy.learn01.base; +public class MyStack { + private MyArrayList elementData = new MyArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + + Object o = elementData.get(elementData.size()-1); + elementData.remove(elementData.size()); + return o; + } + + public Object peek(){ + + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/ActionPojoParseXML.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/ActionPojoParseXML.java new file mode 100644 index 0000000000..09b8b3a952 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/ActionPojoParseXML.java @@ -0,0 +1,58 @@ +package com.dudy.learn01.litestruts; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by dudy on 2017/3/1. + * 解析xml对象 + * + * + */ +public class ActionPojoParseXML { + + private String name; + private String classname; + + private Map childElement; + + + public ActionPojoParseXML(String name, String classname) { + this.name = name; + this.classname = classname; + childElement = new HashMap<>(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassname() { + return classname; + } + + public void setClassname(String classname) { + this.classname = classname; + } + + public Map getChildElement() { + return childElement; + } + + public void setChildElement(Map childElement) { + this.childElement = childElement; + } + + @Override + public String toString() { + return "ActionPojoParseXML{" + + "name='" + name + '\'' + + ", classname='" + classname + '\'' + + ", childElement=" + childElement + + '}'; + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/LoginAction.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/LoginAction.java new file mode 100644 index 0000000000..0aeffe1852 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/LoginAction.java @@ -0,0 +1,48 @@ +package com.dudy.learn01.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "error"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } + + @Override + public String toString() { + return "LoginAction{" + + "name='" + name + '\'' + + ", password='" + password + '\'' + + ", message='" + message + '\'' + + '}'; + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/Struts.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/Struts.java new file mode 100644 index 0000000000..28b306d17d --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/Struts.java @@ -0,0 +1,147 @@ +package com.dudy.learn01.litestruts; + +import com.dudy.learn01.utils.StringUtils; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + + + //0. 读取配置文件struts.xml + Map parseXml = null; + try { + parseXml = parseXml(); + } catch (DocumentException e) { + e.printStackTrace(); + } + +// 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) +// 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 +// ("name"="test" , "password"="1234") , +// 那就应该调用 setName和setPassword方法 + ActionPojoParseXML actionPojoParseXML = parseXml.get(actionName); + + Object result = null; + + Map viewParameters = new HashMap(); + + try { + Class actionClass = Class.forName(actionPojoParseXML.getClassname()); + Object base = actionClass.newInstance(); + + + for (Map.Entry entry : parameters.entrySet()) { + System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); + // 这里 只能传递object吧 + Method method = actionClass.getDeclaredMethod(methodNameconversion(entry.getKey()), String.class); + method.setAccessible(true); + method.invoke(base,entry.getValue()); + } + + +// 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + + Method method = actionClass.getDeclaredMethod("execute"); + method.setAccessible(true); + result = method.invoke(base); +// 3. 通过反射找到对象的所有getter方法(例如 getMessage), +// 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , +// 放到View对象的parameters + + Method[] methods = actionClass.getDeclaredMethods(); + + for(int i = 0; i< methods.length ; i++){ + methods[i].setAccessible(true); + String methodName = methods[i].getName(); + if (methodName.startsWith("get")){ + Object value = methods[i].invoke(base); + viewParameters.put( StringUtils.lowerFirstLetter(methodName.substring(3)), + value); + } + + } + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } + +// 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, +// 放到View对象的jsp字段中。 + + View view = new View(); + view.setJsp(actionPojoParseXML.getChildElement().get(result)); + + view.setParameters(viewParameters); + System.out.println(view); + + return view; + } + + /** + * + * @param key + * @return + */ + private static String methodNameconversion(String key) { + return "set" + StringUtils.upperFirstLetter(key); + } + + /** + * 解析xml 获取解析对象 + * @return + * @throws DocumentException + */ + private static Map parseXml() throws DocumentException { + SAXReader reader = new SAXReader(); + File file = new File("/Users/dudy/coding2017-1/group04/1796244932/learn01/src/main/resource/struts.xml"); + Document document = reader.read(file); + Element root = document.getRootElement(); + List childElements = root.elements(); + + Map result = new HashMap<>(); + + + for (Element child : childElements) { + + ActionPojoParseXML parseXML = new ActionPojoParseXML( + child.attributeValue("name"), + child.attributeValue("class")); + + //未知子元素名情况下 + List elementList = child.elements(); + for (Element ele : elementList) { + parseXML.getChildElement().put(ele.attributeValue("name"),ele.getText()); + } + result.put(parseXML.getName(),parseXML); + } +// System.out.println(result); + return result; + } + + public static void main(String[] args) throws DocumentException { + parseXml(); + } + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/View.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/View.java new file mode 100644 index 0000000000..c7e95083ca --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/View.java @@ -0,0 +1,31 @@ +package com.dudy.learn01.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } + + @Override + public String toString() { + return "View{" + + "jsp='" + jsp + '\'' + + ", parameters=" + parameters + + '}'; + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/utils/StringUtils.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/utils/StringUtils.java new file mode 100644 index 0000000000..78b9b7beda --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/utils/StringUtils.java @@ -0,0 +1,174 @@ +package com.dudy.learn01.utils; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/8/16
+ *     desc  : 字符串相关工具类
+ * 
+ */ +public class StringUtils { + + private StringUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + /** + * 判断字符串是否为null或长度为0 + * + * @param s 待校验字符串 + * @return {@code true}: 空
{@code false}: 不为空 + */ + public static boolean isEmpty(CharSequence s) { + return s == null || s.length() == 0; + } + + /** + * 判断字符串是否为null或全为空格 + * + * @param s 待校验字符串 + * @return {@code true}: null或全空格
{@code false}: 不为null且不全空格 + */ + public static boolean isSpace(String s) { + return (s == null || s.trim().length() == 0); + } + + /** + * 判断两字符串是否相等 + * + * @param a 待校验字符串a + * @param b 待校验字符串b + * @return {@code true}: 相等
{@code false}: 不相等 + */ + public static boolean equals(CharSequence a, CharSequence b) { + if (a == b) return true; + int length; + if (a != null && b != null && (length = a.length()) == b.length()) { + if (a instanceof String && b instanceof String) { + return a.equals(b); + } else { + for (int i = 0; i < length; i++) { + if (a.charAt(i) != b.charAt(i)) return false; + } + return true; + } + } + return false; + } + + /** + * 判断两字符串忽略大小写是否相等 + * + * @param a 待校验字符串a + * @param b 待校验字符串b + * @return {@code true}: 相等
{@code false}: 不相等 + */ + public static boolean equalsIgnoreCase(String a, String b) { + return (a == b) || (b != null) && (a.length() == b.length()) && a.regionMatches(true, 0, b, 0, b.length()); + } + + /** + * null转为长度为0的字符串 + * + * @param s 待转字符串 + * @return s为null转为长度为0字符串,否则不改变 + */ + public static String null2Length0(String s) { + return s == null ? "" : s; + } + + /** + * 返回字符串长度 + * + * @param s 字符串 + * @return null返回0,其他返回自身长度 + */ + public static int length(CharSequence s) { + return s == null ? 0 : s.length(); + } + + /** + * 首字母大写 + * + * @param s 待转字符串 + * @return 首字母大写字符串 + */ + public static String upperFirstLetter(String s) { + if (isEmpty(s) || !Character.isLowerCase(s.charAt(0))) return s; + return String.valueOf((char) (s.charAt(0) - 32)) + s.substring(1); + } + + /** + * 首字母小写 + * + * @param s 待转字符串 + * @return 首字母小写字符串 + */ + public static String lowerFirstLetter(String s) { + if (isEmpty(s) || !Character.isUpperCase(s.charAt(0))) return s; + return String.valueOf((char) (s.charAt(0) + 32)) + s.substring(1); + } + + /** + * 反转字符串 + * + * @param s 待反转字符串 + * @return 反转字符串 + */ + public static String reverse(String s) { + int len = length(s); + if (len <= 1) return s; + int mid = len >> 1; + char[] chars = s.toCharArray(); + char c; + for (int i = 0; i < mid; ++i) { + c = chars[i]; + chars[i] = chars[len - i - 1]; + chars[len - i - 1] = c; + } + return new String(chars); + } + + /** + * 转化为半角字符 + * + * @param s 待转字符串 + * @return 半角字符串 + */ + public static String toDBC(String s) { + if (isEmpty(s)) return s; + char[] chars = s.toCharArray(); + for (int i = 0, len = chars.length; i < len; i++) { + if (chars[i] == 12288) { + chars[i] = ' '; + } else if (65281 <= chars[i] && chars[i] <= 65374) { + chars[i] = (char) (chars[i] - 65248); + } else { + chars[i] = chars[i]; + } + } + return new String(chars); + } + + /** + * 转化为全角字符 + * + * @param s 待转字符串 + * @return 全角字符串 + */ + public static String toSBC(String s) { + if (isEmpty(s)) return s; + char[] chars = s.toCharArray(); + for (int i = 0, len = chars.length; i < len; i++) { + if (chars[i] == ' ') { + chars[i] = (char) 12288; + } else if (33 <= chars[i] && chars[i] <= 126) { + chars[i] = (char) (chars[i] + 65248); + } else { + chars[i] = chars[i]; + } + } + return new String(chars); + } +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/resource/struts.xml b/group04/1796244932/learn01/src/main/resource/struts.xml new file mode 100644 index 0000000000..309f4213a2 --- /dev/null +++ b/group04/1796244932/learn01/src/main/resource/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java new file mode 100644 index 0000000000..5c6edd8fec --- /dev/null +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java @@ -0,0 +1,59 @@ +package com.dudy.learn01.base; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Iterator; + +public class MyArrayListTest { + + + + @Test + public void iteraterTest(){ + MyArrayList list = new MyArrayList(); + for (int i = 0; i < 20; i++) { + list.add(i); + } + + + for(MyIterator it = list.iterator(); it.hasNext();){ + System.out.print(it.next() + " "); + } + + + } + + @Test + public void myArrayListTest() { + MyArrayList list = new MyArrayList(); + for (int i = 0; i < 20; i++) { + list.add(i); + } + + list.add(1, "s"); + list.add(21, 21); + System.out.println("--" + list.size()); + System.out.println(list); + + Object remove = list.remove(3); + System.out.println("remove:" + remove); + System.out.println("--" + list.size()); + System.out.println(list); + } + + @Test + public void arrayListTest(){ + + ArrayList list = new ArrayList(); + list.add("1"); + list.add("2"); + + for (Iterator it = list.iterator(); it.hasNext();){ + System.out.println(it.next()); + } + + } + + +} diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayUtilTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayUtilTest.java new file mode 100644 index 0000000000..25fd306dc9 --- /dev/null +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayUtilTest.java @@ -0,0 +1,99 @@ +package com.dudy.learn01.base; + +import org.junit.Test; + +/** + *
+ *
+ * 
+ * + * @author dudy; + * @version \$Id: MyArrayUtilTest, v 1.0 2017/2/28 15:39 dudy Exp; + */ +public class MyArrayUtilTest { + + + public void print(int desArr[]){ + for (int i = 0; i < desArr.length; i++) { + System.out.print(desArr[i] + ","); + } + } + + public void print(Integer desArr[]){ + for (int i = 0; i < desArr.length; i++) { + System.out.print(desArr[i] + ","); + } + } + + + @Test + public void testReverseArray() throws Exception { + + int origin[] = new int[]{7, 9, 30, 3, 4}; + + MyArrayUtil.reverseArray(origin); + for (int i = 0; i list = new LinkedList(); + Integer first = list.removeFirst(); + } + +} diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java new file mode 100644 index 0000000000..de8d683abe --- /dev/null +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java @@ -0,0 +1,27 @@ +package com.dudy.learn01.base; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by dudy on 2017/2/20. + */ +public class MyQueueTest { + @Test + public void enQueue() throws Exception { + + + MyQueue queue = new MyQueue(); + queue.enQueue("1"); +// queue.enQueue("2"); +// +// queue.enQueue("3"); + + while (queue.size() > 0){ + System.out.println(queue.deQueue()); + } + + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java new file mode 100644 index 0000000000..51175953b0 --- /dev/null +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java @@ -0,0 +1,58 @@ +package com.dudy.learn01.base; + +import org.junit.Test; + +import java.util.Stack; + +import static org.junit.Assert.*; + +/** + * Created by dudy on 2017/2/20. + */ +public class MyStackTest { + @Test + public void push() throws Exception { + + MyStack stack = new MyStack(); + stack.push("1"); + stack.push("2"); + stack.push("3"); + + Object pop = stack.pop(); + System.out.println( "size :" + stack.size() + "pop:" + pop); + Object peek = stack.peek(); + System.out.println( "size :" + stack.size() + "peek: " + peek); + } + + @Test + public void pop() throws Exception { + + } + + @Test + public void peek() throws Exception { + + } + + @Test + public void isEmpty() throws Exception { + + } + + @Test + public void size() throws Exception { + + } + + @Test + public void stackTest(){ + Stack stack = new Stack(); + stack.push("1"); + stack.push("2"); + stack.peek(); + stack.pop(); + System.out.println(stack.size()); + + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/litestruts/StrutsTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/litestruts/StrutsTest.java new file mode 100644 index 0000000000..2b96b508a7 --- /dev/null +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/litestruts/StrutsTest.java @@ -0,0 +1,42 @@ +package com.dudy.learn01.litestruts; + +import com.dudy.learn01.litestruts.Struts; +import com.dudy.learn01.litestruts.View; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group04/1906242834/.classpath b/group04/1906242834/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group04/1906242834/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group04/1906242834/.gitignore b/group04/1906242834/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/1906242834/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/1906242834/.project b/group04/1906242834/.project new file mode 100644 index 0000000000..a30533712f --- /dev/null +++ b/group04/1906242834/.project @@ -0,0 +1,17 @@ + + + 1906242834Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/1906242834/src/com/coderising/array/ArrayUtil.java b/group04/1906242834/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..3090bb09b1 --- /dev/null +++ b/group04/1906242834/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,327 @@ +package com.coderising.array; +import java.util.HashSet; +import java.util.Set; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int temp; + for (int i=0;i x = new HashSet<>(); + for (int i = 0; i < array_merge.length; i++) { + x.add(array_merge[i]); + } + + Integer[] arr = x.toArray(new Integer[x.size()]); + //进行排序,采用插入排序 + for (int i = 0; i < arr.length; i++) { + for (int j = i+1; j < arr.length; j++) { + if (arr[i]>arr[j]) { + int tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } + } + } + int[] array_merger = new int[arr.length]; + for (int i = 0; i < arr.length; i++) { + array_merger[i] = arr[i].intValue(); + } + for (int i : array_merger) { + System.out.println(i); + } + return array_merger; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + //确定数组的长度 + int length = oldArray.length + size; + int[] newArray = new int [length]; + //对数组的原有元素进行赋值 + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + //对扩容的元素进行赋值为0的操作 + for (int i = oldArray.length; i < newArray.length; i++) { + newArray[i] = 0; + } + //打印数组 + System.out.print(newArray[0]); + for (int j = 1; j < newArray.length; j++) { + System.out.print(","+newArray[j]); + } + System.out.print("\n"); + return newArray; + + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int a = 1, b = 1, count = 0; + int c = 2; + while(c parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + + +} + diff --git a/group04/1906242834/src/com/coderising/litestruts/StrutsTest.java b/group04/1906242834/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..73a0d3d639 --- /dev/null +++ b/group04/1906242834/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,47 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} + + + diff --git a/group04/1906242834/src/com/coderising/litestruts/View.java b/group04/1906242834/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..f68a8c438b --- /dev/null +++ b/group04/1906242834/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group04/1906242834/src/com/coderising/litestruts/struts.xml b/group04/1906242834/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e64e8017a9 --- /dev/null +++ b/group04/1906242834/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,14 @@ + + + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + + diff --git a/group04/1906242834/src/com/coding/basic/ArrayList.java b/group04/1906242834/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..224bb70ab0 --- /dev/null +++ b/group04/1906242834/src/com/coding/basic/ArrayList.java @@ -0,0 +1,72 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + //若插入元素后会溢出,则对数组进行扩容,在这里只把空间加1 + if ((size()+1)>elementData.length) { + System.arraycopy(elementData, 0, elementData, 0, elementData.length+1); + elementData[size] = o; + size++; + }else { + //若插入元素后不出现溢出,则直接添加在末尾 + elementData[size] = o; + } + } + //index在length范围之内正常插入,若index大于length则抛出异常 + public void add(int index, Object o){ + Object temp; + if (index index; i--) { + elementData[i-1] = elementData[i-2]; + } + elementData[index] = o; + }else if (index==elementData.length) { + add(o); + }else{ + System.out.println("ArrayIndexOutOfBoundsException"); + } + } + + public Object get(int index){ + if (index<=elementData.length-1) { + return elementData[index]; + }else { + System.out.println("ArrayIndexOutOfBoundsException"); + } + return elementData; + } + + public Object remove(int index){ + if (indexsize()){ + System.out.println("IndexOutOfBound"); + } + Node temp = head; + Node newnode = new Node(); + newnode.setData(o); + for (int i = 0; i < index-1; i++) { + temp = temp.getNext(); + } + if(temp.getNext()==null){ + temp.setNext(newnode); + size ++; + }else{ + temp.setNext(newnode); + newnode.setNext(temp.getNext()); + size ++; + } + + } + public Object get(int index){ + Node temp = head; + int a =0; + while (a<=index) { + temp = temp.getNext(); + a += 1; + return temp.getData(); + } + return null; + + } + public Object remove(int index){ + if(head==null){ + return null; + } + Node temp = head; + Object i = get(index); + while(temp.getNext()!=i){ + temp = temp.getNext(); + } + + temp.setNext(temp.getNext().getNext()); + size--; + + return i; + } + + public int size(){ + size = 0; + if (head==null) { + System.out.println("LikedList长度为0"); + return size; + } + Node temp = head; + while(temp.getNext()!=null){ + size += 1; + temp = temp.getNext(); + } + return size; + } + + public void addFirst(Object o){ + Node newnode = new Node(); + newnode.setData(o); + newnode.setNext(head); + size++; + } + + public void addLast(Object o){ + Node newnode = new Node(); + newnode.setData(o); + tail.setNext(newnode); + newnode.setNext(null); + size++; + } + public Object removeFirst(){ + if(head==null){ + return null; + } + head.setNext(null); + return get(0); + } + public Object removeLast(){ + Object i = get(size-1); + Node newnode = new Node(); + newnode.setData(i); + newnode.setNext(null); + return i; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + //获取当前节点数据 + public Object getData(){ + return data; + } + //设置当前节点数据 + public void setData(Object data){ + this.data = data; + } + //返回下一个节点 + public Node getNext(){ + return next; + } + //设置下一个节点 + public void setNext(Node next){ + this.next = next; + } + } +} \ No newline at end of file diff --git a/group04/1906242834/src/com/coding/basic/List.java b/group04/1906242834/src/com/coding/basic/List.java new file mode 100644 index 0000000000..c86b745572 --- /dev/null +++ b/group04/1906242834/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group04/1906242834/src/com/coding/basic/Queue.java b/group04/1906242834/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..cda22180d7 --- /dev/null +++ b/group04/1906242834/src/com/coding/basic/Queue.java @@ -0,0 +1,49 @@ +package com.coding.basic; + +public class Queue { + private ArrayList elementData = new ArrayList(); + + public void enQueue(Object o){ + int length = elementData.size(); + for (int i = 0; i < length; i++) { + if(elementData.get(i)==null){ + elementData.add(i, o); + } + } + length = elementData.size()-1; + } + + public Object deQueue(){ + for (int i = 0; i < elementData.size(); i++) { + if(elementData.get(i)!=null){ + elementData.remove(i); + return elementData.get(i); + } + } + return null; + } + + public boolean isEmpty(){ + int a =0; + for (int i = 0; i < elementData.size(); i++) { + if(elementData.get(i)==null){ + a+=1; + } + } + if(a==elementData.size()){ + return true; + }else{ + return false; + } + } + + public int size(){ + int size=0; + for (int i = 0; i < elementData.size(); i++) { + if(elementData.get(i)==null){ + size += 1; + } + } + return size; + } +} \ No newline at end of file diff --git a/group04/1906242834/src/com/coding/basic/Stack.java b/group04/1906242834/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..133cbaebbe --- /dev/null +++ b/group04/1906242834/src/com/coding/basic/Stack.java @@ -0,0 +1,35 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + for (int i = 0; i < elementData.size(); i++) { + if(elementData.get(i)==null){ + elementData.add(i, o); + } + } + } + + + public Object pop(){ + int length = elementData.size(); + elementData.remove(length-1); + return elementData.get(length-1); + } + + public Object peek(){ + int length = elementData.size(); + return elementData.get(length-1); + } + public boolean isEmpty(){ + if(elementData.size()==0){ + return true; + }else{ + return false; + } + } + public int size(){ + return elementData.size(); + } +} \ No newline at end of file diff --git a/group04/1972376180/.classpath b/group04/1972376180/.classpath new file mode 100644 index 0000000000..f5d4a033ec --- /dev/null +++ b/group04/1972376180/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group04/1972376180/.gitignore b/group04/1972376180/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/1972376180/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/1972376180/.project b/group04/1972376180/.project new file mode 100644 index 0000000000..4d88cb9125 --- /dev/null +++ b/group04/1972376180/.project @@ -0,0 +1,17 @@ + + + Coding2017 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/1972376180/src/tong/java/one/MyArrayList.java b/group04/1972376180/src/tong/java/one/MyArrayList.java new file mode 100644 index 0000000000..6fa9c02106 --- /dev/null +++ b/group04/1972376180/src/tong/java/one/MyArrayList.java @@ -0,0 +1,76 @@ +package tong.java.one; + +import java.util.Arrays; + +/** + * 自定义ArrayList + * + * @author tong + * + */ +public class MyArrayList { + private Object[] datas = new Object[10]; + private int size; + + // 默认在集合末尾添加元素 + public void add(Object o) { + if (datas[0] == null) { + datas[0] = o; + } else { + if (size < datas.length) { + datas[size] = o; + } else { + datas = grow(5); + datas[size] = o; + } + } + size++; + } + + // 指定索引处添加元素 + public void add(int index, Object o) { + if (index > size - 1) { + throw new ArrayIndexOutOfBoundsException(); + } else { + if (size + 1 > datas.length) { + datas = grow(5); + } + datas[index] = o; + for (int i = index + 1; i < size - 1; i++) { + datas[i] = datas[i + 1]; + } + size++; + } + } + + // 获取指定索引处的的元素 + public Object get(int index) { + if (index > size - 1) { + throw new ArrayIndexOutOfBoundsException(); + } else { + return datas[index]; + } + } + + // 删除指定索引处的元素 + public Object remove(int index) { + if (index > size - 1) { + throw new ArrayIndexOutOfBoundsException(); + } else { + Object removeData = datas[index]; + for (int i = index; i < size - 1; i++) { + datas[index] = datas[index + 1]; + } + size--; + return removeData; + } + } + + public int size() { + return size; + } + + private Object[] grow(int length) { + return Arrays.copyOf(datas, datas.length + length); + } +} diff --git a/group04/1972376180/src/tong/java/one/MyLinkedList.java b/group04/1972376180/src/tong/java/one/MyLinkedList.java new file mode 100644 index 0000000000..9414199264 --- /dev/null +++ b/group04/1972376180/src/tong/java/one/MyLinkedList.java @@ -0,0 +1,127 @@ +package tong.java.one; + +/** + * 自定义LinkedList + * + * @author 仝闯 + * + */ +public class MyLinkedList { + private Node head; + private int size; + + // 默认在链表的结尾添加元素 + public void add(Object o) { + Node newNode = new Node(o); + if (size == 0) { + head = newNode; + } else if (size == 1) { + Node oldHead = head; + head = newNode; + head.next = oldHead; + } else { + getNode(size - 1).next = newNode; + } + size++; + } + + // 在指定索引出添加元素 + public void add(int index, Object o) { + Node newNode = new Node(o); + if (size == 0) { + head = newNode; + } else if (size == 1) { + Node oldHead = head; + head = newNode; + head.next = oldHead; + } else { + if (index == 0) { + Node oldHead = head; + head = newNode; + head.next = oldHead; + } else if (index == size - 1) { + getNode(size - 1).next = newNode; + } else { + for (int i = 1; i < index; i++) { + getNode(index - 1).next = newNode; + newNode.next = getNode(index); + } + } + } + size++; + } + + // 添加元素到首位 + public void addFirst(Object o) { + Node oldHead = head; + head = new Node(o); + head.next = oldHead; + size++; + } + + // 获取指定索引处的元素 + public Object get(int index) { + return getNode(index).data; + } + + private Node getNode(int index) { + Node x = head; + if (index == 0) { + return head; + } else { + for (int i = 0; i < index; i++) { + x = x.next; + } + return x; + } + + } + + // 删除指定索引处的元素 + public Object remove(int index) { + if (index < 0 || index > size - 1) { + throw new RuntimeException(); + } else { + if (0 < index && index < size - 1) { + getNode(index - 1).next = getNode(index + 1); + size--; + return getNode(index); + } else if (index == 0) { + Node removeNode = head; + removeNode.next = null; + head = getNode(1); + size--; + return removeNode; + } else { + getNode(index - 1).next = null; + size--; + return getNode(index); + } + } + + } + + // 删除首位元素 + public Object removeFirst() { + return remove(0); + } + + // 删除末位元素 + public Object removeLast() { + return remove(size - 1); + } + + public int size() { + return size; + } + + class Node { + Object data; + Node next; + + public Node(Object data) { + this.data = data; + } + } + +} diff --git a/group04/1972376180/src/tong/java/one/MyQueue.java b/group04/1972376180/src/tong/java/one/MyQueue.java new file mode 100644 index 0000000000..47124b105d --- /dev/null +++ b/group04/1972376180/src/tong/java/one/MyQueue.java @@ -0,0 +1,34 @@ +package tong.java.one; +/** + * 自定义队列 + * @author tong + * + */ +public class MyQueue { + private MyLinkedList datas = new MyLinkedList(); + private int size; + + + public void enqueue(Object o) { + datas.add(o); + size++; + } + + public Object dequeue() { + Object firstData = datas.removeFirst(); + size--; + return firstData; + } + + public boolean isEmpty() { + if (size == 0) { + return true; + } else { + return false; + } + } + + public int size() { + return size; + } +} diff --git a/group04/1972376180/src/tong/java/one/MyStack.java b/group04/1972376180/src/tong/java/one/MyStack.java new file mode 100644 index 0000000000..9f80d9de6e --- /dev/null +++ b/group04/1972376180/src/tong/java/one/MyStack.java @@ -0,0 +1,38 @@ +package tong.java.one; +/** + * 自定义栈 + * @author tong + * + */ +public class MyStack { + private MyArrayList datas = new MyArrayList(); + private int size; + //入栈 + public void push(Object o){ + datas.add(o); + size++; + } + //出栈 + public Object pop(){ + Object topData = datas.remove(size-1); + size--; + return topData; + } + + public Object peek(){ + return datas.get(size-1); + } + + public boolean isEmpty(){ + if(size==0){ + return true; + }else{ + return false; + } + } + + public int size(){ + return size; + } + +} diff --git a/group04/1972376180/src/tong/java/two/ArrayUtil.java b/group04/1972376180/src/tong/java/two/ArrayUtil.java new file mode 100644 index 0000000000..4ee45a5430 --- /dev/null +++ b/group04/1972376180/src/tong/java/two/ArrayUtil.java @@ -0,0 +1,236 @@ +package tong.java.two; + +import java.util.ArrayList; +import java.util.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if(checkArrray(origin)){ + return; + } + int length = origin.length; + for (int i = 0; i < length / 2; i++) { + int a = origin[length - 1 - i]; + origin[length - 1 - i] = origin[i]; + origin[i] = a; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + if(checkArrray(oldArray)){ + return null; + } + List newArrayList = new ArrayList(); + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArrayList.add(oldArray[i]); + } + } + int[] newArray = IntegerToIntArray(newArrayList); + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + return null; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max == 1) { + return new int[0]; + } else { + ArrayList newArrayList = new ArrayList(); + int i = 0; + while (fibo(i) < max) { + newArrayList.add(fibo(i)); + i++; + } + int[] newArray = IntegerToIntArray(newArrayList); + return newArray; + } + + } + + /** + * 返回索引为i处的斐波那契数 + * + * @param i + * @return + */ + public int fibo(int i) { + if (i == 0) { + return 1; + } else if (i == 1) { + return 1; + } else { + return fibo(i - 1) + fibo(i - 2); + } + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + ArrayList newArrayList = new ArrayList(); + newArrayList.add(2); + for (int i = 3; i < max; i++) { + for (int j = 2; j < i; j++) { + if (i % j == 0) { + break; + } + if (j + 1 >= i) { + newArrayList.add(i); + } + } + } + int[] newArray = IntegerToIntArray(newArrayList); + return newArray; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + ArrayList newArrayList = new ArrayList(); + for (int i = 0; i < max; i++) { + if (isPerfectNumber(i)) { + newArrayList.add(i); + } + } + return IntegerToIntArray(newArrayList); + } + + /** + * 判断一个数是否为完数 + * + * @param num + * @return + */ + public boolean isPerfectNumber(int num) { + int[] params = getPara(num); + int plus = 0; + for (int i = 0; i < params.length; i++) { + plus = plus + params[i]; + } + if (num == plus) { + return true; + } else { + return false; + + } + } + + /** + * 获取一个数的所有因子 + * + * @param num + * @return + */ + public int[] getPara(int num) { + ArrayList paras = new ArrayList(); + paras.add(1); + for (int i = 2; i < num / 2; i++) { + if (num % i == 0) { + if (!(paras.contains(i) && paras.contains(num / i))) { + paras.add(i); + paras.add(num / i); + } + } + } + int[] newArray = IntegerToIntArray(paras); + return newArray; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + StringBuffer result = new StringBuffer(); + for (int i = 0; i < array.length; i++) { + result.append(array[i]); + if (i != array.length - 1) { + result.append(seperator); + } + } + return result.toString(); + } + + /** + * 将一个泛型为Integer的集合转为int[]数组 + * + * @param list + * @return + */ + public int[] IntegerToIntArray(List list) { + int[] newArray = new int[list.size()]; + for (int j = 0; j < list.size(); j++) { + newArray[j] = list.get(j).intValue(); + } + return newArray; + } + + public boolean checkArrray(int[] origin) { + if (origin.length == 0 || origin.length == 1) { + return true; + } else { + return false; + } + } + +} diff --git a/group04/1972376180/src/tong/java/two/ArrayUtilTest.java b/group04/1972376180/src/tong/java/two/ArrayUtilTest.java new file mode 100644 index 0000000000..15a324feef --- /dev/null +++ b/group04/1972376180/src/tong/java/two/ArrayUtilTest.java @@ -0,0 +1,96 @@ +package tong.java.two; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + ArrayUtil util = new ArrayUtil(); + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverseArray() { + int[] a = { 7, 9, 30, 3, 70 }; + util.reverseArray(a); + for (int i = 0; i < a.length; i++) { + System.out.println(a[i]); + } + } + + @Test + public void testRemoveZero() { + fail("Not yet implemented"); + } + + @Test + public void testMerge() { + int[] a = { 2, 4, 7 }; + int[] b = { 4, 8, 9 }; + int[] c = util.merge(a, b); + for (int i = 0; i < c.length; i++) { + System.out.println(c[i]); + } + } + + @Test + public void testGrow() { + int[] oldArray = { 2, 4, 7 }; + int[] newArray = util.grow(oldArray, 3); + for (int i = 0; i < newArray.length; i++) { + System.out.println(newArray[i]); + } + } + + @Test + public void testFibonacci() { + int[] result = util.fibonacci(1); + for (int i = 0; i < result.length; i++) { + System.out.println(result[i]); + } + } + + @Test + public void testGetPrimes() { + int[] result = util.getPrimes(15); + for (int i = 0; i < result.length; i++) { + System.out.println(result[i]); + } + } + + @Test + public void testGetPerfectNumbers() { + int[] result = util.getPerfectNumbers(100); + for (int i = 0; i < result.length; i++) { + System.out.println(result[i]); + } + } + + @Test + public void testJoin() { + int[] array = { 3, 2 }; + System.out.println(util.join(array, "~")); + } + + @Test + public void testFibo() { + System.out.println(util.fibo(5)); + } + + @Test + public void testGetParas() throws Exception { + int[] paras = util.getPara(20); + for (int i = 0; i < paras.length; i++) { + System.out.println(paras[i]); + } + } + +} diff --git a/group04/1972376180/src/tong/java/two/struts/Action.java b/group04/1972376180/src/tong/java/two/struts/Action.java new file mode 100644 index 0000000000..8b639090f1 --- /dev/null +++ b/group04/1972376180/src/tong/java/two/struts/Action.java @@ -0,0 +1,34 @@ +package tong.java.two.struts; + +import java.util.ArrayList; + +public class Action { + private String name; + private String className; + private ArrayList results; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public ArrayList getResults() { + return results; + } + + public void setResults(ArrayList results) { + this.results = results; + } + +} diff --git a/group04/1972376180/src/tong/java/two/struts/LoginAction.java b/group04/1972376180/src/tong/java/two/struts/LoginAction.java new file mode 100644 index 0000000000..0af9286d85 --- /dev/null +++ b/group04/1972376180/src/tong/java/two/struts/LoginAction.java @@ -0,0 +1,39 @@ +package tong.java.two.struts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author tong + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group04/1972376180/src/tong/java/two/struts/Result.java b/group04/1972376180/src/tong/java/two/struts/Result.java new file mode 100644 index 0000000000..19fead8f61 --- /dev/null +++ b/group04/1972376180/src/tong/java/two/struts/Result.java @@ -0,0 +1,23 @@ +package tong.java.two.struts; + +public class Result { + private String name; + private String page; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPage() { + return page; + } + + public void setPage(String page) { + this.page = page; + } + +} diff --git a/group04/1972376180/src/tong/java/two/struts/Root.java b/group04/1972376180/src/tong/java/two/struts/Root.java new file mode 100644 index 0000000000..cdc9eb127b --- /dev/null +++ b/group04/1972376180/src/tong/java/two/struts/Root.java @@ -0,0 +1,17 @@ +package tong.java.two.struts; + +import java.util.ArrayList; + +public class Root { + private ArrayList action; + + public ArrayList getAction() { + return action; + } + + public void setAction(ArrayList action) { + this.action = action; + } + + +} diff --git a/group04/1972376180/src/tong/java/two/struts/Struts.java b/group04/1972376180/src/tong/java/two/struts/Struts.java new file mode 100644 index 0000000000..cb844a793d --- /dev/null +++ b/group04/1972376180/src/tong/java/two/struts/Struts.java @@ -0,0 +1,120 @@ +package tong.java.two.struts; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + private static Root strutsRoot; + private static Action action = null; + + public static View runAction(String actionName, + Map parameters) { + View view = new View(); + + /* + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + */ + + //读取配置文件 + strutsRoot = readStruts(); + for (Action a : strutsRoot.getAction()) { + if (actionName.contains(a.getName())) { + action = a; + } + } + if (action != null) { + try { + if (action.getName().equals("login")) { + //通过反射生成LoginAction实例 + LoginAction loginAction = (LoginAction) Class.forName( + action.getClassName()).newInstance(); + loginAction.setName(parameters.get("name")); + loginAction.setPassword(parameters.get("password")); + //通过反射,执行execute方法 + Method method = LoginAction.class.getMethod("execute", null);// + String result = (String) method.invoke(loginAction, null); + HashMap params = new HashMap(); + params.put("message", loginAction.getMessage()); + view.setParameters(params); + for (Result r : action.getResults()) { + if (result.equals(r.getName())) { + view.setJsp(r.getPage()); + } + } + + } + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + } + return view; + } + + private static Root readStruts() { + SAXReader reader = new SAXReader(); + try { + Document document = reader.read(new File( + "/tong/java/two/struts/struts.xml")); + Root strutsRoot = new Root(); + Element root = document.getRootElement(); + ArrayList actionList = new ArrayList(); + List elements = root.elements("action"); + for (Element e : elements) { + Action action = new Action(); + action.setName(e.attributeValue("name")); + action.setClassName(e.attributeValue("class")); + List results = e.elements("result"); + ArrayList resultList = new ArrayList(); + for (Element e_result : results) { + Result result = new Result(); + result.setName(e_result.attributeValue("name")); + result.setPage(e_result.getTextTrim()); + resultList.add(result); + } + action.setResults(resultList); + actionList.add(action); + } + strutsRoot.setAction(actionList); + return strutsRoot; + } catch (DocumentException e) { + throw new RuntimeException(); + } + } + +} diff --git a/group04/1972376180/src/tong/java/two/struts/StrutsTest.java b/group04/1972376180/src/tong/java/two/struts/StrutsTest.java new file mode 100644 index 0000000000..ba21c9b955 --- /dev/null +++ b/group04/1972376180/src/tong/java/two/struts/StrutsTest.java @@ -0,0 +1,43 @@ +package tong.java.two.struts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group04/1972376180/src/tong/java/two/struts/View.java b/group04/1972376180/src/tong/java/two/struts/View.java new file mode 100644 index 0000000000..3ae8316e4f --- /dev/null +++ b/group04/1972376180/src/tong/java/two/struts/View.java @@ -0,0 +1,23 @@ +package tong.java.two.struts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/1972376180/src/tong/java/two/struts/struts.xml b/group04/1972376180/src/tong/java/two/struts/struts.xml new file mode 100644 index 0000000000..7e48cb5af0 --- /dev/null +++ b/group04/1972376180/src/tong/java/two/struts/struts.xml @@ -0,0 +1,12 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/2082945465/.gitignore b/group04/2082945465/.gitignore new file mode 100644 index 0000000000..3f016d5a8c --- /dev/null +++ b/group04/2082945465/.gitignore @@ -0,0 +1,138 @@ +.metadata/ +RemoteSystemsTempFiles/ +.recommenders/ + +*.iml + +# Created by https://www.gitignore.io/api/eclipse,intellij,java + +### Eclipse ### + +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +*/.idea/ +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +*.iml +modules.xml +.idea/misc.xml +# *.ipr + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# End of https://www.gitignore.io/api/eclipse,intellij,java diff --git a/group04/2082945465/week01/src/Hello.java b/group04/2082945465/week01/src/Hello.java new file mode 100644 index 0000000000..ac6e67463e --- /dev/null +++ b/group04/2082945465/week01/src/Hello.java @@ -0,0 +1,7 @@ +package src; + +public class Hello { + public static void main(String[] args) { + System.out.println("Hello! World!"); + } +} diff --git a/group04/2082945465/week01/src/MyArrayList.java b/group04/2082945465/week01/src/MyArrayList.java new file mode 100644 index 0000000000..798475771c --- /dev/null +++ b/group04/2082945465/week01/src/MyArrayList.java @@ -0,0 +1,79 @@ +package src; + +import java.util.Arrays; + +/** + * Created by Yang on 2/25/2017. + */ +public class MyArrayList implements MyList { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + @Override + public void add(Object obj) { + this.checkCapacity(size+1); + elementData[size++] = obj; + } + + @Override + public void add(int index, Object obj) { + this.validIndex(index); + this.checkCapacity(size+1); + if(index < size){ + for(int i = size; i > index; i--){ + this.elementData[i] = this.elementData[i-1]; + } + }else{ + this.elementData[index] = obj; + } + this.size++; + } + + @Override + public Object get(int index) { + this.validIndex(index); + return this.elementData[index]; + } + + @Override + public Object remove(int index) { + this.validIndex(index); + Object o = this.elementData[index]; + for(int i = index; i < this.size-1; i++){ + this.elementData[i] = this.elementData[i+1]; + } + this.size--; + return o; + } + + @Override + public int size() { + return this.size; + } + + private void checkCapacity(int newSize) { + if(newSize > elementData.length){ + this.extend(elementData); + } + } + + private void extend(Object[] oldElementData) { + int newLength = (int) (oldElementData.length * 1.5); + elementData = Arrays.copyOf(oldElementData, newLength); + } + + private void validIndex(int inputIndex) { + if(inputIndex > size || inputIndex < 0){ + throw new RuntimeException("Index: " + inputIndex + " out of bounds( " + size +" )"); + } + } + + public boolean isEmpty() { + if (size() == 0){ + return false; + } + return true; + } +} diff --git a/group04/2082945465/week01/src/MyIterator.java b/group04/2082945465/week01/src/MyIterator.java new file mode 100644 index 0000000000..245fa82be8 --- /dev/null +++ b/group04/2082945465/week01/src/MyIterator.java @@ -0,0 +1,9 @@ +package src; + +/** + * Created by Yang on 2/25/2017. + */ +public interface MyIterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group04/2082945465/week01/src/MyLinkedList.java b/group04/2082945465/week01/src/MyLinkedList.java new file mode 100644 index 0000000000..69f518ba0f --- /dev/null +++ b/group04/2082945465/week01/src/MyLinkedList.java @@ -0,0 +1,111 @@ +package src; + +/** + * Created by Yang on 2/25/2017. + */ +public class MyLinkedList implements MyList { + + private int size = 0; + + private Node header; + + @Override + public void add(Object obj) { + Node newNode = new Node(obj); + newNode.next = header; + header = newNode; + size++; + } + + @Override + public void add(int index, Object obj) { + this.validIndex(index); + Node current = this.getCurrentNode(index); + Node newNode = new Node(obj); + newNode.next = current.next; + current.next = newNode; + size++; + } + + @Override + public Object get(int index) { + this.validIndex(index); + Node node = getCurrentNode(index); + return node.data; + } + + @Override + public Object remove(int index) { + this.validIndex(index); + + if(index == 0) return removeFirst(); + if(index == size -1) return removeLast(); + + Node node = getCurrentNode(index+1); + node.next = node.next.next; + size--; + return node.data; + } + + @Override + public int size() { + return size; + } + + private static class Node { + Object data; + Node next; + public Node(){ + } + public Node(Object data) { + this.data = data; + } + } + + private void validIndex(int inputIndex) { + if(inputIndex > size || inputIndex < 0){ + throw new RuntimeException("Index: " + inputIndex + " out of bounds( " + size +" )"); + } + } + + private Node getCurrentNode(int index) { + Node current = header; + for(int i = 0; i < size-index -1; i++){ + current = current.next; + } + return current; + } + + public Object removeFirst() { + Node temp = new Node(); + temp.next = header; + temp.next = header.next; + return temp.next; + } + + private Object removeLast() { + Node preNode = new Node(); + while (preNode.next.next != null) { + preNode = preNode.next; + } + Node lastNode = preNode.next.next; + preNode.next = null; + return lastNode; + } + + public void addLast(Object o){ + Node preNode = new Node(); + while (preNode.next != null){ + preNode = preNode.next; + } + Node lastNode = new Node(o); + preNode.next = lastNode; + } + + public boolean isEmpty() { + if (size() == 0){ + return false; + } + return true; + } +} diff --git a/group04/2082945465/week01/src/MyList.java b/group04/2082945465/week01/src/MyList.java new file mode 100644 index 0000000000..578c86b803 --- /dev/null +++ b/group04/2082945465/week01/src/MyList.java @@ -0,0 +1,12 @@ +package src; + +/** + * Created by Yang on 2/25/2017. + */ +public interface MyList { + public void add(Object obj); + public void add(int index, Object obj); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/2082945465/week01/src/MyQueue.java b/group04/2082945465/week01/src/MyQueue.java new file mode 100644 index 0000000000..87dc900c79 --- /dev/null +++ b/group04/2082945465/week01/src/MyQueue.java @@ -0,0 +1,20 @@ +package src; + +/** + * Created by Yang on 2/25/2017. + */ +public class MyQueue { + private MyLinkedList queue = new MyLinkedList(); + + public void enQuee(Object obj){ + queue.addLast(obj); + } + + public Object deQuee(Object obj){ + return queue.removeFirst(); + } + + public boolean isEmpty() { + return queue.isEmpty(); + } +} diff --git a/group04/2082945465/week01/src/MyStack.java b/group04/2082945465/week01/src/MyStack.java new file mode 100644 index 0000000000..3427d86e93 --- /dev/null +++ b/group04/2082945465/week01/src/MyStack.java @@ -0,0 +1,26 @@ +package src; + +import java.util.EmptyStackException; + +/** + * Created by Yang on 2/25/2017. + */ +public class MyStack { + + private MyArrayList stack = new MyArrayList(); + + public void push(Object obj){ + stack.add(obj); + } + + public Object pop(){ + if (stack.size()==0){ + throw new EmptyStackException(); + } + return stack.remove(stack.size()-1); + } + + public boolean isEmpty(){ + return stack.isEmpty(); + } +} diff --git a/group04/24658892/.classpath b/group04/24658892/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group04/24658892/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group04/24658892/.gitignore b/group04/24658892/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/24658892/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/24658892/.project b/group04/24658892/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group04/24658892/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/24658892/.settings/org.eclipse.jdt.core.prefs b/group04/24658892/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group04/24658892/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties new file mode 100644 index 0000000000..1e246d6631 --- /dev/null +++ b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties @@ -0,0 +1 @@ +#Sat Feb 25 00:50:00 CST 2017 diff --git a/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties.lock b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties.lock new file mode 100644 index 0000000000000000000000000000000000000000..3d46c4fdb6c459e6e75d1948949ce98aee4e5270 GIT binary patch literal 17 TcmZSf;JKb!7Ts>j00DvkCjbL7 literal 0 HcmV?d00001 diff --git a/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/fileHashes.bin b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..6c8a2ded5542424d0cbbb9df49f3b9073a4ea51f GIT binary patch literal 18697 zcmeI%KS%;$9LDjt2n-Fop+cf1oP-josWEB@8l3tM<>=BNMS_Hb1Q9~DC|sL0~kTTND+PwPZxS$9pewHMYg~h4%zLgSS@gU&|r1tZ@ zBbk(?|5UB!Ux#+R$DyqM|G~-Fhs`fXdr!T3*9*V?YwMz8e`zyP?0@FhYkKmFeX~7Q zv46*}4`X+liY~cGT>R zI+Nyvm9*rYdnHoIM<-{2^ep$w6 z6+++DOPX)Gjung9j_IxQym;F*VL5WEyT3#j2S0vqyln5SFRW*lBFD4aYT2Ax_M40~ z6+%C}+p;kyDvyvDx8ri>dwZ8K@)zgBYxTL@tARq__RjH{TK&6PUH!zPDuljL60<88 kE3s1;Zt%3BQ2z1V&s1`udG4>F#>UmypbViRph}u?4MRjI>i_@% literal 0 HcmV?d00001 diff --git a/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/taskArtifacts.bin b/group04/24658892/learnjava/.gradle/3.1/taskArtifacts/taskArtifacts.bin new file mode 100644 index 0000000000000000000000000000000000000000..ab6481b1b974fefedf1c72789b88ea3d8d71c116 GIT binary patch literal 19481 zcmeI%O=uHA6bJB0QxT=rP!J*>dhsHd-AYkWa%oMpiW+H+6$Ha%GbYo<>@qV=j9(`Y ziuDV;w20tAMO3_(f+&cdENFZ4P)|XqAVTfIgU)obBt3`$4~qO3HanTGeed@srz8l8 zMt;;U(zrG>nrJ})0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_@V^M8bs}s1WTIQ! zOk;h8ke&|R2=zFdj<&fCB|B5&md%@vtNJ#Hx~N2OH})YJP|!~Qdq zV2&%OV!2Rc>e{)bM6F}u!0gL~%DWwVLXk(Q`1=#x(dpPE`&#|5@sbX>{h^(fOh~)P zTzl9RqxJ|bQ~iyK(sIjxW93b#rFnKe9@}3Q3&Lw;`{K_w(u|K=ilk!cDwvY2zM11v z37#EO+%2U=@yTbhN|AU$DNpXUZJm9YJ4^<)n%Qn%A%k3ct!=R^FIi`~cdL0qKb6ev zc~Ov9D>d4DgsOsB6rA8LLe2=X&Tv~rTFP6=(%9+dK~Is$zQMl4!DJ>qlpM?qqz)xl zgkW~`)9MTgU?P+&CLOJML7dxLiZjvVW)?Sx^t*V&{reA(Q{fbNnf)E0;O)P%x$Ym) SWBTyxbK&cSb&d5;dG;qHBzn&P literal 0 HcmV?d00001 diff --git a/group04/24658892/learnjava/build.gradle b/group04/24658892/learnjava/build.gradle new file mode 100644 index 0000000000..95871ecbd7 --- /dev/null +++ b/group04/24658892/learnjava/build.gradle @@ -0,0 +1,14 @@ +group 'com.learnjava' +version '1.0-SNAPSHOT' + +apply plugin: 'java' + +repositories { + jcenter() +} + +dependencies { + compile fileTree(dir: 'libs', include: '*.jar') + compile group: 'xmlpull', name: 'xmlpull', version: '1.1.3.1' + testCompile group: 'junit', name: 'junit', version: '4.11' +} diff --git a/group04/24658892/learnjava/gradle/wrapper/gradle-wrapper.properties b/group04/24658892/learnjava/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..7d38f8e3be --- /dev/null +++ b/group04/24658892/learnjava/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Feb 25 00:50:00 CST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip diff --git a/group04/24658892/learnjava/gradlew b/group04/24658892/learnjava/gradlew new file mode 100644 index 0000000000..9aa616c273 --- /dev/null +++ b/group04/24658892/learnjava/gradlew @@ -0,0 +1,169 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/group04/24658892/learnjava/gradlew.bat b/group04/24658892/learnjava/gradlew.bat new file mode 100644 index 0000000000..f9553162f1 --- /dev/null +++ b/group04/24658892/learnjava/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/group04/24658892/learnjava/settings.gradle b/group04/24658892/learnjava/settings.gradle new file mode 100644 index 0000000000..5c0663e14b --- /dev/null +++ b/group04/24658892/learnjava/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'learnjava' + diff --git a/group04/24658892/learnjava/src/main/java/com/coding/array/ArrayUtil.java b/group04/24658892/learnjava/src/main/java/com/coding/array/ArrayUtil.java new file mode 100644 index 0000000000..d613ac1bbd --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/array/ArrayUtil.java @@ -0,0 +1,93 @@ +package com.coding.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + */ + public void reverseArray(int[] origin) { + int[] reverse = new int[origin.length]; + int k = 0; + for (int i = origin.length - 1; i >= 0; i--) { + reverse[k] = origin[i]; + k++; + } + System.arraycopy(reverse, 0, origin, 0, reverse.length); + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + */ + + public int[] removeZero(int[] oldArray) { + int[] tmp = new int[oldArray.length]; + int k = 0; + for (int i : oldArray) { + if (i != 0) { + tmp[k] = i; + k++; + } + } + int[] newArray = new int[k]; + System.arraycopy(tmp, 0, newArray, 0, k); + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + */ + + public int[] merge(int[] array1, int[] array2) { + return null; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + */ + public int[] grow(int[] oldArray, int size) { + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + */ + public int[] fibonacci(int max) { + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + */ + public int[] getPrimes(int max) { + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + */ + public int[] getPerfectNumbers(int max) { + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + */ + public String join(int[] array, String seperator) { + return null; + } + +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/ArrayList.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..afd9f2a3c8 --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/basic/ArrayList.java @@ -0,0 +1,77 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + int len = size + 1; + if (len == elementData.length) { + expandArray(); + } + elementData[size++] = o; + } + + public void add(int index, Object o) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + int remain = elementData.length - size; + if (remain == 0 || index == elementData.length) { + expandArray(); + } + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + private void expandArray() { + int len = elementData.length; + Object[] temp = new Object[len * 2]; + System.arraycopy(elementData, 0, temp, 0, len); + elementData = temp; + } + + public Object get(int index) { + if (index < 0) { + throw new IndexOutOfBoundsException(); + } + return elementData[index]; + } + + public Object remove(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + Object removed = elementData[index]; + int len = size - index - 1; + if (len > 0) { + System.arraycopy(elementData, index + 1, elementData, index, len); + } + elementData[--size] = null; + return removed; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + + private int cursor; + + public boolean hasNext() { + return cursor + 1 < size; + } + + public Object next() { + return elementData[++cursor]; + } + } +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/BinaryTreeNode.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/Iterator.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..aec01c6cc6 --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java @@ -0,0 +1,119 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private Node tail; + private int size; + + public LinkedList() { + head = new Node(null, null); + tail = head; + } + + public void add(Object o) { + tail = new Node(o, null); + if (head.next == null) { + head.next = tail; + } + else { + Node node = head.next; + int i = 0; + while (node.next != null && i < size) { + node = node.next; + i++; + } + node.next = tail; + } + size++; + } + + public void add(int index, Object o) { + if (index > size) { + throw new IndexOutOfBoundsException(); + } + if (index == 0) { + addFirst(o); + } + else if (index == size) { + addLast(o); + } + else { + Node node = head.next; + for (int i = 0; i < index; i++) { + node = node.next; + } + node.next = new Node(o, node.next); + } + size++; + } + + public Object get(int index) { + return null; + } + + public Object remove(int index) { + return null; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + head.next = new Node(o, head.next); + size++; + } + + public void addLast(Object o) { + Node node = tail; + tail = new Node(o, null); + node.next = tail; + size++; + } + + public Object removeFirst() { + if (head.next == null) { + throw new IndexOutOfBoundsException(); + } + Node node = head.next; + head.next = node.next; + node.next = null; + return node; + } + + public Object removeLast() { + return null; + } + + public Iterator iterator() { + return null; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if (size > 0) { + Node node = head.next; + int i = 0; + while (node.next != null && i < size) { + sb.append("index=").append(i).append(";value=").append(node.data).append("\n"); + node = node.next; + i++; + } + sb.append("index=").append(i).append(";value=").append(node.data).append("\n"); + } + return sb.toString(); + } + + private static class Node { + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + Object data; + Node next; + } +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/List.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java new file mode 100644 index 0000000000..90eb1fe9a6 --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +import java.util.EmptyStackException; + +public class Queue { + + private ArrayList elementData = new ArrayList(); + private int size = 0; + + public void enQueue(Object o) { + elementData.add(o); + size++; + } + + public Object deQueue() { + if (isEmpty()) { + throw new EmptyStackException(); + } + size--; + return elementData.remove(0); + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/basic/Stack.java b/group04/24658892/learnjava/src/main/java/com/coding/basic/Stack.java new file mode 100644 index 0000000000..4c6a362da2 --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/basic/Stack.java @@ -0,0 +1,36 @@ +package com.coding.basic; + +import java.util.EmptyStackException; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + private int size = 0; + + public void push(Object o) { + elementData.add(o); + size++; + } + + public Object pop() { + if (isEmpty()) { + throw new EmptyStackException(); + } + return elementData.remove(--size); + } + + public Object peek() { + if (this.isEmpty()) { + throw new EmptyStackException(); + } + return elementData.get(size - 1); + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Action.java b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Action.java new file mode 100644 index 0000000000..d2ba2d59fb --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Action.java @@ -0,0 +1,42 @@ +package com.coding.litestruts; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Action { + + private String name; + private String clazz; + private List resultList = new ArrayList<>(); + + public Action(String name, String clazz) { + + this.name = name; + this.clazz = clazz; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClazz() { + return clazz; + } + + public void setClazz(String clazz) { + this.clazz = clazz; + } + + public List getResultList() { + return Collections.unmodifiableList(resultList); + } + + public void addResultList(Result data) { + this.resultList.add(data); + } +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Result.java b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Result.java new file mode 100644 index 0000000000..a049f42514 --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Result.java @@ -0,0 +1,28 @@ +package com.coding.litestruts; + +public class Result { + + private String name; + private String page; + + public Result(String name, String page) { + this.name = name; + this.page = page; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPage() { + return page; + } + + public void setPage(String page) { + this.page = page; + } +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Struts.java b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Struts.java new file mode 100644 index 0000000000..af893c6b84 --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/Struts.java @@ -0,0 +1,130 @@ +package com.coding.litestruts; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserFactory; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +public class Struts { + + private static Struts instance = new Struts(); + + @SuppressWarnings("unchecked") + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + Map actions = instance.parseXml(); + Action action = actions.get(actionName); + View view = new View(); + view.setParameters(new HashMap<>()); + if (action != null) { + try { + Class clazz = Class.forName(action.getClazz()); + Object actionObj = clazz.newInstance(); + for (String s : parameters.keySet()) { + Method method = clazz.getDeclaredMethod("set" + captureName(s), String.class); + method.invoke(actionObj, parameters.get(s)); + } + Method method = clazz.getDeclaredMethod("execute"); + Object o = method.invoke(actionObj); + if (o != null) { + String flag = o.toString(); + for (Result res : action.getResultList()) { + if (flag.equals(res.getName())) { + view.setJsp(res.getPage()); + } + } + } + Method[] methods = clazz.getDeclaredMethods(); + for (Method m : methods) { + if (m.getName().startsWith("get")) { + view.getParameters().put(m.getName().substring(3).toLowerCase(), m.invoke(actionObj)); + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + return view; + } + + private Map parseXml() { + Map actionMap = new HashMap<>(); + try { + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + XmlPullParser pullParser = factory.newPullParser(); + pullParser.setInput(getClass().getClassLoader().getResourceAsStream("struts.xml"), null); + int event = pullParser.getEventType(); + String tag = null; + Action action = null; + Result result = null; + while (event != XmlPullParser.END_DOCUMENT) { + switch (event) { + case XmlPullParser.TEXT: + String s = pullParser.getText(); + if (result != null) { + result.setPage(s); + } + break; + case XmlPullParser.START_TAG: + tag = pullParser.getName(); + if ("action".equals(tag)) { + String name = pullParser.getAttributeValue(null, "name"); + String clazz = pullParser.getAttributeValue(null, "class"); + action = new Action(name, clazz); + actionMap.put(name, action); + } + else if ("result".equals(tag)) { + String name = pullParser.getAttributeValue(null, "name"); + result = new Result(name, ""); + if (action != null) { + action.addResultList(result); + } + } + break; + case XmlPullParser.END_TAG: + if ("action".equals(tag)) { + action = null; + } + else if ("result".equals(tag)) { + result = null; + } + tag = null; + break; + } + event = pullParser.next(); + } + } + catch (Exception e) { + e.printStackTrace(); + } + return actionMap; + } + + private static String captureName(String name) { + char[] cs = name.toCharArray(); + cs[0] -= 32; + return String.valueOf(cs); + } +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/litestruts/View.java b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/View.java new file mode 100644 index 0000000000..9652971e01 --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/View.java @@ -0,0 +1,27 @@ +package com.coding.litestruts; + +import java.util.Map; + +public class View { + + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/24658892/learnjava/src/main/java/com/coding/litestruts/action/LoginAction.java b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/action/LoginAction.java new file mode 100644 index 0000000000..dfc203c04b --- /dev/null +++ b/group04/24658892/learnjava/src/main/java/com/coding/litestruts/action/LoginAction.java @@ -0,0 +1,39 @@ +package com.coding.litestruts.action; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group04/24658892/learnjava/src/main/resources/struts.xml b/group04/24658892/learnjava/src/main/resources/struts.xml new file mode 100644 index 0000000000..221ee8d29c --- /dev/null +++ b/group04/24658892/learnjava/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/24658892/learnjava/src/test/java/com/coding/array/ArrayUtilTest.java b/group04/24658892/learnjava/src/test/java/com/coding/array/ArrayUtilTest.java new file mode 100644 index 0000000000..1037b30878 --- /dev/null +++ b/group04/24658892/learnjava/src/test/java/com/coding/array/ArrayUtilTest.java @@ -0,0 +1,24 @@ +package com.coding.array; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; + +public class ArrayUtilTest { + + @Test + public void reverseArray() throws Exception { + ArrayUtil arrayUtil = new ArrayUtil(); + int[] origin = { 0, 1, 2, 3, 4 }; + arrayUtil.reverseArray(origin); + Assert.assertEquals("[4, 3, 2, 1, 0]", Arrays.toString(origin)); + } + + @Test + public void removeZero() throws Exception { + ArrayUtil arrayUtil = new ArrayUtil(); + int[] origin = { 0, 1, 2, 0, 4 }; + Assert.assertEquals("[1, 2, 4]", Arrays.toString(arrayUtil.removeZero(origin))); + } +} \ No newline at end of file diff --git a/group04/24658892/learnjava/src/test/java/com/coding/basic/ArrayListTest.java b/group04/24658892/learnjava/src/test/java/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..73fce0f7f8 --- /dev/null +++ b/group04/24658892/learnjava/src/test/java/com/coding/basic/ArrayListTest.java @@ -0,0 +1,114 @@ +package com.coding.basic; + +import org.junit.Assert; +import org.junit.Test; + +public class ArrayListTest { + + @Test + public void add() throws Exception { + ArrayList data; + int size; + //size < 100 + data = new ArrayList(); + size = 33; + for (int i = 0; i < size; i++) { + data.add(i); + } + for (int i = 0; i < size; i++) { + Assert.assertEquals(i, data.get(i)); + } + //size > 100 + data = new ArrayList(); + size = 333; + for (int i = 0; i < size; i++) { + data.add(i); + } + for (int i = 0; i < size; i++) { + Assert.assertEquals(i, data.get(i)); + } + //size = 100 + data = new ArrayList(); + size = 100; + for (int i = 0; i < size; i++) { + data.add(i); + } + for (int i = 0; i < size; i++) { + Assert.assertEquals(i, data.get(i)); + } + } + + @Test + public void add1() throws Exception { + ArrayList data; + int size; + int index; + boolean b; + // size < 100; + data = new ArrayList(); + size = 5; + index = 2; + b = false; + for (int i = 0; i < size; i++) { + data.add(i); + } + data.add(index, index + 10000); + for (int i = 0; i < data.size(); i++) { + if (i == index) { + b = true; + Assert.assertEquals(index + 10000, data.get(i)); + } + else { + if (b) { + Assert.assertEquals(i - 1, data.get(i)); + } + else { + Assert.assertEquals(i, data.get(i)); + } + } + } + } + + @Test + public void get() throws Exception { + ArrayList data = new ArrayList(); + data.add(1); + data.add(2); + data.add(3); + Assert.assertEquals(2, data.get(1)); + } + + @Test + public void remove() throws Exception { + ArrayList data = new ArrayList(); + data.add(1); + data.add(2); + data.add(3); + data.remove(1); + Assert.assertEquals(2, data.size()); + Assert.assertEquals(1, data.get(0)); + Assert.assertEquals(3, data.get(1)); + } + + @Test + public void size() throws Exception { + ArrayList data = new ArrayList(); + data.add(1); + data.add(1); + data.add(1); + Assert.assertEquals(3, data.size()); + } + + @Test + public void iterator() throws Exception { + ArrayList data = new ArrayList(); + data.add(0); + data.add(1); + data.add(2); + Iterator iterator = data.iterator(); + int i = 0; + while (iterator.hasNext()) { + Assert.assertEquals(++i, iterator.next()); + } + } +} \ No newline at end of file diff --git a/group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java b/group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..8df8e631bf --- /dev/null +++ b/group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java @@ -0,0 +1,84 @@ +package com.coding.basic; + +import org.junit.Test; + +public class LinkedListTest { + + @Test + public void add() throws Exception { + LinkedList linkedList = new LinkedList(); + linkedList.add(0); + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + linkedList.add(4); + System.out.print(linkedList.toString()); + } + + @Test + public void add1() throws Exception { + LinkedList linkedList = new LinkedList(); + linkedList.add(0); + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + linkedList.add(4); + linkedList.add(2,21); + System.out.print(linkedList.toString()); + } + + @Test + public void get() throws Exception { + + } + + @Test + public void remove() throws Exception { + + } + + @Test + public void size() throws Exception { + + } + + @Test + public void addFirst() throws Exception { + LinkedList linkedList = new LinkedList(); + linkedList.addFirst(1); + linkedList.addFirst(2); + linkedList.addFirst(3); + System.out.print(linkedList.toString()); + } + + @Test + public void addLast() throws Exception { + LinkedList linkedList = new LinkedList(); + linkedList.addLast(1); + linkedList.addLast(2); + linkedList.addLast(3); + System.out.print(linkedList.toString()); + } + + @Test + public void removeFirst() throws Exception { + LinkedList linkedList = new LinkedList(); + linkedList.addLast(1); + linkedList.addLast(2); + linkedList.addLast(3); + linkedList.removeFirst(); + linkedList.removeFirst(); + System.out.print(linkedList.toString()); + } + + @Test + public void removeLast() throws Exception { + + } + + @Test + public void iterator() throws Exception { + + } + +} \ No newline at end of file diff --git a/group04/24658892/learnjava/src/test/java/com/coding/litestruts/StrutsTest.java b/group04/24658892/learnjava/src/test/java/com/coding/litestruts/StrutsTest.java new file mode 100644 index 0000000000..6c18c214e2 --- /dev/null +++ b/group04/24658892/learnjava/src/test/java/com/coding/litestruts/StrutsTest.java @@ -0,0 +1,38 @@ +package com.coding.litestruts; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git a/group04/24658892/learnjava/src/test/resources/struts.xml b/group04/24658892/learnjava/src/test/resources/struts.xml new file mode 100644 index 0000000000..221ee8d29c --- /dev/null +++ b/group04/24658892/learnjava/src/test/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/274407594/226/.classpath b/group04/274407594/226/.classpath new file mode 100644 index 0000000000..fb565a588d --- /dev/null +++ b/group04/274407594/226/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group04/274407594/226/.gitignore b/group04/274407594/226/.gitignore new file mode 100644 index 0000000000..5e56e040ec --- /dev/null +++ b/group04/274407594/226/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/group04/274407594/226/.project b/group04/274407594/226/.project new file mode 100644 index 0000000000..1f70b883ee --- /dev/null +++ b/group04/274407594/226/.project @@ -0,0 +1,17 @@ + + + 226 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/274407594/226/.settings/org.eclipse.jdt.core.prefs b/group04/274407594/226/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group04/274407594/226/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git "a/group04/312816708/blog/blog01/CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\343\200\201\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" "b/group04/312816708/blog/blog01/CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\343\200\201\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" new file mode 100644 index 0000000000..68542a9e7b --- /dev/null +++ "b/group04/312816708/blog/blog01/CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\343\200\201\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" @@ -0,0 +1,29 @@ +# CPU、内存、硬盘、指令之间的关系 + +## 1、简介 + +### 1.1 CPU +> CPU,中央处理器,是一个超大规模的集成电路,是一台计算机的运算核心和控制核心。它的主要功能是解释计算机指令以及处理计算机软件中的数据。 + +### 1.2 内存 +> 内存是计算机中重要的部件之一,它是与CPU沟通的桥梁。计算机中所有的程序都是在内存中运行的。其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换数据。 + +### 1.3 硬盘 +> 硬盘是计算机主要的存储媒介之一。硬盘分为固态硬盘(SSD 盘,新式硬盘)、机械硬盘(HDD 硬盘)、混合硬盘(HHD 一块基于传统机械硬盘诞生出来的新硬盘)。 + +### 1.4 指令 +> 指挥计算机工作的指示命令。程序是一系列按一定顺序排列的,执行程序的过程就是计算机的工作过程。 + +## 2、关系 +计算机在运行时,**CPU** 从**内存** 中获取第一条 **指令** ,然后内存再从硬盘中读取所需的数据。然后CPU再取出第二条指令,一直到指令结束。 + +## 3、参考资料 +[中央处理器 —— 百度百科](http://baike.baidu.com/item/%E4%B8%AD%E5%A4%AE%E5%A4%84%E7%90%86%E5%99%A8/284033?sefr=cr&fromtitle=CPU&fromid=120556) + +[内存 —— 百度百科](http://baike.baidu.com/item/%E5%86%85%E5%AD%98?sefr=enterbtn) + +[硬盘 —— 百度百科](http://baike.baidu.com/item/%E7%A1%AC%E7%9B%98?sefr=enterbtn) + +[计算机指令 —— 百度百科](http://baike.baidu.com/item/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%8C%87%E4%BB%A4) + + diff --git a/group04/312816708/coding/coding01/.gitignore b/group04/312816708/coding/coding01/.gitignore new file mode 100644 index 0000000000..22cb2e1fb7 --- /dev/null +++ b/group04/312816708/coding/coding01/.gitignore @@ -0,0 +1,7 @@ +# IntelliJ IDEA + +target/ +*.iml +*.ipr +*.iws +.idea/ \ No newline at end of file diff --git a/group04/312816708/coding/coding01/pom.xml b/group04/312816708/coding/coding01/pom.xml new file mode 100644 index 0000000000..9f29c935ae --- /dev/null +++ b/group04/312816708/coding/coding01/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.kevin + coding01 + 1.0-SNAPSHOT + + + \ No newline at end of file diff --git a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyArrayList.java b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyArrayList.java new file mode 100644 index 0000000000..5e4c1bdd2e --- /dev/null +++ b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyArrayList.java @@ -0,0 +1,117 @@ +package com.kevin.coding01.basic; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Created by YinWenBing on 2017/2/25. + */ +public class MyArrayList implements MyList { + private int size = 0; + private Object[] elementData = new Object[10]; + + /** + * 添加 + * 判断数组空间是否足够,不够则扩容,将元素放在数组末尾 + * + * @param e + */ + public void add(E e) { + isGrow(size + 1);//判断是否需要扩容 + elementData[size++] = e; + } + + /** + * 是否需要扩容 + * + * @param size + */ + private void isGrow(int size) { + if (size > elementData.length) { + grow(size); + } + } + + /** + * 扩容 + * + * @param minCapacity + */ + private void grow(int minCapacity) { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + (oldCapacity >> 1);//>>将oldCapacity向右移一位,右移一位代表除2,右移n位代表除以2的n次方。左移则是乘 + if (newCapacity - minCapacity < 0) { + newCapacity = minCapacity; + } else if (newCapacity - (Integer.MAX_VALUE - 8) > 0) { + newCapacity = hugeCapacity(minCapacity); + } + elementData = Arrays.copyOf(elementData, newCapacity); + } + + private int hugeCapacity(int minCapacity) { + if (minCapacity < 0) { + throw new OutOfMemoryError(); + } + return (minCapacity > (Integer.MAX_VALUE)) ? Integer.MAX_VALUE : Integer.MAX_VALUE - 8; + } + + /** + * 添加指定索引的元素 + * 判断索引是否小于0或大于size + * + * @param index + * @param e + */ + public void add(int index, E e) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } + isGrow(index); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = e; + size++; + } + + /** + * 根据索引获取数组中的元素 + * + * @param index + * @return + */ + public E get(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } + return (E) elementData[index]; + } + + /** + * 根据索引移除数组中的元素,如果移除中间的元素,后面的元素要往前移 + * + * @param index + * @return + */ + public E remove(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } + E oldValue = (E) elementData[index]; + + int numMoved = size - index - 1; + if (numMoved > 0) { + System.arraycopy(elementData, index + 1, elementData, index, numMoved); + elementData[--size] = null; + size--; + } + return oldValue; + } + + /** + * 获取数组中存放值得数量 + * + * @return + */ + public int size() { + return size; + } +} diff --git a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyLinkedList.java b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyLinkedList.java new file mode 100644 index 0000000000..4aa55cb9b9 --- /dev/null +++ b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyLinkedList.java @@ -0,0 +1,135 @@ +package com.kevin.coding01.basic; + +/** + * Created by YinWenBing on 2017/2/25. + */ +public class MyLinkedList implements MyList { + private Node first;//头节点 + private int size = 0;//默认大小为0 + + public void add(E e) { + if (size == 0) { + first = new Node(); + first.element = e; + size++; + } else { + Node head = first; + for (int i = 0; i < size - 1; i++) { + head = head.next; + } + + Node add = new Node(); + add.element = e; + head.next = add; + size++; + } + } + + + public void add(int index, E e) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("index:" + index + ";size:" + size); + } + Node prev = getNode(index - 1);//当前索引指向的节点的上一节点 + Node next = getNode(index);//当前索引指向的节点成为添加节点的next + Node add = new Node(); + add.element = e; + prev.next = add; + add.next = next; + size++; + } + + private Node getNode(int index) { + Node node = first; + + for (int i = 0; i < index; i++) { + node = first.next; + } + + return node; + } + + public E get(int index) { + if (index < 0 || index > size - 1) { + throw new IndexOutOfBoundsException("index:" + index + ";size:" + size); + } + + if (size == 0) { + return null; + } + + return getNode(index).element; + } + + public E remove(int index) { + if (index < 0 || index > size - 1) { + throw new IndexOutOfBoundsException("index:" + index + ";size:" + size); + } + + Node prev = getNode(index - 1); + Node next = getNode(index + 1); + + prev.next = next; + return getNode(index).element; + } + + public int size() { + return size; + } + + public void addFirst(E e) { + if (size == 0) { + first = new Node(); + first.element = e; + size++; + } else { + Node add = new Node(); + add.element = e; + add.next = first; + first = add; + size++; + } + } + + public void addLast(E e) { + Node oldLast = getNode(size - 1); + Node add = new Node(); + add.element = e; + oldLast.next = add; + size++; + } + + public E removeFirst() { + Node oldFirst = first; + if (first.next != null) { + first = first.next; + size--; + return (E) oldFirst.element; + } else {//只有一个节点或者一个节点也没有 + first = null; + return null; + } + } + + public E removeLast() { + Node last = getNode(size - 1); + if (last != null) { + E element = (E) last.element; + Node newLast = getNode(size - 2); + newLast.next = null; + size--; + return element; + } else { //一个节点都不存在 + return null; + } + } + + /** + * 静态内部类 + */ + private static class Node { + E element;//节点数据 + Node next;//下一节点 + } + +} diff --git a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyList.java b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyList.java new file mode 100644 index 0000000000..15758bd837 --- /dev/null +++ b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyList.java @@ -0,0 +1,17 @@ +package com.kevin.coding01.basic; + +/** + * Created by YinWenBing on 2017/2/25. + */ +public interface MyList { + + void add(E e); + + void add(int index, E e); + + E get(int index); + + E remove(int index); + + int size(); +} diff --git a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyQueue.java b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyQueue.java new file mode 100644 index 0000000000..feff484d76 --- /dev/null +++ b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyQueue.java @@ -0,0 +1,35 @@ +package com.kevin.coding01.basic; + +/** + * 队列:先进先出 + * Created by YinWenBing on 2017/2/25. + */ +public class MyQueue { + private MyLinkedList elementDate = new MyLinkedList(); + + //入队列 + public void enQueue(E e) { + elementDate.addLast(e); + } + + //出队列 + public E deQueue() { + return elementDate.removeFirst(); + } + + public boolean isEmpty() { + return elementDate.size() == 0 ? true : false; + } + + public int size() { + return elementDate.size(); + } + + public static void main(String[] args) { + MyQueue queue = new MyQueue(); + queue.enQueue(1); + queue.enQueue(2); + + System.out.println(queue.deQueue());//1 + } +} diff --git a/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyStack.java b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyStack.java new file mode 100644 index 0000000000..10d115d052 --- /dev/null +++ b/group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyStack.java @@ -0,0 +1,67 @@ +package com.kevin.coding01.basic; + +/** + * 栈 先进后出 + * Created by YinWenBing on 2017/2/25. + */ +public class MyStack { + private MyArrayList elementData = new MyArrayList(); + + /** + * 往栈中添加元素 + * + * @param e + */ + public void push(E e) { + elementData.add(e); + } + + /** + * 删除栈顶元素 + * + * @return + */ + public E pop() { + return elementData.remove(elementData.size() - 1); + } + + /** + * 返回栈顶元素 + * + * @return + */ + public E peek() { + return elementData.get(elementData.size() - 1); + } + + /** + * 是否为空 + * + * @return + */ + public boolean isEmpty() { + return elementData.size() == 0 ? true : false; + } + + /** + * 返回栈中元素的数量 + * + * @return + */ + public int size() { + return elementData.size(); + } + + + public static void main(String[] args) { + MyStack myStack = new MyStack(); + myStack.push("A"); + myStack.push("B"); + myStack.push("C"); + + System.out.println(myStack.peek()); + System.out.println(myStack.pop()); + System.out.println(myStack.peek()); + System.out.println(myStack.size()); + } +} diff --git a/group04/312816708/coding/coding02/pom.xml b/group04/312816708/coding/coding02/pom.xml new file mode 100644 index 0000000000..6785c854b4 --- /dev/null +++ b/group04/312816708/coding/coding02/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.kevin + coding02 + 1.0-SNAPSHOT + + + + + junit + junit + 4.12 + + + + \ No newline at end of file diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtil.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtil.java new file mode 100644 index 0000000000..b94a86c8b9 --- /dev/null +++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtil.java @@ -0,0 +1,149 @@ +package com.kevin.coding02.array; + +import java.util.*; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + for (int start = 0, end = origin.length - 1; start < end; start++, end--) { + int temp = origin[end]; + origin[end] = origin[start]; + origin[start] = temp; + } + } + + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + List list = new ArrayList(); + for (int i = 0; i < oldArray.length; i++) { + int temp = oldArray[i]; + if (temp != 0) { + list.add(temp); + } + } + int[] newArray = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + newArray[i] = (Integer) list.get(i); + } + + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + public int[] merge(int[] array1, int[] array2) { + Set set = new HashSet(); + for (int i = 0; i < array1.length; i++) { + set.add(array1[i]); + } + for (int i = 0; i < array2.length; i++) { + set.add(array2[i]); + } + + int[] newArray = new int[set.size()]; + Iterator iterator = set.iterator(); + int i = 0; + while (iterator.hasNext()) { + newArray[i++] = (Integer) iterator.next(); + } + + Arrays.sort(newArray); + + return newArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + /** + * 判断是否是素数 + * 素数:又称质数。大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数。 + * 因数:假如a*b=c(a、b、c都是整数),那么我们称a和b就是c的因数。 + * 唯有被除数,除数,商皆为整数,余数为零时,此关系才成立。 反过来说,我们称c为a、b的倍数。在研究因数和倍数时,不考虑0。 + */ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + return null; + } + + +} diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtilTest.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtilTest.java new file mode 100644 index 0000000000..491bfa8ae8 --- /dev/null +++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtilTest.java @@ -0,0 +1,52 @@ +package com.kevin.coding02.array; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by YinWenBing on 2017/3/5. + */ +public class ArrayUtilTest { + ArrayUtil arrayUtil = new ArrayUtil(); + + public void testReverseArray() { + int[] origin = new int[]{7, 9, 30, 3, 4}; + arrayUtil.reverseArray(origin); + + Assert.assertEquals(4, origin[0]); + } + + public void testRemoveZero() { + int[] oldArray = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + int[] newArray = arrayUtil.removeZero(oldArray); + + Assert.assertEquals(6, newArray[4]); + } + + + public void testMerge() { + int[] array1 = {3, 5, 7, 8}; + int[] array2 = {4, 5, 6, 7}; + + int[] newArray = arrayUtil.merge(array1, array2); + + Assert.assertEquals(8, newArray[newArray.length - 1]); + } + + + public void testGrow() { + int[] oldArray = {2, 3, 6}; + int size = 3; + + int[] newArray = arrayUtil.grow(oldArray, size); + Assert.assertEquals(0, newArray[newArray.length - 1]); + } + + @Test + public void testGetPrimes() { + int max = 23; + int[] newArray = arrayUtil.getPrimes(max); + + Assert.assertEquals(19, newArray[newArray.length - 1]); + } +} diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/LoginAction.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/LoginAction.java new file mode 100644 index 0000000000..4334c49b2d --- /dev/null +++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/LoginAction.java @@ -0,0 +1,41 @@ +package com.kevin.coding02.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/Struts.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/Struts.java new file mode 100644 index 0000000000..aec9cb3e07 --- /dev/null +++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/Struts.java @@ -0,0 +1,95 @@ +package com.kevin.coding02.litestruts; + +import com.kevin.coding02.model.ActionModel; +import com.kevin.coding02.model.ResultModel; +import com.kevin.coding02.util.SaxUtil; +import org.xml.sax.XMLReader; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + View view = new View(); + try { + //创建sax解析工厂 + SAXParserFactory factory = SAXParserFactory.newInstance(); + //获取Sax解析器 + SAXParser saxParser = factory.newSAXParser(); + //获取xml读取器 + XMLReader xmlReader = saxParser.getXMLReader(); + //设置内容处理器 + SaxUtil saxUtil = new SaxUtil(); + xmlReader.setContentHandler(saxUtil); + //读取xml + xmlReader.parse("src/main/java/com/kevin/coding02/litestruts/struts.xml"); + + List actions = saxUtil.getActions(); + for (ActionModel action : actions) { + if (actionName.equals(action.getActionName())) { + String actionClass = action.getActionClass(); + Class clazz = Class.forName(actionClass); + + Object obj=clazz.newInstance(); + + for (String key : parameters.keySet()) { + if ("name".equals(key)) { + Method setNameMethod = clazz.getDeclaredMethod("setName", String.class); + setNameMethod.invoke(obj, parameters.get(key)); + } + if ("password".equals(key)) { + Method setPasswordMethod = clazz.getDeclaredMethod("setPassword", String.class); + setPasswordMethod.invoke(obj, parameters.get(key)); + } + } + + Method executeMethod = clazz.getDeclaredMethod("execute"); + + String flag = (String) executeMethod.invoke(obj); + + Map map = new HashMap(); + + for (ResultModel result : action.getResults()) { + if (flag.equals(result.getName())) { + view.setJsp(result.getValue()); + Method getMessage = clazz.getDeclaredMethod("getMessage"); + map.put("message", String.valueOf(getMessage.invoke(obj))); + view.setParameters(map); + } + } + + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return view; + } + +} diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/StrutsTest.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/StrutsTest.java new file mode 100644 index 0000000000..d27aae176b --- /dev/null +++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/StrutsTest.java @@ -0,0 +1,38 @@ +package com.kevin.coding02.litestruts; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class StrutsTest { + +// @Test + public void testLoginActionSuccess() { + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/View.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/View.java new file mode 100644 index 0000000000..75a029b9fa --- /dev/null +++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/View.java @@ -0,0 +1,23 @@ +package com.kevin.coding02.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/struts.xml b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/struts.xml new file mode 100644 index 0000000000..5a5463b24a --- /dev/null +++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/struts.xml @@ -0,0 +1,7 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + \ No newline at end of file diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ActionModel.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ActionModel.java new file mode 100644 index 0000000000..7321b75482 --- /dev/null +++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ActionModel.java @@ -0,0 +1,36 @@ +package com.kevin.coding02.model; + +import java.util.List; + +/** + * Created by YinWenBing on 2017/2/28. + */ +public class ActionModel { + private String actionName; + private String actionClass; + private List results; + + public String getActionName() { + return actionName; + } + + public void setActionName(String actionName) { + this.actionName = actionName; + } + + public String getActionClass() { + return actionClass; + } + + public void setActionClass(String actionClass) { + this.actionClass = actionClass; + } + + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } +} diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ResultModel.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ResultModel.java new file mode 100644 index 0000000000..568ca66c13 --- /dev/null +++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ResultModel.java @@ -0,0 +1,25 @@ +package com.kevin.coding02.model; + +/** + * Created by YinWenBing on 2017/2/28. + */ +public class ResultModel { + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/util/SaxUtil.java b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/util/SaxUtil.java new file mode 100644 index 0000000000..0074d295d2 --- /dev/null +++ b/group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/util/SaxUtil.java @@ -0,0 +1,121 @@ +package com.kevin.coding02.util; + +import com.kevin.coding02.model.ActionModel; +import com.kevin.coding02.model.ResultModel; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by YinWenBing on 2017/2/28. + */ +public class SaxUtil extends DefaultHandler { + private List actions; + private ActionModel action; + private List results; + private ResultModel result; + + private String nodeName; + + + /** + * 开始解析文档 + * + * @throws SAXException + */ + @Override + public void startDocument() throws SAXException { + actions = new ArrayList(); + } + + /** + * 解析开始节点 + * + * @param uri + * @param localName + * @param qName + * @param attributes + * @throws SAXException + */ + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if ("action".equals(qName)) { + action = new ActionModel(); + results = new ArrayList(); + //获取action节点的name属性 + action.setActionName(String.valueOf(attributes.getValue(0))); + //获取action节点的class属性 + action.setActionClass(String.valueOf(attributes.getValue(1))); + } + + if ("result".equals(qName)) { + result = new ResultModel(); + //获取result节点的name属性 + result.setName(String.valueOf(attributes.getValue(0))); + } + nodeName = qName; + } + + /** + * 获取节点内容 + * + * @param ch + * @param start + * @param length + * @throws SAXException + */ + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + if (null != nodeName) { + String content = new String(ch, start, length); + if ("result".equals(nodeName)) { + result.setValue(content); + } + } + } + + /** + * 解析结束节点 + * + * @param uri + * @param localName + * @param qName + * @throws SAXException + */ + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if ("result".equals(qName)) { + results.add(result); + result = null; + } + + if ("action".equals(qName)) { + action.setResults(results); + actions.add(action); + action = null; + } + nodeName = null; + } + + /** + * 结束遍历文档 + * + * @throws SAXException + */ + @Override + public void endDocument() throws SAXException { + super.endDocument(); + } + + + /** + * 返回解析结果 + */ + public List getActions() throws Exception { + return actions; + } + +} diff --git a/group04/349184132/Study/.classpath b/group04/349184132/Study/.classpath new file mode 100644 index 0000000000..2a9fa78d5e --- /dev/null +++ b/group04/349184132/Study/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group04/349184132/Study/.project b/group04/349184132/Study/.project new file mode 100644 index 0000000000..891c7f798c --- /dev/null +++ b/group04/349184132/Study/.project @@ -0,0 +1,17 @@ + + + Study + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/349184132/Study/.settings/org.eclipse.core.resources.prefs b/group04/349184132/Study/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..56bd34e44b --- /dev/null +++ b/group04/349184132/Study/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/com/first/ArrayList.java=UTF-8 +encoding//src/com/first/BinaryTreeNode.java=UTF-8 +encoding//src/com/second/Array/ArrayUtil.java=UTF-8 +encoding//src/com/second/LoginAction.java=UTF-8 +encoding//src/com/second/Struts.java=UTF-8 diff --git a/group04/349184132/Study/.settings/org.eclipse.jdt.core.prefs b/group04/349184132/Study/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..a698e59674 --- /dev/null +++ b/group04/349184132/Study/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group04/349184132/Study/.settings/org.eclipse.ltk.core.refactoring.prefs b/group04/349184132/Study/.settings/org.eclipse.ltk.core.refactoring.prefs new file mode 100644 index 0000000000..b196c64a34 --- /dev/null +++ b/group04/349184132/Study/.settings/org.eclipse.ltk.core.refactoring.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false diff --git a/group04/349184132/Study/bin/com/second/struts.xml b/group04/349184132/Study/bin/com/second/struts.xml new file mode 100644 index 0000000000..554dbbe227 --- /dev/null +++ b/group04/349184132/Study/bin/com/second/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/349184132/Study/bin/com/test/student2.xml b/group04/349184132/Study/bin/com/test/student2.xml new file mode 100644 index 0000000000..e21862ec75 --- /dev/null +++ b/group04/349184132/Study/bin/com/test/student2.xml @@ -0,0 +1,6 @@ + + + + hello text + world text + diff --git a/group04/349184132/Study/bin/com/test/students.xml b/group04/349184132/Study/bin/com/test/students.xml new file mode 100644 index 0000000000..0a503c9f6c --- /dev/null +++ b/group04/349184132/Study/bin/com/test/students.xml @@ -0,0 +1,10 @@ + + + + hello Text1 + hello Text2 + hello Text3 + world text1 + world text2 + world text3 + \ No newline at end of file diff --git a/group04/349184132/Study/src/com/first/ArrayList.java b/group04/349184132/Study/src/com/first/ArrayList.java new file mode 100644 index 0000000000..721bf41ad0 --- /dev/null +++ b/group04/349184132/Study/src/com/first/ArrayList.java @@ -0,0 +1,86 @@ +package com.first; + + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData ; + + private final static int DefaultSize = 10; + + public ArrayList(){ this(DefaultSize); } + + public ArrayList(int capacity){ + if(capacity<0) + throw new IllegalArgumentException(); + elementData = new Object[capacity]; + } + + public void add(Object o){ + if(size==elementData.length) + ResizeCapacity(); + elementData[size++] = o; + } + + private void ResizeCapacity(){ + Object[] newDatas = new Object[size*2+1]; + System.arraycopy(elementData,0,newDatas,0,size); + elementData = newDatas; + } + + private void rangeCheck(int index){ + if(index<0 || index > size-1) + throw new IllegalArgumentException(); + } + + public void add(int index, Object o){ + rangeCheck(index); + //bug size++; + System.arraycopy(elementData,index,elementData,index+1,size-index); + elementData[index] = o; + size++; + } + + + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + + public Object remove(int index){ + rangeCheck(index); + Object oldElement = elementData[index]; + System.arraycopy(elementData,index+1,elementData,index,size-index-1); + size--; + return oldElement; + } + + public int size(){ + return size; + } + public boolean isEmpty(){ return size==0; } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + private int pos = 0; + @Override + public boolean hasNext() { + return possize) + throw new IllegalArgumentException(); + return elementData[pos++]; + } + + } + + + +} diff --git a/group04/349184132/Study/src/com/first/BinaryTreeNode.java b/group04/349184132/Study/src/com/first/BinaryTreeNode.java new file mode 100644 index 0000000000..31647f36dd --- /dev/null +++ b/group04/349184132/Study/src/com/first/BinaryTreeNode.java @@ -0,0 +1,75 @@ +package com.first; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + private BinaryTreeNode root; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + BinaryTreeNode newNode = null; // 新結點 + if (o == null) + throw new NullPointerException("element is not null"); + + if (root == null) { + root = new BinaryTreeNode(); + root.setData(o); + } else { + newNode = new BinaryTreeNode(); + BinaryTreeNode nowNode = root; //當前結點 + int val = (int) root.getData(); + nowNode.setData(o); + while (true) { + + if ((int) newNode.getData() < val) { // 新結點的值 < 當前結點 + if (nowNode.left == null) { + nowNode.setLeft(newNode); + break; + } else { + nowNode = nowNode.left; + } + } else if ((int) newNode.getData() > val) { + if (nowNode.right == null) { + nowNode.setRight(newNode); + break; + } else { + nowNode = newNode.right; + + } + } else { + + throw new IllegalArgumentException("element exist"); + } + } + } + return newNode; + } + + +} diff --git a/group04/349184132/Study/src/com/first/Iterator.java b/group04/349184132/Study/src/com/first/Iterator.java new file mode 100644 index 0000000000..ea250e3cf5 --- /dev/null +++ b/group04/349184132/Study/src/com/first/Iterator.java @@ -0,0 +1,7 @@ +package com.first; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/349184132/Study/src/com/first/LinkedList.java b/group04/349184132/Study/src/com/first/LinkedList.java new file mode 100644 index 0000000000..cf9d274943 --- /dev/null +++ b/group04/349184132/Study/src/com/first/LinkedList.java @@ -0,0 +1,168 @@ +package com.first; + +public class LinkedList implements List { + + private Node head; + private Node now; + + + private int size = 0; + + public void add(Object o) { + if (head == null) { + head = new Node(o, null); + now = head; + } else { + + Node node = new Node(o, null); + now.next = node; + now = node; + } + size++; + + } + + private void rangeCheck(int index) { + if (index < 0 || index > size - 1) + throw new IllegalArgumentException(); + } + + public void add(int index, Object o) { + rangeCheck(index); + + if (index == 0) { + addFirst(o); + } else { + Node node = new Node(o, null); + Node now = head; + Node next = head; + for (int i = 1; i <= index; i++) { + next = next.next; + if (i == index) { + node.next = next; + now.next = node; + } + now = now.next; + } + size++; + } + } + + public Object get(int index) { + Node indexNode = head; + if (index == 0) + return indexNode.data; + else { + + for (int i = 1; i <= index; i++) { + indexNode = indexNode.next; + if (i == index) + return indexNode.data; + } + } + return null; + } + + public Object remove(int index) { + rangeCheck(index); + + if (index == 0) { + return removeFirst(); + } else { + Node pre = head; + Node now = head; + for (int i = 1; i <= index; i++) { + now = now.next; + if (i == index) { + pre.next = now.next; + } + pre = pre.next; + } + size--; + return now.data; + } + } + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public void addFirst(Object o) { + Node oldhead = head; + Node newhead = new Node(o, oldhead); + head = newhead; + size++; + } + + public void addLast(Object o) { + Node node = head; + while (node != null) { + node = node.next; + if (node == null) { + Node lastnode = new Node(o, null); + node = lastnode; + } + } + size++; + } + + public Object removeFirst() { + Node oldhead = head; + Node newhead = head.next; + oldhead.next = null; + head = newhead; + size--; + return oldhead.data; + } + + public Object removeLast() { + Node node = head; + Node prev = head; + while (node != null) { + node = node.next; + if (node == null) { + prev.next = null; + } + prev = prev.next; + } + size--; + return node.data; + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + int pos = 0; + + @Override + public boolean hasNext() { + return pos < size; + } + + @Override + public Object next() { + if (pos > size) + throw new IllegalArgumentException(); + return get(pos++); + } + } + + private static class Node { + Object data; + Node next; + + private Node(Object data, Node next) { + this.data = data; + this.next = next; + + } + + } + +} diff --git a/group04/349184132/Study/src/com/first/List.java b/group04/349184132/Study/src/com/first/List.java new file mode 100644 index 0000000000..9c244deb3d --- /dev/null +++ b/group04/349184132/Study/src/com/first/List.java @@ -0,0 +1,9 @@ +package com.first; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/349184132/Study/src/com/first/Queue.java b/group04/349184132/Study/src/com/first/Queue.java new file mode 100644 index 0000000000..130e16930e --- /dev/null +++ b/group04/349184132/Study/src/com/first/Queue.java @@ -0,0 +1,29 @@ +package com.first; + +public class Queue { + private LinkedList elementData = new LinkedList(); + private int size = 0; + public void enQueue(Object o){ + elementData.addLast(o); + size++; + } + + public Object deQueue(){ + if(isEmpty()) + try { + throw new IllegalAccessException(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + size--; + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + return size==0; + } + + public int size(){ + return size; + } +} diff --git a/group04/349184132/Study/src/com/first/Stack.java b/group04/349184132/Study/src/com/first/Stack.java new file mode 100644 index 0000000000..7d8477b962 --- /dev/null +++ b/group04/349184132/Study/src/com/first/Stack.java @@ -0,0 +1,34 @@ +package com.first; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size = 0; + public void push(Object o){ + elementData.add(o); + size++; + } + + + public Object pop(){ + if(isEmpty()){ + try { + throw new IllegalAccessException(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + return elementData.get(--size); + } + + public Object peek(){ + return elementData.get(size-1); + } + + public boolean isEmpty(){ + return size==0; + } + + public int size(){ + return size; + } +} diff --git a/group04/349184132/Study/src/com/first/test/TestArrayList.java b/group04/349184132/Study/src/com/first/test/TestArrayList.java new file mode 100644 index 0000000000..af7ed55f0a --- /dev/null +++ b/group04/349184132/Study/src/com/first/test/TestArrayList.java @@ -0,0 +1,69 @@ +package com.first.test; + +import org.junit.Test; + +import com.first.ArrayList; +import com.first.Iterator; + +public class TestArrayList { + private ArrayList al = new ArrayList(); + @Test + public void testAddObject() { + al.add("1"); + al.add(12); + al.add("wang"); + + } + + @Test + public void testAddIntObject() { + al.add("1"); + al.add(12); + al.add("wang"); + + al.add(1, 13); + } + + @Test + public void testGet() { + al.add("1"); + al.add(12); + al.add("wang"); + + al.get(1); + } + + @Test + public void testRemove() { + al.add("1"); + al.add(12); + al.add("wang"); + + al.remove(0); + } + + @Test + public void testSize() { + al.size(); + } + + + @Test + public void testIsEmpty() { + al.isEmpty(); + } + + @Test + public void testIterator() { + al.add("1"); + al.add(12); + al.add("wang"); + + Iterator iterator = al.iterator(); + while(iterator.hasNext()){ + System.out.println(iterator.next()); + } + + } + +} diff --git a/group04/349184132/Study/src/com/first/test/TestLinkedList.java b/group04/349184132/Study/src/com/first/test/TestLinkedList.java new file mode 100644 index 0000000000..2131e580ff --- /dev/null +++ b/group04/349184132/Study/src/com/first/test/TestLinkedList.java @@ -0,0 +1,97 @@ +package com.first.test; + +import org.junit.Test; + +import com.first.Iterator; +import com.first.LinkedList; + +public class TestLinkedList { + LinkedList link = new LinkedList(); + @Test + public void testAddObject() { + link.add(1); + link.add(2); + link.add(3); + } + + @Test + public void testAddIntObject() { + link.add(1); + link.add(2); + link.add(3); + + link.add(2,4); + } + + @Test + public void testGet() { + link.add(1); + link.add(2); + link.add(3); + link.get(1); + } + + @Test + public void testRemove() { + link.add(1); + link.add(2); + link.add(3); + + link.remove(1); + } + + @Test + public void testSize() { + link.size(); + } + + @Test + public void testIsEmpty() { + link.isEmpty(); + } + + @Test + public void testAddFirst() { + link.add(1); + link.add(2); + link.add(3); + + link.addFirst(9); + } + + @Test + public void testAddLast() { + link.add(1); + link.add(2); + link.add(3); + + link.addLast(0); + } + + @Test + public void testRemoveFirst() { + link.add(1); + link.add(2); + link.add(3); + + link.removeFirst(); + } + + @Test + public void testRemoveLast() { + link.add(1); + link.add(2); + link.add(3); + + link.removeLast(); + } + + @Test + public void testIterator() { + Iterator iterator = link.iterator(); + while(iterator.hasNext()){ + System.out.println(iterator.next()); + } + } + +} diff --git a/group04/349184132/Study/src/com/second/Array/ArrayUtil.java b/group04/349184132/Study/src/com/second/Array/ArrayUtil.java new file mode 100644 index 0000000000..cd99e201ab --- /dev/null +++ b/group04/349184132/Study/src/com/second/Array/ArrayUtil.java @@ -0,0 +1,257 @@ +package com.second.Array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static int[] reverseArray(int[] origin) { + for (int i = 0, j = origin.length - 1; i < origin.length / 2; i++, j--) { + int temp = origin[i]; + origin[i] = origin[j]; + origin[j] = temp; + } + return origin; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + int count = 0; + int[] newArray = new int[oldArray.length]; + for (int i = 0, j = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) { + count++; + continue; + } else + newArray[j++] = oldArray[i]; + } + int[] temp = new int[newArray.length-count]; + System.arraycopy(newArray, 0, temp, 0, temp.length); + newArray = temp; + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + // bug + public static int[] merge(int[] array1, int[] array2) { + int len1 = array1.length; + int len2 = array2.length; + int[] array3 = new int[len1 + len2]; + int len3 = len1 + len2; + int a1 = 0; + int a2 = 0; + int a3 = 0; + while (len3 > 0) { + if (a1 == len1 || a2 == len2) { + break; + } + if (array1[a1] < array2[a2]) { + array3[a3] = array1[a1]; + a1++; + a3++; + } else { + if (array1[a1] > array2[a2]) { + array3[a3] = array2[a2]; + a2++; + a3++; + } else { + array3[a3] = array1[a1]; + a1++; + a2++; + a3++; + } + } + len3--; + } + if (a1 == len1 && a2 == len2) { + return array3; + } + if (a1 == len1) { + for (int i = a2; i < len2; i++) { + array3[a3] = array2[a2]; + a3++; + } + } else { + for (int i = a1; i < len1; i++) { + array3[a3] = array1[a1]; + a3++; + } + } + int[] temp = new int[a3]; + System.arraycopy(array3, 0, temp, 0, temp.length); + array3 = temp; + return array3; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max == 1) + return new int[0]; + else { + int[] arr = new int[max]; + arr[0] = 1; + arr[1] = 1; + + int val = 0; + int f1 = 1; + int f2 = 1; + + int index = 2; + + while (val < max) { + val = f1 + f2; + if(val>max){ + break; + } + f1 = f2; + f2 = val; + arr[index++] = val; + } + int[] temp = new int[index]; + System.arraycopy(arr, 0, temp, 0, temp.length); + arr = temp; + return arr; + } + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + int val = 2; // 数值增加 + int index = 0; // 数组索引 + int[] primes = new int[max]; // 存放素数数组 + boolean flag = true; + + while (val < max) { + + for (int i = 2; i parameters) { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + */ + + View view = new View(); + try { + // 读取struts.xml 使用dom4j + SAXReader saxReader = new SAXReader(); + Document document = saxReader.read(new File( + "src/com/second/struts.xml")); + + String classpath = null; + Element actionEle = null; // 存放actionName对应的action元素 + // 获取根节点 + Element root = document.getRootElement(); + for (Iterator it = root.elementIterator(); it.hasNext();) { + Element action = it.next(); + if (actionName.equals(action.attributeValue("name"))) { + actionEle = action; + classpath = action.attributeValue("class"); + + } + } + + Class clazz = Class.forName(classpath); + + Object o = clazz.newInstance(); + + Set set = parameters.keySet(); + + for (Iterator name = set.iterator(); name.hasNext();) { + String para = name.next(); + + Method m = clazz.getDeclaredMethod( + StringUtil.nameTosetName(para), String.class); + + m.invoke(o, parameters.get(para)); + } + + // 调用execute + Method exectue = clazz.getDeclaredMethod("execute", null); + String exResult = (String) exectue.invoke(o, null); + + // 获取所有方法 + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + String methodName = method.getName(); + // 正则过滤 获取getter方法 + if (methodName.matches("get[a-zA-Z]+")) { + + // 字符串处理 getName --> name + parameters.put(StringUtil.getNameToName(methodName), + (String) method.invoke(o, null)); + + } + } + + for (Iterator iter = actionEle.elementIterator("result"); iter + .hasNext();) { + Element result = iter.next(); + String name = result.attributeValue("name"); + if (name.equals(exResult)) { + String jsp = result.getText(); + view.setJsp(jsp); // 放入View jsp字段中 + } + } + view.setParameters(parameters); + + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return view; + + } + +} diff --git a/group04/349184132/Study/src/com/second/StrutsTest.java b/group04/349184132/Study/src/com/second/StrutsTest.java new file mode 100644 index 0000000000..ff297c01ab --- /dev/null +++ b/group04/349184132/Study/src/com/second/StrutsTest.java @@ -0,0 +1,43 @@ +package com.second; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group04/349184132/Study/src/com/second/View.java b/group04/349184132/Study/src/com/second/View.java new file mode 100644 index 0000000000..647d88d5f0 --- /dev/null +++ b/group04/349184132/Study/src/com/second/View.java @@ -0,0 +1,23 @@ +package com.second; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/349184132/Study/src/com/second/struts.xml b/group04/349184132/Study/src/com/second/struts.xml new file mode 100644 index 0000000000..554dbbe227 --- /dev/null +++ b/group04/349184132/Study/src/com/second/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git "a/group04/349184132/post/CPU\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.docx" "b/group04/349184132/post/CPU\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.docx" new file mode 100644 index 0000000000000000000000000000000000000000..72f97352ac6772fc4dfa42578b3bdf2bcab88e86 GIT binary patch literal 11099 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 XA} elementDataLength) { + //ArrayList类扩容的长度是原来数组长度的1.5倍+1,此处参考ArrayList的长度进行扩容 + int newSize = (elementDataLength * 3) / 2 + 1; + //如果扩张后的长度还是比最小需要的长度小,则取需要的长度 + if (newSize < minSize) { + newSize = minSize; + } + //进行数据的拷贝 + elementData = Arrays.copyOf(elementData, newSize); + } + } + + public void add(int index, Object o){ + //对容量进行检查 + checkCapacity(size + 1); + //对数组进行复制,将指定索引位置空出 + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + if (index > size) { + throw new IllegalArgumentException("参数不对"); + } + //size - index + Object o = elementData[index]; + int moverNum = size - index - 1; + if (moverNum > 0) { + System.arraycopy(elementData, index+1, elementData, index, moverNum); + } + //将数组最后一个元素置为null + elementData[--size] = null; + return o; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + + +} + diff --git a/group04/351121278/src/com/coding/basic/Iterator.java b/group04/351121278/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..095e38e85b --- /dev/null +++ b/group04/351121278/src/com/coding/basic/Iterator.java @@ -0,0 +1,9 @@ +package com.coding.basic; + + +public interface Iterator { + boolean hasNext(); + + Object next(); + +} \ No newline at end of file diff --git a/group04/351121278/src/com/coding/basic/LinkedList.java b/group04/351121278/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..5428802926 --- /dev/null +++ b/group04/351121278/src/com/coding/basic/LinkedList.java @@ -0,0 +1,79 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + private int size = 0; + + public void add(Object o){ + addLast(o); + } + public void add(int index , Object o){ + + for (int i = 0; i <= index; i++) { + head = head.next; + } + Node head = this.head; + Node node = new Node(); + this.head.next = node; + node.data = o; + node.next = head.next; + size++; + } + public Object get(int index){ + for (int i = 0; i <= index; i++) { + head = head.next; + } + return head.data; + } + public Object remove(int index){ + for (int i = 0; i < index; i++) { + head = head.next; + } + Node head = this.head; + Object data = head.next.data; + Node next = this.head.next.next; + head.next = next; + return data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node node = new Node(); + node.next = head; + node.data = o; + size++; + } + public void addLast(Object o){ + Node node = new Node(); + head.next = node; + node.data = o; + node.next = null; + size++; + } + public Object removeFirst(){ + Object data = head.data; + head.next = null; + return data; + } + public Object removeLast(){ + for (int i = 0; i < size; i++) { + head = head.next; + } + Object data = head.next.data; + head.next = null; + return data; + } + public Iterator iterator(){ + return null; + } + + private static class Node{ + Object data; + Node next; + } +} \ No newline at end of file diff --git a/group04/351121278/src/com/coding/basic/List.java b/group04/351121278/src/com/coding/basic/List.java new file mode 100644 index 0000000000..ee8ab69781 --- /dev/null +++ b/group04/351121278/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group04/351121278/src/com/coding/basic/Queue.java b/group04/351121278/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..25737e5206 --- /dev/null +++ b/group04/351121278/src/com/coding/basic/Queue.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +public class Queue { + + private ArrayList elementData = new ArrayList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + Object remove = elementData.remove(0); + return remove; + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} \ No newline at end of file diff --git a/group04/351121278/src/com/coding/basic/Stack.java b/group04/351121278/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..fd3548a241 --- /dev/null +++ b/group04/351121278/src/com/coding/basic/Stack.java @@ -0,0 +1,24 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + Object remove = elementData.remove(elementData.size() - 1); + return remove; + } + + public Object peek(){ + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} \ No newline at end of file diff --git a/group04/351121278/src/com/coding/litestruts/LoginAction.java b/group04/351121278/src/com/coding/litestruts/LoginAction.java new file mode 100644 index 0000000000..94ae9fccee --- /dev/null +++ b/group04/351121278/src/com/coding/litestruts/LoginAction.java @@ -0,0 +1,41 @@ +package com.coding.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } +// this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} \ No newline at end of file diff --git a/group04/351121278/src/com/coding/litestruts/Struts.java b/group04/351121278/src/com/coding/litestruts/Struts.java new file mode 100644 index 0000000000..e1cc8d6add --- /dev/null +++ b/group04/351121278/src/com/coding/litestruts/Struts.java @@ -0,0 +1,214 @@ +package com.coding.litestruts; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + 0. 读取配置文件struts.xml + dom4j 来读取 + */ + + List elements = null; + try { + elements = openStrutsXML("struts.xml"); + } catch (DocumentException e) { + e.printStackTrace(); + } + + for (Element element: elements) { + String name = element.attribute("name").getValue(); + String aClass = element.attribute("class").getValue(); + /* + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") ,那就应该调用 setName和setPassword方法 + */ + + //此时的name等于传入的actionName + Class clazz = null; + try { + clazz = Class.forName(aClass); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + Object obj = null; + try { + obj = clazz.newInstance(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + for (Map.Entry entry: parameters.entrySet()) { + String key = entry.getKey().toString(); + String parSetName = parSetName(key); + Method method = null; + try { + method = clazz.getMethod(parSetName, String.class); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + try { + method.invoke(obj, entry.getValue()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + //2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method execute = null; + try { + execute = clazz.getMethod("execute", null); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + Object result = null; + try { + result = execute.invoke(obj, null); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + Map resultParameters = new HashMap(); + + // 3. 通过反射找到对象的所有getter方法(例如 getMessage), + // 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + // 放到View对象的parameters + Field[] fields = clazz.getDeclaredFields(); + //此处取到的方法是所有的public修饰的方法 + Method[] methods = clazz.getMethods(); + for (Field field: fields) { + String fieldName = field.getName(); + String parGetName = parGetName(fieldName); + boolean isGetMethod = checkGetMethod(methods, parGetName); + if (!isGetMethod) { + continue; + } + Method method = null; + try { + method = clazz.getMethod(parGetName, null); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + try { + Object getResult = method.invoke(obj, null); + if (getResult != null) { + resultParameters.put(fieldName, getResult.toString()); + } + //如果execute方法返回fail,添加错误信息到map中 + if ("fail".equals(result)) { + resultParameters.put("message", "login failed,please check your user/pwd"); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + //4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + //放到View对象的jsp字段中。 + List resultElements = element.elements("result"); + for (Element resultElemnt: resultElements) { + Attribute resultNode = resultElemnt.attribute("name"); + String resultValue = resultNode.getValue(); + String resultJsp = resultElemnt.getTextTrim(); + if (result.equals(resultValue)) { + View view = new View(); + view.setJsp(resultJsp); + view.setParameters(resultParameters); + return view; + } + } + + } + + return null; + } + + /** + * 打开struts.xml文件, + * @param strutsXMLPath struts.xml文件的位置 + * @return List节点对象 + * @throws DocumentException + */ + public static List openStrutsXML(String strutsXMLPath) throws DocumentException { + InputStream in = View.class.getResourceAsStream(strutsXMLPath); + SAXReader reader = new SAXReader(); + Document document = reader.read(in); + Element rootElement = document.getRootElement(); + return (List) rootElement.elements("action"); + } + + /** + * 拼接属性的get方法 + * @param fieldName + * @return + */ + public static String parGetName(String fieldName) { + if (null == fieldName || "".equals(fieldName)) { + return null; + } + int startIndex = 0; + if (fieldName.charAt(0) == '_') + startIndex = 1; + return "get" + + fieldName.substring(startIndex, startIndex + 1).toUpperCase() + + fieldName.substring(startIndex + 1); + } + + /** + * 拼接在某属性的 set方法 + * + * @param fieldName + * @return String + */ + public static String parSetName(String fieldName) { + if (null == fieldName || "".equals(fieldName)) { + return null; + } + int startIndex = 0; + if (fieldName.charAt(0) == '_') + startIndex = 1; + return "set" + + fieldName.substring(startIndex, startIndex + 1).toUpperCase() + + fieldName.substring(startIndex + 1); + } + + /** + * 判断是否存在某属性的 get方法 + * + * @param methods + * @param fieldGetMet + * @return boolean + */ + public static boolean checkGetMethod(Method[] methods, String fieldGetMet) { + for (Method met : methods) { + if (fieldGetMet.equals(met.getName())) { + return true; + } + } + return false; + } + + +} \ No newline at end of file diff --git a/group04/351121278/src/com/coding/litestruts/StrutsTest.java b/group04/351121278/src/com/coding/litestruts/StrutsTest.java new file mode 100644 index 0000000000..6266e4872c --- /dev/null +++ b/group04/351121278/src/com/coding/litestruts/StrutsTest.java @@ -0,0 +1,39 @@ +package com.coding.litestruts; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap<>(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group04/351121278/src/com/coding/litestruts/View.java b/group04/351121278/src/com/coding/litestruts/View.java new file mode 100644 index 0000000000..70b1cfb584 --- /dev/null +++ b/group04/351121278/src/com/coding/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coding.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group04/351121278/src/com/coding/litestruts/struts.xml b/group04/351121278/src/com/coding/litestruts/struts.xml new file mode 100644 index 0000000000..b4e83a012a --- /dev/null +++ b/group04/351121278/src/com/coding/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/465034663/.classpath b/group04/465034663/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group04/465034663/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group04/465034663/.gitignore b/group04/465034663/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/465034663/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/465034663/.project b/group04/465034663/.project new file mode 100644 index 0000000000..cbb2b8f2c4 --- /dev/null +++ b/group04/465034663/.project @@ -0,0 +1,17 @@ + + + DataStruct + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/465034663/.settings/org.eclipse.core.resources.prefs b/group04/465034663/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/group04/465034663/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/group04/465034663/.settings/org.eclipse.core.runtime.prefs b/group04/465034663/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000000..deae05a977 --- /dev/null +++ b/group04/465034663/.settings/org.eclipse.core.runtime.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +line.separator=\r\n diff --git a/group04/465034663/src/com/xusheng/arraylist/MyArrayList.java b/group04/465034663/src/com/xusheng/arraylist/MyArrayList.java new file mode 100644 index 0000000000..0a1d381ff8 --- /dev/null +++ b/group04/465034663/src/com/xusheng/arraylist/MyArrayList.java @@ -0,0 +1,130 @@ +package com.xusheng.arraylist; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +public class MyArrayList implements Iterable{ + + private T[] item; + + private static final int DEFAULT_CAPACITY = 10; + + private int size; + + public int size(){ + return size; + } + + private void doClear(){ + this.size = 0; + ensureCapacity(DEFAULT_CAPACITY); + } + + /** + * 此方法用于确定list的容量 + * @param newCapacity + */ + public void ensureCapacity(int newCapacity){ + if(newCapacity < size){ + return; + } + + T[] old = item; + item = (T[]) new Object[newCapacity]; + for(int i=0;i size){ + throw new ArrayIndexOutOfBoundsException(); + } + if(item.length == size){ + ensureCapacity(size*2+1); + } + for(int i=size;i>index;i--){ + item[i] = item[i-1]; + } + item[index] = element; + size++; + } + + public boolean add(T element){ + add(size,element); + return true; + } + + public T get(int index){ + if(index<0 || index>=size){ + throw new ArrayIndexOutOfBoundsException(); + } + return item[index]; + } + + public T set(int index,T element){ + if(index<0 || index>=size){ + throw new ArrayIndexOutOfBoundsException(); + } + T old = item[index]; + item[index] = element; + return old; + } + + public T remove(int index){ + if(index<0 || index>=size){ + throw new ArrayIndexOutOfBoundsException(); + } + T moved = item[index]; + for(int i=size-1;i>index;i++){ + item[i-1] = item[i]; + } + size--; + return moved; + } + + public void trimToSize(){ + ensureCapacity(size); + } + + @Override + public Iterator iterator() { + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + + private int currentIndex = 0; + + @Override + public boolean hasNext() { + return currentIndex extends MyIterator{ + + int size(); + + boolean isEmpty(); + + void clear(); + + boolean contains(T element); + + boolean add(T element); + + boolean remove(T element); + + MyIterator myIterator(); + +} diff --git a/group04/465034663/src/com/xusheng/arraylist/MyIterator.java b/group04/465034663/src/com/xusheng/arraylist/MyIterator.java new file mode 100644 index 0000000000..eef07409d6 --- /dev/null +++ b/group04/465034663/src/com/xusheng/arraylist/MyIterator.java @@ -0,0 +1,10 @@ +package com.xusheng.arraylist; + +public interface MyIterator { + + boolean hasNext(); + + T next(); + + void remove(); +} diff --git a/group04/465034663/src/com/xusheng/arraylist/MyList.java b/group04/465034663/src/com/xusheng/arraylist/MyList.java new file mode 100644 index 0000000000..847af6b3f8 --- /dev/null +++ b/group04/465034663/src/com/xusheng/arraylist/MyList.java @@ -0,0 +1,14 @@ +package com.xusheng.arraylist; + +public interface MyList extends MyCollection { + + T get(int index); + + T set(int index,T element); + + void add(int index,T element); + + void remove(int index,T element); + + MyListIterator myListIterator(); +} diff --git a/group04/465034663/src/com/xusheng/arraylist/MyListIterator.java b/group04/465034663/src/com/xusheng/arraylist/MyListIterator.java new file mode 100644 index 0000000000..fda3cc7e86 --- /dev/null +++ b/group04/465034663/src/com/xusheng/arraylist/MyListIterator.java @@ -0,0 +1,12 @@ +package com.xusheng.arraylist; + +public interface MyListIterator extends MyIterator{ + + boolean hasPrevious(); + + T previous(); + + void add(T element); + + void set(T element); +} diff --git a/group04/465034663/src/com/xusheng/arraylist/TestData.java b/group04/465034663/src/com/xusheng/arraylist/TestData.java new file mode 100644 index 0000000000..693c610de1 --- /dev/null +++ b/group04/465034663/src/com/xusheng/arraylist/TestData.java @@ -0,0 +1,29 @@ +package com.xusheng.arraylist; + +import java.util.Iterator; + +public class TestData { + + public static void main(String[] args) { + MyArrayList mal = new MyArrayList(); + mal.add("haha"); + mal.add("haha2"); +// System.out.println(mal.size()); +// for(int i=0;i implements Iterable { + private int size; + private int modCount=0; + private Node beginMarker; + private Node endMarker; + + public MyLinkedList() { + doClear(); + } + + public void clear(){ + doClear(); + } + + public void doClear(){ + beginMarker = new Node(null,null,null); + endMarker = new Node(null,beginMarker,null); + beginMarker.next = endMarker; + + this.size = 0; + this.modCount++; + } + + public int size(){ + return this.size; + } + + public boolean isEmpty(){ + return size==0; + } + + public void add(int index,T element){ + addBefore(getNode(index),element); + } + + public boolean add(T element){ + add(size,element); + return true; + } + + public T get(int index){ + return getNode(index).data; + } + + public T set(int index,T element){ + Node node = getNode(index); + T oldElement = node.data; + node.data = element; + return oldElement; + } + + public T remove(int index){ + return remove(getNode(index)); + } + + //此方法用于判断集合中是否含有输入的元素 + public boolean contains(T element){ + for(int i=0;i node = getNode(index); + Node beforep,afterp; + beforep = node.prev; + afterp = node.next; + + beforep.next = afterp; + afterp.prev = beforep; + + node.next = afterp.next; + node.prev = afterp; + + afterp.next = node; + afterp.prev = beforep; + + } + + private T remove(Node delNode){ + delNode.next.prev = delNode.prev; + delNode.prev.next = delNode.next; + size--; + modCount++; + return delNode.data; + } + + private void addBefore(Node p,T element){ + Node newNode = new Node(element,p.prev,p); + newNode.prev.next = newNode; + p.prev = newNode; + this.size++; + this.modCount++; + } + + private Node getNode(int index){ + Node p; + if(index>=0 && index<=size){ + if(index<(size/2)){ + p = beginMarker.next; + for(int i=0;iindex;i--){ + p = p.prev; + } + } + }else{ + throw new IndexOutOfBoundsException(); + } + return p; + } + + @Override + public Iterator iterator() { + return new LinkedListIterator(); + } + + private class Node{ + public T data; + public Node prev; + public Node next; + public Node(T data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + } + + private class LinkedListIterator implements Iterator{ + + private Node current = beginMarker.next; + private int expectedModCount = modCount; + private boolean okToRemove = false; + + @Override + public boolean hasNext() { + return current != endMarker; + } + + @Override + public T next(){ + if(modCount != expectedModCount){ + throw new ConcurrentModificationException(); + } + if(!hasNext()){ + throw new NoSuchElementException(); + } + T n = current.data; + current = current.next; + okToRemove = true; + return n; + } + + public void remove(){ + if(modCount != expectedModCount){ + throw new ConcurrentModificationException(); + } + if(!okToRemove){ + throw new IllegalStateException(); + } + MyLinkedList.this.remove(current.prev); + size--; + expectedModCount++; + okToRemove = false; + } + } +} diff --git a/group04/465034663/src/com/xusheng/linkedlist/TestMain.java b/group04/465034663/src/com/xusheng/linkedlist/TestMain.java new file mode 100644 index 0000000000..11ccff634f --- /dev/null +++ b/group04/465034663/src/com/xusheng/linkedlist/TestMain.java @@ -0,0 +1,38 @@ +package com.xusheng.linkedlist; + +import java.util.Iterator; + +public class TestMain { + + public static void main(String[] args) { + MyLinkedList mll = new MyLinkedList(); + mll.add(0, "haha1"); + mll.add(1,"haha2"); + mll.add(2, "haha3"); + mll.add(3,"haha4"); + mll.add("haha5"); + for(int i=0;i { + + private int size; + private int modCount; + private Node beginMarker; + private Node endMarker; + private int currentIndex = size; + + + + public MyLinkedStack() { + doClear(); + } + + private void doClear(){ + this.size=0; + this.modCount=0; + beginMarker = new Node(null,null,null); + endMarker = new Node(null,beginMarker,null); + beginMarker.next = endMarker; + } + + public int size(){ + return this.size; + } + + public T get(int index){ + Node n = get(index,0,size); + return n.data; + } + + public T pop(){ + Node n = get(this.size-1,0,size); + T old = n.data; + n.prev.next = n.next; + n.next.prev = n.prev; + this.size--; + return n.data; + } + + public void push(T element){ + add(size,element); + } + + public void add(int index,T element){ + addBefore(get(index,0,size),element); + } + + private void addBefore(Node n,T element){ + Node newNode = new Node(element,n.prev,n); + n.prev.next = newNode; + n.prev = newNode; + this.size++; + this.modCount++; + } + + private Node get(int index,int low,int upper){ + if(indexupper){ + throw new IndexOutOfBoundsException(); + } + Node p; + if(index<(size/2)){ + p = beginMarker.next; + for(int i=0;iindex;i--){ + p = p.prev; + } + } + return p; + } + + private class Node{ + + private T data; + private Node prev; + private Node next; + public Node(T data, Node prev, Node next) { + super(); + this.data = data; + this.prev = prev; + this.next = next; + } + + + + } +} diff --git a/group04/465034663/src/com/xusheng/stack/MyLinkedStack2.java b/group04/465034663/src/com/xusheng/stack/MyLinkedStack2.java new file mode 100644 index 0000000000..7f7c81e7af --- /dev/null +++ b/group04/465034663/src/com/xusheng/stack/MyLinkedStack2.java @@ -0,0 +1,52 @@ +package com.xusheng.stack; + +/** + * 此栈是用单链表实现 + * @author xusheng + * + */ +public class MyLinkedStack2 { + + private Node beginNode; + private Node endNode; + private int size; + + + + public MyLinkedStack2() { + size = 0; + doClear(); + } + + private void doClear(){ + endNode = new Node(null,null); + beginNode = new Node(null,beginNode); + } + + private void insert(Node p,T element){ + Node newNode = new Node(element,p.next); + p.next = newNode; + this.size++; + } + + private Node getNode(int index){ + Node p; + p = beginNode.next; + for(int i=0;i{ + public T data; + public Node next; + public Node(T data, Node next) { + this.data = data; + this.next = next; + } + + + } + +} diff --git a/group04/465034663/src/com/xusheng/stack/TestMain.java b/group04/465034663/src/com/xusheng/stack/TestMain.java new file mode 100644 index 0000000000..4c0ad2f3d6 --- /dev/null +++ b/group04/465034663/src/com/xusheng/stack/TestMain.java @@ -0,0 +1,17 @@ +package com.xusheng.stack; + +public class TestMain { + + public static void main(String[] args) { + MyLinkedStack mls = new MyLinkedStack(); + mls.add(0,"haha1"); + mls.add(1, "haha2"); + mls.push("haha3"); + System.out.println(mls.pop()); + System.out.println(mls.size()); + System.out.println(mls.pop()); + System.out.println(mls.size()); + System.out.println(mls.pop()); + System.out.println(mls.size()); + } +} diff --git a/group04/465034663/src/com/xusheng/tree/AvlTree.java b/group04/465034663/src/com/xusheng/tree/AvlTree.java new file mode 100644 index 0000000000..33a406a022 --- /dev/null +++ b/group04/465034663/src/com/xusheng/tree/AvlTree.java @@ -0,0 +1,217 @@ +package com.xusheng.tree; + +/** + * 实现平衡二叉树 + * @author xusheng + * + * @param + */ +public class AvlTree> { + + private AvlNode root; + + public AvlTree() { + this.root = null; + } + + /** + * 对不平衡点的左儿子的左子树进行插入 + * 将二叉树围绕不平衡点的左子节点进行左旋转 + * @param k2 + * @return + */ + private AvlNode rotateWithLeftChild(AvlNode k2){ + AvlNode k1 = k2.leftNode; + k2.leftNode = k1.rightNode; + k1.rightNode = k2; + k2.height = Math.max(height(k2.leftNode), height(k2.rightNode))+1; + k1.height = Math.max(height(k1.leftNode), k2.height)+1; + return k1; + } + + /** + * 对不平衡点的右儿子的右子树进行插入 + * 将二叉树围绕不平衡点的右子节点进行旋转 + * @param k2 + * @return + */ + private AvlNode rotateWithRightChild(AvlNode k2){ + AvlNode k1 = k2.rightNode; + k2.rightNode = k1.leftNode; + k1.leftNode = k2; + k2.height = Math.max(height(k2.leftNode), height(k2.rightNode))+1; + k1.height = Math.max(height(k1.rightNode), k2.height)+1; + return k1; + } + + /** + * 对不平衡点的左儿子的右子树进行插入 + * 先将二叉树不平衡点的左儿子围绕它的右子节点旋转 + * 后将二叉树围绕不平衡点的左儿子进行旋转 + * @param k3 + * @return + */ + private AvlNode doubleRotateWithLeftChild(AvlNode k3){ + k3.leftNode = rotateWithRightChild(k3.leftNode); + return rotateWithLeftChild(k3); + } + + /** + * 对不平衡点的右儿子的左子树进行插入 + * 先将二叉树不平衡点的右儿子围绕它的左子节点旋转 + * 后将二叉树围绕不平衡点的右儿子进行旋转 + * @param k3 + * @return + */ + private AvlNode doubleRotateWithRightChild(AvlNode k3){ + k3.rightNode = rotateWithLeftChild(k3.rightNode); + return rotateWithRightChild(k3); + } + + private static final int ALLOW_IMBALANCE = 1;//该常量表示数的高度差最多为1 + /** + * 此方法用来对二叉树进行平衡 + * @param node + * @return + */ + private AvlNode balance(AvlNode node){ + + if(node == null){ + return node; + } + + if(height(node.leftNode) - height(node.rightNode) > ALLOW_IMBALANCE){ + if(height(node.leftNode.leftNode) >= height(node.leftNode.rightNode)){ + node = rotateWithLeftChild(node); + }else{ + node = doubleRotateWithLeftChild(node); + } + }else if(height(node.rightNode) - height(node.leftNode) > ALLOW_IMBALANCE){ + if(height(node.rightNode.rightNode) >= height(node.rightNode.leftNode)){ + node = rotateWithRightChild(node); + }else{ + node = doubleRotateWithRightChild(node); + } + } + + node.height = Math.max(height(node.leftNode), height(node.rightNode))+1; + + return node; + } + private int height(AvlNode t){ + return t == null ? -1 : t.height; + } + + public boolean isEmpty(){ + return this.root == null; + } + + public void insert(T element){ + root = insert(element,root); + } + + private AvlNode insert(T element,AvlNode node){ + if(node == null){ + return new AvlNode(element,null,null); + } + + int intCompare = element.compareTo(node.data); + + if(intCompare < 0){ + node.leftNode = insert(element,node.leftNode); + }else if(intCompare > 0){ + node.rightNode = insert(element,node.rightNode); + } + return node; + } + + + public boolean contains(T element){ + return contains(element,root); + } + + private boolean contains(T element,AvlNode node){ + + if(node == null){ + return false; + } + + int intCompare = element.compareTo(node.data); + + if(intCompare < 0){ + return contains(element,node.leftNode); + }else if(intCompare > 0){ + return contains(element,node.rightNode); + }else{ + return true; + } + } + + public void remove(T element){ + remove(element,root); + } + + private AvlNode remove(T element,AvlNode node){ + if(node == null){ + return node; + } + + int intCompare = element.compareTo(node.data); + + if(intCompare < 0){ + node.leftNode = remove(element,node.leftNode); + }else if(intCompare > 0){ + node.rightNode = remove(element,node.rightNode); + } + else if(node.leftNode != null && node.rightNode != null){ + node.data = findMin(node).data; + node.rightNode = remove(node.data,node.rightNode); + }else{ + node = (node.leftNode != null) ? node.leftNode : node.rightNode; + } + return node; + } + + + private AvlNode findMin(AvlNode node){ + if(node == null){ + return null; + }else if(node.leftNode == null){ + return node; + }else{ + return findMin(node.leftNode); + } + } + + private AvlNode findMax(AvlNode node){ + if(node == null){ + return null; + } + + while(node.rightNode != null){ + node = node.rightNode; + } + + return node; + } + + private class AvlNode{ + + private T data; + private AvlNode leftNode; + private AvlNode rightNode; + private int height; + + public AvlNode(T data, AvlNode leftNode,AvlNode rightNode) { + this.data = data; + this.leftNode = leftNode; + this.rightNode = rightNode; + } + + public AvlNode(T element) { + this(element,null,null); + } + + + } +} diff --git a/group04/465034663/src/com/xusheng/tree/BinarySearchTree.java b/group04/465034663/src/com/xusheng/tree/BinarySearchTree.java new file mode 100644 index 0000000000..8641ba447e --- /dev/null +++ b/group04/465034663/src/com/xusheng/tree/BinarySearchTree.java @@ -0,0 +1,128 @@ +package com.xusheng.tree; + +/** + * 实现二叉查找树 + * @author xusheng + * + * @param + */ +public class BinarySearchTree> { + + private BinaryNode root; + + public BinarySearchTree() { + this.root = null; + } + + public boolean isEmpty(){ + return this.root == null; + } + + public void insert(T element){ + root = insert(element,root); + } + + private BinaryNode insert(T element,BinaryNode node){ + if(node == null){ + return new BinaryNode(element,null,null); + } + + int intCompare = element.compareTo(node.data); + + if(intCompare < 0){ + node.leftNode = insert(element,node.leftNode); + }else if(intCompare > 0){ + node.rightNode = insert(element,node.rightNode); + } + return node; + } + + + public boolean contains(T element){ + return contains(element,root); + } + + private boolean contains(T element,BinaryNode node){ + + if(node == null){ + return false; + } + + int intCompare = element.compareTo(node.data); + + if(intCompare < 0){ + return contains(element,node.leftNode); + }else if(intCompare > 0){ + return contains(element,node.rightNode); + }else{ + return true; + } + } + + public void remove(T element){ + remove(element,root); + } + + private BinaryNode remove(T element,BinaryNode node){ + if(node == null){ + return node; + } + + int intCompare = element.compareTo(node.data); + + if(intCompare < 0){ + node.leftNode = remove(element,node.leftNode); + }else if(intCompare > 0){ + node.rightNode = remove(element,node.rightNode); + } + else if(node.leftNode != null && node.rightNode != null){ + node.data = findMin(node).data; + node.rightNode = remove(node.data,node.rightNode); + }else{ + node = (node.leftNode != null) ? node.leftNode : node.rightNode; + } + return node; + } + + + private BinaryNode findMin(BinaryNode node){ + if(node == null){ + return null; + }else if(node.leftNode == null){ + return node; + }else{ + return findMin(node.leftNode); + } + } + + private BinaryNode findMax(BinaryNode node){ + if(node == null){ + return null; + } + + while(node.rightNode != null){ + node = node.rightNode; + } + + return node; + } + + private class BinaryNode{ + + private T data; + private BinaryNode leftNode; + private BinaryNode rightNode; + + public BinaryNode(T data, BinaryNode leftNode,BinaryNode rightNode) { + this.data = data; + this.leftNode = leftNode; + this.rightNode = rightNode; + } + + public BinaryNode(T element) { + this(element,null,null); + } + + + } +} diff --git a/group04/465034663/src/com/xusheng/tree/TestMain.java b/group04/465034663/src/com/xusheng/tree/TestMain.java new file mode 100644 index 0000000000..03197cef6e --- /dev/null +++ b/group04/465034663/src/com/xusheng/tree/TestMain.java @@ -0,0 +1,21 @@ +package com.xusheng.tree; + +public class TestMain { + + public static void main(String[] args) { + BinarySearchTree bst = new BinarySearchTree(); + bst.insert(8); + bst.insert(3); + bst.insert(7); + bst.insert(1); + bst.insert(10); + System.out.println(bst.contains(3)); + bst.remove(4); + System.out.println(bst.contains(3)); +// BinarySearchTree bst = new BinarySearchTree(); +// bst.insert("haha1"); +// bst.insert("haha2"); +// bst.insert("haha3"); +// System.out.println(bst.contains("haha3")); + } +} diff --git a/group04/474772605/.classpath b/group04/474772605/.classpath new file mode 100644 index 0000000000..28e2b79383 --- /dev/null +++ b/group04/474772605/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group04/474772605/.gitignore b/group04/474772605/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/474772605/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/474772605/.project b/group04/474772605/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group04/474772605/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/474772605/.settings/org.eclipse.jdt.core.prefs b/group04/474772605/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..416f4fb696 --- /dev/null +++ b/group04/474772605/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/group04/474772605/src/com/coding/basic/ArrayList.java b/group04/474772605/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..de945501c2 --- /dev/null +++ b/group04/474772605/src/com/coding/basic/ArrayList.java @@ -0,0 +1,85 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + private int length = 1; + + private Object[] elementData = new Object[length]; + + public void add(Object o){ + System.out.println("进行add方法"); + capacity(size+1); + System.out.println(elementData.length); + elementData[size++] = o; + //size++; + } + public void add(int index, Object o){ + capacity(size+1); + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o ; + } + + public Object get(int index){ + System.out.println("进行get方法"); + return elementData[index]; + } + + public Object remove(int index){ + System.out.println("进行remove方法"); + if(index>size){ + return elementData; + } + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + elementData[--size]=null; + System.out.println(size); + return elementData; + } + + public int size(){ + return this.size; + } + + public Iterator iterator(){ + return new Iterarorimp(this.elementData); + } + + public class Iterarorimp implements Iterator{ + + int index; + Object[] data = null; + + public Iterarorimp(Object[] data){ + this.data = data; + } + + + public boolean hasNext() { + if(index>=data.length){ + return false; + } + return true; + } + + + public Object next() { + + return this.data[index++]; + } + + + } + + + + public void capacity(int newlength) { + System.out.println("进行扩容方法"); + if(newlength>length){ + Object[] newelementData = new Object[length*2]; + System.arraycopy(elementData, 0, newelementData, 0, size); + this.elementData = newelementData; + length = length*2; + } + } + +} diff --git a/group04/474772605/src/com/coding/basic/BinaryTreeNode.java b/group04/474772605/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group04/474772605/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group04/474772605/src/com/coding/basic/Dinkedlist.java b/group04/474772605/src/com/coding/basic/Dinkedlist.java new file mode 100644 index 0000000000..f3b9de03f2 --- /dev/null +++ b/group04/474772605/src/com/coding/basic/Dinkedlist.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Dinkedlist { +public static void main(String[] args) { + LinkedList linkedlist = new LinkedList(); + String o = "1234"; + String a = "aaaaaaaa"; + String v = "vvvvvvvv"; + linkedlist.add(o); + linkedlist.add(1,a); + linkedlist.add(2,v); + linkedlist.removeLast(); + for(int i =0 ; iindex){ + Node newnode = new Node(); + newnode.data = o; + Node nodefirst = new Node(); + Node nodelast = new Node(); + int amount =1; + Node first = head; + while(first.next !=null){ + if(amount+1 == index){ + nodefirst.next = newnode; + nodelast = first.next; + newnode.next = nodelast; + size++; + } + first = first.next; + amount++; + } + } + if(size==index){ + + Node node = new Node(); + node.data = o; + last.next =node; + last = node; + size++; + + } + } + public Object get(int index){ + int amount = 0; + Node newnode = head; + while(newnode.next !=null){ + if(amount==index){ + return newnode.data; + } + amount++; + newnode = newnode.next; + } + return newnode.data; + } + public Object remove(int index){ + + if(index ==0){ + removeFirst(); + } + int amount =0; + Node first = head; + Node remove = new Node(); + while(first.next!=null){ + if(amount+1==index){ + remove = first.next; + first.next = remove.next; + size--; + return remove.data; + } + first = first.next; + amount++; + } + return null; + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + Node newhead =new Node(); + newhead.data=o; + newhead.next = head; + head = newhead; + size++; + + } + public void addLast(Object o){ + add(o); + + } + public Object removeFirst(){ + Object removedata = new Object(); + removedata = head.data; + head = head.next; + size--; + return removedata; + + } + public Object removeLast(){ + Node last = head; + Node cache =new Node(); + while(last.next !=null){ + cache = last; + last = last.next; + } + cache.next =null; + size--; + return last.data; + + } + public Iterator iterator(){ + return new Iteratorimp(this.head); + } + public class Iteratorimp implements Iterator{ + Node newnode = new Node(); + public Iteratorimp(Node node){ + this.newnode = node; + } + + public boolean hasNext() { + if(newnode.next ==null){ + return false; + } + return true; + } + + public Object next() { + newnode = newnode.next; + return newnode.data; + } + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group04/474772605/src/com/coding/basic/List.java b/group04/474772605/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group04/474772605/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/474772605/src/com/coding/basic/Queue.java b/group04/474772605/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..29ea3f95ff --- /dev/null +++ b/group04/474772605/src/com/coding/basic/Queue.java @@ -0,0 +1,42 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class Queue { + Object[] elementData; + int maxsize; + int size =0; + int head=0; + int last=-1; + public Queue(int i){ + maxsize = i; + elementData = new Object[maxsize]; + } + + public void enQueue(Object o){ + + if(size == maxsize){ + throw new IllegalStateException("Queue full"); + } + elementData[size++]=o; + last=size; + + } + + public Object deQueue(){ + + return null; + } + + public boolean isEmpty(){ + if(this.size==0){ + return true; + } + + return false; + } + + public int size(){ + return this.size; + } +} diff --git a/group04/474772605/src/com/coding/basic/Stack.java b/group04/474772605/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..7a5a56bdf0 --- /dev/null +++ b/group04/474772605/src/com/coding/basic/Stack.java @@ -0,0 +1,31 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + int size =0; + + public void push(Object o){ //入栈 + elementData.add(o); + size++; + } + + public Object pop(){ //移走栈顶对象,将该对象作为函数值返回 + Object top = elementData.get(size); + elementData.remove(size); + size--; + return top; + } + + public Object peek(){//查找栈顶对象,而不从栈中移走 + return elementData.get(size); + } + public boolean isEmpty(){ + if(this.size ==0){ + return true; + } + return false; + } + public int size(){ + return this.size; + } +} diff --git a/group04/474772605/src/com/coding/basic/testarraylist.java b/group04/474772605/src/com/coding/basic/testarraylist.java new file mode 100644 index 0000000000..df5e814ccf --- /dev/null +++ b/group04/474772605/src/com/coding/basic/testarraylist.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class testarraylist { + public static void main(String[] args) { + ArrayList abc = new ArrayList(); + String i = "aaa"; + String y = "bbb"; + Object o = new Object(); + + + abc.add(i); + System.out.println(abc.get(0)); + // System.out.println(abc.get(1)); + abc.add(y); + System.out.println(abc.get(0)); + System.out.println(abc.get(1)); + abc.remove(1); + System.out.println(abc.get(0)); + System.out.println(abc.get(1)); + } + +} diff --git a/group04/498654356/one/.classpath b/group04/498654356/one/.classpath new file mode 100644 index 0000000000..18867411f4 --- /dev/null +++ b/group04/498654356/one/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/group04/498654356/one/.gitignore b/group04/498654356/one/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/498654356/one/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/498654356/one/.project b/group04/498654356/one/.project new file mode 100644 index 0000000000..c442999cd4 --- /dev/null +++ b/group04/498654356/one/.project @@ -0,0 +1,23 @@ + + + 498654356Learning_one + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/group04/498654356/one/pom.xml b/group04/498654356/one/pom.xml new file mode 100644 index 0000000000..b068c4a822 --- /dev/null +++ b/group04/498654356/one/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + 498654356Learning_one + 498654356Learning_one + 0.0.1-SNAPSHOT + + src + test + + + src + + **/*.java + + + + + + maven-compiler-plugin + 3.5.1 + + + + + + + + + + + + junit + junit + 4.12 + test + + + + dom4j + dom4j + 1.6.1 + + + + \ No newline at end of file diff --git a/group04/498654356/one/src/org/coding/one/ArrayList.java b/group04/498654356/one/src/org/coding/one/ArrayList.java new file mode 100644 index 0000000000..3c5ec2edc6 --- /dev/null +++ b/group04/498654356/one/src/org/coding/one/ArrayList.java @@ -0,0 +1,95 @@ +package org.coding.one; + +import java.util.Arrays; + +public class ArrayList implements List { + + /** + * 用于存放数据的数组 + */ + private Object[] elementData; + + /** + * 记录 ArrayList 中存放元素的个数 + */ + private int size; + + /** + * ArrayList 的默认的初始容量值 + */ + private static final int DEFAULT_CAPACITY = 10; + + public ArrayList() { + this.elementData = new Object[DEFAULT_CAPACITY]; + } + + @Override + public void add(Object o) { + ensureGrow(); + this.elementData[size++] = o; + } + + private void grow(int capacity) { + this.elementData = Arrays.copyOf(this.elementData, capacity); + } + + @Override + public void add(int index, Object o) { + checkRangeIndex(index); + ensureGrow(); + System.arraycopy(this.elementData, index, this.elementData, index + 1, this.size - index); + this.elementData[index] = o; + this.size ++; + } + + private void ensureGrow() { + if(this.size == this.elementData.length) { //扩容 + grow(this.size + 1); + } + } + + @Override + public Object get(int index) { + checkGetValIndex(index); + return this.elementData[index]; + } + + private void checkGetValIndex(int index) { + if(index < 0 || index >= this.size) { //越界 + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+ this.size); + } + + } + + private void checkRangeIndex(int index) { + if(index < 0 || index > this.size) { //越界 + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+ this.size); + } + } + + @Override + public Object remove(int index) { + checkGetValIndex(index); + Object oldVal = this.elementData[index]; + this.elementData[index] = null; //释放引用 + System.arraycopy(this.elementData, index + 1, this.elementData, index, this.size - index -1); + this.size--; + return oldVal; + } + + @Override + public int size() { + return this.size; + } + + @Override + public boolean isEmpty() { + return this.size == 0; + } + + @Override + public String toString() { + return "ArrayList [elementData=" + Arrays.toString(elementData) + ", size=" + size + "]"; + } + +} diff --git a/group04/498654356/one/src/org/coding/one/BinaryTreeNode.java b/group04/498654356/one/src/org/coding/one/BinaryTreeNode.java new file mode 100644 index 0000000000..10b9a3668e --- /dev/null +++ b/group04/498654356/one/src/org/coding/one/BinaryTreeNode.java @@ -0,0 +1,62 @@ +package org.coding.one; + +@SuppressWarnings( {"unchecked", "rawtypes"}) +public class BinaryTreeNode { + + private Comparable data; + private BinaryTreeNode left; + private BinaryTreeNode right; + public BinaryTreeNode(Comparable data, BinaryTreeNode left, BinaryTreeNode right) { + super(); + this.data = data; + this.left = left; + this.right = right; + } + public Object getData() { + return data; + } + public void setData(Comparable data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Comparable val){ + return doInsert(this, val); + } + + private BinaryTreeNode doInsert(BinaryTreeNode node, Comparable val) { + if(node == null) { + return null; + } + if(val.compareTo(node.data) == 0) { + return node; + } + if(val.compareTo(node.data) > 0) { + if(node.right == null) { + BinaryTreeNode rightNode = new BinaryTreeNode(val, null, null); + node.right = rightNode; + return rightNode; + } + return doInsert(node.right, val); + } else { + if(node.left == null) { + BinaryTreeNode leftNode = new BinaryTreeNode(val, null, null); + node.left = leftNode; + return leftNode; + } + return doInsert(node.left, val); + } + } + +} diff --git a/group04/498654356/one/src/org/coding/one/LinkedList.java b/group04/498654356/one/src/org/coding/one/LinkedList.java new file mode 100644 index 0000000000..97f0a234f2 --- /dev/null +++ b/group04/498654356/one/src/org/coding/one/LinkedList.java @@ -0,0 +1,138 @@ +package org.coding.one; + +public class LinkedList implements List { + + private Node first; + + private Node last; + + private int size = 0; + + @Override + public void add(Object o) { + Node newNode = new Node(o, null); + if(this.last != null) { + this.last.next = newNode; + this.last = newNode; + } else { + this.first = newNode; + this.last = newNode; + } + this.size++; + } + + @Override + public void add(int index, Object o) { + checkIndex(index); + if(index == 0) { //first + Node newNode = new Node(o, this.first); + this.first = newNode; + if(this.last == null) { //通过该方法放入第一个元素时 + this.last = newNode; + } + this.size++; + } else if (index == this.size) { //last + add(o); + } else { + Node preNode = findNode(index - 1); + Node nextNode = preNode.next; + Node newNode = new Node(o, nextNode); + preNode.next = newNode; + this.size++; + } + } + + /** + * 通过角标获取对应的 Node 对象 + * @param index (0 <= index < size) + * @return + */ + private Node findNode(int index) { + Node node = this.first; + for(int i = 1; i <= index ; i++) { + node = node.next; + } + + return node; + } + + /** + * 0 <= index <= size + * @param index + */ + private void checkIndex(int index) { + if(index < 0 || index > this.size) { + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+ this.size); + } + } + + @Override + public Object get(int index) { + checkRangeIndex(index); + return findNode(index).data; + } + + /** + * 0 <= index < size + * @param index + */ + private void checkRangeIndex(int index) { + if(index < 0 || index > this.size - 1) { + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+ this.size); + } + } + + @Override + public Object remove(int index) { + checkRangeIndex(index); + Node oldNode = null; + if(index == 0) { + oldNode = this.first; + this.first = oldNode.next; + } else { + Node preNode = findNode(index - 1); + oldNode = preNode.next; + preNode.next = oldNode.next; + } + oldNode.next = null; + this.size--; + return oldNode.data; + } + + @Override + public int size() { + return this.size; + } + + @Override + public boolean isEmpty() { + return this.size == 0; + } + + public void addFirst(Object o){ + add(0, o); + } + + public void addLast(Object o){ + add(this.size, o); + } + + public Object removeFirst(){ + return remove(0); + } + + public Object removeLast(){ + return remove(size - 1); + + } + + private static class Node { + private Object data; + private Node next; + public Node(Object data, Node next) { + super(); + this.data = data; + this.next = next; + } + } +} diff --git a/group04/498654356/one/src/org/coding/one/List.java b/group04/498654356/one/src/org/coding/one/List.java new file mode 100644 index 0000000000..0f37f615df --- /dev/null +++ b/group04/498654356/one/src/org/coding/one/List.java @@ -0,0 +1,16 @@ +package org.coding.one; + +public interface List { + + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); + + public boolean isEmpty(); +} diff --git a/group04/498654356/one/src/org/coding/one/Queue.java b/group04/498654356/one/src/org/coding/one/Queue.java new file mode 100644 index 0000000000..039ec31868 --- /dev/null +++ b/group04/498654356/one/src/org/coding/one/Queue.java @@ -0,0 +1,22 @@ +package org.coding.one; + +public class Queue { + + private LinkedList dataElement = new LinkedList(); + + public void enQueue(Object o){ + dataElement.addLast(o); + } + + public Object deQueue(){ + return dataElement.removeFirst(); + } + + public boolean isEmpty(){ + return dataElement.isEmpty(); + } + + public int size(){ + return dataElement.size(); + } +} diff --git a/group04/498654356/one/src/org/coding/one/Stack.java b/group04/498654356/one/src/org/coding/one/Stack.java new file mode 100644 index 0000000000..5f16fc3306 --- /dev/null +++ b/group04/498654356/one/src/org/coding/one/Stack.java @@ -0,0 +1,26 @@ +package org.coding.one; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(0, o); + } + + public Object pop(){ + return elementData.remove(0); + } + + public Object peek(){ + return elementData.get(0); + } + + public boolean isEmpty(){ + return elementData.isEmpty(); + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group04/498654356/one/src/org/coding/two/ActionBeanDefinition.java b/group04/498654356/one/src/org/coding/two/ActionBeanDefinition.java new file mode 100644 index 0000000000..e9dc5a02e3 --- /dev/null +++ b/group04/498654356/one/src/org/coding/two/ActionBeanDefinition.java @@ -0,0 +1,66 @@ +package org.coding.two; + +import java.util.HashMap; +import java.util.Map; + +/** + * 封装 Struts.xml 中 action 标签 + */ +public class ActionBeanDefinition { + public static final String TAG_ACTION = "action"; + public static final String TAG_RESULT = "result"; + public static final String TAG_ACTION_ATTR_NAME = "name"; + public static final String TAG_ACTION_ATTR_CLASS = "class"; + public static final String TAG_RESULT_ATTR_NAME = "name"; + public static final String DEFAULT_RESOURCE = "org/coding/two/struts.xml"; + + private String name; + + private String className; + + private Map resultMap; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public Map getResultMap() { + return resultMap; + } + + public ActionBeanDefinition(String name, String className) { + super(); + this.name = name; + this.className = className; + this.resultMap = new HashMap(); + } + + /** + * + * @param name result 标签的 name 属性值 + * @param viewPath result 标签的视图路径 + */ + public void putResult(String name, String viewPath) { + this.resultMap.put(name, viewPath); +// this.resultMap.put("name", name); +// this.resultMap.put("view", viewPath); + } + + @Override + public String toString() { + return "ActionBeanDefinition [name=" + name + ", className=" + className + ", resultMap=" + resultMap + "]"; + } + +} diff --git a/group04/498654356/one/src/org/coding/two/LoginAction.java b/group04/498654356/one/src/org/coding/two/LoginAction.java new file mode 100644 index 0000000000..730c8a4033 --- /dev/null +++ b/group04/498654356/one/src/org/coding/two/LoginAction.java @@ -0,0 +1,45 @@ +package org.coding.two; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } + + @Override + public String toString() { + return "LoginAction [name=" + name + ", password=" + password + ", message=" + message + "]"; + } + +} diff --git a/group04/498654356/one/src/org/coding/two/Struts.java b/group04/498654356/one/src/org/coding/two/Struts.java new file mode 100644 index 0000000000..4c3ac33256 --- /dev/null +++ b/group04/498654356/one/src/org/coding/two/Struts.java @@ -0,0 +1,150 @@ +package org.coding.two; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + private static final String METHOD_SET = "set"; + private static final String METHOD_GET = "get"; + private static Map actionDefinitionMap = new HashMap(); + + static { + //0 + parseXml(); + } + + @SuppressWarnings("unchecked") + public static void parseXml(){ + SAXReader reader = new SAXReader(); + Document document = null; + String path = Struts.class.getClassLoader().getResource("").getPath(); + try { + document = reader.read(path + ActionBeanDefinition.DEFAULT_RESOURCE); + } catch (DocumentException e) { + throw new RuntimeException(e); + } + Element struts = document.getRootElement(); + List actions = struts.elements(ActionBeanDefinition.TAG_ACTION); + for (Element element : actions) { + String name = element.attributeValue(ActionBeanDefinition.TAG_ACTION_ATTR_NAME); + String className = element.attributeValue(ActionBeanDefinition.TAG_ACTION_ATTR_CLASS); + List results = element.elements(ActionBeanDefinition.TAG_RESULT); + ActionBeanDefinition beanDefinition = new ActionBeanDefinition(name, className); + for (Element result : results) { + beanDefinition.putResult(result.attributeValue(ActionBeanDefinition.TAG_RESULT_ATTR_NAME), result.getTextTrim()); + } + actionDefinitionMap.put(name, beanDefinition); + } +// System.out.println(actionDefinitionMap); + } + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + if(!actionDefinitionMap.containsKey(actionName)) { + throw new RuntimeException("does not exist action : " + actionName); + } + ActionBeanDefinition beanDefinition = actionDefinitionMap.get(actionName); + try { + //1 + Class bean = Class.forName(beanDefinition.getClassName()); + Object instance = bean.newInstance(); + Set keySet = parameters.keySet(); + for (String key : keySet) { + Method method = bean.getMethod(getSetMethodName(key), new Class[]{String.class}); + method.invoke(instance, parameters.get(key)); + } +// System.out.println(instance); + //2 + Method method = bean.getMethod("execute"); + Object result = method.invoke(instance); + + //3 + Method[] methods = bean.getMethods(); + Map parameterss = new HashMap(); + for (Method m : methods) { + String methodName = m.getName(); + if(methodName.contains(METHOD_GET)) { + String para = getPropNameByMethoedName(methodName); + parameterss.put(para, m.invoke(instance)); + } + } + View view = new View(); + view.setParameters(parameterss); +// System.out.println(parameterss); + //4 + String jsp = actionDefinitionMap.get(actionName).getResultMap().get(result); + view.setJsp(jsp); + return view; + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchMethodException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + return null; + } + + + private static String getPropNameByMethoedName(String methodName) { + String prop = null; + if(methodName.contains(METHOD_GET)){ + String s = methodName.substring(3); + prop = s.substring(0, 1).toLowerCase() + s.substring(1); + } + return prop; + } + + private static String getSetMethodName(String para) { + return METHOD_SET + para.substring(0, 1).toUpperCase() + para.substring(1); + } +} diff --git a/group04/498654356/one/src/org/coding/two/View.java b/group04/498654356/one/src/org/coding/two/View.java new file mode 100644 index 0000000000..d576cd537f --- /dev/null +++ b/group04/498654356/one/src/org/coding/two/View.java @@ -0,0 +1,23 @@ +package org.coding.two; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/498654356/one/src/org/coding/two/array/ArrayUtil.java b/group04/498654356/one/src/org/coding/two/array/ArrayUtil.java new file mode 100644 index 0000000000..cbbde7be9a --- /dev/null +++ b/group04/498654356/one/src/org/coding/two/array/ArrayUtil.java @@ -0,0 +1,292 @@ +package org.coding.two.array; + +/** + * 数组定长:考虑长度问题;排序之后的数组操作起来更方便; + * @author Administrator + * + */ +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if(origin == null || origin.length < 2) { + return; + } + int headIndex = 0; + int lastIndex = origin.length - 1; + while (headIndex < lastIndex) { + int temp = origin[headIndex]; + origin[headIndex] = origin[lastIndex]; + origin[lastIndex] = temp; + headIndex++; + lastIndex--; + } + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray){ + if(oldArray == null || oldArray.length == 0) { + return new int[]{}; + } +// int[] newArray = removeZero1(oldArray); + int[] newArray = removeZero2(oldArray); + return newArray; + } + + private int[] removeZero2(int[] oldArray) { + int[] indexArray = new int [oldArray.length]; + int index = 0; + for(int i = 0, size = oldArray.length; i < size ; i++) { + if(oldArray[i] != 0) { + indexArray[index] = oldArray[i]; + index++; + } + } + if(index == 0) { + return new int[]{}; + } + int[] newArray = new int[index]; + System.arraycopy(indexArray, 0, newArray, 0, index); + return newArray; + } + + private int[] removeZero1(int[] oldArray) { + int length = 0; + for(int i = 0, size = oldArray.length; i < size ; i++) { + if(oldArray[i] != 0) { + length++; + } + } + if(length == 0) { + return new int[]{}; + } + int[] newArray = new int[length]; + for(int i = 0, size = oldArray.length, index = 0; i < size ; i++) { + if(oldArray[i] != 0) { + newArray[index] = oldArray[i]; + index++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + boolean flag1 = (array1 == null || array1.length == 0); + boolean flag2 = (array2 == null || array2.length == 0); + if(flag1 && ! flag2) { //array1 为空 + return array2; + } + if(flag2 && !flag1) { //array2 为空 + return array1; + } + if(flag1 && flag2){ //array1 和 array2 为空 + return new int[0]; + } + // array1 和 array2 都不为空 + int length1 = array1.length; + int length2 = array2.length; + int index1 = 0; + int index2 = 0; + int newLength = length1 + length2; + int[] newArray = new int[newLength]; + int newIndex = 0; + while (index1 < length1 && index2 < length2) { + int val1 = array1[index1]; + int val2 = array2[index2]; + if(val1 < val2) { //小于 + newArray[newIndex] = val1; + newIndex++; + index1++; + } else if(val1 == val2) { //等于 + newArray[newIndex] = val1; + newIndex++; + index1++; + index2++; + } else { //大于 + newArray[newIndex] = val2; + newIndex++; + index2++; + } + } + //剩余的 + while(index1 < length1) { + newArray[newIndex] = array1[index1]; + newIndex++; + index1++; + } + while(index2 < length2) { + newArray[newIndex] = array2[index1]; + newIndex++; + index2++; + } + // + if(newIndex == newLength) { + return newArray; + } + int[] resutlArray = new int[newIndex]; + System.arraycopy(newArray, 0, resutlArray, 0, newIndex); + return resutlArray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + boolean flag = (oldArray == null || oldArray.length == 0); + boolean flag2 = (size == 0); + if(flag) { + return new int[0]; + } + if(flag2 && !flag) { + return oldArray; + } + int length = oldArray.length; + int[] newArray = new int[length + size]; + System.arraycopy(oldArray, 0, newArray, 0, length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if(max < 2) { + return new int[0]; + } +// return fibonacci1(max); + return fibonacci2(new int[]{1, 1}, max); + } + + /** + * 递归 + * @param array + * @param max + * @return + */ + private int[] fibonacci2(int[] array, int max) { + int length = array.length; + if((array[length - 1] + array[length -2]) >= max) { + return array; + } + array = grow(array, 1); + length = array.length; + array[ length - 1] = array[length -2] + array[length -3]; + return fibonacci2(array, max); + } + + /** + * 循环 + * @param max + * @return + */ + private int[] fibonacci1(int max) { + int[] array = new int[]{1, 1}; + int length = array.length; + while((array[length - 1] + array[length -2]) < max) { + array = grow(array, 1); + length = array.length; + array[ length - 1] = array[length -2] + array[length -3]; + } + return array; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if(max < 3) { + return new int[0]; + } + int[] array = new int[]{2}; + int length = array.length; + int val = array[length - 1] + 1; + while(val < max) { + if(isPrime(val)){ + array = grow(array, 1); + length++; + array[length - 1] = val; + } + val++; + } + return array; + } + + private boolean isPrime(int val) { + for(int i = 2; i < val; i++) { + if(val % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + if(array == null) { + return null; + } + if(array.length == 0) { + return ""; + } + if(seperator == null) { + seperator = ""; + } + StringBuilder sb = new StringBuilder(); + for (int i : array) { + sb.append(i).append(seperator); + } + return sb.substring(0, sb.length() - seperator.length()); + } + + +} diff --git a/group04/498654356/one/src/org/coding/two/struts.xml b/group04/498654356/one/src/org/coding/two/struts.xml new file mode 100644 index 0000000000..8a014f16f2 --- /dev/null +++ b/group04/498654356/one/src/org/coding/two/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/498654356/one/test/org/coding/one/AllTests.java b/group04/498654356/one/test/org/coding/one/AllTests.java new file mode 100644 index 0000000000..64539189e4 --- /dev/null +++ b/group04/498654356/one/test/org/coding/one/AllTests.java @@ -0,0 +1,11 @@ +package org.coding.one; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ ArrayListTest.class, BinaryTreeNodeTest.class, LinkedListTest.class, QueueTest.class, StackTest.class }) +public class AllTests { + +} diff --git a/group04/498654356/one/test/org/coding/one/ArrayListTest.java b/group04/498654356/one/test/org/coding/one/ArrayListTest.java new file mode 100644 index 0000000000..ec4bd8759a --- /dev/null +++ b/group04/498654356/one/test/org/coding/one/ArrayListTest.java @@ -0,0 +1,95 @@ +package org.coding.one; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ArrayListTest { + + private ArrayList target; + private int size = 15; + + @Before + public void setUp() throws Exception { + this.target = new ArrayList(); + } + + @After + public void tearDown() throws Exception { + this.target = null; + } + + @Test + public void testAddObject() { + addElement(size); + Assert.assertFalse(target.isEmpty()); + Assert.assertEquals(size, target.size()); + for(int i = 0; i < size; i++) { + Assert.assertEquals(i, ((Integer)target.get(i)).intValue()); + } +// System.out.println(target); + } + + private void addElement(int size) { + for(int i = 0; i < size; i++) { + target.add(i); + } + } + + @Test + public void testAddIntObject() { + addElement(size); + int destIndex = 1; + int destVal = 11; + target.add(destIndex, destVal); + Assert.assertEquals(destVal, target.get(destIndex)); + Assert.assertEquals(size + 1, target.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testAddIntObjectException() { + target.add(1, 5); + } + + @Test + public void testGet() { + addElement(size); + Assert.assertEquals(1, ((Integer)target.get(1)).intValue()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testGetException() { + addElement(size); + target.get(size); + } + + @Test + public void testRemove() { + addElement(size); + int val = (int) target.remove(0); + Assert.assertEquals(0, val); + Assert.assertEquals(size -1, target.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testRemoveException() { + addElement(size); + target.remove(size); + } + + @Test + public void testSize() { + Assert.assertEquals(0, target.size()); + addElement(size); + Assert.assertEquals(size, target.size()); + } + + @Test + public void testIsEmpty() { + Assert.assertTrue(target.isEmpty()); + addElement(size); + Assert.assertFalse(target.isEmpty()); + } + +} diff --git a/group04/498654356/one/test/org/coding/one/BinaryTreeNodeTest.java b/group04/498654356/one/test/org/coding/one/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..3b285b00f4 --- /dev/null +++ b/group04/498654356/one/test/org/coding/one/BinaryTreeNodeTest.java @@ -0,0 +1,45 @@ +package org.coding.one; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class BinaryTreeNodeTest { + + private BinaryTreeNode target; + + @Before + public void setUp() throws Exception { + target = new BinaryTreeNode(100, null, null); + } + + @After + public void tearDown() throws Exception { + target = null; + } + + @Test + public void testInsert() { + target.insert(70); + target.insert(60); + target.insert(80); + + target.insert(120); + target.insert(110); + target.insert(130); + + BinaryTreeNode left = target.getLeft(); + Assert.assertEquals(70, left.getData()); + Assert.assertEquals(60, left.getLeft().getData()); + Assert.assertEquals(80, left.getRight().getData()); + + BinaryTreeNode right = target.getRight(); + Assert.assertEquals(120, right.getData()); + Assert.assertEquals(110, right.getLeft().getData()); + Assert.assertEquals(130, right.getRight().getData()); + + } + +} diff --git a/group04/498654356/one/test/org/coding/one/LinkedListTest.java b/group04/498654356/one/test/org/coding/one/LinkedListTest.java new file mode 100644 index 0000000000..55d3ceeb05 --- /dev/null +++ b/group04/498654356/one/test/org/coding/one/LinkedListTest.java @@ -0,0 +1,194 @@ +package org.coding.one; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class LinkedListTest { + + private LinkedList target; + private int size = 5; + + @Before + public void setUp() throws Exception { + this.target = new LinkedList(); + } + + @After + public void tearDown() throws Exception { + this.target = null; + } + + @Test + public void testAddObject() { + target.add(1); + Assert.assertEquals(1, ((Integer)target.get(0)).intValue()); + Assert.assertEquals(1, target.size()); + } + + @Test + public void testAddIntObjectFirst() { + target.add(0, 1); + Assert.assertEquals(1, ((Integer)target.get(0)).intValue()); + Assert.assertEquals(1, target.size()); + } + + @Test + public void testAddIntObject() { + addElement(); + target.add(2, 22); + Assert.assertEquals(22, ((Integer)target.get(2)).intValue()); + Assert.assertEquals(size + 1, target.size()); + } + + private void addElement() { + for(int i = 0; i < size; i++) { + target.add(i); + } + } + + @Test + public void testAddIntObjectLast() { + addElement(); + target.add(size, 100); + Assert.assertEquals(100, ((Integer)target.get(size)).intValue()); + Assert.assertEquals(size + 1, target.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testAddIntObjectException() { + target.add(-1, 3); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testAddIntObjectException2() { + addElement(); + target.add(size + 1, 100); + } + + + @Test + public void testGet() { + addElement(); + Assert.assertEquals(4, target.get(4)); + } + + @Test + public void testGetFirst() { + addElement(); + Assert.assertEquals(0, target.get(0)); + } + + + @Test(expected = IndexOutOfBoundsException.class) + public void testGetException() { + addElement(); + target.get(size); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testGetException2() { + addElement(); + target.get(-1); + } + + @Test + public void testRemove() { + addElement(); + int dest = (int) target.remove(2); + Assert.assertEquals(2, dest); + Assert.assertEquals(4, target.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testEmptyObjRemove() { + target.remove(0); + } + + @Test + public void testRemoveFirst2() { + addElement(); + int dest = (int) target.remove(0); + Assert.assertEquals(0, dest); + Assert.assertEquals(4, target.size()); + } + + @Test + public void testRemoveLast2() { + addElement(); + int dest = (int) target.remove(size - 1); + Assert.assertEquals(4, dest); + Assert.assertEquals(4, target.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testRemoveException() { + addElement(); + target.remove( - 1); + } + + + @Test(expected = IndexOutOfBoundsException.class) + public void testRemoveException2() { + addElement(); + target.remove(size); + } + + @Test + public void testSize() { + Assert.assertEquals(0, target.size()); + addElement(); + Assert.assertEquals(size, target.size()); + } + + @Test + public void testIsEmpty() { + Assert.assertTrue(target.isEmpty()); + addElement(); + Assert.assertFalse(target.isEmpty()); + } + + @Test + public void testAddFirst() { + addElement(); + target.addFirst(100); + Assert.assertEquals(100, target.get(0)); + } + + @Test + public void testAddLast() { + addElement(); + target.addLast(100); + Assert.assertEquals(100, target.get(size)); + } + + @Test + public void testRemoveFirst() { + addElement(); + int dest = (int) target.removeFirst(); + Assert.assertEquals(0, dest); + Assert.assertEquals(size - 1 , target.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testRemoveFirstException() { + target.removeFirst(); + } + + @Test + public void testRemoveLast() { + addElement(); + int dest = (int) target.removeLast(); + Assert.assertEquals(4, dest); + Assert.assertEquals(size - 1, target.size()); + } + + @Test + public void testRemoveLast_one() { + target.add(4); + int dest = (int) target.removeLast(); + Assert.assertEquals(4, dest); + Assert.assertEquals(0, target.size()); + } +} diff --git a/group04/498654356/one/test/org/coding/one/QueueTest.java b/group04/498654356/one/test/org/coding/one/QueueTest.java new file mode 100644 index 0000000000..dfa41f1e37 --- /dev/null +++ b/group04/498654356/one/test/org/coding/one/QueueTest.java @@ -0,0 +1,60 @@ +package org.coding.one; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class QueueTest { + + private Queue target; + + @Before + public void setUp() throws Exception { + target = new Queue(); + } + + @After + public void tearDown() throws Exception { + target = null; + } + + @Test + public void testEnQueue() { + Assert.assertEquals(0, target.size()); + target.enQueue(1); + target.enQueue(2); + Assert.assertEquals(2, target.size()); + } + + @Test + public void testDeQueue() { + Assert.assertEquals(0, target.size()); + target.enQueue(1); + target.enQueue(2); + Assert.assertEquals(2, target.size()); + Assert.assertEquals(1, target.deQueue()); + Assert.assertEquals(2, target.deQueue()); + Assert.assertEquals(0, target.size()); + } + + @Test + public void testIsEmpty() { + Assert.assertTrue(target.isEmpty()); + target.enQueue(1); + Assert.assertFalse(target.isEmpty()); + target.deQueue(); + Assert.assertTrue(target.isEmpty()); + } + + @Test + public void testSize() { + Assert.assertEquals(0, target.size()); + target.enQueue(1); + Assert.assertEquals(1, target.size()); + target.deQueue(); + Assert.assertEquals(0, target.size()); + } + +} diff --git a/group04/498654356/one/test/org/coding/one/StackTest.java b/group04/498654356/one/test/org/coding/one/StackTest.java new file mode 100644 index 0000000000..c88fe5329e --- /dev/null +++ b/group04/498654356/one/test/org/coding/one/StackTest.java @@ -0,0 +1,70 @@ +package org.coding.one; + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class StackTest { + + private Stack target; + + @Before + public void setUp() throws Exception { + target = new Stack(); + } + + @After + public void tearDown() throws Exception { + target = null; + } + + @Test + public void testPush() { + Assert.assertEquals(0, target.size()); + target.push(1); + Assert.assertEquals(1, target.peek()); + Assert.assertEquals(1, target.size()); + } + + @Test + public void testPop() { + target.push(1); + target.push(2); + Assert.assertEquals(2, target.pop()); + Assert.assertEquals(1, target.size()); + Assert.assertEquals(1, target.pop()); + Assert.assertEquals(0, target.size()); + } + + @Test + public void testPeek() { + target.push(1); + target.push(2); + Assert.assertEquals(2, target.peek()); + Assert.assertEquals(2, target.size()); + Assert.assertEquals(2, target.peek()); + Assert.assertEquals(2, target.size()); + } + + @Test + public void testIsEmpty() { + Assert.assertTrue(target.isEmpty()); + target.push(1); + Assert.assertFalse(target.isEmpty()); + target.pop(); + Assert.assertTrue(target.isEmpty()); + } + + @Test + public void testSize() { + Assert.assertEquals(0, target.size()); + target.push(1); + Assert.assertEquals(1, target.size()); + target.pop(); + Assert.assertEquals(0, target.size()); + } + +} diff --git a/group04/498654356/one/test/org/coding/two/StrutsTest.java b/group04/498654356/one/test/org/coding/two/StrutsTest.java new file mode 100644 index 0000000000..01d8e90d90 --- /dev/null +++ b/group04/498654356/one/test/org/coding/two/StrutsTest.java @@ -0,0 +1,43 @@ +package org.coding.two; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group04/498654356/one/test/org/coding/two/array/ArrayUtilTest.java b/group04/498654356/one/test/org/coding/two/array/ArrayUtilTest.java new file mode 100644 index 0000000000..d05ba2df3d --- /dev/null +++ b/group04/498654356/one/test/org/coding/two/array/ArrayUtilTest.java @@ -0,0 +1,218 @@ +package org.coding.two.array; + +import static org.junit.Assert.fail; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class ArrayUtilTest { + + private ArrayUtil arrayUtil; + + @Before + public void setUp() throws Exception { + arrayUtil = new ArrayUtil(); + } + + @After + public void tearDown() throws Exception { + arrayUtil = null; + } + + @Test + public void testReverseArray() { + int[] origin = null; + arrayUtil.reverseArray(origin); + Assert.assertNull(origin); + + origin = new int[]{}; + arrayUtil.reverseArray(origin); + Assert.assertArrayEquals(origin, origin); + + origin = new int[]{1}; + arrayUtil.reverseArray(origin); + Assert.assertArrayEquals(origin, origin); + + origin = new int[]{1, 2}; + arrayUtil.reverseArray(origin); + int[] dest = new int[]{2, 1}; + Assert.assertArrayEquals(dest, origin); + + origin = new int[]{1, 2, 3}; + arrayUtil.reverseArray(origin); + dest = new int[]{3, 2, 1}; + Assert.assertArrayEquals(dest, origin); + + origin = new int[]{1, 2, 3, 4}; + arrayUtil.reverseArray(origin); + dest = new int[]{4, 3, 2, 1}; + Assert.assertArrayEquals(dest, origin); + + origin = new int[]{7, 9 , 30, 3}; + arrayUtil.reverseArray(origin); + dest = new int[]{3, 30, 9,7}; + Assert.assertArrayEquals(dest, origin); + + origin = new int[]{7, 9, 30, 3, 4}; + arrayUtil.reverseArray(origin); + dest = new int[]{4,3, 30 , 9,7}; + Assert.assertArrayEquals(dest, origin); + + } + + @Test + public void testRemoveZero() { + int[] origin = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] dest = new int[]{1,3,4,5,6,6,5,4,7,6,7,5}; + origin = arrayUtil.removeZero(origin); + Assert.assertArrayEquals(dest, origin); + + origin = null; + dest = new int[]{}; + origin = arrayUtil.removeZero(origin); + Assert.assertArrayEquals(dest, origin); + + origin = new int[]{}; + dest = new int[]{}; + origin = arrayUtil.removeZero(origin); + Assert.assertArrayEquals(dest, origin); + + origin = new int[]{1}; + dest = new int[]{1}; + origin = arrayUtil.removeZero(origin); + Assert.assertArrayEquals(dest, origin); + + } + + @Test + public void testMerge() { + int[] array1 = new int[]{3, 5, 7,8}; + int[] array2 = new int[]{4, 5, 6,7}; + int[] expecteds = new int[]{3,4,5,6,7,8}; + int[] actuals = arrayUtil.merge(array1, array2); + Assert.assertArrayEquals(expecteds, actuals); + + array1 = new int[]{}; + array2 = new int[]{4, 5, 6,7}; + expecteds = new int[]{4, 5, 6,7}; + actuals = arrayUtil.merge(array1, array2); + Assert.assertArrayEquals(expecteds, actuals); + + array1 = new int[]{3, 5, 7,8}; + array2 = new int[]{}; + expecteds = new int[]{3, 5, 7,8}; + actuals = arrayUtil.merge(array1, array2); + Assert.assertArrayEquals(expecteds, actuals); + + array1 = new int[]{}; + array2 = new int[]{}; + expecteds = new int[]{}; + actuals = arrayUtil.merge(array1, array2); + Assert.assertArrayEquals(expecteds, actuals); + + array1 = new int[]{1, 2, 8,9}; + array2 = new int[]{4, 5, 6,7}; + expecteds = new int[]{1, 2, 4, 5, 6, 7, 8, 9}; + actuals = arrayUtil.merge(array1, array2); + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testGrow() { + int[] oldArray = new int[]{2,3,6}; + int size = 3; + int[] expecteds = new int[]{2,3,6,0,0,0}; + int[] actuals = arrayUtil.grow(oldArray, size); + Assert.assertArrayEquals(expecteds, actuals); + + oldArray = new int[]{}; + size = 3; + expecteds = new int[]{}; + actuals = arrayUtil.grow(oldArray, size); + Assert.assertArrayEquals(expecteds, actuals); + + oldArray = new int[]{}; + size = 0; + expecteds = new int[]{}; + actuals = arrayUtil.grow(oldArray, size); + Assert.assertArrayEquals(expecteds, actuals); + + oldArray = new int[]{2,3,6}; + size = 0; + expecteds = new int[]{2,3,6}; + actuals = arrayUtil.grow(oldArray, size); + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testFibonacci() { + int max = 15; + int[] expecteds = new int[]{1,1,2,3,5,8,13}; + int[] actuals = arrayUtil.fibonacci(max); + Assert.assertArrayEquals(expecteds, actuals); + + max = 1; + expecteds = new int[]{}; + actuals = arrayUtil.fibonacci(max); + Assert.assertArrayEquals(expecteds, actuals); + + max = 2; + expecteds = new int[]{1,1}; + actuals = arrayUtil.fibonacci(max); + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testGetPrimes() { + int max = 23; + int[] expecteds = new int[]{2,3,5,7,11,13,17,19}; + int[] actuals = arrayUtil.getPrimes(max); + Assert.assertArrayEquals(expecteds, actuals); + + max = 2; + expecteds = new int[]{}; + actuals = arrayUtil.getPrimes(max); + Assert.assertArrayEquals(expecteds, actuals); + + max = 3; + expecteds = new int[]{2}; + actuals = arrayUtil.getPrimes(max); + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testGetPerfectNumbers() { + fail("Not yet implemented"); + } + + @Test + public void testJoin() { + int[] array = new int[]{3,8,9}; + String seperator = "-"; + String expected = "3-8-9"; + String actual = arrayUtil.join(array, seperator); + Assert.assertEquals(expected, actual); + + array = null; + seperator = "-"; + expected = null; + actual = arrayUtil.join(array, seperator); + Assert.assertNull(actual); + + array = new int[]{}; + seperator = "-"; + expected = ""; + actual = arrayUtil.join(array, seperator); + Assert.assertEquals(expected, actual); + + array = new int[]{1,2,3}; + seperator = "@-@"; + expected = "1@-@2@-@3"; + actual = arrayUtil.join(array, seperator); + Assert.assertEquals(expected, actual); + } + +} diff --git a/group04/498654356/one/test_resource/org/coding/two/struts.xml b/group04/498654356/one/test_resource/org/coding/two/struts.xml new file mode 100644 index 0000000000..8a014f16f2 --- /dev/null +++ b/group04/498654356/one/test_resource/org/coding/two/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/564451732/hw1/.classpath b/group04/564451732/hw1/.classpath new file mode 100644 index 0000000000..5c5f8efc0b --- /dev/null +++ b/group04/564451732/hw1/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group04/564451732/hw1/.gitignore b/group04/564451732/hw1/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/564451732/hw1/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/564451732/hw1/.project b/group04/564451732/hw1/.project new file mode 100644 index 0000000000..8d18c102de --- /dev/null +++ b/group04/564451732/hw1/.project @@ -0,0 +1,17 @@ + + + 564451732 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/564451732/hw1/src/DataStructureTest.java b/group04/564451732/hw1/src/DataStructureTest.java new file mode 100644 index 0000000000..85837a6f98 --- /dev/null +++ b/group04/564451732/hw1/src/DataStructureTest.java @@ -0,0 +1,114 @@ +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import hw1.ArrayListImpl; +import hw1.BinaryTreeNode; +import hw1.LinkedList; +import hw1.QueueImpl; +import hw1.StackImpl; + +public class DataStructureTest { + + @Test + public void ArrayListTest() { + ArrayListImpl al = new ArrayListImpl(); + Object o1 = new Object(); + Object o2 = new Object(); + Object o3 = new Object(); + al.add(new Object()); + al.add(new Object()); + assertTrue(al.size() == 2); + al.add(5); + assertFalse(al.size() == 2); + assertTrue(al.size() == 3); + al.add(2, 3); + //System.out.println((int)al.get(2)); + assertTrue((int)al.get(2) == 3); + assertTrue((int)al.get(3) == 5); + } + + @Test + public void LinkedListTest() { + LinkedList ll = new LinkedList(); + Object o1 = new Object(); + Object o2 = new Object(); + Object o3 = new Object(); + Object o4 = new Object(); + Object o5 = new Object(); + Object o6 = new Object(); + ll.add(o1); + ll.add(o2); + //System.out.println(ll.size()); + assertTrue(ll.size() == 2); + ll.add(o3); + ll.add(1,1); + assertTrue((int)ll.get(1) == 1); + assertTrue(ll.size() == 4); + ll.addFirst(2); + ll.addLast(4); + assertTrue((int)ll.get(0) == 2); + assertTrue((int)ll.get(ll.size() - 1) == 4); + assertTrue((int)ll.get(2) == 1); + ll.remove(2); + assertTrue(ll.get(2) == o2); + //System.out.print((int)ll.remove(2)); + //System.out.println((int)ll.get(2)); + //assertFalse((int)ll.get(2) == 1); + assertTrue(ll.size() == 5); + assertTrue((int)ll.removeFirst() == 2); + assertTrue(ll.size() == 4); + assertTrue((int)ll.removeLast() == 4); + assertTrue(ll.size() == 3); + } + + @Test + public void QueueTest(){ + QueueImpl qi = new QueueImpl(); + assertTrue(qi.isEmpty()); + qi.enQueue(1); + qi.enQueue(2); + qi.enQueue(3); + assertTrue(qi.size() == 3); + assertTrue((int)qi.deQueue() == 1); + assertTrue(qi.size() == 2); + assertFalse(qi.isEmpty()); + } + + @Test + public void StackTest() { + StackImpl stack = new StackImpl(); + assertTrue(stack.isEmpty()); + stack.push(1); + stack.push(2); + stack.push(3); + assertTrue(stack.size() == 3); + assertTrue((int)stack.pop() == 3); + assertTrue(stack.size() == 2); + assertTrue((int)stack.peek() == 2); + assertFalse(stack.isEmpty()); + } + + @Test + public void BinaryTreeTest() { + BinaryTreeNode bt = new BinaryTreeNode(); + Integer i1 = 1; + Integer i2 = 3; + Integer i3 = 4; + Integer i4 = 6; + Integer i5 = -1; + bt.insert(i3); + bt.insert(i1); + bt.insert(i4); + bt.insert(i2); + bt.insert(i5); + assertTrue((int)bt.getRoot().getData() == 4); + assertTrue((int)bt.getRoot().getLeft().getData() == 1); + assertTrue((int)bt.getRoot().getRight().getData() == 6); + assertTrue((int)bt.getRoot().getLeft().getLeft().getData() == -1); + assertTrue((int)bt.getRoot().getLeft().getRight().getData() == 3); + + } + +} diff --git a/group04/564451732/hw1/src/Test.java b/group04/564451732/hw1/src/Test.java new file mode 100644 index 0000000000..1ffabf0878 --- /dev/null +++ b/group04/564451732/hw1/src/Test.java @@ -0,0 +1,8 @@ + +public class Test { + + public static void main(String[] args) { + + } + +} diff --git a/group04/564451732/hw1/src/hw1/ArrayListImpl.java b/group04/564451732/hw1/src/hw1/ArrayListImpl.java new file mode 100644 index 0000000000..4f27d5d59c --- /dev/null +++ b/group04/564451732/hw1/src/hw1/ArrayListImpl.java @@ -0,0 +1,88 @@ +package hw1; + +//import java.util.ArrayList; +import java.util.Iterator; +//import java.util.List; + +import com.sun.xml.internal.ws.api.pipe.ThrowableContainerPropertySet; + +public class ArrayListImpl implements List { + +private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + //size++; + try{ + if (size < elementData.length) { + elementData[size] = o; + } else { + elementData = grow(elementData, elementData.length); + elementData[size] = o; + } + size++; + } catch (IndexOutOfBoundsException e) { + System.out.println("The added index is out of bound"); + } + } + public void add(int index, Object o){ + if (index < 0) { + throw new IndexOutOfBoundsException("Index cannot be less than 0"); + } + while (index >= elementData.length) { + elementData = grow(elementData, elementData.length); + } + if (index >= size) { + elementData[index] = o; + size++; + } else { + if (size + 1 >= elementData.length) { + elementData = grow(elementData, elementData.length); + } + for (int i = size-1; i >= index;i--) { + elementData[i+1] = elementData[i]; + } + elementData[index] = o; + size++; + + } + } + + public Object get(int index){ + if (index >= size ||index < 0) { + throw new IndexOutOfBoundsException("Index entered is out of bounds"); + } else { + return elementData[index]; + } + + } + + public Object remove(int index){ + if (index >= size ||index < 0) { + throw new IndexOutOfBoundsException("Index entered is out of bounds"); + } else { + Object result = elementData[index]; + for (int i = index; i < size - 1; i++) { + elementData[i] = elementData[i+1]; + } + elementData[size - 1] = 0; + size--; + return result; + } + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + + private Object[] grow (Object[] src, int increase) { + Object[] target = new Object[src.length + increase]; + System.arraycopy(src, 0, target, 0, src.length); + return target; + } +} diff --git a/group04/564451732/hw1/src/hw1/BinaryTreeNode.java b/group04/564451732/hw1/src/hw1/BinaryTreeNode.java new file mode 100644 index 0000000000..e01de2d56f --- /dev/null +++ b/group04/564451732/hw1/src/hw1/BinaryTreeNode.java @@ -0,0 +1,71 @@ +package hw1; + +public class BinaryTreeNode { + private Comparable data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode root; + + public BinaryTreeNode (Comparable data) { + this.data = data; + } + public BinaryTreeNode () { + + } + public Object getData() { + return data; + } + public void setData(Comparable data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + return; + } + + + + public BinaryTreeNode getRoot() { + return root; + } + public void setRoot(BinaryTreeNode root) { + this.root = root; + } + public BinaryTreeNode insert(Comparable o){ + BinaryTreeNode result = new BinaryTreeNode(o); + if (root == null) { + root = result; + } else { + BinaryTreeNode dummy = root; + insertHelper(o,dummy); + + } + return result; + } + + private void insertHelper (Comparable o, BinaryTreeNode root) { + if (o.compareTo(root.data) < 0) { + if (root.left == null) { + root.left = new BinaryTreeNode(o); + } else { + insertHelper (o, root.left); + } + } else { + if (root.right == null) { + root.right = new BinaryTreeNode(o); + + } else { + insertHelper (o, root.right); + } + } + } +} diff --git a/group04/564451732/hw1/src/hw1/Iterator.java b/group04/564451732/hw1/src/hw1/Iterator.java new file mode 100644 index 0000000000..7cd5bcd75a --- /dev/null +++ b/group04/564451732/hw1/src/hw1/Iterator.java @@ -0,0 +1,7 @@ +package hw1; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/564451732/hw1/src/hw1/LinkedList.java b/group04/564451732/hw1/src/hw1/LinkedList.java new file mode 100644 index 0000000000..583aaaef5e --- /dev/null +++ b/group04/564451732/hw1/src/hw1/LinkedList.java @@ -0,0 +1,117 @@ +package hw1; + +import java.util.Iterator; + +public class LinkedList implements List { +private Node head; +private Node tail; + + public void add(Object o){ + if (head != null) { + Node dummy = new Node(new Object()); + dummy.next = head; + Node nextNode = head; + + while (nextNode != null) { + dummy = dummy.next; + nextNode = nextNode.next; + } + dummy.next = new Node(o); + tail = dummy.next; + } else { + head = new Node(o); + tail = head; + } + + } + public void add(int index , Object o){ + if (index < 0 || index > size()) { + throw new IndexOutOfBoundsException("Index entered is out of bounds"); + } + Node dummy = head; + for (int i = 1; i < index; i++) { + dummy = dummy.next; + } + Node temp = dummy.next; + dummy.next = new Node(o); + dummy.next.next = temp; + if (index == size()) { + tail = dummy.next; + } + } + public Object get(int index){ + if (index < 0 || index >= size()) { + throw new IndexOutOfBoundsException("Index entered is out of bounds"); + } + Node dummy = head; + for (int i = 0; i < index;i++) { + dummy = dummy.next; + } + return dummy.data; + } + public Object remove(int index){ + if (index < 0 || index >= size()) { + throw new IndexOutOfBoundsException("Index entered is out of bounds"); + } + Node dummy = head; + for (int i = 1; i < index;i++) { + dummy = dummy.next; + } + Node result = dummy.next; + dummy.next = dummy.next.next; + if (dummy.next == null) { + tail = dummy; + } + return result.data; + } + + public int size(){ + Node dummy = head; + int size = 0; + while (dummy != null) { + dummy = dummy.next; + size++; + } + + return size; + } + + public void addFirst(Object o){ + Node first = new Node(o); + first.next = head; + head = first; + } + public void addLast(Object o){ + tail.next = new Node(o); + tail = tail.next; + } + public Object removeFirst(){ + Node temp = head; + head = head.next; + return temp.data; + } + public Object removeLast(){ + Node dummy = head; + for (int i = 1; i < size()-1; i++) { + dummy = dummy.next; + } + Node result = dummy.next; + tail = dummy; + dummy.next = null; + return result.data; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + public Node(Object data) { + this.data = data; + } + + } +} diff --git a/group04/564451732/hw1/src/hw1/List.java b/group04/564451732/hw1/src/hw1/List.java new file mode 100644 index 0000000000..cf68bf919e --- /dev/null +++ b/group04/564451732/hw1/src/hw1/List.java @@ -0,0 +1,9 @@ +package hw1; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/564451732/hw1/src/hw1/QueueImpl.java b/group04/564451732/hw1/src/hw1/QueueImpl.java new file mode 100644 index 0000000000..bef7f1a094 --- /dev/null +++ b/group04/564451732/hw1/src/hw1/QueueImpl.java @@ -0,0 +1,21 @@ +package hw1; + +public class QueueImpl { + LinkedList queueList = new LinkedList(); + + public void enQueue(Object o){ + queueList.add(o); + } + + public Object deQueue(){ + return queueList.removeFirst(); + } + + public boolean isEmpty(){ + return queueList.size() == 0; + } + + public int size(){ + return queueList.size(); + } +} diff --git a/group04/564451732/hw1/src/hw1/StackImpl.java b/group04/564451732/hw1/src/hw1/StackImpl.java new file mode 100644 index 0000000000..6e4ad85374 --- /dev/null +++ b/group04/564451732/hw1/src/hw1/StackImpl.java @@ -0,0 +1,23 @@ +package hw1; + +public class StackImpl { +private ArrayListImpl elementData = new ArrayListImpl(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group04/564451732/hw2/.classpath b/group04/564451732/hw2/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group04/564451732/hw2/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group04/564451732/hw2/.gitignore b/group04/564451732/hw2/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/564451732/hw2/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/564451732/hw2/.project b/group04/564451732/hw2/.project new file mode 100644 index 0000000000..d4d12e546b --- /dev/null +++ b/group04/564451732/hw2/.project @@ -0,0 +1,17 @@ + + + HW2 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/564451732/hw2/.settings/org.eclipse.jdt.core.prefs b/group04/564451732/hw2/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group04/564451732/hw2/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group04/564451732/hw2/src/com/coderising/array/ArrayUtil.java b/group04/564451732/hw2/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..d0205332f6 --- /dev/null +++ b/group04/564451732/hw2/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,213 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int len = origin.length; + for (int i = 0; i < len/2; i++) { + int temp = origin[i]; + origin[i] = origin[len-1-i]; + origin[len-1-i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int slow = 0; + for (int i = 0; i < oldArray.length; i++) { + + if (oldArray[i] != 0) { + oldArray[slow++] = oldArray[i]; + } + } + int[] newArray = new int[slow]; + for (int i = 0; i < slow; i++) { + newArray[i] = oldArray[i]; + } + + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int[] result = new int[array1.length + array2.length]; + int i1 = 0 , i2 = 0, i3 = 0; + while (i1 < array1.length && i2 < array2.length) { + if (array1[i1] == array2[i2]) { + result[i3++] = array1[i1++]; + i2++; + } else if (array1[i1] < array2[i2]) { + result[i3++] = array1[i1++]; + } else { + result[i3++] = array2[i2++]; + } + } + + while (i1 < array1.length) { + result[i3++] = array1[i1++]; + } + while (i2 < array2.length) { + result[i3++] = array2[i2++]; + } + + int[] finalResult = new int[i3]; + for (int i = 0; i < i3; i++) { + finalResult[i] = result[i]; + } + + return finalResult; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] result = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + result[i] = oldArray[i]; + } + + return result; + + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + List result = new ArrayList<>(); + if (max <= 1) return new int[]{}; + if (max < 2) return new int[]{1,1}; + result.add(1); + //result.add(1); + int num = 1, index = 1; + + while (num < max) { + result.add(num); + num = result.get(index) + result.get(index - 1); + index++; + + } + + int[] resArray = new int[result.size()]; + for (int i = 0; i < result.size(); i++) { + resArray[i] = result.get(i); + } + + return resArray; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + List result = new ArrayList<>(); + boolean[] notPrime = new boolean[max]; + for (int i = 2; i < max; i++) { + if (!notPrime[i]) result.add(i); + for (int j = 2; i*j < max; j++) { + notPrime[i*j] = true; + } + } + + int[] resArray = new int[result.size()]; + for (int i = 0; i < result.size();i++) { + resArray[i] = result.get(i); + } + + return resArray; + + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + List result = new ArrayList<>(); + for (int i = 1; i < max; i++) { + int sum = 0; + for (int j = 1; j < i/2; j++) { + if (i % j == 0) { + sum += j; + } + } + if (sum == i) result.add(i); + } + + int[] resArray = new int[result.size()]; + for (int i = 0; i < result.size(); i++) { + resArray[i] = result.get(i); + } + return resArray; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + if (array == null || array.length == 0) return null; + int len = array.length; + char[] result = new char[len + seperator.length()*(len - 1)]; + int indexA = 0, indexR = 0; + while (indexA < array.length && indexR < result.length) { + result[indexR++] = (char)array[indexA++]; + if (indexA < array.length - 1){ + for (int i = 0; i < seperator.length(); i++) { + result[indexR++] = seperator.charAt(i); + } + } + } + + return String.valueOf(result); + + + + + } + + +} diff --git a/group04/564451732/hw2/src/com/coderising/litestruts/LoginAction.java b/group04/564451732/hw2/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group04/564451732/hw2/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group04/564451732/hw2/src/com/coderising/litestruts/Struts.java b/group04/564451732/hw2/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..1c117a681f --- /dev/null +++ b/group04/564451732/hw2/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,167 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) throws ClassNotFoundException { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + + Class targetClass = getTargetClass("struts.xml", actionName); + Object foo = null; + try { + foo = targetClass.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + Method method = null; + Method methodOne = null; + String result = null; + Map viewParas = new HashMap<>(); + try { + for (String key : parameters.keySet()) { + + method = foo.getClass().getMethod("set"+key.substring(0, 1).toUpperCase()+key.substring(1), String.class); + method.invoke(foo, parameters.get(key)); + } + + methodOne = foo.getClass().getMethod("execute"); + result = (String) methodOne.invoke(foo); + Method[] allMethods = foo.getClass().getDeclaredMethods(); + for (Method m : allMethods) { + if (m.getName().startsWith("get")) { + viewParas.put(lowerFirstLetter(m.getName().substring(3)), (String) m.invoke(foo)); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + + View view = new View(); + view.setParameters(viewParas); + String destination = getDestiLoca("struts.xml", actionName, result); + view.setJsp(destination); + + + return view; + } + + private static String lowerFirstLetter(String input) { + String result = input.substring(0,1).toLowerCase() + input.substring(1); + return result; + } + + private static Document readXML (String fileName) { + Document doc = null; + try { + File xmlFile = new File(fileName); + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + doc = dBuilder.parse(xmlFile); + doc.getDocumentElement().normalize(); + + } catch (ParserConfigurationException | SAXException | IOException e) { + e.printStackTrace(); + } + + return doc; + } + + private static Element getTargetElement(String fileName, String actionName) { + Document doc = readXML(fileName); + NodeList nList = doc.getElementsByTagName("action"); + Element target = null; + for (int i = 0; i < nList.getLength(); i++) { + Node nNode = nList.item(i); + + if (nNode.getNodeType() == Node.ELEMENT_NODE) { + Element element = (Element)nNode; + if (element.getAttribute("name").equals(actionName)){ + target = element; + break; + } + } + } + + return target; + } + private static String getDestiLoca(String fileName, String actionName, String result) { + Document doc = readXML(fileName); + NodeList nList = doc.getElementsByTagName("action"); + String resultDes = null; + for (int i = 0; i < nList.getLength(); i++) { + Node nNode = nList.item(i); + Element el = (Element)nNode; + + if (el.getAttribute("name").equals(actionName)){ + + NodeList nListSub = el.getElementsByTagName("result"); + for (int j = 0; j < nListSub.getLength(); j++) { + Node nNodeSub = nListSub.item(j); + Element eSub = (Element) nNodeSub; + if (eSub.getAttribute("name").equals(result)){ + resultDes = eSub.getTextContent(); + break; + } + } + } + + } + + return resultDes; + } + + private static Class getTargetClass(String fileName, String actionName) { + Element target = getTargetElement(fileName, actionName); + + String className = target.getAttribute("class"); + Class targetClass = null; + try { + targetClass = Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + return targetClass; + } + +} diff --git a/group04/564451732/hw2/src/com/coderising/litestruts/StrutsTest.java b/group04/564451732/hw2/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..a23b9154ba --- /dev/null +++ b/group04/564451732/hw2/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws ClassNotFoundException { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws ClassNotFoundException { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group04/564451732/hw2/src/com/coderising/litestruts/View.java b/group04/564451732/hw2/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group04/564451732/hw2/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/564451732/hw2/src/com/coderising/litestruts/struts.xml b/group04/564451732/hw2/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group04/564451732/hw2/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/564451732/hw2/src/com/coding/basic/ArrayList.java b/group04/564451732/hw2/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..1f185736f9 --- /dev/null +++ b/group04/564451732/hw2/src/com/coding/basic/ArrayList.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group04/564451732/hw2/src/com/coding/basic/BinaryTreeNode.java b/group04/564451732/hw2/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group04/564451732/hw2/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group04/564451732/hw2/src/com/coding/basic/Iterator.java b/group04/564451732/hw2/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group04/564451732/hw2/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/564451732/hw2/src/com/coding/basic/LinkedList.java b/group04/564451732/hw2/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..4fdb03db8a --- /dev/null +++ b/group04/564451732/hw2/src/com/coding/basic/LinkedList.java @@ -0,0 +1,124 @@ +package com.coding.basic; + + + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public static int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group04/564451732/hw2/src/com/coding/basic/List.java b/group04/564451732/hw2/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group04/564451732/hw2/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/564451732/hw2/src/com/coding/basic/Queue.java b/group04/564451732/hw2/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group04/564451732/hw2/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group04/564451732/hw2/src/com/coding/basic/Stack.java b/group04/564451732/hw2/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group04/564451732/hw2/src/com/coding/basic/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group04/564451732/hw2/struts.xml b/group04/564451732/hw2/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group04/564451732/hw2/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/821655640/learning_projects/project_basic_001/.gitignore b/group04/821655640/learning_projects/project_basic_001/.gitignore new file mode 100644 index 0000000000..39d13906de --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/.gitignore @@ -0,0 +1,44 @@ + +# Created by https://www.gitignore.io/api/eclipse,intellij,java + +### Eclipse ### +target/ +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + diff --git a/group04/821655640/learning_projects/project_basic_001/pom.xml b/group04/821655640/learning_projects/project_basic_001/pom.xml new file mode 100644 index 0000000000..1f93bf44e0 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/pom.xml @@ -0,0 +1,31 @@ + + 4.0.0 + + com.sunline + project_basic_001 + 0.0.1-SNAPSHOT + jar + + project_basic_001 + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 4.10 + + + + jaxen + jaxen + 1.1-beta-7 + + + + diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/array/ArrayUtil.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..434b6b0eaf --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/array/ArrayUtil.java @@ -0,0 +1,228 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + * 11 01 11| + */ + public void reverseArray(int[] origin){ + int len = origin.length-1; + + for (int i = 0; i <((0 == len%2) ? len/2 :(len+1)/2) ; i++) { + origin[i] = origin[i]^origin[len-i]; + origin[len-i] = origin[len-i]^origin[i]; + origin[i] = origin[i]^origin[len-i]; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + //get count + int count = 0; + for (int i : oldArray) { + if(0 != i) { + count++; + } + } + + //remove zero + int newArray[] = new int[count]; + int j=0; + for (int i : oldArray) { + if(0 != i) { + newArray[j++] = i; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public Integer[] merge(int[] array1, int[] array2){ + + if (null==array1 || null == array2 || 0 == array1.length || 0 == array2.length) { + new IllegalArgumentException("参数不允许为空数组!"); + } + + int i=0,j=0; + ArrayList mergedList = new ArrayList(); + while (true) { + if (j == array2.length-1 || i == array1.length-1) { + break; + } + if (array1[i] < array2[j]) { + mergedList.add(array1[i]); + i++; + }else if (array1[i] > array2[j]) { + mergedList.add(array2[j]); + j++; + }else { + mergedList.add(array2[j]); + i++; + j++; + } + + } + + //put the least part of one array into list + if (i == array1.length) { + for (int k = j; k < array2.length; k++) { + mergedList.add(array2[k]); + } + }else { + for (int k = i; k < array1.length; k++) { + mergedList.add(array1[k]); + } + } + + return arrayListToInteger(mergedList); + } + + private Integer[] arrayListToInteger(ArrayList arrayList) { + Integer tempArray[] = new Integer[arrayList.size()]; + int i=0; + for (Integer integer : arrayList) { + tempArray[i++] = integer; + } + + return tempArray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + + if (null == oldArray || size<= 0) { + new IllegalArgumentException("数组为空或者长度非法!!"); + } + + int newArray[] = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public Integer[] fibonacci(int max){ + if ( 1 == max ) { + return new Integer[0]; + } + ArrayList arrayList = new ArrayList(); + arrayList.add(1); + arrayList.add(1); + + int i=0,j=1; + while (arrayList.get(i)+arrayList.get(j) < max) { + arrayList.add(arrayList.get(i)+arrayList.get(j)); + i++; + j++; + } + + return arrayListToInteger(arrayList); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public Integer[] getPrimes(int max){ + ArrayList arrayList = new ArrayList(); + boolean isPrimes = true; + for (int i = 2; i < max; i++) { + isPrimes = true; + for (int j = 2; j <= Math.sqrt(i) ; j++) { + if (0 == i % j) { + isPrimes = false; + break; + } + } + + if (isPrimes) { + arrayList.add(i); + } + + } + return arrayListToInteger(arrayList); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public Integer[] getPerfectNumbers(int max){ + ArrayList arrayList = new ArrayList(); + int sum = 0; + for (int i = 2; i < max; i++) { + sum = 0; + //the factor is less than half of a number + for (int j = 1; j <= (i+1)/2; j++) { + if (0 == i%j) { + sum += j; + } + } + + if (sum == i) { + arrayList.add(i); + } + } + return arrayListToInteger(arrayList); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder sb = new StringBuilder(); + for (int i : array) { + sb.append(i).append(seperator); + } + + sb.deleteCharAt(sb.length()-1); + return sb.toString(); + } + + +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/LoginAction.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/Struts.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..0d5caf362a --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/Struts.java @@ -0,0 +1,86 @@ +package com.coderising.litestruts; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + + //0. 读取配置文件struts.xml + Document xmlDoc = null; + View view = null; + try { + xmlDoc = getXMLDocument("./src/main/java/com/coderising/litestruts/struts.xml"); + + /*1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法*/ + + String classStr = xmlDoc.selectSingleNode("struts/action[@name='"+actionName+"']/@class").getText(); + Class actionClass = Class.forName(classStr); + Object action = actionClass.newInstance(); + + Iterator> itr = parameters.entrySet().iterator(); + Entry entry = null; + String key = ""; + String value = ""; + while(itr.hasNext()) { + entry = itr.next(); + key = entry.getKey(); + value = entry.getValue(); + Method setter = actionClass.getMethod("set"+key.substring(0, 1).toUpperCase()+key.substring(1),String.class); + setter.invoke(action, value); + } + + + // 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method exeMethod = actionClass.getMethod("execute"); + String result = exeMethod.invoke(action).toString(); +// System.out.println(result); + + /*3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters*/ + + Map viewDataMap = new HashMap(); + String methodName = ""; + for (Method md : actionClass.getMethods()) { + methodName = md.getName(); + if (methodName.startsWith("get")) { + viewDataMap.put(methodName.substring(3, 4).toLowerCase()+methodName.substring(4), md.invoke(action).toString()); + } + } + +// System.out.println(viewDataMap); + + /** + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + String jspRet = xmlDoc.selectSingleNode("struts/action[@name='"+actionName+"']/result[@name='"+result+"']").getText(); + view = new View(); + view.setJsp(jspRet); + view.setParameters(viewDataMap); + } catch (Exception e) { + e.printStackTrace(); + } + return view; + } + + private static Document getXMLDocument(String filePath) throws DocumentException { + return new SAXReader().read(filePath); + } + +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/View.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/struts.xml b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..843f98edc7 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/ArrayList.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..c168b5efa8 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/ArrayList.java @@ -0,0 +1,119 @@ +package com.coding.basic; + +/** + * @ClassName: ArrayList + * @Description: 自增长数组 + * @author: tangxp + * @date: 2017年2月23日 下午10:43:03 + */ +public class ArrayList implements List { + + private final int step = 10; + private Object elementData[] = new Object[100]; + private int size = 0 ; + + + /** + * @Title: add + * @Description: TODO + * @param o , elements of this ArrayList + * @see com.coding.basic.List#add(java.lang.Object) + */ + public void add(Object o) { + add(size,o); + } + + + /** + * @Title: add + * @Description: TODO + * @param index + * @param o + * @see com.coding.basic.List#add(int, java.lang.Object) + */ + public void add(int index, Object o) { + if(index < 0 || index> size) { + throw new IllegalArgumentException("下标越界"); + } + + if(null == o) { + throw new IllegalArgumentException("元素不能为空"); + } + + if(this.checkOutOfBounds()) { + this.autoGrow(this.step); + } + + int i = size; + while(i>index) { + elementData[i] = elementData[--i]; + } + addDriect(i, o); + } + + + public Object get(int index) { + if(index < 0 || index>= size) { + throw new IllegalArgumentException("下标越界"); + } + + return elementData[index]; + } + + public Object remove(int index) { + if(index < 0 || index>= size) { + throw new IllegalArgumentException("下标越界"); + } + + Object o = elementData[index]; + while (indexthis.size) { + return; + } + Object newElementData[] = new Object[elementData.length+growSize]; + System.arraycopy(elementData, 0, newElementData, 0, elementData.length); + elementData = newElementData; + return; + } + + private void addDriect(int index, Object o) { + elementData[index] = o; + this.size++; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("["); + for(int i =0;ithis.size) { + return false; + }else { + return true; + } + } +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/BinaryTreeNode.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..6587275b48 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,84 @@ +package com.coding.basic; + + +public class BinaryTreeNode > { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(T o){ + return insert(this,o); + } + + + public BinaryTreeNode insert(BinaryTreeNode bt, T o) { + BinaryTreeNode insertedNode = null; + if(null == this.data) { + this.data = o; + return this; + } + + if(-1 == o.compareTo(bt.data)) { + if(null == bt.left) { + insertedNode = new BinaryTreeNode(); + insertedNode.data = o; + bt.left = insertedNode; + return insertedNode; + } + return insert(bt.left,o); + }else { + if(null == bt.right) { + insertedNode = new BinaryTreeNode(); + insertedNode.data = o; + bt.right = insertedNode; + return insertedNode; + } + + return insert(bt.right,o); + } + } + + @Override + public String toString() { + StringBuilder space = new StringBuilder(""); + return getString(this,space,0).toString(); + } + + private StringBuilder getString(BinaryTreeNode head,StringBuilder space,int deepth) { + StringBuilder spaceTemp = new StringBuilder(space.toString()); + if (null == head) { + return new StringBuilder(" null , "); + } else { + StringBuilder tempStr = new StringBuilder(" {").append(spaceTemp.append(head.data.toString()) + .append(new StringBuilder(space)).append("} ")); + deepth++; + return getString(head.left, space, deepth).append(deepth) + .append(tempStr).append(deepth).append("\n") + .append(getString(head.right, space, deepth)); + } + + } + + + +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Iterator.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/LinkedList.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..a824ad9372 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/LinkedList.java @@ -0,0 +1,134 @@ +package com.coding.basic; + + +/** + * @ClassName: LinkedList + * @Description: 带头结点的单向列表. + * @author: tangxp + * @date: 2017年2月23日 下午9:14:28 + */ +public class LinkedList implements List { + + private Node head = new Node(); + private int size ; + + public void add(Object o){ + add(size,o); + } + + public void add(int index , Object o){ + if(index<0 || index>size) { + throw new IllegalArgumentException("目前链表长度不够!"); + } + Node tempHead = head; + int i = 0; + while(i++ < index) { + tempHead = tempHead.next; + } + addDriect(getNode(o),tempHead); + } + + + /** + * @Title: get + * @Description: TODO + * @param index + * @return + * @see com.coding.basic.List#get(int) + */ + public Object get(int index){ + if(index<0|| index>=size) { + throw new IllegalArgumentException("下标超出链表范围!"); + } + Node tempHead = head; + int i = 0; + while(i++ < index) { + tempHead = tempHead.next; + } + return tempHead.next.data; + } + + public Object remove(int index){ + if(index<0 || index>=size) { + throw new IllegalArgumentException("下标超出链表范围!"); + } + Node tempHead = head; + int i = 0; + while(i++ < index) { + tempHead = tempHead.next; + } + + Node removingNode = tempHead.next; + tempHead.next = removingNode.next; + removingNode.next = null; + size--; + return removingNode.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + add(0,o); + } + public void addLast(Object o){ + add(o); + } + public Object removeFirst(){ + return remove(0); + } + + public Object removeLast(){ + return remove(size-1); + } + + public Iterator iterator(){ + return null; + } + + private void addDriect(Node n,Node before) { + Node temp = before.next; + n.next = temp; + before.next = n; + size++; + } + + private Node getNode(Object o) { + + if(null == o) { + throw new IllegalArgumentException("节点值不能为空"); + } + + Node n = new Node(); + n.data = o; + return n; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("size: "+size+" {null | ---}--->"); + if(null == head.next) { + return sb.toString(); + } + + Node tempHead = head; + while(null != tempHead.next ) { + sb.append(tempHead.next.toString()); + tempHead = tempHead.next; + } + sb.append("null"); + return sb.toString(); + } + + private static class Node{ + Object data; + Node next; + + @Override + public String toString() { + return "{" + this.data +" |---}--->"; + } + + } +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/List.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Queue.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Queue.java new file mode 100644 index 0000000000..3ae10dc5c7 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Queue.java @@ -0,0 +1,27 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList elements = new LinkedList(); + + public void enQueue(Object o){ + elements.addFirst(o); + } + + public Object deQueue(){ + return elements.removeLast(); + } + + public boolean isEmpty(){ + return 0==elements.size(); + } + + public int size(){ + return elements.size(); + } + + @Override + public String toString() { + return elements.toString(); + } +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Stack.java b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Stack.java new file mode 100644 index 0000000000..4638daf558 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Stack.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + return elementData.remove(elementData.size()-1); + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return 0 == elementData.size(); + } + public int size(){ + return elementData.size(); + } + + @Override + public String toString() { + return elementData.toString(); + } +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/array/ArrayUtilTest.java b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..bbcd4dea93 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,85 @@ +package com.coderising.array; + +import static org.junit.Assert.*; + +import java.util.Arrays; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + ArrayUtil arrayUtil = null; + @Before + public void setUp() { + arrayUtil = new ArrayUtil(); + } + + @Test + public void testReverseArray() { + int origin[] = {7, 9, 30, 3, 4}; + int expecteds[] = {4,3, 30 , 9,7}; + arrayUtil.reverseArray(origin); + + Assert.assertArrayEquals(expecteds, origin); + } + + @Test + public void testRemoveZero() { + int oldArray[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int expecteds[] = {1,3,4,5,6,6,5,4,7,6,7,5}; + int newArray[] = arrayUtil.removeZero(oldArray); + + Assert.assertArrayEquals(expecteds, newArray); + } + + @Test + public void testMerge() { + int array1[] = {3, 5, 7,8}; + int array2[] = {4, 5, 6,7}; + Integer expecteds[] = {3,4,5,6,7,8}; + Integer newArray[] = arrayUtil.merge(array1, array2); + Assert.assertArrayEquals(expecteds, newArray); + } + + @Test + public void testGrow() { + int oldArray[] = {2,3,6}; + int expecteds[] = {2,3,6,0,0,0}; + int newArray[] = arrayUtil.grow(oldArray,3); + + Assert.assertArrayEquals(expecteds, newArray); + } + + @Test + public void testFibonacci() { + Integer expecteds[] = {1,1,2,3,5,8,13}; + Integer newArray[] = arrayUtil.fibonacci(18); + + Assert.assertArrayEquals(arrayUtil.fibonacci(1), new Integer[0]); + Assert.assertArrayEquals(expecteds, newArray); + } + + @Test + public void testGetPrimes() { + Integer expecteds[] = {2,3,5,7,11,13,17,19}; + Integer newArray[] = arrayUtil.getPrimes(23); + + Assert.assertArrayEquals(expecteds, newArray); + } + + @Test + public void testGetPerfectNumbers() { + Integer array[] = arrayUtil.getPerfectNumbers(100); + System.out.println(Arrays.toString(array)); + } + + @Test + public void testJoin() { + int dealedArray[] = {3,8,9}; + String expectedStr = "3-8-9"; + String resultStr = arrayUtil.join(dealedArray, "-"); + Assert.assertEquals("", expectedStr, resultStr); + } + +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/litestruts/StrutsTest.java b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..2e8b41a395 --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,41 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coding/basic/TestBasic.java b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coding/basic/TestBasic.java new file mode 100644 index 0000000000..de5eaf51ed --- /dev/null +++ b/group04/821655640/learning_projects/project_basic_001/src/test/java/com/coding/basic/TestBasic.java @@ -0,0 +1,92 @@ +package com.coding.basic; + + +import org.junit.Test; + +public class TestBasic { + + @Test + public void testBinaryTree() { + BinaryTreeNode bt = new BinaryTreeNode(); + bt.insert(10); + for (int i = 0; i < 5; i++) { + bt.insert(i); + } + System.out.println(bt); + + } + + @Test + public void testStack() { + Stack stack = new Stack(); + System.out.println(stack.isEmpty()); + for (int i = 0; i < 5; i++) { + stack.push(i); + } + + System.out.println(stack); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack); + System.out.println(stack.peek()); + System.out.println(stack); + System.out.println(stack.isEmpty()); + System.out.println(stack.size()); + + } + + @Test + public void testQueue() { + Queue queue = new Queue(); + System.out.println(queue.isEmpty()); + for (int i = 0; i < 5; i++) { + queue.enQueue(i); + } + System.out.println(queue.isEmpty()); + System.out.println(queue); + queue.deQueue(); + queue.deQueue(); + System.out.println(queue); + System.out.println(queue.size()); + + } + + + + @Test + public void testLinkedList() { + LinkedList link = new LinkedList(); + for(int i=0;i<3;i++) { + link.add(i); + } + System.out.println(link); + link.add(123); + link.addFirst("first"); + link.addLast("last"); + System.out.println(link); + link.removeFirst(); + link.removeLast(); + System.out.println(link); + //link.remove(12); + System.out.println(link.get(2)); + + } + + @Test + public void testArrayList(){ + ArrayList a = new ArrayList(); + for (int i = 0; i <130; i++) { + a.add(i); + } + System.out.println(a); + a.add(3,"abc"); + System.out.println(a); + a.remove(0); + System.out.println(a); + System.out.println(a.get(2)); + a.add("tttttttt"); + System.out.println(a); + + } + +} diff --git a/group04/844028312/.gitignore b/group04/844028312/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/844028312/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/844028312/one/.classpath b/group04/844028312/one/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group04/844028312/one/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group04/844028312/one/.gitignore b/group04/844028312/one/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/844028312/one/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/844028312/one/.project b/group04/844028312/one/.project new file mode 100644 index 0000000000..d674d0dad5 --- /dev/null +++ b/group04/844028312/one/.project @@ -0,0 +1,17 @@ + + + one + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/844028312/one/src/com/coding/basic/ArrayList.java b/group04/844028312/one/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..947b34ed7c --- /dev/null +++ b/group04/844028312/one/src/com/coding/basic/ArrayList.java @@ -0,0 +1,97 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + private static final int DEFAULT_CAPACITY = 10; + private Object[] elementData = new Object[100]; + /** + * Ԫ + */ + public void add(Object o){ + + if(size=0 && index<=size){ //ж indexǷsizeΧ 1 2 3 4 + if(size+1=insertData && left==null){ //жϲСһڵ,left==null + left=new BinaryTreeNode(); + left.data=o; + left.left=null; + left.right=null; + } + else if(insertData>nowData && right==null){ //жϲһڵ,==null + right=new BinaryTreeNode(); + right.data=o; + right.left=null; + right.right=null; + } + else{ + BinaryTreeNode treeNode=null; //¼ȽϽڵ + if(nowData>=insertData ){ //ǰڵݴ + treeNode=left; //ȽϽڵΪڵ + } + else{ + treeNode=right; //Ϊҽڵ + } + BinaryTreeNode tempNode=null; //ʱڵ㣬ڼ¼ȽϽڵڵҽڵΪʱ¼ȽϽڵ + while(treeNode!=null){ + nowData=(int) treeNode.data; //ĵǰֵ + if(insertData<=nowData){ //ǰڵݴ + tempNode=treeNode.left; //ʱڵΪڵ + } + else{ + tempNode=treeNode.right; //Ϊҽڵ + } + if(tempNode==null){ + tempNode=treeNode; //¼ȽϽڵ + if(insertData<=nowData){ //ǰڵݴ + treeNode=treeNode.left; //ȽϽڵΪڵ + } + else{ + treeNode=treeNode.right; //Ϊҽڵ + } + } + else{ + treeNode=tempNode; //ʱڵ㲻ΪʱȽϽڵ㸳ֵΪʱڵ + } + } + if(treeNode==null){ //ȽϽڵΪʱ + treeNode=new BinaryTreeNode(); //½ڵ + treeNode.data=o; + treeNode.left=null; + treeNode.right=null; + int upData=(int) tempNode.data; + if(insertData<=upData){ //һڵݴڲڵʱ + tempNode.left=treeNode; //һڵڵ㸳ڵ + } + else{ + tempNode.right=treeNode; + } + } + } + } + else{ //left!=null&&right!=null + BinaryTreeNode treeNode=null; //жһ + if(nowData>=insertData ){ + treeNode=left; + } + else{ + treeNode=right; + } + BinaryTreeNode tempNode=null; + while(treeNode!=null){ + nowData=(int) treeNode.data; + if(insertData<=nowData){ + tempNode=treeNode.left; + } + else{ + tempNode=treeNode.right; + } + if(tempNode==null){ + tempNode=treeNode; + if(insertData<=nowData){ + treeNode=treeNode.left; + } + else{ + treeNode=treeNode.right; + } + } + else{ + treeNode=tempNode; + } + } + if(treeNode==null){ + treeNode=new BinaryTreeNode(); + treeNode.data=o; + treeNode.left=null; + treeNode.right=null; + int upData=(int) tempNode.data; + if(insertData<=upData){ + tempNode.left=treeNode; + } + else{ + tempNode.right=treeNode; + } + } + } + } + return this; + } + + + +} diff --git a/group04/844028312/one/src/com/coding/basic/Iterator.java b/group04/844028312/one/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group04/844028312/one/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/844028312/one/src/com/coding/basic/JavaTest.java b/group04/844028312/one/src/com/coding/basic/JavaTest.java new file mode 100644 index 0000000000..2d424110a1 --- /dev/null +++ b/group04/844028312/one/src/com/coding/basic/JavaTest.java @@ -0,0 +1,89 @@ +package com.coding.basic; + +//import java.util.ArrayList; +//import java.util.Iterator; +public class JavaTest { + public static void main(String[] args){ +// ArrayList a=new ArrayList(); +// for(int i=0;i<5;i++){ +// a.add(i); +// } +// Iterator i=a.iterator(); +// while(i.hasNext()){ +// int c=(int) i.next(); +// System.out.println(c); +// } + + +// a.add(0, "aa"); +// a.add(100, "bb"); +// a.add(200, "cc"); +// long start=System.currentTimeMillis(); +// System.out.println("1start:"+start); +// System.out.println(a.remove(40)); +// long end=System.currentTimeMillis(); +// System.out.println("1end:"+end); +// System.out.println("1:"+(end-start)); +// LinkedList l=new LinkedList(); +// for(int i=0;i<5;i++){ +// l.add(i); +// } +// Iterator i=l.iterator(); +// while(i.hasNext()){ +// Object c=i.next(); +// System.out.println(c); +// } + +// long start2=System.currentTimeMillis(); +// System.out.println("start2:"+start2); +//// System.out.println(l.remove(40)); +//// long end2=System.currentTimeMillis(); +// System.out.println("end2:"+end2); +// System.out.println("2:"+(end2-start2)); +// a.add(1000, "a"); +// Stack s=new Stack(); +// for(int i=0;i<100;i++){ +// s.push(i); +// } +// Object o=s.pop(); +// Object o2=s.peek(); +// System.out.println(o2); +// LinkedList l=new LinkedList(); +// for(int i=0;i<5;i++){ +// l.add(i); +// } +// System.out.println(l.remove(90)); +// l.add(90, "a"); +// System.out.println(l.get(90)); +// System.out.println(l.get(89)); +// System.out.println(l.get(91)); +// System.out.println("a"+l.size()); +// l.addFirst("bb"); +// System.out.println("b"+l.size()); +// //System.out.println(l.get(0)); +// l.addLast("cc"); +// +// System.out.println(l.get(l.size()-1)); +// System.out.println(l.size()); +// l.removeFirst(); +// l.removeLast(); +// System.out.println(l.size()); +// Queue q=new Queue(); +// for(int i=0;i<5;i++){ +// q.enQueue(i); +// } +// q.size(); +// q.isEmpty(); +// q.deQueue(); +// System.out.println(q); +// ArrayList a=new ArrayList(); + BinaryTreeNode btn=new BinaryTreeNode(); + + btn.insert(2); + btn.insert(3); + btn.insert(1); + btn.insert(6); + btn.insert(8); + System.out.println(btn); + } +} diff --git a/group04/844028312/one/src/com/coding/basic/LinkedList.java b/group04/844028312/one/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..e8eb9fc4ca --- /dev/null +++ b/group04/844028312/one/src/com/coding/basic/LinkedList.java @@ -0,0 +1,195 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + if(head==null){ //headΪ + head=new Node(); //½һڵ + head.data=o; // + head.next=null; //һڵΪ + } + else{ + Node node=head.next; + Node temp = null; + while(node!=null){ + temp=node.next; + if(temp==null){ + temp=node; + node=temp.next; + } + else{ + node=temp; + } + } + if(node==null&&temp==null){ + node=new Node(); + node.data=o; + node.next=null; + head.next=node; + } + else{ + node=new Node(); + node.data=o; + node.next=null; + temp.next=node; + } + } + } + public void add(int index , Object o){ + int size=size(); + if(index0&&size>0){ + Node node=(Node) getNode(index-1); + Node newNode=new Node(); + newNode.data=o; + newNode.next=(Node) getNode(index); + node.next=newNode; + } + else if(index==size&&size>0){ + Node node=(Node) getNode(size-1); + Node newNode=new Node(); + newNode.data=o; + newNode.next=null; + node.next=newNode; + } + else if(index==0&&size!=0){ + Node temp=new Node(); + temp.next=head.next; + temp.data=head.data; + head.data=o; + //head.next=temp; + head.next=temp; + } + else if(index==0&&size==0){ + head=new Node(); + head.data=o; + head.next=null; + } + else{ + System.out.println("±곬Χ"); + } + } + public Object get(int index){ + if(index==0){ + return head.data; + } + else{ + int i=1; + Node node=head.next;//1 2 3 4 5 + while(node!=null){ + if(i==index){ + return node.data; + } + node=node.next; + i++; + } + } + return null; + } + public Object getNode(int index){ + if(index==0){ + return head; + } + else{ + int i=1; + Node node=head.next;//1 2 3 4 5 + while(node!=null){ + if(i==index){ + return node; + } + node=node.next; + i++; + } + } + return null; + } + public Object remove(int index){ + if(index==0){ + Node node=head.next; + Node temp=head; + head=node; + return temp.data; + } + else{ + Node temp=(Node) getNode(index); + Node node=(Node) getNode(index-1); + node.next=(Node) getNode(index+1); + return temp.data; + } + + } + + public int size(){ + if(head==null){ + return 0; + } + else{ + Node node=head.next; + if(node==null){ + return 1; + } + else{ + int i=1; + while(node!=null){ + node=node.next; + i++; + } + return i; + } + } + } + + public void addFirst(Object o){ + add(0,o); + } + public void addLast(Object o){ + add(size(),o); + } + public Object removeFirst(){ + Object temp = null; + if(size()>0){ + temp=remove(0); + } + + return temp; + } + public Object removeLast(){ + Object temp = null; + if(size()>0){ + temp=remove(size()-1); + } + return temp; + } + public Iterator iterator(){ + return new Ir(); + } + + + private static class Node{ + Object data; + Node next; + + } + private class Ir implements Iterator{ + private int cursor; + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return cursor!=size(); + } + + @Override + public Object next() { + // TODO Auto-generated method stub + int i=cursor; + if(cursor0){ + return false; + } + return true; + } + + public int size(){ + return linkedList.size(); + } +} diff --git a/group04/844028312/one/src/com/coding/basic/Stack.java b/group04/844028312/one/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..79733597ca --- /dev/null +++ b/group04/844028312/one/src/com/coding/basic/Stack.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); //ջѹԪ + } + + public Object pop(){ + Object o=elementData.get(elementData.size()-1); //ջԪأΪջȽ + elementData.remove(elementData.size()-1); //ƳջԪ + return o; + } + + public Object peek(){ + return elementData.get(elementData.size()-1); //ȡջԪ + } + public boolean isEmpty(){ + if(elementData.size()==0){ //elementData.sizeжǷΪ + return true; + } + return false; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group04/844028312/one/src/com/coding/test/ArrayListTest.java b/group04/844028312/one/src/com/coding/test/ArrayListTest.java new file mode 100644 index 0000000000..6edc5205cd --- /dev/null +++ b/group04/844028312/one/src/com/coding/test/ArrayListTest.java @@ -0,0 +1,60 @@ +package com.coding.test; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.BeforeClass; + +import com.coding.basic.ArrayList; +import com.coding.basic.Iterator; + +public class ArrayListTest { + private ArrayList arrayList; + @BeforeClass + public static void setUpBeforeClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + arrayList=new ArrayList(); + for(int i=0;i<10;i++){ + arrayList.add(i); + } + } + + + @org.junit.Test + public void addAndGet(){ + for(int i=0;i<10;i++){ + Assert.assertEquals(i, (int)arrayList.get(i)); + } + } + @org.junit.Test + public void addWithIndex(){ + arrayList.add(4, "a"); + Assert.assertEquals("a", arrayList.get(4)); + } + + @org.junit.Test + public void remove(){ + Object before=arrayList.get(4); + Object reMove=arrayList.remove(4); + Assert.assertEquals(before, reMove); + + } + @org.junit.Test + public void size(){ + Assert.assertEquals(10, arrayList.size()); + } + @org.junit.Test + public void iterator(){ + Iterator it=arrayList.iterator(); + int i=0; + while(it.hasNext()){ + Assert.assertEquals(it.next(),arrayList.get(i)); + i++; + } + } + +} diff --git a/group04/844028312/one/src/com/coding/test/BinaryTreeNodeTest.java b/group04/844028312/one/src/com/coding/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..2fb70cf976 --- /dev/null +++ b/group04/844028312/one/src/com/coding/test/BinaryTreeNodeTest.java @@ -0,0 +1,28 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.BinaryTreeNode; + +public class BinaryTreeNodeTest { + private BinaryTreeNode btn; + @Before + public void setUp() throws Exception { + btn=new BinaryTreeNode(); + + } + + @Test + public void test() { + btn.insert(3); + btn.insert(5); + btn.insert(2); + btn.insert(10); + btn.insert(4); + + } + +} diff --git a/group04/844028312/one/src/com/coding/test/LinkedListTest.java b/group04/844028312/one/src/com/coding/test/LinkedListTest.java new file mode 100644 index 0000000000..c7e0479736 --- /dev/null +++ b/group04/844028312/one/src/com/coding/test/LinkedListTest.java @@ -0,0 +1,66 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.Iterator; +import com.coding.basic.LinkedList; +import com.coding.basic.Stack; + +public class LinkedListTest { + private LinkedList linkedList; + @Before + public void setUp() throws Exception { + linkedList =new LinkedList(); + for(int i=0;i<10;i++){ + linkedList.add(i); + } + } + @Test + public void addWithIndex() { + linkedList.add(4, "a"); + Object o=linkedList.get(4); + Assert.assertEquals("a",o); + } + @Test + public void get() { + Assert.assertEquals(1,linkedList.get(1)); + } + @Test + public void size() { + Assert.assertEquals(10,linkedList.size()); + } + @Test + public void addFirst() { + linkedList.addFirst("one"); + Object o=linkedList.get(0); + Assert.assertEquals("one",o); + } + @Test + public void addLast() { + linkedList.addLast("last"); + Object o=linkedList.get(10); + Assert.assertEquals("last",o); + } + @Test + public void removeFirst() { + Assert.assertEquals(0,linkedList.removeFirst()); + } + @Test + public void removeLast() { + Assert.assertEquals(9,linkedList.removeLast()); + } + @Test + public void iterator() { + Iterator it=linkedList.iterator(); + int i=0; + while(it.hasNext()){ + Assert.assertEquals(it.next(),linkedList.get(i)); + i++; + } + } + +} diff --git a/group04/844028312/one/src/com/coding/test/QueueTest.java b/group04/844028312/one/src/com/coding/test/QueueTest.java new file mode 100644 index 0000000000..0859b73de6 --- /dev/null +++ b/group04/844028312/one/src/com/coding/test/QueueTest.java @@ -0,0 +1,35 @@ +package com.coding.test; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.ArrayList; +import com.coding.basic.Queue; + +public class QueueTest { + private Queue queue; + @Before + public void setUp() throws Exception { + queue=new Queue(); + for(int i=0;i<10;i++){ + queue.enQueue(i); + } + } + + @Test + public void deQueue() { + Assert.assertEquals(0,queue.deQueue() ); + } + @Test + public void isEmpty() { + Assert.assertEquals(false,queue.isEmpty() ); + } + @Test + public void size() { + Assert.assertEquals(10,queue.size()); + } + +} diff --git a/group04/844028312/one/src/com/coding/test/StackTest.java b/group04/844028312/one/src/com/coding/test/StackTest.java new file mode 100644 index 0000000000..efebbdd80d --- /dev/null +++ b/group04/844028312/one/src/com/coding/test/StackTest.java @@ -0,0 +1,40 @@ +package com.coding.test; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.ArrayList; +import com.coding.basic.Stack; + +public class StackTest { + private Stack stack; + @Before + public void setUp() throws Exception { + stack=new Stack(); + for(int i=0;i<10;i++){ + stack.push(i); + } + } + + @Test + public void pushAndpop() { + Assert.assertEquals(9, stack.pop()); + } + @Test + public void peek() { + Assert.assertEquals(9, stack.peek()); + Assert.assertEquals(9, stack.peek()); + } + @Test + public void isEmpty() { + Assert.assertEquals(false,stack.isEmpty()); + } + @Test + public void size(){ + Assert.assertEquals(10,stack.size()); + } + +} diff --git a/group04/844028312/two/.classpath b/group04/844028312/two/.classpath new file mode 100644 index 0000000000..05cf0dba9e --- /dev/null +++ b/group04/844028312/two/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group04/844028312/two/.gitignore b/group04/844028312/two/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group04/844028312/two/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group04/844028312/two/.project b/group04/844028312/two/.project new file mode 100644 index 0000000000..b0f45e938b --- /dev/null +++ b/group04/844028312/two/.project @@ -0,0 +1,17 @@ + + + two + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group04/844028312/two/src/com/coderising/array/ArrayUtil.java b/group04/844028312/two/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..309610c6be --- /dev/null +++ b/group04/844028312/two/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,265 @@ +package com.coderising.array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int size=origin.length; + if(size>1){ + for(int i=0;i0) + System.arraycopy(array1, 0, newArray, 0, size1); + if(size2>0) + System.arraycopy(array2,0, newArray, size1, size2); + for(int i=0;inewArray[j]){ + int temp=min; + min=newArray[j]; + newArray[i]=min; + newArray[j]=temp; + } + } + } + return newArray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int [] newArray=new int[oldArray.length+size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int [] a = null; + if(max>2){ + a=new int[10]; + int record=2; + do{ + a[0]=1; + a[1]=1; + if(a.length>record) + a[record]=a[record-2]+a[record-1]; + else{ + a=grow(a,3); + a[record]=a[record-2]+a[record-1]; + } + record++; + }while(a[record-1]1;i--){ + if(n%i==0){ + isPrime=false; + } + } + if(isPrime){ + if(record=min){ + while(true){ + boolean isPerfect=false;//是否是完数的标志 + if(max<=min){ + break; + } + int n=(int) Math.sqrt(min); + int count=0; + for(int i=n;i>=1;i--){ + if(min%i==0){ + count=count+i; + int b=min/i; + if(b!=min) + count=count+b; + } + } + if(count==min){ + isPerfect=true; + } + if(isPerfect){ + if(record action=new HashMap(); + private boolean find=false; + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + View v=new View(); + //创建SAXReader对象 + SAXReader reader = new SAXReader(); + Struts struts=new Struts(); + File file=new File(Struts.class.getResource("struts.xml").getFile()); + Document document; + try { + document = reader.read(file); + Element root=document.getRootElement(); + struts.listNodes("login",root); + if(struts.getAction().size()!=0){ + try { + String className=struts.getAction().get("class"); + Class c=Class.forName(className); + Object obj = c.newInstance(); + Method[] methods = c.getDeclaredMethods(); + Iterator iter = parameters.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = (Map.Entry) iter.next(); + Object key = entry.getKey(); + Object val = entry.getValue(); + for(Method m:methods){ + String sName=m.getName().substring(0, 3); + String eName=m.getName().substring(3, m.getName().length()).toLowerCase(); + + if("set".equals(sName)&&key.equals(eName)){ + m.invoke(obj, val); + break; + } + } + } + Method exectue= c.getDeclaredMethod("execute"); + String key=(String) exectue.invoke(obj, null); + String jsp; + if(key!=null&&!"".equals(key)){ + jsp=struts.getAction().get(key); + v.setJsp(jsp); + } + Map map=new HashMap<>(); + for(Method m:methods){ + String sName=m.getName().substring(0, 3); + + if("get".equals(sName)){ + String key2=m.getName().substring(3, m.getName().length()).toLowerCase(); + String values=(String) m.invoke(obj, null); + map.put(key2, values); + } + } + v.setParameters(map); + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + return v; + } + public Map getAction() { + return action; + } + public void setAction(Map action) { + this.action = action; + } + public Map listNodes(String actionName,Element node){ + String name=node.getName(); //节点名字 + if("action".equals(name)){ + List attributes=node.attributes();//获取节点属性 + for(Attribute attribute:attributes){ + String aName=attribute.getName(); + if("name".equals(aName)&&attribute.getValue().equals(actionName)){ + for(Attribute attribute2:attributes){ + String cName=attribute2.getName(); + if("class".equals(cName)){ + action.put(cName, attribute2.getValue()); + Iterator iterator=node.elementIterator(); + while(iterator.hasNext()){ + Element rNode=iterator.next(); + String result=rNode.getName(); + if("result".equals(result)){ + List attributes3=rNode.attributes(); + for(Attribute attribute3:attributes3){ + String rName=attribute3.getName(); + if("name".equals(rName)){ + String rValue=attribute3.getValue(); + action.put(rValue, rNode.getTextTrim()); + break; + } + } + + + } + else{ + break; + } + } + break; + } + } + find=true; + break; + } + } + } + Iterator iterator=node.elementIterator(); + while(iterator.hasNext()&&!find){ + listNodes(actionName,iterator.next()); + } + return null; + } + + +} diff --git a/group04/844028312/two/src/com/coderising/litestruts/StrutsTest.java b/group04/844028312/two/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..6511d77741 --- /dev/null +++ b/group04/844028312/two/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,50 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + @Test + public void test() { + String actionName = "login"; + Map params = new HashMap(); + + View view = Struts.runAction(actionName,params); + + } +} diff --git a/group04/844028312/two/src/com/coderising/litestruts/View.java b/group04/844028312/two/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group04/844028312/two/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/844028312/two/src/com/coderising/litestruts/struts.xml b/group04/844028312/two/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..a0b14be5d3 --- /dev/null +++ b/group04/844028312/two/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/916758663/learn01/.gitignore b/group04/916758663/learn01/.gitignore new file mode 100644 index 0000000000..45026a9caf --- /dev/null +++ b/group04/916758663/learn01/.gitignore @@ -0,0 +1,21 @@ +# Eclipse project files +.classpath +.project +.settings/ + + +# Intellij project files +*.iml +.idea/ +*.iws + +# maven +target/ +logs/ +.DS_Store + +# Mac +.DS_Store + +# +*.log diff --git a/group04/916758663/learn01/pom.xml b/group04/916758663/learn01/pom.xml new file mode 100644 index 0000000000..e40157b3bf --- /dev/null +++ b/group04/916758663/learn01/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coding + basic + 1.0-SNAPSHOT + jar + + basic + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 4.12 + test + + + + org.assertj + assertj-core + 3.6.2 + test + + + diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/ArrayList.java b/group04/916758663/learn01/src/main/java/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..0c9e702951 --- /dev/null +++ b/group04/916758663/learn01/src/main/java/com/coding/basic/ArrayList.java @@ -0,0 +1,73 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[3]; + + public void add(Object o){ + add(size,o); + } + public void add(int index, Object o){ + if (index > size){ + throw new IndexOutOfBoundsException(); + } + // 扩容 + if (size == elementData.length || index + 1 > elementData.length) { + int newLength = index + 1 > size * 2 ? index + 1 :size * 2; + elementData = Arrays.copyOf(elementData, newLength); + } + // 移动元素 + System.arraycopy(elementData,index,elementData,index + 1 ,size-index); + elementData[index] = o; + size ++ ; + } + + public Object get(int index){ + checkIndex(index); + return elementData[index]; + } + + public Object remove(int index){ + checkIndex(index); + Object removed = elementData[index]; + System.arraycopy(elementData,index + 1,elementData,index,size-1 - index); + size --; + return removed; + } + + private void checkIndex(int index) { + if (index > size-1){ + throw new IndexOutOfBoundsException(); + } + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + + private int currentIndex = 0; + + @Override + public boolean hasNext() { + return currentIndex < size(); + } + + @Override + public Object next() { + Object o = get(currentIndex); + currentIndex ++ ; + return o; + } + } + +} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/BinaryTreeNode.java b/group04/916758663/learn01/src/main/java/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group04/916758663/learn01/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/Iterator.java b/group04/916758663/learn01/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group04/916758663/learn01/src/main/java/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/LinkedList.java b/group04/916758663/learn01/src/main/java/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..cba0879ac4 --- /dev/null +++ b/group04/916758663/learn01/src/main/java/com/coding/basic/LinkedList.java @@ -0,0 +1,117 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + Node node = new Node(o, null); + if (head == null){ + head = node; + }else { + Node current = head; + while (current.getNext() != null) { + current = current.getNext(); + } + current.setNext(node); + } + } + + public void add(int index , Object o){ + Node current = head; + for (int i = 0; i < index-1; i++) { + current = current.getNext(); + if (current == null){ + throw new IndexOutOfBoundsException(); + } + } + Node right = current.getNext(); + current.setNext(new Node(o,right)); + } + + public Object get(int index){ + if (head == null){ + return null; + } + Node current = head; + for (int i = 0; i < index; i++) { + current = current.getNext(); + if (current == null){ + throw new IndexOutOfBoundsException(); + } + } + return current.getData(); + } + + public Object remove(int index){ + Node current = head; + for (int i = 0; i < index - 1; i++) { + current = current.getNext(); + if (current == null){ + throw new IndexOutOfBoundsException(); + } + } + if (current.getNext() == null){ + throw new IndexOutOfBoundsException(); + } + Object removed = current.getNext().getData(); + current.setNext(current.getNext().getNext()); + return removed; + } + + public int size(){ + if (head == null){ + return 0; + } + int n = 1; + Node current = head; + while (current.getNext() != null) { + n ++; + current = current.getNext(); + } + return n; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public Node getNext() { + return next; + } + + public void setNext(Node next) { + this.next = next; + } + } +} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/List.java b/group04/916758663/learn01/src/main/java/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group04/916758663/learn01/src/main/java/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/Queue.java b/group04/916758663/learn01/src/main/java/com/coding/basic/Queue.java new file mode 100644 index 0000000000..4e23a01d17 --- /dev/null +++ b/group04/916758663/learn01/src/main/java/com/coding/basic/Queue.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Queue { + + private ArrayList elementData = new ArrayList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.remove(0); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group04/916758663/learn01/src/main/java/com/coding/basic/Stack.java b/group04/916758663/learn01/src/main/java/com/coding/basic/Stack.java new file mode 100644 index 0000000000..83896e5dc5 --- /dev/null +++ b/group04/916758663/learn01/src/main/java/com/coding/basic/Stack.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group04/916758663/learn01/src/test/java/com/coding/basic/ArrayListTest.java b/group04/916758663/learn01/src/test/java/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..8793adf11f --- /dev/null +++ b/group04/916758663/learn01/src/test/java/com/coding/basic/ArrayListTest.java @@ -0,0 +1,68 @@ +package com.coding.basic; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.Test; + +/** + * Created by qilei on 17/2/24. + */ +public class ArrayListTest { + + @Test + public void add() throws Exception { + ArrayList l = new ArrayList(); + l.add(1); + l.add(2); + l.add(3); + l.add(4); + assertThat(l.size()).isEqualTo(4); + } + + @Test + public void insert() throws Exception { + ArrayList l = new ArrayList(); + l.add(1); + l.add(2); + l.add(3); + l.add(1,4); + assertThat(l.size()).isEqualTo(4); + assertThat(l.get(1)).isEqualTo(4); + } + + @Test + public void remove() throws Exception { + ArrayList l = new ArrayList(); + l.add(1); + l.add(2); + l.add(3); + Object removed = l.remove(1); + assertThat(l.size()).isEqualTo(2); + assertThat(removed).isEqualTo(2); + } + + @Test + public void get() throws Exception { + + } + + @Test + public void size() throws Exception { + + } + + @Test + public void iterator() throws Exception { + ArrayList l = new ArrayList(); + l.add(1); + l.add(2); + l.add(3); + Iterator iterator = l.iterator(); + while (iterator.hasNext()) { + Object next = iterator.next(); + System.out.println(next); + } + + } + +} \ No newline at end of file diff --git a/group04/916758663/learn01/src/test/java/com/coding/basic/JavaArrayListTest.java b/group04/916758663/learn01/src/test/java/com/coding/basic/JavaArrayListTest.java new file mode 100644 index 0000000000..348f7e9a66 --- /dev/null +++ b/group04/916758663/learn01/src/test/java/com/coding/basic/JavaArrayListTest.java @@ -0,0 +1,21 @@ +package com.coding.basic; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +/** + * Created by qilei on 17/2/25. + */ +public class JavaArrayListTest { + + @Test + public void add() throws Exception { + java.util.ArrayList l = new java.util.ArrayList(); + l.add(1); + l.add(2); + l.add(3,3); + assertThat(l.size()).isEqualTo(3); + } + +} diff --git a/group04/916758663/learn01/src/test/java/com/coding/basic/LinkedListTest.java b/group04/916758663/learn01/src/test/java/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..29a5a3d90e --- /dev/null +++ b/group04/916758663/learn01/src/test/java/com/coding/basic/LinkedListTest.java @@ -0,0 +1,64 @@ +package com.coding.basic; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.Test; + +/** + * Created by qilei on 17/2/25. + */ +public class LinkedListTest { + + @Test + public void add() throws Exception { + LinkedList l = new LinkedList(); + l.add(1); + l.add(2); + l.add(3); + assertThat(l.size()).isEqualTo(3); + assertThat(l.get(1)).isEqualTo(2); + } + + @Test + public void insert() throws Exception { + LinkedList l = new LinkedList(); + l.add(1); + l.add(2); + l.add(3); + l.add(1,4); + assertThat(l.size()).isEqualTo(4); + assertThat(l.get(1)).isEqualTo(4); + } + + @Test + public void remove() throws Exception { + LinkedList l = new LinkedList(); + l.add(1); + l.add(2); + l.add(3); + Object removed = l.remove(1); + assertThat(l.size()).isEqualTo(2); + assertThat(removed).isEqualTo(2); + } + + @Test + public void addFirst() throws Exception { + + } + + @Test + public void addLast() throws Exception { + + } + + @Test + public void removeFirst() throws Exception { + + } + + @Test + public void removeLast() throws Exception { + + } + +} \ No newline at end of file diff --git a/group04/916758663/learn01/src/test/java/com/coding/basic/QueueTest.java b/group04/916758663/learn01/src/test/java/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..1e451c045c --- /dev/null +++ b/group04/916758663/learn01/src/test/java/com/coding/basic/QueueTest.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.Test; + +/** + * Created by qilei on 17/2/25. + */ +public class QueueTest { + + @Test + public void enQueue() throws Exception { + Queue q = new Queue(); + q.enQueue("a"); + assertThat(q.size()).isEqualTo(1); + } + + @Test + public void deQueue() throws Exception { + Queue q = new Queue(); + q.enQueue("a"); + q.enQueue("b"); + Object o = q.deQueue(); + assertThat(q.size()).isEqualTo(1); + assertThat(o).isEqualTo("a"); + } + +} \ No newline at end of file diff --git a/group04/916758663/learn01/src/test/java/com/coding/basic/StackTest.java b/group04/916758663/learn01/src/test/java/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..1c25b17007 --- /dev/null +++ b/group04/916758663/learn01/src/test/java/com/coding/basic/StackTest.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.Test; + +/** + * Created by qilei on 17/2/25. + */ +public class StackTest { + + @Test + public void push() throws Exception { + Stack s = new Stack(); + s.push("a"); + assertThat(s.size()).isEqualTo(1); + assertThat(s.peek()).isEqualTo("a"); + } + + @Test + public void pop() throws Exception { + Stack s = new Stack(); + s.push("a"); + s.push("b"); + Object pop = s.pop(); + assertThat(pop).isEqualTo("b"); + } + +} \ No newline at end of file diff --git a/group04/916758663/learn02/.gitignore b/group04/916758663/learn02/.gitignore new file mode 100644 index 0000000000..45026a9caf --- /dev/null +++ b/group04/916758663/learn02/.gitignore @@ -0,0 +1,21 @@ +# Eclipse project files +.classpath +.project +.settings/ + + +# Intellij project files +*.iml +.idea/ +*.iws + +# maven +target/ +logs/ +.DS_Store + +# Mac +.DS_Store + +# +*.log diff --git a/group04/916758663/learn02/pom.xml b/group04/916758663/learn02/pom.xml new file mode 100644 index 0000000000..6503735a51 --- /dev/null +++ b/group04/916758663/learn02/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + com.example + litestruts + 1.0-SNAPSHOT + + + + junit + junit + 4.12 + + + + \ No newline at end of file diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/LoginAction.java b/group04/916758663/learn02/src/main/java/com/example/litestruts/LoginAction.java new file mode 100644 index 0000000000..2565fe4ad6 --- /dev/null +++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/LoginAction.java @@ -0,0 +1,42 @@ +package com.example.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + */ +public class LoginAction { + + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/Struts.java b/group04/916758663/learn02/src/main/java/com/example/litestruts/Struts.java new file mode 100644 index 0000000000..eccfdcb73f --- /dev/null +++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/Struts.java @@ -0,0 +1,158 @@ +package com.example.litestruts; + +import com.example.litestruts.dto.Action; +import com.example.litestruts.dto.ActionResult; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + + +public class Struts { + + public static View runAction(final String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + try { + //读取配置文件struts.xml + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document document = db.parse( + "/Users/qilei/idea/coding2017/coding2017/group04/916758663/learn02/src/main/java/com/example/litestruts/struts.xml"); + List actions = parseActions(document); + + //1. 根据actionName找到相对应的class + Optional matchAction = actions.stream() + .filter(action -> action.getName().equals(actionName)).findFirst(); + if (matchAction.isPresent()) { + String actionClassName = matchAction.get().getClassName(); + Object instance = Class.forName(actionClassName).newInstance(); + Class clazz = instance.getClass(); + for (Entry item : parameters.entrySet()) { + String key = item.getKey(); + Field field = clazz.getDeclaredField(key); + field.setAccessible(true); + field.set(instance, item.getValue()); + } + + Method method = clazz.getDeclaredMethod("execute"); + String invokeResult = (String) method.invoke(instance); + Optional actionResultOptional = matchAction.get().getActionResultList().stream() + .filter(actionResult -> actionResult.getName().equals(invokeResult)).findFirst(); + if (actionResultOptional.isPresent()) { + String jsp = actionResultOptional.get().getJsp(); + Map viewParas = new HashMap<>(); + Method[] declaredMethods = clazz.getDeclaredMethods(); + for (int i = 0; i < declaredMethods.length; i++) { + Method declaredMethod = declaredMethods[i]; + if (declaredMethod.getName().startsWith("get")) { + String value = (String) declaredMethod.invoke(instance); + String key = declaredMethod.getName().substring(3).toLowerCase(); + viewParas.put(key,value); + } + } + + View view = new View(); + view.setJsp(jsp); + view.setParameters(viewParas); + return view; + } + + + } + + System.out.println("Finished"); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return null; + } + + private static List parseActions(Document document) { + List actions = new ArrayList(); + NodeList actionList = document.getElementsByTagName("action"); + for (int i = 0; i < actionList.getLength(); i++) { + Node item = actionList.item(i); + NamedNodeMap attributes = item.getAttributes(); + Action action = new Action(); + for (int j = 0; j < attributes.getLength(); j++) { + Node attr = attributes.item(j); + String key = attr.getNodeName(); + String value = attr.getNodeValue(); + if (key.equals("name")) { + action.setName(value); + } else if (key.equals("class")) { + action.setClassName(value); + } + } + + List actionResultList = new ArrayList(); + NodeList actionResultNodes = item.getChildNodes(); + for (int j = 0; j < actionResultNodes.getLength(); j++) { + Node actionResultNode = actionResultNodes.item(j); + if (actionResultNode.getNodeType() == Node.ELEMENT_NODE) { + ActionResult actionResult = new ActionResult(); + Element actionResultElement = (Element) actionResultNode; + actionResult.setName(actionResultElement.getAttribute("name")); + actionResult.setJsp(actionResultElement.getFirstChild().getNodeValue()); + actionResultList.add(actionResult); + } + } + action.setActionResultList(actionResultList); + actions.add(action); + } + return actions; + } + +} diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/View.java b/group04/916758663/learn02/src/main/java/com/example/litestruts/View.java new file mode 100644 index 0000000000..44f3d97bcd --- /dev/null +++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/View.java @@ -0,0 +1,27 @@ +package com.example.litestruts; + +import java.util.Map; + +public class View { + + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/Action.java b/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/Action.java new file mode 100644 index 0000000000..733370ab73 --- /dev/null +++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/Action.java @@ -0,0 +1,78 @@ +package com.example.litestruts.dto; + +import java.util.List; + +/** + * Created by qilei on 17/3/5. + */ +public class Action { + private String name; + private String className; + private List actionResultList; + + public Action() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public List getActionResultList() { + return actionResultList; + } + + public void setActionResultList(List actionResultList) { + this.actionResultList = actionResultList; + } + + private Action(Builder builder) { + name = builder.name; + className = builder.className; + actionResultList = builder.actionResultList; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public static final class Builder { + + private String name; + private String className; + private List actionResultList; + + private Builder() { + } + + public Builder name(String val) { + name = val; + return this; + } + + public Builder className(String val) { + className = val; + return this; + } + + public Builder actionResultList(List val) { + actionResultList = val; + return this; + } + + public Action build() { + return new Action(this); + } + } +} diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/ActionResult.java b/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/ActionResult.java new file mode 100644 index 0000000000..0fc815e162 --- /dev/null +++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/dto/ActionResult.java @@ -0,0 +1,28 @@ +package com.example.litestruts.dto; + +/** + * Created by qilei on 17/3/5. + */ +public class ActionResult { + private String name; + private String jsp; + + public ActionResult() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getJsp() { + return jsp; + } + + public void setJsp(String jsp) { + this.jsp = jsp; + } +} diff --git a/group04/916758663/learn02/src/main/java/com/example/litestruts/struts.xml b/group04/916758663/learn02/src/main/java/com/example/litestruts/struts.xml new file mode 100644 index 0000000000..c31db95dd5 --- /dev/null +++ b/group04/916758663/learn02/src/main/java/com/example/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group04/916758663/learn02/src/test/java/com/example/litestruts/StrutsTest.java b/group04/916758663/learn02/src/test/java/com/example/litestruts/StrutsTest.java new file mode 100644 index 0000000000..ba938f466e --- /dev/null +++ b/group04/916758663/learn02/src/test/java/com/example/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.example.litestruts; + + +import java.util.HashMap; +import java.util.Map; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by qilei on 17/3/5. + */ +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} \ No newline at end of file diff --git a/group04/group04.md b/group04/group04.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group04/group04.md @@ -0,0 +1 @@ + diff --git a/group05/1026626960/.classpath b/group05/1026626960/.classpath new file mode 100644 index 0000000000..bb62e29268 --- /dev/null +++ b/group05/1026626960/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/group05/1026626960/.gitignore b/group05/1026626960/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group05/1026626960/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group05/1026626960/.project b/group05/1026626960/.project new file mode 100644 index 0000000000..a8522c9339 --- /dev/null +++ b/group05/1026626960/.project @@ -0,0 +1,17 @@ + + + 1026626960Coding + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group05/1026626960/src/cn/study1/myIterator.java b/group05/1026626960/src/cn/study1/myIterator.java new file mode 100644 index 0000000000..a5e5528559 --- /dev/null +++ b/group05/1026626960/src/cn/study1/myIterator.java @@ -0,0 +1,5 @@ +package cn.study1; + +public class myIterator { + // +} diff --git a/group05/1026626960/src/cn/study1/myQueue.java b/group05/1026626960/src/cn/study1/myQueue.java new file mode 100644 index 0000000000..cfb5e061d7 --- /dev/null +++ b/group05/1026626960/src/cn/study1/myQueue.java @@ -0,0 +1,38 @@ +package cn.study1; + +public class myQueue { + private class Node{ + T t; + Node next; + } + private Node first; + private Node last; + private int N; + public boolean isEmpty(){ + return N==0; + } + public int size(){ + return N; + } + public void enqueue(T t){ + Node oldlast = last; + last = new Node(); + last.t = t; + last.next = null; + if(isEmpty()){ + first = last; + }else{ + oldlast.next = last; + } + N++; + } + public T dequeue(){ + T t = first.t; + first = first.next; + if(isEmpty()){ + last = null; + } + N--; + return t; + } +} diff --git a/group05/1026626960/src/cn/study1/myStack.java b/group05/1026626960/src/cn/study1/myStack.java new file mode 100644 index 0000000000..8364401c45 --- /dev/null +++ b/group05/1026626960/src/cn/study1/myStack.java @@ -0,0 +1,29 @@ +package cn.study1; + +public class myStack { + private class Node{ + T t; + Node next; + } + private Node first; + private int N; + public boolean isEmpty(){ + return N==0; + } + public int size(){ + return N; + } + public void push(T t){ + Node oldfirst = first; + first = new Node(); + first.t = t; + first.next = oldfirst; + N++; + } + public T pop(){ + T t = first.t; + first = first.next; + N--; + return t; + } +} diff --git a/group05/1026626960/src/cn/study2/array/ArrayUtil.java b/group05/1026626960/src/cn/study2/array/ArrayUtil.java new file mode 100644 index 0000000000..a57881918b --- /dev/null +++ b/group05/1026626960/src/cn/study2/array/ArrayUtil.java @@ -0,0 +1,213 @@ +package cn.study2.array; + +public class ArrayUtil { + + /** + * һa , Ըֵû + * 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + * a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + */ + public void exchangeArray(int[] a){ + int index = a.length; + int a1 = 0; + for(int i = 1; i < index/2; i++){ + a[i] = a1; + a[i] = a[index - i]; + a[index - i] = a[i]; + } + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ + * {1,3,4,5,6,6,5,4,7,6,7,5} + */ + public int[] removeZero(){ + int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int size = 0; + for(int i = 0; i < oldArr.length; i++){ + if(oldArr[i] != 0){ + size++; + } + } + int newArr[] = new int[size]; + for(int i = 0; i < oldArr.length; i++){ + int j = 0; + if(oldArr[i] != 0){ + newArr[j] = oldArr[i]; + j++; + } + } + return newArr; + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ + * a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + */ + public int[] reshapeArr(int a1[], int a2[]){ + int size = a1.length+a2.length; + int a3[] = new int[size]; + //δ + return a3; + } + + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ + * oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + */ + public int[] addSize(int oldArr[],int size){ + int newSize = oldArr.length+size; + int newArr[] = new int[newSize]; + for(int i = 0; i < newArr.length; i++){ + if(i < oldArr.length){ + newArr[i] = oldArr[i]; + } + newArr[i] = 0; + } + return newArr; + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ + * 磬 max = 15 , 򷵻صӦΪ [11235813] + * max = 1, 򷵻ؿ [] + */ + public int[] method1(int max){ + int Arr[] = new int[max]; + if(max <= 1){ + return null; + }else if(max <= 2){ + int a[] = {1,1,2}; + return a; + }else{ + Arr[0] = 1; + Arr[1] = 1; + Arr[2] = 2; + int n = 3; + while(n < max){ + Arr[n] = Arr[n-2] + Arr[n-1]; + } + return Arr; + } + } + + /** + * 쳲 + */ + //δ + + + + /** + * Сڸֵmax + * max = 23, صΪ[2,3,5,7,11,13,17,19] + */ + public int[] getPrimes(int max) { + int size = 0; + for (int i = 0; i < max; i++) { + if (isPrimes(i)) { + size++; + } + } + int Arr[] = new int[size]; + int j = 0; + for (int i = 0; i < max; i++) { + if (isPrimes(i)) { + Arr[j++] = i; + } + } + return Arr; + } + + /** + * жǷΪ + */ + public boolean isPrimes(int num){ + if(num<=1){ + return false; + }else{ + for(int i=2;i + /index.jsp + /login.jsp + + */ +public class ActionMapping { + // · + private String name; + // acitonȫ + private String className; + // + private String method; + // ͼ + private Map results; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getClassName() { + return className; + } + public void setClassName(String className) { + this.className = className; + } + public String getMethod() { + return method; + } + public void setMethod(String method) { + this.method = method; + } + public Map getResults() { + return results; + } + public void setResults(Map results) { + this.results = results; + } +} diff --git a/group05/1026626960/src/cn/study2/myStruts/Result.java b/group05/1026626960/src/cn/study2/myStruts/Result.java new file mode 100644 index 0000000000..0ed80bd80f --- /dev/null +++ b/group05/1026626960/src/cn/study2/myStruts/Result.java @@ -0,0 +1,28 @@ +package cn.study2.myStruts; + +public class Result { + // תĽ + private String name; + // תͣĬΪת "redirect"Ϊض + private String type; + // תҳ + private String page; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getPage() { + return page; + } + public void setPage(String page) { + this.page = page; + } +} diff --git a/group05/1026626960/src/cn/study2/myStruts/Test.java b/group05/1026626960/src/cn/study2/myStruts/Test.java new file mode 100644 index 0000000000..3f571354f9 --- /dev/null +++ b/group05/1026626960/src/cn/study2/myStruts/Test.java @@ -0,0 +1,7 @@ +package cn.study2.myStruts; + +public class Test { + public static void main(String[] args) { + new readStrutsXml(); + } +} diff --git a/group05/1026626960/src/cn/study2/myStruts/readStrutsXml.java b/group05/1026626960/src/cn/study2/myStruts/readStrutsXml.java new file mode 100644 index 0000000000..c90fdfe5af --- /dev/null +++ b/group05/1026626960/src/cn/study2/myStruts/readStrutsXml.java @@ -0,0 +1,98 @@ +package cn.study2.myStruts; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.junit.Test; + +/** + * ģȡһstruts.xmlļ + * + + + + + /index.jsp + /login.jsp + + + + /login + + + + + + * @author zhengliang + * + */ +public class readStrutsXml { + // actionļ + private Map allActions = new HashMap(); + public readStrutsXml() { + this.init(); + } + + // ʼallActions + private void init() { + /********DOM4Jȡļ***********/ + System.out.println("ڶȡmystruts.xmlļ"); + try { + // õ + SAXReader reader = new SAXReader(); + // õsrc/mystruts.xml ļ + InputStream inStream = this.getClass().getResourceAsStream("/mystruts.xml"); + // ļ + Document doc = reader.read(inStream); + // ȡ + Element root = doc.getRootElement(); + // õpackageڵ + Element ele_package = root.element("package"); + // õpackageڵ£ еactionӽڵ + List listAction = ele_package.elements("action"); + // װ + for (Element ele_action : listAction) { + // װһActionMapping + ActionMapping actionMapping = new ActionMapping(); + actionMapping.setName(ele_action.attributeValue("name")); + actionMapping.setClassName(ele_action.attributeValue("class")); + actionMapping.setMethod(ele_action.attributeValue("method")); + + // װǰacitonڵеĽͼ + Map results = new HashMap(); + + // õǰactionڵеresultӽڵ + Iterator it = ele_action.elementIterator("result"); + while (it.hasNext()) { + // ǰÿһԪض + Element ele_result = it.next(); + // װ + Result res = new Result(); + res.setName(ele_result.attributeValue("name")); + res.setType(ele_result.attributeValue("type")); + res.setPage(ele_result.getTextTrim()); + // ӵ + results.put(res.getName(), res); + } + // õactionMapping + actionMapping.setResults(results); + + // 6.x actionMappingӵmap + allActions.put(actionMapping.getName(), actionMapping); + } + + System.out.println("struts.xmlļȡ"); + + } catch (Exception e) { + throw new RuntimeException("ʱʼ",e); + } + } + + +} diff --git a/group05/1026626960/src/mystruts.xml b/group05/1026626960/src/mystruts.xml new file mode 100644 index 0000000000..2a3b40e879 --- /dev/null +++ b/group05/1026626960/src/mystruts.xml @@ -0,0 +1,15 @@ + + + + + /index.jsp + /login.jsp + + + + /login + + + + + \ No newline at end of file diff --git a/group05/1094051862/test01/.classpath b/group05/1094051862/test01/.classpath new file mode 100644 index 0000000000..9794cd8084 --- /dev/null +++ b/group05/1094051862/test01/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group05/1094051862/test01/.gitignore b/group05/1094051862/test01/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group05/1094051862/test01/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group05/1094051862/test01/.project b/group05/1094051862/test01/.project new file mode 100644 index 0000000000..1dfd9165c6 --- /dev/null +++ b/group05/1094051862/test01/.project @@ -0,0 +1,17 @@ + + + test01 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group05/1094051862/test01/.settings/org.eclipse.jdt.core.prefs b/group05/1094051862/test01/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..d17b6724d1 --- /dev/null +++ b/group05/1094051862/test01/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group05/1094051862/test01/src/com/coderising/array/ArrayUtil.java b/group05/1094051862/test01/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..df802abb6f --- /dev/null +++ b/group05/1094051862/test01/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,235 @@ +package com.coderising.array; + +import org.junit.experimental.max.MaxCore; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static void reverseArray(int[] origin) { + if (origin.length < 2) + return; + int temp; + for (int i = 0; i < origin.length >> 1; i++) { + temp = origin[i]; + origin[i] = origin[origin.length - 1 - i]; + origin[origin.length - 1 - i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + if (oldArray == null || oldArray.length == 0) + return null; + int zeros = 0;// 数组中0元素的个数 + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) + zeros++; + } + int[] newArr = new int[oldArray.length - zeros]; + for (int i = 0, j = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArr[j] = oldArray[i]; + j++; + } + } + return newArr; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2) { + int[] mergedArr = new int[array1.length + array2.length]; + int temp; + int i = 0, j = 0, index = 0, size = 0; + while (i < array1.length && j < array2.length) { + //两个数组都没遍历到最后一个元素 + if (i != array1.length - 1 && j != array2.length - 1) { + if (array1[i] < array2[j]) { + temp = array1[i++]; + } else if (array1[i] > array2[j]) { + temp = array2[j++]; + } else { + //遇到相等元素,存放任意一个就实现去重了 + temp = array1[i++]; + j++; + } + mergedArr[index++] = temp; + size++; + //array1遍历到最后一个元素 + } else if (i == array1.length - 1 && j != array2.length - 1) { + if (array1[i] < array2[j]) { + temp = array1[i]; + mergedArr[index++] = temp; + size++; + //将array2的剩余元素复制到mergedArr中 + System.arraycopy(array2, j, mergedArr, index, array2.length - j); + size += array2.length - j; + break; + } else if (array1[i] > array2[j]) { + temp = array2[j++]; + size++; + } else { + System.arraycopy(array2, j, mergedArr, index, array2.length - j); + size += array2.length - j; + break; + } + //array2遍历到最后一个元素 + } else if (i != array1.length - 1 && j == array2.length - 1) { + if (array1[i] > array2[j]) { + temp = array2[j]; + mergedArr[index++] = temp; + size++; + //将array1的剩余元素复制到mergedArr中 + System.arraycopy(array1, i, mergedArr, index, array1.length - i); + size += array1.length - i; + break; + } else if (array1[i] < array2[j]) { + temp = array2[i++]; + size++; + } else { + System.arraycopy(array1, i, mergedArr, index, array1.length - i); + size += array1.length - i; + break; + } + } + } + //构造新数组,去除mergedArr中尾部若干0元素 + int[] result = new int[size]; + System.arraycopy(mergedArr, 0, result, 0, size); + return result; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + int[] arr = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, arr, 0, oldArray.length); + return arr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max < 2) return null; + int[] a = new int[max]; + a[0] = 1; + a[1] = 1; + int size = 2; + for (int i = 2;; i++) { + a[i] = a[i-1] + a[i-2]; + if (a[i] > max) break; + size ++; + } + int[] fibonacci = new int[size]; + System.arraycopy(a, 0, fibonacci, 0, size); + return fibonacci; + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + if (max < 2) { + return null; + } + int[] a = new int[max]; + int size = 0; + for (int i = 2; i < max; i++) { + if (isPrime(i)) { + a[size++] = i; + } + } + int[] primes = new int[size]; + System.arraycopy(a, 0, primes, 0, size); + return primes; + } + private static boolean isPrime(int i) { + for (int j = 2; j*j <= i; j++) { + if (i % j == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + int[] a = new int[max]; + int size = 0; + for (int i = 6; i < max; i++) { + if (isPerfectNumber(i)) { + a[size++] = i; + } + } + int[] perfectNumbers = new int[size]; + System.arraycopy(a, 0, perfectNumbers, 0, size); + return perfectNumbers; + } + private static boolean isPerfectNumber(int i) { + int sum = 0; + for (int j = 1; j <= i >> 1; j++) { + if (i % j == 0) { + sum += j; + } + } + if (i == sum) return true; + else return false; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator) { + StringBuilder sb = new StringBuilder(); + for (int i : array) { + sb.append(i); + sb.append(seperator); + } + return sb.substring(0, sb.lastIndexOf(seperator)); + } + +} diff --git a/group05/1094051862/test01/src/com/coderising/array/ArrayUtilTest.java b/group05/1094051862/test01/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..a9e86bec19 --- /dev/null +++ b/group05/1094051862/test01/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,91 @@ +package com.coderising.array; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import sun.misc.Perf.GetPerfAction; + +public class ArrayUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverseArray() { + int[] a = {7,9,30,3,5}; + int[] b = a.clone(); + ArrayUtil.reverseArray(a); + for (int i = 0; i < b.length; i ++) { + Assert.assertEquals(b[i], a[b.length - 1 - i]); + } + + } + + @Test + public void testRemoveZero() { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] result = {1,3,4,5,6,6,5,4,7,6,7,5}; + int[] removeZero = ArrayUtil.removeZero(oldArr); + assertArrayEquals(result, removeZero); + } + + @Test + public void testMerge() { + int[] a1 = {3,5,7,8}; + int[] a2 = {4,5,6,7}; + int[] a3 = {3,4,5,6,7,8}; + int[] merge = ArrayUtil.merge(a1, a2); + assertArrayEquals(a3, merge); + } + + @Test + public void testGrow() { + int[] oldArray = {2,3,6}; + int size = 3; + int[] growedArr = {2,3,6,0,0,0}; + assertArrayEquals(growedArr, ArrayUtil.grow(oldArray, size)); + } + + @Test + public void testFibonacci() { + int[] fibonacci = ArrayUtil.fibonacci(15); + for (int i : fibonacci) { + System.out.println(i); + } + } + + @Test + public void testGetPrimes() { + int[] primes = ArrayUtil.getPrimes(3); + for (int i : primes) { + System.out.println(i); + } + } + + @Test + public void testGetPerfectNumbers() { + int[] perfectNumbers = ArrayUtil.getPerfectNumbers(10000); + int[] expecteds = {6,28,496,8128}; + assertArrayEquals(expecteds, perfectNumbers); + for (int i : perfectNumbers) { + System.out.println(i); + } + } + + @Test + public void testJoin() { + int[] arr = {3,4,5}; + String join = ArrayUtil.join(arr, "-"); + assertEquals("3-4-5", join); + } + +} diff --git a/group05/1094051862/test01/src/com/coderising/litestruts/LoginAction.java b/group05/1094051862/test01/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group05/1094051862/test01/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group05/1094051862/test01/src/com/coderising/litestruts/Struts.java b/group05/1094051862/test01/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..edbab9562d --- /dev/null +++ b/group05/1094051862/test01/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,181 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.xml.parsers.ParserConfigurationException; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.junit.Test; +import org.omg.PortableInterceptor.ObjectIdHelper; +import org.xml.sax.SAXException; + +import com.coding.basic.ArrayList; +import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ; + +public class Struts { + @Test + public static View runAction(String actionName, + Map parameters) { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + */ + + // DOM4J方式解析xml + // 读取文件 转换成Document + View view = new View(); + if (actionName == null || actionName.isEmpty()) { + return view; + } + try { + //获取action标签元素 + Element actionEle = getActionElement(actionName); + + String qualifiedName = actionEle.attributeValue("class"); + Class clazz = Class.forName(qualifiedName); + Object instanceOfAction = getParameteredInstance(parameters, clazz); + Method executeMethod = clazz.getMethod("execute"); + + //调用execute方法,改变action实例,一定要在执行getResultMap方法之前执行 + String executeResult = (String) executeMethod.invoke(instanceOfAction); + Method[] methods = clazz.getMethods(); + Map resultMap = getResultMap(instanceOfAction, methods); + view.setParameters(resultMap); + + List resultEles = actionEle.elements("result"); + String jspPath = getJspPath(executeResult, resultEles); + view.setJsp(jspPath); + } catch (ClassNotFoundException e1) { + e1.printStackTrace(); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return view; + } + + private static String getJspPath(String result, List resultEles) { + for (int i = 0; i < resultEles.size(); i++) { + String text = resultEles.get(i).attributeValue("name"); + if (text.equals(result)) { + String jspString = resultEles.get(i).getText(); + return jspString; + } + } + return null; + } + + private static Map getResultMap(Object obj, Method[] methodsOfObj) + throws IllegalAccessException, InvocationTargetException { + Map resultMap = new HashMap(); + Method m; + for (int i = 0; i < methodsOfObj.length; i++) { + if (methodsOfObj[i].getName().startsWith("get")) { + m = methodsOfObj[i]; + String methodName = getMethodNameInLowerCase(m); + Object result = m.invoke(obj); + resultMap.put(methodName.substring(3), result); + } + } + return resultMap; + } + + private static String getMethodNameInLowerCase(Method m) { + String methodName = m.getName(); + StringBuilder sbr = new StringBuilder(methodName); + sbr.setCharAt(3, Character.toLowerCase(sbr.charAt(3))); + methodName = sbr.toString(); + return methodName; + } + + private static Object getParameteredInstance(Map parameters, + Class clazz) { + Object obj = null; + try { + obj = clazz.newInstance(); + Map methodsAndParams = new HashMap(); + Set keySet = parameters.keySet(); + for (String k : keySet) { + String methodName = getMethodNameByProperty(k); + methodsAndParams.put(methodName, parameters.get(k)); + Method setter = clazz.getMethod(methodName, parameters.get(k) + .getClass()); + setter.invoke(obj, parameters.get(k)); + } + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return obj; + } + + private static String getMethodNameByProperty(String k) { + StringBuilder sb = new StringBuilder(k); + sb.setCharAt(0, Character.toUpperCase(sb.charAt(0))); + sb = sb.insert(0, "set"); + String method = sb.toString();// 获得方法名 + return method; + } + + @SuppressWarnings("unchecked") + private static Element getActionElement(String actionName) throws DocumentException { + SAXReader reader = new SAXReader(); + Document document = reader.read(new File( + "src/com/coderising/litestruts/struts.xml")); + Element root = document.getRootElement(); + List actNodes = root.elements("action"); + Element e = null; + String className; + for (int i = 0; i < actNodes.size(); i++) { + className = actNodes.get(i).attributeValue("name"); + if (className != null && className.equals(actionName)) { + e = actNodes.get(i); + break; + } + } + return e; + } + +} diff --git a/group05/1094051862/test01/src/com/coderising/litestruts/StrutsTest.java b/group05/1094051862/test01/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group05/1094051862/test01/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group05/1094051862/test01/src/com/coderising/litestruts/View.java b/group05/1094051862/test01/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group05/1094051862/test01/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group05/1094051862/test01/src/com/coderising/litestruts/struts.xml b/group05/1094051862/test01/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..ea46090bc9 --- /dev/null +++ b/group05/1094051862/test01/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group05/1094051862/test01/src/com/coding/basic/ArrayList.java b/group05/1094051862/test01/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..60fe8b9150 --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/ArrayList.java @@ -0,0 +1,79 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + private int increaseSize = 10; + private void increaseArray() { + Object[] newData = Arrays.copyOf(elementData, elementData.length + increaseSize); + elementData = newData; + } + public void add(Object o){ + if (size == elementData.length) { + increaseArray(); + elementData[size++] = o; + } else { + elementData[size++] = o; + } + } + public void add(int index, Object o){ + if (index < 0 || index > size) { + System.out.println("错误提示:index > size || index < 0"); + return; + } + Object temp; + for (int i = index; i < size; i++) { + temp = elementData[i]; + elementData[i] = o; + o = temp; + } + elementData[size ++] = o; + } + + public Object get(int index){ + if (index < 0 || index > size ){ + return null; + } + return elementData[index]; + } + + public Object remove(int index){ + if (index < 0 || index > size ){ + return null; + } + Object result = elementData[index]; + for (int i = index; i < size-1; i++) { + elementData[i] = elementData[i + 1]; + } + elementData[size-1] = null; + size --; + return result; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new Iterator() { + private int cusor = 0; + @Override + public Object next() { + if (!hasNext()) { + System.out.println("next: !hasNext"); + return null; + } + return elementData[cusor ++]; + } + @Override + public boolean hasNext() { + return cusor < size; + } + }; + } +} diff --git a/group05/1094051862/test01/src/com/coding/basic/ArrayListTest.java b/group05/1094051862/test01/src/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..8a5875427e --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/ArrayListTest.java @@ -0,0 +1,31 @@ +package com.coding.basic; + +import org.junit.Assert; +import org.junit.Test; + +public class ArrayListTest { + + @Test + public void test() { + List list = new ArrayList(); + for(int i = 0; i < 10; i++) { + list.add(i); + } + Assert.assertEquals(10, list.size()); + list.add(11); + list.add(3,99); + Assert.assertEquals(99, list.get(3)); + Assert.assertEquals(12, list.size()); + Assert.assertEquals(99, list.remove(3)); + Assert.assertEquals(11, list.size()); + Iterator iterator = list.iterator(); + for (int i = 0; i< list.size(); i++) { + System.out.println(list.get(i)); + } + System.out.println("======"); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } + +} diff --git a/group05/1094051862/test01/src/com/coding/basic/BinaryTreeNode.java b/group05/1094051862/test01/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group05/1094051862/test01/src/com/coding/basic/Iterator.java b/group05/1094051862/test01/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group05/1094051862/test01/src/com/coding/basic/LinkedList.java b/group05/1094051862/test01/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..4ef910fc16 --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/LinkedList.java @@ -0,0 +1,149 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private Node last; + private int size = 0; + + public void add(Object o){ + if (head == null) { + head = new Node(o, null); + size ++; + return; + } + Node n = new Node(o, null); + if (last == null) { + last = n; + head.next = last; + } + last.next = n; + last = n; + size ++; + } + public void add(int index , Object o){ + if (index < 0 || index > size) { + System.out.println("linkedList.add: index < 0 || index > size"); + return; + } + if (index == size) { + add(o); + return; + } + if (index == 0) { + addFirst(o); + return; + } + Node pre = head; + for (int i = 1; i < index; i++) { + pre = pre.next; + } + Node post = pre.next; + Node n = new Node(o,post); + pre.next = n; + size ++; + } + public Object get(int index){ + if (index == 0) { + return head.data; + } + Node n = head; + for (int i = 1; i <= index; i++) { + n = n.next; + } + return n.data; + } + public Object remove(int index){ + if (index < 0 || index >= size) { + System.out.println("remove :index < 0 || index >= size"); + return null; + } + if (index == 0) { + return removeFirst(); + } + if (index == size - 1) { + return removeLast(); + } + Node pre = head; + for (int i = 1; i < index; i++) { + pre = pre.next; + } + Node n = pre.next; + Node post = n.next; + n.next = null; + pre.next = post; + size --; + return n.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node n = new Node(o,head); + head = n; + size ++; + return; + } + public void addLast(Object o){ + Node n = new Node(o,null); + last.next = n; + last = n; + size ++; + return; + } + public Object removeFirst(){ + Object o = head.data; + Node n = head.next; + head.next = null; + head = n; + size --; + return o; + } + public Object removeLast(){ + Node preLast = head; + for (int i = 1; i < size; i++) { + preLast = preLast.next; + } + preLast.next = null; + Object o = last.data; + last = preLast; + size --; + return o; + } + public Iterator iterator(){ + return new Iterator() { + int cusor = 0; + Node current = head; + @Override + public Object next() { + if (!hasNext()) { + System.out.println("next : !hasNext"); + return null; + } + Object o = current.data; + current = current.next; + cusor ++; + return o; + } + + @Override + public boolean hasNext() { + return cusor < size; + } + }; + } + + + private static class Node { + + Object data; + Node next; + + public Node (Object data, Node next) { + this.data = data; + this.next = next; + } + } +} diff --git a/group05/1094051862/test01/src/com/coding/basic/LinkedListTest.java b/group05/1094051862/test01/src/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..ca269f7d9f --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/LinkedListTest.java @@ -0,0 +1,36 @@ +package com.coding.basic; + +import junit.framework.Assert; + +import org.junit.Test; + +public class LinkedListTest extends LinkedList { + + @Test + public void test() { + List list = new LinkedList(); + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(3, 33); + list.add(0, 100); + list.add(8,800); + Assert.assertEquals(9, list.size()); + Assert.assertEquals(100, list.get(0)); + Assert.assertEquals(0, list.get(1)); + Assert.assertEquals(1, list.get(2)); + Assert.assertEquals(2, list.get(3)); + Assert.assertEquals(33, list.get(4)); + Assert.assertEquals(3, list.get(5)); + Assert.assertEquals(4, list.get(6)); + Assert.assertEquals(800, list.get(8)); + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } + +} diff --git a/group05/1094051862/test01/src/com/coding/basic/List.java b/group05/1094051862/test01/src/com/coding/basic/List.java new file mode 100644 index 0000000000..ef939ae2cc --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/List.java @@ -0,0 +1,10 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + public Iterator iterator(); +} diff --git a/group05/1094051862/test01/src/com/coding/basic/Queue.java b/group05/1094051862/test01/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..b65d01ab8e --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/Queue.java @@ -0,0 +1,25 @@ +package com.coding.basic; + +public class Queue { + private List list = new ArrayList(); + private int size = 0; + public void enQueue(Object o){ + list.add(o); + size ++; + } + + public Object deQueue(){ + if (size == 0) + return null; + size --; + return list.remove(0); + } + + public boolean isEmpty(){ + return size == 0; + } + + public int size(){ + return size; + } +} diff --git a/group05/1094051862/test01/src/com/coding/basic/QueueTest.java b/group05/1094051862/test01/src/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..f75beb397f --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/QueueTest.java @@ -0,0 +1,26 @@ +package com.coding.basic; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.Test; + +import sun.org.mozilla.javascript.internal.ast.NewExpression; + +public class QueueTest { + + @Test + public void test() { + Queue queue = new Queue(); + for (int i = 0; i < 100; i++) { + queue.enQueue(i); + } + Assert.assertEquals(100, queue.size()); + for (int i = 0; i < 100; i++) { + Assert.assertEquals(i, queue.deQueue()); + } + Assert.assertEquals(0, queue.size()); + + } + +} diff --git a/group05/1094051862/test01/src/com/coding/basic/Stack.java b/group05/1094051862/test01/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..7fabb3494f --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/Stack.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Stack { + private List elementData = new ArrayList(); + private int size = 0; + public void push(Object o){ + elementData.add(o); + size ++; + } + + public Object pop(){ + if (size == 0) + return null; + return elementData.remove(--size); + } + + public Object peek(){ + if (size == 0) + return null; + return elementData.get(size - 1); + } + public boolean isEmpty(){ + return size == 0; + } + public int size(){ + return size; + } +} diff --git a/group05/1094051862/test01/src/com/coding/basic/StackTest.java b/group05/1094051862/test01/src/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..adcb2c6522 --- /dev/null +++ b/group05/1094051862/test01/src/com/coding/basic/StackTest.java @@ -0,0 +1,26 @@ +package com.coding.basic; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.BeforeClass; +import org.junit.Test; + +public class StackTest { + + @Test + public void test() { + Stack stack = new Stack(); + for (int i = 0; i < 100; i++) { + stack.push(i); + } + Assert.assertEquals(100, stack.size()); + Assert.assertEquals(99, stack.pop()); + for (int i = 98; i >= 0; i--) { + Assert.assertEquals(i, stack.peek()); + Assert.assertEquals(i, stack.pop()); + } + Assert.assertEquals(0, stack.size()); + } + +} diff --git a/group05/183127807/HomeWork0226/src/com/coding/basic/ArrayList.java b/group05/183127807/HomeWork0226/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..d8609f5ca3 --- /dev/null +++ b/group05/183127807/HomeWork0226/src/com/coding/basic/ArrayList.java @@ -0,0 +1,85 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private static final int DEFAULT_CAPACITY = 100; + + private int size = 0; + + private Object[] elementData = new Object[DEFAULT_CAPACITY]; + + public void add(Object o){ + ensureCapacity(size+1); + elementData[size] = o; + size++; + } + public void add(int index, Object o){ + if (index > size || index < 0) { + throw new ArrayIndexOutOfBoundsException(); + } + ensureCapacity(size+1); + for (int i = size;i>index;i--) { + elementData[i] = elementData[i - 1]; + } + elementData[index] = o; + size++; + } + + public Object get(int index){ + if (index > size || index < 0) { + throw new ArrayIndexOutOfBoundsException(); + } + return elementData[index]; + } + + + public Object remove(int index){ + Object[] removeData = (Object[]) elementData[index]; + for (int i =index;i elementData.length) { + + elementData = Arrays.copyOf(elementData, minCapacity + DEFAULT_CAPACITY); + } + } + +} diff --git a/group05/183127807/HomeWork0226/src/com/coding/basic/BinaryTreeNode.java b/group05/183127807/HomeWork0226/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group05/183127807/HomeWork0226/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group05/183127807/HomeWork0226/src/com/coding/basic/Iterator.java b/group05/183127807/HomeWork0226/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group05/183127807/HomeWork0226/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group05/183127807/HomeWork0226/src/com/coding/basic/LinkedList.java b/group05/183127807/HomeWork0226/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..a1bbcad9db --- /dev/null +++ b/group05/183127807/HomeWork0226/src/com/coding/basic/LinkedList.java @@ -0,0 +1,142 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + private int size ; + + private Node current = head; + public LinkedList() { + head = null; + size = 0; + } + + public void add(Object o){ + Node newNode = new Node(); + newNode.data = o; + if (current.next == null) + { + current.next = newNode; + } + + while (current.next != null){ + current = current.next; + } + current.next = newNode; + size++; + + } + public void add(int index , Object o){ + + Node newNode = new Node(); + newNode.data = o; + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + for (int i = 0; i < index - 2; i++) { + + current = current.next; + } + + newNode.next = current.next; + current.next = newNode; + size++; + } + public Object get(int index){ + + + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } else if (index == 0) { + return head; + } + for (int i = 0;i + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group05/183127807/HomeWork0305/src/com/coderising/array/ArrayUtil.java b/group05/183127807/HomeWork0305/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..510efb2565 --- /dev/null +++ b/group05/183127807/HomeWork0305/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,201 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int length = origin.length; + for (int i = 0, j = length / 2; i < j; i++) { + int temp = origin[i]; + origin[i] = origin[length - i - 1]; + origin[length - i - 1] = temp; + } + } + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int newLength = 0; + for (int t : oldArray){ + newLength += t != 0 ? 1 : 0; + } + int[] newArr = new int[newLength]; + int i = 0; + for (int t : oldArray) { + if (t != 0) { + newArr[i] = t; + i++; + } + } + return newArr; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int array1Length = array1.length; + int array2Length = array2.length; + + int[] newArray=new int[array1Length+array2Length]; + + int i = 0, j = 0, index = 0; + + while (i < array1.length && j < array2.length) { + if (array1[i] <= array2[j]) { + if (array1[i] == array2[j]) { + j++; + } else { + newArray[index] = array1[i]; + i++; + index++; + } + } else { + newArray[index] = array2[j]; + j++; + index++; + } + } + //当array2为null + while (i < array1.length) { + newArray[index] = array1[i]; + index++; + i++; + } + //当array1为null + while (j < array2.length) { + newArray[index] = array2[j]; + j++; + index++; + } + return newArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int oldArrLength = oldArray.length; + int newArrLength = oldArrLength + size; + int[] newArray = new int[newArrLength]; + System.arraycopy(oldArray,0,newArray,0,newArrLength); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int[] fibonacci = new int[max]; + if (max <=1) { + return null; + } else if (max == 2) { + fibonacci[0] = 1; + fibonacci[1] = 1; + } else { + for (int i =2;i parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + View view = new View(); + SAXReader reader = new SAXReader(); + String classValue = ""; + + + try { + Document document= reader.read(new File("src/com/coderising/litestruts/struts.xml")); + //获取根节点 + Element rootElement = document.getRootElement(); + //根节点属性 + List elements = rootElement.elements(); + Element actionElement = null; + for (Element element : elements) { + Attribute actionNameAttr = element.attribute("name"); + if (actionNameAttr.getValue().equals(actionName)) { + Attribute classAttr = element.attribute("class"); + classValue = classAttr.getValue(); + actionElement = element; + } + } + + + + Class newClass = Class.forName(classValue); + Object function = newClass.newInstance(); + Field[] fields = newClass.getDeclaredFields(); + String jsp = ""; + + Set> entrySet = parameters.entrySet(); + for (Map.Entry entry:entrySet) { + String name = (String) entry.getKey(); + String password = (String) entry.getValue(); + + Method setName = newClass.getDeclaredMethod("setName", String.class); + setName.invoke(function, name); + + Method setPassword = newClass.getDeclaredMethod("setPassword", String.class); + setPassword.invoke(function, password); + + Method executeMethod = newClass.getDeclaredMethod("execute"); + executeMethod.invoke(function); + + List resultElements = actionElement.elements(); + for(Element e:resultElements) { + Attribute resultNameAttr = e.attribute("name"); + if ( resultNameAttr.getValue().equals(executeMethod.invoke(function))){ + jsp = e.getText(); + break; + } + } + } + + HashMap hashMap = new HashMap<>(); + for (Field field : fields) { + Method getMessage = newClass.getDeclaredMethod("getMessage"); + Object message = getMessage.invoke(function); + hashMap.put(field.getName(), message); + } + + view.setParameters(hashMap); + view.setJsp(jsp); + + + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return view; + } + +} diff --git a/group05/183127807/HomeWork0305/src/com/coderising/litestruts/StrutsTest.java b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group05/183127807/HomeWork0305/src/com/coderising/litestruts/View.java b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group05/183127807/HomeWork0305/src/com/coderising/litestruts/struts.xml b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..0325783136 --- /dev/null +++ b/group05/183127807/HomeWork0305/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group05/284422826/.gitignore b/group05/284422826/.gitignore new file mode 100644 index 0000000000..a906dbdd56 --- /dev/null +++ b/group05/284422826/.gitignore @@ -0,0 +1,11 @@ +/bin/ +/lib/ +/out/ +*.class +*.settings +*.project +*.classpath +*/.settings +*.iml +/.idea +/**/target/**/* diff --git a/group05/284422826/src/com/coderising/array/ArrayUtil.java b/group05/284422826/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..440a930be0 --- /dev/null +++ b/group05/284422826/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,268 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.List; + +public class ArrayUtil { + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public int[] reverseArray(int[] origin) { + if (origin == null || 0 == origin.length) { + throw new NullPointerException(); + } + + int N = origin.length; + for (int i = 0; i < N / 2; i++) { + int temp = origin[i]; + origin[i] = origin[N - 1 - i]; + origin[N - 1 - i] = temp; + } + + return origin; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + if (oldArray == null || 0 == oldArray.length) { + throw new NullPointerException(); + } + + int count = 0; + for (int i = 0; i < oldArray.length; i++) { + if (0 != oldArray[i]) { + count++; + } + } + + int[] newArray = new int[count]; + int j = 0; + for (int i = 0; i < oldArray.length; i++) { + if (0 != oldArray[i]) { + newArray[j] = oldArray[i]; + j++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + if (array1.length == 0 && array2.length == 0) { + throw new NullPointerException(); + } else if (array1.length == 0) { + return array2; + } else if (array2.length == 0) { + return array1; + } + int count = array1.length + array2.length; + for (int i = 0; i < array1.length; i++) { + for (int j = 0; j < array2.length; j++) { + if (array1[i] == array2[j]) { + count--; + } + } + } + int[] newArray = new int[count]; + int m = 0, n = 0; + for (int i = 0; i < count; i++) { + if (m == array1.length) { + System.arraycopy(array2, n, newArray, i, array2.length - n); + break; + } + + if (n == array2.length) { + System.arraycopy(array1, m, newArray, i, array1.length - m); + break; + } + + if (array1[m] < array2[n]) { + newArray[i] = array1[m]; + m++; + } else if (array1[m] == array2[n]) { + newArray[i] = array1[m]; + m++; + n++; + } else { + newArray[i] = array2[n]; + n++; + } + } + return newArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + if (oldArray == null || 0 == oldArray.length) { + int[] array = new int[size]; + return array; + } + int[] target = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, target, 0, oldArray.length); + return target; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (0 == max) { + throw new IllegalArgumentException(); + } else if (1 == max) { + int[] array = {}; + return array; + } + + int length = 0; + List list = new ArrayList<>(); + for (int i = 1; i < max; i++) { + if (fibo(i) < max) { + length++; + list.add(fibo(i)); + } else { + break; + } + } + + int[] array = new int[length]; + for (int i = 0; i < length; i++) { + array[i] = list.get(i); + } + return array; + } + + + public int fibo(int N) { + if (N <= 2) { + return 1; + } else { + return fibo(N - 1) + fibo(N - 2); + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + List list = new ArrayList<>(); + + int count = 0; + for (int i = 0; i < max; i++) { + if (isPrime(i)) { + count++; + list.add(i); + } + } + + int[] array = new int[count]; + for (int i = 0; i < count; i++) { + array[i] = list.get(i); + } + + return array; + } + + public boolean isPrime(int N) { + if (N < 2) { + return false; + } + + for (int i = 2; i * i <= N; i++) { + if (N % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int count = 0; + List list = new ArrayList<>(); + for (int i = 1; i < max; i++) { + if (isPerfectNumber(i)) { + count++; + list.add(i); + } + } + + int[] array = new int[count]; + for (int i = 0; i < count; i++) { + array[i] = list.get(i); + } + return array; + } + + public boolean isPerfectNumber(int N) { + int sum = 0; + for (int i = 1; i < N; i++) { + if (N % i == 0) { + sum += i; + } + } + return sum == N; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length - 1; i++) { + sb.append(array[i]).append(seperator); + } + sb.append(array[array.length - 1]); + return sb.toString(); + } +} diff --git a/group05/284422826/src/com/coderising/array/ArrayUtilTest.java b/group05/284422826/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..0b37ac11fb --- /dev/null +++ b/group05/284422826/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,82 @@ +package com.coderising.array; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class ArrayUtilTest { + private ArrayUtil arrayUtil = null; + + @Before + public void setUp() throws Exception { + arrayUtil = new ArrayUtil(); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void reverseArray() throws Exception { + int[] a = {7, 9, 30, 3}; + int[] b = {3, 30, 9, 7}; + assertArrayEquals(arrayUtil.reverseArray(a), b); + } + + @Test + public void removeZero() throws Exception { + int[] oldArr = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + int[] newArray = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}; + assertArrayEquals(arrayUtil.removeZero(oldArr), newArray); + } + + @Test + public void merge() throws Exception { + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + int[] newArray = {3, 4, 5, 6, 7, 8}; + assertArrayEquals(arrayUtil.merge(a1, a2), newArray); + } + + @Test + public void grow() throws Exception { + int[] oldArray = {2, 3, 6}; + int size = 3; + int[] newArray = {2, 3, 6, 0, 0, 0}; + assertArrayEquals(arrayUtil.grow(oldArray, size), newArray); + } + + @Test + public void fibonacci() throws Exception { + int max = 15; + int[] array = {1, 1, 2, 3, 5, 8, 13}; + assertArrayEquals(arrayUtil.fibonacci(max), array); + } + + @Test + public void getPrimes() throws Exception { + int[] array = {2, 3, 5, 7, 11, 13, 17, 19}; + int max = 23; + assertArrayEquals(arrayUtil.getPrimes(max), array); + } + + @Test + public void getPerfectNumbers() throws Exception { + int max = 100; + int[] array = {6, 28}; + assertArrayEquals(arrayUtil.getPerfectNumbers(max), array); + } + + @Test + public void join() throws Exception { + int[] array = {3, 8, 9}; + String seperator = "-"; + String str = "3-8-9"; + Assert.assertEquals(arrayUtil.join(array, seperator), str); + } + +} \ No newline at end of file diff --git a/group05/284422826/src/com/coderising/litestruts/LoginAction.java b/group05/284422826/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group05/284422826/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group05/284422826/src/com/coderising/litestruts/Struts.java b/group05/284422826/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..4d9004db93 --- /dev/null +++ b/group05/284422826/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,143 @@ +package com.coderising.litestruts; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + + +public class Struts { + private static String className = null; + + /* 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + public static View runAction(String actionName, Map parameters) { + View view = new View(); + Element element = null; + + element = parseXml(actionName); + Class clazz = null; + Object obj = null; + try { + clazz = Class.forName(className); + obj = clazz.newInstance(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } + + if (setValue(parameters, clazz, obj)) return null; + + String result = null; + + try { + Method method = clazz.getDeclaredMethod("execute"); + result = (String) method.invoke(obj); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + Map map = new HashMap(); + Field[] field = clazz.getDeclaredFields(); + try { + for (Field f : field) { + f.setAccessible(true); + String fieldName = f.toString().substring(f.toString().lastIndexOf(".")+1); + map.put(fieldName, f.get(obj)); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + view.setParameters(map); + view.setJsp(getResultString(result, element)); + + return view; + } + + private static boolean setValue(Map parameters, Class clazz, Object obj) { + for (Map.Entry entry : parameters.entrySet()) { + String name = entry.getKey(); + String value = entry.getValue(); + + if (name == null || "".equals(name)) { + System.out.println("属性名称不能为空!"); + return true; + } + System.out.println("Key = " + name + ", Value = " + value); + try { + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + field.set(obj, value); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + return false; + } + + private static Element parseXml(String name) { + Element el = null; + SAXReader reader = new SAXReader(); + try { + Document document = reader.read(new File("src/com/coderising/litestruts/struts.xml")); + Element root = document.getRootElement(); + Iterator it = root.elementIterator(); + while (it.hasNext()) { + Element element = ((Element) it.next()); + if (name.equals(element.attributeValue("name"))) { + className = element.attributeValue("class"); + el = element; + } + } + } catch (DocumentException e) { + e.printStackTrace(); + } + + return el; + } + + private static String getResultString(String name, Element element) { + String result = null; + Iterator iterator = element.elementIterator(); + while (iterator.hasNext()) { + Element e = ((Element) iterator.next()); + if (name.equals(e.attributeValue("name"))) { + result = e.getText(); + } + } + return result; + } + +} diff --git a/group05/284422826/src/com/coderising/litestruts/StrutsTest.java b/group05/284422826/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group05/284422826/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group05/284422826/src/com/coderising/litestruts/View.java b/group05/284422826/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group05/284422826/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group05/284422826/src/com/coderising/litestruts/struts.xml b/group05/284422826/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..a7cb57e188 --- /dev/null +++ b/group05/284422826/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group05/284422826/src/com/coding2017/basic/ArrayList.java b/group05/284422826/src/com/coding2017/basic/ArrayList.java new file mode 100644 index 0000000000..3d2182ae5a --- /dev/null +++ b/group05/284422826/src/com/coding2017/basic/ArrayList.java @@ -0,0 +1,130 @@ +package com.coding2017.basic; + +/** + * 功能:实现ArrayList. + * @author zhanglifeng. + */ +public class ArrayList implements List { + private int size = 0; //当前数组大小 + + private Object[] elementData = new Object[5]; //初始数组 + + /** + * 将对象o添加到ArrayList中. + * @param o:需要添加的对象. + */ + public void add(Object o) { + ensureCapacity(size + 1); //确保数组的容量可以装的下size + 1个元素,如果不够则扩容 + + elementData[size] = o; //将o添加到数组中 + size++; //数组大小增加1 + } + + /** + * 将对象o添加到ArrayList的指定位置. + * @param index: 指定位置. + * @param o: 需要添加的对象. + */ + public void add(int index, Object o) { + rangeCheck(index); //判断指定的位置index是否合法 + + ensureCapacity(size + 1); //确保数组的容量可以装的下size + 1个元素,如果不够则扩容 + + System.arraycopy(elementData, index, elementData, index + 1, size - index); //将index位置到结束位置所有的数组往后移动一个位置 + elementData[index] = o; //将对象o添加到index位置 + size++;//数组大小增加1 + } + + public Object get(int index) { + rangeCheck(index); + return elementData[index]; + } + + public Object remove(int index) { + rangeCheck(index); + + if (index != elementData.length - 1) { + System.arraycopy(elementData, index + 1, elementData, index, size - 1 - index); + } + + size--; + return elementData; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new ArrayListIterator(this); + } + + private void ensureCapacity(int number) { + if (number > elementData.length) { + elementData = grow(elementData, 1); + } + } + + public Object[] grow(Object[] src, int step) { + Object[] target = new Object[src.length + step]; + System.arraycopy(src, 0, target, 0, src.length); + return target; + } + + public void rangeCheck(int index){ + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + } + + private class ArrayListIterator implements Iterator { + ArrayList arrayList = null; + int current = 0; + + private ArrayListIterator(ArrayList arrayList) { + this.arrayList = arrayList; + } + + @Override + public boolean hasNext() { + current++; + return current > arrayList.size() ? false : true; + } + + @Override + public Object next() { + return elementData[current]; + } + + } + + public static void main(String[] args) { + ArrayList arrayList = new ArrayList(); + arrayList.add("s1"); + arrayList.add("s2"); + arrayList.add("s3"); + arrayList.add("s4"); + arrayList.add(3, "s33"); + arrayList.add("s5"); + + System.out.println(arrayList.size()); + + System.out.println(arrayList.get(2)); + + arrayList.remove(3); + + System.out.println(arrayList.size()); + + arrayList.add("s1"); + System.out.println(arrayList.size()); + arrayList.remove(5); + System.out.println(arrayList.size()); + + Iterator it = arrayList.iterator(); + while(it.hasNext()){ + System.out.print(it.next() + " "); + } + System.out.println(); + } + +} diff --git a/group05/284422826/src/com/coding2017/basic/BinaryTreeNode.java b/group05/284422826/src/com/coding2017/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..f4ce9f561c --- /dev/null +++ b/group05/284422826/src/com/coding2017/basic/BinaryTreeNode.java @@ -0,0 +1,37 @@ +package com.coding2017.basic; + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Object data) { + this.data = data; + left = null; + right = null; + } + + public Object getData() { + return this.data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return this.left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return this.right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group05/284422826/src/com/coding2017/basic/Iterator.java b/group05/284422826/src/com/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..19e214cfbb --- /dev/null +++ b/group05/284422826/src/com/coding2017/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding2017.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group05/284422826/src/com/coding2017/basic/LinkedList.java b/group05/284422826/src/com/coding2017/basic/LinkedList.java new file mode 100644 index 0000000000..f0ab5d7969 --- /dev/null +++ b/group05/284422826/src/com/coding2017/basic/LinkedList.java @@ -0,0 +1,168 @@ +package com.coding2017.basic; + +import java.util.NoSuchElementException; + +/** + * 功能:实现LinkedList. + * @author zhanglifeng. + */ +public class LinkedList implements List { + private Node head, tail; + private int size; + + private Node getNodeByIndex(int index) { + if (index < 0 || index > size - 1) { + throw new IndexOutOfBoundsException("线性表索引越界"); + } + Node current = head; + for (int i = 0; i < size && current != null; i++, current = current.next) { + if (i == index) { + return current; + } + } + return null; + } + + public void add(Object o) { + addLast(o); + } + + public void add(int index, Object o) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("线性表索引越界"); + } + + if (0 == index) { + addFirst(o); + }else{ + Node node = getNodeByIndex(index - 1); + node.next = new Node(o, node.next); + size ++; + } + } + + public Object get(int index) { + return getNodeByIndex(index).data; + } + + public Object remove(int index) { + if (index < 0 || index > size - 1) { + throw new IndexOutOfBoundsException("线性表索引越界"); + } + + if(0 == index){ + return removeFirst(); + }else if(size - 1 == index){ + return removeLast(); + }else{ + Node node = getNodeByIndex(index); + Node preNode = getNodeByIndex(index - 1); + preNode.next = node.next; + size --; + return node.data; + } + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node currentHead = head; + Node newNode = new Node(o, currentHead); + head = newNode; + if(currentHead == null){ + tail = newNode; + } + + size++; + } + + public void addLast(Object o) { + Node currentTail = tail; + Node newNode = new Node(o, null); + tail = newNode; + if(currentTail == null){ + head = newNode; + }else { + currentTail.next = newNode; + } + size++; + } + + public Object removeFirst() { + if(head == null){ + throw new NoSuchElementException(); + } + Node node = new Node(head.data, null); + head = head.next; + size --; + return node.data; + } + + public Object removeLast() { + if(tail == null){ + throw new NoSuchElementException(); + } + Node node = getNodeByIndex(size - 1); + node.next = null; + size --; + return node.data; + } + + public Iterator iterator() { + return new LinkedListIterator(this); + } + + private static class Node { + Object data; + Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + private class LinkedListIterator implements Iterator { + LinkedList linkedList = null; + private int current = 0; + + public LinkedListIterator(LinkedList linkedList) { + this.linkedList = linkedList; + } + + @Override + public boolean hasNext() { + return current < size; + } + + @Override + public Object next() { + return linkedList.get(current ++); + } + } + + public static void main(String[] args) { + LinkedList linkedList = new LinkedList(); + linkedList.add("s1"); + linkedList.add("s2"); + linkedList.add("s3"); + linkedList.addFirst("s0"); + linkedList.addLast("s4"); + + Iterator it = linkedList.iterator(); + while(it.hasNext()){ + System.out.print(it.next() + " "); + } + System.out.println(); + System.out.println("第3个元素:" + linkedList.get(3)); + + System.out.println(linkedList.removeFirst()); + System.out.println(linkedList.size()); + System.out.println("Last element:" + linkedList.removeLast()); + System.out.println(linkedList.size()); + System.out.println("第2个元素:" + linkedList.remove(2)); + System.out.println(linkedList.size()); + } +} diff --git a/group05/284422826/src/com/coding2017/basic/List.java b/group05/284422826/src/com/coding2017/basic/List.java new file mode 100644 index 0000000000..25c197cc18 --- /dev/null +++ b/group05/284422826/src/com/coding2017/basic/List.java @@ -0,0 +1,9 @@ +package com.coding2017.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group05/284422826/src/com/coding2017/basic/Queue.java b/group05/284422826/src/com/coding2017/basic/Queue.java new file mode 100644 index 0000000000..57d63f43bf --- /dev/null +++ b/group05/284422826/src/com/coding2017/basic/Queue.java @@ -0,0 +1,25 @@ +package com.coding2017.basic; + +import java.util.EmptyStackException; + +public class Queue { + private LinkedList elementData = new LinkedList(); + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + if (elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group05/284422826/src/com/coding2017/basic/Stack.java b/group05/284422826/src/com/coding2017/basic/Stack.java new file mode 100644 index 0000000000..16e72a3942 --- /dev/null +++ b/group05/284422826/src/com/coding2017/basic/Stack.java @@ -0,0 +1,31 @@ +package com.coding2017.basic; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(0); + } + + public Object pop(){ + if (elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + if (elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group05/289326186/.classpath b/group05/289326186/.classpath new file mode 100644 index 0000000000..fe22904a9e --- /dev/null +++ b/group05/289326186/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group05/289326186/.gitignore b/group05/289326186/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group05/289326186/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group05/289326186/.project b/group05/289326186/.project new file mode 100644 index 0000000000..5364d34f0e --- /dev/null +++ b/group05/289326186/.project @@ -0,0 +1,23 @@ + + + work + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + + diff --git a/group05/289326186/.settings/org.eclipse.jdt.core.prefs b/group05/289326186/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..0c68a61dca --- /dev/null +++ b/group05/289326186/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group05/289326186/.settings/org.eclipse.wst.common.project.facet.core.xml b/group05/289326186/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000000..f4ef8aa0a5 --- /dev/null +++ b/group05/289326186/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,4 @@ + + + + diff --git a/group05/289326186/src/com/coderising/array/ArrayUtil.java b/group05/289326186/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..628bb4564c --- /dev/null +++ b/group05/289326186/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,270 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public int[] reverseArray(int[] origin) { + int[] array = new int[origin.length]; + for (int i = 0; i < origin.length; i++) { + array[i] = origin[origin.length - 1 - i]; + } + return array; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray) { + int length = 0; + for (int arr : oldArray) { + if (arr != 0) { + length++; + } + } + int[] newArray = new int[length]; + int j = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[j] = oldArray[i]; + j++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + public int[] merge(int[] array1, int[] array2) { + Set set = new TreeSet(); + + List list1 = new ArrayList(); + List list2 = new ArrayList(); + for (int i = 0; i < array1.length; i++) { + list1.add(array1[i]); + } + for (int i = 0; i < array2.length; i++) { + list1.add(array2[i]); + } + set.addAll(list1); + set.addAll(list2); + int length = set.size(); + int[] array = new int[length]; + int i = 0; + for (int a : set) { + array[i] = a; + i++; + } + return array; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int length = oldArray.length + size; + int[] newArray = new int[length]; + for (int i = 0; i < newArray.length; i++) { + if (i > oldArray.length - 1) { + newArray[i] = 0; + } else { + newArray[i] = oldArray[i]; + } + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max < 2) { + int[] array = {}; + return array; + } + List list = new ArrayList(); + for (int i = 1; i < max; i++) { + System.out.println("iiiii:" + getFibonacci(i)); + if (max < getFibonacci(i)) { + break; + } else { + list.add(getFibonacci(i)); + } + } + int[] array = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + return array; + } + + /** + * 获取斐波那契数列 + * + * @param n + * @return + */ + private int getFibonacci(int n) { + if (n <= 2) { + return 1; + } else { + return getFibonacci(n - 1) + getFibonacci(n - 2); + } + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + List list = new ArrayList(); + for (int i = 1; i < max; i++) { + if (isPrime(i)) { + list.add(i); + } + } + int[] array = new int[list.size()]; + for (int i = 0; i < array.length; i++) { + array[i] = list.get(i); + } + return array; + } + + /** + * 判断一个数是否为素数 + * + * @param a + * @return + */ + private boolean isPrime(int a) { + if (a < 2) + return false; + for (int i = 2; i < a; i++) { + if (a % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + List list = new ArrayList(); + int sum = 0; + for(int i=1; i parameters) throws Exception { + // 0. 读取配置文件struts.xml + // 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + // 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + // ("name"="test" , "password"="1234") , + // 那就应该调用 setName和setPassword方法 + // + // 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + // + // 3. 通过反射找到对象的所有getter方法(例如 getMessage), + // 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + // 放到View对象的parameters + // + // 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + // 放到View对象的jsp字段中。 + View view = new View(); + // 0. 读取配置文件struts.xml + SAXReader reader = new SAXReader(); + // 读取文件 转换成Document + Document document = reader.read(new File("src/com/coderising/litestruts/struts.xml")); + // 获取根节点元素对象 + Element root = document.getRootElement(); + //根节点的元素 + Iterator it = root.elementIterator(); + while(it.hasNext()){ + Element e = (Element) it.next(); + if(actionName.equals(e.attributeValue("name"))){ + // 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + String className = e.attributeValue("class"); + Class clazz = Class.forName(className); + Object obj = clazz.newInstance(); + //获取类的所有属性 + BeanInfo beanInfo = Introspector.getBeanInfo(clazz); + PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); + for(PropertyDescriptor pd : pds){ + for (Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + if(pd.getName().equals(key)){ + Method setMethod = pd.getWriteMethod();//获得set方法 + setMethod .invoke(obj, entry.getValue());//调用 + break; + } + } + } + //2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method method = clazz.getMethod("execute", null); + Object result = method.invoke(obj); + Map map = new HashMap(); + if("success".equals(result)){ + map.put("message", "login successful"); + }else{ + map.put("message", "login failed,please check your user/pwd"); + } + // 3. 通过反射找到对象的所有getter方法(例如 getMessage), + // 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + // 放到View对象的parameters + for(PropertyDescriptor pd : pds){ + for (Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + if(pd.getName().equals(key)){ + Method getMethod = pd.getReadMethod();//获得get方法 + Object getresult = getMethod .invoke(obj);//调用 + map.put(pd.getName(), getresult.toString()); + break; + } + } + } + view.setParameters(map); + //遍历action的子元素 + Iterator it2 = e.elementIterator(); + while(it2.hasNext()){ + Element resultEle = (Element) it2.next(); + if(resultEle.attributeValue("name").equals(result)){ + view.setJsp(resultEle.getText()); + break; + } + } + } + } + return view; + } + + public static void main(String[] args) throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + View view = runAction(actionName, params); + System.out.println("view jsp:"+view.getJsp()); + System.out.println("view param:"+view.getParameters()); + } + +} diff --git a/group05/289326186/src/com/coderising/litestruts/StrutsTest.java b/group05/289326186/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..c4e1f588d0 --- /dev/null +++ b/group05/289326186/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws Exception { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group05/289326186/src/com/coderising/litestruts/View.java b/group05/289326186/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group05/289326186/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group05/289326186/src/com/coderising/litestruts/struts.xml b/group05/289326186/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group05/289326186/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group05/351592484/.gitignore b/group05/351592484/.gitignore new file mode 100644 index 0000000000..0aca6d5fe8 --- /dev/null +++ b/group05/351592484/.gitignore @@ -0,0 +1,9 @@ +/bin/ +*.class +*.settings +*.project +*.classpath +*/.settings +*.iml +/.idea +/**/target/**/* \ No newline at end of file diff --git a/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/ArrayList.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/ArrayList.java new file mode 100644 index 0000000000..e0fefc0ab9 --- /dev/null +++ b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/ArrayList.java @@ -0,0 +1,132 @@ +package com.github.zhanglifeng.coding2017.basic; + +import java.util.*; + +/** + * 功能:实现ArrayList. + * @author zhanglifeng. + */ +public class ArrayList implements List { + private int size = 0; //当前数组大小 + + private Object[] elementData = new Object[5]; //初始数组 + + /** + * 将对象o添加到ArrayList中. + * @param o:需要添加的对象. + */ + public void add(Object o) { + ensureCapacity(size + 1); //确保数组的容量可以装的下size + 1个元素,如果不够则扩容 + + elementData[size] = o; //将o添加到数组中 + size++; //数组大小增加1 + } + + /** + * 将对象o添加到ArrayList的指定位置. + * @param index: 指定位置. + * @param o: 需要添加的对象. + */ + public void add(int index, Object o) { + rangeCheck(index); //判断指定的位置index是否合法 + + ensureCapacity(size + 1); //确保数组的容量可以装的下size + 1个元素,如果不够则扩容 + + System.arraycopy(elementData, index, elementData, index + 1, size - index); //将index位置到结束位置所有的数组往后移动一个位置 + elementData[index] = o; //将对象o添加到index位置 + size++;//数组大小增加1 + } + + public Object get(int index) { + rangeCheck(index); + return elementData[index]; + } + + public Object remove(int index) { + rangeCheck(index); + + if (index != elementData.length - 1) { + System.arraycopy(elementData, index + 1, elementData, index, size - 1 - index); + } + + size--; + return elementData; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new ArrayListIterator(this); + } + + private void ensureCapacity(int number) { + if (number > elementData.length) { + elementData = grow(elementData, 1); + } + } + + public Object[] grow(Object[] src, int step) { + Object[] target = new Object[src.length + step]; + System.arraycopy(src, 0, target, 0, src.length); + return target; + } + + public void rangeCheck(int index){ + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + } + + private class ArrayListIterator implements Iterator { + ArrayList arrayList = null; + int current = 0; + + private ArrayListIterator(ArrayList arrayList) { + this.arrayList = arrayList; + } + + @Override + public boolean hasNext() { + current++; + return current > arrayList.size() ? false : true; + } + + @Override + public Object next() { + return elementData[current]; + } + + } + + public static void main(String[] args) { + ArrayList arrayList = new ArrayList(); + arrayList.add("s1"); + arrayList.add("s2"); + arrayList.add("s3"); + arrayList.add("s4"); + arrayList.add(3, "s33"); + arrayList.add("s5"); + + System.out.println(arrayList.size()); + + System.out.println(arrayList.get(2)); + + arrayList.remove(3); + + System.out.println(arrayList.size()); + + arrayList.add("s1"); + System.out.println(arrayList.size()); + arrayList.remove(5); + System.out.println(arrayList.size()); + + Iterator it = arrayList.iterator(); + while(it.hasNext()){ + System.out.print(it.next() + " "); + } + System.out.println(); + } + +} diff --git a/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..772f30c092 --- /dev/null +++ b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java @@ -0,0 +1,37 @@ +package com.github.zhanglifeng.coding2017.basic; + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Object data) { + this.data = data; + left = null; + right = null; + } + + public Object getData() { + return this.data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return this.left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return this.right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Iterator.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..288204f51f --- /dev/null +++ b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.github.zhanglifeng.coding2017.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java new file mode 100644 index 0000000000..c93a677bfd --- /dev/null +++ b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java @@ -0,0 +1,168 @@ +package com.github.zhanglifeng.coding2017.basic; + +import java.util.NoSuchElementException; + +/** + * 功能:实现LinkedList. + * @author zhanglifeng. + */ +public class LinkedList implements List { + private Node head, tail; + private int size; + + private Node getNodeByIndex(int index) { + if (index < 0 || index > size - 1) { + throw new IndexOutOfBoundsException("线性表索引越界"); + } + Node current = head; + for (int i = 0; i < size && current != null; i++, current = current.next) { + if (i == index) { + return current; + } + } + return null; + } + + public void add(Object o) { + addLast(o); + } + + public void add(int index, Object o) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("线性表索引越界"); + } + + if (0 == index) { + addFirst(o); + }else{ + Node node = getNodeByIndex(index - 1); + node.next = new Node(o, node.next); + size ++; + } + } + + public Object get(int index) { + return getNodeByIndex(index).data; + } + + public Object remove(int index) { + if (index < 0 || index > size - 1) { + throw new IndexOutOfBoundsException("线性表索引越界"); + } + + if(0 == index){ + return removeFirst(); + }else if(size - 1 == index){ + return removeLast(); + }else{ + Node node = getNodeByIndex(index); + Node preNode = getNodeByIndex(index - 1); + preNode.next = node.next; + size --; + return node.data; + } + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node currentHead = head; + Node newNode = new Node(o, currentHead); + head = newNode; + if(currentHead == null){ + tail = newNode; + } + + size++; + } + + public void addLast(Object o) { + Node currentTail = tail; + Node newNode = new Node(o, null); + tail = newNode; + if(currentTail == null){ + head = newNode; + }else { + currentTail.next = newNode; + } + size++; + } + + public Object removeFirst() { + if(head == null){ + throw new NoSuchElementException(); + } + Node node = new Node(head.data, null); + head = head.next; + size --; + return node.data; + } + + public Object removeLast() { + if(tail == null){ + throw new NoSuchElementException(); + } + Node node = getNodeByIndex(size - 1); + node.next = null; + size --; + return node.data; + } + + public Iterator iterator() { + return new LinkedListIterator(this); + } + + private static class Node { + Object data; + Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + private class LinkedListIterator implements Iterator { + LinkedList linkedList = null; + private int current = 0; + + public LinkedListIterator(LinkedList linkedList) { + this.linkedList = linkedList; + } + + @Override + public boolean hasNext() { + return current < size; + } + + @Override + public Object next() { + return linkedList.get(current ++); + } + } + + public static void main(String[] args) { + LinkedList linkedList = new LinkedList(); + linkedList.add("s1"); + linkedList.add("s2"); + linkedList.add("s3"); + linkedList.addFirst("s0"); + linkedList.addLast("s4"); + + Iterator it = linkedList.iterator(); + while(it.hasNext()){ + System.out.print(it.next() + " "); + } + System.out.println(); + System.out.println("第3个元素:" + linkedList.get(3)); + + System.out.println(linkedList.removeFirst()); + System.out.println(linkedList.size()); + System.out.println("Last element:" + linkedList.removeLast()); + System.out.println(linkedList.size()); + System.out.println("第2个元素:" + linkedList.remove(2)); + System.out.println(linkedList.size()); + } +} diff --git a/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/List.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/List.java new file mode 100644 index 0000000000..e6f5743399 --- /dev/null +++ b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/List.java @@ -0,0 +1,9 @@ +package com.github.zhanglifeng.coding2017.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Queue.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Queue.java new file mode 100644 index 0000000000..42ef512321 --- /dev/null +++ b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Queue.java @@ -0,0 +1,25 @@ +package com.github.zhanglifeng.coding2017.basic; + +import java.util.EmptyStackException; + +public class Queue { + private LinkedList elementData = new LinkedList(); + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + if (elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Stack.java b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Stack.java new file mode 100644 index 0000000000..0761bdd9e7 --- /dev/null +++ b/group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Stack.java @@ -0,0 +1,31 @@ +package com.github.zhanglifeng.coding2017.basic; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(0); + } + + public Object pop(){ + if (elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + if (elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group05/371492887/task_01/.classpath b/group05/371492887/task_01/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group05/371492887/task_01/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group05/371492887/task_01/.gitignore b/group05/371492887/task_01/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group05/371492887/task_01/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group05/371492887/task_01/.project b/group05/371492887/task_01/.project new file mode 100644 index 0000000000..7d3cdc32b3 --- /dev/null +++ b/group05/371492887/task_01/.project @@ -0,0 +1,17 @@ + + + task_01 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group05/371492887/task_01/src/com/nitasty/test/ArrayListTest.java b/group05/371492887/task_01/src/com/nitasty/test/ArrayListTest.java new file mode 100644 index 0000000000..1112448763 --- /dev/null +++ b/group05/371492887/task_01/src/com/nitasty/test/ArrayListTest.java @@ -0,0 +1,95 @@ +package com.nitasty.test; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import com.nitasty.util.ArrayList; +import com.nitasty.util.Iterator; + +public class ArrayListTest { + + private ArrayList list; + + @Before + public void init(){ + list=new ArrayList(); + for (int i = 0; i < 100; i++) { + list.add(i); + } + } + + @Test + public void testAddObject() { + list.add(100); + Assert.assertEquals(101, list.size()); + } + + @Test + public void testAddIntObject() { + list.add(3,"test"); + Assert.assertEquals("test", list.get(3)); + } + + @Test + public void testRemoveInt() { + list.add(3,"test"); + list.remove(3); + Assert.assertEquals(3, list.get(3)); + } + + @Test + public void testRemoveObject() { + list.add(0,"test"); + list.remove("test"); + Assert.assertEquals(0, list.get(0)); + } + + + @Test + public void testIsEmpty() { + list.clear(); + Assert.assertEquals(true, list.isEmpty()); + } + + @Test + public void testContains() { + Assert.assertEquals(false, list.contains("test")); + list.add("test"); + Assert.assertEquals(true, list.contains("test")); + } + + + + @Test + public void testSet() { + Assert.assertEquals(true, list.contains(3)); + list.set(3, "test"); + Assert.assertEquals(true, list.contains("test")); + Assert.assertEquals(false, list.contains(3)); + } + + @Test + public void testIndexOf() { + list.set(3, "test"); + Assert.assertEquals(3, list.indexOf("test")); + } + + @Test + public void testLastIndexOf() { + list.set(3, "test"); + list.set(33, "test"); + Assert.assertEquals(33, list.lastIndexOf("test")); + } + + @Test + public void testHasNext(){ + int i=0; + for(Iterator it=list.iterator();it.hasNext();i++){ + Assert.assertEquals(i, it.next()); +// System.out.println(it.next()); + } + } +} diff --git a/group05/371492887/task_01/src/com/nitasty/test/BinaryTreeTest.java b/group05/371492887/task_01/src/com/nitasty/test/BinaryTreeTest.java new file mode 100644 index 0000000000..8e3ddff3b9 --- /dev/null +++ b/group05/371492887/task_01/src/com/nitasty/test/BinaryTreeTest.java @@ -0,0 +1,66 @@ +package com.nitasty.test; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import com.nitasty.util.BinaryTree; + +public class BinaryTreeTest { + + BinaryTree tree; + + @Before + public void init(){ + tree=new BinaryTree(); + tree.insert(5); + tree.insert(3); + tree.insert(8); + tree.insert(2); + tree.insert(7); + tree.insert(9); + tree.insert(1); + tree.insert(4); + tree.insert(10); + tree.insert(6); + } + + @Test + public void testMakeEmpty() { + tree.makeEmpty(); + Assert.assertEquals(true, tree.isEmpty()); + } + + @Test + public void testGetHeight() { + Assert.assertEquals(3, tree.getHeight()); + } + + @Test + public void testContains() { + for (int i = 1; i < 11; i++) { + Assert.assertEquals(true, tree.contains(i)); + } + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin()); + } + + @Test + public void testFindMax() { + Assert.assertEquals(10, tree.findMax()); + } + + + @Test + public void testRemove() { + tree.remove(3); + Assert.assertEquals(false, tree.contains(3)); + } + + +} diff --git a/group05/371492887/task_01/src/com/nitasty/test/LinkedListTest.java b/group05/371492887/task_01/src/com/nitasty/test/LinkedListTest.java new file mode 100644 index 0000000000..4bf298b8fa --- /dev/null +++ b/group05/371492887/task_01/src/com/nitasty/test/LinkedListTest.java @@ -0,0 +1,142 @@ +package com.nitasty.test; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import com.nitasty.util.ArrayList; +import com.nitasty.util.Iterator; +import com.nitasty.util.LinkedList; + +public class LinkedListTest { + + private LinkedList list; + + @Before + public void init(){ + list=new LinkedList(); + for (int i = 0; i < 100; i++) { + list.add(i); + } + } + + @Test + public void testGet() { + IndexOutOfBoundsException tx=null; + for (int i = 0; i < 100; i++) { + Assert.assertEquals(i, list.get(i)); + } + + try { + list.get(100); + } catch (IndexOutOfBoundsException e) { + tx=e; + } + Assert.assertEquals(IndexOutOfBoundsException.class,tx.getClass()); + } + + @Test + public void testRemoveInt() { + for (int i = 99; i >= 0; i--) { + Assert.assertEquals(i, list.remove(i)); + } + } + + @Test + public void testSize() { + Assert.assertEquals(100, list.size()); + } + + @Test + public void testAddFirst() { + list.addFirst(-1); + for (int i = 0; i < 101; i++) { + Assert.assertEquals(i-1, list.get(i)); + } + } + + @Test + public void testAddLast() { + + for (int i = 100; i < 1000; i++) { + list.addLast(i); + } + + for (int i = 0; i < 1000; i++) { + Assert.assertEquals(i, list.get(i)); + } + } + + @Test + public void testAddBefore() { + list.addBefore(66,list.node(3)); + Assert.assertEquals(66, list.get(3)); + } + + @Test + public void testAddAfter() { + list.addAfter(66,list.node(3)); + Assert.assertEquals(66, list.get(4)); + } + + @Test + public void testIsEmpty() { + list.clear(); + Assert.assertEquals(true, list.isEmpty()); + } + + @Test + public void testContains() { + for (int i = 0; i < 100; i++) { + Assert.assertEquals(true, list.contains(i)); + Assert.assertEquals(false, list.contains(i+100)); + } + } + + + @Test + public void testAddIntObject() { + list.add(20,"test"); + Assert.assertEquals("test", list.get(20)); + } + + @Test + public void testRemoveObject() { + list.remove(30); + Assert.assertEquals(31, list.get(30)); + } + + @Test + public void testSet() { + for (int i = 0; i < 100; i++) { + list.set(i, i+100); + Assert.assertEquals(i+100, list.get(i)); + } + } + + @Test + public void testIndexOf() { + list.set(3, "test"); + Assert.assertEquals(3, list.indexOf("test")); + } + + @Test + public void testLastIndexOf() { + list.set(3, "test"); + list.set(33, "test"); + Assert.assertEquals(33, list.lastIndexOf("test")); + } + + @Test + public void testHasNext(){ + int i=0; + + for(Iterator it=list.iterator();it.hasNext();i++){ + Assert.assertEquals(i, it.next()); +// System.out.println(it.next()); + } + } + +} diff --git a/group05/371492887/task_01/src/com/nitasty/test/QueueTest.java b/group05/371492887/task_01/src/com/nitasty/test/QueueTest.java new file mode 100644 index 0000000000..76d52822eb --- /dev/null +++ b/group05/371492887/task_01/src/com/nitasty/test/QueueTest.java @@ -0,0 +1,49 @@ +package com.nitasty.test; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import com.nitasty.util.LinkedList; +import com.nitasty.util.Queue; + +public class QueueTest { + + Queue queue; + + @Before + public void init(){ + queue=new Queue(); + for (int i = 0; i < 100; i++) { + queue.enQueue(i); + } + } + + @Test + public void testDeQueue() { + for(int i=0; i<100;i++){ + Assert.assertEquals(i, queue.deQueue()); + } + } + + @Test + public void testIsEmpty() { + for(int i=0; i<100;i++){ + queue.deQueue(); + if(i<99) + Assert.assertEquals(false, queue.isEmpty()); + } + Assert.assertEquals(true, queue.isEmpty()); + } + + @Test + public void testSize() { + for(int i=99; i>0;i--){ + queue.deQueue(); + Assert.assertEquals(i, queue.size()); + } + } + +} diff --git a/group05/371492887/task_01/src/com/nitasty/test/StackTest.java b/group05/371492887/task_01/src/com/nitasty/test/StackTest.java new file mode 100644 index 0000000000..6ddead376d --- /dev/null +++ b/group05/371492887/task_01/src/com/nitasty/test/StackTest.java @@ -0,0 +1,51 @@ +package com.nitasty.test; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import com.nitasty.util.LinkedList; +import com.nitasty.util.Stack; + +public class StackTest { + + Stack stack; + + @Before + public void init(){ + stack=new Stack(); + for (int i = 0; i < 100; i++) { + stack.push(i); + } + } + + @Test + public void testPop() { + for (int i = 99; i >=0; i--) { + Assert.assertEquals(i, stack.pop()); + } + } + + @Test + public void testPeek() { + for (int i = 99; i >=0; i--) { + Assert.assertEquals(99, stack.peek()); + } + } + + @Test + public void testIsEmpty() { + for (int i = 99; i >=0; i--) { + stack.pop(); + } + Assert.assertEquals(true,stack.isEmpty()); + } + + @Test + public void testSize() { + Assert.assertEquals(100,stack.size()); + } + +} diff --git a/group05/371492887/task_01/src/com/nitasty/util/ArrayList.java b/group05/371492887/task_01/src/com/nitasty/util/ArrayList.java new file mode 100644 index 0000000000..3ea6765403 --- /dev/null +++ b/group05/371492887/task_01/src/com/nitasty/util/ArrayList.java @@ -0,0 +1,307 @@ +package com.nitasty.util; + +import java.util.Arrays; +import java.util.Objects; + +public class ArrayList implements List { + + // ڲ + private static final int DEFAULT_CAPACITY = 10; + + private static final Object[] EMPTY_ELEMENTDATA = {}; + + private int size; + + private Object[] elementData; + + /** + * + * ޲γʼΪ飬ʡռ + */ + public ArrayList() { + this.elementData = EMPTY_ELEMENTDATA; + } + + /** + * + * @param initCapacity + */ + public ArrayList(int initCapacity) { + if (initCapacity > 0) { + elementData = new Object[initCapacity]; + } else if (initCapacity == 0) { + elementData = EMPTY_ELEMENTDATA; + } else { + throw new IllegalArgumentException("Ƿʼ" + initCapacity); + } + + } + + // TODO + public ArrayList(List list) { + list.toArray(); + + } + + /** + * У + * + * @param minCapacity + */ + private void ensureCapacity(int minCapacity) { + + if (elementData.length < minCapacity) { + grow(minCapacity); + } + + } + + /** + * + * + * @param minCapacity + * @return + */ + private void grow(int minCapacity) { + // + int oldCapacity = this.elementData.length; + // Ϊ1.5 + int newCapacity = oldCapacity + oldCapacity >> 1; + // СȽ + if (newCapacity < minCapacity) { + newCapacity = minCapacity; + } + // ܴintֵ + if (newCapacity > Integer.MAX_VALUE) { + newCapacity = Integer.MAX_VALUE; + } + elementData = Arrays.copyOf(elementData, newCapacity); + + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean contains(Object o) { + return indexOf(o) >= 0; //д=ֵbug + } + + @Override + public boolean add(Object o) { + + ensureCapacity(size + 1); + + elementData[size++] = o;// sizeindex1 + + return true; + } + + private void rangeCheck(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + private String outOfBoundsMsg(int index) { + return "index:" + index + ", size:" + size; + } + + @Override + public boolean add(int index, Object o) { + + rangeCheck(index); + ensureCapacity(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size + - index);// sizeը + elementData[index] = o; + return true; + } + + @Override + public boolean addAll(Object[] o) { + int numNew = o.length; + ensureCapacity(size + numNew); + System.arraycopy(o, 0, elementData, size, numNew); + size += numNew;// size + return numNew != 0; + } + + @Override + public boolean addAll(int index, Object[] o) { + rangeCheck(index); + int numNew = o.length; + ensureCapacity(size + numNew); + + int numMoved = size - index;// rangeCheckindex϶Сsize + if (numMoved > 0) + System.arraycopy(elementData, index, elementData, size + numNew, + numNew);// ԭԪƵ + System.arraycopy(o, 0, elementData, index, numNew);// ƽҪӵԪ + + size += numNew;// Ҫ˰ + return numNew != 0; + } + + @Override + public Object remove(int index) { + rangeCheck(index); + Object oldValue = elementData[index]; + + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementData, index+1, elementData, index, + numMoved); + elementData[--size] = null;// Clear to let gc do its work + + return oldValue; + } + + @Override + public boolean remove(Object o) { + int index=this.indexOf(o); + if(index==-1){ + return false; + }else{ + this.remove(index); + return true; + } + } + + @Override + /** + * ɾlist + */ + public boolean removeAll(List list) { + Objects.requireNonNull(list); + return batchRemove(list,false); + } + + /** + * ʵremoveALlretainAll + * @param list + * @param complement + * @return + */ + private boolean batchRemove(List list, boolean complement) { + final Object[] elementData=this.elementData; + int r=0,w=0; + boolean modified=false; + try{ + for(;r= 0; i--) { + if (elementData[i] == null) { + return i; + } + } + } else { + for (int i = size-1; i >= 0; i--) { + if (o.equals(elementData[i])) { + return i; + } + } + } + return -1;// ûҵ + } + + @Override + public Iterator iterator() { + return new Itr(); + } + + @Override + public Object[] toArray() { + return Arrays.copyOf(elementData, size);//ҪֱӷelementData + } + + @Override + public void clear() { + for(int i=0; i ʵComparable + */ +public class BinaryTree> { + + private BinaryNode root; + + public BinaryTree(){ + this.root=null; + } + + public BinaryTree(BinaryNode root) { + this.root = root; + } + + public void makeEmpty(){ + root=null; + } + + public boolean isEmpty(){ + return root==null; + } + + public int getHeight(){ + return height(root); + } + + public boolean contains(E x){ + return contains(x,root); + } + + + public E findMin(){ + if(isEmpty()) + throw new NullPointerException();//׸ʲôأTODO + return (E) findMin(root).data; //ΪʲôҪתͣ + } + + + + public E findMax(){ + if(isEmpty()) + throw new NullPointerException();//׸ʲôأTODO + return (E) findMax(root).data;//ΪʲôҪתͣ + } + + public void insert(E x){ + root=insert(x,root);//ΪɶҪrootӷֵΪⷽǵݹ + } + + public void remove(E x){ + root=remove(x,root);//ΪɶҪrootӷֵΪⷽǵݹ + } + + //ӡdata + public void printTree(){ + if(isEmpty()) + System.out.println("Empty tree"); + else + printTree(root); + } + + public void printTreeStructure(){ + if(isEmpty()) + System.out.println("Empty tree"); + else + printTreeStructure(root,0); + } + + private void printTreeStructure(BinaryNode t,int i) { + StringBuffer buff=new StringBuffer(); + if(t!=null){ + for(int j=0;j= 0 && index < size; + } + + private boolean isPositionIndex(int index) { + return index >= 0 && index <= size; // postionӵ + } + + @Override + public boolean remove(Object o) { + + return false; + } + + @Override + public boolean removeAll(List list) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object set(int index, Object o) { + checkElementIndex(index); + Node node=node(index); + Object oldValue=node.data; + node.data=o; + return oldValue; + } + + @Override + public int indexOf(Object o) { + int index = 0; + if (o == null) { + for (Node x = first; x != null; x = x.next) { // µѭʽ + if (x.data == null) + return index; + index++; + } + } else { + for (Node x = first; x != null; x = x.next) { // µѭʽ + if (o.equals(x.data)) + return index; + index++; + } + } + return -1; + } + + @Override + public int lastIndexOf(Object o) { + int index = size-1; + if (o == null) { + for (Node x = last; x != null; x = x.prev) { // µѭʽ + if (x.data == null) + return index; + index--; + } + } else { + for (Node x = last; x != null; x = x.prev) { // µѭʽ + if (o.equals(x.data)) + return index; + index--; + } + } + return -1; + } + + @Override + public Object[] toArray() { + Object[] elementData = new Object[size]; + int i = 0; + for (Node x = first; x != null; x = x.next) { + elementData[i++] = x.data; + } + return elementData; + } + + @Override + public void clear() { + // bugը + // for(Node x=first;x!=null;x=x.next){ + // x=null; + // } + + for (Node x = first; x != null;) { + Node next = x.next; + x.prev = null; + x.data = null; + x.next = null; + x = next; + } + size = 0; + first = last = null; + } + + public Iterator iterator(){ + return new Itr(); + } + + private class Itr implements Iterator{ + private Node lastRetured; + private Node next; + int cursor; + + @Override + public boolean hasNext() { + return cursor + + + + + + + + + + + + + + + + + + + + diff --git a/group05/371492887/task_02/.gitignore b/group05/371492887/task_02/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group05/371492887/task_02/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group05/371492887/task_02/.project b/group05/371492887/task_02/.project new file mode 100644 index 0000000000..e6b71b0bcd --- /dev/null +++ b/group05/371492887/task_02/.project @@ -0,0 +1,23 @@ + + + task_02 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/group05/371492887/task_02/pom.xml b/group05/371492887/task_02/pom.xml new file mode 100644 index 0000000000..66ef7788e5 --- /dev/null +++ b/group05/371492887/task_02/pom.xml @@ -0,0 +1,37 @@ + + 4.0.0 + java_207 + task_02 + 0.0.1-SNAPSHOT + + + + dom4j + dom4j + 1.6.1 + + + + + src + + + src + + **/*.java + + + + + + maven-compiler-plugin + 3.1 + + + + + + + + \ No newline at end of file diff --git a/group05/371492887/task_02/src/com/coderising/action/LoginAction.java b/group05/371492887/task_02/src/com/coderising/action/LoginAction.java new file mode 100644 index 0000000000..5496d8084d --- /dev/null +++ b/group05/371492887/task_02/src/com/coderising/action/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.action; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group05/371492887/task_02/src/com/nitasty/array/ArrayUtil.java b/group05/371492887/task_02/src/com/nitasty/array/ArrayUtil.java new file mode 100644 index 0000000000..d71e83059d --- /dev/null +++ b/group05/371492887/task_02/src/com/nitasty/array/ArrayUtil.java @@ -0,0 +1,269 @@ +package com.nitasty.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class ArrayUtil { + + + public static void main(String[] args) { + ArrayUtil util=new ArrayUtil(); + + int[] origin={7, 9 ,10, 30, 3}; + util.reverseArray(origin); + int[] oldArray={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] a1={3, 5,7,9,10}; + int[] a2={4,6,100,111,132}; + + System.out.println(Arrays.toString(origin)); + System.out.println(Arrays.toString(util.removeZero(oldArray))); + System.out.println(Arrays.toString(util.merge(a1,a2))); + System.out.println(Arrays.toString(util.grow(a1,3))); + System.out.println(Arrays.toString(util.fibonacci(100))); + System.out.println(Arrays.toString(util.getPrimes(100))); + System.out.println(Arrays.toString(util.getPerfectNumbers(1000))); + System.out.println(util.join(oldArray,"--")); + } + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int dataBus; + int len=origin.length; + for(int i=0;i>1;i++){ + dataBus=origin[i]; + origin[i]=origin[len-i-1]; + origin[len-i-1]=dataBus; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int[] arrayBus=new int[oldArray.length]; + int count = 0; + //利用中间数值来剔除0 + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i]!=0) + arrayBus[count++]=oldArray[i]; + } + //返回新的数值 + int[] newArray=new int[count]; + System.arraycopy(arrayBus, 0, newArray, 0, count); + + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + //插入排序挺快的 + public int[] merge(int[] array1, int[] array2){ + int len1=array1.length; + int len2=array2.length; + List longList=new ArrayList(); + List shortList=new ArrayList(); + //数组转list,有没有简单的方法啊我擦 + if(len1>len2){ + for (int i = 0; i < len1; i++) { + longList.add(array1[i]); + } + for (int i = 0; i < len2; i++) { + shortList.add(array2[i]); + } + }else{ + for (int i = 0; i < len1; i++) { + shortList.add(array1[i]); + } + for (int i = 0; i < len2; i++) { + longList.add(array2[i]); + } + } + + //将短list中的值插入长list中 + int j=0; + for (int i = 0; i < longList.size(); i++) { + if(j==shortList.size()) + continue; + if((Integer)shortList.get(j)<(Integer)longList.get(i)){ + longList.add(i, shortList.get(j)); + j++; + }else if(((Integer)shortList.get(j)).equals((Integer)longList.get(i))){ + continue; + }else{ + if(i==(longList.size()-1)){ + longList.add(shortList.get(j)); + j++; + } + } + } + + //list再转数组···阿西吧 + int[] intArray=new int[longList.size()]; + + for (int i = 0; i < longList.size(); i++) { + intArray[i]=longList.get(i); + } + + return intArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int len=oldArray.length; + int[] newArray=new int[len+size]; + + System.arraycopy(oldArray, 0, newArray, 0, len); + + for(int i=len;i list=new ArrayList(); + for (int i = 1; i < max; i++) { + if(isPrimeNumber(i)) + list.add(i); + } + + int[] intArr=new int[list.size()]; + for (int i = 0; i < intArr.length; i++) { + intArr[i]=list.get(i); + } + return intArr; + } + + private boolean isPrimeNumber(int n) + { + if (n==2) + { + return true; + } + + if (n%2==0) + { + return false; + } + + int sqrtn=(int)Math.sqrt((double)n); + boolean flag=true; + + for (int i=3;i<=sqrtn;i+=2) + { + if (n%i==0) + { + flag=false; + } + } + return flag; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + + List list=new ArrayList(); + + for (int i = 1; i < max; i++) { + int sum=0; + for (int j = 1; j < i; j++) { + if(i%j==0) + sum+=j; + } + if(sum==i) + list.add(i); + } + + int[] intArr=new int[list.size()]; + for (int i = 0; i < intArr.length; i++) { + intArr[i]=list.get(i); + } + return intArr; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuffer buff=new StringBuffer(); + for (int i = 0; i < array.length; i++) { + buff.append(array[i]); + if(i parameters) { + + View view=new View(); + + /* + * + * 0. 读取配置文件struts.xml + * + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + */ + // 0.读取配置文件struts.xml + try { + // 将struts.xml转换成输入流 + InputStream in = new FileInputStream(new File( + "src/com/nitasty/litestruts/struts.xml")); + // 穿件SAXReader读取器,用于读取xml + SAXReader saxReader = new SAXReader(); + // + Document document = saxReader.read(in); + // 获取根节点对象 + Element rootElement = document.getRootElement(); + //获取action节点列表 + List elementList=rootElement.elements(); + //加载第一个action的class类 + Element login=elementList.get(0); + Class clazz=Class.forName(login.attribute("class").getStringValue()); + //new一个该class实例 + Object obj=clazz.newInstance(); + //获取name和password + String name=parameters.get("name"); + String password=parameters.get("password"); + //获取setName方法 + Method setName=clazz.getMethod("setName",String.class); + //获取setPassword方法 + Method setPassword=clazz.getMethod("setPassword",String.class); + //获取execute方法 + Method execute=clazz.getMethod("execute"); + + //执行获取的方法 + setName.invoke(obj,name); + setPassword.invoke(obj,password); + String result=(String) execute.invoke(obj); + List results=login.elements(); + for (int i = 0; i < results.size(); i++) { + if(result.equalsIgnoreCase(results.get(i).attribute(0).getStringValue())){ + view.setJsp(results.get(i).getTextTrim()); + } + } + + //获取message属性 + Field fld=clazz.getDeclaredField("message"); + //允许访问私有属性 + fld.setAccessible(true); + //获取该属性值 + String message=(String) fld.get(obj); + + //将结果返回 + Map map=new HashMap(); + map.put("message", message); + view.setParameters(map); + + + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + + return view; + } + + + /** + * 测试用 + * @param args + */ + public static void main(String[] args) { + // 0.读取配置文件struts.xml + try { + // 将struts.xml转换成输入流 + InputStream in = new FileInputStream(new File( + "src/com/nitasty/litestruts/struts.xml")); + // 创建SAXReader读取器,用于读取xml + SAXReader saxReader = new SAXReader(); + // + Document document = saxReader.read(in); + // 获取根节点对象 + Element rootElement = document.getRootElement(); + List elementList=rootElement.elements(); + + System.out.println(elementList.get(0).attribute("name").getStringValue()); + System.out.println(elementList.get(0).attribute("class").getStringValue()); + + + Class clazz=Class.forName(elementList.get(0).attribute("class").getStringValue()); + + Object obj=clazz.newInstance(); + + Method setName=clazz.getMethod("setName",String.class); + Method setPassword=clazz.getMethod("setPassword",String.class); + setName.invoke(obj,"test"); + setPassword.invoke(obj,"1234"); + Method execute=clazz.getMethod("execute"); + String str=(String) execute.invoke(obj); + Field fld=clazz.getDeclaredField("message"); + fld.setAccessible(true); + String message=(String) fld.get(obj); + + System.out.println(str); + System.out.println(message); + elementList.get(0).attribute("name").getStringValue(); + elementList.get(0).attribute("class").getStringValue(); + + Map map = new HashMap(); +// map = getAttributes(rootElement, map); + + // Element login=element.element("result"); + // System.out.println(login.getText()); + + // for (Iterator it=rootElement.elementIterator(); it.hasNext();) { + // System.out.println(it.next()); + // } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchMethodException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchFieldException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +} diff --git a/group05/371492887/task_02/src/com/nitasty/litestruts/StrutsTest.java b/group05/371492887/task_02/src/com/nitasty/litestruts/StrutsTest.java new file mode 100644 index 0000000000..1d6b7f5d77 --- /dev/null +++ b/group05/371492887/task_02/src/com/nitasty/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.nitasty.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group05/371492887/task_02/src/com/nitasty/litestruts/View.java b/group05/371492887/task_02/src/com/nitasty/litestruts/View.java new file mode 100644 index 0000000000..384b157268 --- /dev/null +++ b/group05/371492887/task_02/src/com/nitasty/litestruts/View.java @@ -0,0 +1,23 @@ +package com.nitasty.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group05/371492887/task_02/src/com/nitasty/litestruts/struts.xml b/group05/371492887/task_02/src/com/nitasty/litestruts/struts.xml new file mode 100644 index 0000000000..9d1c5b98f6 --- /dev/null +++ b/group05/371492887/task_02/src/com/nitasty/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group05/399258474/.classpath b/group05/399258474/.classpath new file mode 100644 index 0000000000..20f460c2a8 --- /dev/null +++ b/group05/399258474/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group05/399258474/.gitignore b/group05/399258474/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group05/399258474/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group05/399258474/.project b/group05/399258474/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group05/399258474/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group05/399258474/.settings/org.eclipse.jdt.core.prefs b/group05/399258474/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group05/399258474/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group05/399258474/src/com/coderising/array/ArrayUtil.java b/group05/399258474/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..f79bedefaa --- /dev/null +++ b/group05/399258474/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,247 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int[] arr = new int[origin.length]; + for (int i = 0; i < origin.length; i++) { + arr[i] = origin[origin.length-i-1]; + } + for (int i = 0; i < arr.length; i++) { + origin[i] = arr[i]; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int size = 0; + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i] != 0){ + size ++; + } + } + int[] newArray = new int[size]; + for (int i = 0,j = 0; i < oldArray.length; i++) { + if(oldArray[i] != 0){ + newArray[j] = oldArray[i]; + j++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int[] totalArr = new int[array1.length + array2.length]; + for (int i = 0; i < array1.length; i++) { + totalArr[i] = array1[i]; + } + for (int j = array1.length,i = 0; i < array2.length; i++) { + totalArr[j] = array2[i]; + j++; + } + //排序 + for (int i = 0; i < totalArr.length; i++) { + for (int j = 0; j < totalArr.length-i-1; j++) { + if(totalArr[j] > totalArr[j+1]){ + int temp = totalArr[j+1]; + + totalArr[j+1] = totalArr[j]; + totalArr[j] = temp; + } + } + } + //去重 + if(totalArr.length < 2){ + return totalArr; + } + int size = 1; + for (int i = 0; i < totalArr.length-1; i++) { + if(totalArr[i] != totalArr[i+1]){ + size ++ ; + } + } + int[] newArr = new int[size]; + for (int i = 0,j = 0; i < totalArr.length-1; i++) { + if(totalArr[i] != totalArr[i+1]){ + newArr[j] = totalArr[i]; + j++; + } + } + newArr[size-1] = totalArr[totalArr.length-1]; + + return newArr; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int size = 0; + while(f(size) < max){ + size++; + } + int[] arr = new int[size]; + for (int i = 0; i < arr.length; i++) { + arr[i] = f(i); + } + return arr; + } + + public int f(int n){ + if(n == 0 || n ==1){ + return 1; + }else{ + return f(n-1)+f(n-2); + } + + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if(max <= 2){ + return null; + } + int size = 1; + for (int i = 3; i < max; i++) { + int n = 2; + while(n < i){ + if(i%n == 0){ + break; + } + n++; + } + if(n == i){ + size ++; + } + } + int[] arr = new int[size]; + arr[0] = 2; + for (int i = 3,j = 1; i < max; i++) { + int n = 2; + while(n < i){ + if(i%n == 0){ + break; + } + n++; + } + if(n == i){ + arr[j] = i; + j ++; + } + } + return arr; + } + + + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + if(max <= 5){ + return null; + } + int size = 0; + for (int i = 6; i < max; i++) { + int sum = 0; + int n = 1; + while(n < i){ + if(i % n == 0){ + sum += n; + } + n++; + } + if(sum == i){ + size ++; + } + } + int[] arr = new int[size]; + for (int i = 6,j = 0; i < max; i++) { + int sum = 0; + int n = 1; + while(n < i){ + if(i % n == 0){ + sum += n; + } + n++; + } + if(sum == i){ + arr[j] = i; + j ++; + } + } + return arr; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + String str = ""; + for (int i = 0; i < array.length; i++) { + if(i != array.length-1){ + str += (array[i] + seperator); + }else{ + str += array[i]; + } + } + return str; + } + + +} diff --git a/group05/399258474/src/com/coderising/array/ArrayUtilTest.java b/group05/399258474/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..ebc8c910ac --- /dev/null +++ b/group05/399258474/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,92 @@ +package com.coderising.array; + +import java.util.Arrays; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.ArrayList; + +public class ArrayUtilTest { + ArrayUtil util = new ArrayUtil(); + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + System.out.println("-----------------------------"); + } + + @Test + public void reverseArraytest() { + int[] origin = new int[]{7,9,30,3}; + System.out.println(Arrays.toString(origin)); + util.reverseArray(origin); + System.out.println("数组置换:"+Arrays.toString(origin)); + } + + @Test + public void removeZeroTest(){ + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] newArr = util.removeZero(oldArr); + System.out.println(Arrays.toString(oldArr) +"数组去0后为:"+ Arrays.toString(newArr)); + } + + @Test + public void mergeTest(){ + int[] a1 = {3,5,7,8}; + int[] a2 = {4,5,6,7}; + int[] a3 = util.merge(a1, a2); + System.out.println(Arrays.toString(a1)+Arrays.toString(a2)+"合并、排序、去重后为:"+Arrays.toString(a3)); + } + + @Test + public void growTest(){ + int[] oldArray = {2,3,6}; + int i = 3; + int[] newArray = util.grow(oldArray, i); + System.out.println(Arrays.toString(oldArray) +" 扩容 "+ i +"后为:"+Arrays.toString(newArray)); + } + + @Test + public void fibonacciTest(){ + int i = 15; + int[] arr = util.fibonacci(i); + System.out.println("斐波那契数列最大数小于"+ i +"的数组是:" + Arrays.toString(arr)); + } + + @Test + public void getPrimesTest(){ + int max = 23; + int[] arr = util.getPrimes(max); + System.out.println("最大数小于"+ max +"的素数数组是:" + Arrays.toString(arr)); + } + + @Test + public void getPerfectNumbersTest(){ + int max = 1000; + int[] arr = util.getPerfectNumbers(max); + System.out.println("最大数小于"+ max +"的完数数组是:" + Arrays.toString(arr)); + } + + @Test + public void joinTest(){ + int[] arr = {3,8,9}; + String seperator = "-"; + String str = util.join(arr, seperator); + System.out.println(Arrays.toString(arr)+"数组用\""+seperator+"\"连接后为:"+str); + } + +} + + + + + + + + + diff --git a/group05/399258474/src/com/coderising/litestruts/LoginAction.java b/group05/399258474/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group05/399258474/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group05/399258474/src/com/coderising/litestruts/Struts.java b/group05/399258474/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..39a2033271 --- /dev/null +++ b/group05/399258474/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,162 @@ +package com.coderising.litestruts; + +import java.beans.PropertyDescriptor; +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + SAXReader saxReader = new SAXReader(); + View view = new View(); + try { + Document document = saxReader.read(new File("src/com/coderising/litestruts/struts.xml")); + //获取根元素 + Element root = document.getRootElement(); + //根据参数获取子元素 + List listElement=root.elements();//所有一级子节点的list + Element actionElement = null; + String classStr = ""; + for(Element e:listElement){ + Attribute actionNameAttr = e.attribute("name"); + if(actionNameAttr.getValue().equals(actionName)){ + //获取属性值 + Attribute classAttr = e.attribute("class"); + classStr = classAttr.getValue(); + actionElement = e; + break; + } + } + + //通过反射创建对象 + Class clazz = Class.forName(classStr); + Object c = clazz.newInstance(); + Field[] fields = clazz.getDeclaredFields(); + //通过set方法赋值 + Set> set = parameters.entrySet(); + for(Entry entry : set){ + String key = entry.getKey(); + String val = entry.getValue(); + for(Field f :fields){ + PropertyDescriptor pd = getPropertyDescriptor(clazz,key,true); + Method setMethod = pd.getWriteMethod(); + setMethod.invoke(c, new Object[]{val}); + } + } + + //通过返回值确定jsp + String jspStr = ""; + Method executeMethod = clazz.getDeclaredMethod("execute"); + executeMethod.setAccessible(true); + String str = (String) executeMethod.invoke(c); + List resultElements = actionElement.elements(); + for(Element e:resultElements){ + Attribute resultNameAttr = e.attribute("name"); + if(resultNameAttr.getValue().equals(str)){ + jspStr = e.getText(); + break; + } + + } + + //获取所有的get方法,存入map + HashMap map = new HashMap(); + for(Field f :fields){ + PropertyDescriptor pd = getPropertyDescriptor(clazz,f.getName(),false); + Method getMethod = pd.getReadMethod(); + Object value = getMethod.invoke(c, new Object[]{}); + map.put(f.getName(), value); + } + + //确定返回的View + + view.setJsp(jspStr); + view.setParameters(map); + + + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return view; + } + + public static PropertyDescriptor getPropertyDescriptor(Class clazz, String propertyName,boolean hasSetMethod) { + StringBuffer sb = new StringBuffer(); + Method setMethod = null; + Method getMethod = null; + PropertyDescriptor pd = null; + try { + Field f = clazz.getDeclaredField(propertyName);//根据字段名来获取字段 + if (f!= null) { + //构建方法的后缀 + String methodEnd = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1); + if(hasSetMethod){ + sb.append("set" + methodEnd); + setMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{ f.getType() }); + } + sb.delete(0, sb.length());//清空 + sb.append("get" + methodEnd);//构建get方法 + //构建get 方法 + getMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{ }); + //构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中 + pd = new PropertyDescriptor(propertyName, getMethod, setMethod); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + + return pd; + } + +} diff --git a/group05/399258474/src/com/coderising/litestruts/StrutsTest.java b/group05/399258474/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..fc750a77b4 --- /dev/null +++ b/group05/399258474/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,48 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws ClassNotFoundException { + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group05/399258474/src/com/coderising/litestruts/View.java b/group05/399258474/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group05/399258474/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group05/399258474/src/com/coderising/litestruts/struts.xml b/group05/399258474/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group05/399258474/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group05/399258474/src/com/coding/basic/ArrayList.java b/group05/399258474/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..30895b6dc5 --- /dev/null +++ b/group05/399258474/src/com/coding/basic/ArrayList.java @@ -0,0 +1,71 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + public void add(Object o){ + int len = elementData.length; + if(size >= len){ + Object[] new_elmentData = new Object[len*2]; + System.arraycopy(elementData, 0, new_elmentData, 0, size); + elementData = new_elmentData; + } + elementData[size] = o; + size ++; + } + public void add(int index, Object o){ + if(index >= size){ + throw new RuntimeException("下标越界"); + } + Object[] new_elementData = new Object[size+1]; + System.arraycopy(elementData, 0, new_elementData, 0, index); + System.arraycopy(elementData, index, new_elementData, index+1, size-index); + new_elementData[index] = o; + elementData = new_elementData; + size++; + } + + public Object get(int index){ + if(index >= size){ + throw new RuntimeException("下标越界"); + } + return elementData[index]; + } + + public Object remove(int index){ + if(index >= size){ + throw new RuntimeException("下标越界"); + } + Object oldElement = elementData[index]; + if((index+1) != size){ + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + } + elementData[size-1] = null; + size --; + return oldElement; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + + @Override + public String toString() { + String s = "{"; + for (int i = 0; i < size; i++) { + if(i == (size -1)){ + s += elementData[i] + "}"; + }else{ + s += elementData[i]+","; + } + } + return s; + } +} diff --git a/group05/399258474/src/com/coding/basic/BinaryTreeNode.java b/group05/399258474/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group05/399258474/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group05/399258474/src/com/coding/basic/Iterator.java b/group05/399258474/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group05/399258474/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group05/399258474/src/com/coding/basic/LinkedList.java b/group05/399258474/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..d2eea614df --- /dev/null +++ b/group05/399258474/src/com/coding/basic/LinkedList.java @@ -0,0 +1,104 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size; + + public LinkedList(){ + head = new Node(new Object(),null,null); + } + + public void add(Object o){ + Node last = head; + for (int i = 0; i < size; i++) { + last = last.next; + } + Node newNode = new Node(o,null,last); + last.next = newNode; + size++; + } + public void add(int index , Object o){ + Node oldNode = getNode(index); + Node newNode = new Node(o, oldNode, oldNode.prev); + oldNode.prev.next = newNode; + oldNode.prev = newNode; + size ++; + } + public Object get(int index){ + Node node = getNode(index); + return node.data; + } + + private Node getNode(int index){ + Node n = head.next; + for (int i = 0; i < index; i++) { + n = n.next; + } + return n; + } + + public Object remove(int index){ + Node node = getNode(index); + Object o =node.data; + Node prevNode = node.prev; + Node nextNode = node.next; + prevNode.next = nextNode; + nextNode.prev = prevNode; + node.next = node.prev =null; + node.data = null; + size --; + return o; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + add(0,o); + } + public void addLast(Object o){ + add(o); + } + public Object removeFirst(){ + Object o = remove(0); + return o; + } + public Object removeLast(){ + Object o = remove(size); + return o; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + Node prev; + + public Node(Object o,Node next,Node prev){ + this.data = o; + this.next = next; + this.prev = prev; + } + } + + @Override + public String toString() { + String s = "{"; + Node n = head; + for (int i = 0; i < size; i++) { + n = n.next; + if(i == (size -1)){ + s += n.data; + }else{ + s += n.data + ","; + } + } + s += "}"; + return s; + } +} diff --git a/group05/399258474/src/com/coding/basic/List.java b/group05/399258474/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group05/399258474/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group05/399258474/src/com/coding/basic/Queue.java b/group05/399258474/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..4682c35b15 --- /dev/null +++ b/group05/399258474/src/com/coding/basic/Queue.java @@ -0,0 +1,35 @@ +package com.coding.basic; + +public class Queue { + private LinkedList list = new LinkedList(); + + public void enQueue(Object o){ + list.add(o); + } + + public Object deQueue(){ + if(isEmpty()){ + throw new RuntimeException("已为空"); + } + Object o = list.get(0); + list.remove(0); + return o; + } + + public boolean isEmpty(){ + if(size() == 0){ + return true; + }else{ + return false; + } + } + + public int size(){ + return list.size(); + } + + @Override + public String toString() { + return list.toString(); + } +} diff --git a/group05/399258474/src/com/coding/basic/Stack.java b/group05/399258474/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..acbd84e37e --- /dev/null +++ b/group05/399258474/src/com/coding/basic/Stack.java @@ -0,0 +1,39 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if(isEmpty()){ + throw new RuntimeException("已为空"); + } + Object o = elementData.get(elementData.size()-1); + elementData.remove(elementData.size()-1); + return o; + } + + public Object peek(){ + Object o = elementData.get(elementData.size()-1); + return o; + } + public boolean isEmpty(){ + int size = elementData.size(); + if(size == 0){ + return true; + }else{ + return false; + } + } + public int size(){ + return elementData.size(); + } + + @Override + public String toString() { + return elementData.toString(); + } +} diff --git a/group05/399258474/src/com/coding/basic/test/BasicTest.java b/group05/399258474/src/com/coding/basic/test/BasicTest.java new file mode 100644 index 0000000000..7eb99ac5d3 --- /dev/null +++ b/group05/399258474/src/com/coding/basic/test/BasicTest.java @@ -0,0 +1,78 @@ +package com.coding.basic.test; + +import org.junit.Test; + +import com.coding.basic.ArrayList; +import com.coding.basic.LinkedList; +import com.coding.basic.Queue; +import com.coding.basic.Stack; + +public class BasicTest { + + @Test + public void ArrayListTest() { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(3); + System.out.println(list); + list.add(1, 99); + System.out.println(list); + list.remove(1); + System.out.println(list); + } + + @Test + public void LinkedListTest(){ + LinkedList l = new LinkedList(); + l.add(1); + l.add(2); + l.add(3); + System.out.println(l); + l.add(1, 99); + System.out.println(l); + l.remove(1); + System.out.println(l); + System.out.println(l.size()); + } + + @Test + public void StackTest(){ + Stack s = new Stack(); + s.push(1); + s.push(2); + System.out.println(s); + if(s.isEmpty()){ + System.out.println("空"); + }else{ + System.out.println("非空"); + + } + System.out.println(s.peek()); + s.pop(); + System.out.println(s); + s.pop(); + System.out.println(s); + if(s.isEmpty()){ + System.out.println("空"); + }else{ + System.out.println("非空"); + + } + s.pop(); + } + + @Test + public void QueueTest(){ + Queue q = new Queue(); + q.enQueue(1); + q.enQueue(2); + System.out.println(q); + q.deQueue(); + System.out.println(q); + q.enQueue(3); + System.out.println(q); + System.out.println(q.size()); + } + +} diff --git a/group05/441517454/work1/.classpath b/group05/441517454/work1/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group05/441517454/work1/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group05/441517454/work1/.gitignore b/group05/441517454/work1/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group05/441517454/work1/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group05/441517454/work1/.project b/group05/441517454/work1/.project new file mode 100644 index 0000000000..49a7fabffd --- /dev/null +++ b/group05/441517454/work1/.project @@ -0,0 +1,17 @@ + + + work1 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group05/441517454/work1/.settings/org.eclipse.jdt.core.prefs b/group05/441517454/work1/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group05/441517454/work1/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group05/441517454/work1/src/com/coding/basic/ArrayList.java b/group05/441517454/work1/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..01671f55d8 --- /dev/null +++ b/group05/441517454/work1/src/com/coding/basic/ArrayList.java @@ -0,0 +1,106 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + if(sizeindex;i--){ + elementData[i]=elementData[i-1]; + } + elementData[index] = o; + this.size++; + } + else if(index<(this.size)&&this.size==elementData.length) + { + elementData = grow(elementData,1); + elementData[index] = o; + this.size++; + } + else{ + System.out.println("index/>sizeʧ"); + + } + + + } + + public Object get(int index){ + + if(this.size>0&&index<(this.size)) + return elementData[index]; + else{ + return null; + } + } + + public Object remove(int index){ + + if(this.size>0&&index<(this.size)) + { Object o= elementData[index]; + for(int i=index;iarrayList.size){ + return false; + }else + return true; + } + + @Override + public Object next() { + + return arrayList.get(pos-1); + }} +} diff --git a/group05/441517454/work1/src/com/coding/basic/BinaryTreeNode.java b/group05/441517454/work1/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group05/441517454/work1/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group05/441517454/work1/src/com/coding/basic/Iterator.java b/group05/441517454/work1/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group05/441517454/work1/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group05/441517454/work1/src/com/coding/basic/LinkedList.java b/group05/441517454/work1/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..5eefddce8b --- /dev/null +++ b/group05/441517454/work1/src/com/coding/basic/LinkedList.java @@ -0,0 +1,156 @@ +package com.coding.basic; + + + +public class LinkedList implements List { + + private Node head; + private Node body; + //private Node body1; + private int size = 0; + + + public void add(Object o){ + if(null == head){ + head = new Node(); + head.data = o; + head.next = null; + size++; + } +// else if(head.next == null){ +// +// head.next =new Node(); +// head.next.data = o; +// head.next.next = null; +// body=head.next; +// size++; +// } + else { + body=head; + while(!(body.next ==null)) + {body =body.next;} + body.next =new Node(); + body.next.data =o; + body.next.next =null; + size++; + } + + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + if (index1) + {body=head; + for (int i=0;ilinkedList.size){ + return false; + }else + return true; + } + + @Override + public Object next() { + + return linkedList.get(pos-1); + }} +} diff --git a/group05/441517454/work1/src/com/coding/basic/List.java b/group05/441517454/work1/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group05/441517454/work1/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group05/441517454/work1/src/com/coding/basic/Queue.java b/group05/441517454/work1/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..cae520dbce --- /dev/null +++ b/group05/441517454/work1/src/com/coding/basic/Queue.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +public class Queue { + private ArrayList elementData = new ArrayList(); + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + + if(elementData.size()>0) + + { + elementData.remove(0); + return elementData.remove(0); + } + else return null; + } + + public boolean isEmpty(){ + if(elementData.size()>0) + return false; + else return true; + + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group05/441517454/work1/src/com/coding/basic/Stack.java b/group05/441517454/work1/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..40e8518b24 --- /dev/null +++ b/group05/441517454/work1/src/com/coding/basic/Stack.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if(elementData.size()>0) + + { int size =elementData.size(); + elementData.remove(size-1); + return elementData.remove(size-1);} + else return null; + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + if(elementData.size()>0) + return false; + else return true; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group05/441517454/work1/src/com/coding/basic/Test1.java b/group05/441517454/work1/src/com/coding/basic/Test1.java new file mode 100644 index 0000000000..b7f644c95d --- /dev/null +++ b/group05/441517454/work1/src/com/coding/basic/Test1.java @@ -0,0 +1,48 @@ +package com.coding.basic; + +public class Test1 { + public static void main (String[] args){ +// ArrayList arr = new ArrayList(); +// arr.add(1); +// arr.add(2); +// arr.add(3); +// arr.add(4); +// arr.remove(3); +// arr.add(6); +// arr.add(7); +// System.out.println(arr.size()+"_"); +// Iterator it =arr.iterator(); +// while(it.hasNext()){ +// System.out.println(it.next()); +// } +// LinkedList link = new LinkedList(); +// link.add(0); +// link.add(1); +// link.add(2); +// link.add(3); +// link.add(4); +// link.add(5); +// link.remove(2); +// link.addFirst(100); +// link.addLast(200); +// //link.removeFirst(); +// //link.removeLast(); +//// System.out.println(link.size()+"_"); +//// System.out.println(link.get(0)); +//// System.out.println(link.get(link.size()-1)); +//// +// +// Iterator it =link.iterator(); +// while(it.hasNext()){ +// System.out.println(it.next()); +// } + Stack st = new Stack(); + st.push(0); + st.push(1); + st.push(2); + st.push(4); + st.push(5); + st.pop(); + System.out.println(st.peek()); + } +} \ No newline at end of file diff --git a/group05/515505513/RemoteSystemsTempFiles/.project b/group05/515505513/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000000..5447a64fa9 --- /dev/null +++ b/group05/515505513/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group05/515505513/Task01/.classpath b/group05/515505513/Task01/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group05/515505513/Task01/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group05/515505513/Task01/.gitignore b/group05/515505513/Task01/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group05/515505513/Task01/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group05/515505513/Task01/.project b/group05/515505513/Task01/.project new file mode 100644 index 0000000000..cf494f7a91 --- /dev/null +++ b/group05/515505513/Task01/.project @@ -0,0 +1,17 @@ + + + Task01 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group05/515505513/Task01/.settings/org.eclipse.jdt.core.prefs b/group05/515505513/Task01/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group05/515505513/Task01/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group05/515505513/Task01/src/com/coding/basic/ArrayList.java b/group05/515505513/Task01/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..29fc9b98cb --- /dev/null +++ b/group05/515505513/Task01/src/com/coding/basic/ArrayList.java @@ -0,0 +1,78 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + + private int size = 0; + private static final int DEFAULT_SIZE = 100; + private Object[] elementData = new Object[DEFAULT_SIZE]; + + //添加元素 + public void add(Object o){ + add(size(),o); + } + + + public void add(int index, Object o){ + if(elementData.length==size()){ + ensureCapacity(size()*2 + 1); + } + for (int i = size; i > index; i--) + elementData[i]=elementData[i-1]; + elementData[index] = o; + size++; + } + //扩容 + public void ensureCapacity(int newCapacity){ + if(newCapacity < size){ + return; + } + Object[] oldElements = elementData; + elementData = new Object[newCapacity]; + for (int i = 0; i < size; i++) { + elementData[i] = oldElements[i]; + } + } + //返回固定下标的元素 + public Object get(int index){ + if(index<0 || index >=size){ + throw new ArrayIndexOutOfBoundsException("指定的index超过界限"); + } + return elementData[index]; + } + //删除指定位置的元素 + public Object remove(int index){ + Object removeElement = elementData[index]; + for (int i = index; i < size; i++) { + elementData[i] = elementData[i+1]; + } + size--; + return removeElement; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + private int current = 0; + @Override + public boolean hasNext() { + return current < size; + } + @Override + public Object next() { + if(!hasNext()){ + throw new NoSuchElementException(); + } + return elementData[current+1]; + } + } + +} diff --git a/group05/515505513/Task01/src/com/coding/basic/BinaryTreeNode.java b/group05/515505513/Task01/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group05/515505513/Task01/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group05/515505513/Task01/src/com/coding/basic/Iterator.java b/group05/515505513/Task01/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group05/515505513/Task01/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group05/515505513/Task01/src/com/coding/basic/LinkedList.java b/group05/515505513/Task01/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..ea3d6a07f3 --- /dev/null +++ b/group05/515505513/Task01/src/com/coding/basic/LinkedList.java @@ -0,0 +1,48 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head;//指针 + private Object element;//元素 + //添加一个元素 + public void add(Object o){ + + } + //在index处添加一个元素 + public void add(int index , Object o){ + + } + + public Object get(int index){ + return null; + } + //清除一个元素 + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + private static class Node{ + Object data;//元素 + Node next;//指针 + } +} diff --git a/group05/515505513/Task01/src/com/coding/basic/List.java b/group05/515505513/Task01/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group05/515505513/Task01/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group05/515505513/Task01/src/com/coding/basic/Queue.java b/group05/515505513/Task01/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..fd316ac7bf --- /dev/null +++ b/group05/515505513/Task01/src/com/coding/basic/Queue.java @@ -0,0 +1,49 @@ +package com.coding.basic; + +public class Queue { + private int maxSize;//队列容量 + private Object[] queue;//队列 + private int head;//队列头,可以删除 + private int tail;//队列尾,可以插入 + + + public Queue() { + this(10); + } + + public Queue(int maxSize) { + if(maxSize >=0){ + this.maxSize = maxSize; + this.queue = new Object[maxSize]; + head = tail = 0; + }else { + throw new RuntimeException("初始化大小不能小于0"); + } + } + + public void enQueue(Object o){ + if(tail == maxSize){ + throw new RuntimeException("队列已满,无法插入新的元素!"); + }else { + queue[tail++] = o; + } + } + + public Object deQueue(){ + if(isEmpty()){ + throw new RuntimeException("空队列异常!"); + }else { + Object value = queue[head]; + queue[head++] = null; + return value; + } + } + //队列是否为空 + public boolean isEmpty(){ + return head==tail?true:false; + } + + public int size(){ + return tail-head; + } +} diff --git a/group05/515505513/Task01/src/com/coding/basic/Stack.java b/group05/515505513/Task01/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a85cfed9d2 --- /dev/null +++ b/group05/515505513/Task01/src/com/coding/basic/Stack.java @@ -0,0 +1,49 @@ +package com.coding.basic; + +public class Stack { + private Object[] data; + private int capacity; + private int size; + public Stack(){ + capacity = 16; + size = 0; + data = new Object[capacity]; + } + public void push(Object o){ + if(size < capacity){ + data[size++] = o; + }else { + ensureCapacity(); + data[size++] = o; + } + } + + private void ensureCapacity() { + capacity = capacity*2; + } + public Object pop(){ + if(size > 0){ + System.out.println(data[size-1]); + //data[size--] = null; + }else { + System.out.println("Empty stack"); + } + size--; + return data[size]; + } + + public Object peek(){ + if(size>0){ + return data[size-1]; + }else { + return null; + } + } + public boolean isEmpty(){ + + return size==0; + } + public int size(){ + return size; + } +} diff --git a/group05/515505513/Task01/src/com/coding/basic/TestExample.java b/group05/515505513/Task01/src/com/coding/basic/TestExample.java new file mode 100644 index 0000000000..59bfa47a3c --- /dev/null +++ b/group05/515505513/Task01/src/com/coding/basic/TestExample.java @@ -0,0 +1,27 @@ +package com.coding.basic; + +public class TestExample { + + public static void main(String[] args) { + /*Stack mystack = new Stack(); + for (int i = 0; i < 10; i++) { + mystack.push(i); + } + for (int i = 0; i < 10; i++) { + mystack.pop(); + System.out.println("==="+mystack.peek()); + }*/ + + /*Test Queue + Queue myQqueue = new Queue(10); + for (int i = 0; i < 10; i++) { + myQqueue.enQueue(i); + } + for (int i = 0; i < 10; i++) { + System.out.println(myQqueue.deQueue()); + }*/ + + + } + +} diff --git a/group05/515505513/Task02/.classpath b/group05/515505513/Task02/.classpath new file mode 100644 index 0000000000..916d837ac0 --- /dev/null +++ b/group05/515505513/Task02/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group05/515505513/Task02/.gitignore b/group05/515505513/Task02/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group05/515505513/Task02/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group05/515505513/Task02/.project b/group05/515505513/Task02/.project new file mode 100644 index 0000000000..e4d9a52aa9 --- /dev/null +++ b/group05/515505513/Task02/.project @@ -0,0 +1,17 @@ + + + Task02 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group05/515505513/Task02/.settings/org.eclipse.jdt.core.prefs b/group05/515505513/Task02/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group05/515505513/Task02/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group05/515505513/Task02/src/com/coderising/action/LoginAction.java b/group05/515505513/Task02/src/com/coderising/action/LoginAction.java new file mode 100644 index 0000000000..5cdf1b78e4 --- /dev/null +++ b/group05/515505513/Task02/src/com/coderising/action/LoginAction.java @@ -0,0 +1,45 @@ +package com.coderising.action; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + +} diff --git a/group05/515505513/Task02/src/com/coderising/action/Struts.java b/group05/515505513/Task02/src/com/coderising/action/Struts.java new file mode 100644 index 0000000000..7a342e28bb --- /dev/null +++ b/group05/515505513/Task02/src/com/coderising/action/Struts.java @@ -0,0 +1,165 @@ +package com.coderising.action; +import java.beans.PropertyDescriptor; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + //0. 读取配置文件struts.xml + + SAXReader saxReader = new SAXReader(); + View view = new View(); + Element actionElement = null; + String classVal=""; + try { + Document read = saxReader.read(new File("src/com/coderising/action/struts.xml")); + //获得根节点 + Element rootElement = read.getRootElement(); + //获得根节点下的一级节点 + List elements = rootElement.elements(); + for (Element element : elements) { + Attribute attribute = element.attribute("name"); + //如果等于传递进来的actionName + if(attribute.getValue().equals(actionName)){ + actionElement = element; + //获得属性值 + Attribute classAttr = element.attribute("class"); + classVal = classAttr.getValue(); + } + } + +// 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) +// 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 +// ("name"="test" , "password"="1234") , +// 那就应该调用 setName和setPassword方法 + //com.coderising.action.LoginAction + + Class clazz = Class.forName(classVal); + Object c = clazz.newInstance(); + Field[] fields = clazz.getDeclaredFields(); + Set> set = parameters.entrySet(); + for (Entry entry : set) { + String key = entry.getKey(); + String value = entry.getValue(); + for (Field f : fields) { + setProperty(c, key, value); + } + } + + //2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method executeMethod = clazz.getDeclaredMethod("execute"); + executeMethod.setAccessible(true); + String jspStr = ""; + String str = (String) executeMethod.invoke(c); + List resultNameJSp = actionElement.elements(); + for (Element element : resultNameJSp) { + Attribute attribute = element.attribute("name"); + if(attribute.getValue().equals(str)){ + jspStr = element.getText(); + break; + } + } + +// 3. 通过反射找到对象的所有getter方法(例如 getMessage), +// 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , +// 放到View对象的parameters + HashMap hashMap = new HashMap<>(); + for (Field f : fields) { + Object value = getProperty(c, f.getName()); + hashMap.put(f.getName(),value); + } + +// 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, +// 放到View对象的jsp字段中。 + view.setJsp(jspStr); + //System.out.println("====="+view.getJsp()); + view.setParameters(hashMap); + //System.out.println(view.getParameters().get("message")); + + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return view; + } + + public static PropertyDescriptor getPropertyDescriper(Class clazz,String propertyName){ + //构建一个可变字符串用来构建方法名称 + StringBuffer sBuffer = new StringBuffer(); + Method setMethod = null; + Method getMethod = null; + PropertyDescriptor pd = null; + try { + //根据字段名来获取字段 + Field f = clazz.getDeclaredField(propertyName); + if(f!=null){ + //构建方法的后缀 + String methodEnd = propertyName.substring(0,1).toUpperCase()+propertyName.substring(1); + sBuffer.append("set"+methodEnd);//构建set方法 + setMethod = clazz.getDeclaredMethod(sBuffer.toString(),new Class[]{f.getType()}); + sBuffer.delete(0, sBuffer.length());//清空整个可变字符串 + sBuffer.append("get"+methodEnd);//构建get方法 + getMethod = clazz.getDeclaredMethod(sBuffer.toString(),new Class[]{}); + //构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中 + pd = new PropertyDescriptor(propertyName, getMethod, setMethod); + } + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return pd; + } + + /** + * @param obj + * @param propertyName + * @param value + */ + public static void setProperty(Object obj,String propertyName,Object value){ + //获取对象的类型 + Class clazz = obj.getClass(); + PropertyDescriptor pd = getPropertyDescriper(clazz,propertyName); + //从属性描述器中获取set方法 + Method setMethod = pd.getWriteMethod(); + try { + setMethod.invoke(obj, new Object[]{value}); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + public static Object getProperty(Object obj,String propertyName){ + Class clazz = obj.getClass(); + PropertyDescriptor pd = getPropertyDescriper(clazz,propertyName); + Method getMethod = pd.getReadMethod(); + Object value= null; + try { + value = getMethod.invoke(obj,new Object[]{}); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return value; + } + + +} diff --git a/group05/515505513/Task02/src/com/coderising/action/StrutsTest.java b/group05/515505513/Task02/src/com/coderising/action/StrutsTest.java new file mode 100644 index 0000000000..f162786054 --- /dev/null +++ b/group05/515505513/Task02/src/com/coderising/action/StrutsTest.java @@ -0,0 +1,42 @@ +package com.coderising.action; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group05/515505513/Task02/src/com/coderising/action/View.java b/group05/515505513/Task02/src/com/coderising/action/View.java new file mode 100644 index 0000000000..11cb1872e5 --- /dev/null +++ b/group05/515505513/Task02/src/com/coderising/action/View.java @@ -0,0 +1,23 @@ +package com.coderising.action; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group05/515505513/Task02/src/com/coderising/action/struts.xml b/group05/515505513/Task02/src/com/coderising/action/struts.xml new file mode 100644 index 0000000000..dd598a3664 --- /dev/null +++ b/group05/515505513/Task02/src/com/coderising/action/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group05/515505513/Task02/src/com/coderising/array/ArrayUtil.java b/group05/515505513/Task02/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..eca61be119 --- /dev/null +++ b/group05/515505513/Task02/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,221 @@ +package com.coderising.array; + +import java.util.Iterator; +import java.util.TreeSet; + +import org.junit.Test; + +public class ArrayUtil { + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return leon1900 + */ + public void reverseArray(int[] origin){ + for (int i = 0; i < origin.length/2; i++) { + int temp = origin[origin.length-1-i]; + origin[origin.length-1-i] = origin[i]; + origin[i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return leon1900 + */ + public int[] removeZero(int[] oldArray){ + int size = 0; + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i] !=0 ){ + size++; + } + } + int [] newArray = new int [size]; + for (int i = 0,j = 0; i < oldArray.length; i++) { + if(oldArray[i]!=0){ + newArray[j++] = oldArray[i]; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return leon1900 + */ + + public int[] merge(int[] array1, int[] array2){ + TreeSet ts = new TreeSet<>(); + for (int i = 0; i < array1.length; i++) { + ts.add(array1[i]); + } + for (int i = 0; i < array2.length; i++) { + ts.add(array2[i]); + } + int size = ts.size(); + int[] newArr = new int[size]; + int i = 0; + for (Integer integer : ts) { + newArr[i++] = integer; + } + return newArr; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return leon1900 + */ + public int[] grow(int [] oldArray, int size){ + int newsize = oldArray.length+size; + int [] newArr = new int[newsize]; + for (int i = 0; i < oldArray.length; i++) { + newArr[i] = oldArray[i]; + } + return newArr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return leon1900 + */ + public int[] fibonacci(int max){ + int size = 1; + while(fun(size) + 4.0.0 + + com.coding2017.yang + basic + 1.0-SNAPSHOT + jar + + basic + http://maven.apache.org + + + UTF-8 + + + + + dom4j + dom4j + 1.6.1 + + + junit + junit + 4.12 + + + diff --git a/group05/578505552/src/main/java/com/coderising/Q&A.md b/group05/578505552/src/main/java/com/coderising/Q&A.md new file mode 100644 index 0000000000..2e2edc5078 --- /dev/null +++ b/group05/578505552/src/main/java/com/coderising/Q&A.md @@ -0,0 +1,5 @@ +# Struts中去获得getter或者setter方法的时候怎样比较靠谱?目前有两种思路 +## 获取Struts中所有以“get”或“set”开头的方法 +### 问题1:可能有不是getter或者setter的方法也是以“get”或者“set”开头 +## 先获取Struts中所有的成员变量的名字,再与字符串“get”或“set”拼接出getter或者setter方法名,再通过方法名用反射获取方法 +### 问题1:因为拼接方法名肯定以驼峰命名法来拼接,这就要求getter和setter方法也是以这个规则命名,虽然ide自动生成的方法是如此,但不能保存总是如此。 \ No newline at end of file diff --git a/group05/578505552/src/main/java/com/coderising/array/ArrayUtil.java b/group05/578505552/src/main/java/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..2c813231a8 --- /dev/null +++ b/group05/578505552/src/main/java/com/coderising/array/ArrayUtil.java @@ -0,0 +1,242 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int length = origin.length; + int i = 0; + int j = length - 1; + while (i < j){ + int tmp = origin[i]; + origin[i] = origin[j]; + origin[j] = tmp; + i++; + j--; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int length = oldArray.length; + int[] newArray = new int[length]; + int j = 0; + for (int i = 0; i < length; i++) { + if (oldArray[i] != 0){ + newArray[j++] = oldArray[i]; + } + } + int[] res = new int[j]; + System.arraycopy(newArray, 0, res, 0, j); + return res; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int length1 = array1.length; + int length2 = array2.length; + int i = 0; + int j = 0; + + int[] res = new int[length1 + length2]; + int k = 0; + while (i < length1 || j < length2){ + int next = Integer.MIN_VALUE; + if (i < length1 && j < length2){ + if (array1[i] == array2[j]){ + next = array1[i]; + i++; + j++; + } else if (array1[i] < array2[j]){ + next = array1[i++]; + } else { + next = array2[j++]; + } + } else if (i < length1){ + next = array1[i++]; + } else { + next = array2[j++]; + } + + if (k == 0){ + res[k++] = next; + } else if (next > res[k-1]){ + res[k++] = next; + } + } + + int[] merged = new int[k]; + System.arraycopy(res, 0, merged, 0, k); + return merged; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + if (size < 0){ + throw new IllegalArgumentException("illegal size"); + } + int newLength = oldArray.length + size; + int[] newArray = new int[newLength]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + + if (max <= 1){ + return new int[0]; + } + + int[] res = new int[max]; + int i = 1; + int j = 1; + int k = 0; + res[k++] = 1; + res[k++] = 1; + + int tmp = i + j; + while (tmp < max){ + res[k++] = tmp; + i = j; + j = tmp; + tmp = i + j; + } + + int[] result = new int[k]; + System.arraycopy(res, 0, result, 0, k); + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if (max < 0){ + return new int[0]; + } + int[] res = new int[max]; + int k = 0; + for (int i = 2; i < max; i++) { + if (isPrime(i)){ + res[k++] = i; + } + } + int[] result = new int[k]; + System.arraycopy(res, 0, result, 0, k); + return result; + } + + private boolean isPrime(int num){ + + if (num < 1){ + return false; + } + for (int i = 2; i <= num / 2; i++) { + if (num % i == 0){ + return false; + } + + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + + if (max < 0){ + return new int[0]; + } + int[] res = new int[max]; + int k = 0; + for (int i = 0; i < max; i++) { + if (isPerfectNumbers(i)){ + res[k++] = i; + } + } + int[] result = new int[k]; + System.arraycopy(res, 0, result, 0, k); + return result; + } + + private boolean isPerfectNumbers(int num){ + + return num == getFactorSum(num); + } + + private int getFactorSum(int num){ + if (num == 0 || num == 1){ + return -1; + } + int sum = 0; + for (int i = 1; i <= num / 2; i++) { + if (num % i == 0){ + sum += i; + } + } + return sum; + } + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param separator + * @return + */ + public String join(int[] array, String separator){ + + if (array.length <= 0){ + return ""; + } + + StringBuffer stringBuffer = new StringBuffer(); + for (int i = 0; i < array.length - 1; i++) { + stringBuffer.append(String.valueOf(array[i])).append(separator); + } + stringBuffer.append(String.valueOf(array[array.length-1])); + return stringBuffer.toString(); + } + +} diff --git a/group05/578505552/src/main/java/com/coderising/litestruts/Action.java b/group05/578505552/src/main/java/com/coderising/litestruts/Action.java new file mode 100644 index 0000000000..9248c3eac4 --- /dev/null +++ b/group05/578505552/src/main/java/com/coderising/litestruts/Action.java @@ -0,0 +1,38 @@ +package com.coderising.litestruts; + + +import java.util.Map; + +/** + * Created by songbao.yang on 2017/3/1. + * + */ +public class Action { + private String name; + private String className; + private Map results; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public Map getResults() { + return results; + } + + public void setResults(Map results) { + this.results = results; + } +} diff --git a/group05/578505552/src/main/java/com/coderising/litestruts/LoginAction.java b/group05/578505552/src/main/java/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..0d1956992b --- /dev/null +++ b/group05/578505552/src/main/java/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,38 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group05/578505552/src/main/java/com/coderising/litestruts/Struts.java b/group05/578505552/src/main/java/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..a40ef8db27 --- /dev/null +++ b/group05/578505552/src/main/java/com/coderising/litestruts/Struts.java @@ -0,0 +1,131 @@ +package com.coderising.litestruts; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + +// 0. 读取配置文件struts.xml + Action action = matchAction(parseXml("/struts.xml"), actionName); + try { + +// 1. 根据actionName找到相对应的class, 通过反射实例化(创建对象), +// 根据parameters中的数据,调用对象的setter方法 + Class clazz = Class.forName(action.getClassName()); + Object instance = clazz.newInstance(); + for (String key : parameters.keySet()){ + try { + PropertyDescriptor propertyDescriptor = new PropertyDescriptor(key, clazz); + Method setMethod = propertyDescriptor.getWriteMethod(); + setMethod.invoke(instance, parameters.get(key)); + } catch (IntrospectionException e) { + e.printStackTrace(); + } + } + +// 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method exectueMethod = null; + String result = null; + try { + exectueMethod = clazz.getMethod("execute"); + result = (String)exectueMethod.invoke(instance); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + +// 3. 通过反射找到对象的所有getter方法(例如 getMessage), +// 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , +// 放到View对象的parameters + Map hashMap = new HashMap(); + Field[] declaredFields = clazz.getDeclaredFields(); + for (Field field : declaredFields){ + String name = field.getName(); + try { + PropertyDescriptor propertyDescriptor = new PropertyDescriptor(name, clazz); + Method getMethod = propertyDescriptor.getReadMethod(); + Object res = getMethod.invoke(instance); + hashMap.put(name, res); + } catch (IntrospectionException e) { + e.printStackTrace(); + } + } + +// 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, +// 放到View对象的jsp字段中。 + View view = new View(); + view.setJsp((String)action.getResults().get(result)); + view.setParameters(hashMap); + return view; + + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + return null; + } + + private static Element parseXml(String resourcePath){ + + InputStream resourceAsStream = Struts.class.getResourceAsStream(resourcePath); + SAXReader saxReader = new SAXReader(); + try { + Document document = saxReader.read(resourceAsStream); + Element rootElement = document.getRootElement(); + return rootElement; + } catch (DocumentException e) { + e.printStackTrace(); + } + + throw new RuntimeException("fail to parse xml"); + } + + private static Action matchAction(Element rootElement, String actionName){ + + List actions = rootElement.elements("action"); + Iterator iterator = actions.iterator(); + Action action = new Action(); + while (iterator.hasNext()){ + Element actionElement = (Element) iterator.next(); + String nameAttributeValue = actionElement.attributeValue("name"); + if (actionName.equals(nameAttributeValue)){ + action.setName(nameAttributeValue); + action.setClassName(actionElement.attributeValue("class")); + List results = actionElement.elements("result"); + Map resultMap = new HashMap(); + Iterator it = results.iterator(); + while (it.hasNext()){ + Element resultElement = (Element)it.next(); + resultMap.put(resultElement.attributeValue("name"), (String)resultElement.getData()); + } + action.setResults(resultMap); + } + } + + return action; + } + + + + +} diff --git a/group05/578505552/src/main/java/com/coderising/litestruts/View.java b/group05/578505552/src/main/java/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group05/578505552/src/main/java/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group05/578505552/src/main/java/com/coderising/litestruts/XmlUtil.java b/group05/578505552/src/main/java/com/coderising/litestruts/XmlUtil.java new file mode 100644 index 0000000000..e60865bccc --- /dev/null +++ b/group05/578505552/src/main/java/com/coderising/litestruts/XmlUtil.java @@ -0,0 +1,8 @@ +package com.coderising.litestruts; + +/** + * + * Created by songbao.yang on 2017/2/28. + */ +public class XmlUtil { +} diff --git a/group05/578505552/src/main/java/com/coding/basic/ArrayList.java b/group05/578505552/src/main/java/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..9d12e697ba --- /dev/null +++ b/group05/578505552/src/main/java/com/coding/basic/ArrayList.java @@ -0,0 +1,103 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +/** + * Created by songbao.yang on 2017/2/21. + * + */ +public class ArrayList implements List { + + private int size = 0; + private Object[] elementData; + private static final int MIN_CAPACITY = 10; + + public ArrayList(int size) { + if (size < 0){ + throw new IllegalArgumentException("illega size: " + size); + } + this.elementData = new Object[size]; + } + + public ArrayList() { + this.elementData = new Object[0]; + } + + public void add(Object o){ + ensureCapacity(size + 1); + elementData[size++] = o; + } + + private void ensureCapacity(int minCapacity){ + if (minCapacity < 0 ){ + throw new OutOfMemoryError(); + } + + int newCapcity = size; + if(minCapacity < MIN_CAPACITY){ + newCapcity = MIN_CAPACITY; + } else if(minCapacity > elementData.length){ + int tmp = elementData.length << 1; + newCapcity = tmp > elementData.length ? tmp : Integer.MAX_VALUE; + } + + newCapcity = minCapacity; + Object[] newData = new Object[newCapcity]; + System.arraycopy(elementData, 0, newData, 0, size); + elementData = newData; + } + + public void add(int index, Object o){ + indexCheck(index); + ensureCapacity(size+1); + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + indexCheck(index); + return elementData[index]; + } + + private void indexCheck(int index){ + if(index < 0){ + throw new IllegalArgumentException("illegal index: " + index); + } + if(index >= size){ + throw new IndexOutOfBoundsException(); + } + } + + public Object remove(int index){ + indexCheck(index); + Object rm = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + size--; + return rm; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new Itr(); + } + + //静态内部类的访问权限不同有何区别?? + private class Itr implements Iterator{ + private int cursor = 0; + + public boolean hasNext() { + return cursor != size; + } + + public Object next() { + if (hasNext()){ + return elementData[cursor++]; + } + throw new NoSuchElementException(); + } + } +} diff --git a/group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java b/group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..3a36db4031 --- /dev/null +++ b/group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,60 @@ +package com.coding.basic; + +/** + * Created by songbao.yang on 2017/2/21. + * + */ +public class BinaryTreeNode { + + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Integer data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Integer o){ + if (o == null){ + throw new IllegalArgumentException("can not insert null"); + } + + BinaryTreeNode newNode = new BinaryTreeNode(); + newNode.data = o; + newNode.left = null; + newNode.right = null; + + BinaryTreeNode cursor = this; + BinaryTreeNode pre = cursor; + while (cursor != null){ + pre = cursor; + if (o.compareTo(cursor.data) < 0){ + cursor = cursor.left; + } else { + cursor = cursor.right; + } + } + + if (o.compareTo(pre.data) < 0){ + pre.left = newNode; + } else { + pre.right = newNode; + } + return this; + } +} diff --git a/group05/578505552/src/main/java/com/coding/basic/Iterator.java b/group05/578505552/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..4ac23f28c0 --- /dev/null +++ b/group05/578505552/src/main/java/com/coding/basic/Iterator.java @@ -0,0 +1,11 @@ +package com.coding.basic; + +/** + * Created by songbao.yang on 2017/2/21. + * + */ +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group05/578505552/src/main/java/com/coding/basic/LinkedList.java b/group05/578505552/src/main/java/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..d1fa42bf4c --- /dev/null +++ b/group05/578505552/src/main/java/com/coding/basic/LinkedList.java @@ -0,0 +1,156 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +/** + * Created by songbao.yang on 2017/2/21. + * + */ +public class LinkedList implements List { + + private Node head; + private int elementCount; + + //head作为一个节点,其next的值指向List中真正的第一个节点 + public LinkedList() { + head = new Node(); + head.next = null; + head.data = null; + elementCount = 0; + } + + public void add(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + + Node cursor = head; + while (cursor.next != null){ + cursor = cursor.next; + } + cursor.next = newNode; + elementCount++; + } + + + public void add(int index , Object o){ + indexRangeCheck(index); + Node newNode = new Node(); + newNode.data = o; + + Node cursor = head; + for (int i = 0; i < index; i++) { + cursor = cursor.next; //将cursor移动到index-1节点处; + } + + newNode.next = cursor.next; //将新节点指向原index处的节点 + cursor.next = newNode;//将原index-1处的节点指向新节点 + elementCount++; + } + + private void indexRangeCheck(int index){ + if (index < 0 || index >= size()){ + throw new IndexOutOfBoundsException(); + } + } + + public Object get(int index){ + indexRangeCheck(index); + Node cursor = head; + for (int i = 0; i < index; i++) { + cursor = cursor.next; + } + return cursor.next.data; + } + + public Object remove(int index){ + indexRangeCheck(index); + Node cursor = head; + for (int i = 0; i < index; i++) { + cursor = cursor.next; + } + Node indexNode = cursor.next; + cursor.next = indexNode.next; + elementCount--; + return indexNode; + } + + public int size(){ + return elementCount; + } + + public void addFirst(Object o){ + Node node = new Node(); + node.data = o; + node.next = head.next; + head.next = node; + elementCount++; + } + + public void addLast(Object o){ + + Node cursor = head; + while (cursor.next != null){ + cursor = cursor.next; + } + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + cursor.next = newNode; + elementCount++; + } + + public Object removeFirst(){ + + if (size() == 0){ + throw new RuntimeException("no element in list"); + } + Node firstNode = head.next; + head.next = head.next.next; + elementCount--; + return firstNode; + } + + public Object removeLast(){ + if (size() == 0){ + throw new RuntimeException("no element in list"); + } + + Node cursor = head; + for (int i = 0; i < size() - 1; i++) { + cursor = cursor.next; + } + + Node lastNode = cursor.next; + cursor.next = null; + elementCount--; + + return lastNode; + } + + public Iterator iterator(){ + return new Itr(); + } + + private class Itr implements Iterator { + + private Node itrCursor = head; + + public boolean hasNext() { + + return itrCursor.next != null; + } + + public Object next() { + if (hasNext()){ + return itrCursor.next; + } + throw new NoSuchElementException(); + } + } + + private static class Node{ + Object data; + Node next; + } +} diff --git a/group05/578505552/src/main/java/com/coding/basic/List.java b/group05/578505552/src/main/java/com/coding/basic/List.java new file mode 100644 index 0000000000..c74001dea8 --- /dev/null +++ b/group05/578505552/src/main/java/com/coding/basic/List.java @@ -0,0 +1,14 @@ +package com.coding.basic; + +/** + * Created by songbao.yang on 2017/2/21. + * + */ +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + public Iterator iterator(); +} diff --git a/group05/578505552/src/main/java/com/coding/basic/Queue.java b/group05/578505552/src/main/java/com/coding/basic/Queue.java new file mode 100644 index 0000000000..ac5f506eff --- /dev/null +++ b/group05/578505552/src/main/java/com/coding/basic/Queue.java @@ -0,0 +1,90 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +/** + * Created by songbao.yang on 2017/2/22. + * + */ +public class Queue { + + private Object[] elementData; + private int head; //对头的位置 + private int tail; //队尾的位置 + private int size; //队列中元素的个数 + private static final int MIN_INITIAL_CAPACITY = 10; + + public Queue() { + this.elementData = new Object[MIN_INITIAL_CAPACITY]; + this.head = 0; + this.tail = 0; + this.size = 0; + } + + public Queue(int initCapcacity) { + if (initCapcacity < MIN_INITIAL_CAPACITY){ + initCapcacity = MIN_INITIAL_CAPACITY; + } + this.elementData = new Object[initCapcacity]; + this.head = 0; + this.tail = 0; + this.size = 0; + } + + public void enQueue(Object o){ + ensureCapacity(size+1); + if(size != 0){ + tail++; + } + if(tail == elementData.length){ + tail = 0; + } + elementData[tail] = o; + size++; + } + + private void ensureCapacity(int minCapcacity){ + if(minCapcacity <= elementData.length){ + return; + } + + int newCapcacity = elementData.length << 1; + if (newCapcacity < elementData.length){ + newCapcacity = Integer.MAX_VALUE; + } + + Object[] newData = new Object[newCapcacity]; + if(size != 0){ + if(tail >= head){ + System.arraycopy(elementData, head, newData, 0, size); + } else { + System.arraycopy(elementData, head, newData, 0, elementData.length - head); + System.arraycopy(elementData, 0, newData, elementData.length - head, tail + 1); + } + elementData = newData; + head = 0; + tail = this.size - 1; + } + } + + public Object deQueue(){ + if (isEmpty()){ + throw new NoSuchElementException("empty queue"); + } + Object ele = elementData[head]; + size--; + head++; + if(head == elementData.length){ + head = 0; + } + return ele; + } + + public boolean isEmpty(){ + return size == 0; + } + + public int size(){ + return size; + } +} diff --git a/group05/578505552/src/main/java/com/coding/basic/Stack.java b/group05/578505552/src/main/java/com/coding/basic/Stack.java new file mode 100644 index 0000000000..ffc4915bef --- /dev/null +++ b/group05/578505552/src/main/java/com/coding/basic/Stack.java @@ -0,0 +1,63 @@ +package com.coding.basic; + + +import java.util.EmptyStackException; + +/** + * Created by songbao.yang on 2017/2/22. + * + */ +public class Stack { + + private Object[] elementData; + private static final int MIN_INITIAL_CAPACITY = 10; + private int cursor; + + public Stack() { + elementData = new Object[MIN_INITIAL_CAPACITY]; + cursor = -1; + } + + public void push(Object o){ + ensureCapacity(size() + 1); + cursor++; + elementData[cursor] = o; + } + + private void ensureCapacity(int minCapacity){ + if(minCapacity <= elementData.length){ + return; + } + + int newSize = elementData.length << 1; + if (newSize < elementData.length){ + newSize = Integer.MAX_VALUE; + } + + Object[] newDataArray = new Object[newSize]; + System.arraycopy(elementData, 0, newDataArray, 0, size()); + elementData = newDataArray; + } + + + public Object pop(){ + Object ele = peek(); + cursor--; + return ele; + } + + public Object peek(){ + if (isEmpty()){ + throw new EmptyStackException(); + } + return elementData[cursor]; + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return cursor + 1; + } +} diff --git a/group05/578505552/src/main/resources/struts.xml b/group05/578505552/src/main/resources/struts.xml new file mode 100644 index 0000000000..8bd5984b67 --- /dev/null +++ b/group05/578505552/src/main/resources/struts.xml @@ -0,0 +1,12 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group05/578505552/src/test/java/JavaTest.java b/group05/578505552/src/test/java/JavaTest.java new file mode 100644 index 0000000000..7083f0659a --- /dev/null +++ b/group05/578505552/src/test/java/JavaTest.java @@ -0,0 +1,25 @@ +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Queue; +import java.util.Stack; + +/** + * Created by songbao.yang on 2017/2/21. + */ +public class JavaTest { + + public static void main(String[] args) { + + ArrayList ss = new ArrayList(); + ss.add("a"); + ss.add("b"); + ss.add("c"); + ss.add("d"); + + System.out.println(ss.size()); + ss.remove(0); + System.out.println(ss.size()); + + + } +} diff --git a/group05/578505552/src/test/java/com/coderising/array/ArrayUtilTest.java b/group05/578505552/src/test/java/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..f5c3fec1c9 --- /dev/null +++ b/group05/578505552/src/test/java/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,206 @@ +package com.coderising.array; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Created by songbao.yang on 2017/3/2. + * + */ +public class ArrayUtilTest { + + private ArrayUtil arrayUtil; + + @Before + public void setUp() throws Exception { + arrayUtil = new ArrayUtil(); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void reverseArray() throws Exception { + + int[][] actualAndExpected = { + {}, {}, {0}, {0}, + {1,2,3,4,5,6}, {6,5,4,3,2,1}, + {7,9,30,3,4}, {4,3,30,9,7} + }; + + for (int i = 0; i < actualAndExpected.length; i += 2) { + int[] acutal = actualAndExpected[i]; + int[] expected = actualAndExpected[i+1]; + arrayUtil.reverseArray(acutal); + Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, acutal)); + } + } + + @Test + public void removeZero() throws Exception { + int[][] actualAndExpected = { + {}, {}, {0}, {}, + {1,0,3,0,5,0}, {1,3,5}, + {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}, {1,3,4,5,6,6,5,4,7,6,7,5} + }; + + for (int i = 0; i < actualAndExpected.length; i += 2) { + int[] acutal = actualAndExpected[i]; + int[] expected = actualAndExpected[i+1]; + int[] ints = arrayUtil.removeZero(acutal); + Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, ints)); + } + } + + @Test + public void merge() throws Exception { + int[][] actualAndExpected = { + {}, {}, {}, + {}, {0}, {0}, + {3,5,7,8}, {4,5,6,7},{3,4,5,6,7,8}, + {1,2,3,4,5,}, {6,7,8,9,10}, {1,2,3,4,5,6,7,8,9,10} + }; + + for (int i = 0; i < actualAndExpected.length; i += 3) { + int[] array1 = actualAndExpected[i]; + int[] array2 = actualAndExpected[i+1]; + int[] expected = actualAndExpected[i+2]; + int[] result = arrayUtil.merge(array1, array2); + Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, result)); + } + + } + + @Test + public void grow() throws Exception { + int[][] actualAndExpected = { + {}, {}, + {1}, {}, + {5}, {0,0,0,0,0}, + {0},{2,3,6}, + {3}, {2,3,6,0,0,0} + }; + + for (int i = 0; i < actualAndExpected.length; i += 3) { + int[] oldArray = actualAndExpected[i]; + int size = actualAndExpected[i+1][0]; + int[] expected = actualAndExpected[i+2]; + int[] newArray = arrayUtil.grow(oldArray, size); + Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, newArray)); + } + } + + @Test + public void fibonacci() throws Exception { + int[][] actualAndExpected = { + {0}, {}, + {1}, {}, + {2}, {1,1}, + {3}, {1,1,2}, + {4}, {1,1,2,3}, + {15}, {1,1,2,3,5,8,13}, + }; + + for (int i = 0; i < actualAndExpected.length; i += 2) { + int max = actualAndExpected[i][0]; + int[] expected = actualAndExpected[i+1]; + int[] actual = arrayUtil.fibonacci(max); + Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, actual)); + } + } + + @Test + public void getPrimes() throws Exception { + int[][] actualAndExpected = { + {-1}, {}, + {0}, {}, + {1}, {}, + {2}, {}, + {3}, {2}, + {4}, {2,3}, + {23}, {2,3,5,7,11,13,17,19}, + }; + + for (int i = 0; i < actualAndExpected.length; i += 2) { + int max = actualAndExpected[i][0]; + int[] expected = actualAndExpected[i+1]; + int[] actual = arrayUtil.getPrimes(max); + Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, actual)); + } + } + + @Test + public void getPerfectNumbers() throws Exception { + int[][] actualAndExpected = { + {-1}, {}, + {0}, {}, + {1}, {}, + {2}, {}, + {7}, {6}, + {30}, {6,28}, + {500}, {6,28,496}, + {10000}, {6,28,496,8128} + }; + + for (int i = 0; i < actualAndExpected.length; i += 2) { + int max = actualAndExpected[i][0]; + int[] expected = actualAndExpected[i+1]; + int[] actual = arrayUtil.getPerfectNumbers(max); + Assert.assertTrue("wrong index: " + String.valueOf(i), isArrayEqual(expected, actual)); + } + } + + @Test + public void join() throws Exception { + int[][] arrays = { + {}, + {3,8,9}, + {1}, + {0,0,0,0,0}, + {1,2,3,4,5} + }; + String[] separators = {"", "-", "+", "*", "00"}; + String[] expecteds = { + "", + "3-8-9", + "1", + "0*0*0*0*0", + "1002003004005" + }; + for (int i = 0; i < arrays.length; i++) { + int[] array = arrays[i]; + String separator = separators[i]; + String expected = expecteds[i]; + String actual = arrayUtil.join(array, separator); + Assert.assertTrue("wrong index: " + String.valueOf(i), expected.equals(actual)); + } + } + + private boolean isArrayEqual(int[] expected, int[] actual){ + if (expected.length != actual.length){ + System.out.println("expected.length != actual.length"); + System.out.println("expected: " + Arrays.toString(expected)); + System.out.println("actual: " + Arrays.toString(actual)); + return false; + } + + for (int i = 0; i < expected.length; i++) { + if (expected[i] != actual[i]){ + System.out.println("expected[i] != actual[i]"); + System.out.println("expected: " + Arrays.toString(expected)); + System.out.println("actual: " + Arrays.toString(actual)); + return false; + } + } + + return true; + } + +} \ No newline at end of file diff --git a/group05/578505552/src/test/java/com/coderising/litestruts/StrutsTest.java b/group05/578505552/src/test/java/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..972e0e63ca --- /dev/null +++ b/group05/578505552/src/test/java/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,40 @@ +package com.coderising.litestruts; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group05/578505552/src/test/java/com/coding/basic/BinaryTreeNodeTest.java b/group05/578505552/src/test/java/com/coding/basic/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..900d176af9 --- /dev/null +++ b/group05/578505552/src/test/java/com/coding/basic/BinaryTreeNodeTest.java @@ -0,0 +1,38 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by songbao.yang on 2017/2/28. + * + */ +public class BinaryTreeNodeTest { + + private BinaryTreeNode node; + + @Before + public void setUp() throws Exception { + node = new BinaryTreeNode(); + node.setData(100); + node.setLeft(null); + node.setRight(null); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void insert() throws Exception { + + for (int i = 0; i < 100; i++) { + int ele = (int)Math.floor(Math.random() * 200); + node.insert(ele); + } + } +} \ No newline at end of file diff --git a/group05/578505552/src/test/java/com/coding/basic/ListTest.java b/group05/578505552/src/test/java/com/coding/basic/ListTest.java new file mode 100644 index 0000000000..1b4b5e3b0c --- /dev/null +++ b/group05/578505552/src/test/java/com/coding/basic/ListTest.java @@ -0,0 +1,100 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by songbao.yang on 2017/2/21. + * + */ +public class ListTest { + + private List list; + + public static final int SIZE = 10000; + + @Before + public void setUp() throws Exception { + +// list = new ArrayList(); + list = new LinkedList(); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void add() throws Exception { + + for (int i = 0; i < SIZE; i++) { + list.add(i); + Assert.assertEquals(i+1, list.size()); + } + } + + @Test + public void add1() throws Exception { + + add(); + for (int i = 0; i < 1000; i++) { + int oldSize = list.size(); + int randomIndex = (int)Math.floor(Math.random() * oldSize); + + list.add(randomIndex, randomIndex); + int newSize = list.size(); + + Assert.assertEquals(newSize, oldSize+1); + Assert.assertEquals(list.get(randomIndex), randomIndex); + } + } + + @Test + public void get() throws Exception { + + add(); + for (int i = 0; i < SIZE * 100; i++) { + int randomIndex = (int)Math.floor(Math.random() * list.size()); + if(randomIndex < 0 || randomIndex >= SIZE){ + System.out.println("illegal index: " + randomIndex); + throw new RuntimeException(); + } + int o = (Integer) list.get(randomIndex); + Assert.assertEquals(randomIndex, o); + } + } + + @Test + public void remove() throws Exception { + + add(); + for (int i = 0; i < SIZE; i++) { + int oldSize = list.size(); + int randomIndex = (int)Math.floor(Math.random() * oldSize); + list.remove(randomIndex); + int newSize = list.size(); + Assert.assertEquals(newSize, oldSize-1); + } + } + + @Test + public void size() throws Exception { + + } + + @Test + public void iterator() throws Exception { + add(); + Iterator iterator1 = list.iterator(); + int i = 0; + while (iterator1.hasNext()){ + Object next = iterator1.next(); + Assert.assertEquals(i, next); + i++; + } + } + +} \ No newline at end of file diff --git a/group05/578505552/src/test/java/com/coding/basic/QueueTest.java b/group05/578505552/src/test/java/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..22bb0bff0a --- /dev/null +++ b/group05/578505552/src/test/java/com/coding/basic/QueueTest.java @@ -0,0 +1,75 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by songbao.yang on 2017/2/24. + */ +public class QueueTest { + + private static final int SIZE = 2000; + private Queue queue; + + @Before + public void setUp() throws Exception { + queue = new Queue(); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void enQueue() throws Exception { + for (int i = 0; i < SIZE; i++) { + queue.enQueue(i); + Assert.assertEquals(i+1, queue.size()); + } + } + + @Test + public void deQueue1() throws Exception { + enQueue(); + + int i = 0; + int startSize = queue.size(); + while (!queue.isEmpty()) { + Assert.assertEquals(startSize - i, queue.size()); + Object o = queue.deQueue(); + Assert.assertEquals(SIZE - i - 1, queue.size()); + Assert.assertEquals(i, o); + i++; + } + } + + @Test + public void deQueue2() throws Exception { + enQueue(); + int startSize = queue.size(); + + for (int i = 0; i < startSize; i++) { + queue.deQueue(); + Assert.assertEquals(startSize - 1, queue.size()); + queue.enQueue(i+1000); + Assert.assertEquals(startSize, queue.size()); + } + + } + + @Test + public void isEmpty() throws Exception { + + } + + @Test + public void size() throws Exception { + + } + +} \ No newline at end of file diff --git a/group05/578505552/src/test/java/com/coding/basic/StackTest.java b/group05/578505552/src/test/java/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..655e9bdba9 --- /dev/null +++ b/group05/578505552/src/test/java/com/coding/basic/StackTest.java @@ -0,0 +1,65 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by songbao.yang on 2017/2/24. + * + */ +public class StackTest { + + private Stack stack; + + public static final int SIZE = 100; + + @Before + public void setUp() throws Exception { + stack = new Stack(); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void push() throws Exception { + for (int i = 0; i < SIZE; i++) { + stack.push(i); + Assert.assertEquals(i+1, stack.size()); + } + System.out.println(); + } + + @Test + public void pop() throws Exception { + push(); + int beginSize = stack.size(); + for (int i = 0; i < beginSize; i++) { + Object ele = stack.pop(); + Assert.assertEquals(beginSize-i-1, stack.size()); + Assert.assertEquals(beginSize-i-1, ele); + } + } + + @Test + public void peek() throws Exception { + + } + + @Test + public void isEmpty() throws Exception { + + } + + @Test + public void size() throws Exception { + + } + +} \ No newline at end of file diff --git a/group05/591010847/.gitignore b/group05/591010847/.gitignore new file mode 100644 index 0000000000..7a02c10a7e --- /dev/null +++ b/group05/591010847/.gitignore @@ -0,0 +1,10 @@ +/vendor +/node_modules +Homestead.yaml +Homestead.json +.env +.idea +.xml +/out +.class +.DS_Store diff --git a/group05/591010847/job_2017_02/.gitignore b/group05/591010847/job_2017_02/.gitignore new file mode 100644 index 0000000000..a93e887bab --- /dev/null +++ b/group05/591010847/job_2017_02/.gitignore @@ -0,0 +1 @@ +libs diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/ArrayListImpl.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/ArrayListImpl.java new file mode 100644 index 0000000000..27ee61ce66 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/ArrayListImpl.java @@ -0,0 +1,127 @@ +package com.java.xiaoqin.impl; + +import com.java.xiaoqin.interfaces.IIterator; +import com.java.xiaoqin.interfaces.IList; + +/** + * Created by xiaoqin on 17-2-25. + */ +public class ArrayListImpl implements IList { + + private static final int DEFAULT_INIT_SIZE = 20; + + private T[] data; + + private int size = 0; + + public ArrayListImpl() { + this(DEFAULT_INIT_SIZE); + } + + public ArrayListImpl(int capacity) { + if (capacity < 0) { + throw new IllegalArgumentException("无效的capacity:" + capacity); + } + if (0 == capacity) { + capacity = DEFAULT_INIT_SIZE; + } + data = (T[]) new Object[capacity]; + } + + @Override + public void add(T t) { + group(size); + data[size++] = t; + } + + @Override + public void add(int index, T t) { + if (index < 0) { + throw new IllegalArgumentException("index < 0,index:" + index); + } + if (index > size) { + throw new IndexOutOfBoundsException("index >= size。index:" + index + "\tsize:" + size); + } + group(size); + T[] temp = (T[]) new Object[size - index]; + System.arraycopy(data, index, temp, 0, temp.length); + data[index] = t; + size++; + System.arraycopy(temp, 0, data, index + 1, temp.length); + } + + @Override + public T get(int index) { + if (index < data.length) { + return data[index]; + } else { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + @Override + public T remove(int index) { + if (index < 0 || index >= size) { + throw new IllegalArgumentException("index invalid!!!index:" + index); + } + T[] temp = (T[]) new Object[size - index - 1]; + System.arraycopy(data, index + 1, temp, 0, temp.length); + T result = data[index]; + System.arraycopy(temp, 0, data, index, temp.length); + data[--size] = null; + return result; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public IIterator iterator() { + return new ArrayIteratorImpl<>(); + } + + @Override + public String toString() { + StringBuilder sbToString = new StringBuilder(); + for (T t : + data) { + sbToString.append(t).append("\t"); + } + return sbToString.toString(); + } + + private void group(int minSize) { + if (minSize >= data.length) { + T[] temp = (T[]) new Object[size]; + System.arraycopy(data, 0, temp, 0, size); + int groupSize = (size >> 1) + size; + data = (T[]) new Object[Math.max(groupSize, minSize)]; + System.arraycopy(temp, 0, data, 0, size); + } + } + + private class ArrayIteratorImpl implements IIterator { + + private int index = 0; + + @Override + public boolean hasNext() { + return index < size; + } + + @Override + public T next() { + if (index >= size) { + throw new ArrayIndexOutOfBoundsException("index out"); + } + return (T) data[index++]; + } + } +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/BinaryTreeNode.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/BinaryTreeNode.java new file mode 100644 index 0000000000..664468d901 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/BinaryTreeNode.java @@ -0,0 +1,82 @@ +package com.java.xiaoqin.impl; + +/** + * Created by xiaoqin on 17-2-26. + */ +public class BinaryTreeNode { + private T data; + private BinaryTreeNode leftChild; + private BinaryTreeNode rightChild; + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public BinaryTreeNode getLeftChild() { + return leftChild; + } + + public void setLeftChild(BinaryTreeNode leftChild) { + this.leftChild = leftChild; + } + + public BinaryTreeNode getRightChild() { + return rightChild; + } + + public void setRightChild(BinaryTreeNode rightChild) { + this.rightChild = rightChild; + } + + public BinaryTreeNode insert(T o) { + if (data == null) { + data = o; + return this; + } else { + return insert(this, o); + } + } + + private BinaryTreeNode insert(BinaryTreeNode node, T o) { + if (o instanceof Integer) { + if ((Integer) node.data > (Integer) o) { + if (null == node.leftChild) { + node.leftChild = new BinaryTreeNode(); + node.leftChild.data = o; + return node.leftChild; + } else { + return insert(node.leftChild, o); + } + } else if ((Integer) node.data < (Integer) o) { + if (null == node.rightChild) { + node.rightChild = new BinaryTreeNode(); + node.rightChild.data = o; + return node.rightChild; + } else { + return insert(node.rightChild, o); + } + } else { + return node; + } + } else { + return null; + } + } + + @Override + public String toString() { + StringBuilder sbToString = new StringBuilder(); + sbToString.append("data:").append(data); + if (null != leftChild) { + sbToString.append("\t").append(data).append("left:").append(leftChild.toString()); + } + if (null != rightChild) { + sbToString.append("\t").append(data).append("right:").append(rightChild.toString()); + } + return sbToString.toString(); + } +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/LinkedListImpl.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/LinkedListImpl.java new file mode 100644 index 0000000000..7d8ad60419 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/LinkedListImpl.java @@ -0,0 +1,202 @@ +package com.java.xiaoqin.impl; + +import com.java.xiaoqin.interfaces.IIterator; +import com.java.xiaoqin.interfaces.IList; +import com.java.xiaoqin.interfaces.IQueue; + +/** + * Created by xiaoqin on 17-2-26. + */ +public class LinkedListImpl implements IList, IQueue { + + private Node head; + private Node last; + private int size = 0; + + public LinkedListImpl() { + } + + @Override + public void add(T t) { + if (size == 0) { + head = new Node<>(); + head.data = t; + head.index = size++; + last = head; + } else { + last.right = new Node<>(); + last.right.left = last; + last = last.right; + last.data = t; + last.index = size++; + } + } + + @Override + public void add(int index, T t) { + Node node = findNodeByIndex(index); + if (node.index == 0) { + node.left = new Node<>(); + node.left.right = node; + node.left.index = 0; + node.left.data = t; + head = node.left; + } else { + node.left.right = new Node<>(); + node.left.right.index = node.index; + node.left.right.right = node; + node.left.right.data = t; + node.left = node.left.right; + } + while (node != null) { + node.index++; + node = node.right; + } + size++; + } + + private Node findNodeByIndex(int index) { + if (index >= size) { + throw new ArrayIndexOutOfBoundsException("index:" + index); + } + Node resultNode = null; + Node origin = null; + int half = size >> 1; + if (index > half) { + origin = last; + while (origin.index != index) { + origin = origin.left; + } + } else { + origin = head; + while (origin.index != index) { + origin = origin.right; + } + } + return origin; + } + + @Override + public T get(int index) { + return findNodeByIndex(index).data; + } + + @Override + public T remove(int index) { + Node node = findNodeByIndex(index); + if (null != node.left) { + node.left.right = node.right; + } else { + node.right.left = null; + head = node.right; + } + if (null != node.right) { + node.right.left = node.left; + while (node.right == null) { + node.right.index--; + } + } else { + node.left.right = null; + last = node.left; + } + size--; + return node.data; + } + + @Override + public int size() { + return size; + } + + @Override + public void enQueue(T t) { + add(t); + } + + @Override + public T deQueue() { + if (0 >= size) { + throw new NullPointerException("remove is null"); + } + T t = null; + Node node = findNodeByIndex(0); + if (null != node) { + t = node.data; + if (null != node.right) { + node.right.left = null; + Node right = node.right; + head = right; + while (right != null) { + right.index--; + right = right.right; + } + size--; + } else { + head = last = null; + size = 0; + } + } + return t; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public IIterator iterator() { + return new LinkedIteratorImpl<>(); + } + + @Override + public String toString() { + StringBuilder sbToString = new StringBuilder(); + Node temp = head; + while (null != temp){ + sbToString.append(temp.toString()).append("\n"); + temp = temp.right; + } + return sbToString.toString(); + } + + private static class Node { + private T data = null; + private Node left = null; + private Node right = null; + private int index = 0; + + @Override + public String toString() { + return "Node{" + + "data=" + data + + ", index=" + index + + '}'; + } + } + + private class LinkedIteratorImpl implements IIterator { + + private int index = 0; + private Node next; + + @Override + public boolean hasNext() { + return index < size; + } + + @Override + public T next() { + if (0 == index) { + next = (Node) head; + } + if (null == next) { + throw new ArrayIndexOutOfBoundsException("next is null"); + } + Node result = next; + next = next.right; + index++; + return result.data; + } + } +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/StackImpl.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/StackImpl.java new file mode 100644 index 0000000000..0a585ab904 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/StackImpl.java @@ -0,0 +1,60 @@ +package com.java.xiaoqin.impl; + +/** + * Created by xiaoqin on 17-2-26. + */ +public class StackImpl extends ArrayListImpl { + + /** + * 把数据压住栈 + * + * @param t + */ + public void push(T t) { + add(t); + } + + /** + * 返回栈顶数据,并移除出栈 + * + * @return + */ + public T pop() { + if (0 >= size()) { + throw new NullPointerException("size is 0"); + } + return remove(size() - 1); + } + + /** + * 返回栈顶数据 + * + * @return + */ + public T peek() { + if (0 >= size()) { + throw new NullPointerException("size is 0"); + } + return get(size() - 1); + } + + /** + * 是否为null + * + * @return + */ + @Override + public boolean isEmpty() { + return super.isEmpty(); + } + + /** + * 大小 + * + * @return + */ + @Override + public int size() { + return super.size(); + } +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IIterator.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IIterator.java new file mode 100644 index 0000000000..bd83985af4 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IIterator.java @@ -0,0 +1,19 @@ +package com.java.xiaoqin.interfaces; + +/** + * Created by xiaoqin on 17-2-25. + */ +public interface IIterator { + + /** + * 是否有下一个 + * @return + */ + boolean hasNext(); + + /** + * 取出下一个的元素 + * @return + */ + T next(); +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IList.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IList.java new file mode 100644 index 0000000000..7c08a46293 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IList.java @@ -0,0 +1,53 @@ +package com.java.xiaoqin.interfaces; + +/** + * Created by xiaoqin on 17-2-19. + */ +public interface IList { + + /** + * 添加元素 + * @param t + */ + void add(T t); + + /** + * 添加元素在第几个 + * @param index + * @param t + */ + void add(int index,T t); + + /** + * 获取第index个的元素 + * @param index + * @return + */ + T get(int index); + + /** + * 移除第index个的元素 + * @param index + * @return + */ + T remove(int index); + + /** + * 返回List的大小 + * @return + */ + int size(); + + /** + * 是否为empty + * @return + */ + boolean isEmpty(); + + /** + * 返回迭代器 + * @return + */ + IIterator iterator(); + +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IQueue.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IQueue.java new file mode 100644 index 0000000000..4ae4b7d785 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IQueue.java @@ -0,0 +1,15 @@ +package com.java.xiaoqin.interfaces; + +/** + * Created by xiaoqin on 17-2-26. + */ +public interface IQueue { + + void enQueue(T t); + + T deQueue(); + + boolean isEmpty(); + + int size(); +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/ArrayListImplTest.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/ArrayListImplTest.java new file mode 100644 index 0000000000..ce6d903ff2 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/ArrayListImplTest.java @@ -0,0 +1,107 @@ +package test.com.java.xiaoqin.impl; + +import com.java.xiaoqin.impl.ArrayListImpl; +import com.java.xiaoqin.interfaces.IIterator; +import com.java.xiaoqin.interfaces.IList; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * ArrayListImpl Tester. + * + * @author + * @version 1.0 + * @since
二月 26, 2017
+ */ +public class ArrayListImplTest { + + private IList mList; + + @Before + public void before() throws Exception { + mList = new ArrayListImpl<>(); + } + + @After + public void after() throws Exception { + mList = null; + } + + private void addTen() { + for (int i = 0; i < 10; i++) { + mList.add(i); + } + } + + /** + * Method: add(T t) + */ + @Test + public void testAddT() throws Exception { + addTen(); + System.out.println(mList.toString()); + } + + /** + * Method: add(int index, T t) + */ + @Test + public void testAddForIndexT() throws Exception { + addTen(); + mList.add(4, 50); + mList.add(8, 150); + System.out.println(mList.toString()); + } + + /** + * Method: get(int index) + */ + @Test + public void testGet() throws Exception { + addTen(); + Assert.assertEquals(mList.get(5), (Integer) 5); + } + + /** + * Method: remove(int index) + */ + @Test + public void testRemove() throws Exception { + addTen(); + Assert.assertEquals(mList.remove(4), (Integer) 4); + System.out.println(mList); + } + + /** + * Method: size() + */ + @Test + public void testSize() throws Exception { + addTen(); + Assert.assertEquals(mList.size(), 10); + } + + /** + * Method: isEmpty() + */ + @Test + public void testIsEmpty() throws Exception { + System.out.println(mList.isEmpty()); + addTen(); + System.out.println(mList.isEmpty()); + } + + /** + * Method: iterator() + */ + @Test + public void testIterator() throws Exception { + addTen(); + IIterator iterator = mList.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/BinaryTreeNodeTest.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..fa28cdf0d9 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/BinaryTreeNodeTest.java @@ -0,0 +1,46 @@ +package test.com.java.xiaoqin.impl; + +import com.java.xiaoqin.impl.BinaryTreeNode; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * BinaryTreeNode Tester. + * + * @author + * @version 1.0 + * @since
二月 27, 2017
+ */ +public class BinaryTreeNodeTest { + + private BinaryTreeNode binaryTreeNode; + + + @Before + public void before() throws Exception { + binaryTreeNode = new BinaryTreeNode<>(); + } + + @After + public void after() throws Exception { + binaryTreeNode = null; + } + + /** + * Method: insert(T o) + */ + @Test + public void testInsert() throws Exception { + binaryTreeNode.insert(5); + binaryTreeNode.insert(2); + binaryTreeNode.insert(7); + binaryTreeNode.insert(1); + binaryTreeNode.insert(6); + System.out.println(binaryTreeNode.toString()); + binaryTreeNode.insert(4); + binaryTreeNode.insert(8); + System.out.println(binaryTreeNode.toString()); + } + +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IQueueImplTest.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IQueueImplTest.java new file mode 100644 index 0000000000..14bbcac149 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IQueueImplTest.java @@ -0,0 +1,77 @@ +package test.com.java.xiaoqin.impl; + +import com.java.xiaoqin.impl.LinkedListImpl; +import com.java.xiaoqin.interfaces.IQueue; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * IQueueImplTest Tester. + * + * @author + * @version 1.0 + * @since
二月 26, 2017
+ */ +public class IQueueImplTest { + + private IQueue mQueue; + + @Before + public void before() throws Exception { + mQueue = new LinkedListImpl<>(); + } + + @After + public void after() throws Exception { + mQueue = null; + } + + /** + * Method: enQueue(T t) + */ + @Test + public void enQueueT() throws Exception { + for (int i = 0; i < 10; i++) { + mQueue.enQueue(i); + } + System.out.println(mQueue.toString()); + } + + /** + * Method: deQueue + */ + @Test + public void deQueue() throws Exception { + for (int i = 0; i < 10; i++) { + mQueue.enQueue(i); + } + Assert.assertEquals(mQueue.deQueue(), (Integer) 0); + Assert.assertEquals(mQueue.deQueue(), (Integer) 1); + } + + /** + * Method: isEmpty + */ + @Test + public void isEmpty() throws Exception { + Assert.assertEquals(true, mQueue.isEmpty()); + for (int i = 0; i < 10; i++) { + mQueue.enQueue(i); + } + Assert.assertEquals(false, mQueue.isEmpty()); + } + + /** + * Method: size(); + */ + @Test + public void size() throws Exception { + for (int i = 0; i < 10; i++) { + mQueue.enQueue(i); + } + Assert.assertEquals(10, mQueue.size()); + } + +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IStackImplTest.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IStackImplTest.java new file mode 100644 index 0000000000..a55667aadb --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IStackImplTest.java @@ -0,0 +1,90 @@ +package test.com.java.xiaoqin.impl; + +import com.java.xiaoqin.impl.StackImpl; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * IQueueImplTest Tester. + * + * @author + * @version 1.0 + * @since
二月 26, 2017
+ */ +public class IStackImplTest { + + private StackImpl mStack; + + @Before + public void before() throws Exception { + mStack = new StackImpl<>(); + } + + @After + public void after() throws Exception { + mStack = null; + } + + /** + * Method: push(T t) + */ + @Test + public void pushT() throws Exception { + for (int i = 0; i < 10; i++) { + mStack.push(i); + } + System.out.println(mStack.toString()); + } + + /** + * Method: pop + */ + @Test + public void pop() throws Exception { + for (int i = 0; i < 10; i++) { + mStack.push(i); + } + Assert.assertEquals(mStack.pop(), (Integer) 9); + Assert.assertEquals(mStack.pop(), (Integer) 8); + } + + /** + * Method: peek + */ + @Test + public void peek() throws Exception { + Assert.assertEquals(true, mStack.isEmpty()); + for (int i = 0; i < 10; i++) { + mStack.push(i); + } + Assert.assertEquals(mStack.peek(), (Integer) 9); + Assert.assertEquals(mStack.peek(), (Integer) 9); + Assert.assertEquals(mStack.peek(), (Integer) 9); + } + + /** + * Method: isEmpty + */ + @Test + public void isEmpty() throws Exception { + Assert.assertEquals(true, mStack.isEmpty()); + for (int i = 0; i < 10; i++) { + mStack.push(i); + } + Assert.assertEquals(false, mStack.isEmpty()); + } + + /** + * Method: size(); + */ + @Test + public void size() throws Exception { + for (int i = 0; i < 10; i++) { + mStack.push(i); + } + Assert.assertEquals(10, mStack.size()); + } + +} diff --git a/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/LinkedListImplTest.java b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/LinkedListImplTest.java new file mode 100644 index 0000000000..669f88d9b1 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/LinkedListImplTest.java @@ -0,0 +1,108 @@ +package test.com.java.xiaoqin.impl; + +import com.java.xiaoqin.impl.LinkedListImpl; +import com.java.xiaoqin.interfaces.IIterator; +import com.java.xiaoqin.interfaces.IList; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * LinkedListImpl Tester. + * + * @author + * @version 1.0 + * @since
二月 26, 2017
+ */ +public class LinkedListImplTest { + + private IList mList; + + @Before + public void before() throws Exception { + mList = new LinkedListImpl<>(); + } + + @After + public void after() throws Exception { + mList = null; + } + + private void addTen() { + for (int i = 0; i < 10; i++) { + mList.add(i); + } + } + + /** + * Method: add(T t) + */ + @Test + public void testAddT() throws Exception { + addTen(); + System.out.println(mList.toString()); + } + + /** + * Method: add(int index, T t) + */ + @Test + public void testAddForIndexT() throws Exception { + addTen(); + mList.add(4, 50); + mList.add(8, 150); + System.out.println(mList.toString()); + } + + /** + * Method: get(int index) + */ + @Test + public void testGet() throws Exception { + addTen(); + Assert.assertEquals(mList.get(5), (Integer) 5); + } + + /** + * Method: remove(int index) + */ + @Test + public void testRemove() throws Exception { + addTen(); + Assert.assertEquals(mList.remove(4), (Integer) 4); + System.out.println(mList); + } + + /** + * Method: size() + */ + @Test + public void testSize() throws Exception { + addTen(); + Assert.assertEquals(mList.size(), 10); + } + + /** + * Method: isEmpty() + */ + @Test + public void testIsEmpty() throws Exception { + System.out.println(mList.isEmpty()); + addTen(); + System.out.println(mList.isEmpty()); + } + + /** + * Method: iterator() + */ + @Test + public void testIterator() throws Exception { + addTen(); + IIterator iterator = mList.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } + +} diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/res/struts.xml b/group05/591010847/job_2017_02/job_2017_02_26_Struts/res/struts.xml new file mode 100644 index 0000000000..92c2e5800b --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/res/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/array/ArrayUtil.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/array/ArrayUtil.java new file mode 100644 index 0000000000..75ae466816 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/array/ArrayUtil.java @@ -0,0 +1,229 @@ +package com.java.xiaoqin.array; + +import java.util.Objects; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if (null != origin) { + int[] temp = new int[origin.length]; + System.arraycopy(origin, 0, temp, 0, origin.length); + for (int index = origin.length; index > 0; index--) { + origin[origin.length - index] = temp[index - 1]; + } + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int size = 0; + int[] newArray = new int[oldArray.length]; + for (int indexO = 0; indexO < oldArray.length; indexO++) { + if (0 == oldArray[indexO]) { + continue; + } + newArray[size++] = oldArray[indexO]; + } + int[] returnArray = new int[size]; + System.arraycopy(newArray, 0, returnArray, 0, returnArray.length); + return returnArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int[] mergeArray = new int[array1.length + array2.length]; + int size = 0; + for (int index = 0, max = Math.max(array1.length, array2.length); index < max; index++) { + Object arrObj1 = null; + Object arrObj2 = null; + if (index < array1.length) { + arrObj1 = array1[index]; + } + if (index < array2.length) { + arrObj2 = array2[index]; + } + if (null != arrObj1 && Objects.equals(arrObj1, arrObj2)) { + arrObj2 = null; + } + for (int indexMerge = 0; indexMerge < size; indexMerge++) { + if (Objects.equals(arrObj1, mergeArray[indexMerge])) { + arrObj1 = null; + } + if (Objects.equals(arrObj2, mergeArray[indexMerge])) { + arrObj2 = null; + break; + } + } + if (null != arrObj1 && null != arrObj2 && (int) arrObj1 > (int) arrObj2) { + arrObj1 = (int) arrObj1 + (int) arrObj2; + arrObj2 = (int) arrObj1 - (int) arrObj2; + arrObj1 = (int) arrObj1 - (int) arrObj2; + } + if (null != arrObj1) { + mergeArray[size++] = (int) arrObj1; + } + if (null != arrObj2) { + mergeArray[size++] = (int) arrObj2; + } + } + int[] resultArr = new int[size]; + System.arraycopy(mergeArray, 0, resultArr, 0, size); + return resultArr; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + for (int indexOld = 0; indexOld < oldArray.length; indexOld++) { + newArray[indexOld] = oldArray[indexOld]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + int[] newArray = new int[0]; + if (max > 1) { + int size = 0; + newArray = new int[max]; + if (max >= 1) { + for (int n = 1; n < Integer.MAX_VALUE; n++) { + int fibonacci = mFibonacci(n); + if (fibonacci < max) { + newArray[size++] = fibonacci; + } else { + break; + } + } + } + int[] resultArr = new int[size]; + System.arraycopy(newArray, 0, resultArr, 0, size); + newArray = resultArr; + } + return newArray; + } + + private int mFibonacci(int n) { + if (n == 0) return 0; + else if (n == 1) return 1; + else return mFibonacci(n - 1) + mFibonacci(n - 2); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int[] newArray = new int[max]; + int size = 0; + for (int index = 2; index < max; index++) { + if (isPrimes(index)) { + newArray[size++] = index; + } + } + int[] resultArr = new int[size]; + System.arraycopy(newArray, 0, resultArr, 0, size); + return resultArr; + } + + private boolean isPrimes(int number) { + int i = 1; + while (++i < number) { + if (number % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int[] newArray = new int[max]; + int size = 0; + for (int i = 6; i < max; i++) { + int total = 0; + for (int index = 1, length = i / 2; index <= length; index++) { + if (i % index == 0) { + total += index; + } + } + if (i == total) { + newArray[size++] = i; + } + } + int[] resultArr = new int[size]; + System.arraycopy(newArray, 0, resultArr, 0, size); + return resultArr; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + StringBuilder arrBuilder = new StringBuilder(); + for (int arr : array) { + if (arrBuilder.length() > 0) { + arrBuilder.append(seperator); + } + arrBuilder.append(arr); + } + return arrBuilder.toString(); + } + + +} diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/Struts.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/Struts.java new file mode 100644 index 0000000000..0726c17779 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/Struts.java @@ -0,0 +1,64 @@ +package com.java.xiaoqin.litestruts; + +import com.java.xiaoqin.litestruts.bean.View; +import com.java.xiaoqin.litestruts.manager.StrutsParseManager; +import com.java.xiaoqin.litestruts.util.ReflectUtils; + +import java.net.URL; +import java.util.Map; + + +public class Struts { + + private static final String METHOD_EXECUTE = "execute"; + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + URL resourceURL = Struts.class.getResource("/struts.xml"); + StrutsParseManager.getInstance().init(resourceURL.getPath()); + + String className = StrutsParseManager.getInstance().findClassNameByActionName(actionName); + + Object instance = ReflectUtils.newInstance(className); + if (null != parameters) { + for (Map.Entry paramSet : parameters.entrySet()) { + ReflectUtils.setMethod(instance, paramSet.getKey(), paramSet.getValue()); + } + } + + Object resultExecute = ReflectUtils.executeMethod(instance, METHOD_EXECUTE); + + Map getMap = ReflectUtils.executeGets(instance); + + View view = new View(); + view.setParameters(getMap); + + if (resultExecute instanceof String) { + String result = StrutsParseManager.getInstance().getResult(actionName, (String) resultExecute); + view.setJsp(result); + } + + return view; + } + +} diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LoginAction.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LoginAction.java new file mode 100644 index 0000000000..de6a7aefca --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LoginAction.java @@ -0,0 +1,39 @@ +package com.java.xiaoqin.litestruts.action; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LogoutAction.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LogoutAction.java new file mode 100644 index 0000000000..b26cce5630 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LogoutAction.java @@ -0,0 +1,7 @@ +package com.java.xiaoqin.litestruts.action; + +/** + * Created by xiaoqin on 17-3-5. + */ +public class LogoutAction { +} diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/ActionBean.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/ActionBean.java new file mode 100644 index 0000000000..91f9f8f213 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/ActionBean.java @@ -0,0 +1,41 @@ +package com.java.xiaoqin.litestruts.bean; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by xiaoqin on 17-3-5. + */ +public class ActionBean { + private String className; + private Map result; + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public Map getResult() { + return result; + } + + public void setResult(Map result) { + this.result = result; + } + + public void addResult(String name, String text) { + if (null == result) result = new HashMap<>(); + result.put(name, text); + } + + @Override + public String toString() { + return "ActionBean{" + + "className='" + className + '\'' + + ", result=" + result + + '}'; + } +} diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/View.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/View.java new file mode 100644 index 0000000000..d3cb44085c --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/View.java @@ -0,0 +1,23 @@ +package com.java.xiaoqin.litestruts.bean; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/manager/StrutsParseManager.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/manager/StrutsParseManager.java new file mode 100644 index 0000000000..fc7ac10f89 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/manager/StrutsParseManager.java @@ -0,0 +1,95 @@ +package com.java.xiaoqin.litestruts.manager; + +import com.java.xiaoqin.litestruts.bean.ActionBean; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Objects; + +/** + * Created by xiaoqin on 17-3-5. + */ +public class StrutsParseManager { + + private final static String ACTION = "action"; + private final static String ACTION_NAME = "name"; + private final static String ACTION_CLASS = "class"; + private static final String RESULT_NAME = "name"; + + private final static StrutsParseManager INSTANCE = new StrutsParseManager(); + + + private Map mActionBeanMap = new HashMap<>(); + + private StrutsParseManager() { + } + + public static StrutsParseManager getInstance() { + return INSTANCE; + } + + public void init(String path) { + if (!Objects.isNull(path) && !"".equals(path)) { + parseXML(path); + } else { + throw new NullPointerException("path is null"); + } + } + + private void parseXML(String path) { + try { + SAXReader reader = new SAXReader(); + Document document = reader.read(new File(path)); + Element rootElement = document.getRootElement(); + Iterator actionIterator = rootElement.elementIterator(ACTION); + while (actionIterator.hasNext()) { + Object actionObj = actionIterator.next(); + if (actionObj instanceof Element) { + String name = ((Element) actionObj).attributeValue(ACTION_NAME); + String className = ((Element) actionObj).attributeValue(ACTION_CLASS); + ActionBean actionBean = new ActionBean(); + actionBean.setClassName(className); + mActionBeanMap.put(name, actionBean); + Iterator iteratorResult = ((Element) actionObj).elementIterator(); + while (iteratorResult.hasNext()) { + Object resultObj = iteratorResult.next(); + if (resultObj instanceof Element) { + String resultName = ((Element) resultObj).attributeValue(RESULT_NAME); + String resultText = ((Element) resultObj).getText(); + actionBean.addResult(resultName, resultText); + } + } + } + } + } catch (DocumentException e) { + e.printStackTrace(); + } + } + + + public String findClassNameByActionName(String actionName) { + String className = ""; + if (mActionBeanMap.containsKey(actionName)) { + className = mActionBeanMap.get(actionName).getClassName(); + } + return className; + } + + public String getResult(String actionName, String result) { + String resultResult = ""; + if (mActionBeanMap.containsKey(actionName)) { + Map actionResult = mActionBeanMap.get(actionName).getResult(); + if (null != actionResult && actionResult.containsKey(result)) { + resultResult = actionResult.get(result); + } + + } + return resultResult; + } +} diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/util/ReflectUtils.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/util/ReflectUtils.java new file mode 100644 index 0000000000..1fc3ff1e1c --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/util/ReflectUtils.java @@ -0,0 +1,75 @@ +package com.java.xiaoqin.litestruts.util; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by xiaoqin on 17-3-5. + */ +public class ReflectUtils { + + public static Object newInstance(String className) { + Object obj = null; + try { + Class aClass = Class.forName(className); + obj = aClass.newInstance(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } + return obj; + } + + public static void setMethod(Object obj, String methodName, String paramter) { + try { + StringBuilder methodNameBuilder = new StringBuilder(); + methodNameBuilder.append("set").append(methodName.substring(0, 1).toUpperCase()).append(methodName.substring(1)); + Method method = obj.getClass().getMethod(methodNameBuilder.toString(), String.class); + method.invoke(obj, paramter); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + public static Object executeMethod(Object obj, String methodName) { + Object resultObj = null; + try { + Method method = obj.getClass().getMethod(methodName); + resultObj = method.invoke(obj); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return resultObj; + } + + public static Map executeGets(Object obj) { + Map resultMap = new HashMap<>(); + try { + Method[] methods = obj.getClass().getMethods(); + for (Method method : methods) { + String methodName = method.getName(); + if (methodName.startsWith("get")) { + resultMap.put(methodName.substring(3, 4).toLowerCase() + methodName.substring(4), method.invoke(obj)); + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return resultMap; + } +} diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/array/ArrayUtilTest.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/array/ArrayUtilTest.java new file mode 100644 index 0000000000..ea196a50ca --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/array/ArrayUtilTest.java @@ -0,0 +1,110 @@ +package test.com.java.xiaoqin.array; + +import com.java.xiaoqin.array.ArrayUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + +/** + * ArrayUtil Tester. + * + * @author + * @version 1.0 + * @since
三月 4, 2017
+ */ +public class ArrayUtilTest { + + private ArrayUtil mArrayUtil; + + @Before + public void before() throws Exception { + mArrayUtil = new ArrayUtil(); + } + + @After + public void after() throws Exception { + mArrayUtil = null; + } + + /** + * Method: reverseArray(int[] origin) + */ + @Test + public void testReverseArray() throws Exception { + int[] origin = {7, 9, 30, 3}; + mArrayUtil.reverseArray(origin); + System.out.println(Arrays.toString(origin)); + } + + /** + * Method: removeZero(int[] oldArray) + */ + @Test + public void testRemoveZero() throws Exception { + int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + System.out.println(Arrays.toString(mArrayUtil.removeZero(oldArr))); + } + + /** + * Method: merge(int[] array1, int[] array2) + */ + @Test + public void testMerge() throws Exception { + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + int[] mergeArr = mArrayUtil.merge(a1, a2); + System.out.println(Arrays.toString(mergeArr)); + } + + /** + * Method: grow(int[] oldArray, int size) + */ + @Test + public void testGrow() throws Exception { + int[] oldArray = {2, 3, 6}; + int[] growArray = mArrayUtil.grow(oldArray, 3); + System.out.println(Arrays.toString(growArray)); + } + + /** + * Method: fibonacci(int max) + */ + @Test + public void testFibonacci() throws Exception { + int[] fibonacciArray = mArrayUtil.fibonacci(1); + System.out.println(Arrays.toString(fibonacciArray)); + fibonacciArray = mArrayUtil.fibonacci(15); + System.out.println(Arrays.toString(fibonacciArray)); + } + + /** + * Method: getPrimes(int max) + */ + @Test + public void testGetPrimes() throws Exception { + int[] primes = mArrayUtil.getPrimes(23); + System.out.println(Arrays.toString(primes)); + } + + /** + * Method: getPerfectNumbers(int max) + */ + @Test + public void testGetPerfectNumbers() throws Exception { + int[] perfectNumbers = mArrayUtil.getPerfectNumbers(10000); + System.out.println(Arrays.toString(perfectNumbers)); + } + + /** + * Method: join(int[] array, String seperator) + */ + @Test + public void testJoin() throws Exception { + String join = mArrayUtil.join(new int[]{3, 8, 9}, "-"); + System.out.println(join); + } + + +} diff --git a/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/litestruts/StrutsTest.java b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/litestruts/StrutsTest.java new file mode 100644 index 0000000000..a6b8645648 --- /dev/null +++ b/group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/litestruts/StrutsTest.java @@ -0,0 +1,41 @@ +package test.com.java.xiaoqin.litestruts; + +import com.java.xiaoqin.litestruts.Struts; +import com.java.xiaoqin.litestruts.bean.View; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group05/810574652/.classpath b/group05/810574652/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group05/810574652/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group05/810574652/.gitignore b/group05/810574652/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group05/810574652/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group05/810574652/.project b/group05/810574652/.project new file mode 100644 index 0000000000..292266f147 --- /dev/null +++ b/group05/810574652/.project @@ -0,0 +1,17 @@ + + + 810574652HomeWork + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework1/ArrayList.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/ArrayList.java new file mode 100644 index 0000000000..2fb0968eb5 --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/ArrayList.java @@ -0,0 +1,81 @@ +package com.github.PingPi357.coding2017.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + private static final int DEFAULT_CAPACITY = 100; // 定义静态final类型, + // final在一个对象类唯一, + // static + // final在多个对象中都唯一,如果作为常量用的话,只是final的话就得在别的类引用的时候要创建对象,会占用不必要的空间,而加上static的话在编译的时候占用一个空间,其他时候就不会再占用空间了。所以常量一般用static修饰,其他时候看你自己的需要 + // 理解:比如我是一个维修工人....public相当于我接任何活,static相当于10分钟之内赶到,final相当于就我一家. + // reference: http://bbs.itheima.com/thread-162971-1-1.html + + int size = 0; // 如果是中文分号,报错:Syntax error on token "invalid Character", ; + // excepted; + + private Object[] elementData = new Object[DEFAULT_CAPACITY]; // new + // Object后面接的是中括号 + + @Override + public void add(Object o) { + // TODO Auto-generated method stub + ensureCapacity(++size); // size自加操作 + elementData[size - 1] = o; + } + + private void ensureCapacity(int minCapacity) { + // TODO Auto-generated method stub + if (minCapacity <= elementData.length) { // 当满足小于等于的情况 ??? + return; + } else { + elementData = Arrays.copyOf(elementData, minCapacity); // elementData写错为elementDta,导致报错 elementDta + // cannot be + // resolved + // as a + // variable + // 这里为什么不直接是minCapacity 而要加上原始elementData.length???? + } + } + + @Override + public void add(int index, Object o) { + // TODO Auto-generated method stub + if (index > size || index < 0) { + throw new ArrayIndexOutOfBoundsException(); + } + ensureCapacity(++size); // size自加操作 + for (int i = size - 2; i > index - 1; i--) { // for中用';'号隔开; + // ???i应该从size-2开始赋值 + // ???终止条件为i>index-1 + elementData[i + 1] = elementData[i]; + } + elementData[index] = o; // 插入元素 + } + + @Override + public Object remove(int index) { + if (this.size > 0 && index < (this.size)) { + Object o = elementData[index]; + for (int i = index; i < this.size; i++) { + elementData[i] = elementData[i + 1]; + } + this.size--; + return o; + } else { + return null; + } + } + + @Override + public Object get(int index) { + // TODO Auto-generated method stub + return elementData[index]; // 必须进行角标越界检查吗??? + } + + @Override + public int size() { + // TODO Auto-generated method stub + return this.size; + } + +} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework1/LinkedList.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/LinkedList.java new file mode 100644 index 0000000000..4e1ebda327 --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/LinkedList.java @@ -0,0 +1,131 @@ +package com.github.PingPi357.coding2017.basic; + + +//实现单向单端列表 +public class LinkedList implements List { + private Node head = new Node(); // 定义链表的头节点 + private Node current; + private int size; + + public LinkedList() { + head = null; + size = 0; + } + + @Override + public void add(Object o) { + if (null == head) { // 头结点为空,直接放在头结点上 + head.data = o; + head.next = null; + size++; + } else { + current = head; + while (!(current.next == null)) { // 找到链表的末尾节点,在其后增加 + current = current.next; + } + current.next = new Node(); + current.next.data = o; + current.next.next = null; + size++; + } + } + + public void addFirst(Object o) { + if (null == head) { + head.data = o; + head.next = null; + size++; + } else { + current = new Node(); + current.data = o; + current.next = head; + head = current; + size++; + } + } + + public void addLast(Object o) { + if (!(head == null)) { + current = head; + while (!(current.next == null)) { + current = current.next; + } + current.next = new Node(); + current.next.data = o; + current.next.next = current.next; + size++; + } + } + + @Override + public void add(int index, Object o) { + // TODO Auto-generated method stub + + } + + @Override + public Object remove(int index) { + // TODO Auto-generated method stub + if (index < size && index > 1) { // 为什么index>1??? + current = head; + for (int i = 0; i < index - 1; i++) { + current = current.next; // 遍历到指定到index的上一个节点 + } + current.next = current.next.next; + size--; + } + return null; + } + + public Object removeFirst() { + if (!(head == null)) { + Node removeHead = head; + head.next = head.next.next; + size--; + return removeHead; + } else + return null; + } + + public Object removeLast() { + if (!(head == null)) { + Node theNext = current.next; + Node oldLast; + while (theNext.next != null) { + current = theNext; + theNext = theNext.next; + } + oldLast = current.next; + current.next = theNext.next; + + size--; + return oldLast; + } else + return null; + + } + + @Override + public Object get(int index) { + // TODO Auto-generated method stub + if (index < size) { + current = head; + for (int i = 0; i < index; i++) { + current = current.next; + } + return current.data; + } else + return null; + } + + @Override + public int size() { + return this.size; + } + + private static class Node { // 创建Node类,定义Node类的两个属性 + Object data; + Node next; + } + +} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework1/List.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/List.java new file mode 100644 index 0000000000..d9cbdec7b4 --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/List.java @@ -0,0 +1,17 @@ +package com.github.PingPi357.coding2017.basic; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); // Object 首字母大写,不然会出现"object" can not + // be resolved a type错误 + + public Object remove(int index); + + public Object get(int index); + + public int size(); // 获取List的实际大小,而length定义的是总的容量 + /* + * public void change(int index, Object o); 实现改变特定index处的值 + */ +} \ No newline at end of file diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework1/Queue.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/Queue.java new file mode 100644 index 0000000000..709d0f4059 --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/Queue.java @@ -0,0 +1,18 @@ +package com.github.PingPi357.coding2017.basic; + +public class Queue { + private LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o) { + linkedList.addLast(o); + } + + public Object deQueue() { + Object removeQueue = linkedList.removeFirst(); + return removeQueue; + } + + public int size() { + return linkedList.size(); + } +} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework1/Stack.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/Stack.java new file mode 100644 index 0000000000..2267cd05d4 --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/Stack.java @@ -0,0 +1,33 @@ +package com.github.PingPi357.coding2017.basic; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + int size = 0; + + public void push(Object o){ + elementData.add(o); + size++; + } + + public Object pop(){ + if(this.isEmpty()==true) + { + throw new EmptyStackException(); + } + ArrayList popData = (ArrayList) elementData.remove(elementData.size()-1); + size--; + return popData; + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size()==0; + } + public int size(){ + return this.size; + } +} diff --git "a/group05/810574652/src/com/github/PingPi357/coding2017/homework1/\350\257\264\346\230\216" "b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/\350\257\264\346\230\216" new file mode 100644 index 0000000000..8fd2d3fbb1 --- /dev/null +++ "b/group05/810574652/src/com/github/PingPi357/coding2017/homework1/\350\257\264\346\230\216" @@ -0,0 +1,2 @@ +代码实现主要参考了waking2017(441517454)和C-Bobo(183127807)两位的代码完成, +自己仿照敲了一遍,加了些注释,同时在此基础上改了些 diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/ArrayUtil.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/ArrayUtil.java new file mode 100644 index 0000000000..b12c28c589 --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/ArrayUtil.java @@ -0,0 +1,203 @@ +package com.github.PingPi357.coding2017.homework2; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public int[] reverseArray(int[] origin) { + int len = origin.length; + int[] temp = new int[len]; + for (int i = 0; i < len; i++) { + temp[i] = origin[--len]; + } + return temp; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int[] newArray = new int[oldArray.length]; + int i = 0; + for (int element : oldArray) { + if (element != 0) { + newArray[i++] = element; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + ArrayList list = new ArrayList(); + int k1=0; + int k2 = 0; + for (int i = 0; i < array1.length; i++) { + for (int j = k2; j < array2.length; j++) { + if (array1[i] < array2[j]) { + list.add(array1[i]); + k1++; + break; + } else if(array1[i] > array2[j]) { + list.add(array2[j]); + k2++; + }else{ + list.add(array1[i]); + k1++; + k2++; + break; + } + } + if(k2==array2.length-1){ + for (; k1 <= array1.length-1 ; k1++) { + list.add(array1[k1]); + } + break; + } + if(k1== array1.length-1){ + for (; k2 <= array2.length-1 ; k2++) { + list.add(array2[k2]); + } + break; + } + } + + + int[] mergeArray = arrayListToArray(list); + return mergeArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] growArray = Arrays.copyOf(oldArray, oldArray.length + size); + return growArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + int a = 1; + int b = 1; + int fibMaxNum = 1; + ArrayList list=new ArrayList(); + list.add(1); + if (max <= 1) { + return new int[0]; + } + while (max > fibMaxNum) { + list.add(fibMaxNum); + fibMaxNum = a + b; + b = fibMaxNum; + a = b; + } + return arrayListToArray(list); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + ArrayList list =new ArrayList(); + for(int i=2; i <=max-1;i++){ + boolean flag=true; + for(int j=2; j < Math.floor(i/2); j++){ + if(i%j==0){ + flag=false; + break; + } + } + if(!flag){ + list.add(i); + } + } + return arrayListToArray(list); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + ArrayList list =new ArrayList(); + int sum=0; + if(max<=1){ + return null; + } + for(int i=1;i <=(max-1);i++){ + for(int j=1; j<=i/2;j++){ + if(i%j==0){ + sum+=j; + } + } + if(sum==i){ + list.add(i); + } + } + return arrayListToArray(list); + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + StringBuilder sb=new StringBuilder(); + sb.append(array[0]); + for(int i=1;i list) { + int[] Array = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + Array[i] = (int) list.get(i); + } + return Array; + } +} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/LoginAction.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/Struts.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/Struts.java new file mode 100644 index 0000000000..85e2e22de3 --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/Struts.java @@ -0,0 +1,34 @@ +package com.coderising.litestruts; + +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/StrutsTest.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/View.java b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/struts.xml b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/struts.xml new file mode 100644 index 0000000000..a6cfe43e6c --- /dev/null +++ b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git "a/group05/810574652/src/com/github/PingPi357/coding2017/homework2/\350\257\264\346\230\216" "b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/\350\257\264\346\230\216" new file mode 100644 index 0000000000..0ef3e2e2f8 --- /dev/null +++ "b/group05/810574652/src/com/github/PingPi357/coding2017/homework2/\350\257\264\346\230\216" @@ -0,0 +1 @@ +"litestruts"作业暂时超出能力范围内,仍在查找资料解决中...... \ No newline at end of file diff --git a/group05/group05.md b/group05/group05.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group05/group05.md @@ -0,0 +1 @@ + diff --git a/group06/1049564215/src/com/coding/basic/MyArrayList.java b/group06/1049564215/src/com/coding/basic/MyArrayList.java new file mode 100644 index 0000000000..13a0bd64a0 --- /dev/null +++ b/group06/1049564215/src/com/coding/basic/MyArrayList.java @@ -0,0 +1,49 @@ +import java.util.*; + +/** + * @author CCD + * + */ +public class MyArrayList { + + private Object[] elementData = new Object[100]; + private int size = 100 ; + + public void add(Object o){ + elementData[size++] = o; + } + public void add(int index, Object o){ + if(index > size || index < 0) + throw new IndexOutOfBoundsException("index "+ index +"is biger than size" + size+ + "index is less than 0"); + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + if(index > size || index < 0) + throw new IndexOutOfBoundsException("index "+ index +"is biger than size" + size+ + "index is less than 0"); + return elementData[index]; + } + + public Object remove(int index){ + if(index > size || index < 0) + throw new IndexOutOfBoundsException("index "+ index +"is biger than size" + size+ + "index is less than 0"); + Object E = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, + size - index - 1); + elementData[--size] = null; + return E; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } +} diff --git a/group06/1049564215/src/com/coding/basic/MyLinkedList.java b/group06/1049564215/src/com/coding/basic/MyLinkedList.java new file mode 100644 index 0000000000..275bf14a4f --- /dev/null +++ b/group06/1049564215/src/com/coding/basic/MyLinkedList.java @@ -0,0 +1,124 @@ +import java.util.*; + +public class MyLinkedList implements List { + + private Node first; + private Node last; + private int size = 0 ; + public void Myadd(Object o){ + final Node l = last; + final Node newNode = new Node(l,o,null); + last = newNode; + if(l == null) + first = newNode; + else + l.next = newNode; + size++; + } + public void Myadd(int index , Object o){ + checkPosition(index); + if(index == size){ + Myadd(o); + } + else{ + final Node PreNode =GetNodeByIndex(index).prev; + final Node newNode = new Node(PreNode,o,GetNodeByIndex(index)); + PreNode.next =newNode; + if(PreNode == null) + first = newNode; //ΪʲôҪָ룿 + else + PreNode.next = newNode; + size++; + } + } + public Object get(int index){ + checkPosition(index); + return GetNodeByIndex(index); + } + public void remove(int index){ + Node node = GetNodeByIndex(index); + node.prev.next = node.next; + node.next.prev = node.prev; + node = null; + size--; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + final Node FirstNode= first; + final Node newNode = new Node(null,o,first); + first = newNode; + if(FirstNode == null) + last = newNode; + else + first.prev = newNode; + size++; + + } + public void addLast(Object o){ + final Node LastNode = last; + final Node newNode = new Node(last,o,null); + last = newNode; + if(last == null) + first = newNode; + else + last.next = newNode; + size++; + } + public void removeFirst(){ + final Node f = first; + if(f == null) + throw new NoSuchElementException(); + first = f.next; + first = null; + size--; + } + public void removeLast(){ + final Node f = last; + if(f == null) + throw new NoSuchElementException(); + last = last.prev; + last = null; + size--; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object item; + Node next; + Node prev; + Node (Node prev,Object element ,Node next){ + this.item = element; + this.next = next; + this.prev = prev; + } + } + + private Node GetNodeByIndex(int index){ + if(index > size/2) + { + Node Temp = first; + for(int i = 0; i< index;i++) + Temp = Temp.next; // + return Temp; + } + else + { + Node Temp = last; + for(int i = size-1; i> index; i--) + Temp = Temp.prev; + return Temp; + } + } + + private void checkPosition(int index){ + if(index < 0 || index > size) + throw new IndexOutOfBoundsException("index:"+ index+"is llegal"); + } +} \ No newline at end of file diff --git a/group06/1049564215/src/com/coding/basic/MyQueue.java b/group06/1049564215/src/com/coding/basic/MyQueue.java new file mode 100644 index 0000000000..c36703c145 --- /dev/null +++ b/group06/1049564215/src/com/coding/basic/MyQueue.java @@ -0,0 +1,52 @@ + +/** + * @author CCD + * + */ + +import java.util.*; + +public class MyQueue { + + private static final int DEFAULT_SIZE = 10; + + private Object[] elementData; + private int head; + private int tail; + public MyQueue(){ + this(DEFAULT_SIZE); + } + public MyQueue(int size){ + this.elementData = new Object[size]; + this.head = 0; + this.tail = 0; + } + + public void enQueue(Object o){ + if((tail+1)%elementData.length == head){ + } + else{ + elementData[tail] = o; + tail = (tail+1)%elementData.length; + } + } + + public Object deQueue(){ + if(head == tail){ + return null; + } + else{ + Object o = elementData[head]; + head = (head+1)% elementData.length; + return o ; + } + } + + public boolean isEmpty(){ + return head == tail ; + } + + public int size(){ + return (tail-head)&(elementData.length -1); + } +} diff --git a/group06/1049564215/src/com/coding/basic/MyStack.java b/group06/1049564215/src/com/coding/basic/MyStack.java new file mode 100644 index 0000000000..f7968adb00 --- /dev/null +++ b/group06/1049564215/src/com/coding/basic/MyStack.java @@ -0,0 +1,45 @@ +import java.util.*; + +/** + * + */ + +/** + * @author CCD + * + */ +public class MyStack { + + private ArrayList elementData = new ArrayList(); + private Object[] Myelement = elementData.toArray(); + private int Length = elementData.size(); + + public void push(Object E){ + Myelement[++Length] = E ; + } + + public Object pop(){ + int NowLength = size()-1; + Object obj = peek(); + Length--; + Myelement[Length] = null ; + return obj; + } + + public Object peek(){ + int NowLength = size(); + if(NowLength == 0) + throw new EmptyStackException(); + NowLength -= 1 ; + if(NowLength >= Length ) + throw new ArrayIndexOutOfBoundsException(NowLength + " >= " + Length); + return Myelement[NowLength]; + + } + public boolean isEmpty(){ + return size() == 0; + } + public int size(){ + return Length; + } +} diff --git a/group06/1259131938/JavaLearning/.classpath b/group06/1259131938/JavaLearning/.classpath new file mode 100644 index 0000000000..18d70f02cb --- /dev/null +++ b/group06/1259131938/JavaLearning/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group06/1259131938/JavaLearning/.gitignore b/group06/1259131938/JavaLearning/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group06/1259131938/JavaLearning/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group06/1259131938/JavaLearning/.project b/group06/1259131938/JavaLearning/.project new file mode 100644 index 0000000000..63b66d0b73 --- /dev/null +++ b/group06/1259131938/JavaLearning/.project @@ -0,0 +1,17 @@ + + + JavaLearning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group06/1259131938/JavaLearning/.settings/org.eclipse.jdt.core.prefs b/group06/1259131938/JavaLearning/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..8000cd6ca6 --- /dev/null +++ b/group06/1259131938/JavaLearning/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/group06/1259131938/JavaLearning/src/com/coding/basic/BinaryTreeNode.java b/group06/1259131938/JavaLearning/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group06/1259131938/JavaLearning/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group06/1259131938/JavaLearning/src/com/coding/basic/Iterator.java b/group06/1259131938/JavaLearning/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group06/1259131938/JavaLearning/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group06/1259131938/JavaLearning/src/com/coding/basic/List.java b/group06/1259131938/JavaLearning/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group06/1259131938/JavaLearning/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group06/1259131938/JavaLearning/src/com/coding/basic/MyArrayList.java b/group06/1259131938/JavaLearning/src/com/coding/basic/MyArrayList.java new file mode 100644 index 0000000000..255b748204 --- /dev/null +++ b/group06/1259131938/JavaLearning/src/com/coding/basic/MyArrayList.java @@ -0,0 +1,77 @@ +package com.coding.basic; + +/** + * @deprecated 用数组实现list + * @author wang + * + */ +public class MyArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + // 确保数组大小 + ensureCapacity(size + 1); + // 数组赋值并使得size+1; + elementData[size ++] = o; + size ++; + } + + /** + * 确保数组不越界,否则就扩容; + * @param minCapacity list的大小; + */ + public void ensureCapacity(int minCapacity) { + int oldCapacity = elementData.length; + int newCapacity = (oldCapacity / 3) * 2 + 1; + if (minCapacity > newCapacity) { + // 对数组扩容 + Object[] newDate = new Object[newCapacity]; + System.arraycopy(elementData, 0, newDate, 0, oldCapacity); + elementData = newDate; + } + } + + public void add(int index, Object o){ + // 对index进行校验: + rangeCheck(index); + ensureCapacity(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size ++; + } + + /** + * 边界检查: + * @param index + */ + private void rangeCheck(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("size" + size + ", index:" + + index); + } + } + + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + + public Object remove(int index){ + rangeCheck(index); + Object oldValue = elementData[index]; + System.arraycopy(elementData, index, elementData, index - 1, size - index); + return oldValue; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group06/1259131938/JavaLearning/src/com/coding/basic/MyLinkedList.java b/group06/1259131938/JavaLearning/src/com/coding/basic/MyLinkedList.java new file mode 100644 index 0000000000..89016c4b35 --- /dev/null +++ b/group06/1259131938/JavaLearning/src/com/coding/basic/MyLinkedList.java @@ -0,0 +1,97 @@ +package com.coding.basic; + + +public class MyLinkedList implements List { + + private Node headNode; + + private Node endNode; + + private int size; + + public void add(Object o){ + add(size,o); + } + public void add(int index , Object o){ + addBefore(getNode(index),o); + } + + // 执行添加元素: + private void addBefore(Node node,Object o) { + Node newNode = new Node(o, node.prev, node.next); + newNode.prev.next = newNode; + newNode.next.prev = newNode; + size ++; + } + + // 获得元素; + private Node getNode(int index) { + Node rtnNode; + if (index > size || index < 0) { + throw new IndexOutOfBoundsException(); + } + if (index < size / 2) { + rtnNode = headNode.next; + for (int i = 0; i < index; i++) { + rtnNode = rtnNode.next; + } + } else { + rtnNode = endNode; + for (int i = size; i > index; i--) { + rtnNode = rtnNode.prev; + } + } + return rtnNode; + } + + public Object get(int index){ + return getNode(index).data; + } + public Object remove(int index){ + return remove(getNode(index)); + } + + private Object remove(Node node) { + node.prev.next = node.next; + node.next.prev = node.prev; + size --; + return node.data; + } + public int size(){ + return size; + } + + public void addFirst(Object o){ + add(headNode.prev); + } + public void addLast(Object o){ + add(endNode.next); + } + public Object removeFirst(){ + remove(headNode); + return headNode.data; + } + public Object removeLast(){ + remove(endNode); + return endNode.data; + } + public Iterator iterator(){ + return null; + } + + public boolean isEmpty(){ + return size == 0; + } + + private static class Node{ + //当前元素,下一个及前一个; + Object data; + Node next; + Node prev; + public Node(Object data,Node prev, Node next) { + this.data = data; + this.next = next; + this.prev = prev; + } + } +} diff --git a/group06/1259131938/JavaLearning/src/com/coding/basic/MyStack.java b/group06/1259131938/JavaLearning/src/com/coding/basic/MyStack.java new file mode 100644 index 0000000000..e576a1826d --- /dev/null +++ b/group06/1259131938/JavaLearning/src/com/coding/basic/MyStack.java @@ -0,0 +1,36 @@ +package com.coding.basic; + +public class MyStack { + private MyArrayList elementData = new MyArrayList(); + + /** + * 入栈 + * @param o + */ + public void push(Object o){ + elementData.add(o); + } + + /** + * 出栈 + * @return + */ + public Object pop(){ + Object oldValue = elementData.get(elementData.size()); + elementData.remove(elementData.size()); + return oldValue; + } + /** + * 查看栈顶元素; + * @return + */ + public Object peek(){ + return elementData.get(elementData.size()); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group06/1259131938/JavaLearning/src/com/coding/basic/Queue.java b/group06/1259131938/JavaLearning/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..9e84a6c6b8 --- /dev/null +++ b/group06/1259131938/JavaLearning/src/com/coding/basic/Queue.java @@ -0,0 +1,20 @@ +package com.coding.basic; + +public class Queue { + MyLinkedList elementData = new MyLinkedList(); + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.remove(elementData.size()); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group06/1378560653/.classpath b/group06/1378560653/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group06/1378560653/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group06/1378560653/.gitignore b/group06/1378560653/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group06/1378560653/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group06/1378560653/.project b/group06/1378560653/.project new file mode 100644 index 0000000000..0feed82399 --- /dev/null +++ b/group06/1378560653/.project @@ -0,0 +1,17 @@ + + + 1378560653Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group06/1378560653/src/com/coderising/array/ArrayUtil.java b/group06/1378560653/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..11fefff510 --- /dev/null +++ b/group06/1378560653/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,208 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int N = origin.length; + for(int i = 0; i < N/2; i++){ + int temp = origin[i]; + origin[i] = origin[N-i-1]; + origin[N-i-1] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int N = oldArray.length; + int[] newArray = new int[N]; + int j = 0; + for(int i = 0; i < N; i++){ + if(oldArray[i] != 0){ + newArray[j] = oldArray[i]; + j++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int N = array1.length + array2.length; + int[] array3 = new int[N]; + System.arraycopy(array1, 0, array3, 0, array1.length); + for(int i = 0; i < N; i++){ + for(int j = 0; j < array2.length; j++){ + if(array3[i] > array2[j]){ + System.arraycopy(array3, i , array3, i+1, N-i-1); + array3[i] = array2[j]; + } + } + } + return array3; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int[] zero = new int[0]; + int[] array = new int[100]; + array[0] = 1; + array[1] = 1; + int i = 1; + + if(max == 1){ + return zero; + }else{ + while(array[i] <= max){ + i++; + if(i > array.length){ + grow(array, i*2); + } + array[i+1] = array[i] + array[i-1]; + } + return array; + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + boolean[] prime = new boolean[max + 1]; + int[] zero = new int[0]; + int[] array = new int[max]; + int q = 1; + if(max == 1 || max ==2){ + return zero; + }else{ + for(int i = 3; i < max; i++) + if(i % 2 == 0){ + prime[i] = false; + }else{ + prime[i] = true; + } + + for(int i = 3; i < Math.sqrt(max); i++){//因子;若n是合数,则其所有因子都不超过sqrt(n) + if(prime[i]) + for(int j = 2 * i; j<= max; j += i){//其倍数 + prime[j] = false; + } + } + array[0] = 2; + for(int p = 0; p < max; p++){ + if(prime[p] == true){ + array[q] = p; + q++; + } + } + return array; + } + } + /*int[] zero = new int[0]; + int[] array = new int[100]; + int k = 0; + + if(max == 1 || max == 2){ + return zero; + }else{ + for(int n = 2; n <= max; n++){ + int isPrime = 1; + for(int i = 2; i < n; i++){ + if(n % i == 0){ + isPrime = 0; + break; + } + if(isPrime == 1){ + array[k] = n; + k++; + } + } + } + return array; + }*/ + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int[] perfectNumbers = new int[max]; + int n = 0; + for(int i = 1; i < max; i++){//i:要判断的数 + int sum = 0; + for(int j = 1; j < i; j++){//j:可能因子 + if(i % j == 0){ + sum += j; + } + } + if(sum == i){ + perfectNumbers[n] = i; + n++; + } + } + return perfectNumbers; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + String s = ""; + for(int i = 0; i < array.length; i++){ + s = s + array[i] + seperator; + } + return s; + } + + +} \ No newline at end of file diff --git a/group06/1378560653/src/com/coderising/litestruts/LoginAction.java b/group06/1378560653/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..76547ac3b3 --- /dev/null +++ b/group06/1378560653/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} \ No newline at end of file diff --git a/group06/1378560653/src/com/coderising/litestruts/StructsTest.java b/group06/1378560653/src/com/coderising/litestruts/StructsTest.java new file mode 100644 index 0000000000..4e761b0b2d --- /dev/null +++ b/group06/1378560653/src/com/coderising/litestruts/StructsTest.java @@ -0,0 +1,40 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + +public class StructsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git a/group06/1378560653/src/com/coderising/litestruts/Struts.java b/group06/1378560653/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..0e73017f99 --- /dev/null +++ b/group06/1378560653/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,56 @@ +package com.coderising.litestruts; + +import java.io.IOException; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction,通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + try { + DocumentBuilder db = dbf.newDocumentBuilder(); + Document document = db.parse("structs.xml"); + NodeList actionList = document.getElementsByTagName("action"); + + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + +} \ No newline at end of file diff --git a/group06/1378560653/src/com/coderising/litestruts/View.java b/group06/1378560653/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..f68a8c438b --- /dev/null +++ b/group06/1378560653/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group06/1378560653/src/com/coderising/litestruts/structs.xml b/group06/1378560653/src/com/coderising/litestruts/structs.xml new file mode 100644 index 0000000000..dd598a3664 --- /dev/null +++ b/group06/1378560653/src/com/coderising/litestruts/structs.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group06/1378560653/src/com/coding/basic/ArrayList.java b/group06/1378560653/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..8d9d0c30fb --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/ArrayList.java @@ -0,0 +1,95 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + if( size <= elementData.length){ + elementData[size + 1] = o; + size++; + }else{ + elementData = grow(elementData, 1); + elementData[size+1] = o; + size++; + } + } + public void add(int index, Object o){ + Object[] temp = new Object[elementData.length]; + for(int i = 0; i= size){ + return false; + }else{ + return true; + } + } + + @Override + public Object next() { + return elementData[pos]; + } + + } + public static Object[] grow(Object[]src, int size){ + Object[] target = new Object[src.length + size]; + System.arraycopy(src, 0, target, 0, src.length); + return target; + } +} diff --git a/group06/1378560653/src/com/coding/basic/BinaryTree.java b/group06/1378560653/src/com/coding/basic/BinaryTree.java new file mode 100644 index 0000000000..042d3d8488 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/BinaryTree.java @@ -0,0 +1,40 @@ +package com.coding.basic; + +public class BinaryTree { + private BinaryTreeNode root; + + public BinaryTreeNode getRoot(){ + return root; + } + + public BinaryTreeNode insert(Object o){ + BinaryTreeNode node = new BinaryTreeNode(o); + if(root == null){ + root = node; + root.setLeft(null); + root.setRight(null); + return root; + }else{ + BinaryTreeNode currentNode = root; + BinaryTreeNode parentNode; + while(true){ + parentNode = currentNode; + + if(((Integer)node.getData()) > ((Integer)currentNode.getData())){ + currentNode = currentNode.getRight(); + if(currentNode == null){ + parentNode.setRight(node); + return node; + } + }else{ + currentNode = currentNode.getLeft(); + if(currentNode == null){ + parentNode.setLeft(node); + return node; + } + } + } + } + } + +} diff --git a/group06/1378560653/src/com/coding/basic/BinaryTreeNode.java b/group06/1378560653/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..a8745a43c3 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,34 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Object data){ + this.left = null; + this.right = null; + this.data = data; + } + + public Object getData() { + return data; + } + public void setData(int data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } +} + diff --git a/group06/1378560653/src/com/coding/basic/Iterator.java b/group06/1378560653/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e7cbd474ec --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group06/1378560653/src/com/coding/basic/LinkedList.java b/group06/1378560653/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..3c82bb9da2 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/LinkedList.java @@ -0,0 +1,164 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size = 0; + + public void add(Object o){ + if(null == head){ + head = new Node(o); + head.next = null; + }else{ + Node pt = head; + while(head.next != null){ + pt = pt.next; + } + pt.next = new Node(o); + pt.next.next =null; + } + size++; + } + + public void add(int index , Object o){ + if(index < size){ + Node pt = head; + for(int i = 0; i < index-1; i++){ + pt = pt.next; + } + Node pt1 = pt.next.next; + pt.next = new Node(o); + pt.next.next = pt1; + size ++; + } + } + public Object get(int index){ + if(index < size){ + Node pt = head; + for(int i = 0; i < index; i++){ + pt = pt.next; + } + return pt.data; + }else{ + return null; + } + } + public Object remove(int index){ + if(index < size){ + Node pt = head; + for(int i = 0; i< index -1;i++){ + pt = pt.next; + } + Node pt1 = pt.next; + pt.next = pt1.next; + return pt1.data; + }else{ + return null; + } + } + + public int size(){ + if(null == head){ + size = 0; + }else{ + Node pt = head; + while(pt.next != null){ + size++; + } + } + return size; + } + + public void addFirst(Object o){ + if(null == head){ + head = new Node(o); + head.next = null; + }else{ + Node pt = new Node(o); + pt.next = head; + head = pt; + } + size++; + } + public void addLast(Object o){ + if(null == head){ + head = new Node(o); + head.next = null; + }else{ + Node pt = head; + while(pt.next != null){ + pt = pt.next; + } + pt.next = new Node(o); + Node pt1 = pt.next; + pt1.next = null; + } + size++; + } + public Object removeFirst(){ + if(null != head){ + Node pt = head; + head = pt.next; + size--; + return head.data; + }else{ + return null; + } + } + public Object removeLast(){ + if(null != head){ + Node pt = head; + while(pt.next.next != null){ + pt = pt.next; + } + Node pt1 = pt.next; + pt.next = null; + size--; + return pt1.data; + }else{ + return null; + } + } + + public Iterator iterator(){ + return new LinkedListIterator(this); + } + + private class LinkedListIterator implements Iterator { + LinkedList linkedlist = null; + int pos = 0; + + private LinkedListIterator(LinkedList linkedlist) { + this.linkedlist = linkedlist; + } + @Override + public boolean hasNext() { + pos++; + if(pos >= size){ + return false; + }else{ + return true; + } + } + + @Override + public Object next() { + Node pt = head; + for(int i = 0; i < pos; i++ ){ + while(pt.next != null){ + pt = pt.next; + } + } + return pt.data; + } + + } + + private static class Node{ + public Node(Object o) { + this.data = o; + } + Object data; + Node next; + } +} diff --git a/group06/1378560653/src/com/coding/basic/List.java b/group06/1378560653/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group06/1378560653/src/com/coding/basic/Queue.java b/group06/1378560653/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..a574f4b859 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/Queue.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +public class Queue { + private LinkedList linkedlist = new LinkedList(); + + public void enQueue(Object o){ + linkedlist.add(o); + } + + public Object deQueue(){ + if(!isEmpty()){ + return linkedlist.get(0); + }else{ + return null; + } + } + + public boolean isEmpty(){ + if(size() > 0){ + return false; + }else{ + return true; + } + } + + public int size(){ + return linkedlist.size(); + } +} diff --git a/group06/1378560653/src/com/coding/basic/Stack.java b/group06/1378560653/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..2d0b260880 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/Stack.java @@ -0,0 +1,35 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if(!isEmpty()){ + return elementData.remove(size()-1); + }else{ + return null; + } + } + + public Object peek(){ + if(!isEmpty()){ + return elementData.get(size()-1); + }else{ + return null; + } + } + public boolean isEmpty(){ + if(size() > 0){ + return false; + }else{ + return true; + } + } + public int size(){ + return elementData.size(); + } +} diff --git a/group06/1454385822/.classpath b/group06/1454385822/.classpath new file mode 100644 index 0000000000..f68e6279c1 --- /dev/null +++ b/group06/1454385822/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group06/1454385822/.gitignore b/group06/1454385822/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group06/1454385822/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group06/1454385822/.project b/group06/1454385822/.project new file mode 100644 index 0000000000..35750341bb --- /dev/null +++ b/group06/1454385822/.project @@ -0,0 +1,17 @@ + + + 1454385822Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group06/1454385822/src/com/coding/basic/homework_01/ArrayList.java b/group06/1454385822/src/com/coding/basic/homework_01/ArrayList.java new file mode 100644 index 0000000000..8524b89318 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_01/ArrayList.java @@ -0,0 +1,124 @@ +package com.coding.basic.homework_01; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private int pos = 0; // 当前数组的末尾元素的下一位置 + + private Object[] elementData = new Object[3]; + + public void add(Object o){ + + if(pos >= elementData.length - 1){ + //数组扩容1/3 + elementData = Arrays.copyOf(elementData, elementData.length + elementData.length/3); + } + elementData[pos++] = o; + + } + public void add(int index, Object o){ + + if(pos >= elementData.length - 1){ + //数组扩容1/3 + elementData = Arrays.copyOf(elementData, elementData.length + elementData.length/3); + } + /* + * 情况1.index < pos && pos < elementData.length - 1 + * index 只能在pos前面 + */ + if(index <= pos && pos <= elementData.length - 1){ + Object[] tem = new Object[pos - index]; + System.arraycopy(elementData, index, tem, 0, tem.length); + elementData[index] = o; + System.arraycopy(tem, 0, elementData, index + 1, tem.length); + pos++; + }else{ + throw new IndexOutOfBoundsException(); + } + + + + } + + public Object get(int index){ + if(index < pos){ + return elementData[index]; + } + throw new IndexOutOfBoundsException(); + } + + public Object remove(int index){ + Object result; + //将数字删除并将该数字后面的元素向前移动一位 + if(index < pos ){ //只有index在pos之前才进行删除操作 + result = elementData[index]; + if(pos - index > 1){ //删除的不是最后一个元素 + Object[] tem = new Object[pos - index - 1]; + System.arraycopy(elementData, index + 1, tem, 0, tem.length); + for(int i=0; i i2 ? 1 : (i1 == i2 ? 0 : -1); +// return result; +// } +// +//} diff --git a/group06/1454385822/src/com/coding/basic/homework_01/Iterator.java b/group06/1454385822/src/com/coding/basic/homework_01/Iterator.java new file mode 100644 index 0000000000..b683268cd9 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_01/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic.homework_01; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_01/LinkedList.java b/group06/1454385822/src/com/coding/basic/homework_01/LinkedList.java new file mode 100644 index 0000000000..c05bca48ec --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_01/LinkedList.java @@ -0,0 +1,241 @@ +package com.coding.basic.homework_01; + + +public class LinkedList implements List{ + + //private Node head; + private Node pre; //指向当前结点的前一个元素 + private Node pHead; //头节点指向第一个元素 + private Node cur; //指向链表的最后一个元素 + private int num = 0; //链表中的元素个数 + + public void add(Object o){ + Node node = new Node(); + node.data = o; + if(pHead == null){ //链表为空,从第一个元素添加 + pHead = cur = node; + pHead.pre = null; + }else{ + node.pre = cur; //前一结点向后移动一位 + cur.next = node; // 添加元素 + cur = cur.next; //当前结点向后移动一位 + } + num++; //链表数目增1 + } + + /** + * 根据索引找到对应的结点 + * @param index + * @return + */ + public Node findNode(int index){ + Node node = pHead; + int tem = 0; + while(tem++ != index){ + node = node.next; + } + return node; + } + + public void add(int index , Object o){ + if(num == 0 || index == num){ + add(o); + return; + } + if(index <= num-1 && index > 0){ + Node node = new Node(); + node.data = o; + Node tem = findNode(index); + Node preNode = tem.pre; + Node posNode = tem.next; + preNode.next = node; + node.next = posNode; + posNode.pre = node; + num++; + return; + } + if(index == 0){ + Node node = new Node(); + node.data = o; + pHead.pre = node; + node.next = pHead; + pHead = node; + num++; + return; + } + throw new IndexOutOfBoundsException(); + } + public Object get(int index){ + if(index <= num - 1 && index >= 0){ + return findNode(index).data; + } + throw new IndexOutOfBoundsException(); + } + + public Object remove(int index){ + Object result; + if(index >0 && index < num - 1){ //删除链表中间的元素 + Node node = findNode(index); + result = node.data; + Node preNode = node.pre; + Node posNode = node.next; + preNode.next = posNode; + posNode.pre = preNode; + num--; + return result; + } + if(index == 0 && num > 0){ //删除第一个元素 + Node node = pHead.next; + result = pHead.data; + node.pre = null; + pHead = node; + num--; + return result; + } + if(index == num - 1 && num > 0){ //删除最后一个元素 + result = cur.data; + cur = cur.pre; + cur.next = null; + num--; + return result; + } + throw new IndexOutOfBoundsException(); + } + + public int size(){ + return num; + } + + public void addFirst(Object o){ + if(num == 0){ + add(o); + return; + } + if(num > 0){ + Node node = new Node(); + node.data = o; + node.pre = null; + node.next = pHead; + pHead = node; + num++; + return; + } + throw new IndexOutOfBoundsException(); + + } + public void addLast(Object o){ + if(num == 0){ + add(o); + return; + } + if(num > 0){ + Node node = new Node(); + node.data = o; + node.pre = cur; + cur.next = node; + node.next = null; + cur = node; + num++; + return; + } + throw new IndexOutOfBoundsException(); + } + public Object removeFirst(){ + Object result; + if(num > 0){ + result = pHead.data; + if(num == 1){ + pHead = null; + num = 0; + } + if(num > 1){ + pHead = pHead.next; + pHead.pre = null; + num--; + } + return result; + } + throw new IndexOutOfBoundsException(); + } + + public Object removeLast(){ + Object result; + if(num == 1){ + result = pHead.data; + pHead = null; + num = 0; + return result; + } + if(num > 1){ + + result = cur.data; + cur = cur.pre; + cur.next = null; + num--; + return result; + } + throw new IndexOutOfBoundsException(); + } + public Iterator iterator(){ + return new Iterator(){ + int cur = 0; + Node node = pHead; + @Override + public boolean hasNext() { + if(cur++ < num){ + return true; + } + return false; + } + + @Override + public Object next() { + Object result = node.data; + node = node.next; + return result; + } + + }; + } + + + private static class Node{ + Object data; + Node pre; + Node next; + + } + + public static void main(String[]args){ + LinkedList list = new LinkedList(); + list.add(1); +// list.add(2); +// list.add(3); +// list.add(4); +// list.add(0, 0); +// list.addFirst(0); +// list.addLast(5); +// list.removeFirst(); + System.out.println(list.removeLast()); + Iterator it = list.iterator(); + while(it.hasNext()){ + System.out.println(it.next()); + } + } + +} + + + + + + + + + + + + + + + diff --git a/group06/1454385822/src/com/coding/basic/homework_01/List.java b/group06/1454385822/src/com/coding/basic/homework_01/List.java new file mode 100644 index 0000000000..df248690b7 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_01/List.java @@ -0,0 +1,11 @@ +package com.coding.basic.homework_01; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_01/Queue.java b/group06/1454385822/src/com/coding/basic/homework_01/Queue.java new file mode 100644 index 0000000000..3909ea420a --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_01/Queue.java @@ -0,0 +1,42 @@ +package com.coding.basic.homework_01; + +public class Queue { + + private LinkedList elementData = new LinkedList(); + private int num = 0; + + public void enQueue(Object o){ + elementData.add(o); + num++; + } + + public Object deQueue(){ + num--; + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + return num <= 0; + } + + public int size(){ + return num; + } + + public static void main(String[] args) { + Queue queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(4); + System.out.println("当前队列的长度为:"+queue.size()); + while(!queue.isEmpty()){ + System.out.println(queue.deQueue()); + } + + } + +} + + + diff --git a/group06/1454385822/src/com/coding/basic/homework_01/Stack.java b/group06/1454385822/src/com/coding/basic/homework_01/Stack.java new file mode 100644 index 0000000000..9b1d2c1439 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_01/Stack.java @@ -0,0 +1,42 @@ +package com.coding.basic.homework_01; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int num = 0; + + public void push(Object o){ + elementData.add(o); + num++; + } + + public Object pop(){ + + return elementData.remove(--num) ; + } + + public Object peek(){ + return elementData.get(num - 1); + } + public boolean isEmpty(){ + return num <= 0 ; + } + public int size(){ + return num; + } + public static void main(String[] args) { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + System.out.println(stack.peek()); + System.out.println(stack.size()); +// while(!stack.isEmpty()){ +// System.out.println(stack.pop()); +// } + } +} + + + + diff --git a/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtil.java b/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtil.java new file mode 100644 index 0000000000..36c733e7b9 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtil.java @@ -0,0 +1,218 @@ +package com.coding.basic.homework_02.array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a,对该数组的值进行置换 + * 例如:a = [7, 9, 30, 3] , 置换后为[3, 30, 9, 7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为[4, 3, 30, 9, 7] + * @param origin + */ + public static void reverseArray(int [] origin){ + if(origin.length > 1){ // 数组的长度大于1置换才有意义 + int tem; + for(int i = 0; i < origin.length / 2; i++){ + tem = origin[i]; + origin[i] = origin[origin.length - 1 - i]; + origin[origin.length - 1 - i] = tem; + } + } + } + + /** + * 现在有如下的一个数组:int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public static int[] removeZero(int[] oldArray){ + int len = 0; + for(int i : oldArray){ + if(i == 0) + continue; + len++; + } + int[] result = new int[len]; + len = 0; + for(int i = 0; i < oldArray.length; i++){ + if(oldArray[i] == 0) + continue; + result[len++] = oldArray[i]; + } + return result; + } + + /** + * 给定两个已经排序好的整形数组 a1,a2,创建一个新的数组a3,使得a3包含a1和a2的所有元素并集 + * 例如a1 = [3,5,7,8] , a2 = [4,5,6,7] 则a3为[3,4,5,6,7,8] + * @param array1 + * @param array2 + * @return + */ + public static int [] merge(int[] array1, int [] array2){ + if(array1.length == 0) + return array2; + if(array2.length == 0) + return array1; + if(array1.length == 0 && array2.length == 0) + return null; + int arrLen1 = 0; + int arrLen2 = 0; + int arrLen3 = 0; + int []result = new int[array1.length + array2.length]; + while(arrLen1 < array1.length || arrLen2 < array2.length){ + if(arrLen1 >= array1.length){ //数组1已经没了 + result[arrLen3++] = array2[arrLen2++]; + continue; + } + if(arrLen2 >= array2.length){ //数组2已经没了 + result[arrLen3++] = array1[arrLen1++]; + continue; + } + if(array1[arrLen1] > array2[arrLen2]){ + result[arrLen3++] = array2[arrLen2++]; + }else if(array1[arrLen1] < array2[arrLen2]){ + result[arrLen3++] = array1[arrLen1++]; + }else{ + result[arrLen3++] = array1[arrLen1++]; + arrLen2++; + } + } + result = Arrays.copyOf(result, arrLen3); + return result; + } + + /** + * 把一个已经存满数据的数组oldArray的容量进行扩容,扩容后的新数据大小为oldArray.length * 2 + * 注意,老数组的元素在新数组中需要保持 + * 例如oldArray = {2,3,6}, size = 3,则返回的新数组为{2,3,6,0,0,0} + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size){ + int[] result = new int [size * 2]; + for(int i = 0; i < oldArray.length; i++){ + result[i] = oldArray[i]; + } + return result; + } + + /** + * 斐波那契数列为:1, 1, 2, 3, 5, 8, 13, 21...... ,给定一个最大值,返回小于该值的数列 + * 例如:max = 15, 则返回的数组应该为{1, 1, 2, 3, 5, 8, 13} + * max = 1, 则返回空数组{} + * @param max + * @return + */ + public static int[] fibonacci(int max){ + if(max == 1) + return new int[]{}; + int[] result = new int[10]; + int reLen = 2; + result[0] = result[1] = 1; + while(result[reLen - 1] + result[reLen -2] < max){ + if(reLen >= result.length) + result = grow(result, result.length); + result[reLen] = result[reLen - 1] + result[reLen -2]; + reLen++; + } + result = Arrays.copyOf(result, reLen); + + return result; + } + + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23,返回的数组为{2,3,5,7,11,13,17,19} + * @param max + * @return + */ + public static int[] getPrimes(int max){ + if(max <= 2){ + return null; + } + int[] result = new int[10]; + int len = 0; + boolean flag = true; + result[0] = 2; + if(max == 3) + return result; + len++; + for(int i = 3; i < max; i++){ + flag = true; + if(len >= result.length) + result = grow(result, result.length); + for(int j = 2; j < i; j++){ + if(i % j == 0){ + flag = false; + } + } + if(flag == true){ + result[len++] = i; + } + + } + result = Arrays.copyOf(result, len); + return result; + } + + /** + * 所谓"完数",是指这个数恰好等于他的因子之和,例如6 = 1+2+3 + * 给定一个最大值max,返回一个数组,数组中是小于max的所有完数 + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max){ + int sum = 1; + int [] result = new int[10]; + int len = 0; + for(int i = 2;i < max; i++){ + sum = 1; + if(len >= result.length) + result = grow(result, result.length); + for(int j = 2; j < i; j++){ + if(i % j == 0) + sum += j; + } + if(sum == i) + result[len++] = sum; + } + result = Arrays.copyOf(result, len); + return result; + } + + + /** + * 用seperator 把数组array给连接起来 + * 例如array = [3,8,9] ,seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param seperator + * @return + */ + public static String join(int[]array, String seperator){ + String result = new String(); + int len = 0; + result = new Integer(array[0]).toString(); + for(int i = 1; i < array.length; i++){ + result += seperator; + result += array[i]; + } + return result; + } + +} + + + + + + + + + diff --git a/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtilTest.java b/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtilTest.java new file mode 100644 index 0000000000..5c2c13083f --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtilTest.java @@ -0,0 +1,93 @@ +package com.coding.basic.homework_02.array; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class ArrayUtilTest { + int[] array; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverseArray() { + array = new int[]{7, 9, 30, 3}; +// array = new int[]{7, 9, 30, 3, 4}; + ArrayUtil.reverseArray(array); + Assert.assertArrayEquals(new int[]{3, 30, 9, 7}, array); +// Assert.assertArrayEquals(new int[]{4, 3, 30, 9, 7}, array); + } + + @Test + public void testRemoveZero(){ + array = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + Assert.assertArrayEquals(new int[]{1,3,4,5,6,6,5,4,7,6,7,5}, ArrayUtil.removeZero(array)); + } + + @Test + public void testMerge(){ + array = new int[]{3,5,7,8}; + int [] array2 = new int[]{4,5,6,7}; + Assert.assertArrayEquals(new int[]{3,4,5,6,7,8}, ArrayUtil.merge(array, array2)); + } + + @Test + public void testGrow(){ + array = new int[]{2, 3, 6}; + Assert.assertArrayEquals(new int[]{2, 3, 6, 0, 0, 0} ,ArrayUtil.grow(array, 3)); + } + + @Test + public void testFibonacci(){ + Assert.assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8, 13}, ArrayUtil.fibonacci(15)); +// array = ArrayUtil.fibonacci(15); +// for(int i: array) +// System.out.println(i); + } + + + @Test + public void testPrimes(){ + Assert.assertArrayEquals(new int[]{2,3,5,7,11,13,17,19}, ArrayUtil.getPrimes(23)); +// array = ArrayUtil.getPrimes(23); +// for(int i : array){ +// System.out.print(i + " "); +// } + + } + + @Test + public void testPerfectNumbers(){ +// Assert.assertArrayEquals(new int[]{6}, ArrayUtil.getPerfectNumbers(7)); + array = ArrayUtil.getPerfectNumbers(100); + for(int i : array){ + System.out.print(i + " "); + } + } + + @Test + public void testJoin(){ + Assert.assertEquals("3-8-9", ArrayUtil.join(new int[]{3,8,9}, "-")); + } + +} + + + + + + + + + + + + + diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LoginAction.java b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LoginAction.java new file mode 100644 index 0000000000..8156c45e43 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coding.basic.homework_02.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LogoutAction.java b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LogoutAction.java new file mode 100644 index 0000000000..e563673a89 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/LogoutAction.java @@ -0,0 +1,5 @@ +package com.coding.basic.homework_02.litestruts; + +public class LogoutAction { + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/Struts.java b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/Struts.java new file mode 100644 index 0000000000..5c6c57cf73 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/Struts.java @@ -0,0 +1,286 @@ +package com.coding.basic.homework_02.litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + + private static String jspUrl = null; + private static String resultStatic = null; + + public static View runAction(String actionName, Map params) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, DocumentException{ + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 根据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + View view = new View(); + Element root = getRoot(); + Class clazz = getClazz(actionName, root); + Object obj = clazz.newInstance(); + + methodInvoke(clazz, obj, params); + String result = getExecuteInfo(clazz, obj); + setParams(clazz, obj, view); + getJsp(result, root, actionName); + view.setJsp(jspUrl); + + return view; + } + + /** + * 读取xml文件获得根节点 + * @return + * @throws DocumentException + */ + private static Element getRoot() throws DocumentException{ + //step1:创建SAXReader对象 + SAXReader reader = new SAXReader(); + //step2:读取文件 转换成Document + Document document = reader.read("src/com/coding/basic/homework_02/litestruts/struts.xml"); + return document.getRootElement(); + } + + + /** + * 根据给定的actionName找到对应的Class + * @return + * @throws ClassNotFoundException + */ + @SuppressWarnings("rawtypes") + private static Class getClazz(String actionName, Element node) throws ClassNotFoundException{ + + findClassNameByAttr(node, actionName); + if(resultStatic != null) + return Class.forName(resultStatic); + + throw new ClassNotFoundException(); + } + + /** + * 根据resultName找到对应的jsp路径 + * @param resultName + * @param node + * @return + */ + @SuppressWarnings("unchecked") + private static void getJsp(String resultName, Element node, String actionName){ + + if(node.attributes() != null) + forEachAttr(node.attributes(), actionName, node, resultName); + + List listElement = node.elements(); + for(Element e : listElement) + getJsp(resultName, e, actionName); + + if(jspUrl != null) + return; + } + + /** + * 遍历当前结点的属性 + * @param list + * @param actionName + * @param node + * @param resultName + */ + private static void forEachAttr(List list, String actionName, Element node, String resultName){ + List attrs = node.attributes(); + for(Attribute attr : attrs){ + if(resultName.equals(attr.getValue()) && !"".equals(node.getTextTrim())) + findJspByParentNode(actionName, node); + } + } + + /** + * 根据跟定的action找到对应的jspUrl + * @param actionName + * @param node + */ + private static void findJspByParentNode(String actionName, Element node){ + Element parent = node.getParent(); + if(parent.attributes() != null){ + for(Attribute pattr : (List)parent.attributes()){ + if(actionName.equals(pattr.getValue())) + jspUrl = node.getTextTrim(); + } + } + } + + /** + * 获取execute()方法运行后的信息 + * @param clazz + * @param obj + * @return + * @throws NoSuchMethodException + * @throws SecurityException + * @throws IllegalAccessException + * @throws IllegalArgumentException + * @throws InvocationTargetException + */ + private static String getExecuteInfo(Class clazz, Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ + Method executeMethod = clazz.getMethod("execute", null); + + return (String)executeMethod.invoke(obj, null); + + } + + /** + * 将类中的getter信息放入View + * @return + * @throws InvocationTargetException + * @throws IllegalArgumentException + * @throws IllegalAccessException + */ + public static View setParams(Class clazz, Object obj, View view) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{ + Map viewMap = getterAttr(clazz, obj); + view.setParameters(viewMap); + return view; + } + + /** + * 找出当前对象的所有getter方法,将信息放入map中 + * @param clazz + * @return + * @throws InvocationTargetException + * @throws IllegalArgumentException + * @throws IllegalAccessException + */ + private static Map getterAttr(Class clazz, Object obj) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{ + Map viewMap = new HashMap(); + //获取所有的getter方法 + Method[] methods = clazz.getDeclaredMethods(); + for(Method me : methods){ + if("get".equals(me.getName().substring(0, 3))) + viewMap.put(method2Attr(me), (String) me.invoke(obj, null)); + } + return viewMap; + } + + /** + * 将方法名转换为属性名 + * @param method + * @return + */ + private static String method2Attr(Method method){ + StringBuilder builder = new StringBuilder(); + return builder.append(new Character(method.getName().charAt(3)).toString().toLowerCase()) + .append(method.getName().substring(4)).toString(); + } + + /** + * 调用setXXX给属性设置值 + * @param params + * @throws SecurityException + * @throws NoSuchMethodException + * @throws InvocationTargetException + * @throws IllegalArgumentException + * @throws IllegalAccessException + */ + private static void methodInvoke(Class clazz, Object obj,Map params) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ + //将参数名转换为方法名 + Map methodMap = methodMap(params); + + //将数据set到属性中 + Iterator> it = methodMap.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry = it.next(); + Method method = clazz.getMethod(entry.getKey(), String.class); + method.invoke(obj, entry.getValue()); + } + } + + /** + * 将属性名转换为方法名之后放入到map中 + * @param params + * @return + */ + @SuppressWarnings("rawtypes") + private static Map methodMap(Map params){ + Map methodMap = new HashMap(); + Iterator> it = params.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry = it.next(); + String attrName = entry.getKey(); + StringBuilder builder = new StringBuilder(); + builder.append("set").append(new Character(attrName.charAt(0)).toString().toUpperCase()).append(attrName.substring(1)); + methodMap.put(builder.toString(), entry.getValue()); + } + return methodMap; + } + + + /** + * 遍历结点的属性找到类名 + * @param attrList + * @return List attrList + * @throws ClassNotFoundException + */ + @SuppressWarnings("unchecked") + private static void findClassNameByAttr(Element node,String actionName) throws ClassNotFoundException{ + + if(!node.attributes().isEmpty()) + For2attr(actionName, node); + + List listElement = node.elements(); + for(Element e : listElement) + findClassNameByAttr(e, actionName); + + if(resultStatic != null) + return; + } + + /** + * 遍历属性找到类名 + * @param actionName + * @param findAction + * @param node + */ + private static void For2attr(String actionName, Element node){ + boolean findAction = false; + for(Attribute attribute : (List)node.attributes()){ + + if(actionName.equals(attribute.getValue())){ + findAction = true; + break; + } + } + for(Attribute attribute : (List)node.attributes()){ + if(findAction == true && "class".equals(attribute.getName())){ + resultStatic = attribute.getValue(); + return; + } + } + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/StrutsTest.java b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/StrutsTest.java new file mode 100644 index 0000000000..fc5f202c3b --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/StrutsTest.java @@ -0,0 +1,46 @@ +package com.coding.basic.homework_02.litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + + @Test + public void testLoginActionSuccess() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, DocumentException { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, DocumentException { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/View.java b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/View.java new file mode 100644 index 0000000000..8dfd610cb1 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coding.basic.homework_02.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml new file mode 100644 index 0000000000..53f1245121 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group06/1730798243/.classpath b/group06/1730798243/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group06/1730798243/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group06/1730798243/.gitignore b/group06/1730798243/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group06/1730798243/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group06/1730798243/.project b/group06/1730798243/.project new file mode 100644 index 0000000000..b4bd3f32d4 --- /dev/null +++ b/group06/1730798243/.project @@ -0,0 +1,17 @@ + + + homework + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group06/1730798243/src/com/coding/basic/first/Iterator.java b/group06/1730798243/src/com/coding/basic/first/Iterator.java new file mode 100644 index 0000000000..9ade302dda --- /dev/null +++ b/group06/1730798243/src/com/coding/basic/first/Iterator.java @@ -0,0 +1,15 @@ +package com.coding.basic.first; + +public interface Iterator { + /** + * 查看是否有下一个元素 + * @return 有的话返回true,否则返回false + */ + public boolean hasNext(); + /** + * 获得下一个元素,也就是当前元素 + * @return 获取当前位置的元素 + */ + public Object next(); + +} diff --git a/group06/1730798243/src/com/coding/basic/first/List.java b/group06/1730798243/src/com/coding/basic/first/List.java new file mode 100644 index 0000000000..f999f13052 --- /dev/null +++ b/group06/1730798243/src/com/coding/basic/first/List.java @@ -0,0 +1,37 @@ +package com.coding.basic.first; +/** + * 数组的接口 + * @author zap + * + */ + +public interface List { + /** + * 向数组中添加一个元素 + * @param o 添加的元素 + */ + public void add(Object o); + /** + * 向数组中某一个位置添加一个元素 + * @param index 添加元素的位置 + * @param o 添加的元素 + */ + public void add(int index,Object o); + /** + * 从数组中根据位置获取一个元素 + * @param index 想要获取的元素的位置 + * @return 想获取的元素 + */ + public Object get(int index); + /** + * 根据位置移除数组中的一个元素 + * @param index 被移除元素的位置 + * @return 被移除的元素 + */ + public Object remove(int index); + /** + * 获取数组的长度 + * @return 返回数组的长度 + */ + public int size(); +} diff --git a/group06/1730798243/src/com/coding/basic/first/impl/ArrayList.java b/group06/1730798243/src/com/coding/basic/first/impl/ArrayList.java new file mode 100644 index 0000000000..d42381300b --- /dev/null +++ b/group06/1730798243/src/com/coding/basic/first/impl/ArrayList.java @@ -0,0 +1,87 @@ +package com.coding.basic.first.impl; + +import com.coding.basic.first.List; + +/** + * 实现一个ArrayList + * @author zap + * + */ + +public class ArrayList implements List{ + + private int size; + private Object[] elementData = null; + private static final int DEFAULT_SIZE=100; + + public ArrayList() { + this(DEFAULT_SIZE); + } + + public ArrayList(int size) { + if(size < 0) { + System.out.println("size 必须大于0"); + } else { + this.elementData = new Object[size]; + } + } + + @Override + public int size() { + return size; + } + + @Override + public void add(Object o) { + judgeSize(size+1); + elementData[size++] = o; + } + + @Override + public void add(int index, Object o) { + judgeIndexRangge(index); + System.arraycopy(elementData, index, elementData, index + 1, + size - index);//整体往后挪移--当前往后挪 + elementData[index] = o; + size++; + + } + + @Override + public Object get(int index) { + judgeIndexRangge(index); + return elementData[index]; + } + + @Override + public Object remove(int index) { + judgeIndexRangge(index); + Object e = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, + size - index - 1);//整体往前挪移--后一位往前挪 + size--; + return e; + } + + private void judgeIndexRangge(int index){ + + if (index > size || index < 0) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + private String outOfBoundsMsg(int index) { + return "Index: "+index+", Size: "+size; + } + + + private void judgeSize(int size) { + if(size > elementData.length){ + Object[] newarr = new Object[elementData.length + DEFAULT_SIZE]; + System.arraycopy(elementData, 0, newarr, 0, elementData.length); + this.elementData = newarr; + } + } + + + +} diff --git a/group06/1730798243/src/com/coding/basic/first/impl/LinkedList.java b/group06/1730798243/src/com/coding/basic/first/impl/LinkedList.java new file mode 100644 index 0000000000..a06b635e04 --- /dev/null +++ b/group06/1730798243/src/com/coding/basic/first/impl/LinkedList.java @@ -0,0 +1,143 @@ +package com.coding.basic.first.impl; + +import com.coding.basic.first.List; + +/** + * 链表 + * @author zap + * LinkedList + */ +public class LinkedList implements List { + + + + private Node head = new Node(); + private int size ;// + + private static class Node{ + Object data; + Node next; + + public Node() { + } + + public Node(Object data) { + this.data = data; + } + + } + + + @Override + public void add(Object o) { + + if(size==0){ + Node node = new Node(o); + head = node; +// head = tail = node; + }else{ + Node current = getCurrentNode(size); + Node node = new Node(o); + current.next = node; +// tail = node; + } + size ++; + + + } + + @Override + public void add(int index, Object o) { + judgeIndexRangge(index); + if(size == 0 ){ + Node node = new Node(o); + head = node; +// head = tail = node; + }else if(index == 0){ + Node node = new Node(o); + node.next = head; + head = node; + }else{ + Node prev = getCurrentNode(index); + Node temp = prev.next; + Node node = new Node(o); + node.next = temp; + prev.next = node; + } + size ++; + + } + + @Override + public Object get(int index) { + judgeGetIndexRangge(index); + Node current = getCurrentNode(index + 1); + return current.data; + } + + @Override + public Object remove(int index) { + judgeIndexRangge(index);//下标 + Object obj = null; + if(index == 0){ + Node node = head.next; + obj = head.data; + head = node; + }else{ + Node prev = getCurrentNode(index); + Node temp = prev.next; + Node after =temp.next ; + prev.next = after; + obj = temp.data; + } + size -- ; + return obj; + } + + @Override + public int size() { + return size; + } + + + + private void judgeIndexRangge(int index){ + + if (index > size || index < 0) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + private void judgeGetIndexRangge(int index){ + + if (index >= size || index < 0) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + private String outOfBoundsMsg(int index) { + return "Index: "+index+", Size: "+size; + } + + private Node getCurrentNode(int index){ + + Node temp = head; + Node prev = head; + for(int i = 0 ;i < index;i++){//找到该个元素 + prev = temp;// + temp = temp.next;// + } + return prev; + + } + + + public void addLast(Object o){ + add(o); + } + + public Object removeFirst(){ + Object o = remove(0); + return o; + } + + +} diff --git a/group06/1730798243/src/com/coding/basic/first/impl/Queue.java b/group06/1730798243/src/com/coding/basic/first/impl/Queue.java new file mode 100644 index 0000000000..a38f33c759 --- /dev/null +++ b/group06/1730798243/src/com/coding/basic/first/impl/Queue.java @@ -0,0 +1,46 @@ +package com.coding.basic.first.impl; + +/** + * 基本数据结构-队列 + * @author zap + * + */ + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + + /** + * 入队操作 + * @param o 入队的元素 + */ + public void enQueue(Object o){ + linkedList.addLast(o); + } + + /** + * 出队操作 + * @return 返回出队的元素 + */ + public Object deQueue(){ + if(!isEmpty()) + return linkedList.removeFirst(); + return null; + } + + /** + * 判断队列是否为空 + * @return 为空返回true,否则返回false + */ + public boolean isEmpty(){ + return linkedList.size() == 0 ? true : false; + } + + /** + * 返回队列的长度 + * @return + */ + public int size(){ + return linkedList.size(); + } +} diff --git a/group06/1730798243/src/com/coding/basic/first/impl/Stack.java b/group06/1730798243/src/com/coding/basic/first/impl/Stack.java new file mode 100644 index 0000000000..9e19850fb7 --- /dev/null +++ b/group06/1730798243/src/com/coding/basic/first/impl/Stack.java @@ -0,0 +1,53 @@ +package com.coding.basic.first.impl; + +/** + * 基本数据结构-栈 + * @author Pxshuo + * + */ + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + /** + * 使一个元素入栈 + * @param o 将要入栈的元素 + */ + public void push(Object o){ + elementData.add(elementData.size(), o); + } + + /** + * 使一个元素出栈 + * @return 返回出栈的元素 + */ + public Object pop(){ + return size() == 0 ? null : elementData.remove(elementData.size() - 1); + } + + /** + * 获得栈顶元素 + * @return 返回栈顶元素 + */ + public Object peek(){ + return elementData.size() == 0 ? null : elementData.get(elementData.size() - 1); + } + + /** + * 查看栈是否为空 + * @return 空的话返回true + */ + public boolean isEmpty(){ + return size() == 0 ? true : false; + } + + /** + * 查看栈中元素的个数 + * @return 返回栈中的个数 + */ + public int size(){ + return elementData.size(); + } + +} diff --git a/group06/1730798243/src/com/coding/test/ArrayListTest.java b/group06/1730798243/src/com/coding/test/ArrayListTest.java new file mode 100644 index 0000000000..a92bbef7a3 --- /dev/null +++ b/group06/1730798243/src/com/coding/test/ArrayListTest.java @@ -0,0 +1,58 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.first.List; +import com.coding.basic.first.impl.ArrayList; + +public class ArrayListTest { + + @Before + public void setUp() throws Exception { + } + + + @Test + public void testSize() { + List list = new ArrayList (10); + list.add(2); + list.add(1); + int str = (int)list.remove(1); + assertEquals(1, str); + assertEquals(1, list.size()); + } + + @Test + public void testAddObject() { + List list = new ArrayList (10); + list.add(1); + list.add(3); + list.add(2,2); + + assertEquals(2, list.get(2)); + } + + + @Test + public void testGet() { + List list = new ArrayList (10); + list.add(1); + list.add(3); + list.add(0,2); + assertEquals(2, list.get(0)); + } + + @Test + public void testRemove() { + List list = new ArrayList (10); + list.add(1); + list.add(2); + list.remove(1); + assertEquals(1, list.get(0)); + assertEquals(1, list.size()); + } + +} diff --git a/group06/1730798243/src/com/coding/test/LinkedListTest.java b/group06/1730798243/src/com/coding/test/LinkedListTest.java new file mode 100644 index 0000000000..7d50c34c42 --- /dev/null +++ b/group06/1730798243/src/com/coding/test/LinkedListTest.java @@ -0,0 +1,112 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.first.List; +import com.coding.basic.first.impl.LinkedList; + +public class LinkedListTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void testAddObject() { + List list = new LinkedList(); + list.add(0,4); + list.add(1); + list.add(2); + list.add(3); + list.add(0,5); + list.add(3,8); + list.add(5,6);//5418263 + assertEquals(1, list.get(2)); + } + + @Test + public void testAddIntObject() { + List list = new LinkedList(); + list.add(0,4); + list.add(1); + list.add(2); + list.add(3); + list.add(0,5); + list.add(3,8); + list.add(5,6);//5418263 + assertEquals(8, list.get(3)); + } + + @Test + public void testGet() { + List list = new LinkedList(); + list.add(0,4); + list.add(1); + list.add(2); + list.add(3); + list.add(0,5); + list.add(3,8); + list.add(5,6);//5418263 + assertEquals(3, list.get(6)); + } + + @Test + public void testRemove() { + List list = new LinkedList(); + list.add(0,4); + list.add(1); + list.add(2); + list.add(3); + list.add(0,5); + list.add(3,8); + list.add(5,6);//5418263 + list.remove(3); + assertEquals(2, list.get(3)); + } + + @Test + public void testSize() { + List list = new LinkedList(); + list.add(0,4); + list.add(1); + list.add(2); + list.add(3); + list.add(0,5); + list.add(3,8); + list.add(5,6);//5418263 + assertEquals(7, list.size()); + } + + @Test + public void testAddLast() { + LinkedList list = new LinkedList(); + list.add(0,4); + list.add(1); + list.add(2); + list.add(3); + list.add(0,5); + list.add(3,8); + list.add(5,6);//5418263 + list.addLast(7); + assertEquals(7, list.get(7)); + } + + @Test + public void testRemoveFirst() { + LinkedList list = new LinkedList(); + list.add(0,4); + list.add(1); + list.add(2); + list.add(3); + list.add(0,5); + list.add(3,8); + list.add(5,6);//5418263 + list.removeFirst(); + assertEquals(4, list.get(0)); + assertEquals(6, list.size()); + } + +} diff --git a/group06/1730798243/src/com/coding/test/QueueTest.java b/group06/1730798243/src/com/coding/test/QueueTest.java new file mode 100644 index 0000000000..b6fafbe3f9 --- /dev/null +++ b/group06/1730798243/src/com/coding/test/QueueTest.java @@ -0,0 +1,78 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.first.impl.Queue; + +public class QueueTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void testEnQueue() { + Queue queue = new Queue(); + queue.enQueue("1"); + queue.enQueue("2"); + queue.enQueue("3"); + queue.enQueue("4"); + queue.enQueue("5"); + assertEquals(5, queue.size()); + } + + @Test + public void testDeQueue() { + Queue queue = new Queue(); + queue.enQueue("1"); + queue.enQueue("2"); + queue.enQueue("3"); + queue.enQueue("4"); + queue.enQueue("5"); + for(int i=queue.size();i>0;i=queue.size()){ + if(!queue.isEmpty()){ + System.out.print("i:"); + System.out.println(queue.deQueue()); + } + } + assertEquals(0, queue.size()); + } + + @Test + public void testIsEmpty() { + Queue queue = new Queue(); + queue.enQueue("1"); + queue.enQueue("2"); + queue.enQueue("3"); + queue.enQueue("4"); + queue.enQueue("5"); + for(int i=queue.size();i>0;i=queue.size()){ + if(!queue.isEmpty()){ + System.out.print("i:"); + System.out.println(queue.deQueue()); + } + } + assertEquals(0, queue.size()); + } + + @Test + public void testSize() { + Queue queue = new Queue(); + queue.enQueue("1"); + queue.enQueue("2"); + queue.enQueue("3"); + queue.enQueue("4"); + queue.enQueue("5"); + for(int i=queue.size();i>0;i=queue.size()){ + if(!queue.isEmpty()){ + System.out.print("i:"); + System.out.println(queue.deQueue()); + } + } + assertEquals(0, queue.size()); + } + +} diff --git a/group06/1730798243/src/com/coding/test/StackTest.java b/group06/1730798243/src/com/coding/test/StackTest.java new file mode 100644 index 0000000000..973b0cca35 --- /dev/null +++ b/group06/1730798243/src/com/coding/test/StackTest.java @@ -0,0 +1,105 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.first.impl.Stack; + +public class StackTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void testPush() { + Stack stack = new Stack(); + stack.push("1"); + stack.push("2"); + stack.push("8"); + stack.push("3"); + stack.push("4"); + stack.push("5"); + + for(int i=stack.size();i>0;i=stack.size()){ + if(!stack.isEmpty()){ + System.out.print("i:"); + System.out.println(stack.pop()); + } + } + assertEquals(0,stack.size()); + } + + @Test + public void testPop() { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(8); + stack.push(3); + stack.push(4); + stack.push(5); + + for(int i=stack.size();i>0;i=stack.size()){ + if(!stack.isEmpty()){ + System.out.print("i:"); + System.out.println(stack.pop()); + } + } + assertEquals(0,stack.size()); + } + + @Test + public void testPeek() { + + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(8); + stack.push(3); + stack.push(4); + stack.push(5); + assertEquals(5,stack.peek()); + } + + @Test + public void testIsEmpty() { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(8); + stack.push(3); + stack.push(4); + stack.push(5); + + for(int i=stack.size();i>0;i=stack.size()){ + if(!stack.isEmpty()){ + System.out.print("i:"); + System.out.println(stack.pop()); + } + } + assertEquals(0,stack.size()); + } + + @Test + public void testSize() { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(8); + stack.push(3); + stack.push(4); + stack.push(5); + + for(int i=stack.size();i>0;i=stack.size()){ + if(!stack.isEmpty()){ + System.out.print("i:"); + System.out.println(stack.pop()); + } + } + assertEquals(0,stack.size()); + } + +} diff --git a/group06/236995728/.classpath b/group06/236995728/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group06/236995728/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group06/236995728/.gitignore b/group06/236995728/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group06/236995728/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group06/236995728/.project b/group06/236995728/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group06/236995728/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group06/236995728/.settings/org.eclipse.jdt.core.prefs b/group06/236995728/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group06/236995728/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git "a/group06/236995728/CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" "b/group06/236995728/CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" new file mode 100644 index 0000000000000000000000000000000000000000..fa7a796a74472df3f58fd20f7b52d78ed38132cd GIT binary patch literal 12398 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 literal 0 HcmV?d00001 diff --git a/group06/236995728/src/com/coding/basic/ArrayList.java b/group06/236995728/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..e64ab3d50a --- /dev/null +++ b/group06/236995728/src/com/coding/basic/ArrayList.java @@ -0,0 +1,92 @@ +package com.coding.basic; + +import java.util.Arrays; + +/** + * 2017/2/24 + * @author 236995728 + * + */ +public class ArrayList implements List { + + private static int size = 0; + + private static Object[] elementData = new Object[100]; + + /** + * 添加元素 + */ + @Override + public void add(Object o){ + if(size >= elementData.length){ + grow(size); + } + elementData[size++] = o; + } + + /** + * 按索引添加元素 + */ + @Override + public void add(int index, Object o){ + if(index < 0){ + throw new IllegalArgumentException("param invalid"); + } + if(index >= elementData.length){ + grow(index); + } + for(int i=index; i<=size; i++){ + elementData[i] = elementData[i+1]; + } + elementData[index] = o; + size ++; + } + + /** + * 根据索引获取元素 + */ + @Override + public Object get(int index){ + if(index<0 || index >size){ + throw new IllegalArgumentException("param invalid"); + } + return elementData[index]; + } + + /** + * 根据索引删除元素 + */ + @Override + public Object remove(int index){ + if(index<0 || index >size){ + throw new IllegalArgumentException("param invalid"); + } + Object o = elementData[index]; + for(int i=index;i>1); + elementData = Arrays.copyOf(elementData, newCapacity); + } +} diff --git a/group06/236995728/src/com/coding/basic/ArrayListTest.java b/group06/236995728/src/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..f5fef295ad --- /dev/null +++ b/group06/236995728/src/com/coding/basic/ArrayListTest.java @@ -0,0 +1,82 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +/** + * 2017/2/24 + * @author 236995728 + * + */ +public class ArrayListTest { + private static ArrayList list = new ArrayList(); + + @Before + public void setUp() throws Exception { + for(int i=0;i<10;i++){ + list.add(i); + System.out.println(list.get(i)); + } + } + + @Test + public void testAddObject() { + list.add("www"); + assertEquals("www", list.get(10)); + } + + @Test + public void testAddIntObject() { + list.add(101, 101); + assertEquals(101, list.get(101)); + } + + @Test(expected = IllegalArgumentException.class) + public void testAddIntObjectException1(){ + list.add(-1, -1); + } + + @Test + public void testGet() { + assertEquals(1, list.get(1)); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetException1(){ + list.get(-1); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetException2(){ + list.get(11); + } + + @Test + public void testRemove() { + list.remove(3); + assertEquals(4, list.get(3)); + } + + @Test(expected = IllegalArgumentException.class) + public void testRemoveException1(){ + list.remove(-1); + } + + @Test(expected = IllegalArgumentException.class) + public void testRemoveException2(){ + list.remove(1000000000); + } + + @Test + public void testSize() { + assertEquals(10, list.size()); + } + + @Test + public void testIterator() { + fail("Not yet implemented"); + } + +} diff --git a/group06/236995728/src/com/coding/basic/BinaryTreeNode.java b/group06/236995728/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group06/236995728/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git "a/group06/236995728/src/com/coding/basic/CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" "b/group06/236995728/src/com/coding/basic/CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" new file mode 100644 index 0000000000000000000000000000000000000000..fa7a796a74472df3f58fd20f7b52d78ed38132cd GIT binary patch literal 12398 zcmeHt^Y@&7CT#Tuwh9I@+WMi#$Gx<`s@P=EU^r-T+fLLiwz z%?1vo&Yj{2i$6Ia!N8J>ZfRkc z!4HT-xs}MgEQGJ_Zs zSlsw(T27f(_FCo(HB3PiSSz3S&I$n%P246ffOlUZ7(-65LgHei6)i7k^+PIdBcFuz z8eE(OM7HOTiM_?;jPSg1$7?Xl+#SLG^$MG^am!5r%fXDFe!A4W`2@^&+s{G-gL^9v zwzm)fz{?8+K80^qRz1uJ zLT5owK~rtY%U#&H3QQ)GE7(ggu)5N6Xe*0W3(rq{i;Lj;2gZ^k(=!Q^Ud|a3uA7Pa z=eWu0h~aH;^LGY4x(}@$fTWPtd=`&+hi!!Py&q;z!(`Gl!$A?+7~vDR&~dk6sbigJ zUungDd@X!sNlG&@YeHU=o9U>&aFhCu?ej;Lxp^xoU2m8Ye)0BDg646YckpI{RVi!? zu`%82)%v|^hY5|WQC2kH>2YnCnJ6;i-j>4Sp0`dNdgXQ$_I(JUhs%ch!1Ul_riZHY zydS=YBglD1qFrmaWsjGkFMI_GOn>)}d0>t5HAopOAn(Bkz=FBkI{}&gr!Q0xN9`R^{J@gpFE0j=F3&q1la47|QdBD*#+BrEez0C7UWB6_&7>#dFo zDe0q0qvms`@>J&uf6kSOu5kCrS?|KngHFibA}hQXXg!JvD^7)xtu?KW2xzh6jC2hQ zY%(XU6l7<=2Z-fxt4y-IuS*2-;Io?we3oU3iV50d@7I8~HE@k^O4@g4RlrfoWbP~1 zKz9Gm5oU#OOH^;4w!Rs}We>q4ph_a>@De$Cz%8RipbLabV3rk&-51x84WA^6FkvlJ zqA%&p?JMpy&ivA$U!6I__*_rae^#05+^9XBeGyI9)_@k1^^KZDQNZgCw3Ye0)yTb` zzh?sVL?ZzJC?I3_&1(K^FSVMw&NC9|@6P02f+Q7BAmVlxFHFO5c(Fp?j{{{qPpPYI ztlwI4O!H9svhKbf580YVHX>$^b+O1`hL~N1yJMNt8AkKVHm|Gxgv`aw;v1*I5@!>UAsqCFPdQ}din!Pniv<;*mM>8QLCK&o3QKX0|B#d}k8r|H2BhY}W*eL(M~E>? zULbeQG13E<6YV~1Ow+tT?}USp$7UbIkmElU)w7!V%;+f5)4{<%YBz7n*wY@q9^P8K z8vrp~mSI(!H^~?d-LHoRyeyTMv%1@B%^?Z(ir8U}kix6PyMKpW$7k}6Gl$v*1qFWU z@>^*45J$QkyY$@3D?_O?lkM=WD=86o7a0hi)W$sIkd zdTj?8?r4#7kOlKbSSr64NZ-$4h)9Q196KCbwQ3)BmRvaDs0w(5H^nObh%sMD22P=wHR2Y+B2kEDlVqc9O#!)+ z!U?JPW_gWs&qd9LHvo8PSu|gHyJsH5bVJESxe-;X(4AGbPy?zoHX*oNFm4pK2AD_` zb|p}|NtuNwLhd~~R(UxdcATp(`^!&b$A(|J<88*dzc}w+a8BBmo-EIyYA-p{;VFE* z>7Plf5t#8%rg%T2;9F2t>BZhAkGW?=Su7VcR6f79&@lLE|MVK{mgl{z`^`Gs#$~Ji zM&6a+JBviDPfKOFQMkor?3s+5nYN2_6#Hugsr}rIS*Hn0n%6vr)_kkh^y<$vYtLRZ zu-QuFsK;vX?ID6+wew)y8=kf+|(@}b)_0BUY?38+A0@+(y%tLhE z4JV#eL)RvYMy_Y4%+jhsku`2zS)h5;>blvGELr0%6?u?;$5DIkS5wWDp;h|PfL^LE zraDB{Ew#slC)`Nu33H|z>Z1gEiw{R`-zk=SWPOqLsBeeK%=p;~q)9Ldn}p9;4#&xm}iEgyl$h24&IPZZk3OSr=JthJ5!V^LxGn3AML zdPq4l&K%uZLL%OMAy`OCAzz6)kK#SF3=@Civ=9X1N%l*=F6#8Pq}sH{aU4TU-jNXX zlK%X?$GT?Bx~5m&gmioiM(==ydS(F@(8u5(JJqhEVC4Z=>bOaw@X;X~kSSlH zRhg&&`SnSGVvTJAxY+<5zqZ?_?>CCiKIb8~HSSj|_gas#ZxRr}3SgWdi*RUdxXTBT zI86i!=21FrbrG=QcSJq9ZC^q3i%YJ!&Bo}jw`mz*8@G4W8|^MEG#d8Ds-ToK*l$lcyz0V3nQkk} zwsR_q$`C_v)DvNLrz(Hzbe481%$YM&G3|fWQ7U7#f499gH zPG_h8kqCcuL$T5;wDZgBa*12w0@Y}Q&M%HRU^j4G`XW)z&9now62@r~dtC>$VJ&c- zah5iI6eCXuV)WiXr-K2dTu+FI#30y$Sl#NFND}tcHDRfUBLR47V_~(d3ZCvc)|>8=4U6mBB7(N#D2&XTgnRMoDJX*f)!aHVccA-V&Y4K_ZudShDm@*KO0XTCuydPGu-d zJ_KxY#LcmO_hg%RTid#=$_G}rQL|2ppMD=Q?_?#G8lfPe2uF(jvY$<==%a0j_(*3C z&6+(hTVPKc4Ew`(Xl4Y{Ox6d!7Tt;K0;9v3a@>N2c)f-M%P2A9rUP>L z5oTx-J==Asa@~$Gm_{vFq1PA>rg!-s92Zz>?MYlCdiYybl;_l0 zdH>v6TNoe0Z!bCYXu}>zmE1wa6mQG0X8dO;8f5B7_HQ%et>2s(?#@cG z3^}j|f^AGzmxi~GeyF<1Fw!Pb6}~5a9aBb(DlBSX5g!HvVZinlQ zHRSyGwB!^4&iA3~QH&W)ig7<;^dbhBnIh?aXsZ#8Ps^B0kRe-`vd%L&RVOn> zu5-f>q#c?i%gZBhtgUn!?-cbk3sc#|F*3u?a;Ud=d)ix=DQ!}PDE(6y!4g?&b)@0=T*>aGl~jW z-HE`Kl~Qj)mpqYDkwiAWS3k6%iPm49S6bH8-sTI*yLCb(%rs{};pL}UR#1%~mdEk! zAesTn8;jxs6{}9?q*fc`8+KiT&}m>PtTv9`Z&5qg-O^h?rSo8|r6mT+wyP`yhc)R` z-rnpm^y+TwBtS8(;If&L{(vlqg)ny##XV@76FfrfjB>AjTBoe%`0mw0?bGAtuBWDm zX)mpa#~zrXCBywW?H&@27c$!LjaRrYbk!PW6diMnNDa@p&#lSp`wIL>@@Ez-(fu5% z8;*D9(d53e()2Fk@BzVX4&{WdZ`$gQROpw70E1)U7s-DaR8P@{3F zS@EIx5z%8`ott$DIwv)VoF}VeVFw(iJM=d>IfQ5ygL zTUYhwuteXuwvUGPj6&Qg;oGxGXYx9{m>hp;rv(!c?l+aY(9&5%jZPYf?87sS61whl zD9WR#W?;kp=Q5%XHD587uQUkqGgiu>@qk7BZtoR89j0kcx^=3>HW=#LZblzBaxy_U z775^kbHeReDP~*9eceT&D!qqnA>N$QxZP*FH2_aN7&P?fZFqn-#}>xOUU^9~+8bq+ zNwWrDMNTONcYCTf0@ihdgCpmib4*6VwzIj`2S0T&q3W@Y*u zXb1L5rou;wyMuEiLmE(oo0v;uyHqZZnCkAXhj%ga1{(GHEWxW5ih8=KLZvLRC(ya1 z5~aGHIr&Dh#M8z>js*_LyFV{ogoW!l0}OKus?=!br|3U7e~?&~>(YdZd2^*)`tbS) zuhgF9DnO=9d(tf;sPxQK(hGtK4)=&S_-aEu3gm*q<(EGio)qL;}gd#&`q4tWbW;$FtxI zOW7*ljS@+SkD#ZSjonj(-ZexHxr6AHuRebN#Yg!JR5F{;DBgU)U>4z_K!XJl~&|_&sDH*Jxo>3H$@#CiIf9rnZ`VF$0g#-}_Nn~_N<5)xAbtMN2{kXvk5HofNaLN(y zNlTWW`l4U%-bF&R_<-2{zuQHE+q^V3$S#CHz39K&g}don)j!3&#HlVB2o_}M&6Z8x z;MEnI2!?7GUF2d96k%U~_D{A!ALRz~?2cx5%hgesP8bq^0(<6W5&Y2Kp+EBXNyLOE zX&@7n`L43xfAxIRI3FGnWsOHIl8e;o#nRE5>go#fg^F7IT{S9&Q&joXii(OYLJPy^ zuOt*iAdD@D8KE2pdfWI<7 zy8=1bKWH-b$g18Iq{$JGCXqp`F^Kw8a@pNu5qu9dD|qvfb#lyT+a* zV?%5HMhqcc6n*eU;feQ9c^}X z96_df3F<}pv#FZcJN*_5{%5NoLj{${__3e18hj?zD!S`!MHLd5LyjSM2uDsHF0>li zR$EYIvh*t3J|>}-2JH2!8~=s^r^)`6qP{rMW^0MOa6B9t3bwMWsRop%7UQ-vs^_l6 zWeKNJEQ1FtQ%sDLF`F`PqjMe9dw3u8jL3;#hC$pZvqY~d=&>hqWXiCLx*2@YBaK<7 zsx7+DG$w2%U`@M&me$xSU2(_s`PlR)Enj#bXsFdbcYQ7#BF~1w?6Q2>7b^52tLrWc z5u9q{p3E{pG@4;gFk8+xehC&>TVHkWz@?ipqwr5`LdT&k{XBY*jgaK$=Lr$;bTJvM z!@a51aw%eEnkc#8Mo_1@JjzvRYenUoO5_TbuocGkXuXNG}36IPy_wi9LzyMnoFGH^(`f6=*R z)8g5v$Q|!-#c{Yl+B--f_kxb01ElP~2Pb%Ny$Qxw004sn0Pu6s{q0J{*~Qbw^tZEE z>nDBZTyD(Jvj(ddh_7GPB5HSh+zR{olk#TLXWdvoI(j|mK);z6BTkNSIlR z9z`*CPQvC!5~(ndmh^ubsi?@les@WZL7Ns$N%UHhFvbTX?3*Xg{qyzr&7DD6HcTkF zk}yR{>&)nPPmebpPu0y*HFdkig<#5FDEBi{tRveI7u?@d_<#p67*|qfdPU^GkI$)m zF`~(>yB7f!-KnN;8S@6`cXE4rYLr8y@0DiXlK4D}-+2z^j`qf&F>)x2AE@+N%Ikj5 zE>lD8{c!1-b{O&6bm-N`FwWE=I6z3ZqFM>&5{xg4`UeD=_lmE_{IXZU6&(G^0Nk=~ zUOVcL^dIo-R**4WGo5CVB~>=flKV<$GA5aK=1%C03Edgq27YCgjffdCQSmJm_$X+o zo|wOW7?|IVtk{f>ivcg+))uM4GVRSRTQj0oxi_9}rCa5vjlYO{P^fKkl?2;sp_g$T zLKV0ElrVJgt!Opzxo(NMxIqu=D{X_iq%x$ivvhRgNB<>r0%BKtyNTC|oE za|=EAz}(klKfEMldx0d$wqlmGXBX>?q=HHByY2K#Ll5SW>*#}TmE1||w@;@mD6~_E zemwWr#mn3~*^L;&ow@x1Q!0>;1M!j@s)RNTFVA!A>sCP(mr^f&J_0PX!|aWo-#zuT zgwLY1l(Uh<{pq8}`+n?FK6Y@FmJH0_QkaYTZOX5c%3Uaj<&u)x>e=$L`8l8LQO|ye z-Z&DYI&;mLx#5{w^8WPgu}$InqD=wF{4#;|fqJtdA7#rD;7T;GEx|tUmXm#8n*#KU z0s4hxADEt;!k6WhaHbza?;1+9w+@Nwe`jNPvbOqU5{&2m61&;ICJ5f>c;kL+xBB$d zg6Hn%e%imb;oSmin)k4KGk1AfJC~ad~^1)HIC^F8fH0sWGbXWRd6|m6gX7 zI@u9X`v(^feGKF?+LU;-Dng62RAa;mL)Gd2{l!WsG@FK zT;;Z;lZ2A>pMTWZbG*J-^c{f8r?dmmVNY! zp*Nm@i%2o3Dp`%THDLR}r%9{jt%z>294f|9!6m<|V^|k;9v*sux`ObP0Ine%AswAm`*Faw31BmBUYN-tsB9WSfMFXkhEb^qE#OR&o;fR+R}Vl zvLI{xb@ih>Hj_53TzPHKH^JEjuHH6pOr-YDl0#x*xhrGBgTdF|%#a%tZ#G(~Ft9Am zlv&t2>5@!o$xSrq0$y&r_FwX7HuDt%b2+Bw3{V-6a2D%`v4Jx2@L^J3X*8t5tf9E; z9d};kTBwtgglGl=LGg~H+mRuTZw`phlTWcUn_oy$5pmZ2v`E8UNoZC1<2rFiLM;Ve z5*~V5nqj`il_ESPo0~mN$+^n26WHCd8^dtPB`~ld%v6( zK16JFUN+_uH!~x(lhMwi<)sU(7$!_FR5`9*_E!RWe%Dlp^a=&!e!I zQnJe?IhcJTaI~~U+mu3>*0b>r)%x2-V$WUsKyf;)#IK}UD5fg3;caqPhk8ox4$1p?NN|p=Ms$`0ctSx1xEj z|E!oyNbSsg8e|moF&>h&7Ue#(5=_URn7$ov(V3!b{9db%Xo?s7FI3f`xy|If`R*G) zP;=fftcyLAB&41_)Q)2tMx^^e8F62J11|HcN-{4+m}A&lWfE}PSui#zUT{-27+ymsAmfj!CVbHhK)ATorN~95gSA0U+o}-TA0vp!(1~~bbCHU!qZsfia;(G zAqQ}ld}MmfOdC0XgVEmtLg@Xuk5=q+6g{b0I$gVuR0q!{`3DJ0T8 z73vx>+orPh-84y3B`yKKmeY4Vh0;W~`Lc5@$a|SI{#n;ikk+(R`tt2KaPh4P<;m-j zkTv58?+@XatfVRhu9lgL}fdbo@f+04sxS>x3i2BNUCD6 zetoMjr)1om)x1zq91Sa}P8mcvtzwwhgBp=7v&diRImDWz5vkm@ib=qJ!-f781g*`g z^E-&7OWMlcF$Fg#BR{l=v3QJjIC_>k1aGTRT8j*siK`Pwv8F85%cpAi6;6d2O z4JBImE%gpO^(U8j8f({z$w#6T!LT~i038e_WGb0?5_O8Fg9W@jT3roscH^DH$jZoP z6|CuscDEsoeo-Z<5w4Q7w>H)#0?j3NCj>K>jh|X_O)VMnN8wGIWwf5rF-rSYRCSvK z)T3MsyIffIs!QKJP3WUrbe7z|`BLrQMMtOX^}>;InVBT{W$|6nZba!S?;G}t*^VVa zrVfH}+^kf)UU=*?%!0?oHSFQDh>BDDm6H3S{F1RCOi^o3-SYd6>#LXlY^}k-89*G* zKPP5`2K}Y{Lz=dd>|X`^HI4Mo=mb#W+@F$4e+B+EzwXb#8qf{@|CMd`tE69ZuKtj9 z0Lni9TL#vz@L!V({(wuq{x|&B6oX$y{CZ*Zhlp|zo%XK-%b%#UU*W&fvVXwej1V*QH#E0geNbRyB8(7*Evzrue# j;Qb+hkMwu#{pYx+Bnt&HkDn>auK-;j<|2jRXYKz1lAHbI literal 0 HcmV?d00001 diff --git a/group06/236995728/src/com/coding/basic/Iterator.java b/group06/236995728/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e7cbd474ec --- /dev/null +++ b/group06/236995728/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group06/236995728/src/com/coding/basic/LinkedList.java b/group06/236995728/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..74a96107cb --- /dev/null +++ b/group06/236995728/src/com/coding/basic/LinkedList.java @@ -0,0 +1,149 @@ +package com.coding.basic; + +/** + * 2017/2/24 + * @author 236995728 + * 单链表 + */ +public class LinkedList implements List { + + private Node head = new Node(null,null); + private Node current = new Node(null, null); + + private int size = 0; + + /** + * 在尾节点添加节点 + */ + @Override + public void add(Object o){ + Node newNode = new Node(null,o); + if(head.next == null){ + head.next = newNode; + }else{ + current.next = newNode; + } + current = newNode; + size ++; + } + + /** + * 按照索引添加节点 + */ + @Override + public void add(int index , Object o){ + if(index <0 || index > size){ + throw new IndexOutOfBoundsException("param invalid"); + } + Node node = head; + Node newNode = new Node(null,o); + for(int i=0; i size){ + throw new IndexOutOfBoundsException("param invalid"); + } + Node node = head; + for(int i=0; i size){ + throw new IndexOutOfBoundsException("param invalid"); + } + Node node = head; + Node nextNode = null; + Object o = null; + for(int i=0; i { + private int data; + + public TreeData(int data) { + this.data = data; + } + + public int getData() { + return data; + } + + @Override + public String toString() { + return data + ""; + } + + @Override + public int compareTo(Object o) { + return data - ((TreeData)o).data; + } + +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/ArrayList.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/ArrayList.java new file mode 100644 index 0000000000..ae64aca982 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/ArrayList.java @@ -0,0 +1,138 @@ +package com.pxshuo.se01.basic.impl; + +import com.pxshuo.se01.basic.Iterator; +import com.pxshuo.se01.basic.List; + +/** + * 实现一个ArrayList + * @author Pxshuo + * + */ + +public class ArrayList implements List{ + + private int size = -1;//数组的长度的下标 + private Object[] elements = new Object[10];//数组内容 + private int addSize = 10;//每次增加的长度 + + @Override + public void add(Object o) { + elements = grow(); + size++; + elements[size] = o;//size与index同一个概念 + } + + @Override + public void add(int index, Object o) { + if (index > size + 1) { + return; + } + elements = grow(); + int moveNum = size - index + 1;//本次操作需要移动的元素的个数; + size++; + if (index >= elements.length - 1) {//按照位置来看 + elements = grow(elements, index - (elements.length - 1)); + size = index;//size与index同一个概念 + } + + /** + * 整体向后移一位 + */ + if(moveNum > 0){ + System.arraycopy(elements, index, elements, index + 1, moveNum); + } +// for(int i = size - 1; i >= index; i--) +// { +// elements[i] = elements[i-1]; +// } + + elements[index] = o; + } + + @Override + public Object get(int index) { + return elements[index]; + } + + @Override + public Object remove(int index) { + if (index > size) { + return null; + } + Object removeEle = elements[index]; + int moveNum = size - index;//本次操作需要移动的元素的个数; + if (moveNum > 0) { + System.arraycopy(elements, index + 1, elements, index, size - index + 1); + } + elements[size] = null; + size--; + return removeEle; + } + + @Override + public int size() { + return size + 1; + } + + /** + * 设置迭代器 + * @return + */ + public Iterator iterator() { + return new ArrayListIterator(this); + } + + private class ArrayListIterator implements Iterator{ + + ArrayList arrayList = null; + int position = -1; + + public ArrayListIterator(ArrayList arrayList) { + this.arrayList = arrayList; + } + + @Override + public boolean hasNext() { + position ++; + if (position >= arrayList.size()) { + return false; + } + return true; + } + + @Override + public Object next() { + return arrayList.elements[position]; + } + + } + + /** + * 自动控制是否增加数组长度 + * @return 如果增加一条数据会造成数组溢出,则增加数组的长度,否则不进行改变。 + */ + private Object[] grow(){ + if (size() >= elements.length) { + return grow(elements, addSize); + } + else { + return elements; + } + + } + + /** + * 动态增加数组长度 + * @param src + * @param addSize + * @return + */ + private Object[] grow(Object[] src,int addSize){ + Object[] target = new Object[src.length + addSize]; + System.arraycopy(src, 0, target, 0, src.length); + return target; + + //return Arrays.copyOf(src, src.length + addSize);同理 + } + +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTree.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTree.java new file mode 100644 index 0000000000..69bee72af0 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTree.java @@ -0,0 +1,65 @@ +package com.pxshuo.se01.basic.impl; + +import com.pxshuo.se01.basic.Iterator; + +/** + * 排序二叉树 + * @author Pxshuo + * + */ + +public class BinaryTree { + BinaryTreeNode root = null; + + /** + * 添加一个二叉树的节点 + * @param o + */ + public void add(Comparable o){ + if (root == null) { + root = new BinaryTreeNode(); + root.setData(o); + } + else { + root.insert(o); + } + } + + public Object get(int index){ + Stack findChild = childPath(index); + BinaryTreeNode child = null; + int childNum = 0; + for(;!findChild.isEmpty();){ + childNum = (int)findChild.pop(); + if (childNum != -1) { + child = child.getChild(childNum); + } + else { + child = root; + } + } + return child == null ? null : child.getData(); + } + + public void display(){ + root.display(1); + } + + private Stack childPath(int index) { + Stack findChild = new Stack(); + + while(true){ + if (index == 1 || index <= 0) { + findChild.push(-1); + return findChild; + } + if (index%2 == 1) { + findChild.push(1); + } + else { + findChild.push(0); + } + index = index/2; + } + } +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTreeNode.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTreeNode.java new file mode 100644 index 0000000000..57cf2da9e1 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTreeNode.java @@ -0,0 +1,109 @@ +package com.pxshuo.se01.basic.impl; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private int index = 0; + + public BinaryTreeNode() { + data = null; + left = null; + right = null; + } + + /** + * 差入一个二叉树节点 + * @param o + * @return + */ + public BinaryTreeNode insert(Comparable o){ + if(data == null){ + data = o; + return this; + } + //本节点已经存过数据 + BinaryTreeNode child = new BinaryTreeNode(); + child.setData(o); + if (o.compareTo(data) > 0) { + if (right == null) { + right = child; + } + else { + right.insert(o); + } + } + else {//小于等于的数据放在左子树中 + if (left == null) { + left = child; + } + else { + left.insert(o); + } + } + return child; + } + + /** + * 根据二叉树的位置获取孩子节点 + * @param index 0代表左孩子,1代表右孩子 + * @return + */ + public BinaryTreeNode getChild(int index){ + if(index == 0){ + return getLeft(); + } + else if(index == 1){ + return getRight(); + } + else { + return null; + } + } + + /** + * 用于打印二叉树 + * @param myIndex 在二叉树中的位置--采用完全二叉树 + */ + public void display(int myIndex){ + + System.out.println(myIndex + ":" + data.toString()); + if (left != null) { + left.display(2 * myIndex); + } + if (right != null) { + right.display(2 * myIndex + 1); + } + } + + /////////////////get和set函数/////////////////////////////////////// + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public void setIndex(int index) { + this.index = index; + } + + public int getIndex() { + return index; + } + +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/LinkedList.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/LinkedList.java new file mode 100644 index 0000000000..eeded51514 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/LinkedList.java @@ -0,0 +1,181 @@ +package com.pxshuo.se01.basic.impl; + +import java.time.Period; + +import com.pxshuo.se01.basic.Iterator; +import com.pxshuo.se01.basic.List; + +public class LinkedList implements List { + + private Node head = new Node(); + private Node tail = null; + private int size = -1;//与index的位置等同 + + //封装空表时候的增加与最后一次的删除-- + + public void add(Object o){ + Node node = new Node(o); + node.next = null; + + if (head.next == null) {//初始化 + head.next = node; + tail = node; + } + else { + tail.next = node; + tail = node; + } + size ++; + } + public void add(int index , Object o){ + if (index > size + 1) { + add(o); + } + else{ + Node prev = head; + Node current = new Node(o); + for(int i=0; i < index; i++) + { + prev = prev.next; + } + current.next = prev.next; + prev.next = current; + size ++; + } + } + public Object get(int index){ + if (index <= size) { + Node node = head; + for(int i = 0; i <= index;i++){ + node = node.next; + } + return node.data; + } + return null; + } + public Object remove(int index){ + Node remove = null; + if (index <= size) { + Node prev = head; + for(int i=0; i < index; i++) + { + prev = prev.next; + } + remove = prev.next; + prev.next = remove.next; + remove.next = null; + + if (index == size) {//设置尾部 + tail = prev; + if (size == 0) { + tail = null; + } + } + size --; + } + return remove != null ? remove.data : null; + } + + public int size(){ + return size + 1; + } + + public void addFirst(Object o){ + Node first = new Node(o); + first.next = head.next; + head.next = first; + if(tail == null) + { + tail = first; + } + size ++; + } + public void addLast(Object o){ + if(tail == null){ + add(o); + } + else { + Node last = new Node(o); + last.next = null; + tail.next = last; + tail = last; + size ++; + } + + } + public Object removeFirst(){ + Node first = head.next; + if(first != null) + { + head.next = first.next; + first.next = null; + } + else { + head.next = null; + } + if (head.next == null) {//如果链表为空 + tail = null; + } + size --; + return first!=null ? first.data : null; + } + public Object removeLast(){ + Node last = head; + for(;last.next != tail; last = last.next ){ + + } + tail = last; + last = last.next; + if(tail == head){//最后一个元素 + head.next=null; + tail = null; + }else { + tail.next = null; + } + + size --; + return last != null? last.data : null; + } + public Iterator iterator(){ + return new LinkedListIterator(this); + } + + private static class Node{ + Object data; + Node next; + + public Node() { + } + + public Node(Object data) { + this.data = data; + } + + } + + private class LinkedListIterator implements Iterator{ + LinkedList linkedList = null; + Node position = new Node(); + + public LinkedListIterator(LinkedList linkedList) { + this.linkedList = linkedList; + this.position = head; + } + + @Override + public boolean hasNext() { + position = position.next; + if (position == null) { + return false; + } + return true; + } + + @Override + public Object next() { + return position.data; + } + + } + +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Queue.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Queue.java new file mode 100644 index 0000000000..5d9f4eee31 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Queue.java @@ -0,0 +1,44 @@ +package com.pxshuo.se01.basic.impl; + +/** + * 基本数据结构-队列 + * @author Pxshuo + * + */ + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + + /** + * 入队操作 + * @param o 入队的元素 + */ + public void enQueue(Object o){ + linkedList.addLast(o); + } + + /** + * 出队操作 + * @return 返回出队的元素 + */ + public Object deQueue(){ + return linkedList.removeFirst(); + } + + /** + * 判断队列是否为空 + * @return 为空返回true,否则返回false + */ + public boolean isEmpty(){ + return linkedList.size() == 0 ? true : false; + } + + /** + * 返回队列的长度 + * @return + */ + public int size(){ + return linkedList.size(); + } +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Stack.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Stack.java new file mode 100644 index 0000000000..e6237fa7e8 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Stack.java @@ -0,0 +1,51 @@ +package com.pxshuo.se01.basic.impl; + +/** + * 基本数据结构-栈 + * @author Pxshuo + * + */ + +public class Stack { + private ArrayList elementData = new ArrayList(); + + /** + * 使一个元素入栈 + * @param o 将要入栈的元素 + */ + public void push(Object o){ + elementData.add(elementData.size(), o); + } + + /** + * 使一个元素出栈 + * @return 返回出栈的元素 + */ + public Object pop(){ + return elementData.size() == 0 ? null : elementData.remove(elementData.size() - 1); + } + + /** + * 获得栈顶元素 + * @return 返回栈顶元素 + */ + public Object peek(){ + return elementData.size() == 0 ? null : elementData.get(elementData.size() - 1); + } + + /** + * 查看栈是否为空 + * @return 空的话返回true + */ + public boolean isEmpty(){ + return elementData.size() == 0 ? true : false; + } + + /** + * 查看栈中元素的个数 + * @return 返回栈中的个数 + */ + public int size(){ + return elementData.size(); + } +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/package-info.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/package-info.java new file mode 100644 index 0000000000..5d2c270af8 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/package-info.java @@ -0,0 +1,14 @@ +/** + * 用于实现基本数据类型,包括但不仅限于: + * ArrayList + * Stack + * LinkedList + * Queue + * Tree + * Iterator + */ +/** + * @author Pxshuo + * + */ +package com.pxshuo.se01.basic.impl; \ No newline at end of file diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/array/ArrayUtil.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/array/ArrayUtil.java new file mode 100644 index 0000000000..e2d5a07eed --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/array/ArrayUtil.java @@ -0,0 +1,226 @@ +package com.pxshuo.se02.array; + +import java.util.ArrayList; +import java.util.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int[] result = new int[origin.length]; + for(int i = 0;i resultList = new ArrayList<>(); + for(int i = 0,j = 0;i array2[j]){ + resultList.add(array2[j++]); + } + else if (array1[i] < array2[j]) { + resultList.add(array1[i++]); + } else { + j++; + } + } + + int[] result = new int[resultList.size()]; + for(int i = 0;i < resultList.size();i++){ + result[i] = resultList.get(i); + } + return result; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] result = new int[oldArray.length+size]; + System.arraycopy(oldArray, 0, result, 0, oldArray.length); + return result; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + List resultList = new ArrayList<>(); + resultList.add(1); + resultList.add(1); + int fibon = 1,fibonPrev1 = 1,fibonPrev2 = 1; + while(fibon < max){ + fibonPrev2 = fibon; + fibon = fibonPrev1 + fibonPrev2; + fibonPrev1 = fibonPrev2; + resultList.add(fibon); + } + resultList.remove(resultList.size()-1); + + int[] result = new int[resultList.size()]; + for(int i = 0;i < resultList.size();i++){ + result[i] = resultList.get(i); + } + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if (max < 2) { + return null; + }else if (max < 4) { + return new int[]{2}; + } + if (max < 6) { + return new int[]{2,3}; + } + List primeList = new ArrayList<>(); + primeList.add(2); + primeList.add(3); + boolean isPrime = true; + /** + * 非2偶数肯定不是素数 + */ + for(int i = 5;i < max; i = i + 2){ + isPrime =true; + for(int j = 1;j= max) { + primeList.remove(primeList.size() - 1); + } + + int[] result = new int[primeList.size()]; + for(int i = 0;i < primeList.size();i++){ + result[i] = primeList.get(i); + } + return result; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + if (max < 7) { + return null; + } + List perfectList = new ArrayList<>(); + int sum = 1; + + for (int i = 2; i < max; i++) { + sum = 1; + for(int j = 2;j < i; j++){ + if (i%j == 0) { + sum += j; + } + } + if (sum == i) { + perfectList.add(sum); + } + } + + if (perfectList.get(perfectList.size() - 1) >= max) { + perfectList.remove(perfectList.size() - 1); + } + + int[] result = new int[perfectList.size()]; + for(int i = 0;i < perfectList.size();i++){ + result[i] = perfectList.get(i); + } + return result; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + String result = ""; + for (int i = 0; i < array.length; i++) { + result = result + array[i] + seperator; + } + if (result.endsWith(seperator)) { + result = result.substring(0, result.length()-1); + } + return result; + } + + +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/LoginAction.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/LoginAction.java new file mode 100644 index 0000000000..067a2875b1 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.pxshuo.se02.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Struts.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Struts.java new file mode 100644 index 0000000000..6801a838d7 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Struts.java @@ -0,0 +1,151 @@ +package com.pxshuo.se02.litestruts; + +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + Element struts = strutsFactory("struts.xml"); + List actions = struts.elements(); + List resultRefs = new ArrayList<>();//action下面的结果跳转 + String actionClass = "";//获取action的类型 + for (Element element : actions) { + if (actionName.equals(element.attributeValue("name"))) { + actionClass = element.attributeValue("class"); + resultRefs = element.elements();//获取结果跳转 + } + } + + Iterator> iterator = parameters.entrySet().iterator();//规范化传递进来的数据 + + try { + //反射实例化一个对象 + Object action = Class.forName(actionClass).newInstance(); + while (iterator.hasNext()) {//执行set方法 + Map.Entry entry = (Map.Entry) iterator.next(); + Method setMethod = action.getClass().getDeclaredMethod("set" + Tools.upperFirst(entry.getKey()) + ,String.class);//这里的类型值不知道怎么取 + setMethod.invoke(action, entry.getValue()); + } + + //调用exectue + Method exectue = action.getClass().getDeclaredMethod("execute"); + String result = (String)exectue.invoke(action); + + //生成返回列表 + Map actionParam = new HashMap<>(); + Method[] methods = action.getClass().getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().startsWith("get")) { + String methodName = Tools.lowerFirst(method.getName().substring(3)); + String methodValue = (String)method.invoke(action); + actionParam.put(methodName, methodValue); + } + } + + //返回的视图 + View view = new View(); + view.setParameters(actionParam); + for(Element element:resultRefs){ + if (result.equals(element.attributeValue("name"))) { + view.setJsp((String)element.getData()); + } + } + + return view; + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchMethodException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + return null; + } + + public static Element strutsFactory(String filename) { + //读配置文件 + InputStream inputStream = Struts.class.getResourceAsStream(filename); + SAXReader reader = new SAXReader(); + Document document = null; + + try { + document = reader.read(inputStream); + + Element struts = document.getRootElement(); + return struts; + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + public static void main(String[] args) { + //strutsFactory("struts.xml"); + //runAction(null, null); + String actionName = "login"; + Element struts = strutsFactory("struts.xml"); + List actions = struts.elements(); + for (Element element : actions) { + if (actionName.equals(element.attributeValue("name"))) { + System.out.println(element.attributeValue("class")); + + for(Element element1:(List)element.elements()){ + System.out.println(element1.getData()); + } + } + } + } +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/StrutsTest.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/StrutsTest.java new file mode 100644 index 0000000000..7ed32c89f6 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.pxshuo.se02.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Tools.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Tools.java new file mode 100644 index 0000000000..66acb26157 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Tools.java @@ -0,0 +1,33 @@ +package com.pxshuo.se02.litestruts; + +public class Tools { + /** + * 将第一个字母转为大写 + * @param string + * @return + */ + public static String upperFirst(String string) { + if (string == null || ("").equals(string)) { + return ""; + } + string = string.substring(0,1).toUpperCase() + string.substring(1); + return string; + } + + /** + * 将第一个字母转为大写 + * @param string + * @return + */ + public static String lowerFirst(String string) { + if (string == null || ("").equals(string)) { + return ""; + } + string = string.substring(0,1).toLowerCase() + string.substring(1); + return string; + } + + public static void main(String[] args) { + upperFirst("1ame"); + } +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/View.java b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/View.java new file mode 100644 index 0000000000..5f017e9a8a --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/View.java @@ -0,0 +1,23 @@ +package com.pxshuo.se02.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/struts.xml b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/struts.xml new file mode 100644 index 0000000000..227b855f45 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group06/2415980327/CodeSE01/src/com/pxshuo/test/Test.java b/group06/2415980327/CodeSE01/src/com/pxshuo/test/Test.java new file mode 100644 index 0000000000..9737d269e8 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/com/pxshuo/test/Test.java @@ -0,0 +1,59 @@ +package com.pxshuo.test; + + +import com.pxshuo.se01.basic.Iterator; +import com.pxshuo.se01.basic.TreeData; +import com.pxshuo.se01.basic.impl.ArrayList; +import com.pxshuo.se01.basic.impl.BinaryTree; +import com.pxshuo.se01.basic.impl.LinkedList; +import com.pxshuo.se01.basic.impl.Queue; +import com.pxshuo.se01.basic.impl.Stack; + +public class Test { + public static void main(String[] args) { +// LinkedList arrayList = new LinkedList(); +// arrayList.add("hello1"); +// arrayList.add("hello2"); +// arrayList.add(9,"hello3"); +// //arrayList.add(10,"hello4"); +// arrayList.addLast("hi"); +// arrayList.addLast("hihi"); +// arrayList.addFirst("hi1"); +// arrayList.removeFirst(); +// arrayList.removeLast(); +// arrayList.add(1,"hi1"); +// arrayList.remove(1); +// //arrayList.add(0, "hi"); +// //arrayList.remove(8); +// //arrayList.remove(0); +// for (Iterator iterator = arrayList.iterator(); iterator.hasNext();) { +// System.out.println("hi"+iterator.next()); +// } + //Queue queue = new Queue(); +// Stack stack = new Stack(); +// +// for (int i = 0; i < 10; i++) { +// //queue.enQueue("test-" + i); +// stack.push("test-" + i); +// } +// for(int i =0; i< 11; i++) +// { +// System.out.println(stack.pop()); +// } +// stack.push("test-" + 233); +// System.out.println(stack.pop()); + + BinaryTree binaryTree = new BinaryTree(); + binaryTree.add(new TreeData(5)); + binaryTree.add(new TreeData(2)); + binaryTree.add(new TreeData(7)); + binaryTree.add(new TreeData(1)); + binaryTree.add(new TreeData(6)); + binaryTree.add(new TreeData(4)); + binaryTree.add(new TreeData(8)); + + System.out.println(binaryTree.get(5).getClass()); + + //binaryTree.display(); + } +} diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/ArrayListTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/ArrayListTest.java new file mode 100644 index 0000000000..26b7b977e6 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/ArrayListTest.java @@ -0,0 +1,42 @@ +package test.com.pxshuo.se01.basic.impl; + +import org.junit.Assert; +import org.junit.Test; + +import com.pxshuo.se01.basic.impl.ArrayList; + +public class ArrayListTest { + ArrayList object = new ArrayList(); + + @Test + public void addTest() { + object.add("String"); + Assert.assertEquals("String", object.get(0)); + } + + @Test + public void addIndexTest(){ + object.add(3,"Hello"); + Assert.assertEquals("Hello", object.get(3) ); + } + + @Test + public void removeTest() { + object.add("Hello"); + object.add("Hello"); + object.add("Hello"); + object.add(3,"Hello"); + Assert.assertNotNull(object.get(3)); + object.remove(3); + Assert.assertNull(object.get(3)); + } + + @Test + public void sizeTest(){ + object.add("new"); + object.add("hi"); + object.add(1,"new"); + object.remove(2); + Assert.assertEquals(2, object.size()); + } +} diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/BinaryTreeTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/BinaryTreeTest.java new file mode 100644 index 0000000000..dc53c5988d --- /dev/null +++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/BinaryTreeTest.java @@ -0,0 +1,26 @@ +package test.com.pxshuo.se01.basic.impl; + +import org.junit.Assert; +import org.junit.Test; + +import com.pxshuo.se01.basic.TreeData; +import com.pxshuo.se01.basic.impl.BinaryTree; + +public class BinaryTreeTest { + BinaryTree object = new BinaryTree(); + + @Test + public void binaryTest() { + BinaryTree binaryTree = new BinaryTree(); + binaryTree.add(new TreeData(5)); + binaryTree.add(new TreeData(2)); + binaryTree.add(new TreeData(7)); + binaryTree.add(new TreeData(1)); + binaryTree.add(new TreeData(6)); + binaryTree.add(new TreeData(4)); + binaryTree.add(new TreeData(8)); + + Assert.assertEquals("4", binaryTree.get(5).toString()); + Assert.assertEquals("8", binaryTree.get(7).toString()); + } +} diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/LinkedListTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/LinkedListTest.java new file mode 100644 index 0000000000..21fea9680f --- /dev/null +++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/LinkedListTest.java @@ -0,0 +1,43 @@ +package test.com.pxshuo.se01.basic.impl; + +import org.junit.Assert; +import org.junit.Test; + +import com.pxshuo.se01.basic.impl.ArrayList; +import com.pxshuo.se01.basic.impl.LinkedList; + +public class LinkedListTest { + LinkedList object = new LinkedList(); + + @Test + public void addTest() { + object.add("String"); + Assert.assertEquals("String", object.get(0)); + } + + @Test + public void addIndexTest(){ + object.add(3,"Hello"); + Assert.assertEquals("Hello", object.get(0)); + } + + @Test + public void removeTest() { + object.add("Hello"); + object.add("Hello"); + object.add("Hello"); + object.add(3,"Hello"); + Assert.assertNotNull(object.get(3)); + object.remove(3); + Assert.assertNull(object.get(3)); + } + + @Test + public void sizeTest(){ + object.add("new"); + object.add("hi"); + object.add(1,"new"); + object.remove(2); + Assert.assertEquals(2, object.size()); + } +} diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/QueueTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/QueueTest.java new file mode 100644 index 0000000000..edd3bfd73a --- /dev/null +++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/QueueTest.java @@ -0,0 +1,23 @@ +package test.com.pxshuo.se01.basic.impl; + +import org.junit.Assert; +import org.junit.Test; + +import com.pxshuo.se01.basic.impl.Queue; + +public class QueueTest { + public Queue object = new Queue(); + + @Test + public void enQueueTest() { + Assert.assertEquals(true, object.isEmpty()); + object.enQueue("hello"); + object.enQueue("world"); + Assert.assertEquals(false, object.isEmpty()); + Assert.assertEquals(2, object.size()); + Assert.assertEquals("hello", object.deQueue()); + Assert.assertEquals("world", object.deQueue()); + Assert.assertEquals(0, object.size()); + } + +} diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/StackTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/StackTest.java new file mode 100644 index 0000000000..fc3f450e01 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/StackTest.java @@ -0,0 +1,25 @@ +package test.com.pxshuo.se01.basic.impl; + +import org.junit.Assert; +import org.junit.Test; + +import com.pxshuo.se01.basic.impl.Queue; +import com.pxshuo.se01.basic.impl.Stack; + +public class StackTest { + public Stack object = new Stack(); + + @Test + public void enQueueTest() { + Assert.assertEquals(true, object.isEmpty()); + object.push("hello"); + object.push("world"); + Assert.assertEquals(false, object.isEmpty()); + Assert.assertEquals(2, object.size()); + Assert.assertEquals("world", object.peek()); + Assert.assertEquals("world", object.pop()); + Assert.assertEquals("hello", object.pop()); + Assert.assertEquals(0, object.size()); + } + +} diff --git a/group06/2415980327/CodeSE01/src/test/com/pxshuo/se02/array/ArrayUntilTest.java b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se02/array/ArrayUntilTest.java new file mode 100644 index 0000000000..6a6e3d4229 --- /dev/null +++ b/group06/2415980327/CodeSE01/src/test/com/pxshuo/se02/array/ArrayUntilTest.java @@ -0,0 +1,72 @@ +package test.com.pxshuo.se02.array; + +import org.junit.Assert; +import org.junit.Test; + +import com.pxshuo.se02.array.*; + +public class ArrayUntilTest { + private ArrayUtil obj = new ArrayUtil(); + + @Test + public void reverseArrayTest() { + int[] origin = {3, 30, 9,7}; + obj.reverseArray(origin); + int[] expect = {7,9,30,3}; + Assert.assertArrayEquals(expect, origin); + } + + @Test + public void removeZeroTest() { + int[] origin = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] actual = obj.removeZero(origin); + int[] expect = {1,3,4,5,6,6,5,4,7,6,7,5}; + Assert.assertArrayEquals(expect, actual); + } + + @Test + public void mergeTest() { + int[] array1 = {3, 5, 7,8}; + int[] array2 = {4, 5, 6,7}; + int[] actual = obj.merge(array2,array1); + int[] expect = {3,4,5,6,7,8}; + Assert.assertArrayEquals(expect, actual); + } + + @Test + public void growTest() { + int[] origin = {2,3,6}; + int[] actual = obj.grow(origin,3); + int[] expect = {2,3,6,0,0,0}; + Assert.assertArrayEquals(expect, actual); + } + + @Test + public void fibonacciTest() { + int[] actual = obj.fibonacci(15); + int[] expect = {1,1,2,3,5,8,13}; + Assert.assertArrayEquals(expect, actual); + } + + @Test + public void getPrimesTest() { + int[] actual = obj.getPrimes(23); + int[] expect = {2,3,5,7,11,13,17,19}; + Assert.assertArrayEquals(expect, actual); + } + + @Test + public void getPerfectNumbersTest() { + int[] actual = obj.getPerfectNumbers(1000); + int[] expect = {6,28,496}; + Assert.assertArrayEquals(expect, actual); + } + + @Test + public void joinTest() { + int[] origin = {3,8,9}; + String actual = obj.join(origin, "-"); + String expect = "3-8-9"; + Assert.assertEquals(expect, actual); + } +} diff --git "a/group06/2415980327/\346\226\207\347\253\240/SE01_\350\256\241\347\256\227\346\234\272CPU\343\200\201\347\241\254\347\233\230\343\200\201\345\206\205\345\255\230\344\273\245\345\217\212\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" "b/group06/2415980327/\346\226\207\347\253\240/SE01_\350\256\241\347\256\227\346\234\272CPU\343\200\201\347\241\254\347\233\230\343\200\201\345\206\205\345\255\230\344\273\245\345\217\212\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" new file mode 100644 index 0000000000..ee1bdbd433 --- /dev/null +++ "b/group06/2415980327/\346\226\207\347\253\240/SE01_\350\256\241\347\256\227\346\234\272CPU\343\200\201\347\241\254\347\233\230\343\200\201\345\206\205\345\255\230\344\273\245\345\217\212\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" @@ -0,0 +1,13 @@ +# 计算机CPU、硬盘、内存以及指令之间的关系 + +by 2415980327 + +​ 但凡常见的事物,总会让人习以为常。伴随着计算机在在现代社会中的普及,人们可以日常生活中随处见到计算机在辅助我们进行各种各样的工作。在未经深究的情况下,我们就自然而然的认为,计算机本身就是这个样子。计算机实际上是什么样,我也不清楚。从小学知道这种事物开始,也是慢慢地在了解这种机器。 + +​ 就我所知,我们目前使用的常见的个人计算机在概念上是属于图灵机的。图灵机这个概念是研究将人们数学的运算过程使用机器来进行代替。它是由一个纸带作为输入与输出,同时使用一个处理器来处理这个纸带,达到运算的目的。类似是程序中函数的概念。或许来说程序中函数的概念要比图灵机的概念晚得多,但是作为一个程序员来说,就没有必要非要把自己置于一无所知的情形下再去学习这个概念。既然我已经知道了函数这个概念,那我就用函数来类比图灵机的概念吧。类似于函数的输入-处理-输出这种结构,想必大家也是一目了然的。 + +​ 图灵机只是作为一个理论上模拟出来的机器,只是为了证明这样是可行的。而实际上实现的是冯诺依曼体系结构的计算机。我们日常所见的计算机也是基于这种体系结构建立起来的。冯诺依曼体系结构是分为五部分的,包括存储器,运算器、控制器、输入设备和输出设备。同样也可以类比为函数,输入设备输出设备同图灵机一样只是作为输入与输出,剩下的存储器、控制器与运算器是做为处理器存在的,类似于函数中的变量,逻辑结构与逻辑运算的存在。存储器就是存储一些信息,运算器是做一些实际上的运算,控制器是进行程序指令的跳转,来实现各种不同的结构。 + +​ 而本文提及的CPU就是运算器与控制器的集合,内存就相当于函数中的变量,也就是相当于存储器。那硬盘是用来做什么的呢?硬盘是用作数据的持久化,一方面由于成本较低,所以是当做大量的数据存储单元。另一方面由于内存断电会清空,所以使用硬盘来存储信息更为方便。所以我认为硬盘应该是游离于这个体系之外的辅助设备。类似于程序的数据库或者程序的文本存档。 + +​ 指令与数据平时存储于硬盘之中,在需要运行程序时,将其读入到内存中来,通过CPU来处理内存中的数据。那么CPU为什么不直接处理硬盘中的数据呢?因为硬盘相比于内存的访问速度太慢了,相比于CPU的处理速度更是慢到离谱,所以才需要内存的当做存储器为CPU的处理工作提供支持。 \ No newline at end of file diff --git a/group06/263050006/article.txt b/group06/263050006/article.txt new file mode 100644 index 0000000000..2eaa5b792f --- /dev/null +++ b/group06/263050006/article.txt @@ -0,0 +1,2 @@ +CPU、内存、硬盘、指令以及他们之间的关系 +https://zhuanlan.zhihu.com/p/25442061 \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/array/ArrayUtil.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/array/ArrayUtil.java new file mode 100644 index 0000000000..b807a9b321 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/array/ArrayUtil.java @@ -0,0 +1,197 @@ +package com.github.chaoswang.learning.java.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.TreeSet; + + +public class ArrayUtil { + + /** + * һa , Ըֵû + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static int[] reverseArray(int[] origin){ + int length = origin.length; + for(int i=0;i list = new ArrayList(); + for(int value : oldArray){ + if(value != 0){ + list.add(value); + } + } + return returnByIntArray(list); + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ + * a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + TreeSet ts1 = new TreeSet(Arrays.asList(convertToIntegerArray(array1))); + TreeSet ts2 = new TreeSet(Arrays.asList(convertToIntegerArray(array2))); + ts2.addAll(ts1); + return returnByIntArray(ts2); + } + + private static Integer[] convertToIntegerArray(int[] array){ + Integer[] returnArray = new Integer[array.length]; + for(int i=0;i collection){ + int[] returnArray = new int[collection.size()]; + int i = 0; + for(Iterator it = collection.iterator(); it.hasNext();){ + returnArray[i] = it.next(); + i++; + } + return returnArray; + } + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ + * oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int [] oldArray, int size){ + int[] returnArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, returnArray, 0, oldArray.length); + return returnArray; + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ + * 磬 max = 15 , 򷵻صӦΪ [11235813] + * max = 1, 򷵻ؿ [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + if(max <= 1){ + return new int[0]; + } + Integer[] init = {1,1}; + LinkedList result = new LinkedList(Arrays.asList(init)); + for(int tmp = -1; tmp <= max;){ + tmp = generateFibonacci(result); + } + result.removeLast(); + return returnByIntArray(result); + } + + private static int generateFibonacci(LinkedList result){ + int a = result.getLast(); + int b = result.get(result.size()-2); + result.add(a + b); + return result.getLast(); + } + + /** + * Сڸֵmax + * max = 23, صΪ[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public static int[] getPrimes(int max){ + List list = new LinkedList(); + for(int i=2;i list = new LinkedList(); + for(int i=2;i<=max;i++){ + if(isPerfectNumber(i)){ + list.add(i); + } + } + return returnByIntArray(list); + } + + private static boolean isPerfectNumber(int number) { + int sum = 0; + for(int i=1;i { + private int size = 0; + private int initialSize; + private Object[] elements = null; + + public MyArrayList(int initialSize){ + this.initialSize = initialSize; + elements = new Object[initialSize]; + } + + public void add(E element){ + //ﵽޣinitialSize50% + if(++size == elements.length){ + elements = Arrays.copyOf(elements, size + (int)Math.round(initialSize * 0.5)); + } + elements[size - 1] = element; + } + + // + public void add(int index, E element){ + //index=sizeʱ൱ڵadd + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException(); + } + for (int i=size; i > index; i--){ + elements[i] = elements[i - 1]; + } + elements[index] = element; + } + + // + public E remove(int index){ + E removed = (E)elements[index]; + for(int i=index; i 0){ + //ڸtreenodeҲɹ򷵻true + if(parent.getLeftChild() == null){ + TreeNode node = new TreeNode(obj); + node.setParent(parent); + parent.setLeftChild(node); + return true; + } + return insert(parent.getLeftChild(), obj); + } + if(parent.getRightChild() == null){ + TreeNode node = new TreeNode(obj); + node.setParent(parent); + parent.setRightChild(node); + return true; + } + return insert(parent.getRightChild(), obj); + } + + @Override + public String toString() { + if(root == null){ + return ""; + } + return root.toString(); + } + + private static class TreeNode { + private TreeNode parent; + private TreeNode leftChild; + private TreeNode rightChild; + private Comparable userObject;//ڵ㶼洢ݵ + + public TreeNode(Comparable userObject){ + this.userObject = userObject; + } + + public Comparable getUserObject() { + return userObject; + } + + public TreeNode getParent() { + return parent; + } + + public void setParent(TreeNode parent) { + this.parent = parent; + } + + public TreeNode getLeftChild() { + return leftChild; + } + + public void setLeftChild(TreeNode leftChild) { + this.leftChild = leftChild; + } + + public TreeNode getRightChild() { + return rightChild; + } + + public void setRightChild(TreeNode rightChild) { + this.rightChild = rightChild; + } + + @Override + public String toString() { + return "TreeNode [parent=" + (parent==null?null:parent.getUserObject()) + ", leftChild=" + (leftChild==null?null:leftChild) + + ", rightChild=" + (rightChild==null?null:rightChild) + ", userObject=" + + userObject + "]"; + } + + } +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyIterator.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyIterator.java new file mode 100644 index 0000000000..7c35be59aa --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyIterator.java @@ -0,0 +1,8 @@ +package com.github.chaoswang.learning.java.collection.myown; + +public interface MyIterator { + /*arraylistʵһ*/ + boolean hasNext(); + Object next(); + void remove(); +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyLinkedList.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyLinkedList.java new file mode 100644 index 0000000000..007a6e48c3 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyLinkedList.java @@ -0,0 +1,120 @@ +package com.github.chaoswang.learning.java.collection.myown; + +import java.util.NoSuchElementException; + +public class MyLinkedList { + private int size = 0; + private Node head = null; + private Node tail = null; + + // + public void add(E element){ + Node tmp = new Node(element, null); + if(tail == null){ + head = tmp; + }else{ + tail.next = tmp;; + } + tail = tmp; + size++; + } + + public void add(int index, E element){ + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException(); + } + Node tmpBefore = getElement(index -1); + Node tmpAfter = getElement(index); + Node tmp = new Node(element, tmpAfter); + tmpBefore.next = tmp; + + } + + public void addFirst(E element){ + Node tmp = new Node(element, null); + if(head != null){ + tmp.next = head; + }else{ + tail = tmp; + } + head = tmp; + } + + public E removeFirst(){ + if(size <= 0){ + throw new NoSuchElementException(); + } + Node tmp = head; + head = head.next; + return (E)tmp.element; + } + + // + public E remove(int index) { + if(index < 0 || index >= size()){ + throw new IndexOutOfBoundsException(); + } + Node tmpBeore = this.getElement(index-1); + Node tmp = this.getElement(index); + Node tmpNext = this.getElement(index+1); + tmpBeore.next = tmpNext; + size--; + return (E)tmp.element; + } + + // + public E get(int index){ + return (E)this.getElement(index).element; + } + + public int size() { + return size; + } + + @Override + public String toString() { + if(head == null){ + return "[]"; + } + StringBuffer sb = new StringBuffer("["); + Node tmp = head; + while(tmp != null){ + sb.append(tmp.element.toString()); + sb.append(","); + tmp = tmp.next; + } + String returnStr = sb.toString(); + returnStr = returnStr.substring(0, returnStr.length()-1); + return returnStr + "]"; + } + + private Node getElement(int index) { + Node tmp = head; + for(int i=0;i { + private int size = 0; + private int capacitySize; + private OneElement first = null; + private OneElement last = null;//ԸΪԼLinkedListʵ + + public MyQueue(int capacitySize){ + this.capacitySize = capacitySize; + } + + //β ʱ쳣 + public void add(E element){ + if(size+1 > capacitySize){ + throw new IllegalStateException("over capacity."); + } + addLast(element); + } + + //β 쳣᷵Ƿɹ + public boolean offer(E element){ + if(size+1 > capacitySize){ + return false; + } + addLast(element); + return true; + } + + private void addLast(E element){ + OneElement tmp = new OneElement(element, null); + if(last == null){ + first = tmp; + }else{ + last.next = tmp;; + } + last = tmp; + size++; + } + + //ƳͷԪأΪʱ쳣 + public E remove(){ + if(size == 0){ + throw new NoSuchElementException(); + } + return removeFirst(); + } + + //ƳͷԪأΪʱnullqueueһ㲻ònullԪ + public E poll(){ + if(size == 0){ + return null; + } + return removeFirst(); + } + + private E removeFirst(){ + OneElement tmp = first; + first = first.next; + size--; + return tmp.element; + } + + //ضͷԪأDzƳΪʱ쳣 + public E element(){ + if(size == 0){ + throw new NoSuchElementException(); + } + return first.element; + } + + //ضͷԪأDzƳΪʱnull + public E peek(){ + if(size == 0){ + return null; + } + return first.element; + } + + private class OneElement{ + private E element = null; + private OneElement next = null; + + public OneElement(E element, OneElement next) { + this.element = element; + this.next = next; + } + } +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyStack.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyStack.java new file mode 100644 index 0000000000..f425c8de63 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyStack.java @@ -0,0 +1,63 @@ +package com.github.chaoswang.learning.java.collection.myown; + +import java.util.Arrays; +import java.util.EmptyStackException; + +public class MyStack { + private int size = 0; + private int initialSize; + private Object[] elements = null;//ԸΪԼArrayListʵ + + public MyStack(int initialSize){ + this.initialSize = initialSize; + elements = new Object[initialSize]; + } + + //ѹջ + public void push(E element){ + //ﵽޣinitialSize100% + if(++size == elements.length){ + elements = Arrays.copyOf(elements, size + initialSize); + } + elements[size - 1] = element; + } + + //жջǷΪ + public boolean empty(){ + return size <= 0? true : false; + } + + public int size(){ + return size; + } + + //鿴ջԪ + public E peek(){ + if(size == 0){ + throw new EmptyStackException(); + } + return (E)elements[size - 1]; + } + + //ջԪ + public E pop(){ + if(size == 0){ + throw new EmptyStackException(); + } + E removed = (E)elements[size -1]; + elements[size -1] = null; + size--; + return removed; + } + + public int search(E element) { + int index = 0; + for (int i = 0; i < size - 1; i++) { + if (element.equals(elements[i])) { + index = (size -1) - i; + break; + } + } + return index; + } +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyTree.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyTree.java new file mode 100644 index 0000000000..dcb4a59a8b --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyTree.java @@ -0,0 +1,59 @@ +package com.github.chaoswang.learning.java.collection.myown; + +import java.util.List; + +public class MyTree { + + public MyTree(MyTreeNode treeNode){ + + } + + + private class MyTreeNode { + private MyTreeNode parent; + private List children;//ʱΪleftright + private boolean allowsChildren; + private Object userObject;//ڵ㶼洢ݵ + + public MyTreeNode(Object userObject){ + this.userObject = userObject; + } + + public List children(){ + return children; + } + + public MyTreeNode getChildAt(int childIndex){ + return children.get(childIndex); + } + + public int getIndex(MyTreeNode node){ + return children.indexOf(node); + } + + public MyTreeNode getParent(){ + return parent; + } + + public boolean isLeaf(){ + return children.size() > 0 ? false : true; + } + + public boolean getAllowsChildren(){ + return allowsChildren; + } + + public void insert(MyTreeNode node, int index){ + children.remove(node); + children.add(index, node); + } + + public void remove(int index){ + children.remove(index); + } + + public void remove(MyTreeNode node){ + children.remove(node); + } + } +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/LoginAction.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/LoginAction.java new file mode 100644 index 0000000000..7df73b09d9 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.github.chaoswang.learning.java.litestruts; + +/** + * һչʾ¼ҵ࣬ еû붼Ӳġ + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/Struts.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/Struts.java new file mode 100644 index 0000000000..26c39ef661 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/Struts.java @@ -0,0 +1,134 @@ +package com.github.chaoswang.learning.java.litestruts; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; + +public class Struts { + private static Map action_class = new HashMap(); + private static Map> action_result = new HashMap>(); + + + public static View runAction(String actionName, + Map parameters) { + + /* + * 0. ȡļstruts.xml + */ + parseConfig(); + + /* + * + * 1. actionNameҵӦclass LoginAction, ͨʵ + * parametersеݣösetter parametersе ("name"="test" , + * "password"="1234") , ǾӦõ setNamesetPassword + */ + Class actionClass = null; + Object actionInstance = null; + try { + actionClass = Class.forName(action_class.get(actionName)); + actionInstance = actionClass.newInstance(); + for (Entry entry : parameters.entrySet()) { + String key = (String) entry.getKey(); + String value = (String) entry.getValue(); + actionClass.getMethod( + "set" + key.substring(0, 1).toUpperCase() + + key.substring(1), String.class).invoke( + actionInstance, value); + } + } catch (Exception e) { + e.printStackTrace(); + } + /* + * 2. ͨöexectue ÷ֵ"success" + */ + + String returnStr = null; + try { + returnStr = (String)actionClass.getMethod("execute", new Class[0]).invoke(actionInstance, new Object[0]); + } catch (Exception e) { + e.printStackTrace(); + } + + /* + * 3. ͨҵgetter getMessage, ͨã ֵγһHashMap , + * {"message": "¼ɹ"} , ŵViewparameters + */ + Map params = new HashMap(); + Method[] methods = actionClass.getDeclaredMethods(); + try { + for(Method method : methods){ + if(method.getModifiers() == Modifier.PUBLIC && method.getName().startsWith("get")){ + String key = method.getName().substring(3,4).toLowerCase() + method.getName().substring(4); + String value = (String)method.invoke(actionInstance, new Object[0]); + params.put(key, value); + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + + /* + * 4. struts.xmlе ,Լexecuteķֵ ȷһjsp + * ŵViewjspֶС + */ + View view = new View(); + view.setParameters(params); + Map results = action_result.get(actionName); + view.setJsp(results.get(returnStr)); + return view; + } + + private static void parseConfig() { + String xmlpath = Struts.class.getResource("struts.xml").getFile(); + try { + xmlpath = URLDecoder.decode(xmlpath, "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + SAXBuilder builder = new SAXBuilder(false); + try { + Document doc = builder.build(xmlpath); + Element struts = doc.getRootElement(); + List actionlist = struts.getChildren("action"); + for (Iterator iter = actionlist.iterator(); iter.hasNext();) { + Element action = (Element) iter.next(); + String actionName = action.getAttributeValue("name"); + String actionClass = action.getAttributeValue("class"); + action_class.put(actionName, actionClass); + List resultlist = action.getChildren("result"); + Map result_value = new HashMap(); + for (Iterator iter1 = resultlist.iterator(); iter1.hasNext();) { + Element result = (Element) iter1.next(); + String resultName = result.getAttributeValue("name"); + String resultView = result.getTextTrim(); + result_value.put(resultName, resultView); + } + action_result.put(actionName, result_value); + } + } catch (JDOMException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + System.out.println(action_class); + System.out.println(action_result); + } + + public static void main(String[] args) { + Struts.parseConfig(); + } +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/View.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/View.java new file mode 100644 index 0000000000..ae57b41d32 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/View.java @@ -0,0 +1,23 @@ +package com.github.chaoswang.learning.java.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/struts.xml b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/struts.xml new file mode 100644 index 0000000000..10671eac25 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/array/ArrayUtilTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/array/ArrayUtilTest.java new file mode 100644 index 0000000000..4ebff76195 --- /dev/null +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/array/ArrayUtilTest.java @@ -0,0 +1,134 @@ +package com.github.chaoswang.learning.java.array; + +import org.junit.Assert; +import org.junit.Test; + +public class ArrayUtilTest { + + /** + * һa , Ըֵû + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * @param origin + * @return + */ + @Test + public void testReverseArray() { + int a[] = {7, 9, 30, 3}; + int reversedA[] = {3, 30, 9, 7}; + int b[] = {7, 9, 30, 3, 4}; + int reversedB[] = {4, 3, 30, 9, 7}; + Assert.assertArrayEquals(reversedA, ArrayUtil.reverseArray(a)); + Assert.assertArrayEquals(reversedB, ArrayUtil.reverseArray(b)); + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + @Test + public void testRemoveZero() { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5}; + Assert.assertArrayEquals(newArr, ArrayUtil.removeZero(oldArr)); + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ + * a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * @param array1 + * @param array2 + * @return + */ + @Test + public void testMerge() { + int a1[] = {3, 5, 7,8}; + int a2[] = {4, 5, 6,7}; + int a3[] = {3,4,5,6,7,8}; + Assert.assertArrayEquals(a3, ArrayUtil.merge(a1, a2)); + } + + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ + * oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + @Test + public void testGrow() { + int oldArray[] = {2,3,6}; + int newArray[] = {2,3,6,0,0,0}; + Assert.assertArrayEquals(newArray, ArrayUtil.grow(oldArray, 3)); + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ + * 磬 max = 15 , 򷵻صӦΪ [11235813] + * max = 1, 򷵻ؿ [] + * @param max + * @return + */ + @Test + public void testFibonacci() { + int returnA[] = {1,1,2,3,5,8,13}; + int returnB[] = {}; + int returnC[] = {1,1,2,3,5,8,13,21,34}; + int returnD[] = {1,1,2}; + Assert.assertArrayEquals(returnA, ArrayUtil.fibonacci(15)); + Assert.assertArrayEquals(returnB, ArrayUtil.fibonacci(1)); + Assert.assertArrayEquals(returnC, ArrayUtil.fibonacci(34)); + Assert.assertArrayEquals(returnD, ArrayUtil.fibonacci(2)); + } + + /** + * Сڸֵmax + * max = 23, صΪ[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + @Test + public void testGetPrimes() { + int returnC[] = {2,3,5,7,11,13,17,19}; + int returnD[] = {2,3,5,7,11}; + Assert.assertArrayEquals(returnC, ArrayUtil.getPrimes(23)); + Assert.assertArrayEquals(returnD, ArrayUtil.getPrimes(12)); + } + + /** + * ν ָǡõ֮ͣ6=1+2+3 + * һֵmax һ飬 Сmax + * @param max + * @return + */ + @Test + public void testGetPerfectNumbers() { + int returnC[] = {6,28,496}; + int returnD[] = {6,28,496,8128}; + int returnE[] = {6,28,496,8128,33550336}; + Assert.assertArrayEquals(returnC, ArrayUtil.getPerfectNumbers(496)); + Assert.assertArrayEquals(returnD, ArrayUtil.getPerfectNumbers(8129)); + Assert.assertArrayEquals(returnE, ArrayUtil.getPerfectNumbers(33550337)); + } + + /** + * seperator array + * array= [3,8,9], seperator = "-" + * 򷵻ֵΪ"3-8-9" + * @param array + * @param s + * @return + */ + @Test + public void testJoin() { + int array[] = {3,8,9}; + Assert.assertEquals("3-8-9", ArrayUtil.join(array,"-")); + Assert.assertEquals("3@$8@$9", ArrayUtil.join(array,"@$")); + } + +} diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyArrayListTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyArrayListTest.java new file mode 100644 index 0000000000..cb83d6e506 --- /dev/null +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyArrayListTest.java @@ -0,0 +1,53 @@ +package com.github.chaoswang.learning.java.collection.myown; + + +import org.junit.Assert; +import org.junit.Test; + +import com.github.chaoswang.learning.java.collection.myown.MyArrayList; + +public class MyArrayListTest { + + @Test + public void testAdd(){ + MyArrayList myList = new MyArrayList(3); + myList.add("1"); + myList.add("2"); + myList.add("3"); + Assert.assertEquals(3, myList.size()); + myList.add("4"); + Assert.assertEquals(4, myList.size()); + String str = myList.get(2); + Assert.assertEquals("3", str); + + } + + @Test + public void testInsert(){ + MyArrayList myList = new MyArrayList(3); + myList.add("1"); + myList.add("2"); + myList.add("4"); + String str = myList.get(2); + Assert.assertEquals("4", str); + myList.add(2,"3"); + str = myList.get(2); + Assert.assertEquals("3", str); + } + + @Test + public void testRemove(){ + MyArrayList myList = new MyArrayList(3); + myList.add("1"); + myList.add("2"); + myList.add("3"); + myList.add("4"); + String str = myList.remove(2); + Assert.assertEquals("3", str); + str = myList.get(2); + Assert.assertEquals("4", str); + Assert.assertEquals(3, myList.size()); + } + + +} diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyBinarySearchTreeTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyBinarySearchTreeTest.java new file mode 100644 index 0000000000..9c76a8056c --- /dev/null +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyBinarySearchTreeTest.java @@ -0,0 +1,17 @@ +package com.github.chaoswang.learning.java.collection.myown; + +import org.junit.Test; + +public class MyBinarySearchTreeTest { + @Test + public void testInsert(){ + MyBinarySearchTree tree = new MyBinarySearchTree(12); + tree.insert(5); + tree.insert(18); + tree.insert(2); + tree.insert(9); + tree.insert(15); + tree.insert(19); + System.out.println(tree); + } +} diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyLinkedListTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyLinkedListTest.java new file mode 100644 index 0000000000..cdbbcf2812 --- /dev/null +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyLinkedListTest.java @@ -0,0 +1,76 @@ +package com.github.chaoswang.learning.java.collection.myown; + +import org.junit.Assert; +import org.junit.Test; + +public class MyLinkedListTest { + + @Test + public void testAdd(){ + MyLinkedList myList = new MyLinkedList(); + myList.add("1"); + myList.add("2"); + myList.add("3"); + Assert.assertEquals(3, myList.size()); + myList.add("4"); + Assert.assertEquals(4, myList.size()); + System.out.println(myList); + String str = myList.get(2); + Assert.assertEquals("3", str); + + } + + @Test + public void testInsert(){ + MyLinkedList myList = new MyLinkedList(); + myList.add("1"); + myList.add("2"); + myList.add("4"); + String str = myList.get(2); + Assert.assertEquals("4", str); + myList.add(2,"3"); + str = myList.get(2); + Assert.assertEquals("3", str); + } + + @Test + public void testAddFirst(){ + MyLinkedList myList = new MyLinkedList(); + myList.add("2"); + myList.add("3"); + myList.add("4"); + System.out.println(myList); + Assert.assertEquals("2", myList.get(0)); + myList.addFirst("1"); + Assert.assertEquals("1", myList.get(0)); + System.out.println(myList); + } + + @Test + public void testRemoveFirst(){ + MyLinkedList myList = new MyLinkedList(); + myList.add("1"); + myList.add("2"); + myList.add("3"); + myList.add("4"); + String str = myList.removeFirst(); + System.out.println(myList); + Assert.assertEquals("1", str); + Assert.assertEquals("2", myList.get(0)); + } + + @Test + public void testRemove(){ + MyLinkedList myList = new MyLinkedList(); + myList.add("1"); + myList.add("2"); + myList.add("3"); + myList.add("4"); + String str = myList.remove(2); + Assert.assertEquals("3", str); + str = myList.get(2); + Assert.assertEquals("4", str); + Assert.assertEquals(3, myList.size()); + } + +} diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyQueueTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyQueueTest.java new file mode 100644 index 0000000000..79579c6719 --- /dev/null +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyQueueTest.java @@ -0,0 +1,55 @@ +package com.github.chaoswang.learning.java.collection.myown; + +import java.util.NoSuchElementException; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class MyQueueTest { + + @Rule + public ExpectedException thrown= ExpectedException.none(); + + @Test + public void testAdd(){ + MyQueue myQueue = new MyQueue(3); + //3Ԫ + myQueue.add("1"); + myQueue.add("2"); + myQueue.offer("3"); + //ӷfalse + Assert.assertFalse(myQueue.offer("4")); + //ȡ + Assert.assertEquals("1", myQueue.element()); + Assert.assertEquals("1", myQueue.peek()); + //ʼƳ + Assert.assertEquals("1", myQueue.remove()); + Assert.assertEquals("2", myQueue.remove()); + Assert.assertEquals("3", myQueue.poll()); + //Ƴfalse + Assert.assertNull(myQueue.poll()); + } + + @Test + public void testAddWhenQueueIsFull(){ + thrown.expect(IllegalStateException.class); + MyQueue myQueue = new MyQueue(3); + myQueue.add("1"); + myQueue.add("2"); + myQueue.add("3"); + //쳣 + myQueue.add("4"); + } + + @Test + public void testRemoveWhenQueueIsEmpty(){ + thrown.expect(NoSuchElementException.class); + MyQueue myQueue = new MyQueue(3); + myQueue.add("1"); + myQueue.remove(); + //Ƴ쳣 + myQueue.remove(); + } +} diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyStackTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyStackTest.java new file mode 100644 index 0000000000..4ae0c84989 --- /dev/null +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyStackTest.java @@ -0,0 +1,47 @@ +package com.github.chaoswang.learning.java.collection.myown; + +import java.util.EmptyStackException; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class MyStackTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void testPushAndPop(){ + MyStack myStack = new MyStack(3); + myStack.push("1"); + myStack.push("2"); + myStack.push("3"); + Assert.assertEquals("3", myStack.pop()); + Assert.assertEquals("2", myStack.peek()); + Assert.assertEquals("2", myStack.pop()); + Assert.assertEquals("1", myStack.peek()); + } + + @Test + public void testPopWhenQueueIsEmpty(){ + thrown.expect(EmptyStackException.class); + MyStack myStack = new MyStack(3); + myStack.push("1"); + myStack.pop(); + //Ƴ쳣 + myStack.pop(); + } + + @Test + public void testSearch(){ + MyStack myStack = new MyStack(3); + myStack.push("1"); + myStack.push("2"); + myStack.push("3"); + Assert.assertEquals(2, myStack.search("1")); + Assert.assertEquals(1, myStack.search("2")); + Assert.assertEquals(0, myStack.search("3")); + } +} diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/litestruts/StrutsTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/litestruts/StrutsTest.java new file mode 100644 index 0000000000..834a4dd390 --- /dev/null +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/litestruts/StrutsTest.java @@ -0,0 +1,39 @@ +package com.github.chaoswang.learning.java.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //ԤIJһ + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git a/group06/284999210/.classpath b/group06/284999210/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group06/284999210/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group06/284999210/.gitignore b/group06/284999210/.gitignore new file mode 100644 index 0000000000..f5ebe83019 --- /dev/null +++ b/group06/284999210/.gitignore @@ -0,0 +1,3 @@ +*.class +/.metadata +/bin \ No newline at end of file diff --git a/group06/284999210/.project b/group06/284999210/.project new file mode 100644 index 0000000000..c3e8c69e46 --- /dev/null +++ b/group06/284999210/.project @@ -0,0 +1,17 @@ + + + 284999210 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git "a/group06/284999210/2017_week_8_CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.doc" "b/group06/284999210/2017_week_8_CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.doc" new file mode 100644 index 0000000000000000000000000000000000000000..d7812844b34840b8b59cafb1b58c52a5bfd3c282 GIT binary patch literal 27136 zcmeHQ2Ut|cx1TNar7DO(WI+^E%2Gr`K@bZ;S!otTg{3cTk*=b2#S+186crUaBF2Kf zmnas*0*VDJDA6byum<*>v&&Vok*Ilj-}}Fp9lqb5nKLuz%$%7!_s-mNwc@gR?b@9> zbwnaK5(a4%DiGOrd>X_#R9cM?D~KbnRVWl9+X4VlY4|^6foB_z6Tfr?CLxVpM{y7d zfsutE4-r*DR7hY%U_|lz;`bu%AAXqfTEq%UU&^P6Fa;+A1Z6S#)2~nn0^34IaVoz| z6me~ven=N|66gID?Mzh%ii3d34Q=(>Q#;__0X_?8LmQ>?-MSDG1wCnQtM?_^OB1ya zB1sQx5kd$4QJ@&Uh8jV+z1oDVgNoyH32}t<1E_C+0we-u2THF*_Mh5Am7^%iZ67Fk z6s7u2mBF+P*o6u9!K(bW`jQmo--mojIg)9#Py0a0Y0vwbIMtso$@{zVJ8ADVI4=`Z;NkFMIl`qQt2Yx8I zlqhPvP>&NZDLYe?(odx+O4aX(QspEmH6JP3QGJR}>8H{iQAs^inzA#M?ub%ysqvMh zU&@y(|4*f<@#?7E9r3C5ek<)r96eU=xuJPFod4Q{)!4jH`tq5Dm-5(OTOkSAj zyKI_87)n=Y)2^StaZ*$0Q-2!gjAu-WaX?dO^$HpXWi*Ap@D5l;=X~mcxK*{Dy}1Lp z8MB|{zvfzmiY-9npap0gu?5b1t8m5qw_tsp?1Zb-5MTtD1PBC#0wMsN6$t4Kumy|*qysVmGXZk|^8w2ND*y$6t$-(h zXMiR^D*zrKi8jCl&>LV1umjiw+yIS$SAZtKYruQJ?*IaiigbW1Kpvn1z~|BT&F>rG z?`i$}`nvkM+x3vBg1_q(NXo0qpPo9jPyBc4Kl0L()e7hJ@`dg(BCvhp)M$AcOEcWT z<~F4Lx?OCQ3Cp5XT00F)u7^C&ox09Df}9dVo2M7mg#25st@O0FFm10LOy~!0}K7umIGUw6wSMe>?HE zLuvnPPR9*x-+=#jaoFjF1>^9Gw(e>y;jmE_p}1}+b6e7BK|{H?%CLm9gZd___#j_r zlp)vBxBYsAYotG{oRaGiu0z>LSjQst5*JIEaX-wx;hhcl6!B^(Udb@$!`vS|aSeK# z^v(~t8M6a+bivyx>}-xR$Z+vX8aQxMJ;i z*OBarGWSzI7_dWCCQQ+9`#5s{ZGl59^X+I>9(1B#nrY51J>zUpDlcaU=$>CFV+80? zN=TPdZ-#bhErXT61)lAsL23c11*8^`T0m+6sRg7KkXk@$0jUL~7LZy%Y5}PQq!y4` z;Qx*VBAA_s1{?({(Nu{X`1~*daMFv%!elvM^%r0ZZ~wl8B=BbV5;~IM2z5Kk`=8)% zhW=7=@r6AV?}+aEiZYUQ!{H3g6(Gs~H>OKrx?#Vq0NP;7W00-@)B+j-Fcpa!fDPaP zoB$qx06;7t9gq*`s2<8SfjLwS_I?6jL)pJ0=igq>4s16L@D?Bs_S6Q90n7lfVVFj_ zF^Gp7lXwF4ccn3-T@{!yu1xuOpb0>s2yug9dnu#?WqowiqLZM=Ss~!v0{ILhhNThV z88JYji<>4H;Yt_D;<;&&&&flXpMnu_X1@}yB}RnRc8sqE-iy_%i{|c$bjTj-=RFF` z4kmo^n{XFU)_3B%99brb3DwCD&m9;}h#u+k8m67i4Ov1{WJHN0GQi;>n=Wc6n?$mk zgvYVpZJIc;3{o4?#Vb4)%b-^oAzY#l>*_0@EM+xPzdsPo8dCsjB^Or&&Z^wvEEMd&$rCc^r^8OX#i^cVKg-kHtNRbsUKEwr zz38@_(G>o4y^KdX13Dd>;WVp$ugUXy&8J)oUY@E*eAioPNLAs~te-77bIz6)Hhy@= zGD=^rG;Z5jYu@;Em1-wyO-qMxA)tBCFBXqw z{i;=q_YQBkKOyauL5o?9SETu(_||I&^Ubx*mzC}2)gRqHh=xvyaGCtUR2yz=dVCB_ zWDB`?5%|Z2M8#W}<8OA}WiSzI){C6OSy!feR-V-Ekz}zU-^F76bW&%M7H+6pqx-aG z)LB`@gYwx$FWzi%Xf2uhu5R&Tw$_TRvM2Am3@Q(=OL91xmU%9xXj2b)zm(XS>!;Q1 z@jv8oW&Oa5mbx2U_i~nKsOH`rb;zq^aPXCLYL#w7Yit6I(l#xa>|dq7e0A4a+mTnB zwY;kO1(f7%J}2CDl5=78sN-onOdkzp#`Ie}lK(Jp?PiMy-iPxyhitvptzyr zvzqk{Dca|D|Iq2)_dmybPVas_KWF=%JM0^K`dl}7VR~oMexnG7xx>dkx%#Hp{h?3$ z^i-tVeZKK$^`bi$z^%j+obm9npk1@YU9iMvKl61L=nmCB(*33WuxWxI<0PHoiCe38 z>V{t(w$tz0gA|9mtEMJ}^|j{yq8pLt>YAH5wNT^!2^ww5cm<>LJHGGLd+0CzwX1%- z)66~8^Lt%qnP!8RmmFWbIeWE2PMD$X^en~ZdDBlw^l`5x=c!6WNjF;%<%H~IaxJ+<*%=| zX7yvw^Ml?2ZgT0CC5+tg^fbEoS~jw3mX zPtCixZPUG@Q{QWUcXxVR%9~9mr@c{m(Hh>hzfX;w${Zhyqb<)a&(dE%s9RdgtJW@$ zQhZMdU!OF-Jfr21p8O+g@5k?!<;_TY_2gaFDF4*tqs$|{8VluLT+MY&_(8AGp<4#; zOrMhaU^aL76;(?!uc$K_rz~%HxxG#Hc~ZE;-EzeG2T!gTmdFVd!}UXsl`pE9f8wym z$j)X9QhUtPt5tbie0u1XE+yf#^b??;LsabuAvuKH=H5+;RT6D|KUcDwZ#P=APq! zDzPZjRW5t-wXPby%EL>PO3T!m`e@sa;a4YD+r%vxd}VUi%iEU!W*9d&uf|~hLaV5} zGd%SV8G0^r0(X~>?wUI5pys+Y1}b)ww4bkBY**)aME7=K#`;QA=cbjjD|Tj&`8A<7 z_e@&V{H{4OqT*|x-LkYf_SoOS^jvY-9(BQq)jnesYKGr>VR-w>#+v#-*L$t259S!Z zG|#YEb1&uYp4-W0RUa;w-5%PUS~+aM)9n>W&9?()1zH;pS2BL69#Xt%-{XpE`xUP7kD4Pxbkn#l4od*q_)s zeoLnj+jOpv+!kN-sHY3-v3u6(+bcQgY;C_|<=bMNs@By7WOnTuakS=eKc%^|Px#Js zotffVsm(w5ILN23^ZB^bx0z1Q7oT#~e>MN*c<1phyQVYv#tL4Z6QVQrnNAgGY%t9V z^Q=sqR;1@U!IZ1DK5JvuW{WC^hYyMxeyAO(9r1eUfvMVH414=PZNY?MEM9ZLlP^FV8-6M*1|H zU!#9JAAN~`MN_bYb*Ut1X|`Q-*?}Ru-1f$LpWUxgzooES^_Z;(EuS}ST)uEnckem; z-v?O_ePJByU21hry|J#_*npy^dm1LM9jr3ZL}AN4O^)62yR@71)$I4kSvEfk z<26SljUFNRdDr2x@Z1@ey1OELN2iyb7*pX|-r9Gx-J>y)18x+YE^i*$KllEj)1}K* zhbY{B!)}p#J*ao;u#q}XmG@kJQ&?vBcCE8@*6xgA$1pk7BHf~iddF&myF^>@$K2S{ z@TBPQ(&!su0~_k&^6dN~lNP3|sl53vwth~0#7omvtEN`J+%wVdNks0mD;hZ)Jd^S* zGc1qtHPaIBXVs`ZG23@<4X1~@)p3Cv{p6FI)`{e_podQ75BO2XpPxFEujH@U3pu)Q zt2UOnpNXG9M0dD$x8$}b5_iQDoX**AGLz*6f~yDA7WBN6Te1BbBl}@rW!phUp3i<& zE-{ripT#@!BmdyCRp&YdS>3e^->M^T->_uzisRAyp3Qgi(&Em(IUu++AalN;->;fs z3r3i@_cZb{F}GYEr(*23sGwqw&%5*zyY+cv9vZIS==}4+3fDJ@(+gj&q@|uVIvl7r z?K@W*`t%omF<_}F*! zbPC1Vh0i>zdW`s^0Lf>zPqq7iJ=;CONmi762KrR7GdwB(>7k;X`6VSuK9GEpbmeoB zM2{zuG9)L#CmCzO3$T4_{$fgajF5rnB6RzfArqnZ1&Wv&I0znx*hwLA@q9sygQ2B4 z$B+$vVS-?OOqhe=XrEzbc82Wu1YS%qFG>&-;$S!>B;Ih4qq5>ao_$bMoI5X;4FY1~ z?RgG{;Ry+`_7)cLLGZxHi#Hd5gBj$73gV)936P8nvj~pkC4=DTC<`kN$JQd6$B!{& z2ZmWX7)B*n8nP2oAQl`6vA{4Z?g-}YZoj@8${$_zt2L)mS1_RY-Q-re6CE1%OHFksOQE0ImDHpX{2*2`#$w2E4 zV!&=3sCpx`Ox!J?Xd`t1?f~=w;{bkuNdP#*Ah5G18Gvj6ZgcVhO8~0@MSx1cH9#Gp z3D6Z(;0m152K;~yF|7@$KoK(lX@CqsCLkM-1IPu)K|jA9OeiY`y^VfKLxYGWNW|9s zy_WoybX*qDmN)>902t8H=#z{d%IM{cKF{dEjGoPSz=1x@=-Z4w&lo7%U>q7rgieff z+DGdV?Nk{YHEcfyiqdhni2-LXURvSeRv<;sW|-DkLk_-!h#`>x0Ssh}h>MM-g18ix z#*3ouQfL>)3u|~c_!N@R>9PzNrVO3I6!s>y&MD*=b`*n15l|mEg^GqL6HnN1J`@7_ z*u)F;M#Cvi4CMC(Idmc;L!;B=Wa%<;SQkS3ODG)~-ed~Y351$akg_%xX;+eE(lLm% zyL?8wGn^FhK@-;LC$6I^gB2K1hfeB*#l(qf@ftJ@1Q$_xKIp=_gbYy0r_E&0X|jYt z!+@6tA$cZvX<(p<2Ahz%qH{NIQGdNjqNsPy8u@U#_2qy%v3KIuvWYvS6L8ePT1;Xo zp9=@ZMIZ>z(+Syr%}eee0ON|HfwhB}GvtXcWq7lZj|&RwOO3KJt`Z>BLTZ`S5{T;g}o5QwZTeI!i3B8y8v2C?)b!>HN9nw0!bwcZ;R+^A5lo84a6@)CIicm+WE7TV{ z2%UrzgcF66gta(L|FK|1OkjzcM%I%J&~k0I9$TKH$YF6*IBJ~E94*dw9N$*I)`_i5 zp**x@fY47^Cw%nHEs&Qhl-W%RNM^c*M9ZnAO@jSRNotIsl2sP2zYu=MbDGZwc~=k2 zP-qmY(&UXGz8S_AzPd~62)NYXbhY}dJOf;{B!U_&DWdz8h@S$#2r3jpmQW~Z2^pBZ z!7!isa1FGNQ?>qgXe*4hEUYz>0j*n`v*y*iQQ>Oa7RZx6#=CBEfQMg3;}BqeJ^*Vj z2jJy{w>UIbDFCf=41lZR1pr=_)c{;kp8;@v`5k~(k_TaUdoTgY0*YT5#G}AE0VLCjiA$vw9)v5 zFxm|Bk=nIUT(2-K4N?n8Eg-dk)B;iqNG%|>fYbs~3rH;>wSd$DQVaZ(7Wk|EKmGc} z>jmbzYKxY^{@?Un32b{wF#z}KxNjW?zvtM zF9zWLy#Rpcg++kR?c;GDjC`cjJ{ixG#QS5GNG4=;NHI?uq!y4`KxzT01*8^`T0m+6 zsRg7KkXk@$0jUL~7LZy%ysxJA*!V6S_wl%g$M^O4?i>GYf86im{vF?s<9m60Cy)Dn z+{{^UVz?!J^)jI8NeKX`7Hp;wm7B{((r8-K(8|aoY=6*Q1DAh0AH&qV9~D+T119M zX~c6GSp}R;V&4xS!$gU;pNc+R;?eKH8q(=)ydff=E?!&e+leBff7Fld_!v`s$^JR8yPGM0>jSrGB5&{xJZ;Dl1FS^WEz)xhTeT=+Zs zDeX9SrR!#U3;w&}G#Gsb+~Bd-l502KlRxX<#_r$G48F9mW?wqBXOHN0fV(&Py$ulr fiLNV*n?oWo8osPBw= capacity) { + throw new IndexOutOfBoundsException(); + } + } + + public Object set(int index, Object element) { + checkIndex(index); + + Object o = elementData[index]; + elementData[index] = element; + return o; + } + + @SuppressWarnings("unchecked") + public Object get(int index) { + checkIndex(index); + + return (Object) elementData[index]; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < size; i++) { + if (i != size - 1) { + sb.append(elementData[i] + ", "); + } else { + sb.append(elementData[i]); + } + } + sb.append("]"); + return sb.toString(); + } + + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public Iterator iterator() { + return new IteratorArrayList(); + } + + @Override + public boolean remove(Object element) { + if (element == null) + return false; + int findIndex = -1; + for (int i = 0; i < size; i++) { + if (elementData[i].equals(element)) { + findIndex = i; + break; + } + } + + for (int i = findIndex; i < size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + elementData[size - 1] = null; + size--; + return false; + } + + private class IteratorArrayList implements Iterator { + + private int cursor; + + @Override + public boolean hasNext() { + return cursor < size; + } + + @Override + public Object next() { + if (cursor < size) + return elementData[cursor++]; + else + throw new NoSuchElementException(); + } + + } +} diff --git a/group06/284999210/src/com/coding/basic/container/BinaryTreeNode.java b/group06/284999210/src/com/coding/basic/container/BinaryTreeNode.java new file mode 100644 index 0000000000..09b2a9db9f --- /dev/null +++ b/group06/284999210/src/com/coding/basic/container/BinaryTreeNode.java @@ -0,0 +1,68 @@ +package com.coding.basic.container; + +public class BinaryTreeNode { + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode root; + + public BinaryTreeNode(T data, BinaryTreeNode left, BinaryTreeNode right) { + this.data = data; + this.left = left; + this.right = right; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(T o) { + if (null == root) { + root = new BinaryTreeNode(o, null, null); + return root; + } + + return insert(o, root); + } + public BinaryTreeNode insert(T o, BinaryTreeNode node) { + BinaryTreeNode nodeNew = new BinaryTreeNode(o, null, null); + BinaryTreeNode nodeCurrent = node; + if (o.compareTo(nodeCurrent.data) < 0) { + if (nodeCurrent.left == null) { + nodeCurrent.left = nodeNew; + return nodeNew; + } else { + return insert(o, nodeCurrent.left); + } + } else if (o.compareTo(nodeCurrent.data) > 0) { + if (nodeCurrent.right == null) { + nodeCurrent.right = nodeNew; + return nodeNew; + } else { + return insert(o, nodeCurrent.right); + } + } else { + return nodeCurrent; + } + } +} diff --git a/group06/284999210/src/com/coding/basic/container/Iterator.java b/group06/284999210/src/com/coding/basic/container/Iterator.java new file mode 100644 index 0000000000..5ec89a4983 --- /dev/null +++ b/group06/284999210/src/com/coding/basic/container/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic.container; + +public interface Iterator { + public boolean hasNext(); + + public Object next(); +} diff --git a/group06/284999210/src/com/coding/basic/container/LinkedList.java b/group06/284999210/src/com/coding/basic/container/LinkedList.java new file mode 100644 index 0000000000..239c4189ec --- /dev/null +++ b/group06/284999210/src/com/coding/basic/container/LinkedList.java @@ -0,0 +1,186 @@ +/** + * + */ +package com.coding.basic.container; + +/** + * @author Administrator + * + */ +public class LinkedList implements List { + + private int size; + private Node head; + + public LinkedList() { + head = new Node(null, null, null); + size = 0; + } + + @Override + public boolean add(Object o) { + Node nodeAdd; + Node nodeCurrent = head; + while (nodeCurrent.next != null) { + nodeCurrent = nodeCurrent.next; + } + nodeAdd = new Node(o, nodeCurrent, null); + nodeCurrent.next = nodeAdd; + size++; + return true; + } + + @Override + public boolean remove(Object o) { + if (head.next == null) { + return false; + } + Node nodeCurrent = head; + + while (nodeCurrent.next != null) { + nodeCurrent = nodeCurrent.next; + if (nodeCurrent.data.equals(o)) { + nodeCurrent.previous.next = nodeCurrent.next; + nodeCurrent.next.previous = nodeCurrent.previous; + size--; + return true; + } + } + return false; + } + + @Override + public Object get(int index) { + checkIndex(index); + int i = 0; + Node nodeCurrent = head; + do { + nodeCurrent = nodeCurrent.next; + } while (i < index); + return nodeCurrent.data; + } + + @Override + public Object set(int index, Object element) { + checkIndex(index); + int i = 0; + Node nodeCurrent = head; + do { + nodeCurrent = nodeCurrent.next; + } while (i < index); + Object o = nodeCurrent.data; + nodeCurrent.data = element; + return o; + } + + @Override + public void add(int index, Object element) { + checkIndex(index); + int i = 0; + Node nodeCurrent = head; + do { + nodeCurrent = nodeCurrent.next; + } while (i < index); + Node nodeNew = new Node(element, nodeCurrent.previous, nodeCurrent); + nodeCurrent.previous = nodeNew; + size++; + } + + @Override + public Object remove(int index) { + checkIndex(index); + Node nodeCurrent = head; + + int i = 0; + do { + nodeCurrent = nodeCurrent.next; + } while (i < index); + + Object o = nodeCurrent.data; + if (index == size - 1) { + nodeCurrent.previous.next = null; + } else { + nodeCurrent.previous.next = nodeCurrent.next; + nodeCurrent.next.previous = nodeCurrent.previous; + } + + size--; + return o; + } + + private void checkIndex(int index) { + if (index >= size) { + throw new IndexOutOfBoundsException(); + } + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return 0 == size; + } + + private static class Node { + public Node(Object data, Node pre, Node next) { + this.data = data; + this.previous = pre; + this.next = next; + } + + Object data; + Node previous; + Node next; + } + + public void addFirst(Object o) { + add(0, o); + } + + public void addLast(Object o) { + add(o); + } + + public Object removeFirst() { + Object o = remove(0); + return o; + } + + public Object removeLast() { + Object o = remove(size); + return o; + } + + @Override + public Iterator iterator() { + return new IteratorlinkedList(); + } + + private class IteratorlinkedList implements Iterator { + + private int cursor; + + @Override + public boolean hasNext() { + return cursor < size - 1; + } + + @Override + public Object next() { + if (hasNext()) { + int i = 0; + Node nodeCurrent = head; + do { + nodeCurrent = nodeCurrent.next; + } while (i < cursor + 1); + cursor++; + return nodeCurrent.data; + } else { + return null; + } + } + } +} diff --git a/group06/284999210/src/com/coding/basic/container/List.java b/group06/284999210/src/com/coding/basic/container/List.java new file mode 100644 index 0000000000..112d3c2f1e --- /dev/null +++ b/group06/284999210/src/com/coding/basic/container/List.java @@ -0,0 +1,28 @@ +/** + * + */ +package com.coding.basic.container; + +/** + * @author Administrator + * + */ +public interface List { + public boolean add(Object element); + + public void add(int index, Object element); + + public Object remove(int index); + + public boolean remove(Object element); + + public Object set(int index, Object element); + + public Object get(int index); + + public int size(); + + public boolean isEmpty(); + + public Iterator iterator(); +} diff --git a/group06/284999210/src/com/coding/basic/container/Queue.java b/group06/284999210/src/com/coding/basic/container/Queue.java new file mode 100644 index 0000000000..1157e8a473 --- /dev/null +++ b/group06/284999210/src/com/coding/basic/container/Queue.java @@ -0,0 +1,34 @@ +/** + * + */ +package com.coding.basic.container; + +/** + * @author Administrator + * + */ +public class Queue { + + private ArrayList list = new ArrayList(); + + public void enQueue(Object o) { + list.add(o); + } + + public Object deQueue() { + final int size = list.size(); + if (0 == size) + return null; + Object o = list.remove(size); + return o; + } + + public boolean isEmpty() { + return list.isEmpty(); + } + + public int size() { + return list.size(); + } + +} diff --git a/group06/284999210/src/com/coding/basic/container/Stack.java b/group06/284999210/src/com/coding/basic/container/Stack.java new file mode 100644 index 0000000000..2fd59b0c9c --- /dev/null +++ b/group06/284999210/src/com/coding/basic/container/Stack.java @@ -0,0 +1,39 @@ +/** + * + */ +package com.coding.basic.container; + +/** + * @author Administrator + * + */ +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + final int size = elementData.size(); + if (0 == size) + return null; + return elementData.get(size); + } + + public Object peek() { + final int size = elementData.size(); + if (0 == size) + return null; + Object o = elementData.remove(size - 1); + return o; + } + + public boolean isEmpty() { + return elementData.isEmpty(); + } + + public int size() { + return elementData.size(); + } +} diff --git a/group06/284999210/src/com/coding/basic/container/test/TestContainer.java b/group06/284999210/src/com/coding/basic/container/test/TestContainer.java new file mode 100644 index 0000000000..d68104f703 --- /dev/null +++ b/group06/284999210/src/com/coding/basic/container/test/TestContainer.java @@ -0,0 +1,71 @@ +/** + * + */ +package com.coding.basic.container.test; + +import java.util.List; + +/** + * @author devin.yin + * + */ +public class TestContainer { + + /** + * @param args + */ + public static void main(String[] args) { + List list1 = new java.util.ArrayList(); + System.out.println(list1); + + // 4 basic operation for java.util.ArrayList--add remove change query + list1.add("0"); + list1.add("1"); + list1.add("2"); + list1.add("3"); + list1.add("4"); + list1.add("5"); + list1.add("6"); + list1.add("7"); + list1.add("8"); + list1.add("9"); + System.out.println(list1); + + list1.remove(0); + System.out.println(list1); + + list1.set(0, "set"); + System.out.println(list1); + + System.out.println(list1.get(0)); + + list1.add(9, "10"); + System.out.println(list1); + + System.out.println("------------------------------------------------"); + + // 4 basic operation for com.coding.basic.container.ArrayList--add remove change query + com.coding.basic.container.ArrayList list2 = new com.coding.basic.container.ArrayList(); + System.out.println(list2); + list2.add("0"); + list2.add("1"); + list2.add("2"); + list2.add("3"); + list2.add("4"); + list2.add("5"); + list2.add("6"); + list2.add("7"); + list2.add("8"); + list2.add("9"); + System.out.println(list2); + + list2.remove(0); + System.out.println(list2); + + list2.set(0, "set"); + System.out.println(list2); + + System.out.println(list2.get(0)); + } + +} diff --git a/group06/290149544/blog/README.md b/group06/290149544/blog/README.md new file mode 100644 index 0000000000..17ed336d0c --- /dev/null +++ b/group06/290149544/blog/README.md @@ -0,0 +1 @@ +[CSDN:](http://blog.csdn.net/dzxxbj) Ųҵ \ No newline at end of file diff --git a/group06/290149544/hw1/.classpath b/group06/290149544/hw1/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group06/290149544/hw1/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group06/290149544/hw1/.gitattributes b/group06/290149544/hw1/.gitattributes new file mode 100644 index 0000000000..bdb0cabc87 --- /dev/null +++ b/group06/290149544/hw1/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/group06/290149544/hw1/.gitignore b/group06/290149544/hw1/.gitignore new file mode 100644 index 0000000000..b1f3107451 --- /dev/null +++ b/group06/290149544/hw1/.gitignore @@ -0,0 +1,63 @@ +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk diff --git a/group06/290149544/hw1/.project b/group06/290149544/hw1/.project new file mode 100644 index 0000000000..f2571d221d --- /dev/null +++ b/group06/290149544/hw1/.project @@ -0,0 +1,17 @@ + + + hw1 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group06/290149544/hw1/README.md b/group06/290149544/hw1/README.md new file mode 100644 index 0000000000..724da1115d --- /dev/null +++ b/group06/290149544/hw1/README.md @@ -0,0 +1,3 @@ +1. 添加泛型 +2. 添加单元测试 +3. Object是什么类型,如果要处理各种不同的数据类型怎么办这些数据结构呢? \ No newline at end of file diff --git a/group06/290149544/hw1/src/hw1/ArrayList.java b/group06/290149544/hw1/src/hw1/ArrayList.java new file mode 100644 index 0000000000..20a48d10ef --- /dev/null +++ b/group06/290149544/hw1/src/hw1/ArrayList.java @@ -0,0 +1,58 @@ +package hw1; + +import java.util.Arrays; + +// 先不考虑线程安全,增删改查 +// 业务导向就是复制 +public class ArrayList implements List { + // 又想到阁成员函数 + private int size = 0; // 属于elementData的属性 + // 暂时不要泛型,以后优化 + private Object[] elementData = new Object[10]; + public void add(Object o) { + elementData = grow(elementData, 10); + elementData[size()] = o; + } + public void add(int index, Object o) { + elementData = grow(elementData, 10); + for (int i = elementData.length-1; i >= index ; i--) { + elementData[i+1] = elementData[i]; + } + elementData[index] = o; + } + public Object get(int index) { + // 入境检查 + if (index >= elementData.length) { + System.out.println("如何抛出数组越界异常?"); + } + return elementData[index]; + } + public Object remove(int index) { + // 入境检查 + if (index >= elementData.length || index < 0) { + System.out.println("如何抛出数组越界异常?"); + } + for (int i = index; i < elementData.length; i++) { + elementData[i-1] = elementData[i]; + } + return null; + } + public int size() { // 元素的个数 +// return -1; + return size; + } + public void print() { + for (int i = 0; i < size(); i++) { + System.out.println(elementData[i]); + } + } + // 注意有返回值 + private Object[] grow(Object[] src, int size) { + if (size() < src.length) { + return src; // 说明至少还能再放一个 + } else { + // 放不下了,则增加10个,数据结构是层层服务的 + return Arrays.copyOf(src, src.length+size); + } + } +} \ No newline at end of file diff --git a/group06/290149544/hw1/src/hw1/JavaTest.java b/group06/290149544/hw1/src/hw1/JavaTest.java new file mode 100644 index 0000000000..a59b8e2e10 --- /dev/null +++ b/group06/290149544/hw1/src/hw1/JavaTest.java @@ -0,0 +1,24 @@ +package hw1; + +import java.util.Arrays; + +public class JavaTest { + public static void main(String[] args) { + int[] a = new int[10]; // 创建了一个数组对象 + a[0] = 0; + a[1] = 1; + a[2] = 2; + a[3] = 3; +// a[10] = 3; + for (int i = 0; i < a.length; i++) { + System.out.println(a[i]); + } + } + // 然后就开始扩张了,ArrayList能自增长 + public static int[] grow(int[]src, int size) { + return Arrays.copyOf(src, src.length+size); +// int[] target = new int[src.length+size]; +// System.arraycopy(src, 0, target, 0, src.length); +// return target; + } +} diff --git a/group06/290149544/hw1/src/hw1/LinkedList.java b/group06/290149544/hw1/src/hw1/LinkedList.java new file mode 100644 index 0000000000..7966173b79 --- /dev/null +++ b/group06/290149544/hw1/src/hw1/LinkedList.java @@ -0,0 +1,115 @@ +package hw1; + +public class LinkedList implements List { +// public static void main(String[] args) { +// +// } + private Node head = null; + private int size; // 链表的节点个数,从1开始计数的哦 + + public void add(Object o) { + // 没有头节点,则创建头节点 + if (null == head) { + head = new Node(); + head.next = null; + } +// Node temp = new Node(); +// temp = head.next; + Node newNode = new Node(); + newNode.data = o; + newNode.next = head.next; + head.next = newNode; + + size++; + } + public void add(int index, Object o) { + + size++; + } + // 头节点的索引为0 + public Object get(int index) { + Node ptr = new Node(); + ptr = head; + // 如果index越界,则抛出异常啊?要抛出异常吗? + if (index >= size() || index < 0) { + System.out.println("要抛出异常吗?"); + return null; + } else { + // 假设头节点有数据吧,节约点资源 + for (int i = 0; i < index; i++) { + ptr = ptr.next; + } + } + return ptr; + } + // 删除特定索引位置的对象 + public Object remove(int index) { + Node ptr = new Node(); + Node temp = new Node(); + ptr = head; + // 如果index越界,则抛出异常啊?要抛出异常吗? + if (index >= size() || index < 0) { + System.out.println("要抛出异常吗?"); + return null; + } else { + // 假设头节点有数据吧,节约点资源 + for (int i = 0; i < index; i++) { + ptr = ptr.next; + } + // 此时ptr指向的就是index这个节点,但是我们要的是前一个节点 + temp = ptr.next; + ptr.next = ptr.next.next; + } + size--; + return temp; + } + public int size() { + // 隐藏的成本就是多写一个函数,没别的用途就是隐藏安全用的 + return size; + } + // 因为头节点head里面也是有数据的,所以这里的插入指的是插到头前面 + public void addFirst(Object o) { + // 不能发呆了 + // 首先创建节点 + Node ptr = new Node(); + ptr.data = o; + ptr.next = head; + head = ptr; + size++; + } + // 最后一个节点指向 null嘛 + public void addLast(Object o) { + Node ptr = new Node(); + ptr.data = o; + ptr.next = null; + // 取尾节点,size正好比索引大一个 + Node lastNode = head; + for (int i = 0; i < size-1; i++) { + lastNode = lastNode.next; + } + lastNode.next = ptr; + size++; + } + public Object removeLast() { + // 取尾节点前一个,size正好比索引大一个 + Node lastNode = head; + for (int i = 0; i < size-2; i++) { + lastNode = lastNode.next; + } + lastNode.next = null; + size--; + return null; + } + public Object removeFirst() { + Node firstNode = new Node(); + firstNode.next = head.next; + head = firstNode; + size--; + return null; + } + // 节点静态内部类 + private static class Node { + Object data; // Object 是一个通用的类型 + Node next; + } +} diff --git a/group06/290149544/hw1/src/hw1/List.java b/group06/290149544/hw1/src/hw1/List.java new file mode 100644 index 0000000000..cf68bf919e --- /dev/null +++ b/group06/290149544/hw1/src/hw1/List.java @@ -0,0 +1,9 @@ +package hw1; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group06/290149544/hw1/src/hw1/Queue.java b/group06/290149544/hw1/src/hw1/Queue.java new file mode 100644 index 0000000000..a8340c6a8d --- /dev/null +++ b/group06/290149544/hw1/src/hw1/Queue.java @@ -0,0 +1,20 @@ +package hw1; + +// 本质是排队,先进先出,公平嘛 +// 往队列头删除,往队列尾部插入,因为栈是严格在顶部操作,而队列就复杂的多 +public class Queue { + public void enQueue() { + + } + + public Object deQueue() { + return null; + } + public boolean isEmpty() { + return false; + } + + public int size() { + return -1; + } +} diff --git a/group06/290149544/hw1/src/hw1/Stack.java b/group06/290149544/hw1/src/hw1/Stack.java new file mode 100644 index 0000000000..590aa3a93b --- /dev/null +++ b/group06/290149544/hw1/src/hw1/Stack.java @@ -0,0 +1,39 @@ +package hw1; + +// mini jvm 用来做函数调用,比如表达式求值啦,都会用到栈 +public class Stack { + // 动态需要的成员属性 + private int size = 0; + + // ArrayList 使用我们自己定义的数据结构,自己吃自己的狗粮 + private ArrayList elementData = new ArrayList(); // 估计先调用自己吧 + + // push对内部而言就是向数组插入一个元素,吃自己的狗粮了,狗粮是之前做的独立的 + public void push(Object o) { + elementData.add(o); + size++; + } + // 弹出一个元素,内部实现就是删除一个元素 + public Object pop() { + // + Object temp; + temp = elementData.remove(size); + size--; // 单独写,保证代码可读性 + return temp; + } + public boolean isEmpty() { + if (size == 0) { + return true; + } else { + return false; + } + } + + public Object peek() { + return elementData.get(size-1); + } + + public int size() { + return size; + } +} diff --git a/group06/309953838/.classpath b/group06/309953838/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group06/309953838/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group06/309953838/.gitignore b/group06/309953838/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group06/309953838/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group06/309953838/.project b/group06/309953838/.project new file mode 100644 index 0000000000..7d9becf359 --- /dev/null +++ b/group06/309953838/.project @@ -0,0 +1,17 @@ + + + 309953838Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group06/309953838/src/com/team6/week1/ArrayList.java b/group06/309953838/src/com/team6/week1/ArrayList.java new file mode 100644 index 0000000000..6aba74bd93 --- /dev/null +++ b/group06/309953838/src/com/team6/week1/ArrayList.java @@ -0,0 +1,57 @@ +package com.team6.week1; + +public class ArrayList implements List { + + int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + + if (size >= elementData.length) { + Object[] tem = new Object[elementData.length * 2]; + for (int i = 0; i < size; i++) { + tem[i] = elementData[i]; + } + elementData = tem; + } + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + if (size >= elementData.length) { + Object[] tem = new Object[elementData.length * 2]; + for (int i = 0; i < size; i++) { + tem[i] = elementData[i]; + } + elementData = tem; + } + for (int i = index; i < size; i++) { + elementData[i + 1] = elementData[i]; + } + elementData[index] = o; + size++; + } + + public Object get(int index) { + return elementData[index]; + } + + public Object remove(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + for (int i = index; i < size; i++) { + elementData[i - 1] = elementData[i]; + } + size--; + return elementData[index]; + } + + public int size() { + return size; + + } + +} diff --git a/group06/309953838/src/com/team6/week1/LinkedList.java b/group06/309953838/src/com/team6/week1/LinkedList.java new file mode 100644 index 0000000000..d3863b0b05 --- /dev/null +++ b/group06/309953838/src/com/team6/week1/LinkedList.java @@ -0,0 +1,121 @@ +package com.team6.week1; + +public class LinkedList implements List { + + private Node root; + int index; + + public void addNode(String name) { + if (root == null) { + root = new Node(name); + } else { + root.add(name); + } + } + + class Node { + Object data; + Node next; + Node(Object data) { + this.data = data; + } + + + public void add(Object data) { + if (this.next == null) { + this.next = new Node(data); + } else { + this.next.add(data); + } + } + + + public Object del(int i) { + if (this.next != null) { + index++; + if (i == index) { + this.next = this.next.next; + return this.next.data; + } else { + this.next.del(i); + } + } + return null; + } + + public void traversal() { + if (this.next != null) { + index++; + this.next.traversal(); + } + } + + public void add(int i, Object o) { + if (this.next != null) { + if (i == index) { + Node node = new Node(data); + node.next = this.next.next; + this.next = node; + return; + } else { + this.next.add(i, o); + } + index++; + } + } + + public Object get(int i) { + if (this.next != null) { + + if (i == index) { + return this.data; + } else { + this.next.get(i); + } + index++; + } + return null; + } + + } + + @Override + public void add(Object data) { + if (root == null) { + root = new Node(data); + } else { + root.add(data); + } + } + + @Override + public void add(int index, Object o) { + if (root != null) { + root.add(index, o); + } + } + + @Override + public Object get(int index) { + if (root.next != null) { + return root.get(index); + } + return null; + } + + @Override + public Object remove(int index) { + if (root != null) { + return root.del(index); + } + return null; + } + + @Override + public int size() { + if (root != null) { + root.traversal(); + } + return index; + } +} diff --git a/group06/309953838/src/com/team6/week1/List.java b/group06/309953838/src/com/team6/week1/List.java new file mode 100644 index 0000000000..ee63e5d6f3 --- /dev/null +++ b/group06/309953838/src/com/team6/week1/List.java @@ -0,0 +1,14 @@ +package com.team6.week1; + +public interface List { + + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group06/309953838/src/com/team6/week1/Queue.java b/group06/309953838/src/com/team6/week1/Queue.java new file mode 100644 index 0000000000..6bdd2604a8 --- /dev/null +++ b/group06/309953838/src/com/team6/week1/Queue.java @@ -0,0 +1,62 @@ +package com.team6.week1; + +public class Queue { + private Node first; + private int index; + + class Node{ + Object data; + Node next; + + + Node(Object data){ + this.data = data; + } + + public void add(Object data){ + if(this.next == null){ + this.next = new Node(data); + }else{ + this.next.add(data); + } + } + + + public void traversal(){ + if(this.next != null){ + index++; + this.next.traversal(); + } + } + } + + public void enQueue(Object o){ + if(first != null){ + first.add(o); + } + } + + public Object deQueue(){ + if(first != null){ + Object obj = first.data; + first = first.next; + return obj; + } + return null; + } + + public boolean isEmpty(){ + if(first == null){ + return true; + }else{ + return false; + } + } + + public int size(){ + if(first != null){ + first.traversal(); + } + return index; + } +} diff --git a/group06/309953838/src/com/team6/week1/Stack.java b/group06/309953838/src/com/team6/week1/Stack.java new file mode 100644 index 0000000000..6568b5dea9 --- /dev/null +++ b/group06/309953838/src/com/team6/week1/Stack.java @@ -0,0 +1,32 @@ +package com.team6.week1; + +public class Stack { + +private List elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + int size = elementData.size(); + Object obj = elementData.remove(size--); + return obj; + } + + public Object peek(){ + int size = elementData.size(); + return elementData.get(size - 1); + } + public boolean isEmpty(){ + int size = elementData.size(); + if(size == 0){ + return true; + }else{ + return false; + } + } + public int size(){ + return elementData.size(); + } +} diff --git a/group06/547958234/src/com/coding/basic/ArrayList.java b/group06/547958234/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..a7a14e6102 --- /dev/null +++ b/group06/547958234/src/com/coding/basic/ArrayList.java @@ -0,0 +1,48 @@ +package com.coding.basic; + +import java.util.*; + +public class ArrayList implements List { + private int size = 0; + private static final int INCREMENT = 10; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + growLength(); + elementData[size++] = o; + } + public void add(int index, Object o){ + growLength(); + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index) { + //如果之前分配了很多内存,多次remove后是否需要将elementData手动缩小容量 + if (index > size) throw new IndexOutOfBoundsException("index: "+index+", size: "+size); + Object retVal = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, size-(index+1)); + elementData[--size] = null; + return retVal; + } + + public int size(){ + return this.size; + } + public Iterator iterator(){ + return null; + } + + private void growLength() { + if (this.size == elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length+INCREMENT); + } + } + +} diff --git a/group06/547958234/src/com/coding/basic/BinaryTreeNode.java b/group06/547958234/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7baaa8690 --- /dev/null +++ b/group06/547958234/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,55 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + if (o < this.data) { + if (this.left != null) { + this.left.insert(o); + } else { + BinaryTreeNode node = new BinaryTreeNode(); + node.data = o; + this.left = node; + } + } + if (o > this.data) { + if (this.right != null) { + this.right.insert(o); + } else { + BinaryTreeNode node = new BinaryTreeNode(); + node.data = o; + this.right = node; + } + } + return this; + } + +} diff --git a/group06/547958234/src/com/coding/basic/Iterator.java b/group06/547958234/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group06/547958234/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group06/547958234/src/com/coding/basic/LinkedList.java b/group06/547958234/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..b5cc03f0e6 --- /dev/null +++ b/group06/547958234/src/com/coding/basic/LinkedList.java @@ -0,0 +1,116 @@ +package com.coding.basic; + +import sun.jvm.hotspot.debugger.win32.coff.AuxBfEfRecord; + +public class LinkedList implements List { + + private Node head; + private int size; + + public void add(Object o) { + if (this.size == 0) { + addFirst(o); + } else { + Node node = findNode(size - 1); + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + node.next = newNode; + this.size++; + } + } + + public void add(int index, Object o) { + ensureNoOverStep(index); + if (index == 0) { + addFirst(o); + } else if (index == this.size) { + addLast(o); + } else { + Node beforeNode = findNode(index - 1); + Node newNode = new Node(); + newNode.data = o; + newNode.next = beforeNode.next; + beforeNode.next = newNode; + this.size++; + } + + } + + public Object get(int index) { + ensureNoOverStep(index); + Node node = findNode(index); + return node.data; + } + + public Object remove(int index) { + //只需要把对应节点从链表中摘出来就行了? + ensureNoOverStep(index); + if (index == 0) { + return removeFirst(); + } else if (index == this.size - 1) { + return removeLast(); + } else { + Node beforeNode = findNode(index - 1); + Node selectNode = beforeNode.next; + beforeNode.next = selectNode.next; + this.size--; + return selectNode.data; + } + } + + public int size() { + return this.size; + } + + public void addFirst(Object o) { + Node node = new Node(); + node.data = o; + node.next = this.head; + this.head = node; + this.size++; + } + + public void addLast(Object o) { + add(o); + } + + public Object removeFirst() { + Node node = new Node(); + node = head; + head = head.next; + this.size--; + return node.data; + } + + public Object removeLast() { + Node beforeNode = findNode(this.size - 2); + Node node = beforeNode.next; + beforeNode.next = null; + this.size--; + return node.data; + } + + public Iterator iterator() { + return null; + } + + private static class Node { + Object data; + Node next; + } + + private Node findNode(int index) { + ensureNoOverStep(index); + Node node = this.head; + while (index > 0) { + node = node.next; + index--; + } + return node; + } + + private void ensureNoOverStep(int index) { + if (index > this.size) throw new IndexOutOfBoundsException("Index: " + index + ", size: " + this.size); + } +} diff --git a/group06/547958234/src/com/coding/basic/LinkedListTest.java b/group06/547958234/src/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..afe137351f --- /dev/null +++ b/group06/547958234/src/com/coding/basic/LinkedListTest.java @@ -0,0 +1,20 @@ +package com.coding.basic; + +import com.coding.basic.LinkedList; +/** + * Created by mac on 2017/2/21. + */ +public class LinkedListTest { + public static void main(String[] args) { + LinkedList l = new LinkedList(); + l.add(0); + l.add(1); + l.add(2); + l.add(3,3); + Object ret = l.remove(1); + + for(int i=0;i 0) + + System.arraycopy(elementData, index+1, elementData, index ,size - index-1); + elementData[--size] = null; + + + return o; + } + public int size(){ + return size; + + } + public int Capacity(){ + return capacity; + } + private void rangCheck(int index){ + if(index > size || index < 0) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + private String outOfBoundsMsg(int index) { + return "Index: "+index+", Size: "+size; + } + +// private class MyIndexOutOfBoundsException extends RuntimeException{ +// @SuppressWarnings("unused") +// public MyIndexOutOfBoundsException(String e) { +// super(); +// } +// } + private void ensureCapacityInternal(int minCapacity) { + + modCount++; + if (elementData == EMPTY_ELEMENTDATA) { + minCapacity = Math.max(10, minCapacity); + capacity=minCapacity; + } + if (minCapacity - elementData.length > 0) + + grow(minCapacity); + } + private void grow(int minCapacity) { + // overflow-conscious code + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + (oldCapacity >> 1); + if (newCapacity - minCapacity < 0) + newCapacity = minCapacity; + capacity=newCapacity; + + elementData = Arrays.copyOf(elementData, newCapacity); + } + public Iterator iterator() { + return new Itr(); + } + private class Itr implements Iterator { + int cursor; + int lastRet = -1; + int expectedModCount = modCount; + + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + + int i = cursor; + if (i >= size) + throw new NoSuchElementException(); + Object[] elementData = MyArrayList.this.elementData; + if (i >= elementData.length) + throw new ConcurrentModificationException(); + cursor = i + 1; + return elementData[lastRet = i]; + + } + + @Override + public void remove() { + if (lastRet < 0) + throw new IllegalStateException(); + checkForComodification(); + + try { + MyArrayList.this.remove(lastRet); + cursor = lastRet; + lastRet = -1; + expectedModCount = modCount; + } catch (IndexOutOfBoundsException ex) { + throw new ConcurrentModificationException(); + } + + } + final void checkForComodification() { + if (modCount != expectedModCount) + throw new ConcurrentModificationException(); + } + } + + +} diff --git a/group06/736464448/data_structure/MyBinaryTree.java b/group06/736464448/data_structure/MyBinaryTree.java new file mode 100644 index 0000000000..f7ba05f9cd --- /dev/null +++ b/group06/736464448/data_structure/MyBinaryTree.java @@ -0,0 +1,198 @@ +package data_structure; + + + +public class MyBinaryTree { + + private BinaryTreeNode root; + private int size; + + + + public void add(int key,Object o) { + size++; + BinaryTreeNode target=null; + final BinaryTreeNode parent=root; + final BinaryTreeNode newnode=new BinaryTreeNode(key,o,null,null,null); + if(parent==null) + root=newnode; + else{ + target=compareKey(key,parent); + + if (key < target.key) { + target.left = newnode; + newnode.top = target; + } else if(key > target.key){ + target.right = newnode; + newnode.top = target; + } + else{ + target.data=o; + size--; + } + + } + + } + public Object get(int key){ + BinaryTreeNode target=null; + target=search( key); + if(target==null) + return null; + else + return target.data; + } + private BinaryTreeNode search(int key){ + BinaryTreeNode target=null; + final BinaryTreeNode parent=root; + if(parent==null) + return null; + + else + target=compareKey(key,parent); + if (key == target.key) { + + return target; + } + return null; + } + public Object remove(int key){ + BinaryTreeNode replace=null; + BinaryTreeNode target=null; + BinaryTreeNode oldnode=null; + + target=search( key); + if(target==null) + return null; + else + { + oldnode=target; + if(target.left==null&&target.right==null){ + + changeParent( target,null); + target=null; + } + else if(target.left!=null&&target.right==null){ + // replace=next(target.left); + // target=replace; + // changeParent(target,replace); + // changeChild(target, replace); + // changeParent(replace,null); + // target=null; + + replace=target.left; + changeParent(target,replace); + replace.top=target.top; + target=null; + } + else if(target.left==null&&target.right!=null){ +// replace=prev(target.right); +// target=replace; +// changeParent(target,replace); +// changeChild(target, replace); +// changeParent(replace,null); +// replace=null; + + replace=target.right; + changeParent(target,replace); + replace.top=target.top; + target=null; + } + else if(target.left!=null&&target.right!=null){ + int prev=prev(target.right).key; + int next=next(target.left).key; + if((next-key)>(key-prev)) + replace=prev(target.right); + else + replace=next(target.left); + target=replace; + changeParent(target,replace); + changeChild(target, replace); + changeParent(replace,null); + replace=null; + } + } + size--; + return oldnode.data; + } + private void changeParent(BinaryTreeNode target,BinaryTreeNode child){ + BinaryTreeNode targetparent=null; + targetparent=target.top; + if(targetparent.key>target.key) + targetparent.left=child; + else + targetparent.right=child; + + } + private void changeChild(BinaryTreeNode target,BinaryTreeNode parent){ + BinaryTreeNode targetleftchild=null; + BinaryTreeNode targetrightchild=null; + targetleftchild=target.left; + targetrightchild=target.right; + if(targetleftchild!=null) + targetleftchild.top=parent; + if(targetrightchild!=null) + targetrightchild.top=parent; + + } + //找到前驱节点 + private BinaryTreeNode prev(BinaryTreeNode target){ + // BinaryTreeNode prev=null; + while(target.left!=null){ + target=target.left; + } + return target; + + } + //找到后驱节点 + private BinaryTreeNode next(BinaryTreeNode target){ +// BinaryTreeNode next=null; + while(target.right!=null){ + target=target.right; + } + return target; + + } + public int size(){ + + return size; + } + private BinaryTreeNode compareKey(int key ,BinaryTreeNode node) { + BinaryTreeNode parent=node; + while (parent != null) { + + if (key < parent.key&&parent.left!=null) { + parent = parent.left; + } else if (key > parent.key&&parent.right!=null) { + parent = parent.right; + } else { + return parent; + + } + } + return parent; + + + } + + + + + private static class BinaryTreeNode{ + Object data; + int key; + BinaryTreeNode left; + BinaryTreeNode right; + BinaryTreeNode top; + public BinaryTreeNode(int key,Object o, BinaryTreeNode top, BinaryTreeNode left,BinaryTreeNode right){ + this.key=key; + this.data=o; + this.left=left; + this.right=right; + this.top=top; + + } + + + } +} diff --git a/group06/736464448/data_structure/MyLinkedList.java b/group06/736464448/data_structure/MyLinkedList.java new file mode 100644 index 0000000000..32097115e7 --- /dev/null +++ b/group06/736464448/data_structure/MyLinkedList.java @@ -0,0 +1,209 @@ +package data_structure; + + +import java.util.Iterator; +import java.util.NoSuchElementException; + + + +public class MyLinkedList { + private int size; + private Node head; + private Node last; + + public void add(Object o){ + + linkLast(o); + + } + + public Object get(int index){ + checkPositionIndex(index); + Node node=node(index); + return node.item; + } + public Object remove(int index){ + checkPositionIndex(index); + Node node=node(index); + isnull(node); + Object o=null; + Node before=null; + if(index==0){ + o=node.item; + node.next=head; + node=null; + } + else + { + before=node(index-1); + before.next=node.next; + o=node.item; + node=null; + + } + + return o; + } + public int size(){ + + return size; + } + public void addFirst(Object o){ + + linkFirst(o); + + + } + public void addLast(Object o){ + linkLast(o); + + } + public Object removeFirst(){ + Node f=head; + isnull(f); + final Node next=head.next; + Object o=f.item; + f=null; + head=next; + if(next==null) + last=null; + size--; + + return o; + } + //这个方法用多了也爆炸 + public Object removeLast(){ + Node l=last; + isnull(l); + Object o=null; + if(size>=2){ + final Node before=node(size-1); + o=l.item; + l=null; + last=before; + + if(before==null) + head=null; + } + else{ + o=l.item; + l=null; + last=null; + head=null; + } + + + size--; + return o; + + } + public Iterator iterator(){ + + + return new ListItr(); + } + + + private static class Node{ + Object item; + Node next; + Node(Object o, Node next){ + this.item=o; + this.next=next; + } + } + public void add(int index, Object o) { + checkPositionIndex(index); + + if (index == 0) + linkFirst(o); + else + linkNext(o, node(index-1)); + } + private void linkNext(Object o,Node node){ + final Node next=node.next; + final Node newnode=new Node(o,next); + node.next=newnode; + size++; + } + private void checkPositionIndex(int index) { + if (!isPositionIndex(index)) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + private boolean isPositionIndex(int index) { + return index >= 0 && index <= size; + } + private String outOfBoundsMsg(int index) { + return "Index: "+index+", Size: "+size; + } + private void linkLast(Object o){ + final Node l=last; + final Node node=new Node(o,null); + last=node; + if(head==null) + head=node; + else + l.next=node; + size++; + } + private void linkFirst(Object o){ + final Node f=head; + final Node node=new Node(o,null); + head=node; + if(last==null) + last=node; + else + head.next=f; + size++; + } + private void isnull(Node node){ + if (node == null) + throw new NoSuchElementException(); + } + Node node(int index) { + // assert isElementIndex(index); + + + Node x = head; + for (int i = 0; i < index; i++) + x = x.next; + return x; + + + } + + private class ListItr implements Iterator { + private Node next=head; + private int nextIndex; + private Node lastReturned = null; + + public boolean hasNext() { + return nextIndex < size; + } + + public Object next() { + + if (!hasNext()) + throw new NoSuchElementException(); + + lastReturned = next; + next = next.next; + nextIndex++; + //加上死循环了 +// if(nextIndex==size){ +// next=head; +// nextIndex=0; +// } + return lastReturned.item; + } + + @Override + public void remove() { + // TODO Auto-generated method stub + + } + } + + + +} diff --git a/group06/736464448/data_structure/MyQueue.java b/group06/736464448/data_structure/MyQueue.java new file mode 100644 index 0000000000..8e3f50e0bb --- /dev/null +++ b/group06/736464448/data_structure/MyQueue.java @@ -0,0 +1,21 @@ +package data_structure; + +public class MyQueue { + private MyLinkedList elementData =new MyLinkedList(); + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + return elementData.size()==0; + } + + public int size(){ + return elementData.size(); + } + +} diff --git a/group06/736464448/data_structure/MyStack.java b/group06/736464448/data_structure/MyStack.java new file mode 100644 index 0000000000..f442468fb2 --- /dev/null +++ b/group06/736464448/data_structure/MyStack.java @@ -0,0 +1,22 @@ +package data_structure; + +public class MyStack { + private MyArrayList elementData = new MyArrayList(); + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + return elementData.remove(elementData.size()-1); + } + + public Object peek(){ + return elementData.get(0); + } + public boolean isEmpty(){ + return elementData.size()==0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group06/736464448/test_data_structure/TestMyArrayList.java b/group06/736464448/test_data_structure/TestMyArrayList.java new file mode 100644 index 0000000000..6ce24c90a8 --- /dev/null +++ b/group06/736464448/test_data_structure/TestMyArrayList.java @@ -0,0 +1,93 @@ +package test_data_structure; + + + +import java.util.Iterator; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import data_structure.MyArrayList; + +public class TestMyArrayList { + MyArrayList list; + + @Before + public void setUp() throws Exception { + list=new MyArrayList(); + System.out.println("begin"); + } + + @After + public void tearDown() throws Exception { + System.out.println("end"); + } + + @Test + public void testMyArrayList() { + + Assert.assertEquals(0, list.Capacity()); + } + + @Test + public void testAddObject() { + list.add(new Integer(10)); + Assert.assertEquals(10, list.get(0)); + } + + @Test + public void testAddIntObject() { + list.add(1); + list.add(1); + list.add(1); + list.add(1,2); + Assert.assertEquals(2, list.get(1)); + + + } + + @Test + public void testGet() { + list.add(1); + list.add(2); + Assert.assertEquals(2, list.get(1)); + } + + @Test + public void testRemove() { + list.add(1); + list.add(2); + list.add(3); + Assert.assertEquals(2, list.remove(1)); + + } + + @Test + public void testSize() { + list.add(1); + list.add(2); + list.add(3); + Assert.assertEquals(3, list.size()); + } + + @Test + public void testCapacity() { + list=new MyArrayList(5); + Assert.assertEquals(5, list.Capacity()); + + } + @Test + public void testIterator(){ + list.add(1); + list.add(2); + list.add(3); + Iterator itr=list.iterator(); + while(itr.hasNext()){ + System.out.println(itr.next()); + } + + } + +} diff --git a/group06/736464448/test_data_structure/TestMyBinaryTree.java b/group06/736464448/test_data_structure/TestMyBinaryTree.java new file mode 100644 index 0000000000..f56696d4f7 --- /dev/null +++ b/group06/736464448/test_data_structure/TestMyBinaryTree.java @@ -0,0 +1,59 @@ +package test_data_structure; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import data_structure.MyBinaryTree; + + +public class TestMyBinaryTree { + MyBinaryTree bt; + + @Before + public void setUp() throws Exception { + System.out.println("开始测试"); + bt=new MyBinaryTree(); + } + + @After + public void tearDown() throws Exception { + System.out.println("结束测试"); + } + + @Test + public void testAdd() { + bt.add(1, "c"); + + } + + @Test + public void testGet() { + bt.add(1, 1); + bt.add(2, 2); + bt.add(3, 3); + Assert.assertEquals(2, bt.get(2)); + } + + @Test + public void testRemove() { + bt.add(1, 1); + bt.add(2, 2); + bt.add(3, 3); + Assert.assertEquals(2, bt.remove(2)); + + Assert.assertEquals(2, bt.size()); + } + + @Test + public void testSize() { + bt.add(1, 1); + bt.add(2, 2); + bt.add(3, 3); + Assert.assertEquals(3, bt.size()); + } + +} diff --git a/group06/736464448/test_data_structure/TestMyLinkedList.java b/group06/736464448/test_data_structure/TestMyLinkedList.java new file mode 100644 index 0000000000..9280b0f65c --- /dev/null +++ b/group06/736464448/test_data_structure/TestMyLinkedList.java @@ -0,0 +1,111 @@ +package test_data_structure; + + + +import java.util.Iterator; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import data_structure.MyLinkedList; + +public class TestMyLinkedList { + MyLinkedList link=null; + + @Before + public void setUp() throws Exception { + link=new MyLinkedList(); + System.out.println("测试开始"); + } + + @After + public void tearDown() throws Exception { + System.out.println("测试结束"); + } + + @Test + public void testAddObject() { + link.add(1); + Assert.assertEquals(1,link.get(0)); + } + + @Test + public void testGet() { + link.add(1); + Assert.assertEquals(1,link.get(0)); + } + + @Test + public void testRemove() { + link.add(1); + Assert.assertEquals(1,link.remove(0)); + } + + @Test + public void testSize() { + link.add(1); + Assert.assertEquals(1,link.size()); + } + + @Test + public void testAddFirst() { + link.add(1); + link.add(1); + link.add(1); + link.addFirst(2); + Assert.assertEquals(2,link.get(0)); + } + + @Test + public void testAddLast() { + link.add(1); + link.add(1); + link.add(1); + link.addLast(2); + Assert.assertEquals(2,link.get(link.size()-1)); + } + + @Test + public void testRemoveFirst() { + link.add(1); + link.add(1); + link.add(1); + link.addFirst(2); + Assert.assertEquals(2,link.removeFirst()); + } + + @Test + public void testRemoveLast() { + link.add(1); + link.add(1); + link.add(1); + link.addLast(2); + Assert.assertEquals(2,link.removeLast()); + } + + @Test + public void testIterator() { + link.add(1); + link.add(2); + link.add(3); + Iterator itr=link.iterator(); + while(itr.hasNext()){ + System.out.println(itr.next()); + } + + } + + @Test + public void testAddIntObject() { + link.add(1); + link.add(1); + link.add(1); + link.add(2, 3); + Assert.assertEquals(3,link.get(2)); + } + + + +} diff --git a/group06/736464448/test_data_structure/TestMyQueue.java b/group06/736464448/test_data_structure/TestMyQueue.java new file mode 100644 index 0000000000..dd0e96e699 --- /dev/null +++ b/group06/736464448/test_data_structure/TestMyQueue.java @@ -0,0 +1,49 @@ +package test_data_structure; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import data_structure.MyQueue; + +public class TestMyQueue { + MyQueue queue; + + @Before + public void setUp() throws Exception { + queue =new MyQueue(); + System.out.println("开始测试"); + } + + @After + public void tearDown() throws Exception { + System.out.println("结束测试"); + } + + @Test + public void testEnQueue() { + queue.enQueue("hello"); + } + + @Test + public void testDeQueue() { + queue.enQueue("hello"); + queue.enQueue("world"); + Assert.assertEquals("hello",queue.deQueue()); + } + + @Test + public void testIsEmpty() { + queue.enQueue("hello"); + Assert.assertEquals(false,queue.isEmpty()); + } + + @Test + public void testSize() { + Assert.assertEquals(0,queue.size()); + } + +} diff --git a/group06/736464448/test_data_structure/TestMyStack.java b/group06/736464448/test_data_structure/TestMyStack.java new file mode 100644 index 0000000000..7ddaba1e62 --- /dev/null +++ b/group06/736464448/test_data_structure/TestMyStack.java @@ -0,0 +1,60 @@ +package test_data_structure; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import data_structure.MyStack; + +public class TestMyStack { + MyStack mystack; + + @Before + public void setUp() throws Exception { + mystack=new MyStack(); + System.out.println("开始测试"); + } + + @After + public void tearDown() throws Exception { + System.out.println("结束测试"); + } + + @Test + public void testPush() { + mystack.push("Hello"); + mystack.push(","); + mystack.push("World"); + } + + @Test + public void testPop() { + mystack.push("Hello"); + mystack.push(","); + mystack.push("World"); + Assert.assertEquals("World", (String)mystack.pop()); + Assert.assertEquals(",", (String)mystack.pop()); + + } + + @Test + public void testPeek() { + mystack.push("Hello"); + Assert.assertEquals("Hello", (String)mystack.peek()); + } + + @Test + public void testIsEmpty() { + + Assert.assertEquals(true, mystack.isEmpty()); + } + + @Test + public void testSize() { + Assert.assertEquals(0, mystack.size()); + } + +} diff --git a/group06/799237637/secondhomework/src/com/liteStructs/LoginAction.java b/group06/799237637/secondhomework/src/com/liteStructs/LoginAction.java new file mode 100644 index 0000000000..12f5362069 --- /dev/null +++ b/group06/799237637/secondhomework/src/com/liteStructs/LoginAction.java @@ -0,0 +1,5 @@ +package com.liteStructs; + +public class LoginAction { + +} diff --git a/group06/799237637/secondhomework/src/com/liteStructs/Structs.java b/group06/799237637/secondhomework/src/com/liteStructs/Structs.java new file mode 100644 index 0000000000..ab36173eaf --- /dev/null +++ b/group06/799237637/secondhomework/src/com/liteStructs/Structs.java @@ -0,0 +1,5 @@ +package com.liteStructs; + +public class Structs { + +} diff --git a/group06/799237637/secondhomework/src/com/liteStructs/View.java b/group06/799237637/secondhomework/src/com/liteStructs/View.java new file mode 100644 index 0000000000..4942fc8c6c --- /dev/null +++ b/group06/799237637/secondhomework/src/com/liteStructs/View.java @@ -0,0 +1,5 @@ +package com.liteStructs; + +public class View { + +} diff --git a/group06/799237637/secondhomework/src/com/liteStructs/struts.xml b/group06/799237637/secondhomework/src/com/liteStructs/struts.xml new file mode 100644 index 0000000000..cc909972cd --- /dev/null +++ b/group06/799237637/secondhomework/src/com/liteStructs/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group06/799237637/secondhomework/src/secondhomework/MyArrayUtil.java b/group06/799237637/secondhomework/src/secondhomework/MyArrayUtil.java new file mode 100644 index 0000000000..4b5c626cd2 --- /dev/null +++ b/group06/799237637/secondhomework/src/secondhomework/MyArrayUtil.java @@ -0,0 +1,214 @@ +package secondhomework; + +import java.util.ArrayList; +import java.util.Arrays; + +/* + * ʵArrayUtil + */ +@SuppressWarnings("all") +public class MyArrayUtil { + /** + * һa , Ըֵû + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * @param origin + * @return + */ + + public void reverseArray(int[] origin){ + int size =origin.length; + + for(int i=0;iinitialcapcity){ + enlarge(); + } + elements[size]=o; + size++; + + } + public Object get(int index){ + if(index<0||index>size-1){ + throw new IndexOutOfBoundsException("Խ磺"); + } + return elements[index]; + + } +//ʵremove()ɾλãԪҪǰƣɾλõԪ + public Object remove(int index){ + Object oldValue=elements[index]; + int eleMoved=size-index-1; //ƶԪصĸ + if(eleMoved>0){ + System.arraycopy(elements, //ԭ + index+1, //ԭʼλãɾԪصĺһλã + elements, //Ŀ + index, //Ŀʼλ + eleMoved);//ij + } + elements[size-1]=null; + size--; + + return oldValue; + } + + public boolean set(int index,Object o){ + if(index<0||index>size-1){ + throw new IndexOutOfBoundsException("Խ"); + } + elements[index]=o; + return true; + } + + //дtoString() + public String toString(){ + StringBuffer sb=new StringBuffer(); + sb.append("["); + for(int i=0;i + + + + + + diff --git a/group06/949319266/.project b/group06/949319266/.project new file mode 100644 index 0000000000..8df999fe3c --- /dev/null +++ b/group06/949319266/.project @@ -0,0 +1,17 @@ + + + algorithm + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group06/949319266/.settings/org.eclipse.jdt.core.prefs b/group06/949319266/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..d5ccc4f06c --- /dev/null +++ b/group06/949319266/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Fri Feb 24 09:38:47 CST 2017 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/group06/949319266/949319266learn/.classpath b/group06/949319266/949319266learn/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group06/949319266/949319266learn/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group06/949319266/949319266learn/.settings/org.eclipse.jdt.core.prefs b/group06/949319266/949319266learn/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group06/949319266/949319266learn/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group06/949319266/RemoteSystemsTempFiles/.project b/group06/949319266/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000000..5447a64fa9 --- /dev/null +++ b/group06/949319266/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group06/949319266/homework/.classpath b/group06/949319266/homework/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group06/949319266/homework/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group06/949319266/homework/.gitignore b/group06/949319266/homework/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group06/949319266/homework/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group06/949319266/homework/.project b/group06/949319266/homework/.project new file mode 100644 index 0000000000..b4bd3f32d4 --- /dev/null +++ b/group06/949319266/homework/.project @@ -0,0 +1,17 @@ + + + homework + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group06/949319266/homework/.settings/org.eclipse.core.resources.prefs b/group06/949319266/homework/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..8822690b9a --- /dev/null +++ b/group06/949319266/homework/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/cn/ecust/Iitestruts/LoginAction.java=UTF-8 +encoding//src/cn/ecust/Iitestruts/Struts.java=UTF-8 +encoding//src/cn/ecust/Iitestruts/StrutsTest.java=UTF-8 diff --git a/group06/949319266/homework/.settings/org.eclipse.jdt.core.prefs b/group06/949319266/homework/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group06/949319266/homework/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group06/949319266/homework/src/cn/ecust/Array/ArrayUtil.java b/group06/949319266/homework/src/cn/ecust/Array/ArrayUtil.java new file mode 100644 index 0000000000..8965b7a1aa --- /dev/null +++ b/group06/949319266/homework/src/cn/ecust/Array/ArrayUtil.java @@ -0,0 +1,201 @@ +package cn.ecust.Array; + +import java.util.ArrayList; +import java.util.Arrays; + +public class ArrayUtil { + /** + * һa , Ըֵû + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int tem = 0; + for(int i = 0; i < origin.length/2; i++) { + tem = origin[i]; + origin[i] = origin[origin.length-1-i]; + origin[origin.length-1-i] = tem; + } + + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + ArrayList arr = new ArrayList(); + for(int i = 0; i < oldArray.length; i++) { + if(oldArray[i] != 0) { + arr.add(oldArray[i]); + } + } + oldArray = null; + for(int i = 0; i= array1.length){ //1Ѿ + array3[c++] = array2[b++]; + continue; + } + + if(b >= array2.length){ //2Ѿ + array3[c++] = array1[a++]; + continue; + } + + if(array1[a] > array2[b]){ + array3[c++] = array2[b++]; + }else if(array1[a] < array2[b]){ + array3[c++] = array1[a++]; + }else{ + array3[c++] = array1[a++]; + b++; + } + } + array3 = Arrays.copyOf(array3, c); + return array3; + } + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ + * oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length+size]; + for(int i = 0 ; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ + * 磬 max = 15 , 򷵻صӦΪ [11235813] + * max = 1, 򷵻ؿ [] + * @param max + * @return + */ + + public int[] fibonacci(int max){ + ArrayList arr = new ArrayList(); + int i = 1; + int j = 1; + arr.add(i);arr.add(j); + int m=i+j; + while(m arr = new ArrayList(); + for(int i=0;i= result.length) + result = grow(result, result.length); + for(int j = 2; j < i; j++){ + if(i % j == 0) + sum += j; + } + if(sum == i) + result[len++] = sum; + } + result = Arrays.copyOf(result, len); + return result; + } + + /** + * seperator array + * array= [3,8,9], seperator = "-" + * 򷵻ֵΪ"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + String result = new String(); + int len = 0; + result = new Integer(array[0]).toString(); + for(int i = 1; i < array.length; i++){ + result += seperator; + result += array[i]; + } + return result; + } + +} diff --git a/group06/949319266/homework/src/cn/ecust/Iitestruts/LoginAction.java b/group06/949319266/homework/src/cn/ecust/Iitestruts/LoginAction.java new file mode 100644 index 0000000000..004f428e2b --- /dev/null +++ b/group06/949319266/homework/src/cn/ecust/Iitestruts/LoginAction.java @@ -0,0 +1,39 @@ +package cn.ecust.Iitestruts; + +/** + * 杩欐槸涓�涓敤鏉ュ睍绀虹櫥褰曠殑涓氬姟绫伙紝 鍏朵腑鐨勭敤鎴峰悕鍜屽瘑鐮侀兘鏄‖缂栫爜鐨勩�� + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group06/949319266/homework/src/cn/ecust/Iitestruts/Struts.java b/group06/949319266/homework/src/cn/ecust/Iitestruts/Struts.java new file mode 100644 index 0000000000..27c36c6902 --- /dev/null +++ b/group06/949319266/homework/src/cn/ecust/Iitestruts/Struts.java @@ -0,0 +1,34 @@ +package cn.ecust.Iitestruts; + +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 璇诲彇閰嶇疆鏂囦欢struts.xml + + 1. 鏍规嵁actionName鎵惧埌鐩稿搴旂殑class 锛� 渚嬪LoginAction, 閫氳繃鍙嶅皠瀹炰緥鍖栵紙鍒涘缓瀵硅薄锛� + 鎹畃arameters涓殑鏁版嵁锛岃皟鐢ㄥ璞$殑setter鏂规硶锛� 渚嬪parameters涓殑鏁版嵁鏄� + ("name"="test" , "password"="1234") , + 閭e氨搴旇璋冪敤 setName鍜宻etPassword鏂规硶 + + 2. 閫氳繃鍙嶅皠璋冪敤瀵硅薄鐨別xectue 鏂规硶锛� 骞惰幏寰楄繑鍥炲�硷紝渚嬪"success" + + 3. 閫氳繃鍙嶅皠鎵惧埌瀵硅薄鐨勬墍鏈塯etter鏂规硶锛堜緥濡� getMessage锛�, + 閫氳繃鍙嶅皠鏉ヨ皟鐢紝 鎶婂�煎拰灞炴�у舰鎴愪竴涓狧ashMap , 渚嬪 {"message": "鐧诲綍鎴愬姛"} , + 鏀惧埌View瀵硅薄鐨刾arameters + + 4. 鏍规嵁struts.xml涓殑 閰嶇疆,浠ュ強execute鐨勮繑鍥炲�硷紝 纭畾鍝竴涓猨sp锛� + 鏀惧埌View瀵硅薄鐨刯sp瀛楁涓�� + + */ + + return null; + } + +} diff --git a/group06/949319266/homework/src/cn/ecust/Iitestruts/StrutsTest.java b/group06/949319266/homework/src/cn/ecust/Iitestruts/StrutsTest.java new file mode 100644 index 0000000000..10c0d5c6db --- /dev/null +++ b/group06/949319266/homework/src/cn/ecust/Iitestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package cn.ecust.Iitestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //瀵嗙爜鍜岄璁剧殑涓嶄竴鑷� + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group06/949319266/homework/src/cn/ecust/Iitestruts/View.java b/group06/949319266/homework/src/cn/ecust/Iitestruts/View.java new file mode 100644 index 0000000000..dd652dad20 --- /dev/null +++ b/group06/949319266/homework/src/cn/ecust/Iitestruts/View.java @@ -0,0 +1,23 @@ +package cn.ecust.Iitestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group06/949319266/homework/src/cn/ecust/Iitestruts/struts.xml b/group06/949319266/homework/src/cn/ecust/Iitestruts/struts.xml new file mode 100644 index 0000000000..a6cfe43e6c --- /dev/null +++ b/group06/949319266/homework/src/cn/ecust/Iitestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group06/949319266/homework/src/cn/ecust/Test/ArrayUtilTest.java b/group06/949319266/homework/src/cn/ecust/Test/ArrayUtilTest.java new file mode 100644 index 0000000000..0ac38f0256 --- /dev/null +++ b/group06/949319266/homework/src/cn/ecust/Test/ArrayUtilTest.java @@ -0,0 +1,26 @@ +package cn.ecust.Test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import cn.ecust.Array.ArrayUtil; + +public class ArrayUtilTest { + + @Test + public void test() { + int[] a = {7, 9, 30, 0, 0, 0, 3, 4}; + int[] b = {3,4,5,6,7,8}; + ArrayUtil au = new ArrayUtil(); + au.reverseArray(a); + //au.removeZero(a); + au.merge(a, b); + au.grow(a, 3); + au.fibonacci(25); + au.getPrimes(25); + au.getPerfectNumbers(25); + au.join(a, "-"); + } + +} diff --git "a/group06/949319266/homework/src/\346\226\207\347\253\2402.txt" "b/group06/949319266/homework/src/\346\226\207\347\253\2402.txt" new file mode 100644 index 0000000000..89823c8f5a --- /dev/null +++ "b/group06/949319266/homework/src/\346\226\207\347\253\2402.txt" @@ -0,0 +1 @@ +http://blog.sina.com.cn/s/blog_c20b18280102x3fi.html \ No newline at end of file diff --git a/group06/949319266/src/com/coding/basic/ArrayList.java b/group06/949319266/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..1d892decc9 --- /dev/null +++ b/group06/949319266/src/com/coding/basic/ArrayList.java @@ -0,0 +1,93 @@ +package com.coding.basic; + +import java.util.Iterator; + +public class ArrayList implements List { + + private int size; + private int current ; + private int point; + private Object[] elementData = null; + private static final int DEFAULT_SIZE=100; + + public ArrayList() { + this(DEFAULT_SIZE); + } + + public ArrayList(int size) { + if(size < 0) { + System.out.println("СС0"); + } else { + this.elementData = new Object[size]; + this.current = 0; + point = size; + } + } + + public void add(E e){ + judgeSize(); + this.elementData[current] = e; + this.current++; + } + public void add(int index, E e){ + judgeIndex(index); + for(int i=0 ; i= index && i+2 < elementData.length) { + elementData[i] = e; + elementData[i+1] = elementData[i+2]; + } + } + current++; + } + + public E get(int index){ + judgeIndex(index); + return (E)this.elementData[index]; + } + + public void remove(int index) { + judgeIndex(index); + for(int i=0;i0) { + return true; + } + return false; + } + public void clear() { + elementData = new Object[DEFAULT_SIZE]; + } + private void judgeSize() { + Object[] newarr = new Object[elementData.length + DEFAULT_SIZE]; + System.arraycopy(elementData, 0, newarr, 0, elementData.length); + this.elementData = newarr; + } + public void judgeIndex(int index) { + if(index < 0 || index > point) { + System.out.println("±Խ"); + } + } + +} diff --git a/group06/949319266/src/com/coding/basic/BinaryTreeNode.java b/group06/949319266/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..142e160212 --- /dev/null +++ b/group06/949319266/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,100 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private int data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode root; + + public BinaryTreeNode getRoot() { + return root; + } + + public Object getData() { + return data; + } + public void setData(int data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public void insert(int value){ + BinaryTreeNode newNode = new BinaryTreeNode(); + if(root == null) { + root=newNode; + root.left = null; + root.right = null; + } else { + BinaryTreeNode currentNode = root; + BinaryTreeNode parentNode; + while(true) { + parentNode = currentNode; + if(newNode.data > currentNode.data) { + currentNode = currentNode.getRight(); + if(currentNode == null) { + parentNode.setRight(newNode); + return; + } + } else { + currentNode = currentNode.getLeft(); + if(currentNode == null) { + parentNode.setLeft(newNode); + return; + } + } + } + + } + } + public boolean find(int key) { + BinaryTreeNode cNode = root; + if(cNode != null) { + while(cNode.data != key) { + if(cNode.data > key) { + cNode = cNode.getLeft(); + } else { + cNode = cNode.getRight(); + } + return true; + } + return true; + } + return false; + } + // + public void inOrder(BinaryTreeNode treeNode) { + if(treeNode != null) { + inOrder(treeNode.getLeft()); + System.out.println(treeNode.data); + inOrder(treeNode.getRight()); + } + } + // + public void leftOrder(BinaryTreeNode treeNode) { + if(treeNode != null) { + leftOrder(treeNode.getLeft()); + System.out.println(treeNode.data); + leftOrder(treeNode.getRight()); + } + } + // + public void rightOrder(BinaryTreeNode treeNode) { + if(treeNode != null) { + rightOrder(treeNode.getLeft()); + System.out.println(treeNode.data); + rightOrder(treeNode.getRight()); + } + } +} diff --git a/group06/949319266/src/com/coding/basic/LinkedList.java b/group06/949319266/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..df577eff5c --- /dev/null +++ b/group06/949319266/src/com/coding/basic/LinkedList.java @@ -0,0 +1,133 @@ +package com.coding.basic; + +import java.util.Iterator; + +public class LinkedList implements List { + + private Node last; + private Node head; + private int xsize = 0; + + public LinkedList() { + init(); + } + + private void init() { + head = new Node(null,null,null); + last = new Node(null,head,null); + head.next = last; + xsize = 0; + } + + //һڲʹ;index֮ǰһڵ + private void add(Node node,int index) { + if(index < 0 || index > xsize) { + throw new IndexOutOfBoundsException("±Խ"); + } + node.pre = getNode(index-1); + getNode(index-1).next = node; + node.next = getNode(index); + getNode(index).pre = node; + xsize++; + } + public void add(E e){ + add(new Node(e,null,null),xsize); + } + + public void add(int index,E e){ + add(new Node(e,null,null),index); + } + private Node getNode(int index){ + Node newNode; + int current; + if(index == -1) { + return head; + } else if (index == xsize ){ + return last; + } else { + current = 0; + newNode = head.next; + while (current < index) { + newNode = newNode.next; + current++; + } + } + return newNode; + } + + public E get(int index) { + return getNode(index).e; + } + + public void remove(int index){ + Node node = getNode(index); + node.pre.next = node.next; + node.next.pre=node.pre; + xsize--; + } + + public int size(){ + return xsize; + } + + public void addFirst(E e){ + add(new Node(e,null,null),0); + } + public void addLast(E e){ + add(new Node(e,null,null),xsize); + } + public void removeFirst(){ + remove(0); + } + public void removeLast(){ + remove(xsize); + } + public Iterator iterator(){ + return null; + } + + private static class Node{ + public E e; + Node next; + Node pre; + public Node (E e,Node pre,Node next) { + this.pre = pre; + this.next = next; + this.e = e; + } + + } + + + public boolean contains(Node node) { + Node mnode = head.next; + while(mnode !=null) { + if(mnode.equals(node)) { + return true; + } + mnode = mnode.next; + } + return false; + } + public boolean isEmpty() { + return xsize == 0 ? true:false; + } + public void clear() { + init(); + } + + public boolean contains(E e) { + // TODO Auto-generated method stub + Node node = null; + while((node=(head.next)) != null) { + if(e.equals(node)) { + return true; + } else { + node = node.next; + } + } + return false; + } + + +} diff --git a/group06/949319266/src/com/coding/basic/List.java b/group06/949319266/src/com/coding/basic/List.java new file mode 100644 index 0000000000..7ce0b8cb1d --- /dev/null +++ b/group06/949319266/src/com/coding/basic/List.java @@ -0,0 +1,13 @@ +package com.coding.basic; + + +public interface List { + public void add(E e); + public void add(int index, E e); + //public E get(int index); + public void remove(int index); + public boolean contains(E e); + public int size(); + public boolean isEmpty(); + public void clear(); +} diff --git a/group06/949319266/src/com/coding/basic/Queue.java b/group06/949319266/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..18944b491b --- /dev/null +++ b/group06/949319266/src/com/coding/basic/Queue.java @@ -0,0 +1,52 @@ +package com.coding.basic; + +import java.util.ArrayList; + +public class Queue { + E[] element; + //Ϊ˲ԷʱΪ5 + private static final int DEFAULT_SIZE=5; + int front,rear;//ֱΪ׺Ͷβ± + + public Queue() { + this(DEFAULT_SIZE); + } + public Queue(int size) { + element = (E[])(new Object[size]); + front = 0; + rear = 0; + } + + public void enQueue(E e){ + if(((rear+1)%element.length) == front) { + System.out.println("޷"); + } else { + element[rear] = e; + rear=(rear+1)%element.length; + } + } + + public E deQueue(){ + if(rear == front) { + return null; + } else { + E e = element[front]; + front = (front + 1)%element.length; + return e; + } + + } + + public boolean isEmpty(){ + return rear == front; + } + + public int size(){ + if(rear > front){ + return rear-front; + } else { + return (element.length+1)-(front-rear); + } + } + +} diff --git a/group06/949319266/src/com/coding/basic/Stack.java b/group06/949319266/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..0db104bc09 --- /dev/null +++ b/group06/949319266/src/com/coding/basic/Stack.java @@ -0,0 +1,36 @@ +package com.coding.basic; + +import java.util.ArrayList; + +public class Stack { + private ArrayList element; + int top; + public Stack() { + element = new ArrayList(); + top = 0; + } + + public void push(Object o){ + element.add(o); + top++; + } + + public void pop(){ + if(isEmpty()) { + System.out.println("ջǿյ"); + System.exit(0); + } + element.remove(top-1); + top--; + } + + public Object peek(){ + return element.get(top-1); + } + public boolean isEmpty(){ + return top == 0?true:false; + } + public int size(){ + return top; + } +} diff --git a/group06/949319266/src/com/coding/basic/test/ArrayListTest.java b/group06/949319266/src/com/coding/basic/test/ArrayListTest.java new file mode 100644 index 0000000000..47456a46fb --- /dev/null +++ b/group06/949319266/src/com/coding/basic/test/ArrayListTest.java @@ -0,0 +1,39 @@ +package com.coding.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.coding.basic.ArrayList; + +public class ArrayListTest { + + @Test + public void test() { + ArrayList list = new ArrayList(); + + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + + System.out.println("±Ϊ3ԪΪ"+list.get(3)); + System.out.println("鳤"+list.size()); + list.remove(2); + System.out.println("remove鳤"+list.size()); + + for(int i = 0; i < list.size() ; i++) { + System.out.print(list.get(i)+","); + } + list.add(3, "g"); + System.out.println(""); + System.out.println("Ϊ"); + + for(int i = 0; i < list.size() ; i++) { + System.out.print(list.get(i)+","); + } + + + } + +} diff --git a/group06/949319266/src/com/coding/basic/test/LinkedListTest.java b/group06/949319266/src/com/coding/basic/test/LinkedListTest.java new file mode 100644 index 0000000000..0d33b47867 --- /dev/null +++ b/group06/949319266/src/com/coding/basic/test/LinkedListTest.java @@ -0,0 +1,24 @@ +package com.coding.basic.test; + +import static org.junit.Assert.*; + +import java.util.Iterator; + +import org.junit.Test; + +import com.coding.basic.LinkedList; + +public class LinkedListTest { + + @Test + public void test() { + LinkedList list = new LinkedList(); + list.add("First"); + list.add("Second"); + list.add("Thrid"); + for(int i = 0; i < list.size(); i++) { + System.out.print(list.get(i)+ " "); + } + + } +} diff --git a/group06/949319266/src/com/coding/basic/test/QueueTest.java b/group06/949319266/src/com/coding/basic/test/QueueTest.java new file mode 100644 index 0000000000..74e4c99a9a --- /dev/null +++ b/group06/949319266/src/com/coding/basic/test/QueueTest.java @@ -0,0 +1,28 @@ +package com.coding.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.coding.basic.Queue; + +public class QueueTest { + + @Test + public void test() { + Queue qu = new Queue(); + qu.enQueue("gong"); + qu.enQueue("bo"); + qu.enQueue("jie"); + System.out.println(qu.size()); + qu.deQueue(); + System.out.println(qu.size()); + System.out.println(qu.isEmpty()); + qu.enQueue("gong"); + qu.enQueue("bo"); + qu.deQueue(); + qu.enQueue("jie"); + System.out.println(qu.size()); + } + +} diff --git a/group06/949319266/src/com/coding/basic/test/StackTest.java b/group06/949319266/src/com/coding/basic/test/StackTest.java new file mode 100644 index 0000000000..8e70d7c93c --- /dev/null +++ b/group06/949319266/src/com/coding/basic/test/StackTest.java @@ -0,0 +1,26 @@ +package com.coding.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.coding.basic.Stack; + +public class StackTest { + + @Test + public void test() { + Stack s = new Stack(); + s.push("gong"); + s.push("bo"); + s.push("jie"); + s.push("hao"); + s.push("ren"); + System.out.println(s.size()); + System.out.println(s.peek()); + s.pop(); + System.out.println(s.size()); + System.out.println(s.peek()); + } + +} diff --git "a/group06/949319266/\346\226\207\347\253\240.txt" "b/group06/949319266/\346\226\207\347\253\240.txt" new file mode 100644 index 0000000000..f00eb98185 --- /dev/null +++ "b/group06/949319266/\346\226\207\347\253\240.txt" @@ -0,0 +1 @@ +http://blog.sina.com.cn/s/blog_c20b18280102x31y.html \ No newline at end of file diff --git a/group06/group06.md b/group06/group06.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group06/group06.md @@ -0,0 +1 @@ + diff --git "a/group07/1046545622/git\345\221\275\344\273\244.txt" "b/group07/1046545622/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/1046545622/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/1058267830/week1/.classpath b/group07/1058267830/week1/.classpath new file mode 100644 index 0000000000..91c6d8f6c5 --- /dev/null +++ b/group07/1058267830/week1/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group07/1058267830/week1/.project b/group07/1058267830/week1/.project new file mode 100644 index 0000000000..d3e8bd8c59 --- /dev/null +++ b/group07/1058267830/week1/.project @@ -0,0 +1,17 @@ + + + week1 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group07/1058267830/week1/.settings/org.eclipse.jdt.core.prefs b/group07/1058267830/week1/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group07/1058267830/week1/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group07/1058267830/week1/src/com/coding/basic/ArrayList.java b/group07/1058267830/week1/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..8d05511d8a --- /dev/null +++ b/group07/1058267830/week1/src/com/coding/basic/ArrayList.java @@ -0,0 +1,108 @@ +package com.coding.basic; + +public class ArrayList implements List, Iterator { + + private Object[] obj ; + private int length; // 数组总长度 + private int size; // 元素个数 + private int currentIndex; // 当前索引位置,默认为-1 + + public int getLength() { + return length; + } + + public ArrayList(){ + this.obj = new Object[10]; + this.length = 10; + this.size = 0; + this.currentIndex = -1; + } + + public ArrayList(int initSize){ + this.obj = new Object[initSize]; + this.length = initSize; + this.size = 0; + this.currentIndex = -1; + } + + @Override + public void add(Object o) { + if(this.size < length){ + obj[size] = o; + this.size++; + + }else{ + // 扩容,add数据 + Object[] obj1 = new Object[length * 2]; + System.arraycopy(obj, 0, obj1, 0, length); + this.length = this.length * 2; + this.obj = obj1; + obj[this.size] = o; + this.size++; + } + } + + @Override + public void add(int index, Object o) { + if(index < length){ + // 容量扩1,add数据 + Object[] obj1 = new Object[length + 1]; + System.arraycopy(obj, 0, obj1, 0, index); + System.arraycopy(obj, index, obj1, index+1, length-index); + obj1[index] = o; + this.obj = obj1; + this.length++; + this.size++; + }else{ + // 容量扩到index+1, add数据 + Object[] obj1 = new Object[index + 1]; + System.arraycopy(obj, 0, obj1, 0, length); + obj1[index] = o; + this.obj = obj1; + this.length = index + 1; + this.size++; + } + } + + @Override + public Object get(int index) { + if(index >= length) + throw new RuntimeException("数组越界了..."); + return this.obj[index]; + } + + @Override + public Object remove(int index) { + if(index >= length) + throw new RuntimeException("数组越界了..."); + Object tmp = obj[index];// 取值,最后返回 + Object[] obj1 = new Object[length -1]; + System.arraycopy(obj, 0, obj1, 0, index); + System.arraycopy(obj, index+1, obj1, index, length-index-1); + this.obj = obj1; + this.length--; + this.size--; + return tmp; + } + + @Override + public int size() { + return this.size; + } + + @Override + public boolean hasNext() { + if(currentIndex == length-1){ + return false; + }else{ + currentIndex++; + return true; + } + } + + @Override + public Object next() { + return this.get(currentIndex); + } + +} diff --git a/group07/1058267830/week1/src/com/coding/basic/BinaryTree.java b/group07/1058267830/week1/src/com/coding/basic/BinaryTree.java new file mode 100644 index 0000000000..e326a21f75 --- /dev/null +++ b/group07/1058267830/week1/src/com/coding/basic/BinaryTree.java @@ -0,0 +1,78 @@ +package com.coding.basic; + +public class BinaryTree { + private BinaryTreeNode root; // 根节点 + public BinaryTree( ){ + BinaryTreeNode node = new BinaryTreeNode(); + this.root = node; + } + + public boolean isEmpty(){ + return this.root == null; + } + + public void insert(Object o){ + // 如果是第一次添加节点,就是root节点 + if(root.data == null){ + BinaryTreeNode bnode = new BinaryTreeNode(o, null, null); + root = bnode; + }else{ + insert(o, root); + } + } + + // 递归添加非root节点 + private BinaryTreeNode insert(Object o, BinaryTreeNode node) { + if(node == null){ + BinaryTreeNode bnode = new BinaryTreeNode(o, null, null); + return bnode; + } + if((int)o <= (int)node.data){ + node.left = insert(o, node.left); + }else{ + node.right = insert(o, node.right); + } + + return node; + } + + // 中序遍历 + public void middlePrint(){ + middleOrder(this.root); + } + + private void middleOrder(BinaryTreeNode node) { + if(node != null){ + middleOrder(node.left); + System.out.print(node.data + " "); + middleOrder(node.right); + } + } + + // 前序遍历 + public void prePrint(){ + preOrder(this.root); + } + + private void preOrder(BinaryTreeNode node) { + if(node != null){ + System.out.print(node.data + " "); + preOrder(node.left); + preOrder(node.right); + } + } + + // 后序遍历 + public void postPrint(){ + postOrder(this.root); + } + + private void postOrder(BinaryTreeNode node) { + if(node != null){ + postOrder(node.right); + System.out.print(node.data + " "); + postOrder(node.left); + } + } + +} diff --git a/group07/1058267830/week1/src/com/coding/basic/BinaryTreeNode.java b/group07/1058267830/week1/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..a9e6593160 --- /dev/null +++ b/group07/1058267830/week1/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,16 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + protected Object data; + protected BinaryTreeNode left; + protected BinaryTreeNode right; + + public BinaryTreeNode(){} + public BinaryTreeNode(Object data, BinaryTreeNode left, BinaryTreeNode right){ + this.data = data; + this.left = left; + this.right = right; + } + +} diff --git a/group07/1058267830/week1/src/com/coding/basic/Iterator.java b/group07/1058267830/week1/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..d369bbc50c --- /dev/null +++ b/group07/1058267830/week1/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public interface Iterator { + + public boolean hasNext(); + + public Object next(); +} diff --git a/group07/1058267830/week1/src/com/coding/basic/LinkedList.java b/group07/1058267830/week1/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..df65b13601 --- /dev/null +++ b/group07/1058267830/week1/src/com/coding/basic/LinkedList.java @@ -0,0 +1,97 @@ +package com.coding.basic; + +public class LinkedList implements List, Iterator{ + private Node head; + private Node tail; + private Node currentNode; + private int size; + + public LinkedList(){ + this.head = new Node(null); + this.tail = head; + this.currentNode = head; + this.size = 0; + } + + @Override + public void add(Object o) { + Node node = new Node(o, null); + tail.setNext(node); + tail = node; + size++; + } + + @Override + public void add(int index, Object o) { + if(index < 0 || index > size+1){ + throw new RuntimeException("插入的位置错误..."); + } + Node pre = head; // 得到待插入位置的前一个节点 + for(int i=0; i= size){ + throw new RuntimeException("index参数错误..."); + } + Node node = head; // 得到待插入位置的前一个节点 + for(int i=0; i<=index; i++){ + node = node.getNext(); + } + return node; + } + + @Override + public Object remove(int index) { + if(index < 0 || index >= size){ + throw new RuntimeException("index参数错误..."); + } + Node pre = head; // 得到待删除位置的前一个节点 + for(int i=0; i + + + + + + + diff --git a/group07/1058267830/week2/.project b/group07/1058267830/week2/.project new file mode 100644 index 0000000000..5b537d7055 --- /dev/null +++ b/group07/1058267830/week2/.project @@ -0,0 +1,17 @@ + + + week2 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group07/1058267830/week2/.settings/org.eclipse.jdt.core.prefs b/group07/1058267830/week2/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group07/1058267830/week2/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group07/1058267830/week2/bin/com/coderising/litestruts/struts.xml b/group07/1058267830/week2/bin/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group07/1058267830/week2/bin/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group07/1058267830/week2/src/com/coderising/array/ArrayTest.java b/group07/1058267830/week2/src/com/coderising/array/ArrayTest.java new file mode 100644 index 0000000000..954ebf54a3 --- /dev/null +++ b/group07/1058267830/week2/src/com/coderising/array/ArrayTest.java @@ -0,0 +1,77 @@ +package com.coderising.array; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class ArrayTest { + ArrayUtil util = new ArrayUtil(); + + @Test + public void testReverseArray() { + int[] origin = {1,2,3,4,53,52,4,2,423}; + int[] target = util.reverseArray(origin); + int[] expecteds = {423, 2, 4, 52, 53, 4, 3, 2, 1}; + assertArrayEquals(expecteds, target); + } + + @Test + public void testRemoveZero(){ + int[] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] target = util.removeZero(oldArray); + int[] expecteds = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }; + assertArrayEquals(expecteds, target); + } + + @Test + public void testMerger(){ + int[] a1 = {3, 5, 7,8}; + int[] a2 = {4, 5, 6,7}; + int[] target = util.merge(a1, a2); + int[] expecteds = {3, 4, 5, 6, 7, 8 }; + assertArrayEquals(expecteds, target); + } + + @Test + public void testGrow(){ + int[] oldArray = {3, 5,7,8}; + int[] target = util.grow(oldArray, 4); + int[] expecteds = {3, 5,7,8, 0, 0, 0,0 }; + assertArrayEquals(expecteds, target); + } + + @Test + public void testFibonacci(){ + int[] target = util.fibonacci(15); + + //int[] expecteds = {1,1}; + int[] expecteds = {1, 1, 2, 3, 5, 8, 13 }; + assertArrayEquals(expecteds, target); + } + + @Test + public void testGetPrimes(){ + int[] target = util.getPrimes(25); + int[] expecteds = {2, 3, 5, 7, 11, 13, 17, 19, 23 }; + assertArrayEquals(expecteds, target); +// for(int i=0; i set = new HashSet(); + for(int i=0; i it = set.iterator(); + while(it.hasNext()){ + target[i++] = it.next(); + } + return target; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + if(oldArray == null) + return null; + if(size == 0) + return oldArray; + if(size < 0) + throw new RuntimeException("参数错误"); + int length = oldArray.length + size; + int[] target = new int[length]; + System.arraycopy(oldArray, 0, target, 0, oldArray.length); + for(int i=oldArray.length; i< length; i++){ + target[i] = 0; + } + return target; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if(max < 1) + throw new RuntimeException("参数错误"); + if(max == 1){ + int[] result = {}; + return result; + } + if(max == 2){ + int[] result = {1, 1}; + return result; + } + List list = new ArrayList(); + list.add(1); + list.add(1); + for(int i=2; ; i++){ + int tmp = list.get(i-2) + list.get(i-1); + if(tmp < max){ + list.add(tmp); + }else{ + break; + } + } + int size = list.size(); + int[] result = new int[size]; + for(int i=0; i= max) + break; + } + int[] result = new int[index]; + System.arraycopy(tmp, 0, result, 0, index); + return result; + } + + List list = new ArrayList(); + list.add(2); + list.add(3); + list.add(5); + list.add(7); + list.add(11); + for(int i=13; i list = new ArrayList(); + for(int input = 2; input list = root.elements("action"); + for(Element action_element : list) { + //获取元素action的属性 + if("logout".equals(action_element.attributeValue("name"))){ + System.out.print("action name=" + action_element.attributeValue("name") + " "); + System.out.print("class=" + action_element.attributeValue("class")); + System.out.println(); + + //遍历元素action下所有的result元素 + for(Element rusult_element : (List)action_element.elements("result")) { + //获取元素result的属性 + System.out.print("result name=" + rusult_element.attributeValue("name") + " "); + System.out.println("value=" + rusult_element.getText() ); + } + } + } + } + +} diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/LoginAction.java b/group07/1058267830/week2/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group07/1058267830/week2/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/Struts.java b/group07/1058267830/week2/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..195a63bc8f --- /dev/null +++ b/group07/1058267830/week2/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,64 @@ +package com.coderising.litestruts; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + +public class Struts { + + @SuppressWarnings("unchecked") + public static View runAction(String actionName, Map parameters) throws Exception{ + + Class viewClass = Class.forName("com.coderising.litestruts.View"); + View view = (View)viewClass.newInstance(); + + SAXReader saxReader = new SAXReader(); + Document doc = saxReader.read("src/com/coderising/litestruts/struts.xml"); + Element root = doc.getRootElement(); + List list = root.elements("action"); + for(Element action_element : list) { + if(actionName.equals(action_element.attributeValue("name"))){ + String className = action_element.attributeValue("class"); + Class clazz = Class.forName(className); + LoginAction la = (LoginAction)clazz.newInstance(); + Class clazz1 = la.getClass(); + + if(parameters.containsKey("name")){ + Method m1 = clazz1.getDeclaredMethod("setName", String.class); + m1.invoke(la, parameters.get("name")); + } + if(parameters.containsKey("password")){ + Method m2 = clazz1.getDeclaredMethod("setPassword", String.class); + m2.invoke(la, parameters.get("password")); + } + + Method m3 = clazz1.getDeclaredMethod("execute"); + String result = (String)m3.invoke(la); + Map map = new HashMap(); + // 这里没有通过反射,后续要改正成反射 + map.put("name", la.getName()); + map.put("password", la.getPassword()); + map.put("message", la.getMessage()); + + view.setParameters(map); + + + for(Element rusult_element : (List)action_element.elements("result")) { + if(result != null && result.equals(rusult_element.attributeValue("name"))){ + view.setJsp(rusult_element.getText()); + break; + } + } + break; + } + } + return view; + } + +} diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/StrutsTest.java b/group07/1058267830/week2/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..cb1be91034 --- /dev/null +++ b/group07/1058267830/week2/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,41 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws Exception { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/View.java b/group07/1058267830/week2/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group07/1058267830/week2/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group07/1058267830/week2/src/com/coderising/litestruts/struts.xml b/group07/1058267830/week2/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group07/1058267830/week2/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git "a/group07/1070440331/git\345\221\275\344\273\244.txt" "b/group07/1070440331/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/1070440331/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/1280157271/20170224-01-ArrayList/.classpath b/group07/1280157271/20170224-01-ArrayList/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group07/1280157271/20170224-01-ArrayList/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group07/1280157271/20170224-01-ArrayList/.gitignore b/group07/1280157271/20170224-01-ArrayList/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group07/1280157271/20170224-01-ArrayList/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group07/1280157271/20170224-01-ArrayList/.project b/group07/1280157271/20170224-01-ArrayList/.project new file mode 100644 index 0000000000..4c0107dd15 --- /dev/null +++ b/group07/1280157271/20170224-01-ArrayList/.project @@ -0,0 +1,17 @@ + + + 20170224-01-ArrayList + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group07/1280157271/20170224-01-ArrayList/.settings/org.eclipse.jdt.core.prefs b/group07/1280157271/20170224-01-ArrayList/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group07/1280157271/20170224-01-ArrayList/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/List.java b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/List.java new file mode 100644 index 0000000000..6eb3636be5 --- /dev/null +++ b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/List.java @@ -0,0 +1,9 @@ +package firstHomework.fan; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myArrayList.java b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myArrayList.java new file mode 100644 index 0000000000..bd39bfca4e --- /dev/null +++ b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myArrayList.java @@ -0,0 +1,60 @@ +package firstHomework.fan; + +public class myArrayList implements List { + + private int size = 0; + private int initLength=10; + private Object[] elementData = new Object[initLength]; + + public void add(Object o){ + ensureCapacity(size+1); + elementData[size++] = o; + } + + public void add(int index, Object o){ + ensureCapacity(size+1); + if(index<0||index>size){ + System.out.println("indexӦ0-size֮䣡"); + }else{ + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + } + } + + public Object get(int index){ + if(index<0||index>size){ + System.out.println("indexӦ0-size֮䣡"); + }else{ + return elementData[index]; + } + return null; + } + + public Object remove(int index){ + if(index<0||index>size){ + System.out.println("indexӦ0-size֮䣡"); + return null; + } + Object obj = get(index); + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + size--; + return obj; + } + + public int size(){ + return this.size; + } + + + + public void ensureCapacity(int x){ + int oldCapacity = elementData.length; + if(x>oldCapacity){ + Object newEle[] = new Object[oldCapacity+initLength]; + System.arraycopy(elementData, 0, newEle, 0, size); + elementData = newEle; + } + } + +} diff --git a/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myBinaryTreeNode.java b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myBinaryTreeNode.java new file mode 100644 index 0000000000..f523215a87 --- /dev/null +++ b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myBinaryTreeNode.java @@ -0,0 +1,68 @@ +package firstHomework.fan; +import java.util.Comparator; + +public class myBinaryTreeNode { + + private int data; + private myBinaryTreeNode left; + private myBinaryTreeNode right; + + //캯 + public myBinaryTreeNode(){ + } + public myBinaryTreeNode(int value){ + this.data = value; + this.left = null; + this.right = null; + } + public myBinaryTreeNode(int value,myBinaryTreeNode left,myBinaryTreeNode right){ + this.data = value; + this.left = left; + this.right = right; + } + private myBinaryTreeNode root;//ڵ + + //get/set + public Object getData() { + return data; + } + public void setData(int data) { + this.data = data; + } + + + public myBinaryTreeNode getLeft() { + return left; + } + public void setLeft(myBinaryTreeNode left) { + this.left = left; + } + + + public myBinaryTreeNode getRight() { + return right; + } + public void setRight(myBinaryTreeNode right) { + this.right = right; + } + + + public void insert(int o){ + this.root = insert(o,this.root); + + } + public myBinaryTreeNode insert(int value,myBinaryTreeNode t){ + if(t == null){//ڵΪ + return new myBinaryTreeNode(value); + } + //ֵ뵱ǰڵȽϣСڲ뵽ڲ뵽 + if(valuet.data){ + t.right = insert(value,t.right); + } + return t; + } + +} \ No newline at end of file diff --git a/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myLinkedList.java b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myLinkedList.java new file mode 100644 index 0000000000..da481e0232 --- /dev/null +++ b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myLinkedList.java @@ -0,0 +1,129 @@ +package firstHomework.fan; + + + +public class myLinkedList implements List { + private static class Node{//Ľڵṹ + Object data;// + Node next; //Nodeã൱ָ룬ָһڵ + + Node(Object e, Node next) { + this.data = e; + this.next = next; + } + } + + private Node head,last=null;//ֱָһһڵ + private int size; + + + public void add(Object o){//βӣ൱βڵ + creatLastNode(o); + } + public void add(int index , Object o){//indexǰ + if(index == 0){//˵λΪ0ôͷ + createFirstNode(o); + }else{//ȥҵָλ + Node indexBeforeNode = getNode(index-1);//ﷵصindexǰһڵ + Node newIndex =new Node(o,indexBeforeNode.next) ;//x½ڵ㱣indexBeforeָ + indexBeforeNode.next = newIndex; + size++; + } + } + public Object get(int index){ + return getNode(index).data;//صǽڵеݶ + } + + public Object remove(int index){ + if(index==0){//Ƴͷ + removeFirst(); + }else{//ҵָڵǰһڵ + Node removeNode = getNode(index-1); + removeNode.next = removeNode.next.next;//Ƴindex + size--; + return removeNode.next.data;//Ƴڵݶ + } + return null; + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + createFirstNode(o); + } + public void addLast(Object o){ + creatLastNode(o); + } + public Object removeFirst(){ + if(size>0){//бΪգһͷ + Node removeHead = head; + head = head.next; + size--; + return removeHead.data;//ͷݶ + }else{ + System.out.println("Ϊգ"); + } + return null; + } + public Object removeLast(){ + if(size>0){ + Node removeLastBefore = getNode(size-2);//ҵlastڵһڵ + Object returnObj = removeLastBefore.next.data; + removeLastBefore.next = null; + last = removeLastBefore; + size--; + return returnObj; + }else{ + System.out.println("Ϊգ"); + } + return null; + } + + /* + * ͷ + * */ + private void createFirstNode(Object e){ + Node oldHead = head; + Node newHead = new Node(e,oldHead);//ĽڵΪheadڵǰһڵ + head = newHead;//ܿղգheadҪָµͷڵ + if(head == null){//Ϊգheadlastָ½ڵ㣨ΪlastͲҸֵΪȷģ + last = newHead; + }else{//ͷѾ,½ڵΪͷ㣬ԭheadڶlastָlast + newHead.next = head; + } + size++; + } + /* + * β + * */ + private void creatLastNode(Object e){ + Node oldLast = last; + Node newLast = new Node(e,null);//µβڵһڵΪ + last = newLast;//ܿղգlastҪָµβڵ + if(head == null){//Ϊ + head = newLast; + }else{ + oldLast.next = newLast; + } + size++; + } + /* + * Ѱָ + * */ + private Node getNode(int index){ + if(index<0||index>=size){ + System.out.println("indexԽ磡"); + }else{ + Node node=head; + while(index != 0){ + node = node.next; + index--; + } + return node; + } + return null; + } + +} diff --git a/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myQueue.java b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myQueue.java new file mode 100644 index 0000000000..041da7e29b --- /dev/null +++ b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myQueue.java @@ -0,0 +1,51 @@ +package firstHomework.fan; + +public class myQueue { + private int iniLength = 10; + private Object[] array = new Object[iniLength]; + private int size = 0; + + public void enQueue(Object o){ + if(size>=array.length){//Ҫ + Object[] newArray = new Object[iniLength+array.length];//arrayԭټ10 + System.arraycopy(array, 0, newArray, 0, size); + array = newArray; + } + array[size++] = o; + } + + public Object deQueue(){//ƳһԪأԪǰλ + Object deQueue = array[0]; + System.arraycopy(array, 1, array, 0, size-1); + size--; + return deQueue; + + } + + public boolean isEmpty(){ + return size==0; + } + + public int size(){ + return this.size; + } + public static void main(String[] args) { + myQueue queue = new myQueue(); + queue.enQueue("A"); + queue.enQueue("B"); + queue.enQueue("C"); + + queue.enQueue("D"); + queue.enQueue("E"); + queue.enQueue("F"); + queue.enQueue("G"); + + while(!queue.isEmpty()){ + System.out.println(queue.deQueue());// + } + + } + + + +} diff --git a/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myStack.java b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myStack.java new file mode 100644 index 0000000000..623bbe787f --- /dev/null +++ b/group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myStack.java @@ -0,0 +1,31 @@ +package firstHomework.fan; + + + +public class myStack { + private myArrayList array = new myArrayList();//myArrayListи̬ + + public void push(Object o){ //ջ + //ȲʱmyArrayListԼ + array.add(o);//¶ + } + + public Object pop(){//ջβϵԪأ Ҫɾ + Object pop = array.get(array.size()-1);//±ҪsizeС1 + array.remove(array.size()-1); + return pop; + } + + public Object peek(){//ֻǵջֵɾ + return array.get(array.size()-1); + } + public boolean isEmpty(){ + return array.size()==0; + } + public int size(){ + return array.size(); + } + + +} + diff --git "a/group07/1280157271/git\345\221\275\344\273\244.txt" "b/group07/1280157271/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/1280157271/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git "a/group07/1280157271/\347\254\254\344\270\200\346\254\241\345\215\232\345\256\242\345\234\260\345\235\200--CPU \345\206\205\345\255\230 \347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273 .txt" "b/group07/1280157271/\347\254\254\344\270\200\346\254\241\345\215\232\345\256\242\345\234\260\345\235\200--CPU \345\206\205\345\255\230 \347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273 .txt" new file mode 100644 index 0000000000..1e19f6adda --- /dev/null +++ "b/group07/1280157271/\347\254\254\344\270\200\346\254\241\345\215\232\345\256\242\345\234\260\345\235\200--CPU \345\206\205\345\255\230 \347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273 .txt" @@ -0,0 +1 @@ +http://blog.csdn.net/stromcloud/article/details/56678442 \ No newline at end of file diff --git a/group07/1448276993/JavaStudy/.classpath b/group07/1448276993/JavaStudy/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group07/1448276993/JavaStudy/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group07/1448276993/JavaStudy/.gitignore b/group07/1448276993/JavaStudy/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group07/1448276993/JavaStudy/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group07/1448276993/JavaStudy/.project b/group07/1448276993/JavaStudy/.project new file mode 100644 index 0000000000..cab7f7f249 --- /dev/null +++ b/group07/1448276993/JavaStudy/.project @@ -0,0 +1,17 @@ + + + JavaStudy + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group07/1448276993/JavaStudy/.settings/org.eclipse.jdt.core.prefs b/group07/1448276993/JavaStudy/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group07/1448276993/JavaStudy/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group07/1448276993/JavaStudy/src/java1/ArrayList.java b/group07/1448276993/JavaStudy/src/java1/ArrayList.java new file mode 100644 index 0000000000..8623c3ae75 --- /dev/null +++ b/group07/1448276993/JavaStudy/src/java1/ArrayList.java @@ -0,0 +1,57 @@ +package java1; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + ensureCapacity(size+1); + elementData[size++]=o; + + } + public void add(int index, Object o){ + ensureCapacity(size+1); + if(index<0&&index>size){ + System.out.println("Wrong Input"); + }else{ + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index]=o; + size++; + } + + } + + public Object get(int index){ + if(index<0&&index>size){ + System.out.println("Wrong Input"); + return null; + } + return elementData[index]; + } + + public Object remove(int index){ + if(index<0&&index>size){ + System.out.println("Wrong Input"); + return null; + } + Object a=elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + return a; + } + + public int size(){ + return this.size; + } + + public void ensureCapacity(int size){ + int oldCapacity=elementData.length; + if(size>oldCapacity){ + Object[] newelementData=new Object[size+oldCapacity]; + elementData=newelementData; + } + } + +} + diff --git a/group07/1448276993/JavaStudy/src/java1/LinkedList.java b/group07/1448276993/JavaStudy/src/java1/LinkedList.java new file mode 100644 index 0000000000..45df3db8bc --- /dev/null +++ b/group07/1448276993/JavaStudy/src/java1/LinkedList.java @@ -0,0 +1,129 @@ +package java1; + +public class LinkedList implements List { + + private Node head=null; + private Node last=null; + private int size=0; + + public void add(Object o){ + Node newNode = new Node(o,null); + if(head==null){ + head = newNode; + last = newNode; + }else{ + addLast(o); + } + size++; + } + public void add(int index , Object o){ + if(index<0&&index>size+1){ + System.out.println("Wrong Input!"); + } + Node newNode = new Node(o,null); + if(index==0){ + addFirst(o); + }else if(index==size){ + addLast(o); + }else{ + Node a=head; + for(int i=0;ioldCapacity){ + Object[] newelementData=new Object[size+oldCapacity]; + str=newelementData; + } + } +} diff --git a/group07/1448276993/JavaStudy/src/java1/Stack.java b/group07/1448276993/JavaStudy/src/java1/Stack.java new file mode 100644 index 0000000000..9b785e48d9 --- /dev/null +++ b/group07/1448276993/JavaStudy/src/java1/Stack.java @@ -0,0 +1,34 @@ +package java1; + +public class Stack { + private ArrayList array = new ArrayList(); + + public void push(Object o){ + array.add(o); + } + + public Object pop(){ + if(array.size()>0){ + Object pop = array.get(array.size()-1); + array.remove(array.size()-1); + return pop; + } + return null; + } + + public Object peek(){ + if(array.size()>0){ + return array.get(array.size()-1); + } + return null; + } + public boolean isEmpty(){ + if(array.size()==0){ + return true; + } + return false; + } + public int size(){ + return array.size(); + } +} diff --git "a/group07/1448276993/git\345\221\275\344\273\244.txt" "b/group07/1448276993/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/1448276993/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/1519504320/.classpath b/group07/1519504320/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group07/1519504320/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group07/1519504320/.gitignore b/group07/1519504320/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group07/1519504320/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group07/1519504320/.project b/group07/1519504320/.project new file mode 100644 index 0000000000..d6fb07be83 --- /dev/null +++ b/group07/1519504320/.project @@ -0,0 +1,17 @@ + + + 1519504320Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git "a/group07/1519504320/git\345\221\275\344\273\244.txt" "b/group07/1519504320/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/1519504320/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/1519504320/src/coderising/array/ArrayUtil.java b/group07/1519504320/src/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..5caa3d54b7 --- /dev/null +++ b/group07/1519504320/src/coderising/array/ArrayUtil.java @@ -0,0 +1,224 @@ +package coderising.array; + +import java.util.Arrays; + +public class ArrayUtil { + + public static void main(String[] args) { + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7, 9, 10}; + ArrayUtil aa = new ArrayUtil(); + int[] o = aa.merge(a1, a2); + for (int i = 0; i < o.length; i++) { + System.out.println(o[i]); + } + + } + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int[] temp = new int[origin.length]; + for (int i = origin.length - 1; i >= 0; i--) { + temp[origin.length - 1 - i] = origin[i]; + } + for (int i = 0; i < origin.length; i++) { + origin[i] = temp[i]; + } + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int[] result; + int zeroNumber = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) { + zeroNumber++; + } + } + result = new int[oldArray.length - zeroNumber]; + for (int i = 0, j = 0; j < result.length; i++) { + if (oldArray[i] != 0) { + result[j] = oldArray[i]; + j++; + } + } + return result; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int[] result = Arrays.copyOf(array1, array1.length); + outer: + for (int i = 0; i < array2.length; i++) { + for (int j = 0; j < array1.length; j++) { + if (array1[j] == array2[i]) { + continue outer; + } + } + result = Arrays.copyOf(result, result.length + 1); + result[result.length - 1] = array2[i]; + } + + for (int i = 0; i < result.length - 1; i++) { + for (int j = 0; j < result.length - i - 1; j++) { + if (result[j] > result[j+1]) { + int temp = result[j]; + result[j] = result[j+1]; + result[j+1] = temp; + } + } + } + + + return result; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] result = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + result[i] = oldArray[i]; + } + for (int i = oldArray.length; i < result.length; i++) { + result[i] = 0; + } + return result; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + int[] initial = new int[]{1, 1}; + if (max == 1) { + return new int[1]; + } else { + while (max > initial[initial.length - 1] + initial[initial.length - 2]) { + initial = addOne(initial); + } + } + return initial; + } + + public int[] addOne(int[] current) { + int[] result = Arrays.copyOf(current, current.length + 1); + result[current.length] = result[current.length - 1] + result[current.length - 2]; + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int[] result = new int[1]; + outer: + for (int i = 2; i < max; i++) { + for (int j = 2; j < i; j++) { + if (i % j == 0) { + continue outer; + } + } + if (result.length == 1 && result[0] == 0) { + result[0] = i; + } else { + result = Arrays.copyOf(result, result.length + 1); + result[result.length - 1] = i; + } + } + return result; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int[] result = new int[1]; + for (int i = 1; i < max; i++) { + int sum = 0; + for (int j = 1; j < i; j++) { + if (i % j == 0) { + sum += j; + } + } + if (sum == i) { + if (result.length == 1 && result[0] == 0) { + result[0] = i; + } else { + result = Arrays.copyOf(result, result.length + 1); + result[result.length - 1] = i; + } + } + } + return result; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param + * @return + */ + public String join(int[] array, String seperator) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < array.length; i++) { + if (i == array.length - 1) { + sb.append(array[i]); + } else { + sb.append(array[i]); + sb.append(seperator); + } + } + return sb.toString(); + } + + +} \ No newline at end of file diff --git a/group07/1519504320/src/coderising/litestruts/LoginAction.java b/group07/1519504320/src/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..c528df798a --- /dev/null +++ b/group07/1519504320/src/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group07/1519504320/src/coderising/litestruts/Struts.java b/group07/1519504320/src/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..22b7a291b4 --- /dev/null +++ b/group07/1519504320/src/coderising/litestruts/Struts.java @@ -0,0 +1,106 @@ +package coderising.litestruts; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class Struts { + public static void main(String[] args) { + runAction("login", null); + } + + public static View runAction(String actionName, Map parameters) { + String className = " "; + View view = new View(); + Map map = new HashMap<>(); + String result = " "; + + SAXReader reader = new SAXReader(); + Document document = null; + try { + document = reader.read(new File("src\\coderising\\litestruts\\struts.xml")); + } catch (DocumentException e) { + e.printStackTrace(); + } + Element root = document.getRootElement(); + List eles = root.elements(); + for (Element e : eles) { + if (e.attribute("name").getValue().equals(actionName)) { + className = e.attribute("class").getValue(); + } + } + + try { + Class clz = Class.forName(className); + Object obj = clz.newInstance(); + Method method = clz.getDeclaredMethod("setName",String.class); + method.invoke(obj, parameters.get("name")); + method = clz.getDeclaredMethod("setPassword",String.class); + method.invoke(obj, parameters.get("password")); + method = clz.getDeclaredMethod("execute"); + result = (String) method.invoke(obj); + method = clz.getDeclaredMethod("getMessage"); + map.put("message", (String) method.invoke(obj)); + method = clz.getDeclaredMethod("getName"); + map.put("name", (String) method.invoke(obj)); + method = clz.getDeclaredMethod("getPassword"); + map.put("password", (String) method.invoke(obj)); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + view.setParameters(map); + for (Element e : eles) { + if (e.attribute("name").getValue().equals(actionName)) { + List ele_subs = e.elements(); + for (Element e_sub : ele_subs) { + if (e_sub.attribute("name").getValue().equals(result)) { + view.setJsp(e_sub.getTextTrim()); + } + } + } + } + + + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return view; + } + +} diff --git a/group07/1519504320/src/coderising/litestruts/StrutsTest.java b/group07/1519504320/src/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..257f3d5a89 --- /dev/null +++ b/group07/1519504320/src/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group07/1519504320/src/coderising/litestruts/View.java b/group07/1519504320/src/coderising/litestruts/View.java new file mode 100644 index 0000000000..22fdf877d8 --- /dev/null +++ b/group07/1519504320/src/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group07/1519504320/src/coderising/litestruts/struts.xml b/group07/1519504320/src/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..57ad66abd0 --- /dev/null +++ b/group07/1519504320/src/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group07/1519504320/src/com/coding/basic/ArrayList.java b/group07/1519504320/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..44935deaa3 --- /dev/null +++ b/group07/1519504320/src/com/coding/basic/ArrayList.java @@ -0,0 +1,96 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + if (elementData.length == 101 && elementData[100] == null) { + for (int i = 0; i < elementData.length; i++) { + if (elementData[i] == null) { + elementData[i] = o; + } + } + } else { + Object[] elementData2 = new Object[elementData.length + 1]; + for (int i = 0; i < elementData.length; i++) { + elementData2[i] = elementData[i]; + } + elementData2[elementData2.length - 1] = o; + elementData = elementData2; + } + + } + + public void add(int index, Object o) { + if (index < 0 || index > elementData.length - 1) { + return; + } + if (index <= elementData.length - 1) { + Object[] elementData2 = new Object[elementData.length + 1]; + elementData2[index] = o; + for (int i = 0; i < elementData2.length; i++) { + if (i < index) { + elementData2[i] = elementData[i]; + } + if (i > index) { + elementData2[i + 1] = elementData[i]; + } + } + elementData = elementData2; + } + + } + + public Object get(int index) { + if (elementData.length - 1 < index || index < 0) { + return null; + } else { + return elementData[index]; + } + } + + public Object remove(int index) { + if (index > elementData.length - 1 || index < 0) { + return null; + } else { + Object result = elementData[index]; + for (int i = index; i < elementData.length - 1; i++) { + elementData[index] = elementData[index + 1]; + } + elementData[elementData.length - 1] = null; + return result; + } + } + + public int size() { + return elementData.length; + } + + public Iterator iterator() { + + return new Iterator() { + int cursor = -1; + + + @Override + public boolean hasNext() { + if (cursor < elementData.length - 1) { + return true; + } + return false; + } + + @Override + public Object next() { + + cursor++; + return elementData[cursor]; + } + }; + } + + +} diff --git a/group07/1519504320/src/com/coding/basic/BinaryTreeNode.java b/group07/1519504320/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group07/1519504320/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group07/1519504320/src/com/coding/basic/Iterator.java b/group07/1519504320/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group07/1519504320/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group07/1519504320/src/com/coding/basic/LinkedList.java b/group07/1519504320/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..80288820a1 --- /dev/null +++ b/group07/1519504320/src/com/coding/basic/LinkedList.java @@ -0,0 +1,157 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o) { + Node n = head.next; + while (n.next != null) { + n = n.next; + } + Node n1 = new Node(); + n1.data = o; + n.next = n1; + } + + public void add(int index, Object o) { + if (index == 0) { + Object o1 = head.data; + head.data = o; + Node next = new Node(); + next.data = o1; + head.next = next; + } + if (index < 0) { + return; + } + if (size() - 1 < index) { + return; + } else { + int flag = 0; + Node pre = head; + while (flag != index - 1) { + pre = pre.next; + flag++; + } + Node current = new Node(); + current.data = o; + Node next = pre.next; + pre.next = current; + current.next = next; + + } + + + } + + public Object get(int index) { + if (index < 0) { + return null; + } + if (size() - 1 < index) { + return null; + } else { + int flag = 0; + Node n = head; + while (flag != index) { + n = n.next; + flag++; + } + return n.data; + } + } + + public Object remove(int index) { + if (index < 0) { + return null; + } + if (size() - 1 < index) { + return null; + } else { + int flag = 0; + Node pre = head; + while (flag != index - 1) { + pre = pre.next; + flag++; + } + Node current = pre.next; + Object c = current.data; + pre.next = current.next; + return c; + } + } + + public int size() { + int size = -1; + if (head.data != null) { + size = 0; + Node n = head.next; + while (n.next != null) { + size++; + n = n.next; + } + } + return size; + } + + public void addFirst(Object o) { + if (head.data != null) { + Node n = new Node(); + n.data = o; + n.next = head; + } else { + head.data = o; + } + + } + + public void addLast(Object o) { + if (head.data == null) { + head.data = o; + } else { + Node n = head.next; + while (n.next != null) { + n = n.next; + } + n.next.data = o; + } + } + + public Object removeFirst() { + if (head.data == null) { + return null; + } else { + Object o = head.data; + head = head.next; + return o; + } + } + + public Object removeLast() { + if (head.data == null) { + return null; + } else { + Node n = head.next; + while (n.next != null) { + n = n.next; + } + Object o = n.data; + n.data = null; + return o; + } + } + + public Iterator iterator() { + return null; + } + + + private static class Node { + Object data; + Node next; + + } + + +} diff --git a/group07/1519504320/src/com/coding/basic/List.java b/group07/1519504320/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group07/1519504320/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group07/1519504320/src/com/coding/basic/Queue.java b/group07/1519504320/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..db969b0139 --- /dev/null +++ b/group07/1519504320/src/com/coding/basic/Queue.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +public class Queue { + LinkedList a = new LinkedList(); + public void enQueue(Object o){ + a.add(o); + } + + public Object deQueue(){ + return a.removeFirst(); + } + + public boolean isEmpty(){ + if(a.size()==0){ + return true; + } + return false; + } + + public int size(){ + return a.size(); + } +} diff --git a/group07/1519504320/src/com/coding/basic/Stack.java b/group07/1519504320/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..6198465bf3 --- /dev/null +++ b/group07/1519504320/src/com/coding/basic/Stack.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + Object result = elementData.get(elementData.size()-1); + elementData.remove(elementData.size()-1); + return result; + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + if (elementData.size()==0){ + return true; + } + return false; + } + public int size(){ + return elementData.size(); + } +} diff --git "a/group07/1520332119/git\345\221\275\344\273\244.txt" "b/group07/1520332119/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/1520332119/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/1536161030/.classpath b/group07/1536161030/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group07/1536161030/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group07/1536161030/.gitignore b/group07/1536161030/.gitignore new file mode 100644 index 0000000000..4e05ebfe12 --- /dev/null +++ b/group07/1536161030/.gitignore @@ -0,0 +1,22 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* \ No newline at end of file diff --git a/group07/1536161030/.project b/group07/1536161030/.project new file mode 100644 index 0000000000..b4bd3f32d4 --- /dev/null +++ b/group07/1536161030/.project @@ -0,0 +1,17 @@ + + + homework + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group07/1536161030/.settings/org.eclipse.core.resources.prefs b/group07/1536161030/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/group07/1536161030/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git "a/group07/1536161030/CPU,\345\206\205\345\255\230,\347\241\254\347\233\230,\346\214\207\344\273\244.txt" "b/group07/1536161030/CPU,\345\206\205\345\255\230,\347\241\254\347\233\230,\346\214\207\344\273\244.txt" new file mode 100644 index 0000000000..66d881d528 --- /dev/null +++ "b/group07/1536161030/CPU,\345\206\205\345\255\230,\347\241\254\347\233\230,\346\214\207\344\273\244.txt" @@ -0,0 +1,12 @@ +ڲҪCPUڴ棬Ӳָ̣ +CPUҲд˿˼ԿCPU㡣CPUҪͿƵIJ֣˼壬ǿƵԪ㵥Ԫ֣˵ĴԽмһ +ԵļһģÿܵԪǷֹȷġпƵԪݳָͨ㵥ԪóȻƴ洢Ԫ洢мĽ +ڴǴ洢CPUҪϣҪУϵͳеʱݣӲ̶ȡݣṩCPUʹá +ӲǸ洢Ҫô洢ݣǵijݣŵǷdz̶׼ȷԴ洢Ϣʱ +ڴȡݵٶȱӲ̵Ĵȡٶȿ10 ijЩܻ +CPUٶȱڴ治֪ҪٱǰѳӲ̷ŵڴԺCPUֱڴгCPUֱӲгҪܶࡣ +ڴһCPUй죬Ӳݴȡ̫⡣ ǵĵԵٶȡ +гʱCPUȽܵǵ֮CPUǸӲ̣Ҫ洢ijAѳA͵ڴȥCPUڴ˵Ӳ̰ѳA͵ˣ㱣һ¡ ȳA͵ڴ֮CPUͿʼִгACPU㣬ȡδ洢ݣζйͨҪָˡ +ָҲǻԵһ䣬൱CPUڴ棬Ӳ֮ԡָӼݵ㣬߼㣬ݴͣĿƣָȡ + + diff --git "a/group07/1536161030/git\345\221\275\344\273\244.txt" "b/group07/1536161030/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/1536161030/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/1536161030/src/com/coding/basic/ArrayList.java b/group07/1536161030/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..372bf40b2d --- /dev/null +++ b/group07/1536161030/src/com/coding/basic/ArrayList.java @@ -0,0 +1,95 @@ +package com.coding.basic; + +public class ArrayList implements List{ + + private int size = 0; + + private Object[] elementData; + + public ArrayList(int size) { + this.elementData = new Object[size]; + } + + public ArrayList() { + this.elementData = new Object[10]; + } + + public void add(Object o) { + if(isFull()) + resize(); + elementData[size++] = o; + } + + public void add(int index, Object o) { + rangeCheckForAdd(index); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index) { + rangeCheckForAdd(index); + return elementData[index]; + } + + public Object remove(int index) { + rangeCheckForAdd(index); + Object o = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index); + elementData[--size] = null; + return o; + } + + public int size() { + return elementData.length; + } + + public com.coding.basic.Iterator iterator() { + return new Itr(); + } + + private class Itr implements com.coding.basic.Iterator { + int cursor; + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + int i = cursor; + if (i < elementData.length) { + cursor = i + 1; + return elementData[i]; + } + return null; + } + } + + //檢查下表越界 + public void rangeCheckForAdd(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("下标越界"); + } + + //数组是否满 + public boolean isFull(){ + return size == elementData.length; + } + + //扩容 + public void resize(){ + Object[] newElementData = new Object[elementData.length * 2]; + System.arraycopy(elementData, 0, newElementData, 0, size); + this.elementData = newElementData; + newElementData = null; + } + + // + public boolean isEmpty() { + return size == 0; + } + + +} diff --git a/group07/1536161030/src/com/coding/basic/BinaryTreeNode.java b/group07/1536161030/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..0cc35ce143 --- /dev/null +++ b/group07/1536161030/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,75 @@ +package com.coding.basic; + +public class BinaryTreeNode > { + + private Object data; + + private BinaryTreeNode left; + + private BinaryTreeNode right; + + public BinaryTreeNode(Object data){ + this.data = data; + this.left=null; + this.right =null; + } + + public BinaryTreeNode root; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + /* + * 二叉树 b 插入对象 o 父节点 pnode + * 若b为空树,插入节点作为根 + * o 等于根节点 直接返回 + * o 小于根节点 pnode = 左子树 + * else pnode = 右子树 + * + */ + public BinaryTreeNode insert(Object o) { + BinaryTreeNode current = root; + + if(current == null){ + return new BinaryTreeNode(o); + } + if (o.compareTo((Object) current.data)<0){ + if(current.left !=null){ + current = current.left; + }else{ + current.left = new BinaryTreeNode(o); + return current; + } + }else if(o.compareTo((Object) current.data)==0){ + return current; + }else{ + if(current.right !=null){ + current = current.right; + }else{ + current.right = new BinaryTreeNode(o); + return current; + } + } + return current; + } +} diff --git a/group07/1536161030/src/com/coding/basic/Iterator.java b/group07/1536161030/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..53bec95c3a --- /dev/null +++ b/group07/1536161030/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public interface Iterator { + boolean hasNext(); + + Object next(); + +} diff --git a/group07/1536161030/src/com/coding/basic/LinkedList.java b/group07/1536161030/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..8a6bd6331a --- /dev/null +++ b/group07/1536161030/src/com/coding/basic/LinkedList.java @@ -0,0 +1,139 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size; + + public LinkedList(){ + this.head = null; + this.size = 0; + } + + public void add(Object o) { + Node newNode = new Node(o); + if(isEmpty()){ + head = newNode; + } + else{ + newNode.next = head; + head = newNode; + } + size++; + } + + public void add(int index, Object o) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("下标越界"); + + Node indexNode = node(index); + + Node newNode = new Node(o); + if(isEmpty()){ + head = newNode; + }else { + newNode.next = indexNode; + indexNode = newNode; + } + size++; + } + + public Object get(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("下标越界"); + return node(index).data; + } + + public Object remove(int index) { + Node indexNode = node(index); + Node preNode = node(index); + preNode.next = indexNode.next; + indexNode.next = null; + size--; + return indexNode.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + if(o == null){ + throw new RuntimeException("不能加入null元素"); + } + Node newNode = new Node(o); + newNode.next = head; + size++; + } + + public void addLast(Object o) { + Node newNode = new Node(o); + Node last = node(size); + + newNode.next = last.next; + last.next = newNode; + size++; + } + + public Object removeFirst() { + Node oldNode = head; + head = head.next; + head.next = null; + size--; + return oldNode.data; + } + + public Object removeLast() { + Node oldNode = node(size); + Node preNode = node(size - 1); + preNode.next = null; + size--; + return oldNode.data; + } + + public Iterator iterator(int index) { + return new Itr(index); + } + + // TODO: 2017/2/24 + private class Itr implements com.coding.basic.Iterator { + private int nextIndex; + + public Itr(int index) { + this.nextIndex = index; + } + + @Override + public boolean hasNext() { + return nextIndex < size; + } + + @Override + public Object next() { + return null; + } + } + + + private static class Node { + public Object data; + public Node next; + + public Node(Object data) { + this.data = data; + this.next = null; + } + } + + Node node(int index) { + Node x = head; + for (int i = 0; i < index; i++) + x = x.next; + return x; + } + + // + public boolean isEmpty() { + return head ==null; + } +} diff --git a/group07/1536161030/src/com/coding/basic/List.java b/group07/1536161030/src/com/coding/basic/List.java new file mode 100644 index 0000000000..01398944e6 --- /dev/null +++ b/group07/1536161030/src/com/coding/basic/List.java @@ -0,0 +1,13 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group07/1536161030/src/com/coding/basic/Queue.java b/group07/1536161030/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..5b4d479c4a --- /dev/null +++ b/group07/1536161030/src/com/coding/basic/Queue.java @@ -0,0 +1,72 @@ +package com.coding.basic; + +public class Queue { + private int size; + + //头标志位 + private int head; + + //尾标志位 + private int tail; + + private Object[] queue; + + public Queue() { + this.queue = new Object[10]; + this.size = 0 ; + this.head = 0; + this.tail = 0; + } + + public void enQueue(Object o) { + if(isFull()){ + resize(); + head=0; + } + int newtail = (head + size )% queue.length; + queue[newtail]=o; + size ++; + } + + public Object deQueue() { + if(isEmpty()) + throw new IndexOutOfBoundsException("队列为空!"); + Object old = queue[head]; + queue[head] =null; + head = (head + 1)% queue.length; + size --; + return old; + + } + + public Object getHead(){ + return head; + } + + public Object getTail(){ + return tail; + } + + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + int diff = tail - head; + return diff; + } + + // + public boolean isFull(){ + return size == queue.length; + } + + //扩容 + public void resize(){ + Object[] newQueue = new Object[queue.length * 2]; + System.arraycopy(queue, 0, newQueue, 0, size); + this.queue = newQueue; + newQueue = null; + } +} diff --git a/group07/1536161030/src/com/coding/basic/Stack.java b/group07/1536161030/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..0704596255 --- /dev/null +++ b/group07/1536161030/src/com/coding/basic/Stack.java @@ -0,0 +1,47 @@ +package com.coding.basic; + +import java.util.EmptyStackException; + + +public class Stack { + private Object[] elementData; + private int size; + + public Stack() { + this.size = 0; + this.elementData = new Object[10]; + } + + public void push(Object o) { + if (o == null) + throw new RuntimeException("元素不可为NULL"); + size++; + elementData[size -1]= o ; + } + + public Object pop() { + if (isEmpty()) + throw new EmptyStackException(); + Object old = elementData[size - 1]; + elementData[size] = null; + size--; + return old; + } + + public Object peek() { + if (isEmpty()) + throw new EmptyStackException(); + return elementData[size -1]; + } + + public boolean isEmpty() { + return size < 1; + } + + // + public int size() { + return size; + } +} + + diff --git a/group07/1536161030/src/com/coding/test/ArrayListTest.java b/group07/1536161030/src/com/coding/test/ArrayListTest.java new file mode 100644 index 0000000000..7f3cf309c2 --- /dev/null +++ b/group07/1536161030/src/com/coding/test/ArrayListTest.java @@ -0,0 +1,70 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.coding.basic.ArrayList; + +// +public class ArrayListTest { + + @Test + public void testAddObject() { + ArrayList al = new ArrayList(); + assertEquals(10, al.size()); + al.add(new Integer(1)); + System.out.print(al.get(0)); + } + + @Test + public void testAddIntObject() { + ArrayList al = new ArrayList(); + al.add(0, new Integer(1)); + assertEquals(10, al.size()); + int tmp = 0; + try { + al.add(4, new Integer(4)); + } catch (IndexOutOfBoundsException e) { + tmp = 1; + assertEquals(tmp, 1); + } + + } + + @Test + public void testGet() { + ArrayList al = new ArrayList(); + al.add(new Integer(1)); + assertEquals((Integer)al.get(0),new Integer(1)); + int tmp = 0; + try { + al.get(4); + } catch (IndexOutOfBoundsException e) { + tmp = 1; + assertEquals(tmp, 1); + } + } + + @Test + public void testRemove() { + ArrayList al = new ArrayList(); + al.add(new Integer(1)); + assertEquals((Integer)al.get(0),new Integer(1)); + assertEquals(al.size(),10); + } + + @Test + public void testSize() { + ArrayList al = new ArrayList(); + assertEquals(10, al.size()); + } + + @Test + public void testIsEmpty() { + ArrayList al = new ArrayList(); + assertTrue(al.isEmpty()); + al.add(new Integer(1)); + assertFalse(al.isEmpty()); + } +} diff --git a/group07/1536161030/src/com/coding/test/BinaryTreeNodeTest.java b/group07/1536161030/src/com/coding/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..04a2dc3e59 --- /dev/null +++ b/group07/1536161030/src/com/coding/test/BinaryTreeNodeTest.java @@ -0,0 +1,19 @@ +package com.coding.test; + +// +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.coding.basic.BinaryTreeNode; +import com.coding.basic.LinkedList; + +public class BinaryTreeNodeTest { + + @Test + public void testAddObject() { + BinaryTreeNode bt = new BinaryTreeNode(null); + bt.insert(new Integer(1)); + assertNotNull(bt); + } +} diff --git a/group07/1536161030/src/com/coding/test/LinkedListTest.java b/group07/1536161030/src/com/coding/test/LinkedListTest.java new file mode 100644 index 0000000000..b00d8c2ed0 --- /dev/null +++ b/group07/1536161030/src/com/coding/test/LinkedListTest.java @@ -0,0 +1,68 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.coding.basic.LinkedList; + +// +public class LinkedListTest{ + @Test + public void testAddObject() { + LinkedList list = new LinkedList(); + assertEquals(0, list.size()); + list.add(new Integer(1)); + assertEquals(1, list.size()); + } + + @Test + public void testAddIntObject() { + LinkedList list = new LinkedList(); + list.add(0, new Integer(1)); + assertEquals(1, list.size()); + int tmp = 0; + try { + list.add(4, new Integer(4)); + } catch (IndexOutOfBoundsException e) { + tmp = 1; + assertEquals(tmp, 1); + } + } + + @Test + public void testGet() { + LinkedList list = new LinkedList(); + list.add(new Object()); + assertNotNull(list.get(0)); + int tmp = 0; + try { + list.get(4); + } catch (IndexOutOfBoundsException e) { + tmp = 1; + assertEquals(tmp, 1); + } + } + + @Test + public void testRemove() { + LinkedList list = new LinkedList(); + list.add(new Object()); + list.remove(0); + assertEquals(list.size(),0); + } + + @Test + public void testSize() { + LinkedList list = new LinkedList(); + assertEquals(0, list.size()); + } + + @Test + public void testIsEmpty() { + LinkedList list = new LinkedList(); + assertTrue(list.isEmpty()); + list.add(new Object()); + assertFalse(list.isEmpty()); +} +} diff --git a/group07/1536161030/src/com/coding/test/QueueTest.java b/group07/1536161030/src/com/coding/test/QueueTest.java new file mode 100644 index 0000000000..ed51cfe96c --- /dev/null +++ b/group07/1536161030/src/com/coding/test/QueueTest.java @@ -0,0 +1,47 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.coding.basic.Queue; + +// +public class QueueTest { + + @Test + public void testEnQueue() { + Queue queue = new Queue(); + assertEquals(queue.size(), 0); + System.out.print(queue.getHead()); + } + + @Test + public void testDeQueue() { + Queue queue = new Queue(); + int tmp = 0; + try { + queue.deQueue(); + } catch (IndexOutOfBoundsException e) { + tmp = 1; + assertEquals(tmp, 1); + } + queue.enQueue(new Object()); + assertNotNull(queue.deQueue()); + } + + @Test + public void testIsEmpty() { + Queue queue = new Queue(); + assertTrue(queue.isEmpty()); + queue.enQueue(new Object()); + assertFalse(queue.isEmpty()); + } + + @Test + public void testSize() { + Queue queue = new Queue(); + assertEquals(queue.size(), 0); + } + +} diff --git a/group07/1536161030/src/com/coding/test/StackTest.java b/group07/1536161030/src/com/coding/test/StackTest.java new file mode 100644 index 0000000000..45dd128fc4 --- /dev/null +++ b/group07/1536161030/src/com/coding/test/StackTest.java @@ -0,0 +1,58 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import java.util.EmptyStackException; + +import org.junit.Test; + +import com.coding.basic.Stack; + +// +public class StackTest { + + @Test + public void testPush() { + Stack stack = new Stack(); + assertEquals(0, stack.size()); + stack.push(new Object()); + assertEquals(1, stack.size()); + } + + @Test + public void testPop() { + Stack stack = new Stack(); + stack.push(new Object()); + assertNotNull(stack.pop()); + assertEquals(0, stack.size()); + } + + @Test + public void testPeek() { + Stack stack = new Stack(); + int tmp = 0; + try { + stack.peek(); + } catch (EmptyStackException e) { + tmp = 1; + assertEquals(1, tmp); + } + stack.push(new Object()); + assertNotNull(stack.peek()); + assertEquals(1, stack.size()); + } + + @Test + public void testIsEmpty() { + Stack stack = new Stack(); + assertTrue(stack.isEmpty()); + stack.push(new Object()); + assertFalse(stack.isEmpty()); + } + + @Test + public void testSize() { + Stack stack = new Stack(); + assertEquals(0, stack.size()); + } +} diff --git a/group07/178007127/001DataStructure/.classpath b/group07/178007127/001DataStructure/.classpath new file mode 100644 index 0000000000..84b630a879 --- /dev/null +++ b/group07/178007127/001DataStructure/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group07/178007127/001DataStructure/.gitignore b/group07/178007127/001DataStructure/.gitignore new file mode 100644 index 0000000000..4a95481e61 --- /dev/null +++ b/group07/178007127/001DataStructure/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/build/ diff --git a/group07/178007127/001DataStructure/.project b/group07/178007127/001DataStructure/.project new file mode 100644 index 0000000000..430da90497 --- /dev/null +++ b/group07/178007127/001DataStructure/.project @@ -0,0 +1,18 @@ + + + 001DataStructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.springsource.ide.eclipse.gradle.core.nature + org.eclipse.jdt.core.javanature + + diff --git a/group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.core.import.prefs b/group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.core.import.prefs new file mode 100644 index 0000000000..e25840aa32 --- /dev/null +++ b/group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.core.import.prefs @@ -0,0 +1,9 @@ +#org.springsource.ide.eclipse.gradle.core.preferences.GradleImportPreferences +#Sat Feb 25 12:36:04 CST 2017 +addResourceFilters=true +afterTasks=afterEclipseImport; +beforeTasks=cleanEclipse;eclipse; +enableAfterTasks=true +enableBeforeTasks=true +enableDependendencyManagement=true +projects=; diff --git a/group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.core.prefs b/group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.core.prefs new file mode 100644 index 0000000000..f846d71532 --- /dev/null +++ b/group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.core.prefs @@ -0,0 +1,5 @@ +#org.springsource.ide.eclipse.gradle.core.preferences.GradleProjectPreferences +#Thu Feb 23 15:58:56 CST 2017 +build.family.org.gradle.tooling.model.eclipse.HierarchicalEclipseProject=; +org.springsource.ide.eclipse.gradle.linkedresources= +org.springsource.ide.eclipse.gradle.rootprojectloc= diff --git a/group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.refresh.prefs b/group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.refresh.prefs new file mode 100644 index 0000000000..d91c85a147 --- /dev/null +++ b/group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.refresh.prefs @@ -0,0 +1,8 @@ +#org.springsource.ide.eclipse.gradle.core.actions.GradleRefreshPreferences +#Sat Feb 25 12:36:04 CST 2017 +addResourceFilters=true +afterTasks=afterEclipseImport; +beforeTasks=cleanEclipse;eclipse; +enableAfterTasks=true +enableBeforeTasks=true +useHierarchicalNames=false diff --git a/group07/178007127/001DataStructure/.settings/org.eclipse.jdt.core.prefs b/group07/178007127/001DataStructure/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group07/178007127/001DataStructure/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group07/178007127/001DataStructure/README.md b/group07/178007127/001DataStructure/README.md new file mode 100644 index 0000000000..f0a705d37a --- /dev/null +++ b/group07/178007127/001DataStructure/README.md @@ -0,0 +1,2 @@ +# 001DataStructure +001DataStructure diff --git a/group07/178007127/001DataStructure/build.gradle b/group07/178007127/001DataStructure/build.gradle new file mode 100644 index 0000000000..a4ec73e72c --- /dev/null +++ b/group07/178007127/001DataStructure/build.gradle @@ -0,0 +1,12 @@ +apply plugin:'java' + +repositories{ + mavenCentral() +} + +dependencies{ + compile group: 'junit', name: 'junit', version: '4.12' + + compile group: 'dom4j', name: 'dom4j', version: '1.6.1' + compile group: 'jaxen', name: 'jaxen', version: '1.1.6' +} \ No newline at end of file diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/array/ArrayUtil.java b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/array/ArrayUtil.java new file mode 100644 index 0000000000..a4b7674c9b --- /dev/null +++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/array/ArrayUtil.java @@ -0,0 +1,225 @@ +package com.easy.codersing.array; + +import org.junit.Test; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static int[] reverseArray(int[] origin){ + int[] dest =new int[origin.length]; + for(int i=0;iarr[j]){ + int temp=arr[i]; + arr[i]=arr[j]; + arr[j]=temp; + } + } + } + return arr; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length+size]; + System.arraycopy(oldArray, 0, newArray, 0, newArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + StringBuilder sb=new StringBuilder(); + + if(max==1){ + return new int[]{}; + }else{ + for(int i=1 ;i<2*max;i++){ + int num = getFibo(i); + if(num parameters) throws Exception { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + SAXReader reader = new SAXReader(); + File file =new File("src/main/java/com/easy/codersing/litestruts/struts.xml"); + Document doc=reader.read(file); + Element el_root=doc.getRootElement(); + Iterator it= el_root.elementIterator(); + while(it.hasNext()){ + Object obj=it.next(); + Element el_action = (Element)obj; + //System.out.println(el_action.attributeValue("name")); + String el_action_name=el_action.attributeValue("name"); + + + if(actionName.equals(el_action_name)){ + String el_action_class=el_action.attributeValue("class"); + Class clazz = Class.forName(el_action_class); + Object actionObj = clazz.newInstance(); + + for(String map_key:parameters.keySet()){ + String set_method_name = "set"+AppUtils.fistLetterToUpper(map_key); + Method set_method =clazz.getMethod(set_method_name, String.class); + set_method.invoke(actionObj,parameters.get(map_key)); + } + + Method execute_method = clazz.getMethod("execute"); + String execute_result = (String)execute_method.invoke(actionObj); + + Method get_message_method = clazz.getMethod("getMessage"); + String get_message_result=(String)get_message_method.invoke(actionObj); + + Map map=new HashMap(); + map.put("message", get_message_result); + + View view =new View(); + view.setParameters(map); + + Iterator it_result = el_action.elementIterator(); + while(it_result.hasNext()){ + Element el_result =(Element)it_result.next(); + if(el_result.attributeValue("name").equals(execute_result)){ + view.setJsp(el_result.getText()); + } + } + + return view; + + + } + } + + return null; + } + + + + +} diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/StrutsTest.java b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/StrutsTest.java new file mode 100644 index 0000000000..002700cf81 --- /dev/null +++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.easy.codersing.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws Exception { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/TestApp.java b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/TestApp.java new file mode 100644 index 0000000000..df0ed9b5fa --- /dev/null +++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/TestApp.java @@ -0,0 +1,85 @@ +package com.easy.codersing.litestruts; + + +import java.io.File; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class TestApp { + public static void test1() throws Exception { + SAXReader reader = new SAXReader(); + File file =new File("src/main/java/com/easy/codersing/litestruts/struts.xml"); + //System.out.println(file.exists()); + Document doc=reader.read(file); + List actions = doc.selectNodes("//*[@name]"); + for(Iterator it=actions.iterator();it.hasNext();){ + Element action = (Element)it.next(); + List list=action.attributes(); + for(Iterator it2=list.iterator();it2.hasNext();){ + Attribute a=(Attribute)it2.next(); + System.out.println(a.getName()+"="+a.getValue()); + } + } + + } + + public static void main(String[] args) throws Exception { + /* Map map=new HashMap<>(); + map.put("name", "test"); + map.put("password", "1234"); + + for (String s : map.keySet()) { + System.out.println(s); + System.out.println(map.get(s)); + }*/ + + + + SAXReader reader = new SAXReader(); + File file =new File("src/main/java/com/easy/codersing/litestruts/struts.xml"); + Document doc=reader.read(file); + Element el_root=doc.getRootElement(); + Iterator it= el_root.elementIterator(); + while(it.hasNext()){ + Object obj=it.next(); + Element el_action = (Element)obj; + //System.out.println(el_action.attributeValue("name")); + //System.out.println(el_action.attributeValue("class")); + + Iterator it_row=el_action.elementIterator(); + if(el_action.attributeValue("name").equals("login")){ + while(it_row.hasNext()){ + Element el_result=(Element)it_row.next(); + System.out.println(el_result.attributeValue("name")); + System.out.println(el_result.getText()); + + } + } + } + + + + } + + public static void test3(String[] args) throws Exception { + Class clazz = Class.forName("com.easy.codersing.litestruts.LoginAction"); + Object obj=clazz.newInstance(); + + Method method1 =clazz.getMethod("setName",String.class); + method1.invoke(obj, "张三"); + + Method method2 = clazz.getMethod("getName",null); + Object result = method2.invoke(obj); + System.out.println(result); + + } +} diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/View.java b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/View.java new file mode 100644 index 0000000000..36c7f44128 --- /dev/null +++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/View.java @@ -0,0 +1,23 @@ +package com.easy.codersing.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/struts.xml b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/struts.xml new file mode 100644 index 0000000000..14b1446463 --- /dev/null +++ b/group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/core/AppUtils.java b/group07/178007127/001DataStructure/src/main/java/com/easy/core/AppUtils.java new file mode 100644 index 0000000000..24377d9da1 --- /dev/null +++ b/group07/178007127/001DataStructure/src/main/java/com/easy/core/AppUtils.java @@ -0,0 +1,13 @@ +package com.easy.core; + +public class AppUtils { + public static String fistLetterToUpper(String words){ + String letter = words.substring(0,1).toUpperCase(); + return letter+words.substring(1,words.length()); + } + + public static void main(String[] args) { + String s="abc"; + System.out.println(fistLetterToUpper(s)); + } +} diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/util/junit/app/TestApp.java b/group07/178007127/001DataStructure/src/main/java/com/easy/util/junit/app/TestApp.java new file mode 100644 index 0000000000..a289432e89 --- /dev/null +++ b/group07/178007127/001DataStructure/src/main/java/com/easy/util/junit/app/TestApp.java @@ -0,0 +1,19 @@ +package com.easy.util.junit.app; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import com.easy.util.myarraylist.TestArrayList; +import com.easy.util.mylinkedlist.TestLinkedList; +import com.easy.util.myqueue.TestQueue; +import com.easy.util.mystack.TestStack; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + TestArrayList.class, + TestLinkedList.class, + TestQueue.class, + TestStack.class +}) +public class TestApp { + +} diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/util/myarraylist/ArrayList.java b/group07/178007127/001DataStructure/src/main/java/com/easy/util/myarraylist/ArrayList.java new file mode 100644 index 0000000000..1bab864a11 --- /dev/null +++ b/group07/178007127/001DataStructure/src/main/java/com/easy/util/myarraylist/ArrayList.java @@ -0,0 +1,175 @@ +package com.easy.util.myarraylist; + +import com.easy.util.myiterator.Iterator; + +public class ArrayList{ + + private static final Object[] EMPTY_ELEMENTDATA = {}; + + private Object[] elementData; + + private int size; + + + // region 构造函数 + public ArrayList() { + this.elementData = EMPTY_ELEMENTDATA; + } + + public ArrayList(int initialCapacity) { + if (initialCapacity < 0) { + throw new IllegalArgumentException("Illegal Capacity:" + initialCapacity); + } + this.elementData = new Object[initialCapacity]; + } + // endregion + + // region add方法 + public boolean add(Object o) { + if (elementData.length <= size) { + grow(1); + } + elementData[size++] = o; + return true; + } + + public void add(int index, Object o) { + rangeCheckForAdd(index); + grow(1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + // endregion + + // region get方法 + public Object get(int index) { + rangeCheck(index); + return elementData[index]; + } + // endregion + + // region remove方法 + public Object remove(int index) { + rangeCheck(index); + + Object oldValue = elementData[index]; + /* + * int numMoved=size-index-1; if(numMoved>0){ + * System.arraycopy(elementData, index+1, elementData, index, numMoved); + * } elementData[--size]=null; + */ + fastRemove(index); + return oldValue; + } + + public boolean remove(Object o) { + if (o == null) { + for (int index = 0; index < size; index++) { + if (elementData[index] == null) { + fastRemove(index); + return true; + } + } + } else { + for (int index = 0; index < size; index++) { + if (elementData[index].equals(o)) { + fastRemove(index); + return true; + } + } + } + return false; + } + // endregion + + // region size方法 + public int size() { + return size; + } + // endregion + + // region toString方法 + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < size(); i++) { + sb.append(elementData[i] + ","); + } + /* + * for (Object object : elementData) { sb.append(object + ","); } + */ + String temp = sb.toString(); + temp = temp.substring(0, temp.length() - 1); + return "[" + temp + "]"; + } + // endregion + + // region 私有方法 + private void grow(int minCapacity) { + Object[] dest = new Object[elementData.length + minCapacity]; + System.arraycopy(elementData, 0, dest, 0, elementData.length); + elementData = dest; + } + + private void rangeCheck(int index) { + if (index >= size) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + } + + private String outOfBoundsMsg(int index) { + return "Index:" + index + ",Size:" + size; + } + + private void rangeCheckForAdd(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + } + + private void fastRemove(int index) { + int numMoved = size - index - 1; + if (numMoved > 0) { + System.arraycopy(elementData, index + 1, elementData, index, numMoved); + } + elementData[--size] = null; + } + + // endregion + + // region 下一版本迭代的功能 + private static final int DEFAULT_CAPACITY = 10; + + private void ensureCapacityInternal(int minCapacity) { + if (elementData == EMPTY_ELEMENTDATA) { + minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); + } + ensureCapacityInternal(minCapacity); + } + + private void ensureExplicitCapacity(int minCapacity) { + if (minCapacity - elementData.length > 0) { + grow(minCapacity); + } + } + //endregion + + int currentIndex ; + public Iterator iterator(){ + currentIndex=-1; + return new Iterator() { + + @Override + public Object next() { + return elementData[++currentIndex]; + } + + @Override + public boolean hasNext() { + return currentIndex0&&index<=size; + } + + private String outOfBoundsMsg(int index) { + return "Index: "+index+", Size: "+size; + } + //endregion +} diff --git a/group07/178007127/001DataStructure/src/main/java/com/easy/util/myqueue/Queue.java b/group07/178007127/001DataStructure/src/main/java/com/easy/util/myqueue/Queue.java new file mode 100644 index 0000000000..0a57f448b6 --- /dev/null +++ b/group07/178007127/001DataStructure/src/main/java/com/easy/util/myqueue/Queue.java @@ -0,0 +1,37 @@ +package com.easy.util.myqueue; + +import com.easy.util.mylinkedlist.LinkedList; + +public class Queue { + + LinkedList linkedList; + public Queue(){ + linkedList=new LinkedList(); + } + + public void enQueue(Object o){ + linkedList.addLast(o); + } + + public Object deQueue(){ + return linkedList.removeFirst(); + } + + public boolean isEmpty(){ + return size()==0; + } + + public int size(){ + return linkedList.size(); + } + + @Override + public String toString() { + StringBuilder sb=new StringBuilder(); + for(int i=0;i implements List { + + private Object[] elements; + + // 列表长度,默认10个元素 + private int size = 10; + + // 最后一个元素的位置 + private int position = -1; + + public ArrayList() { + elements = new Object[size]; + } + + public ArrayList(final int capacity) { + if (capacity <= 0) + throw new RuntimeException("列表长度不可小于等于0!"); + elements = new Object[capacity]; + } + + /** + * 添加元素 + * + * @param e 要添加的元素 + * @return + */ + @Override + public boolean add(E e) { + + if (++position > size - 1) { + grow(); + } + elements[position] = e; + + return true; + } + + /** + * 删除指定索引的元素 + * + * @param index 索引下标 + * @return + */ + @Override + @SuppressWarnings("unchecked") + public E remove(int index) { + + if (index < 0 || index > position || this.isEmpty()) + throw new IndexOutOfBoundsException("要删除的索引不正确!"); + + E returnElement = (E) elements[index]; + elements[index] = null; + System.arraycopy(elements, index + 1, elements, index, position + 1 - index); + position--; + return returnElement; + } + + /** + * 删除指定的元素 + * + * @param e + * @return + */ + @Override + public boolean remove(E e) { + + if (!this.contains(e)) return false; + int removeIndex = 0; + for(int i = 0; i < this.position; i++) { + if(elements[i].equals(e)) { + removeIndex = i; + break; + } + } + remove(removeIndex); + return true; + } + + /** + * 返回列表长度 + * + * @return + */ + @Override + public int size() { + return position + 1; + } + + /** + * 判断列表是否为空 + * + * @return + */ + @Override + public boolean isEmpty() { + return position == -1; + } + + /** + * 获取指定索引的元素 + * + * @param index + * @return + */ + @Override + @SuppressWarnings("unchecked") + public E get(int index) { + if (index > position) return null; + return (E)elements[index]; + } + + /** + * 重置某个索引的元素 + * + * @param index + * @param o + * @return + */ + @Override + public boolean set(int index, Object o) { + if (index > position) return false; + elements[index] = null; + elements[index] = o; + return true; + } + + /** + * 判断是否包含某个元素 + * + * @param o + * @return + */ + @Override + public boolean contains(Object o) { + + if(this.isEmpty()) return false; + for(int i = 0; i <= position; i++) { + if (elements[i].equals(o)) + return true; + } + return false; + } + + /** + * 清空列表 + */ + @Override + public void clear() { + for(int i = 0; i <= this.size(); i++) { + elements[i] = null; + } + position = -1; + } + + /** + * 取得迭代器 + * + * @return + */ + @Override + public Iterator iterator() { + return new Itr(); + } + + /** + * 数组增长 + */ + private void grow() { + + Object[] newElements = new Object[size << 1]; + System.arraycopy(elements, 0, newElements, 0, this.size); + size = size << 1; + elements = null; + elements = newElements; + } + + private class Itr implements Iterator { + + private int itrIndex = 0; + + @Override + public boolean hasNext() { + return get(itrIndex) != null; + } + + @Override + @SuppressWarnings("unchecked") + public E next() { + return (E) elements[itrIndex++]; + } + + @Override + public void remove() { + ArrayList.this.remove(itrIndex); + } + } + + @Override + public String toString() { + + if(this.isEmpty()) { + return "[]"; + } + StringBuilder strList = new StringBuilder("["); + for(int i = 0; i < this.size(); i++) { + strList.append(elements[i].toString()).append(","); + } + strList.deleteCharAt(strList.length() - 1); + strList.append("]"); + return strList.toString(); + } + +} diff --git a/group07/20409287/src/main/java/xdx/homework/first/Hello.java b/group07/20409287/src/main/java/xdx/homework/first/Hello.java new file mode 100644 index 0000000000..1abb23045e --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/first/Hello.java @@ -0,0 +1,15 @@ +package xdx.homework.first; + +import java.util.List; + +/** + * @Description: Hello World! + * @author: xdx + * @date: 2017年2月25日 上午11:37:58 + */ +public class Hello { + + public static void main(String[] args) { + System.out.println("Hello WOrl"); + } +} diff --git a/group07/20409287/src/main/java/xdx/homework/first/Iterator.java b/group07/20409287/src/main/java/xdx/homework/first/Iterator.java new file mode 100644 index 0000000000..b90db66d5d --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/first/Iterator.java @@ -0,0 +1,11 @@ +package xdx.homework.first; + + +public interface Iterator { + + boolean hasNext(); + + E next(); + + void remove(); +} diff --git a/group07/20409287/src/main/java/xdx/homework/first/LinkedList.java b/group07/20409287/src/main/java/xdx/homework/first/LinkedList.java new file mode 100644 index 0000000000..1c31589204 --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/first/LinkedList.java @@ -0,0 +1,246 @@ +package xdx.homework.first; + +/** + * @Description: 链式列表 + */ +public class LinkedList implements List { + + private class Node { + + private E data; // 数据域 + + private Node next; // 指针域 + + public Node() { + } + + private Node(E data) { + this.data = data; + this.next = null; + } + + } + + // 链表大小 + private int size = 0; + + private Node head; + + private Node tail; + + /** + * 添加元素 + * + * @param data + * @return + */ + @Override + public boolean add(E data) { + + if(this.head != null) { + Node newNode = new Node(data); + this.tail.next = newNode; + this.tail = newNode; + } else { + this.head = new Node(data); + this.tail = this.head; + } + size++; + return true; + } + + /** + * 删除指定索引的元素 + * + * @param index@return + */ + @Override + public E remove(int index) { + + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("索引不正确!"); + } + if (isEmpty()) { + throw new RuntimeException("链表为空!"); + } + Node currentNode = this.head; + Node preNode = currentNode; + for (int i = 0; i < index; i++) { + preNode = currentNode; + currentNode = currentNode.next; + } + preNode.next = currentNode.next; + size--; + return currentNode.data; + } + + /** + * 删除指定的元素 + * + * @param e + * @return + */ + @Override + public boolean remove(E e) { + + if (!this.contains(e)) return false; + + if (this.head.data.equals(e)) { + this.head = this.head.next; + size--; + return true; + } + Node currentNode = this.head; + Node preNode = currentNode; + boolean isFind = false; + for (int i = 0; i < size; i++) { + if(currentNode.data.equals(e)) { + isFind = true; + break; + } + preNode = currentNode; + currentNode = currentNode.next; + } + if (!isFind) return false; + preNode.next = currentNode.next; + size--; + return true; + } + + /** + * 返回列表长度 + * + * @return + */ + @Override + public int size() { + return size; + } + + /** + * 判断列表是否为空 + * + * @return + */ + @Override + public boolean isEmpty() { + return size == 0; + } + + /** + * 获取指定索引的元素 + * + * @param index + * @return + */ + @Override + public E get(int index) { + + if (index < 0 || index > size || isEmpty()) { + throw new IndexOutOfBoundsException("索引不正确!"); + } + Node currentNode = this.head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + /** + * 重置某个索引的元素 + * + * @param index + * @param e + * @return + */ + @Override + public boolean set(int index, E e) { + + if (index < 0 || index > size || isEmpty()) { + throw new IndexOutOfBoundsException("索引不正确!"); + } + Node currentNode = this.head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + currentNode.data = e; + return false; + } + + /** + * 判断是否包含某个元素 + * + * @param e + * @return + */ + @Override + public boolean contains(E e) { + + if (isEmpty()) return false; + Node currentNode = this.head; + boolean isFind = false; + for (int i = 0; i < size(); i++) { + if(currentNode.data.equals(e)) { + isFind = true; + } + currentNode = currentNode.next; + } + return isFind; + } + + /** + * 清空列表 + */ + @Override + public void clear() { + this.head = this.tail = null; + size = 0; + } + + @Override + public String toString() { + + if (isEmpty()) return "[]"; + StringBuilder strLinkedList = new StringBuilder("["); + Node currentNode = this.head; + while (currentNode.next != null) { + strLinkedList.append(currentNode.data.toString()).append(","); + currentNode = currentNode.next; + } + strLinkedList.append(currentNode.data.toString()).append("]"); + return strLinkedList.toString(); + } + + /** + * 取得迭代器 + * + * @return + */ + @Override + public Iterator iterator() { + return new Itr(); + } + + private class Itr implements Iterator { + + Node curNode = LinkedList.this.head; + + @Override + public boolean hasNext() { + return curNode != null; + } + + @Override + public E next() { + Node thisNode = curNode; + curNode = curNode.next; + return thisNode.data; + } + + @Override + public void remove() { + LinkedList.this.remove(curNode.data); + curNode = curNode.next; + } + } +} diff --git a/group07/20409287/src/main/java/xdx/homework/first/List.java b/group07/20409287/src/main/java/xdx/homework/first/List.java new file mode 100644 index 0000000000..7c6f1c4e52 --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/first/List.java @@ -0,0 +1,86 @@ +package xdx.homework.first; + +/** + * @param + * @Description: 定义一组操作有序列表的接口 + * @author: xdx + * @date: 2017年2月21日 下午8:53:52 + */ +public interface List { + + /** + * 添加元素 + * + * @param e + * @return + */ + boolean add(E e); + + /** + * 删除指定索引的元素 + * + * @param int 索引下标 + * @return + */ + E remove(int index); + + /** + * 删除指定的元素 + * + * @param e + * @return + */ + boolean remove(E e); + + /** + * 返回列表长度 + * + * @return + */ + int size(); + + /** + * 判断列表是否为空 + * + * @return + */ + boolean isEmpty(); + + /** + * 获取指定索引的元素 + * + * @param index + * @return + */ + E get(int index); + + /** + * 重置某个索引的元素 + * + * @param index + * @param e + * @return + */ + boolean set(int index, E e); + + /** + * 判断是否包含某个元素 + * + * @param e + * @return + */ + boolean contains(E e); + + /** + * 清空列表 + */ + void clear(); + + /** + * 取得迭代器 + * + * @return + */ + Iterator iterator(); + +} diff --git a/group07/20409287/src/main/java/xdx/homework/first/Queue.java b/group07/20409287/src/main/java/xdx/homework/first/Queue.java new file mode 100644 index 0000000000..5d98cff312 --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/first/Queue.java @@ -0,0 +1,97 @@ +package xdx.homework.first; + +/** + * @Description: 链式队列 + */ +public class Queue { + + private class Node { + + private E data; // 数据域 + + private Node next; // 指针域 + + public Node() { + } + + private Node(E data) { + this.data = data; + this.next = null; + } + + } + + private Node front; // 队头 + + private Node rear; // 队尾 + + private int length; // 队长 + + public void enQueue(E data) { + + if(this.front == null) { + this.front = new Node(data); + this.rear = this.front; + } else { + Node newNode = new Node(data); + this.rear.next = newNode; + this.rear = newNode; + } + length++; + } + + public E deQueue() { + + if (isEmpty()) { + return null; + } + Node oldFront = this.front; + this.front = this.front.next; + length--; + return oldFront.data; + } + + public int length() { + return length; + } + + public boolean isEmpty() { + return this.front == this.rear; + } + + public void clear() { + this.length = 0; + this.front = null; + this.rear = null; + } + + public E getFront() { + + if (this.isEmpty()) { + return null; + } + return this.front.data; + } + + public E getRear() { + + if(this.isEmpty()) return null; + return this.rear.data; + } + + public String toString() { + + if (this.length == 0) return "[]"; + + Node node = this.front; + StringBuilder queueToString = new StringBuilder("["); + while (node.next != null) { + queueToString.append(node.data.toString()).append(","); + node = node.next; + } + queueToString.append(node.data.toString()).append("]"); + return queueToString.toString(); + } + + +} diff --git a/group07/20409287/src/main/java/xdx/homework/first/Stack.java b/group07/20409287/src/main/java/xdx/homework/first/Stack.java new file mode 100644 index 0000000000..d898ffeb6e --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/first/Stack.java @@ -0,0 +1,81 @@ +package xdx.homework.first; + +/** + * @Description: + * @author: {User} + * @date: {Date} + */ +public class Stack { + + private class Node { + + private E data; // 数据域 + + private Node next; // 指针域 + + public Node() { + } + + private Node(E data) { + this.data = data; + this.next = null; + } + } + + private int size; + + private Node top; + + public void push(E e) { + if(!isEmpty()) { + Node newNode = new Node(e); + newNode.next = top; + top = newNode; + } else { + top = new Node(e); + } + size++; + } + + public E pop() { + if(isEmpty()) throw new RuntimeException("空栈!"); + Node popNode = top; + top = top.next; + return popNode.data; + } + + public boolean isEmpty() { + return size == 0; + } + + public E peek() { + if(isEmpty()) throw new RuntimeException("空栈!"); + return top.data; + } + + public int size() { + return size; + } + + public void clear() { + top = null; + size = 0; + } + + @Override + public String toString() { + + if(isEmpty()) return "[]"; + StringBuilder stackToString = new StringBuilder("["); + Node itr = this.top; + while(itr != null) { + stackToString.append(itr.data.toString()).append(","); + itr = itr.next; + } + stackToString.deleteCharAt(stackToString.length() - 1).append("]"); + + return stackToString.toString(); + } + + +} diff --git a/group07/20409287/src/main/java/xdx/homework/second/array/ArrayUtil.java b/group07/20409287/src/main/java/xdx/homework/second/array/ArrayUtil.java new file mode 100644 index 0000000000..2fa1237dbb --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/second/array/ArrayUtil.java @@ -0,0 +1,221 @@ +package xdx.homework.second.array; + +import xdx.homework.first.ArrayList; +import xdx.homework.first.List; +import xdx.homework.first.Queue; +import xdx.homework.first.Stack; + +import java.util.Arrays; + +import static java.lang.StrictMath.sqrt; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + + int end = origin.length - 1; + for (int begin = 0; begin < end; begin++, end--) { + // 交换首尾 + origin[begin] = origin[begin] ^ origin[end]; + origin[end] = origin[begin] ^ origin[end]; + origin[begin] = origin[begin] ^ origin[end]; + } + } + + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + + int[] newArray = new int[oldArray.length]; + int newArrayIndex = 0; + int i = 0; + for (; i < oldArray.length; i++) { + if (oldArray[i] == 0) continue; + newArray[newArrayIndex++] = oldArray[i]; + } + return Arrays.copyOfRange(newArray, 0, newArrayIndex); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + + // 分别放进两个栈中,取小的出栈 + Queue queue1 = new Queue<>(); + Queue queue2 = new Queue<>(); + ArrayList newArray = new ArrayList<>(); + for (int a : array1) { + queue1.enQueue(a); + } + for (int a : array2) { + queue2.enQueue(a); + } + while (!queue1.isEmpty() && !queue2.isEmpty()) { + if (queue1.getFront() < queue2.getFront()) { + newArray.add(queue1.deQueue()); + } else if (queue1.getFront() > queue2.getFront()) { + newArray.add(queue2.deQueue()); + } else { + newArray.add(queue2.deQueue()); + queue1.deQueue(); + } + } + while (!queue1.isEmpty()) newArray.add(queue1.deQueue()); + while (!queue2.isEmpty()) newArray.add(queue2.deQueue()); + + int[] retArray = new int[newArray.size()]; + for (int i = 0; i < newArray.size(); i++) { + retArray[i] = newArray.get(i); + } + return retArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + + int first = 1; + int second = 1; + if (max == 0) return new int[]{0}; + if (max == 1) return new int[]{first, second}; + + List fibList = new ArrayList<>(); + fibList.add(first); + fibList.add(second); + int last = first + second; + while (last < max) { + fibList.add(last); + first = second; + second = last; + last = first + second; + } + + return list2array(fibList); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + + if (max < 2) return new int[]{}; + if (max == 2) return new int[]{2}; + + List primeList = new ArrayList<>(); + primeList.add(2); + for (int i = 3; i <= max; i += 2) { + // 判断i是不是素数 + boolean isPrime = true; + for (int j = 2; j <= Math.sqrt(i); j++) { + if (i % j == 0) isPrime = false; + } + if (isPrime) primeList.add(i); + } + + return list2array(primeList); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + + if (max < 1) return new int[]{}; + + List perfectNums = new ArrayList<>(); + + for (int aPerfectNum = 1; aPerfectNum <= max; aPerfectNum++) { + int sumFactors = 1; + for (int factor = 2; factor <= aPerfectNum / 2; factor++) { + if (aPerfectNum % factor == 0) { + sumFactors += factor; + } + } + if (sumFactors == aPerfectNum) perfectNums.add(aPerfectNum); + } + + return list2array(perfectNums); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + + StringBuilder stringBuilder = new StringBuilder(); + for (int a : array) { + stringBuilder.append(a).append(seperator); + } + stringBuilder.deleteCharAt(stringBuilder.length() - 1); + return stringBuilder.toString(); + } + + private int[] list2array(List list) { + int[] array = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + return array; + } + +} diff --git a/group07/20409287/src/main/java/xdx/homework/second/litestruts/LoginAction.java b/group07/20409287/src/main/java/xdx/homework/second/litestruts/LoginAction.java new file mode 100644 index 0000000000..f59067088b --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/second/litestruts/LoginAction.java @@ -0,0 +1,41 @@ +package xdx.homework.second.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group07/20409287/src/main/java/xdx/homework/second/litestruts/Struts.java b/group07/20409287/src/main/java/xdx/homework/second/litestruts/Struts.java new file mode 100644 index 0000000000..0ba4f85313 --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/second/litestruts/Struts.java @@ -0,0 +1,149 @@ +package xdx.homework.second.litestruts; + +import org.jcp.xml.dsig.internal.dom.DOMEnvelopedTransform; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Executable; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + + +public class Struts { + + private static Map actionMap; + + private static Map> actionResultMap; + + private static void init() { + + if (actionMap != null) return; + + actionMap = new HashMap<>(); + actionResultMap = new HashMap<>(); + Document strutsDocument = getDocumentFromFile(); + if (strutsDocument == null) throw new RuntimeException("xml文件读取错误,请检查文件路径是否正确!"); + + try { + NodeList nodeList = strutsDocument.getFirstChild().getChildNodes(); + for (int i = 0; i < nodeList.getLength(); i++) { + if (nodeList.item(i).getNodeType() != 1) continue; + Element child = (Element) nodeList.item(i); + Class actionClass = Class.forName(child.getAttribute("class")); + actionMap.put(child.getAttribute("name"), (LoginAction) actionClass.newInstance()); + + NodeList resultList = child.getElementsByTagName("result"); + Map params = new HashMap<>(); + for (int j = 0; j < resultList.getLength(); j++) { + Element result = (Element) resultList.item(j); + params.put(result.getAttribute("name"), result.getTextContent()); + } + actionResultMap.put(child.getAttribute("name"), params); + } + + } catch (ClassNotFoundException e) { + System.out.println(e.getMessage()); + throw new RuntimeException("xml文件内容有误!"); + } catch (InstantiationException | IllegalAccessException e) { + System.out.println(e.getMessage()); + throw new RuntimeException("无法创建接口或者抽象类的实例!"); + } + } + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + // 读取struts文件并初始化相关类 + init(); + + // 根据actionName找到相对应的class + LoginAction loginAction = actionMap.get(actionName); + if (loginAction == null) { + System.out.println("找不到该action: " + actionName); + return null; + } + + View view = new View(); + // 据parameters中的数据调用相应的方法 + Class clazz = loginAction.getClass(); + try { + for (String key : parameters.keySet()) { + String value = parameters.get(key); + if (value == null || value.isEmpty()) continue; + PropertyDescriptor descriptor = new PropertyDescriptor(key, clazz); + descriptor.getWriteMethod().invoke(loginAction, value); + } + // 调用对象的exectue方法, 并获得返回值 + String executeReturn = loginAction.execute(); + // 通过反射找到对象的所有getter方法, 把值和属性形成一个HashMap ,放到View对象的parameters + PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz).getPropertyDescriptors(); + HashMap params = new HashMap<>(); + for (PropertyDescriptor pd : pds) { + params.put(pd.getName(), pd.getReadMethod().invoke(loginAction).toString()); + } + view.setParameters(params); + // 确定哪一个jsp + view.setJsp(actionResultMap.get(actionName).get(executeReturn)); + } catch (IntrospectionException e) { + e.printStackTrace(); + return null; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + return view; + } + + + private static Document getDocumentFromFile() { + + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + Document document = null; + try { + URL fileURL = Struts.class.getResource("struts.xml"); + DocumentBuilder documentBuilder = dbf.newDocumentBuilder(); + document = documentBuilder.parse(new File(fileURL.getFile())); + } catch (ParserConfigurationException e) { + System.out.println("配置转化异常: " + e.getMessage()); + } catch (SAXException e) { + System.out.println("SAX读取异常: " + e.getMessage()); + } catch (IOException e) { + System.out.println("IO异常: " + e.getMessage()); + } + return document; + } + +} diff --git a/group07/20409287/src/main/java/xdx/homework/second/litestruts/StrutsTest.java b/group07/20409287/src/main/java/xdx/homework/second/litestruts/StrutsTest.java new file mode 100644 index 0000000000..a56eec5e28 --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/second/litestruts/StrutsTest.java @@ -0,0 +1,42 @@ +package xdx.homework.second.litestruts; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.util.HashMap; +import java.util.Map; + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group07/20409287/src/main/java/xdx/homework/second/litestruts/View.java b/group07/20409287/src/main/java/xdx/homework/second/litestruts/View.java new file mode 100644 index 0000000000..0d7f02f86b --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/second/litestruts/View.java @@ -0,0 +1,23 @@ +package xdx.homework.second.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group07/20409287/src/main/java/xdx/homework/second/litestruts/struts.xml b/group07/20409287/src/main/java/xdx/homework/second/litestruts/struts.xml new file mode 100644 index 0000000000..da4d783426 --- /dev/null +++ b/group07/20409287/src/main/java/xdx/homework/second/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group07/20409287/src/test/xdx/homework/first/ArrayListTest.java b/group07/20409287/src/test/xdx/homework/first/ArrayListTest.java new file mode 100644 index 0000000000..d19cdb3dec --- /dev/null +++ b/group07/20409287/src/test/xdx/homework/first/ArrayListTest.java @@ -0,0 +1,182 @@ +package xdx.homework.first; + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * ArrayList Tester. + * + * @author xdx + * @version 1.0 + * @since
2月25日, 2017
+ */ +public class ArrayListTest { + + private List defaultTestList; + + @Before + public void before() throws Exception { + + defaultTestList = new ArrayList<>(); + Assert.assertTrue(defaultTestList.add("《三国演义》")); + Assert.assertTrue(defaultTestList.add("《红楼梦》")); + Assert.assertTrue(defaultTestList.add("《西游记》")); + Assert.assertTrue(defaultTestList.add("《水浒传》")); + } + + @After + public void after() throws Exception { + } + + /** + * Method: add(E e) + */ + @Test + public void testAdd() throws Exception { + + List testList = new ArrayList<>(); + final int NUM = 1000000; + for (Integer i = 0; i < NUM; i++) { + testList.add(i); + } + for (Integer i = 0; i < NUM; i++) { + Assert.assertEquals(i, testList.get(i)); + } + Assert.assertEquals(NUM, testList.size()); + System.out.println(testList.toString()); + } + + /** + * Method: remove(int index) + */ + @Test + public void testRemoveIndex() throws Exception { + + List testReomoveList = new ArrayList<>(); + Assert.assertTrue(testReomoveList.add(4)); + Assert.assertTrue(testReomoveList.add(5)); + Assert.assertTrue(testReomoveList.add(6)); + System.out.println("删除前: " + testReomoveList); + Integer delElement = testReomoveList.get(0); + Assert.assertTrue(testReomoveList.remove(0).equals(delElement)); + System.out.println("删除后: " + testReomoveList); + } + + /** + * Method: remove(E e) + */ + @Test + public void testRemoveE() throws Exception { + + List testReomoveList = new ArrayList<>(); + Assert.assertTrue(testReomoveList.add(7)); + Assert.assertTrue(testReomoveList.add(8)); + Assert.assertTrue(testReomoveList.add(9)); + System.out.println("删除前: " + testReomoveList); + Assert.assertTrue(testReomoveList.remove(new Integer(8))); + System.out.println("删除后: " + testReomoveList); + } + + /** + * Method: size() + */ + @Test + public void testSize() throws Exception { + int size = defaultTestList.size(); + Assert.assertEquals(4, size); + System.out.println("defaultTest内容:" + defaultTestList); + System.out.println("defaultTest长度:" + size); + } + + /** + * Method: isEmpty() + */ + @Test + public void testIsEmpty() throws Exception { + Assert.assertFalse(defaultTestList.isEmpty()); + List testReomoveList = new ArrayList<>(); + Assert.assertTrue(testReomoveList.isEmpty()); + } + + /** + * Method: get(int index) + */ + @Test + public void testGet() throws Exception { + Assert.assertTrue("《三国演义》".equals(defaultTestList.get(0))); + Assert.assertFalse("《西游记》".equals(defaultTestList.get(0))); + } + + /** + * Method: set(int index, Object o) + */ + @Test + public void testSet() throws Exception { + + List testList = new ArrayList<>(); + Assert.assertTrue(testList.add(7)); + Assert.assertTrue(testList.add(8)); + Assert.assertTrue(testList.add(9)); + System.out.println("设置前: " + testList); + Assert.assertTrue(testList.set(0, 10)); + System.out.println("设置后: " + testList); + } + + /** + * Method: contains(Object o) + */ + @Test + public void testContains() throws Exception { + Assert.assertTrue(defaultTestList.contains("《红楼梦》")); + Assert.assertFalse(defaultTestList.contains("《聊斋》")); + } + + /** + * Method: clear() + */ + @Test + public void testClear() throws Exception { + + List testList = new ArrayList<>(); + Assert.assertTrue(testList.add(7)); + Assert.assertTrue(testList.add(8)); + Assert.assertTrue(testList.add(9)); + System.out.println("清除前: " + testList); + testList.clear(); + Assert.assertTrue(testList.isEmpty()); + System.out.println("清除后: " + testList); + } + + /** + * Method: iterator() + */ + @Test + public void testIterator() throws Exception { + + List testList = new ArrayList<>(); + Assert.assertTrue(testList.add(7)); + Assert.assertTrue(testList.add(8)); + Assert.assertTrue(testList.add(9)); + Iterator iterator = testList.iterator(); + Assert.assertNotNull(iterator); + while(iterator.hasNext()) { + System.out.println(iterator.next()); + } + List testListByDel = new ArrayList<>(); + Assert.assertTrue(testListByDel.add("张三")); + Assert.assertTrue(testListByDel.add("李四")); + Assert.assertTrue(testListByDel.add("王五")); + Iterator iteratorByDel = testListByDel.iterator(); + while(iteratorByDel.hasNext()) { + iteratorByDel.remove(); + } + Assert.assertTrue(testListByDel.isEmpty()); + + } + + + +} diff --git a/group07/20409287/src/test/xdx/homework/first/LinkedListTest.java b/group07/20409287/src/test/xdx/homework/first/LinkedListTest.java new file mode 100644 index 0000000000..dabbc04a96 --- /dev/null +++ b/group07/20409287/src/test/xdx/homework/first/LinkedListTest.java @@ -0,0 +1,222 @@ +package xdx.homework.first; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** + * LinkedList Tester. + * + */ +public class LinkedListTest { + + private LinkedList defaultLinkList; + + @Before + public void before() throws Exception { + + defaultLinkList = new LinkedList<>(); + defaultLinkList.add("1.苹果"); + defaultLinkList.add("2.香蕉"); + defaultLinkList.add("3.菠萝"); + defaultLinkList.add("4.橙子"); + defaultLinkList.add("5.葡萄"); + } + + @After + public void after() throws Exception { + } + + /** + * Method: add(E data) + */ + @Test + public void testAdd() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + for (Integer i = 0; i < 1000; i++) { + testLinkedList.add(i); + } + System.out.println(testLinkedList); + } + + /** + * Method: remove(int index) + */ + @Test + public void testRemoveIndex() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + for (int i = 0; i < 100; i++) { + testLinkedList.add(i + "号"); + } + System.out.println("删除前:" + testLinkedList); + for (int i = 0; i < 50; i++) { + testLinkedList.remove(i); + } + System.out.println("删除后:" + testLinkedList); + } + + /** + * Method: remove(E e) + */ + @Test + public void testRemoveE() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + for (int i = 0; i < 10; i++) { + testLinkedList.add(i + "号"); + } + System.out.println("删除前:" + testLinkedList); + testLinkedList.remove("1号"); + testLinkedList.remove("10号"); + System.out.println("删除后:" + testLinkedList); + } + + /** + * Method: size() + */ + @Test + public void testSize() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + int i = 0; + for (; i < 100; i++) { + testLinkedList.add(i + "号"); + } + Assert.assertEquals(i, testLinkedList.size()); + System.out.println("testLinkedList的内容:" + testLinkedList); + System.out.println("testLinkedList的长度:" + testLinkedList.size()); + } + + /** + * Method: isEmpty() + */ + @Test + public void testIsEmpty() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + System.out.println("testLikedList是否为空:" + testLinkedList.isEmpty()); + Assert.assertTrue(testLinkedList.isEmpty()); + String insertElement = "Hello World!"; + System.out.println("插入元素: " + insertElement); + testLinkedList.add(insertElement); + System.out.println("testLikedList是否为空:" + testLinkedList.isEmpty()); + Assert.assertFalse(testLinkedList.isEmpty()); + + } + + /** + * Method: get(int index) + */ + @Test + public void testGet() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + for (int i = 0; i < 10; i++) { + testLinkedList.add(i + "号"); + } + for (int i = 0; i < 10; i++) { + System.out.println("索引为" + i + "处的元素为:" + testLinkedList.get(i)); + Assert.assertEquals((i + "号"), testLinkedList.get(i)); + } + } + + /** + * Method: set(int index, E e) + */ + @Test + public void testSet() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + for (int i = 0; i < 10; i++) { + testLinkedList.add(i + "号"); + } + System.out.println("原链表:" + testLinkedList); + for (int i = 0; i < 10; i++) { + String nodeValue = i + "号替补"; + testLinkedList.set(i, nodeValue); + Assert.assertEquals(nodeValue, testLinkedList.get(i)); + } + System.out.println("替换后:" + testLinkedList); + } + + /** + * Method: contains(E e) + */ + @Test + public void testContains() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + for (int i = 0; i < 10; i++) { + testLinkedList.add(i + "号"); + } + System.out.println("原链表:" + testLinkedList); + for (int i = 0; i < 10; i++) { + String containTestValue = i + "号"; + System.out.println("是否包含【" + containTestValue + "】:" + + testLinkedList.contains(containTestValue)); + Assert.assertTrue(testLinkedList.contains(containTestValue)); + } + + } + + /** + * Method: clear() + */ + @Test + public void testClear() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + for (int i = 0; i < 10; i++) { + testLinkedList.add(i + "号"); + } + System.out.println("原链表:" + testLinkedList); + testLinkedList.clear(); + System.out.println("清空后的链表:" + testLinkedList); + Assert.assertTrue(testLinkedList.isEmpty()); + } + + /** + * Method: iterator() + */ + @Test + public void testIterator() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + for (int i = 0; i < 10; i++) { + testLinkedList.add(i + "号"); + } + System.out.println("原链表:" + testLinkedList); + Iterator iterator = testLinkedList.iterator(); + Assert.assertNotNull(iterator); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } + + + + /** + * Method: remove() + */ + @Test + public void testRemove() throws Exception { + + LinkedList testLinkedList = new LinkedList<>(); + for (int i = 0; i < 10; i++) { + testLinkedList.add(i + "号"); + } + System.out.println("原链表:" + testLinkedList); + Iterator iterator = testLinkedList.iterator(); + while (iterator.hasNext()) { + iterator.remove(); + } + System.out.println("删除所有元素后:" + testLinkedList); + Assert.assertTrue(testLinkedList.isEmpty()); + + } + + +} diff --git a/group07/20409287/src/test/xdx/homework/first/QueueTest.java b/group07/20409287/src/test/xdx/homework/first/QueueTest.java new file mode 100644 index 0000000000..6e56e3b8b1 --- /dev/null +++ b/group07/20409287/src/test/xdx/homework/first/QueueTest.java @@ -0,0 +1,141 @@ +package xdx.homework.first; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import xdx.homework.first.Queue; + +/** + * Queue Tester. + * + * @author + * @since
二月 25, 2017
+ * @version 1.0 + */ +public class QueueTest { + + private Queue defaultQueue; + + @Before + public void before() throws Exception { + + defaultQueue = new Queue<>(); + defaultQueue.enQueue("赵"); + defaultQueue.enQueue("钱"); + defaultQueue.enQueue("孙"); + defaultQueue.enQueue("李"); + defaultQueue.enQueue("周"); + defaultQueue.enQueue("吴"); + defaultQueue.enQueue("郑"); + defaultQueue.enQueue("王"); + } + + @After + public void after() throws Exception { + } + + /** + * + * Method: enQueue(E data) + * + */ + @Test + public void testEnQueue() throws Exception { + + Queue testQueue = new Queue<>(); + testQueue.enQueue("刘备"); + testQueue.enQueue("关羽"); + testQueue.enQueue("张飞"); + System.out.println(testQueue); + } + + /** + * + * Method: deQueue() + * + */ + @Test + public void testDeQueue() throws Exception { + + Queue testQueue = new Queue<>(); + testQueue.enQueue("刘备"); + testQueue.enQueue("关羽"); + testQueue.enQueue("张飞"); + System.out.println("删除前:" + testQueue); + System.out.println("删除:" + testQueue.deQueue()); + System.out.println("删除后:" + testQueue); + } + + /** + * + * Method: length() + * + */ + @Test + public void testLength() throws Exception { + Assert.assertEquals(8, defaultQueue.length()); + System.out.println("defaultQueue长度:" + defaultQueue.length()); + } + + /** + * + * Method: isEmpty() + * + */ + @Test + public void testIsEmpty() throws Exception { + Assert.assertTrue(!defaultQueue.isEmpty()); + } + + /** + * + * Method: clear() + * + */ + @Test + public void testClear() throws Exception { + + Queue testQueue = new Queue<>(); + testQueue.enQueue("刘备"); + testQueue.enQueue("关羽"); + testQueue.enQueue("张飞"); + + testQueue.clear(); + Assert.assertTrue(testQueue.isEmpty()); + } + + /** + * + * Method: getFront() + * + */ + @Test + public void testGetFront() throws Exception { + Assert.assertEquals("赵", defaultQueue.getFront()); + Assert.assertNotEquals("钱", defaultQueue.getFront()); + } + + /** + * + * Method: getRear() + * + */ + @Test + public void testGetRear() throws Exception { + Assert.assertEquals("王", defaultQueue.getRear()); + Assert.assertNotEquals("钱", defaultQueue.getFront()); + } + + /** + * + * Method: toString() + * + */ + @Test + public void testToString() throws Exception { + System.out.println("defaultQueue内容:" + defaultQueue.toString()); + } + + +} diff --git a/group07/20409287/src/test/xdx/homework/first/StackTest.java b/group07/20409287/src/test/xdx/homework/first/StackTest.java new file mode 100644 index 0000000000..bfc6b2c8f7 --- /dev/null +++ b/group07/20409287/src/test/xdx/homework/first/StackTest.java @@ -0,0 +1,126 @@ +package test.xdx.homework.first; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import xdx.homework.first.Stack; + +/** + * Stack Tester. + * + * @version 1.0 + */ +public class StackTest { + + private Stack defaultStack; + + @Before + public void before() throws Exception { + + defaultStack = new Stack<>(); + defaultStack.push("孙悟空"); + defaultStack.push("唐僧"); + defaultStack.push("猪八戒"); + defaultStack.push("沙僧"); + } + + @After + public void after() throws Exception { + } + + /** + * + * Method: push(E e) + * + */ + @Test + public void testPush() throws Exception { + + Stack testStack = new Stack<>(); + testStack.push("java"); + testStack.push("C++"); + testStack.push("python"); + System.out.println(testStack); + } + + /** + * + * Method: pop() + * + */ + @Test + public void testPop() throws Exception { + + Stack testStack = new Stack<>(); + testStack.push("java"); + testStack.push("C++"); + testStack.push("python"); + System.out.println(testStack); + Assert.assertEquals("python", testStack.pop()); + Assert.assertEquals("C++", testStack.pop()); + Assert.assertEquals("java", testStack.pop()); + + } + + /** + * + * Method: isEmpty() + * + */ + @Test + public void testIsEmpty() throws Exception { + + Stack testStack = new Stack<>(); + testStack.push("java"); + testStack.push("C++"); + testStack.push("python"); + System.out.println(testStack); + Assert.assertEquals("python", testStack.pop()); + Assert.assertEquals("C++", testStack.pop()); + Assert.assertEquals("java", testStack.pop()); + Assert.assertTrue(testStack.isEmpty()); + } + + /** + * + * Method: peek() + * + */ + @Test + public void testPeek() throws Exception { + Assert.assertEquals("沙僧", defaultStack.peek()); + } + + /** + * + * Method: size() + * + */ + @Test + public void testSize() throws Exception { + Assert.assertEquals(4, defaultStack.size()); + } + + /** + * + * Method: clear() + * + */ + @Test + public void testClear() throws Exception { + + Stack testStack = new Stack<>(); + testStack.push("java"); + testStack.push("C++"); + testStack.push("python"); + System.out.println("清空前:" + testStack); + testStack.clear(); + System.out.println("清空后:" + testStack); + Assert.assertTrue(testStack.isEmpty()); + + + } + + +} diff --git a/group07/20409287/src/test/xdx/homework/second/ArrayUtilTest.java b/group07/20409287/src/test/xdx/homework/second/ArrayUtilTest.java new file mode 100644 index 0000000000..ffafc94f7d --- /dev/null +++ b/group07/20409287/src/test/xdx/homework/second/ArrayUtilTest.java @@ -0,0 +1,157 @@ +package xdx.homework.second; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import org.testng.Assert; +import xdx.homework.second.array.ArrayUtil; + +import java.util.Arrays; + +/** + * ArrayUtil Tester. + * + * @author + * @since
���� 4, 2017
+ * @version 1.0 + */ +public class ArrayUtilTest { + + ArrayUtil arrayUtil = new ArrayUtil(); + + @Before + public void before() throws Exception { + } + + @After + public void after() throws Exception { + } + + /** + * + * Method: reverseArray(int[] origin) + * + */ + @Test + public void testReverseArray() throws Exception { + + int[] array = {1,2,3,4,5,6,7,8,9}; + System.out.println("===================数组反转开始==================="); + System.out.println("原数组: " + Arrays.toString(array)); + arrayUtil.reverseArray(array); + System.out.println("反转后的数组: " + Arrays.toString(array)); + System.out.println("===================数组反转结束===================" + "\n"); + } + + /** + * + * Method: removeZero(int[] oldArray) + * + */ + @Test + public void testRemoveZero() throws Exception { + + System.out.println("===================数组清零开始==================="); + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + System.out.println("原数组: " + Arrays.toString(oldArr)); + System.out.println("清零后的数组: " + Arrays.toString(arrayUtil.removeZero(oldArr))); + System.out.println("===================数组清零结束===================" + "\n"); + } + + /** + * + * Method: merge(int[] array1, int[] array2) + * + */ + @Test + public void testMerge() throws Exception { + + System.out.println("===================数组合并开始==================="); + int[] array1 = {1,2,4,5}; + int[] array2 = {3,4,5,6,7,8,9}; + System.out.println("原数组1: " + Arrays.toString(array1)); + System.out.println("原数组2: " + Arrays.toString(array2)); + int[] mergedArray = arrayUtil.merge(array1, array2); + System.out.println("合并后的数组: " + Arrays.toString(mergedArray)); + System.out.println("===================数组合并结束===================" + "\n"); + } + + /** + * + * Method: grow(int [] oldArray, int size) + * + */ + @Test + public void testGrow() throws Exception { + + System.out.println("===================数组增长开始==================="); + int[] array2 = {3,4,5,6,7,8,9}; + final int GROW_SIZE = 5; + int[] growArray = arrayUtil.grow(array2, GROW_SIZE); + Assert.assertEquals(array2.length + GROW_SIZE, growArray.length); + System.out.println("原数组: " + Arrays.toString(array2)); + System.out.println("增长" + GROW_SIZE + "个单位后的数组: " + Arrays.toString(growArray)); + System.out.println("===================数组增长结束===================" + "\n"); + } + + /** + * + * Method: fibonacci(int max) + * + */ + @Test + public void testFibonacci() throws Exception { + + System.out.println("===================斐波那契数列开始==================="); + final int MAX = 10000000; + System.out.println(MAX + "以内的斐波那契数列: " + Arrays.toString(arrayUtil.fibonacci(MAX))); + System.out.println("===================斐波那契数列结束===================" + "\n"); + } + + /** + * + * Method: getPrimes(int max) + * + */ + @Test + public void testGetPrimes() throws Exception { + + System.out.println("===================素数计算开始==================="); + final int MAX = 10000; + System.out.println(MAX + "以内的素数: " + Arrays.toString(arrayUtil.getPrimes(MAX))); + System.out.println("===================素数计算结束===================" + "\n"); + } + + /** + * + * Method: getPerfectNumbers(int max) + * + */ + @Test + public void testGetPerfectNumbers() throws Exception { + + System.out.println("===================计算完美数列结束==================="); + final int MAX = 10000; + System.out.println(MAX + "以内的完数分别是: " + Arrays.toString(arrayUtil.getPerfectNumbers(MAX))); + System.out.println("===================计算完美数列结束===================" + "\n"); + } + + /** + * + * Method: join(int[] array, String seperator) + * + */ + @Test + public void testJoin() throws Exception { + + System.out.println("===================数组分隔开始==================="); + int[] array2 = {3,4,5,6,7,8,9}; + final String SEP = "-"; + System.out.println("原数组: " + Arrays.toString(array2)); + System.out.println("分隔符: " + SEP); + System.out.println("分隔后的数组: " + arrayUtil.join(array2, SEP)); + System.out.println("===================数组分隔结束===================" + "\n"); + } + + +} diff --git "a/group07/2306826375/git\345\221\275\344\273\244.txt" "b/group07/2306826375/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/2306826375/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/2306826375/txt b/group07/2306826375/txt new file mode 100644 index 0000000000..d6459e0054 --- /dev/null +++ b/group07/2306826375/txt @@ -0,0 +1 @@ +xxx diff --git "a/group07/2708094737/git\345\221\275\344\273\244.txt" "b/group07/2708094737/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/2708094737/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git "a/group07/2915553181/git\345\221\275\344\273\244.txt" "b/group07/2915553181/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/2915553181/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git "a/group07/328536398/git\345\221\275\344\273\244.txt" "b/group07/328536398/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/328536398/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/396868934/DataStructure/.classpath b/group07/396868934/DataStructure/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group07/396868934/DataStructure/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group07/396868934/DataStructure/.project b/group07/396868934/DataStructure/.project new file mode 100644 index 0000000000..72a951f7c1 --- /dev/null +++ b/group07/396868934/DataStructure/.project @@ -0,0 +1,17 @@ + + + DataStructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group07/396868934/DataStructure/.settings/org.eclipse.jdt.core.prefs b/group07/396868934/DataStructure/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group07/396868934/DataStructure/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group07/396868934/DataStructure/bin/.gitignore b/group07/396868934/DataStructure/bin/.gitignore new file mode 100644 index 0000000000..c2d9872a16 --- /dev/null +++ b/group07/396868934/DataStructure/bin/.gitignore @@ -0,0 +1 @@ +/com/ diff --git a/group07/396868934/DataStructure/src/com/louisly/java/LYArrayLink.java b/group07/396868934/DataStructure/src/com/louisly/java/LYArrayLink.java new file mode 100644 index 0000000000..450a1ccff1 --- /dev/null +++ b/group07/396868934/DataStructure/src/com/louisly/java/LYArrayLink.java @@ -0,0 +1,93 @@ +package com.louisly.java; + +public class LYArrayLink { + + private int currentCount = 0; + private LYNode header = null; + private LYNode lastNode = null; + public void addObject(Object obj) { + if (obj == null) return; + + currentCount++; + LYNode node = new LYNode(); + node.data = obj; + + if (lastNode != null) { + lastNode.next = node; + lastNode = node; + } else { + lastNode = node; + } + + if (header == null) { + header = node; + } + } + + public void removeObject(Object obj) { + LYNode lastNode = null; + LYNode node = header; + Object data = null; + while (node != null) { + data = node.data; + if (data == obj) { + if (lastNode != null) { + lastNode.next = node.next; + } else { + // ƳһԪ + header = node.next; + } + + currentCount--; + } else { + lastNode = node; + } + node = node.next; + } + } + + public void removeAtIndex(int index) { + if (header == null) return; // error: out of bounces + + LYNode lastNode = null; + LYNode node = header; + + for (int i = 0; i < index; i++) { + if (node != null) { + lastNode = node; + node = node.next; + } else { + return; // error: out of bounces + } + } + + if (index == 0) { + header = node.next; + } else { + lastNode.next = node.next; + } + currentCount--; + } + + public Object get(int index) { + if (header == null) return null; // error: out of bounces + LYNode node = header; + for (int i = 0; i < index; i++) { + node = node.next; + if (node == null) { + return null; + } + } + return node.data; + } + + public int size() { + return currentCount; + } + + private static class LYNode { + Object data; + LYNode next; + + } +} diff --git a/group07/396868934/DataStructure/src/com/louisly/java/LYArrayList.java b/group07/396868934/DataStructure/src/com/louisly/java/LYArrayList.java new file mode 100644 index 0000000000..0076cddad3 --- /dev/null +++ b/group07/396868934/DataStructure/src/com/louisly/java/LYArrayList.java @@ -0,0 +1,96 @@ +package com.louisly.java; +import com.louisly.java.LYIterator; + +public class LYArrayList { + private Object[] elementData = new Object[10]; + private int currentCount = 0; + public void addObject(Object obj) { + if (currentCount >= elementData.length) { + grow(); + } + elementData[currentCount] = obj; + currentCount++; + } + + public boolean removeObject(Object obj) { + boolean existObj = false; + int removeIndex = -1; + int index = currentCount; + for (int i = 0; i < index; i++) { + Object element = elementData[i]; + boolean remove = false; + if (element != null && element.equals(obj)) { + elementData[i] = null; + existObj = true; + remove = true; + // ԷһĵڶԪ + if (removeIndex == -1) { + removeIndex = i; + } + currentCount--; + } + // Ԫǰƶ + if (!remove) { + elementData[removeIndex] = element; + elementData[i] = null; + removeIndex++; + } + } + return existObj; + } + + public boolean removeAtIndex(int index) { + if (index > currentCount) { + return false; + } + elementData[index] = null; + + for (int i = index+1; i < currentCount; i++) { + elementData[i-1] = elementData[i]; + elementData[i] = null; + } + currentCount--; + return true; + } + + public void grow() { + Object[] target = new Object[elementData.length*2]; + System.arraycopy(elementData, 0, target, 0, elementData.length); + elementData = target; + } + + public Object get(int index) { + if (index > currentCount) { + return null; + } + return elementData[index]; + } + + public int size() { + return currentCount; + } + + public LYIterator iterator() { + return new LYArrayListIterator(this); + } + private class LYArrayListIterator implements LYIterator { + LYArrayList arrayList = null; + int position = 0; + public LYArrayListIterator(LYArrayList arrayList) { + this.arrayList = arrayList; + } + + @Override + public boolean hasNext() { + + return false; + } + @Override + public Object next() { + return elementData[position]; + } + public void remove() { + + } + } +} diff --git a/group07/396868934/DataStructure/src/com/louisly/java/LYArrayListTest.java b/group07/396868934/DataStructure/src/com/louisly/java/LYArrayListTest.java new file mode 100644 index 0000000000..a457211867 --- /dev/null +++ b/group07/396868934/DataStructure/src/com/louisly/java/LYArrayListTest.java @@ -0,0 +1,50 @@ +package com.louisly.java; + +import static org.junit.Assert.*; + +import java.util.ArrayList; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import junit.framework.Assert; + +public class LYArrayListTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddObject() { + LYArrayList list = new LYArrayList(); + list.addObject(new Integer(10)); + Assert.assertEquals(10, ((Integer)list.get(0)).intValue()); + } + + @Test + public void testRemoveObject() { + fail("Not yet implemented"); + } + + @Test + public void testRemoveAtIndex() { + fail("Not yet implemented"); + } + + @Test + public void testGet() { + fail("Not yet implemented"); + } + + @Test + public void testSize() { + fail("Not yet implemented"); + } + +} diff --git a/group07/396868934/DataStructure/src/com/louisly/java/LYBinaryTree.java b/group07/396868934/DataStructure/src/com/louisly/java/LYBinaryTree.java new file mode 100644 index 0000000000..4ea3141135 --- /dev/null +++ b/group07/396868934/DataStructure/src/com/louisly/java/LYBinaryTree.java @@ -0,0 +1,45 @@ +package com.louisly.java; +import com.louisly.java.LYObject; + +public class LYBinaryTree { + + private LYBinaryTreeNode headerNode; + + public void addObject(LYObject obj) { + + if (headerNode == null) { + LYBinaryTreeNode node = new LYBinaryTreeNode(); + node.data = obj; + headerNode = node; + return; + } + + this.appendObject(headerNode, obj); + } + + private void appendObject(LYBinaryTreeNode toNode, LYObject obj) { + if (obj.i > toNode.data.i) { + if (toNode.right != null) { + this.appendObject(toNode.right, obj); + } else { + LYBinaryTreeNode node = new LYBinaryTreeNode(); + node.data = obj; + toNode.right = node; + } + } else { + if (toNode.left != null) { + this.appendObject(toNode.left, obj); + } else { + LYBinaryTreeNode node = new LYBinaryTreeNode(); + node.data = obj; + toNode.left = node; + } + } + } + + public static class LYBinaryTreeNode { + private LYObject data; + private LYBinaryTreeNode left; + private LYBinaryTreeNode right; + } +} diff --git a/group07/396868934/DataStructure/src/com/louisly/java/LYIterator.java b/group07/396868934/DataStructure/src/com/louisly/java/LYIterator.java new file mode 100644 index 0000000000..c2ae34c871 --- /dev/null +++ b/group07/396868934/DataStructure/src/com/louisly/java/LYIterator.java @@ -0,0 +1,6 @@ +package com.louisly.java; + +public interface LYIterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group07/396868934/DataStructure/src/com/louisly/java/LYObject.java b/group07/396868934/DataStructure/src/com/louisly/java/LYObject.java new file mode 100644 index 0000000000..f0f5aa5d81 --- /dev/null +++ b/group07/396868934/DataStructure/src/com/louisly/java/LYObject.java @@ -0,0 +1,8 @@ +package com.louisly.java; + +public class LYObject extends Object { + int i = 0; + public LYObject(int i) { + this.i = i; + } +} diff --git a/group07/396868934/DataStructure/src/com/louisly/java/LYQueue.java b/group07/396868934/DataStructure/src/com/louisly/java/LYQueue.java new file mode 100644 index 0000000000..5f573ae0ac --- /dev/null +++ b/group07/396868934/DataStructure/src/com/louisly/java/LYQueue.java @@ -0,0 +1,28 @@ +package com.louisly.java; +import com.louisly.java.LYArrayList; + +public class LYQueue { + LYArrayList list = null; + public LYQueue() { + list = new LYArrayList(); + } + + public void enQueue(Object obj) { + list.addObject(obj); + } + + public Object deQueue() { + if (list.size() != 0) { + return list.get(0); + } + return null; + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } +} diff --git a/group07/396868934/DataStructure/src/com/louisly/java/LYStack.java b/group07/396868934/DataStructure/src/com/louisly/java/LYStack.java new file mode 100644 index 0000000000..c615208041 --- /dev/null +++ b/group07/396868934/DataStructure/src/com/louisly/java/LYStack.java @@ -0,0 +1,34 @@ +package com.louisly.java; +import com.louisly.java.LYArrayList; + +public class LYStack { + private LYArrayList list = new LYArrayList(); +// public LYStack() { +// list = new LYArrayList(); +// } + + public void push(Object obj) { + list.addObject(obj); + } + + public Object pop() { + if (list.size() == 0) return null; + Object obj = list.get(list.size()-1); + list.removeObject(obj); + return obj; + } + + public Object peak() { + if (list.size() == 0) return null; + Object obj = list.get(list.size()-1); + return obj; + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } +} diff --git a/group07/396868934/DataStructure/src/com/louisly/java/main.java b/group07/396868934/DataStructure/src/com/louisly/java/main.java new file mode 100644 index 0000000000..c613c2f36c --- /dev/null +++ b/group07/396868934/DataStructure/src/com/louisly/java/main.java @@ -0,0 +1,84 @@ +package com.louisly.java; +import com.louisly.java.LYArrayList; +import com.louisly.java.LYObject; +import com.louisly.java.LYArrayLink; +import com.louisly.java.LYBinaryTree; + +public class main { + + public static void main(String[] args) { + +// testBinaryTree(); + testArrayLink(); +// testArrayList(); + } + + public static void testBinaryTree() { + LYBinaryTree tree = new LYBinaryTree(); + tree.addObject(new LYObject(5)); + tree.addObject(new LYObject(7)); + tree.addObject(new LYObject(2)); + tree.addObject(new LYObject(1)); + tree.addObject(new LYObject(6)); + tree.addObject(new LYObject(4)); + tree.addObject(new LYObject(8)); + } + + public static void testArrayLink() { + // 20Ԫ + LYArrayLink list = new LYArrayLink(); + for (int i = 0; i < 20; i++) { + LYObject object = new LYObject(i); + list.addObject(object); + } + + System.out.print("ǰйԪظ" + list.size() + "\n"); + + // ӡĿǰڵÿԪ + for (int i = 0; i < list.size(); i++) { + LYObject obj = (LYObject)list.get(i); + System.out.print(obj.i + "\n"); + } + + System.out.print("======\n"); + + // Ƴ߸Ԫ + list.removeAtIndex(7); + + System.out.print("ǰйԪظ" + list.size() + "\n"); + + // ٴӡĿǰʣЩԪ + for (int i = 0; i < list.size(); i++) { + LYObject obj = (LYObject)list.get(i); + System.out.print(obj.i + "\n"); + } + } + + public static void testArrayList() { + // 20Ԫ + LYArrayList list = new LYArrayList(); + for (int i = 0; i < 20; i++) { + LYObject object = new LYObject(i); + list.addObject(object); + } + + System.out.print("ǰйԪظ" + list.size() + "\n"); + + for (int i = 0; i < list.size(); i++) { + LYObject obj = (LYObject)list.get(i); + System.out.print(obj.i + "\n"); + } + + System.out.print("======\n"); + + + list.removeAtIndex(7); + System.out.print("ǰйԪظ" + list.size() + "\n"); + + for (int i = 0; i < list.size(); i++) { + LYObject obj = (LYObject)list.get(i); + System.out.print(obj.i + "\n"); + } + } + +} diff --git "a/group07/396868934/git\345\221\275\344\273\244.txt" "b/group07/396868934/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/396868934/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git "a/group07/43819473/git\345\221\275\344\273\244.txt" "b/group07/43819473/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/43819473/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/43819473/homework/pom.xml b/group07/43819473/homework/pom.xml new file mode 100644 index 0000000000..e9da2d1a08 --- /dev/null +++ b/group07/43819473/homework/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + + homework1 + homework + 1.0-SNAPSHOT + + + + + junit + junit + 4.12 + + + + com.alibaba + fastjson + 1.2.7 + + + + dom4j + dom4j + 1.6.1 + + + jaxen + jaxen + 1.1.1 + + + \ No newline at end of file diff --git a/group07/43819473/homework/src/main/java/coderising/array/ArrayUtil.java b/group07/43819473/homework/src/main/java/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..8ef221c5cf --- /dev/null +++ b/group07/43819473/homework/src/main/java/coderising/array/ArrayUtil.java @@ -0,0 +1,238 @@ +package coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static int[] reverseArray(int[] origin) { + int[] result = new int[origin.length]; + for (int i = 0; i <= origin.length - 1; i++) { + result[i] = origin[origin.length - 1 - i]; + } + return result; + } + + /** + * 现在有如下的一个数组: int origin[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param origin + * @return + */ + + public static int[] removeZero(int[] origin) { + int[] tempArray = new int[origin.length]; + int j = 0; + for (int i = 0; i <= origin.length - 1; i++) { + if (origin[i] != 0) { + tempArray[j++] = origin[i]; + } + } + + int[] result = new int[j]; + System.arraycopy(tempArray, 0, result, 0, j); + return result; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2) { + if (array1.length == 0) { + return array2; + } + if (array2.length == 0) { + return array1; + } + int[] tempArray = new int[array1.length + array2.length]; + int currentSize = array1.length; + System.arraycopy(array1, 0, tempArray, 0, array1.length); + for (int i = 0; i <= array2.length - 1; i++) { + for (int j = 0; j <= currentSize - 1; j++) { + if (array2[i] == tempArray[j]) { + break; + } else if (array2[i] < tempArray[j]) { + System.arraycopy(tempArray, j, tempArray, j + 1, currentSize - j); + tempArray[j] = array2[i]; + currentSize++; + break; + } + if (j == currentSize - 1) { + tempArray[j + 1] = array2[i]; + currentSize++; + break; + } + } + } + + int[] result = new int[currentSize]; + System.arraycopy(tempArray, 0, result, 0, currentSize); + return result; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + int[] result = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, result, 0, oldArray.length); + return result; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max <= 1) { + return new int[]{}; + } + + int[] temp = new int[max]; + temp[0] = 1; + temp[1] = 1; + + int i = 2; + while (i >= 2) { + int last = temp[i - 1] + temp[i - 2]; + if (last < max) { + temp[i++] = last; + } else { + break; + } + } + + int[] result = new int[i]; + System.arraycopy(temp, 0, result, 0, i); + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + if (max <= 2) { + return new int[]{}; + } else if (max == 3) { + return new int[]{2}; + } else { + int[] temp = new int[max / 2 + 1]; + temp[0] = 2; + int resultSize = 1; + + for (int i = 3; i < max; i += 2) { + boolean isPrime = true; + for (int j = 0; j <= resultSize - 1; j++) { + if (i % temp[j] == 0) { + isPrime = false; + break; + } + } + if (isPrime) { + temp[resultSize++] = i; + } + } + int[] result = new int[resultSize]; + System.arraycopy(temp, 0, result, 0, resultSize); + + return result; + } + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + int[] tempResult = new int[max]; + int resultSize = 0; + + //对小于max的值逐个循环判断 + for (int i = 2; i < max; i++) { +// System.out.println("==="+i); + int[] factors = new int[max];//因子数组 + factors[0] = 1; + int factorSize = 1; + + //获取因子 + for (int j = 2; j < i / 2 + 1; j++) { + if (i % j == 0) { + factors[factorSize++] = j; + } + } + + //计算因子数组的和是否与当前值相等,相等则放入结果数组中 + if (factorSize > 1) { + int sumValue = 0; + for (int factorIndex = 0; factorIndex <= factorSize - 1; factorIndex++) { + sumValue += factors[factorIndex]; + } + if (sumValue == i) { + tempResult[resultSize++] = i; + } + } + } + + int[] result = new int[resultSize]; + System.arraycopy(tempResult, 0, result, 0, resultSize); + return result; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public static String join(int[] array, String seperator) { + int size = array.length; + String result = ""; + if (size > 0) { + if (size == 1) { + result = String.valueOf(array[0]); + } else { + for (int i = 0; i < array.length - 1; i++) { + result += String.valueOf(array[i]) + seperator; + } + result += String.valueOf(array[array.length - 1]); + } + } + + return result; + } + +} diff --git a/group07/43819473/homework/src/main/java/coderising/litestruts/LoginAction.java b/group07/43819473/homework/src/main/java/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..c528df798a --- /dev/null +++ b/group07/43819473/homework/src/main/java/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group07/43819473/homework/src/main/java/coderising/litestruts/Struts.java b/group07/43819473/homework/src/main/java/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..c2b2ccad51 --- /dev/null +++ b/group07/43819473/homework/src/main/java/coderising/litestruts/Struts.java @@ -0,0 +1,95 @@ +package coderising.litestruts; + +import org.dom4j.*; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + + +public class Struts { + + /* + 0. 读取配置文件struts.xml + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + 2. 通过反射调用对象的execute 方法, 并获得返回值,例如"success" + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + public static View runAction(String actionName, Map parameters) { + + SAXReader reader = new SAXReader(); + View view = new View(); + + try { + //读取xml,获取class,获取对象 + Document document = reader.read(new File("src\\main\\java\\coderising\\litestruts\\struts.xml")); + Node node = document.selectSingleNode("//struts/action[@name='" + actionName + "']"); + Element element = (Element) node; + String className = element.attribute("class").getText(); + Class clazz = Class.forName(className); + Object object = clazz.newInstance(); + + //调用set方法设置属性 + for (Map.Entry entry : parameters.entrySet()) { + String methodName = "set" + entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1); + Method method = clazz.getMethod(methodName, entry.getValue().getClass()); + method.invoke(object, entry.getValue()); + } + + //调用exectue 方法, 并获得返回值 + Method methodExecute = clazz.getMethod("execute"); + String executeResult = methodExecute.invoke(object).toString(); + + //找到所有getter,调用并将值放到resultMap中 + Map resultMap = new HashMap(); + Method[] getMethods = clazz.getMethods(); + for (Method getMethod : getMethods) { + int index = getMethod.toString().lastIndexOf("."); + String pureName = getMethod.toString().substring(index + 1); + if (pureName.startsWith("get")) { //eg. getName() + String tempStr= pureName.substring(3); //eg. Name() + String attributeName = tempStr.substring(0, 1).toLowerCase() + tempStr.substring(1, tempStr.length() - 2); //eg. name + String attributeResult = getMethod.invoke(object).toString(); + resultMap.put(attributeName, attributeResult); + } + } + + //组装返回对象 + Node resultNode = node.selectSingleNode("result[@name='" + executeResult + "']"); + String resultTarget = resultNode.getText(); + view.setJsp(resultTarget).setParameters(resultMap); + + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } finally { + return view; + } + } + + public static void main(String[] args) { + + } + +} diff --git a/group07/43819473/homework/src/main/java/coderising/litestruts/StrutsTest.java b/group07/43819473/homework/src/main/java/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..024b5f196f --- /dev/null +++ b/group07/43819473/homework/src/main/java/coderising/litestruts/StrutsTest.java @@ -0,0 +1,38 @@ +package coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group07/43819473/homework/src/main/java/coderising/litestruts/View.java b/group07/43819473/homework/src/main/java/coderising/litestruts/View.java new file mode 100644 index 0000000000..22fdf877d8 --- /dev/null +++ b/group07/43819473/homework/src/main/java/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group07/43819473/homework/src/main/java/coderising/litestruts/struts.xml b/group07/43819473/homework/src/main/java/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..57ad66abd0 --- /dev/null +++ b/group07/43819473/homework/src/main/java/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group07/43819473/homework/src/main/java/dataStructure/ArrayList.java b/group07/43819473/homework/src/main/java/dataStructure/ArrayList.java new file mode 100644 index 0000000000..40ccb13a06 --- /dev/null +++ b/group07/43819473/homework/src/main/java/dataStructure/ArrayList.java @@ -0,0 +1,87 @@ +package dataStructure; + +/** + * Created by zj on 2017/2/20. + */ +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + if (size > elementData.length / 2) { + elementData = grow(elementData); + } + + elementData[size] = o; + size++; + } + + private Object[] grow(Object[] datas) { + Object[] elementDataNew = new Object[elementData.length + elementData.length / 4]; + System.arraycopy(datas, 0, elementDataNew, 0, size); + return elementDataNew; + } + + public void add(int index, Object o) { + + if (index <0 || index > size - 1) { + throw new IndexOutOfBoundsException("index out of bound"); + } + + if (size > elementData.length / 2) { + elementData = grow(elementData); + } + + for (int i = size - 1; i >= index; i--) { + elementData[i + 1] = elementData[i]; + } + elementData[index] = o; + size++; + } + + public Object get(int index) { + if (index <0 || index > size - 1) { + throw new IndexOutOfBoundsException("index out of bound"); + } + return elementData[index]; + } + + public Object remove(int index) { + if (index <0 || index > size - 1) { + throw new IndexOutOfBoundsException("index out of bound"); + } + + for (int i = index; i <= size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + elementData[size - 1] = null; + size--; + return null; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new ArrayListInterator(); + } + + private class ArrayListInterator implements Iterator { + + private int nowIndex = 0; + + public boolean hasNext() { + if (nowIndex <= size - 1) { + return true; + } + return false; + } + + public Object next() { + return elementData[nowIndex++]; + } + } +} diff --git a/group07/43819473/homework/src/main/java/dataStructure/BinaryTree.java b/group07/43819473/homework/src/main/java/dataStructure/BinaryTree.java new file mode 100644 index 0000000000..a93c25253e --- /dev/null +++ b/group07/43819473/homework/src/main/java/dataStructure/BinaryTree.java @@ -0,0 +1,73 @@ +package dataStructure; + +public class BinaryTree { + + private BinaryTreeNode root; + + public BinaryTreeNode getRoot() { + return root; + } + + public void setRoot(BinaryTreeNode root) { + this.root = root; + } + + public BinaryTreeNode insert(int data) { + BinaryTreeNode node = new BinaryTreeNode(data); + root = insert(root, node); + return root; + } + + private BinaryTreeNode insert(BinaryTreeNode root, BinaryTreeNode newNode) { + if (root == null) { + root = newNode; + } else if (newNode.data > root.data) { + root.right = insert(root.right, newNode); + } else { + root.left = insert(root.left, newNode); + } + return root; + } + + /** + * binary tree node + */ + private class BinaryTreeNode { + + private int data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(int data) { + this.left = null; + this.right = null; + this.data = data; + } + + public int getData() { + return data; + } + + public void setData(int data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + } +} + diff --git a/group07/43819473/homework/src/main/java/dataStructure/Iterator.java b/group07/43819473/homework/src/main/java/dataStructure/Iterator.java new file mode 100644 index 0000000000..06ad99316f --- /dev/null +++ b/group07/43819473/homework/src/main/java/dataStructure/Iterator.java @@ -0,0 +1,9 @@ +package dataStructure; + +/** + * Created by zj on 2017/2/20. + */ +public interface Iterator { + public boolean hasNext(); + public Object next(); +} \ No newline at end of file diff --git a/group07/43819473/homework/src/main/java/dataStructure/LinkedList.java b/group07/43819473/homework/src/main/java/dataStructure/LinkedList.java new file mode 100644 index 0000000000..f6a960698a --- /dev/null +++ b/group07/43819473/homework/src/main/java/dataStructure/LinkedList.java @@ -0,0 +1,116 @@ +package dataStructure; + +/** + * Created by LvZhenxing on 2017/2/21. + */ +public class LinkedList implements List { + + private Node head=new Node(); + private int size = 0; + + public void add(Object o) { + addToNode(head,o); + size++; + } + + public void add(int index, Object o) { + if (index <0 || index > size) { + throw new IndexOutOfBoundsException("index out of bound"); + } + + addToNode(getLastNode(index),o); + size++; + } + + private Node getLastNode(int index){ + + Node nowNode = head; + for (int pos = 1; pos <= index; pos++) { + nowNode = nowNode.next; + } + return nowNode; + } + private void addToNode(Node node,Object o){ + if (node.next == null) { + Node newNode = new Node(); + newNode.data = o; + node.next = newNode; + } else { + Node newNode = new Node(); + newNode.data = o; + newNode.next = node.next; + node.next = newNode; + } + } + + public Object get(int index) { + if (index <0 || index > size - 1) { + throw new IndexOutOfBoundsException("index out of bound"); + } + + Node node= getLastNode(index); + return node.next==null?null:node.next.data; + } + + public Object remove(int index) { + if (index <0 || index > size - 1) { + throw new IndexOutOfBoundsException("index out of bound"); + } + + Node node= getLastNode(index); + Node nowNode=node.next; + if(nowNode.next!=null){ + node.next=node.next.next; + }else{ + node.next=null; + } + size--; + return nowNode.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + add(0,o); + } + + public void addLast(Object o) { + add(size,o); + } + + public Object removeFirst() { + return remove(0); + } + + public Object removeLast() { + return remove(size-1); + } + + public Iterator iterator() { + return new LinkedListInterator(); + } + + private class LinkedListInterator implements Iterator { + + private int nowIndex = 0; + + public boolean hasNext() { + if (nowIndex <= size - 1) { + return true; + } + return false; + } + + public Object next() { + return get(nowIndex++); + } + } + + + private static class Node { + Object data; + Node next; + } +} diff --git a/group07/43819473/homework/src/main/java/dataStructure/List.java b/group07/43819473/homework/src/main/java/dataStructure/List.java new file mode 100644 index 0000000000..0b1b43fc26 --- /dev/null +++ b/group07/43819473/homework/src/main/java/dataStructure/List.java @@ -0,0 +1,16 @@ +package dataStructure; + +/** + * Created by zj on 2017/2/20. + */ +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} \ No newline at end of file diff --git a/group07/43819473/homework/src/main/java/dataStructure/Queue.java b/group07/43819473/homework/src/main/java/dataStructure/Queue.java new file mode 100644 index 0000000000..943e0e64f6 --- /dev/null +++ b/group07/43819473/homework/src/main/java/dataStructure/Queue.java @@ -0,0 +1,25 @@ +package dataStructure; + +/** + * Created by LvZhenxing on 2017/2/22. + */ +public class Queue { + + private LinkedList list=new LinkedList(); + + public void enQueue(Object o) { + list.addFirst(o); + } + + public Object deQueue() { + return list.removeLast(); + } + + public boolean isEmpty() { + return list.size()==0?true:false; + } + + public int size() { + return list.size(); + } +} diff --git a/group07/43819473/homework/src/main/java/dataStructure/Stack.java b/group07/43819473/homework/src/main/java/dataStructure/Stack.java new file mode 100644 index 0000000000..e1a7161317 --- /dev/null +++ b/group07/43819473/homework/src/main/java/dataStructure/Stack.java @@ -0,0 +1,29 @@ +package dataStructure; + +/** + * Created by LvZhenxing on 2017/2/22. + */ +public class Stack { + + private LinkedList list = new LinkedList(); + + public void push(Object o) { + list.addFirst(o); + } + + public Object pop() { + return list.removeFirst(); + } + + public Object peek() { + return list.get(0); + } + + public boolean isEmpty() { + return list.size() == 0 ? true : false; + } + + public int size() { + return list.size(); + } +} diff --git a/group07/43819473/homework/src/test/java/coderising/array/ArrayUtilTest.java b/group07/43819473/homework/src/test/java/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..a19eb84269 --- /dev/null +++ b/group07/43819473/homework/src/test/java/coderising/array/ArrayUtilTest.java @@ -0,0 +1,81 @@ +package coderising.array; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + +import static org.junit.Assert.*; + +/** + * Created by zj on 2017/3/4. + */ +public class ArrayUtilTest { + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void reverseArray() throws Exception { + Assert.assertArrayEquals(new int[]{3, 30, 9, 7}, ArrayUtil.reverseArray(new int[]{7, 9, 30, 3})); + Assert.assertArrayEquals(new int[]{6, 3, 30, 9, 7}, ArrayUtil.reverseArray(new int[]{7, 9, 30, 3, 6})); + } + + @Test + public void removeZero() throws Exception { + Assert.assertArrayEquals(new int[]{1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}, + ArrayUtil.removeZero(new int[]{1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5})); + } + + @Test + public void merge() throws Exception { + Assert.assertArrayEquals(new int[]{}, ArrayUtil.merge(new int[]{}, new int[]{})); + Assert.assertArrayEquals(new int[]{1, 2}, ArrayUtil.merge(new int[]{}, new int[]{1, 2})); + Assert.assertArrayEquals(new int[]{1, 2}, ArrayUtil.merge(new int[]{1, 2}, new int[]{})); + Assert.assertArrayEquals(new int[]{3, 4, 5, 6, 7, 8}, ArrayUtil.merge(new int[]{3, 5, 7, 8}, new int[]{4, 5, 6, 7})); + Assert.assertArrayEquals(new int[]{2, 3, 5, 6, 7, 8, 9}, ArrayUtil.merge(new int[]{3, 5, 7, 8}, new int[]{2, 5, 6, 9})); + Assert.assertArrayEquals(new int[]{3, 4, 5, 6, 7, 8}, ArrayUtil.merge(new int[]{4, 5, 6, 7}, new int[]{3, 5, 7, 8})); + Assert.assertArrayEquals(new int[]{2, 3, 5, 6, 7, 8, 9}, ArrayUtil.merge(new int[]{2, 5, 6, 9}, new int[]{3, 5, 7, 8})); + } + + @Test + public void grow() throws Exception { + Assert.assertArrayEquals(new int[]{2, 3, 6, 0, 0, 0}, ArrayUtil.grow(new int[]{2, 3, 6}, 3)); + } + + @Test + public void fibonacci() throws Exception { + Assert.assertArrayEquals(new int[]{}, ArrayUtil.fibonacci(1)); + Assert.assertArrayEquals(new int[]{1, 1}, ArrayUtil.fibonacci(2)); + Assert.assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8, 13}, ArrayUtil.fibonacci(15)); + } + + @Test + public void getPrimes() throws Exception { + Assert.assertArrayEquals(new int[]{}, ArrayUtil.getPrimes(2)); + Assert.assertArrayEquals(new int[]{2}, ArrayUtil.getPrimes(3)); + Assert.assertArrayEquals(new int[]{2, 3}, ArrayUtil.getPrimes(4)); + Assert.assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13, 17, 19}, ArrayUtil.getPrimes(23)); + } + + @Test + public void getPerfectNumbers() throws Exception { + Assert.assertArrayEquals(new int[]{6,28}, ArrayUtil.getPerfectNumbers(100)); +// System.out.println(Arrays.toString(ArrayUtil.getPerfectNumbers(40000000))); + } + + @Test + public void join() throws Exception { + Assert.assertEquals("", ArrayUtil.join(new int[]{}, "-")); + Assert.assertEquals("3", ArrayUtil.join(new int[]{3}, "-")); + Assert.assertEquals("3-8-9", ArrayUtil.join(new int[]{3, 8, 9}, "-")); + } +} \ No newline at end of file diff --git a/group07/43819473/homework/src/test/java/dataStructure/ArrayListTest.java b/group07/43819473/homework/src/test/java/dataStructure/ArrayListTest.java new file mode 100644 index 0000000000..02ea9fbb6e --- /dev/null +++ b/group07/43819473/homework/src/test/java/dataStructure/ArrayListTest.java @@ -0,0 +1,79 @@ +package dataStructure; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by zj on 2017/2/20. + */ +public class ArrayListTest { + ArrayList list =null; + + + @Before + public void setUp() throws Exception { + list = new ArrayList(); + for (int i = 0; i < 200; i++) { + list.add(i); + } + + System.out.println("=============================before=============================="); + for (int i = 0; i < list.size(); i++) { + try { + System.out.println("index=" + i + ",data=" + list.get(i) + ",next=" + list.get(i + 1)); + } catch (Exception e) { + System.out.println("index=" + i + ",data=" + list.get(i) + ",next=null"); + } finally { + + } + + } + } + + @After + public void tearDown() throws Exception { + System.out.println("=============================after=============================="); + for (int i = 0; i < list.size(); i++) { + System.out.print(list.get(i) + ","); + } + } + + @Test + public void add() throws Exception { + } + + @Test + public void add1() throws Exception { + list.add(5, 555); + list.add(12, 1255); + } + + @Test + public void get() throws Exception { + + } + + @Test + public void remove() throws Exception { + list.remove(3); + list.remove(90); + } + + @Test + public void size() throws Exception { + } + + @Test + public void iterator() throws Exception { + + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + System.out.print(iterator.next() + ","); + } + + System.out.println(); + System.out.println("---------------------------"); + } + +} \ No newline at end of file diff --git a/group07/43819473/homework/src/test/java/dataStructure/BinaryTreeTest.java b/group07/43819473/homework/src/test/java/dataStructure/BinaryTreeTest.java new file mode 100644 index 0000000000..90698681e7 --- /dev/null +++ b/group07/43819473/homework/src/test/java/dataStructure/BinaryTreeTest.java @@ -0,0 +1,34 @@ +package dataStructure; + +import com.alibaba.fastjson.JSON; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by zj on 2017/2/26. + */ +public class BinaryTreeTest { + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void insert() throws Exception { + BinaryTree tree=new BinaryTree(); + tree.insert(6); + tree.insert(5); + tree.insert(8); + tree.insert(3); + tree.insert(4); + System.out.println(JSON.toJSONString(tree.getRoot())); + } +} \ No newline at end of file diff --git a/group07/43819473/homework/src/test/java/dataStructure/LinkedListTest.java b/group07/43819473/homework/src/test/java/dataStructure/LinkedListTest.java new file mode 100644 index 0000000000..cc7e2bebcb --- /dev/null +++ b/group07/43819473/homework/src/test/java/dataStructure/LinkedListTest.java @@ -0,0 +1,102 @@ +package dataStructure; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by LvZhenxing on 2017/2/22. + */ +public class LinkedListTest { + + LinkedList list = null; + + @Before + public void setUp() throws Exception { + list = new LinkedList(); + for (int i = 0; i < 6; i++) { + list.add(i); + } + System.out.println("=============================before=============================="); + for (int i = 0; i < list.size(); i++) { + try { + System.out.println("index=" + i + ",data=" + list.get(i) + ",next=" + list.get(i + 1)); + } catch (Exception e) { + System.out.println("index=" + i + ",data=" + list.get(i) + ",next=null"); + } finally { + + } + } + } + + @After + public void tearDown() throws Exception { + System.out.println("=============================after=============================="); + for (int i = 0; i < list.size(); i++) { + try { + System.out.println("index=" + i + ",data=" + list.get(i) + ",next=" + list.get(i + 1)); + } catch (Exception e) { + System.out.println("index=" + i + ",data=" + list.get(i) + ",next=null"); + } finally { + + } + + } + } + + @Test + public void testAdd() throws Exception { + list.add(300); + } + + @Test + public void testAdd1() throws Exception { + list.add(2, 100); + } + + @Test + public void testGet() throws Exception { + + } + + @Test + public void testRemove() throws Exception { + list.remove(3); + } + + @Test + public void testSize() throws Exception { + + } + + @Test + public void testAddFirst() throws Exception { + list.addFirst(66); + } + + @Test + public void testAddLast() throws Exception { + list.addLast(77); + } + + @Test + public void testRemoveFirst() throws Exception { + list.removeFirst(); + } + + @Test + public void testRemoveLast() throws Exception { + list.removeLast(); + } + + @Test + public void testIterator() throws Exception { + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + System.out.print(iterator.next() + ","); + } + + System.out.println(); + System.out.println("---------------------------"); + } +} \ No newline at end of file diff --git a/group07/43819473/homework/src/test/java/dataStructure/QueueTest.java b/group07/43819473/homework/src/test/java/dataStructure/QueueTest.java new file mode 100644 index 0000000000..2d11213d42 --- /dev/null +++ b/group07/43819473/homework/src/test/java/dataStructure/QueueTest.java @@ -0,0 +1,51 @@ +package dataStructure; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by LvZhenxing on 2017/2/22. + */ +public class QueueTest { + + Queue list = null; + + @Before + public void setUp() throws Exception { + list = new Queue(); + for (int i = 0; i < 5; i++) { + list.enQueue(i); + } + } + + @After + public void tearDown() throws Exception { + System.out.println("----------------tearDown------------------"); + int count=list.size(); + for (int i = 0; i < count; i++) { + System.out.println("list.deQueue():"+list.deQueue()); + } + } + + @Test + public void testEnQueue() throws Exception { + list.enQueue(11); + } + + @Test + public void testDeQueue() throws Exception { + System.out.println("list.deQueue():"+list.deQueue()); + System.out.println("list.deQueue():"+list.deQueue()); + } + + @Test + public void testIsEmpty() throws Exception { + System.out.println("testIsEmpty:"+list.isEmpty()); + } + + @Test + public void testSize() throws Exception { + System.out.println("testSize:"+list.size()); + } +} \ No newline at end of file diff --git a/group07/43819473/homework/src/test/java/dataStructure/StackTest.java b/group07/43819473/homework/src/test/java/dataStructure/StackTest.java new file mode 100644 index 0000000000..016bdb5811 --- /dev/null +++ b/group07/43819473/homework/src/test/java/dataStructure/StackTest.java @@ -0,0 +1,56 @@ +package dataStructure; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by zj on 2017/2/24. + */ +public class StackTest { + Stack list = null; + + @Before + public void setUp() throws Exception { + list = new Stack(); + for (int i = 0; i < 5; i++) { + list.push(i); + } + } + + @After + public void tearDown() throws Exception { + System.out.println("----------------tearDown------------------"); + int count=list.size(); + for (int i = 0; i < count; i++) { + System.out.println("list.pop():"+list.pop()); + } + } + + @Test + public void push() throws Exception { + list.push(11); + } + + @Test + public void pop() throws Exception { + System.out.println("list.pop():"+list.pop()); + System.out.println("list.pop():"+list.pop()); + } + + @Test + public void peek() throws Exception { + System.out.println("list.peek():"+list.peek()); + } + + @Test + public void testIsEmpty() throws Exception { + System.out.println("testIsEmpty:"+list.isEmpty()); + } + + @Test + public void testSize() throws Exception { + System.out.println("testSize:"+list.size()); + } + +} \ No newline at end of file diff --git "a/group07/466199956/git\345\221\275\344\273\244.txt" "b/group07/466199956/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/466199956/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/476770768/MyDataStructure/.classpath b/group07/476770768/MyDataStructure/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group07/476770768/MyDataStructure/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group07/476770768/MyDataStructure/.gitignore b/group07/476770768/MyDataStructure/.gitignore new file mode 100644 index 0000000000..c910559f7f --- /dev/null +++ b/group07/476770768/MyDataStructure/.gitignore @@ -0,0 +1,17 @@ +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +#ide config +.metadata +.recommenders +/bin/ diff --git a/group07/476770768/MyDataStructure/.project b/group07/476770768/MyDataStructure/.project new file mode 100644 index 0000000000..08d17729a9 --- /dev/null +++ b/group07/476770768/MyDataStructure/.project @@ -0,0 +1,17 @@ + + + MyDataStructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group07/476770768/MyDataStructure/.settings/org.eclipse.jdt.core.prefs b/group07/476770768/MyDataStructure/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group07/476770768/MyDataStructure/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/BinaryTreeNode.java b/group07/476770768/MyDataStructure/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..62de6cf9a9 --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,44 @@ +package com.coding.basic; + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public void insert(BinaryTreeNode node) { + if (this.data == null) { + // empty binary tree + this.data = node.data; + this.left = node.left; + this.right = node.right; + } else if (((Integer) this.data).intValue() >= ((Integer) node.data).intValue()) { + this.left.insert(node); + }else{ + this.right.insert(node); + } + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyArrayList.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyArrayList.java new file mode 100644 index 0000000000..d3a2a2856e --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/basic/MyArrayList.java @@ -0,0 +1,149 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class MyArrayList implements MyList{ + + private int size = 0; + + private Object[] elementData = new Object[5]; + + @Override + /** + * add an element to the end + */ + public void add(Object o) { + int index = size; + if(isFull()){ + extendLength(); + } + elementData[index] = o; + size++; + } + + @Override + /** + * add an element to certain index + */ + public void add(int index, Object o) { + checkBounds(index); + if(isFull()){ + extendLength(); + } + for(int i=size; i>=index; i--){ + elementData[i+1] = elementData[i]; + } + elementData[index] = o; + size++; + } + + @Override + /** + * get an element + */ + public Object get(int index) { + checkBoundsForGet(index); + if(index >= size){ + return null; + } + return elementData[index]; + } + + @Override + /** + * remove an element + */ + public Object remove(int index) { + checkBounds(index); + Object res = elementData[index]; + for(int i=index+1; i<=size; i++){ + elementData[i-1] = elementData[i]; + } + size--; + return res; + } + + @Override + public int size() { + return size; + } + + /** + * extends the length + */ + public void extendLength(){ + elementData = Arrays.copyOf(elementData, elementData.length * 2); + //System.out.println("add extend "+elementData.length); + } + + public boolean isEmpty(){ + return size == 0; + } + + public boolean isFull(){ + int len = elementData.length; + if(size >= len-1){ + return true; + } + return false; + } + + public void checkBounds(int index){ + if(index > size || index < 0){ + //System.out.println("From MyArrayList: Index out of bounds"); + throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); + } + } + + /** + * for get() + * @param index + */ + public void checkBoundsForGet(int index){ + if(index >= elementData.length || index < 0){ + //System.out.println("From MyArrayList: Index out of bounds"); + throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); + } + } + + public String OutOfBoundsMsg(int index){ + return "Index: "+index+", Size: "+size; + } + + @Override + public String toString() { + String s = ""; + for(int i=0; i size - 1) { + // System.out.println("From MyLinkedList: Index out of bounds"); + throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); + } + } + + /** + * the index should be within 0~size + * + * @param index + */ + public void checkBoundsForAdd(int index) { + if (index < 0 || index > size) { + // System.out.println("From MyLinkedList: Index out of bounds"); + throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); + } + } + + public String OutOfBoundsMsg(int index) { + return "Index: " + index + ", Size: " + size; + } + + /** + * find the position of index + * + * @param index + * @return + */ + public Node findIndexPosition(int index) { + Node pos = head; + for (int i = 0; i < index; i++) { + pos = pos.next; + } + return pos; + } + + @Override + public String toString() { + String s = ""; + Node tmp = head; + while (tmp != null) { + s += tmp.data + " "; + tmp = tmp.next; + } + return s; + } + + private static class Node { + public Object data; + public Node prov; + public Node next; + + public Node() { + } + + public Node(Object o) { + this.data = o; + this.prov = null; + this.next = null; + } + } + + public MyIterator iterator() { + return new LinkedListIterator(this); + } + + private class LinkedListIterator implements MyIterator{ + + private MyLinkedList eleIterator; + private int pos; + + private LinkedListIterator(MyLinkedList mll){ + this.eleIterator = mll; + this.pos = 0; + } + + @Override + public boolean hasNext() { + return pos <= size; + } + + @Override + public Object next() { + Node res = eleIterator.get(pos); + pos++; + return res; + } + + } + +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyLinkedListTest.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyLinkedListTest.java new file mode 100644 index 0000000000..0b8a38f82c --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/basic/MyLinkedListTest.java @@ -0,0 +1,67 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class MyLinkedListTest { + + @Test + public void testAddObject() { + MyLinkedList mll = new MyLinkedList(); + assertEquals(0, mll.size()); + mll.add(new Integer(1)); + assertEquals(1, mll.size()); + } + + @Test + public void testAddIntObject() { + MyLinkedList mll = new MyLinkedList(); + mll.add(0, new Integer(1)); + assertEquals(1, mll.size()); + int tmp = 0; + try { + mll.add(4, new Integer(4)); + } catch (IndexOutOfBoundsException e) { + tmp = 1; + assertEquals(tmp, 1); + } + } + + @Test + public void testGet() { + MyLinkedList mll = new MyLinkedList(); + mll.add(new Object()); + assertNotNull(mll.get(0)); + int tmp = 0; + try { + mll.get(4); + } catch (IndexOutOfBoundsException e) { + tmp = 1; + assertEquals(tmp, 1); + } + } + + @Test + public void testRemove() { + MyLinkedList mll = new MyLinkedList(); + mll.add(new Object()); + mll.remove(0); + assertEquals(mll.size(),0); + } + + @Test + public void testSize() { + MyLinkedList mll = new MyLinkedList(); + assertEquals(0, mll.size()); + } + + @Test + public void testIsEmpty() { + MyLinkedList mll = new MyLinkedList(); + assertTrue(mll.isEmpty()); + mll.add(new Object()); + assertFalse(mll.isEmpty()); + } + +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyList.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyList.java new file mode 100644 index 0000000000..8e178fb856 --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/basic/MyList.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface MyList { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyQueue.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyQueue.java new file mode 100644 index 0000000000..849691d67f --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/basic/MyQueue.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +public class MyQueue { + + private MyLinkedList elementData = new MyLinkedList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + //if queue is empty, element.size()-1 = -1 + //MyLinkedList will throw exception + Object tmp = elementData.remove(elementData.size()-1); + return tmp; + } + + public boolean isEmpty(){ + return elementData.isEmpty(); + } + + public int size(){ + return elementData.size(); + } + + public MyIterator iterator() { + return elementData.iterator(); + } + +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyQueueTest.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyQueueTest.java new file mode 100644 index 0000000000..867dd8ec86 --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/basic/MyQueueTest.java @@ -0,0 +1,45 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class MyQueueTest { + + @Test + public void testEnQueue() { + MyQueue mq = new MyQueue(); + assertEquals(mq.size(), 0); + mq.enQueue(new Object()); + assertEquals(mq.size(), 1); + } + + @Test + public void testDeQueue() { + MyQueue mq = new MyQueue(); + int tmp = 0; + try { + mq.deQueue(); + } catch (IndexOutOfBoundsException e) { + tmp = 1; + assertEquals(tmp, 1); + } + mq.enQueue(new Object()); + assertNotNull(mq.deQueue()); + } + + @Test + public void testIsEmpty() { + MyQueue mq = new MyQueue(); + assertTrue(mq.isEmpty()); + mq.enQueue(new Object()); + assertFalse(mq.isEmpty()); + } + + @Test + public void testSize() { + MyQueue mq = new MyQueue(); + assertEquals(mq.size(), 0); + } + +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyStack.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyStack.java new file mode 100644 index 0000000000..6dcbd07c60 --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/basic/MyStack.java @@ -0,0 +1,44 @@ +package com.coding.basic; + +import java.util.EmptyStackException; + +public class MyStack { + private MyArrayList elementData = new MyArrayList(); + int top = -1;//always points to top element + + public void push(Object o){ + elementData.add(o); + top++; + } + + public Object pop(){ + if(isEmpty()){ + throw new EmptyStackException(); + }else{ + Object tmp = elementData.remove(top); + top--; + return tmp; + } + } + + public Object peek(){ + if(isEmpty()){ + throw new EmptyStackException(); + }else{ + Object tmp = elementData.get(top); + return tmp; + } + } + + public boolean isEmpty(){ + return top < 0; + } + + public int size(){ + return top + 1; + } + + public MyIterator iterator() { + return elementData.iterator(); + } +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/MyStackTest.java b/group07/476770768/MyDataStructure/src/com/coding/basic/MyStackTest.java new file mode 100644 index 0000000000..d0840d3dca --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/basic/MyStackTest.java @@ -0,0 +1,56 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import java.util.EmptyStackException; + +import org.junit.Test; + +public class MyStackTest { + + @Test + public void testPush() { + MyStack ms = new MyStack(); + assertEquals(0, ms.size()); + ms.push(new Object()); + assertEquals(1, ms.size()); + } + + @Test + public void testPop() { + MyStack ms = new MyStack(); + ms.push(new Object()); + assertNotNull(ms.pop()); + assertEquals(0, ms.size()); + } + + @Test + public void testPeek() { + MyStack ms = new MyStack(); + int tmp = 0; + try { + ms.peek(); + } catch (EmptyStackException e) { + tmp = 1; + assertEquals(1, tmp); + } + ms.push(new Object()); + assertNotNull(ms.peek()); + assertEquals(1, ms.size()); + } + + @Test + public void testIsEmpty() { + MyStack ms = new MyStack(); + assertTrue(ms.isEmpty()); + ms.push(new Object()); + assertFalse(ms.isEmpty()); + } + + @Test + public void testSize() { + MyStack ms = new MyStack(); + assertEquals(0, ms.size()); + } + +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/basic/testFile.java b/group07/476770768/MyDataStructure/src/com/coding/basic/testFile.java new file mode 100644 index 0000000000..0bba647b11 --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/basic/testFile.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public class testFile { + + public static void main(String[] args) { + } + +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyArrayList.java b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyArrayList.java new file mode 100644 index 0000000000..cb1e4e2b30 --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyArrayList.java @@ -0,0 +1,131 @@ +package com.coding.refactor.List; + +public class MyArrayList implements MyList{ + private int size = 0; + private Object[] dataArray = new Object[0]; + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public void add(T o) { + ensureCapacity(size + 1); + dataArray[size++] = o; + } + + @Override + public void add(int index, T o) { + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); + } + + ensureCapacity(size + 1); + System.arraycopy(dataArray, index, dataArray, index + 1, size - index); + dataArray[index] = o; + } + + @Override + public boolean contains(Object o) { + for(Object ele : dataArray){ + if(o.equals(ele)){ + return true; + } + } + return false; + } + + @Override + public Object[] toArray() { + Object[] newArray = new Object[size]; + System.arraycopy(dataArray, 0, newArray, 0, size); + return newArray; + } + + @Override + public boolean remove(T o) { + int index = indexOf(o); + if(index < 0){ + return false; + } + System.arraycopy(dataArray, index + 1, dataArray, index, size - 1 - index); + dataArray[--size] = null; + return true; + } + + @Override + public T remove(int index) { + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); + } + + T ele = (T)dataArray[index]; + System.arraycopy(dataArray, index, dataArray, index+1, size-1-index); + dataArray[--size] = null; + return ele; + } + + @Override + public T get(int index) { + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); + } + T ele = (T)dataArray[index]; + return ele; + } + + @Override + public T set(int index, T element) { + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); + } + dataArray[index] = element; + return element; + } + + @Override + public void clear() { + for(int i=0; i iterator() { + // TODO Auto-generated method stub + return null; + } + + private void ensureCapacity(int minCapacity) { + if(minCapacity > dataArray.length){ + int newCapacity = Math.max(minCapacity, dataArray.length * 2); + Object[] newDataArray = new Object[newCapacity]; + System.arraycopy(dataArray, 0, newDataArray, 0, dataArray.length); + dataArray = newDataArray; + } + + } + + private String OutOfBoundsMsg(int index) { + return "Index: "+index+", Size: "+size; + } + +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyIterator.java b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyIterator.java new file mode 100644 index 0000000000..79ffd5896b --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyIterator.java @@ -0,0 +1,12 @@ +package com.coding.refactor.List; + +/** + * + * @author nelson + * + */ +public interface MyIterator { + boolean hasNext(); + + T next(); +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyList.java b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyList.java new file mode 100644 index 0000000000..78a2f97769 --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyList.java @@ -0,0 +1,35 @@ +package com.coding.refactor.List; + +/** + * + * created by nelson on 2017/03/03 + * + */ +public interface MyList { + + int size(); + + boolean isEmpty(); + + void add(T o); + + void add(int index, T o); + + boolean contains(Object o); + + Object[] toArray(); + + boolean remove(T o); + + T remove(int index); + + T get(int index); + + T set(int index, T element); + + void clear(); + + int indexOf(T o); + + MyIterator iterator(); +} diff --git a/group07/476770768/MyDataStructure/src/com/coding/refactor/List/TestFile.java b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/TestFile.java new file mode 100644 index 0000000000..0a5fd8ea06 --- /dev/null +++ b/group07/476770768/MyDataStructure/src/com/coding/refactor/List/TestFile.java @@ -0,0 +1,11 @@ +package com.coding.refactor.List; + +public class TestFile { + + public static void main(String[] args) { + int[] a = new int[]{1,2,3,4,5}; + System.arraycopy(a, 1, a, 2, 3); + + } + +} diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/.classpath b/group07/476770768/Week2_HOMEWORK/Coderising/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/.gitignore b/group07/476770768/Week2_HOMEWORK/Coderising/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/.project b/group07/476770768/Week2_HOMEWORK/Coderising/.project new file mode 100644 index 0000000000..33611933d8 --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/.project @@ -0,0 +1,17 @@ + + + Coderising + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/.settings/org.eclipse.jdt.core.prefs b/group07/476770768/Week2_HOMEWORK/Coderising/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/Array/ArrayUtil.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/Array/ArrayUtil.java new file mode 100644 index 0000000000..58056657b9 --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/Array/ArrayUtil.java @@ -0,0 +1,227 @@ +package com.Array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * һa , Ըֵû 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] a = + * [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if (origin == null) + return; + int head = 0; + int tail = origin.length - 1; + int tmp; + while (head < tail) { + tmp = origin[tail]; + origin[tail] = origin[head]; + origin[head] = tmp; + head++; + tail--; + } + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int nonZeroNum = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + nonZeroNum++; + } + } + int cnt = 0; + int[] newArray = new int[nonZeroNum]; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[cnt++] = oldArray[i]; + } + } + return newArray; + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ + * a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int[] resultArray = new int[array1.length + array2.length]; + int cnt1 = 0; + int cnt2 = 0; + int cntResult = 0; + resultArray[cntResult++] = array1[0] array2[cnt2]){ + if(resultArray[cntResult-1] != array2[cnt2]){ + //array2[cnt2]еСûظ + //resultArray + resultArray[cntResult++] = array2[cnt2++]; + }else{ + //array2[cnt2]еСظ + cnt2++; + } + }else{ + if(resultArray[cntResult-1] != array1[cnt1]){ + //array1[cnt1]еСûظ + //resultArray + resultArray[cntResult++] = array1[cnt1++]; + }else{ + //array1[cnt1]еСظ + cnt1++; + } + } + } + + //ΪʣಿַresultArray + if(cnt1 == array1.length){ + //array2ʣ + while(cnt2 < array2.length){ + //array2ʣظؼresultArray + if(resultArray[cntResult-1] != array2[cnt2]){ + resultArray[cntResult++] = array2[cnt2++]; + }else{ + cnt2++; + } + } + }else{ + while(cnt1 < array1.length){ + //array1ʣظؼresultArray + if(resultArray[cntResult-1] != array1[cnt1]){ + resultArray[cntResult++] = array1[cnt1++]; + }else{ + cnt1++; + } + } + } + return Arrays.copyOf(resultArray, cntResult); + } + + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + for(int i=0; i { + private Node head; + private Node current; + private int size = 0; + + public void add(T o){ + if(head == null){ + head = new Node(o); + current = head; + }else{ + Node tmp = new Node(o); + current.next = tmp; + current = tmp; + } + size++; + } + + public int[] toIntArray(){ + if(size == 0) return null; + int[] intArray = new int[this.size()]; + Node tmp = head; + for(int i=0; i get(int index){ + checkBounds(index); + if (index == 0) { + return head; + } else { + Node pos = findIndexPosition(index); + return pos; + } + } + public Object remove(int index){ + return null; + } + + public void remove(Node n){ + Node former = head; + while(former.next != n) former = former.next; + former.next = n.next; + size--; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + + } + + public void addLast(Object o){ + + } + public Node removeFirst(){ + if(head == null) return null; + Node tmp = head; + head = head.next; + this.size--; + return tmp; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + public void checkBounds(int index) { + if (index < 0 || index > size - 1) { + // System.out.println("From MyLinkedList: Index out of bounds"); + throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); + } + } + + public String OutOfBoundsMsg(int index) { + return "Index: " + index + ", Size: " + size; + } + + public Node findIndexPosition(int index) { + Node pos = head; + for (int i = 0; i < index; i++) { + pos = pos.next; + } + return pos; + } + + + private static class Node{ + T data; + Node next; + + public Node(T o){ + this.data = o; + this.next = null; + } + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + if(head == null) return; + Node newHead = head; + head = head.next; + newHead.next = null; + while(head != null){ + Node tmp = head; + head = head.next; + tmp.next = newHead; + newHead = tmp; + } + head = newHead; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + int midLen = this.size()/2; + for(int i=0; i= size) return; + if(length < 0 ||length >= size) return; + if(i == 0){ + for(int j=0; j startNode = head; + for(int j=0; j pointer = startNode; + while(cnt101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + Iterator it = list.iterator(); + int[] restArray = new int[list.size()]; + int cnt = 0; + while(it.hasNext()){ + int index = it.next(); + restArray[cnt++] = (int)get(index).data; + } + return restArray; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + if(head == null) return; + Node cur = head.next; + Node former = head; + while(cur != null){ + if(former.data.equals(cur.data)){ + remove(cur); + cur = cur.next; + }else{ + former = former.next; + cur = cur.next; + } + } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + if((int)head.data > min){ + head = findMaxLocation(head, max); + }else{ + Node former = head; + while((int)former.data < min && former != null){ + former = former.next; + } + Node behind = findMaxLocation(former.next, max); + former.next = behind; + + } + } + + public Node findMaxLocation(Node n, int max){ + Node tmp = n; + while((int)tmp.data < max && tmp != null){ + tmp = tmp.next; + size--; + } + return tmp; + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection(LinkedList list){ + if(head == null) return list; + + return null; + } +} diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtilTest.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtilTest.java new file mode 100644 index 0000000000..ca1559f2b0 --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtilTest.java @@ -0,0 +1,139 @@ +package com.LinkedList; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class LinkedListUtilTest { + LinkedListUtil llu; + @Before + public void setUp() throws Exception { + llu = new LinkedListUtil(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverse() { + llu.reverse(); + assertArrayEquals(null, llu.toIntArray()); + llu.add(3); + llu.add(7); + llu.add(10); + llu.reverse(); + assertArrayEquals(new int[]{10,7,3}, llu.toIntArray()); + } + + @Test + public void testRemoveFirstHalf() { + llu.removeFirstHalf(); + assertArrayEquals(null, llu.toIntArray()); + llu.add(2); + llu.add(5); + llu.add(7); + llu.add(8); + llu.removeFirstHalf(); + assertArrayEquals(new int[]{7,8}, llu.toIntArray()); + llu = new LinkedListUtil(); + llu.add(2); + llu.add(5); + llu.add(7); + llu.add(8); + llu.add(10); + llu.removeFirstHalf(); + assertArrayEquals(new int[]{7,8,10}, llu.toIntArray()); + + } + + @Test + public void testRemoveIntInt() { + llu.add(2); + llu.add(5); + llu.add(7); + llu.add(8); + llu.remove(1, 2); + assertArrayEquals(new int[]{2,8}, llu.toIntArray()); + } + + @Test + public void testGetElements() { + llu.add(11); + llu.add(101); + llu.add(201); + llu.add(301); + llu.add(401); + llu.add(501); + llu.add(601); + llu.add(701); + llu.add(801); + LinkedList l = new LinkedList(); + l.add(1); + l.add(3); + l.add(4); + l.add(6); + assertArrayEquals(new int[]{101,301,401,601}, llu.getElements(l)); + } + + @Test + public void testSubtract() { + fail("Not yet implemented"); + } + + @Test + public void testRemoveDuplicateValues() { + llu.add(1); + llu.add(1); + llu.add(2); + llu.add(3); + llu.add(3); + llu.add(5); + llu.add(6); + llu.add(6); + llu.add(8); + llu.removeDuplicateValues(); + assertArrayEquals(new int[]{1,2,3,5,6,8}, llu.toIntArray()); + + } + + @Test + public void testRemoveRange() { + llu.add(1); + llu.add(1); + llu.add(2); + llu.add(3); + llu.add(4); + llu.add(5); + llu.add(6); + llu.add(6); + llu.add(8); + llu.removeRange(2, 5); + assertArrayEquals(new int[]{1,1,2,5,6,6,8}, llu.toIntArray()); + llu = new LinkedListUtil(); + llu.add(2); + llu.add(2); + llu.add(2); + llu.add(3); + llu.add(4); + llu.add(5); + llu.add(6); + llu.add(6); + llu.add(8); + llu.removeRange(1, 5); + assertArrayEquals(new int[]{5,6,6,8}, llu.toIntArray()); + + } + + @Test + public void testIntersection() { + fail("Not yet implemented"); + } + +} diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/LoginAction.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/LoginAction.java new file mode 100644 index 0000000000..df0e09772e --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/LoginAction.java @@ -0,0 +1,40 @@ +package com.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author chenran + * + */ +public class LoginAction { + + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/Struts.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/Struts.java new file mode 100644 index 0000000000..2df69bb075 --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/Struts.java @@ -0,0 +1,297 @@ +package com.litestruts; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +public class Struts { + public static View runAction(String actionName, Map parameters) { + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + try { + String path = "./src/com/litestruts/struts.xml"; + Document document = readStruts(path); + NodeList actionList = document.getElementsByTagName("action"); + String actionClassName = getActionClassName(actionName, actionList); + //System.out.println(actionClassName); + Class c = Class.forName(actionClassName); + Object o = c.newInstance(); + String result = executeAction(c, o, actionClassName, parameters); + String message = getMessage(c, o); + String jsp = getJSP(document, result, actionName, actionList); + Map m = new HashMap(); + m.put("message", message); + View view = new View(); + view.setJsp(jsp); + view.setParameters(m); + return view; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } + return null; + } + + /** + * get jsp message + * @param document + * @param result + * @param actionName + * @param actionList + * @return + */ + private static String getJSP(Document document, String result, String actionName, NodeList actionList) { + Node actionNode = getactionNode(actionName, actionList); + NodeList childNodes = actionNode.getChildNodes(); + String jsp = getContent(result, childNodes); + return jsp; + } + + /** + * + * @param result + * @param nodes: nodelist of childNode for action node + * @return + */ + private static String getContent(String result, NodeList nodes) { + String jsp; + if(result.equals("success")){ + jsp = getResultNodeForSuccess(nodes); + }else{ + jsp = getResultNode(result, nodes); + } + return jsp; + } + + /** + * get the certain result node while result is success + * @param nodes + * @return + */ + private static String getResultNodeForSuccess(NodeList nodes) { + for(int i=0; i parameters){ + try { + + setVar(c, o, parameters); + Method m = c.getMethod("execute"); + String message = (String)m.invoke(o); + return message; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return null; + } + + /** + * set variables of action class instance + * @param c + * @param o + * @param parameters + */ + public static void setVar(Class c, Object o, Map parameters){ + Method[] methods = c.getMethods(); + Iterator> entries = parameters.entrySet().iterator(); + while(entries.hasNext()){ + Map.Entry entry = entries.next(); + String methodName = "set" + entry.getKey(); + for(Method m : methods){ + if(m.getName().equalsIgnoreCase(methodName)){ + try { + m.invoke(o, entry.getValue()); + //System.out.println(m.getName()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + } + } + } +} diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/StrutsTest.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/StrutsTest.java new file mode 100644 index 0000000000..3a396e091e --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/StrutsTest.java @@ -0,0 +1,38 @@ +package com.litestruts; + +import org.junit.Test; +import java.util.HashMap; +import java.util.Map; +import org.junit.Assert; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/View.java b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/View.java new file mode 100644 index 0000000000..af63dce301 --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/View.java @@ -0,0 +1,23 @@ +package com.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/struts.xml b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/struts.xml new file mode 100644 index 0000000000..c4137f3e61 --- /dev/null +++ b/group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git "a/group07/476770768/git\345\221\275\344\273\244.txt" "b/group07/476770768/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/476770768/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git "a/group07/515372252/git\345\221\275\344\273\244.txt" "b/group07/515372252/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/515372252/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git "a/group07/562247675/git\345\221\275\344\273\244.txt" "b/group07/562247675/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/562247675/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/562247675/homework/.gitignore b/group07/562247675/homework/.gitignore new file mode 100644 index 0000000000..df3ade545c --- /dev/null +++ b/group07/562247675/homework/.gitignore @@ -0,0 +1,22 @@ +rebel.xml +.idea/ +*.iml +target/ +*.class +*.jar +*.war +*.ear +hs_err_pid* +*.DS_Store +._* +.Trashes +.TemporaryItems +desktop.ini +Thumbs.db +$RECYCLE.BIN/ +*.lnk +.metadata +.settings +.classpath +.mymetadata +.project \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/pom.xml b/group07/562247675/homework/homework-0226/pom.xml new file mode 100644 index 0000000000..f6a6002f6d --- /dev/null +++ b/group07/562247675/homework/homework-0226/pom.xml @@ -0,0 +1,22 @@ + + + + com.coding2017.group7 + homework + 1.0-SNAPSHOT + + 4.0.0 + + com.coding2017.group7 + homework-0226 + + + junit + junit + + + + \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayList.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayList.java new file mode 100644 index 0000000000..05d3d80d49 --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayList.java @@ -0,0 +1,98 @@ +package com.coding2017.group7.homework.c0226; + +import java.util.Arrays; + +public class MyArrayList implements MyList { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + @Override + public void add(Object o) { + if (isFull()) { + increase(); + } + elementData[size++] = o; + } + + @Override + public void add(int index, Object o) { + checkRangeAdd(index); + if (isFull()) { + increase(); + } + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + @Override + public Object get(int index) { + checkRangeGet(index); + return elementData[index]; + } + + @Override + public Object remove(int index) { + checkRangeGet(index); + Object element = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - (index + 1)); + elementData[--size] = null; + return element; + } + + @Override + public int size() { + return size; + } + + public MyIterator iterator() { + return new MyArrayListIterator(); + } + + private boolean isFull() { + return size >= elementData.length; + } + + private void checkRangeGet(int index) { + boolean outOfRange = index < 0 || index >= size; + if (outOfRange) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + } + + private void checkRangeAdd(int index) { + boolean outOfRange = index < 0 || index > size; + if (outOfRange) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + } + + private void increase() { + Object[] target = new Object[elementData.length * 2]; + System.arraycopy(elementData, 0, target, 0, elementData.length); + elementData = target; + } + + @Override + public String toString() { + return Arrays.toString(elementData); + } + + private class MyArrayListIterator implements MyIterator { + + private int index = 0; + + @Override + public boolean hasNext() { + return index < size; + } + + @Override + public Object next() { + checkRangeGet(index); + return elementData[index++]; + } + } +} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayListTest.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayListTest.java new file mode 100644 index 0000000000..7523092985 --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayListTest.java @@ -0,0 +1,71 @@ +package com.coding2017.group7.homework.c0226; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class MyArrayListTest { + + private MyArrayList myList = new MyArrayList(); + private Object[] elements = new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + private final int mySize = elements.length; + + @Before + public void setUp() throws Exception { + for (int i = 0; i < mySize; i++) { + myList.add(i, i + 1); + } + } + + @After + public void tearDown() throws Exception { + for (int i = myList.size(); i > 0; i--) { + myList.remove(i - 1); + } + myList = null; + } + + @Test + public void addLast() throws Exception { + int element = -1; + myList.add(element); + Assert.assertEquals(myList.size(), mySize + 1); + Assert.assertTrue(myList.get(myList.size() - 1).equals(element)); + } + + @Test + public void addIndex() throws Exception { + int index = mySize / 2; + int element = -1; + myList.add(index, element); + Assert.assertTrue(myList.get(index).equals(element)); + Assert.assertEquals(myList.size(), mySize + 1); + } + + @Test + public void remove() throws Exception { + int index = mySize / 2; + Object before = myList.get(index + 1); + Object element = myList.remove(index); + Object after = myList.get(index); + Assert.assertTrue(before.equals(after)); + Assert.assertEquals(myList.size(), mySize - 1); + + } + + @Test + public void iterator() throws Exception { + MyIterator iterator = myList.iterator(); + int count = 0; + while (iterator.hasNext()) { + iterator.next(); + count++; + } + Assert.assertEquals(mySize, count); + } + +} \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNode.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNode.java new file mode 100644 index 0000000000..334dcd06de --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNode.java @@ -0,0 +1,52 @@ +package com.coding2017.group7.homework.c0226; + +public class MyBinaryTreeNode { + + private Comparable data; + private MyBinaryTreeNode left; + private MyBinaryTreeNode right; + + public Comparable getData() { + return data; + } + + public void setData(Comparable data) { + this.data = data; + } + + public MyBinaryTreeNode getLeft() { + return left; + } + + public void setLeft(MyBinaryTreeNode left) { + this.left = left; + } + + public MyBinaryTreeNode getRight() { + return right; + } + + public void setRight(MyBinaryTreeNode right) { + this.right = right; + } + + public MyBinaryTreeNode insert(Comparable o) { + if (data == null) { + data = o; + } + int compare = o.compareTo(data); + if (compare < 0) { + if (left == null) { + left = new MyBinaryTreeNode(); + } + left.insert(o); + } else if (compare > 0) { + if (right == null) { + right = new MyBinaryTreeNode(); + } + right.insert(o); + } + return this; + } + +} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNodeTest.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNodeTest.java new file mode 100644 index 0000000000..73f3a86b64 --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNodeTest.java @@ -0,0 +1,37 @@ +package com.coding2017.group7.homework.c0226; + +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class MyBinaryTreeNodeTest { + + + @Test + public void insert() throws Exception { + MyBinaryTreeNode node = new MyBinaryTreeNode(); + node.insert(5) + .insert(2) + .insert(7) + .insert(1) + .insert(6) + .insert(4) + .insert(8) + .insert(3); + Comparable data1 = node.getLeft().getLeft().getData(); + Comparable data4 = node.getLeft().getRight().getData(); + Comparable data6 = node.getRight().getLeft().getData(); + Comparable data8 = node.getRight().getRight().getData(); + Comparable data3 = node.getLeft().getRight().getLeft().getData(); + Assert.assertEquals(1, data1); + Assert.assertEquals(4, data4); + Assert.assertEquals(6, data6); + Assert.assertEquals(8, data8); + Assert.assertEquals(3, data3); + + } + + +} \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyIterator.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyIterator.java new file mode 100644 index 0000000000..9ecc4d3a7f --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyIterator.java @@ -0,0 +1,8 @@ +package com.coding2017.group7.homework.c0226; + +public interface MyIterator { + public boolean hasNext(); + + public Object next(); + +} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedList.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedList.java new file mode 100644 index 0000000000..53948a1c07 --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedList.java @@ -0,0 +1,155 @@ +package com.coding2017.group7.homework.c0226; + +import org.junit.FixMethodOrder; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class MyLinkedList implements MyList { + + private Node head = new Node(); + private int size = 0; + + @Override + public void add(Object o) { + Node node = new Node(); + node.data = o; + Node last = find(size - 1); + last.next = node; + size++; + } + + @Override + public void add(int index, Object o) { + checkRangeAdd(index); + Node insert = find(index); + Node before = find(index - 1); + Node node = new Node(); + node.data = o; + node.next = insert; + before.next = node; + size++; + } + + @Override + public Object get(int index) { + checkRangeGet(index); + return find(index).data; + } + + @Override + public Object remove(int index) { + checkRangeGet(index); + Node before = find(index - 1); + Node remove = find(index); + Node after = find(index + 1); + before.next = after; + size--; + return remove.data; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object o) { + Node node = new Node(); + node.data = o; + node.next = find(0); + head.next = node; + size++; + } + + public void addLast(Object o) { + Node last = find(size - 1); + Node node = new Node(); + node.data = o; + last.next = node; + size++; + } + + public Object removeFirst() { + checkRangeGet(size - 1); + Node remove = find(0); + head.next = find(1); + size--; + return remove.data; + } + + public Object removeLast() { + checkRangeGet(size - 1); + Node remove = find(size - 1); + Node before = find(size - 2); + before.next = null; + size--; + return remove.data; + } + + public MyIterator iterator() { + return new MyLinkedListIterator(); + } + + private void checkRangeGet(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size); + } + } + + private void checkRangeAdd(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size); + } + } + + private Node find(int index) { + Node node = head; + int pos = -1; + while (pos < index) { + node = node.next; + pos++; + } + return node; + } + + @Override + public String toString() { + Node node = head; + StringBuilder sBuilder = new StringBuilder(); + while (node.next != null) { + node = node.next; + sBuilder.append(node.data).append(", "); + } + int length = sBuilder.length(); + if (length > 0) { + sBuilder.delete(length - 2, length); + } + return "[" + sBuilder.toString() + "]"; + } + + private static class Node { + Object data; + Node next; + + } + + + private class MyLinkedListIterator implements MyIterator { + + + private Node node = head; + private int size = 0; + + @Override + public boolean hasNext() { + return node.next != null; + } + + @Override + public Object next() { + checkRangeGet(size); + node = node.next; + size++; + return node.data; + } + } +} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedListTest.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedListTest.java new file mode 100644 index 0000000000..0fee275cbb --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedListTest.java @@ -0,0 +1,111 @@ +package com.coding2017.group7.homework.c0226; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class MyLinkedListTest { + + private MyLinkedList myList = new MyLinkedList(); + private Object[] elements = new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + private final int mySize = elements.length; + + @Before + public void setUp() throws Exception { + for (int i = 0; i < mySize; i++) { + myList.add(i, i + 1); + } + } + + @After + public void tearDown() throws Exception { + for (int i = myList.size(); i > 0; i--) { + myList.remove(i - 1); + } + myList = null; + } + + @Test + public void add() throws Exception { + myList.add(-1); + Assert.assertEquals(myList.size(), mySize + 1); + } + + @Test + public void addIndex() throws Exception { + int pos = mySize / 2; + Object before = myList.get(pos); + myList.add(pos, -1); + Object after = myList.get(pos + 1); + Assert.assertEquals(myList.size(), mySize + 1); + Assert.assertEquals(before, after); + } + + @Test + public void remove() throws Exception { + myList.remove(0); + myList.remove(myList.size() - 1); + myList.remove(myList.size() / 2); + Assert.assertEquals(myList.size(), mySize - 3); + } + + @Test + public void addFirst() throws Exception { + myList.addFirst(-1); + myList.addFirst(-1); + myList.addFirst(-1); + Object o1 = myList.get(0); + Object o2 = myList.get(1); + Object o3 = myList.get(2); + Assert.assertTrue(o1.equals(o2)); + Assert.assertTrue(o2.equals(o3)); + Assert.assertTrue(o3.equals(-1)); + Assert.assertEquals(myList.size(), mySize + 3); + } + + @Test + public void addLast() throws Exception { + myList.addLast(-1); + myList.addLast(-1); + myList.addLast(-1); + Object o1 = myList.get(myList.size() - 1); + Object o2 = myList.get(myList.size() - 2); + Object o3 = myList.get(myList.size() - 3); + Assert.assertTrue(o1.equals(o2)); + Assert.assertTrue(o2.equals(o3)); + Assert.assertTrue(o3.equals(-1)); + Assert.assertEquals(myList.size(), mySize + 3); + } + + @Test + public void removeFirst() throws Exception { + myList.addFirst(-1); + Object o = myList.removeFirst(); + Assert.assertTrue(o.equals(-1)); + Assert.assertEquals(myList.size(), mySize); + } + + @Test + public void removeLast() throws Exception { + myList.addLast(-1); + Object o = myList.removeLast(); + Assert.assertTrue(o.equals(-1)); + Assert.assertEquals(myList.size(), mySize); + } + + @Test + public void iterator() throws Exception { + MyIterator iterator = myList.iterator(); + int count = 0; + while (iterator.hasNext()) { + System.out.println(iterator.next()); + count++; + } + Assert.assertEquals(mySize, count); + } + +} \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyList.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyList.java new file mode 100644 index 0000000000..7532313b89 --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyList.java @@ -0,0 +1,13 @@ +package com.coding2017.group7.homework.c0226; + +public interface MyList { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueue.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueue.java new file mode 100644 index 0000000000..c701c032b8 --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueue.java @@ -0,0 +1,35 @@ +package com.coding2017.group7.homework.c0226; + +import java.util.EmptyStackException; + +public class MyQueue { + + private MyLinkedList myLinkedList = new MyLinkedList(); + + public void enQueue(Object o) { + myLinkedList.add(0, o); + } + + public Object deQueue() { + if (isEmpty()) { + throw new EmptyQueueException(); + } + return myLinkedList.removeLast(); + } + + public boolean isEmpty() { + return myLinkedList.size() <= 0; + } + + public int size() { + return myLinkedList.size(); + } + + private static class EmptyQueueException extends EmptyStackException { + } + + @Override + public String toString() { + return myLinkedList.toString(); + } +} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueueTest.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueueTest.java new file mode 100644 index 0000000000..6bcae88530 --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueueTest.java @@ -0,0 +1,48 @@ +package com.coding2017.group7.homework.c0226; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class MyQueueTest { + + private MyQueue myQueue = new MyQueue(); + private final Object[] elements = {1, 2, 3}; + private final int mySize = elements.length; + + @Before + public void setUp() throws Exception { + for (int i = 0; i < mySize; i++) { + myQueue.enQueue(i + 1); + } + } + + @After + public void tearDown() throws Exception { + for (int i = myQueue.size(); i > 0; i--) { + myQueue.deQueue(); + } + } + + @Test + public void enQueue() throws Exception { + myQueue.enQueue(-1); + Object o = 0; + for (int i = myQueue.size(); i > 0; i--) { + o = myQueue.deQueue(); + } + Assert.assertTrue(o.equals(-1)); + } + + @Test + public void deQueue() throws Exception { + myQueue.enQueue(-1); + Object o = myQueue.deQueue(); + Assert.assertTrue(o.equals(elements[0])); + } + +} \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStack.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStack.java new file mode 100644 index 0000000000..18c10704a7 --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStack.java @@ -0,0 +1,40 @@ +package com.coding2017.group7.homework.c0226; + +import java.util.EmptyStackException; + +public class MyStack { + private MyArrayList elementData = new MyArrayList(); + private final int first = 0; + + public void push(Object o) { + + elementData.add(first, o); + } + + public Object pop() { + if (isEmpty()) { + throw new EmptyStackException(); + } + return elementData.remove(first); + } + + public Object peek() { + if (isEmpty()) { + throw new EmptyStackException(); + } + return elementData.get(first); + } + + public boolean isEmpty() { + return elementData.size() <= 0; + } + + public int size() { + return elementData.size(); + } + + @Override + public String toString() { + return elementData.toString(); + } +} diff --git a/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStackTest.java b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStackTest.java new file mode 100644 index 0000000000..57c1ab7a57 --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStackTest.java @@ -0,0 +1,53 @@ +package com.coding2017.group7.homework.c0226; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class MyStackTest { + private MyStack myStack = new MyStack(); + private Object[] elements = new Object[]{1}; + private final int mySize = elements.length; + + @Before + public void setUp() throws Exception { + for (int i = 0; i < mySize; i++) { + myStack.push(i + 1); + } + } + + @After + public void tearDown() throws Exception { + for (int i = myStack.size(); i > 0; i--) { + myStack.pop(); + } + } + + @Test + public void push() throws Exception { + myStack.push(-1); + Assert.assertTrue(myStack.pop().equals(-1)); + } + + @Test + public void pop() throws Exception { + for (int i = myStack.size(); i > 0; i--) { + myStack.pop(); + } + Assert.assertEquals(myStack.size(), 0); + } + + @Test + public void peek() throws Exception { + for (int i = 0; i < myStack.size(); i++) { + Object peek = myStack.peek(); + Assert.assertTrue(peek.equals(elements[i])); + } + Assert.assertEquals(myStack.size(), mySize); + } + +} \ No newline at end of file diff --git a/group07/562247675/homework/homework-0226/src/main/resources/readme.md b/group07/562247675/homework/homework-0226/src/main/resources/readme.md new file mode 100644 index 0000000000..a99a72ae0c --- /dev/null +++ b/group07/562247675/homework/homework-0226/src/main/resources/readme.md @@ -0,0 +1,21 @@ +# CPU、内存、硬盘、指令之间的关系 +  以文件复制为例,简单描述四者之间的协同工作。 + +  日常生活中,我们经常会在电脑磁盘之间的复制粘粘文件,是怎么实现的呢?粗读了《程序是怎么跑起来的》,这里简单描述下这个过程。 + +  当我们按下 Ctrl + C 时,CPU 执行 “复制指令” 将硬盘文件的起止地址临时放到内存中,这时内存并没有读取磁盘的所有文件数据。 + +  当我们按下 Ctrl + V 时,CPU 执行 “粘粘指令” 才会真正去拷贝文件,将文件起止地址取出,读取硬盘起止地址的数据到内存中,将内存中的数据,写入到硬盘新的起止地址里。 +   +  这个过程看似简单,但是却有几个地方需要仔细去思考的,下面是我自己的几个自问自答。 + +- 如果文件有 100GB,而内存只有 8GB,内存会不会爆掉? +不会,CPU “复制指令”执行时,总是会先将磁盘的文件读取到内存的缓存区,再从缓存区写入到硬盘中。因为内存的读写速度,是硬盘的好几十万倍(内存读写速率毫微秒级别,硬盘读写速率毫秒级别)所以不会出现硬盘等待内存读取数据再写入硬盘的情况,看到的进度条,也只是反映硬盘的写入速率。 + +- 既然内存读写速率这么快,那硬盘是不是可以被内存替代? +不会,硬盘读写速率慢,但数据写入到硬盘后,是持久化存在的,不会因为关机而导致数据丢失,再次开机时硬盘数据还在。 +但是,内存是带电存储的,虽然读写速率快,但是一旦关机失去电荷,内存中所有的数据将会丢失,内存也不会被硬盘所替代。 +同时,内存容量的造价,也比硬盘要昂贵的多。单个硬盘容量超过 1TB 的很常见,但是单个内存容量超过 64GB 的,生活中是很少见的。 + +- “复制指令” 和 “拷贝指令” 在 CPU 内部是真实存在的吗? +显然不是,这里描述的这两个 “指令”,其实是 CPU 内部多种指令集协同工作完成的,并不存在这样的单独指令。 \ No newline at end of file diff --git a/group07/562247675/homework/homework-0305/pom.xml b/group07/562247675/homework/homework-0305/pom.xml new file mode 100644 index 0000000000..655bab68b6 --- /dev/null +++ b/group07/562247675/homework/homework-0305/pom.xml @@ -0,0 +1,26 @@ + + + + com.coding2017.group7 + homework + 1.0-SNAPSHOT + + 4.0.0 + + com.coding2017.group7 + homework-0305 + + + junit + junit + + + dom4j + dom4j + + + + \ No newline at end of file diff --git a/group07/562247675/homework/homework-0305/src/main/java/com/coderising/array/MyArrayUtil.java b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/array/MyArrayUtil.java new file mode 100644 index 0000000000..6e60b10eb9 --- /dev/null +++ b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/array/MyArrayUtil.java @@ -0,0 +1,267 @@ +package com.coderising.array; + +import java.util.Arrays; + +public final class MyArrayUtil { + + public static void main(String[] args) { + int[] reverse1 = {7, 9, 30, 3}; + int[] reverse2 = {7, 9, 30, 3, 4}; + reverseArray(reverse1); + reverseArray(reverse2); + System.out.println("reverseArray: " + Arrays.toString(reverse1) + " " + Arrays.toString(reverse2)); + int[] removeZero = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + System.out.println("removeZero: " + Arrays.toString(removeZero(removeZero))); + int[] merge1 = {3, 5, 7, 8}; + int[] merge2 = {4, 5, 6, 7}; + System.out.println("merge: " + Arrays.toString(merge(merge1, merge2))); + System.out.println("merge: " + Arrays.toString(merge(merge2, merge1))); + int[] grow = {2, 3, 6}; + System.out.println("grow: " + Arrays.toString(grow(grow, 3))); + System.out.println("fibonacci: f(15)=" + Arrays.toString(fibonacci(15)) + " f(1)=" + Arrays.toString(fibonacci(1))); + System.out.println("getPrimes: g(23)=" + Arrays.toString(getPrimes(23))); + System.out.println("getPerfectNumbers: g(500)=" + Arrays.toString(getPerfectNumbers(500))); + System.out.println("getPerfectNumbers: j(f(50))=" + join(fibonacci(50), "-")); + + } + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static void reverseArray(int[] origin) { + int len = origin.length; + for (int i = 0; i < len / 2; i++) { + int j = len - 1 - i; + int temp = origin[i]; + origin[i] = origin[j]; + origin[j] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + public static int[] removeZero(int[] oldArray) { + int length = oldArray.length; + // 空间换时间复杂度 O(2*n-m) n为数组长度 m为0的个数 + int[] src = new int[length]; + int last = 0; + for (int i = 0; i < length; i++) { + int m = oldArray[i]; + if (m != 0) { + src[last++] = m; + } + } + int[] dest = new int[last]; + System.arraycopy(src, 0, dest, 0, last); + return dest; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + public static int[] merge(int[] array1, int[] array2) { + int[] src = new int[array1.length + array2.length]; + int i = 0, j = 0, k = 0; //i=数组1游标 j=数组2游标 k=目标数组下标 + // 时间复杂度 O(n+m-k) n为数组1长度 m为数组2长度 k为重复数组个数 + while (i < array1.length && j < array2.length) { + if (array1[i] < array2[j]) { //大小比较入目标数组 + src[k++] = array1[i++]; + } else if (array1[i] > array2[j]) { + src[k++] = array2[j++]; + } else { //等值同时移动,但只入1个目标值 + src[k++] = array1[i++]; + j++; + } + } + // 只要1个数组下表越界,就直接添加另1个数组尾部所有有序值 + while (i < array1.length) { + src[k++] = array1[i++]; + } + while (j < array2.length) { + src[k++] = array2[j++]; + } + int[] dest = new int[k]; + System.arraycopy(src, 0, dest, 0, k); + return dest; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + int[] newArr = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArr, 0, oldArray.length); + return newArr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max < 2) { // 额外出口 f(1) = [] + return new int[]{}; + } + if (max == 2) { //递归出口 f(2) = [1, 1] + return new int[]{1, 1}; + } + // f(3) = [1,1,2] + // f(5) = f(4) = [1,1,2,3] + // f(8) = f(7) = f(6) = [1,1,2,3,5] + + // 递归拿上个数列最后的两个数 + int[] src = fibonacci(max - 1); + // 判断这两个数的和值是否在max范围内 + int m = src[src.length - 1] + src[src.length - 2]; + if (m < max) { + int[] dest = new int[src.length + 1]; + System.arraycopy(src, 0, dest, 0, src.length); + dest[src.length] = m; + return dest; + } else { + return src; + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + if (max <= 2) { //特殊出口 g(1) = [] + return new int[]{}; + } + if (max == 3) { //递归出口 g(3) = [2] + return new int[]{2}; + } + // g[3] = [2] + // g[5] = g[4] = [2,3] + // g[7] = g[6] = [2,3,5] + // g[11] = g[10] = g[9] = g[8] = [2,3,5,7] + + // 递归拿上个数组最后的素数 + int[] src = getPrimes(max - 1); + // 找上个素数和最大值之间的素数 + int before = src[src.length - 1]; + int next = before; + int start = 1 + before; + int end = max; + for (int num = start; num < end; num++) { + int i = 2; + for (; i <= num / 2; i++) { + if (num % i == 0) { + break; + } + } + if (i > num / 2) { + next = num; + break; + } + } + // 判断这个值是否存在 + if (next > before) { + int[] dest = new int[src.length + 1]; + System.arraycopy(src, 0, dest, 0, src.length); + dest[src.length] = next; + return dest; + } else { + return src; + } + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + if (max <= 6) { //特殊出口 + return new int[]{}; + } + if (max == 7) { //递归出口 + return new int[]{6}; + } + // 递归拿上个数组最后的完数 + int[] src = getPerfectNumbers(max - 1); + // 找上个完数和最大值之间的完数 + int before = src[src.length - 1]; + int next = before; + int start = 1 + before; + int end = max; + for (int num = start; num < end; num++) { + int count = 0; + for (int i = 1; i <= num / 2; i++) { + if (num % i == 0) { + count += i; + } + } + if (count == num) { + next = num; + break; + } + } + // 判断这个值是否存在 + if (next > before) { + int[] dest = new int[src.length + 1]; + System.arraycopy(src, 0, dest, 0, src.length); + dest[src.length] = next; + return dest; + } else { + return src; + } + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public static String join(int[] array, String seperator) { + StringBuilder sBuilder = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + sBuilder.append(array[i]).append(seperator); + } + if (sBuilder.length() > 0) { + sBuilder.deleteCharAt(sBuilder.length() - 1); + } + return sBuilder.toString(); + } + + +} diff --git a/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/LoginAction.java b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..bf31612b74 --- /dev/null +++ b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,41 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStruts.java b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStruts.java new file mode 100644 index 0000000000..74354e8bce --- /dev/null +++ b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStruts.java @@ -0,0 +1,200 @@ +package com.coderising.litestruts; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + + +public class MyStruts { + + public static View runAction(String actionName, Map parameters) { + MyStrutsActioNode actioNode = strutsActions.get(actionName); + String actionString = actioNode.actionClass; + Class actionClass = null; + Object actionBean = null; + try { + actionClass = Class.forName(actionString); + actionBean = actionClass.newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + if (actionBean == null) return null; // 没有默认构造或没有找到字节码的情况 + Map setterMethods = getSetterMethods(actionClass); + // #1.调用action中的set方法设置值 + if (parameters != null && !parameters.isEmpty()) { + for (Map.Entry entry : parameters.entrySet()) { + String fieldName = entry.getKey(); + String fieldValue = entry.getValue(); + Method setterMethod = setterMethods.get(fieldName); + if (setterMethod != null) { + try { + setterMethod.invoke(actionBean, fieldValue); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + // #2.调用action的execute方法 + Method method = getExecuteMethod(actionClass); + if (method == null) return null; // 未声明execute方法 + String jspName = ""; + try { + Object object = method.invoke(actionBean); // 获取execute方法返回值 + if (object instanceof String) { + jspName = (String) object; + + } + } catch (Exception e) { + e.printStackTrace(); + } + // #3.查找execute方法返回值对应的jsp路径 + View view = new View(); + String jspValue = actioNode.actionResults.get(jspName).value; + view.setJsp(jspValue); + + // #4.获取action中的get方法返回值封装到view对象中 + Map getterMethods = getGetterMethods(actionClass); + if (getterMethods != null && !getterMethods.isEmpty()) { + HashMap resultMap = new HashMap(getterMethods.size()); + for (Map.Entry entry : getterMethods.entrySet()) { + String fieldName = entry.getKey(); + Method getterMethod = entry.getValue(); + try { + Object object = getterMethod.invoke(actionBean); + resultMap.put(fieldName, object); + } catch (Exception e) { + e.printStackTrace(); + } + } + view.setParameters(resultMap); + } + return view; + } + + private static Method getExecuteMethod(Class beanClass) { + Method method = null; + try { + method = beanClass.getMethod("execute"); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + return method; + } + + private static Map getGetterMethods(Class beanClass) { + Map resultMap = Collections.emptyMap(); + Map descriptorMap = getPropertyDescriptors(beanClass); + if (descriptorMap != null && !descriptorMap.isEmpty()) { + resultMap = new HashMap(descriptorMap.size() / 2); + for (PropertyDescriptor descriptor : descriptorMap.values()) { + String fieldName = descriptor.getName(); + Method getterMethod = descriptor.getReadMethod(); + resultMap.put(fieldName, getterMethod); + } + } + return resultMap; + } + + private static Map getSetterMethods(Class beanClass) { + Map resultMap = Collections.emptyMap(); + Map descriptorMap = getPropertyDescriptors(beanClass); + if (descriptorMap != null && !descriptorMap.isEmpty()) { + resultMap = new HashMap(descriptorMap.size() / 2); + for (PropertyDescriptor descriptor : descriptorMap.values()) { + String fieldName = descriptor.getName(); + Method setterMethod = descriptor.getWriteMethod(); + resultMap.put(fieldName, setterMethod); + } + } + return resultMap; + } + + private static Map getPropertyDescriptors(Class beanClass) { + Map resultMap = Collections.emptyMap(); + try { + BeanInfo beanInfo = Introspector.getBeanInfo(beanClass); + PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); + resultMap = new HashMap(propertyDescriptors.length); + for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { + String fieldName = propertyDescriptor.getName(); + resultMap.put(fieldName, propertyDescriptor); + } + } catch (IntrospectionException e) { + e.printStackTrace(); + } + return resultMap; + } + + private static Map strutsActions; + + static { + InputStream input = null; + try { + // dom4j解析xml文件封装到JavaBean + input = MyStruts.class.getClassLoader().getResourceAsStream("struts.xml"); + SAXReader saxReader = new SAXReader(); + Document document = saxReader.read(input); + strutsActions = new HashMap(); + Element root = document.getRootElement(); + // 标签 + for (Iterator i = root.elementIterator("action"); i.hasNext(); ) { + Element actionXmlNode = (Element) i.next(); + MyStrutsActioNode actionNode = new MyStrutsActioNode(); + actionNode.actionName = actionXmlNode.attributeValue("name"); + actionNode.actionClass = actionXmlNode.attributeValue("class"); + strutsActions.put(actionNode.actionName, actionNode); + actionNode.actionResults = new HashMap(); + // 标签 + for (Iterator j = actionXmlNode.elementIterator("result"); j.hasNext(); ) { + Element resultXmlNode = (Element) j.next(); + MyActionResultNode resultNode = new MyActionResultNode(); + resultNode.name = resultXmlNode.attributeValue("name"); + resultNode.value = resultXmlNode.getStringValue(); + actionNode.actionResults.put(resultNode.name, resultNode); + } + } + } catch (DocumentException e) { + e.printStackTrace(); + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + // close quietly.. + } + } + } + } + + public static void main(String[] args) { + + } + + private static class MyStrutsActioNode { + private String actionName; + private String actionClass; + private Map actionResults; + + } + + private static class MyActionResultNode { + private String name; + private String value; + + } + +} diff --git a/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStrutsTest.java b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStrutsTest.java new file mode 100644 index 0000000000..a7e6b63019 --- /dev/null +++ b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStrutsTest.java @@ -0,0 +1,40 @@ +package com.coderising.litestruts; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + +public class MyStrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + + View view = MyStruts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); //密码和预设的不一致 + + View view = MyStruts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/View.java b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..ce596da106 --- /dev/null +++ b/group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/View.java @@ -0,0 +1,26 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group07/562247675/homework/homework-0305/src/main/resources/struts.xml b/group07/562247675/homework/homework-0305/src/main/resources/struts.xml new file mode 100644 index 0000000000..8a9789665d --- /dev/null +++ b/group07/562247675/homework/homework-0305/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group07/562247675/homework/pom.xml b/group07/562247675/homework/pom.xml new file mode 100644 index 0000000000..343c7dbe71 --- /dev/null +++ b/group07/562247675/homework/pom.xml @@ -0,0 +1,67 @@ + + + + 4.0.0 + + com.coding2017.group7 + homework + 1.0-SNAPSHOT + + + homework-0226 + homework-0305 + + + pom + + UTF-8 + 1.6 + 1.6 + + + + + + junit + junit + 4.12 + + + + dom4j + dom4j + 1.6.1 + + + + jaxen + jaxen + 1.1.6 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + ${project.build.sourceEncoding} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + diff --git a/group07/562247675/homework/readme.md b/group07/562247675/homework/readme.md new file mode 100644 index 0000000000..2a54b7ef9a --- /dev/null +++ b/group07/562247675/homework/readme.md @@ -0,0 +1 @@ +# Homework \ No newline at end of file diff --git a/group07/562247675/notebook/readme.md b/group07/562247675/notebook/readme.md new file mode 100644 index 0000000000..d36f4b9c53 --- /dev/null +++ b/group07/562247675/notebook/readme.md @@ -0,0 +1 @@ +# Notebook \ No newline at end of file diff --git "a/group07/598812995/git\345\221\275\344\273\244.txt" "b/group07/598812995/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/598812995/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git "a/group07/603622009/git\345\221\275\344\273\244.txt" "b/group07/603622009/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/603622009/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git "a/group07/724319952/git\345\221\275\344\273\244.txt" "b/group07/724319952/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/724319952/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/724319952/src/cn/fyl/first/ArrayList.java b/group07/724319952/src/cn/fyl/first/ArrayList.java new file mode 100644 index 0000000000..54d9d609b1 --- /dev/null +++ b/group07/724319952/src/cn/fyl/first/ArrayList.java @@ -0,0 +1,107 @@ +package cn.fyl.first; + +/* + * 动态数组 + */ +public class ArrayList implements List { + + // 记录数组大小 + private int size = 0; + + // 设数组容量为3 + private Object[] elementData = new Object[3]; + + // 扩容 + public void dilatation(int newCapacity) { + + if (newCapacity < size) { + return; + } + + Object[] old = elementData; + elementData = new Object[newCapacity]; + for (int i = 0; i < size; i++) { + elementData[i] = old[i]; + } + + } + + // 插入值 + public void add(Object o) { + add(size(), o); + } + + // 按索引插入值 + public void add(int index, Object o) { + if (elementData.length == size()) { + dilatation(size() * 2 + 1); + } + // 插入的位置小于数组大小,将index位置的值依次向后退一位 + for (int i = size; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + elementData[index] = o; + size++; + + } + + // 取值 + public Object get(int index) { + + if (index > size) { + return null; + } else { + return elementData[index]; + } + + } + + // 按索引删除该值 + public Object remove(int index) { + Object o = elementData[index]; + // 删除的位置小于数组大小,将index位置后面的值依次向前挪一位 + for (int i = index; i < elementData.length - 1; i++) { + elementData[i] = elementData[i + 1]; + } + size--; + return o; + } + + // 返回数组大小 + public int size() { + return size; + } + + //迭代器 + class MyIterator implements Iterator { + int current = 0; + + public boolean hasNext() { + return current < size; + } + + public Object next() { + if (hasNext()) + return elementData[current++]; + else + throw new java.util.NoSuchElementException(); + } + + } + + public static void main(String[] args) { + ArrayList a = new ArrayList(); + a.add(0, 1); + a.add(2); + a.add(3); + a.add(4); + a.add(1, 0); + a.remove(3); + ArrayList.MyIterator m = a.new MyIterator(); + System.err.println(a.elementData.length); + while(m.hasNext()){ + System.out.print(m.next()+" "); + } + } + +} diff --git a/group07/724319952/src/cn/fyl/first/BinaryTreeNode.java b/group07/724319952/src/cn/fyl/first/BinaryTreeNode.java new file mode 100644 index 0000000000..5b136abccc --- /dev/null +++ b/group07/724319952/src/cn/fyl/first/BinaryTreeNode.java @@ -0,0 +1,68 @@ +package cn.fyl.first; + +public class BinaryTreeNode { + private Object data; //保存数据 + private BinaryTreeNode left; //左子树 + private BinaryTreeNode right; //右子树 + private BinaryTreeNode root; //根节点 + + public BinaryTreeNode getRoot() { + return root; + } + public void setRoot(BinaryTreeNode root) { + this.root = root; + } + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + //插入功能,插入的值按比父类结点的值大,插入右子树;小,插入左子树 + public BinaryTreeNode insert(Object o,BinaryTreeNode t){ + if(t == null){ + BinaryTreeNode temp = new BinaryTreeNode(); //新建插入值的结点 + temp.setData(o); + return temp; + } + boolean temp = (int)o > (int)t.getData(); //暂存插入的值跟结点的值比较大小结果 + if(temp){ //ture时(插入的值大于结点的值大),所以插到右子树 + System.err.println(temp); + t.right =insert(o, t.right); + } + else{ + System.out.println(temp); + t.left = insert(o, t.left); + } + return t; + } + + public static void main(String[] args) { + BinaryTreeNode root = new BinaryTreeNode(); + BinaryTreeNode left1 = new BinaryTreeNode(); + BinaryTreeNode right1 = new BinaryTreeNode(); + BinaryTreeNode left2 = new BinaryTreeNode(); + BinaryTreeNode left3 = new BinaryTreeNode(); + root.setData(5); + root.setLeft(left1); left1.setData(2); + root.setRight(right1); right1.setData(7); + left1.setLeft(left2); left2.setData(1); + right1.setLeft(left3); left3.setData(6); + BinaryTreeNode temp = root.insert(4, left1); + System.out.println(left1.getRight().getData()); + } + +} diff --git a/group07/724319952/src/cn/fyl/first/Iterator.java b/group07/724319952/src/cn/fyl/first/Iterator.java new file mode 100644 index 0000000000..7b907d4137 --- /dev/null +++ b/group07/724319952/src/cn/fyl/first/Iterator.java @@ -0,0 +1,7 @@ +package cn.fyl.first; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); +} diff --git a/group07/724319952/src/cn/fyl/first/LinkedList.java b/group07/724319952/src/cn/fyl/first/LinkedList.java new file mode 100644 index 0000000000..e6e5fd71b8 --- /dev/null +++ b/group07/724319952/src/cn/fyl/first/LinkedList.java @@ -0,0 +1,163 @@ +package cn.fyl.first; + +public class LinkedList implements List { + + private Node head,tail; //头尾结点 + private int size; //保存链表大小 + + //将值插入链表 + public void add(Object o) { + add(size(),o); + } + + //将值从index位置插入链表 + public void add(int index, Object o) { + if(index == 0){ + addFirst(o); + } + else if(index >= size){ + addLast(o); + } + else{ + Node current = head; + for (int i = 1; i < index; i++) { + current = current.next; + } + Node temp = current.next; + current.next = new Node(o); + (current.next).next = temp; + size++; + } + } + + //取出index位置的值 + public Object get(int index) { + if(index < 0 || index >=size){ + return null; + } + else if(index == 0){ + return head.data; + } + else if(index == size-1){ + return tail.data; + } + else{ + Node current = head; + for (int i = 1; i < index; i++) { + current = current.next; + } + Node temp = current.next; + return temp.data; + } + } + + //删除index位置的值 + public Object remove(int index) { + if(index < 0 || index >size) + return null; + else if(index ==0) + return head.data; + else if(index == size -1) + return tail.data; + else{ + Node previous = head; + for (int i = 1; i < index; i++) { + previous = previous.next; + } + Node current = previous.next; + previous.next = current.next; + size--; + return current.data; + } + } + + public int size() { + return size; + } + + //添加头结点 + public void addFirst(Object o) { + Node newNode = new Node(o); + newNode.next = head; //指向头引用所指结点 + head = newNode; //头引用指向新增结点 + size++; + if(tail == null){ + tail = head; + } + } + + //添加尾结点 + public void addLast(Object o) { + Node newNode = new Node(o); + if(tail == null){ + head = tail = newNode; + } + else{ + tail.next = newNode; + tail = tail.next; + } + size++; + } + + //删除头结点 + public Object removeFirst(){ + if(size == 0){ + return null; + } + else if(size == 1){ + Node temp = head; + head = tail = null; + size = 0; + return temp.data; + } + else{ + Node temp = head; + head = head.next; + size--; + return temp.data; + } + } + + //删除尾结点 + public Object removeLast() { + if(size == 0){ + return null; + } + else if(size ==1){ + Node temp = head; + head =tail =null; + size =0; + return temp.data; + } + else{ + Node current = head; + for (int i = 0; i < size - 2; i++) { + current = current.next; + } + Node temp =tail; + tail = current; + tail.next = null; + size--; + return temp.data; + } + } + + + + private static class Node { + Object data; + Node next; + public Node(Object o){ + data = o; + } + } + + public static void main(String[] arg){ + LinkedList l = new LinkedList(); + l.add(0); + l.add(2); + l.add(4); + l.add(3, 1); + System.out.println(l.removeLast()+" "+l.removeFirst()+" "+l.get(0)+" "+l.get(1)); + } +} diff --git a/group07/724319952/src/cn/fyl/first/List.java b/group07/724319952/src/cn/fyl/first/List.java new file mode 100644 index 0000000000..45a4d4652e --- /dev/null +++ b/group07/724319952/src/cn/fyl/first/List.java @@ -0,0 +1,11 @@ +package cn.fyl.first; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + +} diff --git a/group07/724319952/src/cn/fyl/first/Queue.java b/group07/724319952/src/cn/fyl/first/Queue.java new file mode 100644 index 0000000000..1e9e5ef3ad --- /dev/null +++ b/group07/724319952/src/cn/fyl/first/Queue.java @@ -0,0 +1,37 @@ +package cn.fyl.first; + +public class Queue { + + LinkedList linkedlist = new LinkedList(); + + public void enQueue(Object o){ + linkedlist.addLast(o); + } + + public Object deQueue(){ + return linkedlist.removeFirst(); + } + + public boolean isEmpty(){ + if(linkedlist.size()>0) + return false; + else + return true; + } + + public int size(){ + return linkedlist.size(); + } + + public Object get(int index){ + return linkedlist.get(index); + } + + public static void main(String[] arg){ + Queue q = new Queue(); + q.enQueue(1); + q.enQueue(2); + System.out.println(q.get(1)); + } + +} diff --git a/group07/724319952/src/cn/fyl/first/Stack.java b/group07/724319952/src/cn/fyl/first/Stack.java new file mode 100644 index 0000000000..368178691f --- /dev/null +++ b/group07/724319952/src/cn/fyl/first/Stack.java @@ -0,0 +1,39 @@ +package cn.fyl.first; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + int last; + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + return elementData.remove(last-1); + } + + public Object peek() { + last = elementData.size()-1; + return elementData.get(last); + } + + public boolean isEmpty() { + if(elementData.size() > 0) + return false; + else + return true; + } + + public int size() { + return elementData.size(); + } + + public static void main(String[] args) { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + System.out.println(s.peek()); + } +} diff --git a/group07/724319952/src/cn/fyl/second/ArrayUtil.java b/group07/724319952/src/cn/fyl/second/ArrayUtil.java new file mode 100644 index 0000000000..a816ff4acd --- /dev/null +++ b/group07/724319952/src/cn/fyl/second/ArrayUtil.java @@ -0,0 +1,235 @@ +package cn.fyl.second; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + //保存置换后的数组 + int[] temp = new int[origin.length]; + + for (int i = 0,j = origin.length - 1; i < origin.length; i++,j--) { + //依次将origin的值赋给与temp前后对应位置上 + temp[i] = origin[j]; + System.out.print(temp[i]+" "); + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + //保存oldArray数组去0后的容量 + int size = 0; + + for (int i = 0; i < oldArray.length; i++) { + int temp = oldArray[i]; + if(temp != 0){ + size++; + } + } + + //初始化与oldArray数组去0后容量一样的新数组 + int[] newArray = new int[size]; + + for (int i = 0,j = 0; i < oldArray.length; i++) { + int temp = oldArray[i]; + //将不等于0的值赋给新数组 + if(temp != 0){ + newArray[j] = temp; + j++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, + * 并且仍然是有序的。 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + //保存新数组的容量 + int size = array1.length + array2.length; + + int[] newArray = new int[size]; + + //先将array1数组存入temp数组 + for (int i = 0; i < array1.length; i++) { + newArray[i] = array1[i]; + } + + //增0,若相同的值是数组中倒数的二个的值,则需要一个零将最后一个覆盖掉 + array2 = grow(array2, 1); + + //将array1数组中每一个值依次与array2数组中每一个进行比较,若相同,则将相同的值覆盖掉 + for (int i = 0; i < array1.length; i++) { + for (int j = 0; j < array2.length; j++) { + if(array1[i] == array2[j]){ + for (int k = j; k < array2.length - 1; k++) { + array2[k] = array2[k + 1]; + } + } + } + } + //去0 + array2 = removeZero(array2); + + //将array2的值插入newArray数组中 + for (int i = 0; i < array2.length; i++) { + newArray[array1.length] = array2[i]; + } + + newArray = removeZero(newArray); + + //冒泡排序 + for (int i = 0; i < newArray.length - 1; i++) { + for (int j = 0; j < newArray.length - 1; j++) { + if(newArray[j] > newArray[j + 1]){ + int temp = newArray[j + 1]; + newArray[j+ 1] = newArray[j]; + newArray[j] = temp; + } + } + } + + return newArray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int[] array = {1,1,2,3,5,8,13,21}; + int[] newArray = null; + for (int i = 0; i < array.length; i++) { + if(array[i] > max){ + newArray = new int[i]; + System.arraycopy(array, 0, newArray, 0, i); + break; + } + } + return newArray; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int[] array = {0}; + if(max > 2){ + array[0] = 2; + int k = 1; + for (int n = 3; n < max; n++) { + int i = 2; + + while(i < n){ + //若等于0,则不是素数,跳出循环 + if(n % i == 0) + break; + + i++; + } + + //如果i==n则说明n不能被2~n-1整除,是素数 + if (i == n) { + //数组自增一个容量 + array =grow(array, 1); + //将素数加入数组 + array[k] = n; + k++; + } + } + return array; + } + else{ + return null; + } + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + + int a =0; + for(int i=2;i arrayList = new ArrayList(); + int i=0,j=0; + while (i arrayList) { + int[] array = new int[arrayList.size()]; + for(int i=0; i arrayList = new ArrayList(); + for(int i=1; i<=Math.sqrt(a); i++) { + if(a % i == 0) { + arrayList.add(i); + arrayList.add(a / i); + } + } + int sum = 0; + for(int item: arrayList) { + sum += item; + } + if(sum-a == a) { + return true; + } + + return false; + } +} + \ No newline at end of file diff --git a/group07/752262774/src/com/coderising/array/ArrayUtilTest.java b/group07/752262774/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..ecad9623b8 --- /dev/null +++ b/group07/752262774/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,95 @@ +package com.coderising.array; + +/** + * Created by yrs on 2017/3/4. + */ +public class ArrayUtilTest { + + @org.junit.Test + public void testReverseArray() throws Exception { + int[] array = new int[5]; + for(int i=0; i<5; i++) { + array[i] = i; + } + ArrayUtil util = new ArrayUtil(); + util.reverseArray(array); + for(int i=0; i<5; i++) { + assert (array[i] == 4-i); + } + } + + @org.junit.Test + public void testRemoveZero() throws Exception { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + ArrayUtil util = new ArrayUtil(); + int[] newArr = util.removeZero(oldArr); + for(int item: newArr) { + System.out.println(item); + assert (item != 0); + } + } + + @org.junit.Test + public void testMerge() throws Exception { + int[] a1 = {3,5,7,8,22}; + int[] a2 = {4,5,6,7,8,9,11}; + int[] a3 = {3,4,5,6,7,8,9,11,22}; + ArrayUtil util = new ArrayUtil(); + int[] merge = util.merge(a1, a2); + for(int i=0;i targetMap = null; + + public static View runAction(String actionName, Map parameters) throws Exception { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + targetMap = getTargetMap(actionName); + if(!targetMap.containsKey(actionName)) { + throw new Exception("this xml file not found" + actionName + "action"); + } + String className = targetMap.get(actionName); + Class classEntity = Class.forName(className); + Object obj = classEntity.newInstance(); + Field[] fields = classEntity.getDeclaredFields(); + + for(Field field: fields) { + field.setAccessible(true); + if(parameters.containsKey(field.getName())) { + field.set(obj, parameters.get(field.getName())); + } + } + + Method execute = classEntity.getMethod("execute"); + String result = (String)execute.invoke(obj); + String jsp = targetMap.get(result); + Field message = classEntity.getDeclaredField("message"); + message.setAccessible(true); + Map parats = new HashMap(); + parats.put("message", (String)message.get(obj)); + + View view = new View(); + view.setJsp(jsp); + view.setParameters(parats); + + return view; + } + + private static Map getTargetMap(String actionName) throws DocumentException { + Map targetMap = new HashMap(); + //创建SAXReader对象 + SAXReader reader = new SAXReader(); + //读取文件 转换成Document + Document document = reader.read(new File("src/com/coderising/litestruts/struts.xml")); + //获取根节点元素对象 + Element root = document.getRootElement(); + List actionList = root.elements("action"); + for(Element action: actionList) { + org.dom4j.Attribute attribute = action.attribute("name"); + if(attribute.getValue().equals("login")){ + targetMap.put(attribute.getValue(), action.attribute("class").getValue()); + List resultList = action.elements("result"); + for(Element result: resultList) { + targetMap.put(result.attribute("name").getValue(),""+result.getData()); + } + break; + } + } + return targetMap; + } + +} diff --git a/group07/752262774/src/com/coderising/litestruts/StrutsTest.java b/group07/752262774/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..70c71c2ab0 --- /dev/null +++ b/group07/752262774/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,53 @@ +package com.coderising.litestruts; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (Exception e) { + e.printStackTrace(); + } + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (Exception e) { + e.printStackTrace(); + } + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group07/752262774/src/com/coderising/litestruts/View.java b/group07/752262774/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group07/752262774/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group07/752262774/src/com/coderising/litestruts/struts.xml b/group07/752262774/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..6f23f0a83d --- /dev/null +++ b/group07/752262774/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group07/752262774/src/com/coding/basic/ArrayList.java b/group07/752262774/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..59b22d2c53 --- /dev/null +++ b/group07/752262774/src/com/coding/basic/ArrayList.java @@ -0,0 +1,114 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +/** + * Created by yrs on 2017/2/21. + */ +public class ArrayList implements List{ + + private int size = 0; + + private Object[] elementData; + + public ArrayList() { + this.elementData = new Object[10]; + } + + public ArrayList(int initialCapacity) { + if (initialCapacity > 0) { + this.elementData = new Object[initialCapacity]; + } else if (initialCapacity == 0) { + this.elementData = new Object[0]; + } else { + throw new IllegalArgumentException("Illegal Capacity: "+ + initialCapacity); + } + } + + public void add(Object o) { + judegGrow(); + elementData[size++] = o; + } + + public void add(int index, Object o) { + if(index<0 || index>size) { + throw new IndexOutOfBoundsException(); + }else if(index == size) { + add(o); + }else { + judegGrow(); + System.arraycopy(elementData, index, elementData, index + 1, + size - index); + elementData[index] = o; + size++; + } + } + + public Object get(int index) { + rangeCheck(index); + return elementData[index]; + } + + public Object remove(int index) { + rangeCheck(index); + Object o = elementData[index]; + + int move = size - 1 -index; + if(move > 0) { + System.arraycopy(elementData, index+1, elementData, index, move); + } + elementData[--size] = null; + + return o; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new ArrrayListIterator(this); + } + + private class ArrrayListIterator implements Iterator { + + ArrayList arrayList; + + int pos; + + private ArrrayListIterator(ArrayList arrayList) { + this.arrayList = arrayList; + } + + @Override + public boolean hasNext() { + return pos != arrayList.size; + } + + @Override + public Object next() { + if(pos < size) { + int i = pos; + pos++; + return elementData[i]; + }else { + throw new NoSuchElementException(); + } + } + } + + private void judegGrow() { + if(size == elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length + 1); + } + } + + private void rangeCheck(int index) { + if(index<0 || index>=size) { + throw new IndexOutOfBoundsException(); + } + } +} + \ No newline at end of file diff --git a/group07/752262774/src/com/coding/basic/BinaryTreeNode.java b/group07/752262774/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..275a1e66f9 --- /dev/null +++ b/group07/752262774/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,49 @@ +package com.coding.basic; + +/** + * Created by yrs on 2017/2/25. + */ +public class BinaryTreeNode { + + private Object data; + + private BinaryTreeNode left; + + private BinaryTreeNode right; + + public BinaryTreeNode(BinaryTreeNode left, Object o, BinaryTreeNode right) { + setData(o); + setLeft(left); + setRight(right); + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + return null; + } + +} + \ No newline at end of file diff --git a/group07/752262774/src/com/coding/basic/Iterator.java b/group07/752262774/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..c13e8e3b35 --- /dev/null +++ b/group07/752262774/src/com/coding/basic/Iterator.java @@ -0,0 +1,12 @@ +package com.coding.basic; + +/** + * Created by yrs on 2017/2/25. + */ +public interface Iterator { + + public boolean hasNext(); + + public Object next(); +} + \ No newline at end of file diff --git a/group07/752262774/src/com/coding/basic/LinkedList.java b/group07/752262774/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..60831251d3 --- /dev/null +++ b/group07/752262774/src/com/coding/basic/LinkedList.java @@ -0,0 +1,210 @@ +package com.coding.basic; + + +import java.util.NoSuchElementException; + +/** + * Created by yrs on 2017/2/23. + */ +public class LinkedList implements List{ + + private int size; + + private Node first; + + private Node last; + + public LinkedList() { + this.first = null; + this.last =null; + } + + public void add(Object o) { + Node l = this.last; + Node newNode = new Node(l, o, null); + this.last = newNode; + if(null == l) { + this.first = newNode; + }else { + l.next = newNode; + } + this.size++; + } + + public void add(int index, Object o) { + if(index<0 || index>size) { + throw new IndexOutOfBoundsException(); + }else if(index == this.size) { + this.add(o); + }else { + Node target = targetNode(index); + Node before = target.prev; + Node newNode = new Node(before, o, target); + target.prev = newNode; + if(null == before) { + this.first = newNode; + }else { + before.next = newNode; + } + this.size++; + } + } + + public Object get(int index) { + rangeCheck(index); + return targetNode(index).data; + } + + public Object remove(int index) { + rangeCheck(index); + Node target = targetNode(index); + Node before = target.prev; + Node after = target.next; + Object o = target.data; + + if(null == before) { + this.first = null; + }else { + before.next = after; + target.prev = null; + } + + if(null == after) { + this.last = before; + }else { + after.prev = before; + target.next = null; + } + target.data = null; + this.size--; + + return o; + } + + public int size() { + return this.size; + } + + public void addFirst(Object o) { + Node node = first; + Node newNode = new Node(null, o, node); + this.first = newNode; + if(null == node) { + this.last = newNode; + }else { + node.prev = newNode; + } + this.size++; + } + + public void addLast(Object o) { + add(o); + } + + public Object removeFirst() { + Node node = first; + if (node == null) + throw new NoSuchElementException(); + + first = node.next; + Object o = node.data; + if(null == node.next) { + this.last = null; + }else { + first.prev = null; + } + node.data = null; + node.next = null; + this.size--; + return o; + } + + public Object removeLast() { + Node node = last; + if (node == null) + throw new NoSuchElementException(); + + last = node.prev; + Object o = node.data; + if(null == node.prev) { + this.first = null; + }else { + last.next = null; + } + node.data = null; + node.prev = null; + this.size--; + return o; + } + + public Iterator iterator() { + return new LinkedListIterator(this); + } + + private class LinkedListIterator implements Iterator { + + LinkedList linkedList; + + int pos; + + private LinkedListIterator(LinkedList linkedList) { + this.linkedList = linkedList; + } + + @Override + public boolean hasNext() { + return pos != linkedList.size; + } + + @Override + public Object next() { + if(pos < size) { + int i = pos; + pos++; + return linkedList.get(i); + }else { + throw new NoSuchElementException(); + } + } + } + + private void rangeCheck(int index) { + if(index<0 || index>=size) { + throw new IndexOutOfBoundsException(); + } + } + + private Node targetNode(int index) { + //由index值在链表的前半部分还是后半部分,决定是从前向后,还是从后向前查找。 + Node target = new Node(); + if(index < (this.size >> 1)) { + target = this.first; + for(int i=0; iindex; i--) { + target = target.prev; + } + } + return target; + } + + private static class Node{ + Object data; + Node next; + Node prev; + + Node() { + } + + Node(Node prev, Object o, Node next) { + this.data = o; + this.next = next; + this.prev = prev; + } + } + +} + \ No newline at end of file diff --git a/group07/752262774/src/com/coding/basic/List.java b/group07/752262774/src/com/coding/basic/List.java new file mode 100644 index 0000000000..55658370ae --- /dev/null +++ b/group07/752262774/src/com/coding/basic/List.java @@ -0,0 +1,18 @@ +package com.coding.basic; + +/** + * Created by yrs on 2017/2/23. + */ +public interface List { + + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); + +} diff --git a/group07/752262774/src/com/coding/basic/Queue.java b/group07/752262774/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..c967b45fa2 --- /dev/null +++ b/group07/752262774/src/com/coding/basic/Queue.java @@ -0,0 +1,27 @@ +package com.coding.basic; + +/** + * Created by yrs on 2017/2/25. + */ +public class Queue { + + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o) { + elementData.add(o); + } + + public Object deQueue() { + return elementData.removeFirst(); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } + +} + \ No newline at end of file diff --git a/group07/752262774/src/com/coding/basic/Stack.java b/group07/752262774/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..d47eb07427 --- /dev/null +++ b/group07/752262774/src/com/coding/basic/Stack.java @@ -0,0 +1,39 @@ +package com.coding.basic; + +/** + * Created by yrs on 2017/2/25. + */ +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + Object o = elementData.remove(elementData.size()-1); + return o; + } + + public Object peek() { + Object o = elementData.get(elementData.size() - 1); + return o; + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } + + public static void main(String [] args) { + Stack stack = new Stack(); + stack.push(1); + System.out.println(stack.size() + " " + stack.peek() + " " + stack.pop() + " " + stack.isEmpty()); + + } + +} + \ No newline at end of file diff --git a/group07/764189149/.classpath b/group07/764189149/.classpath new file mode 100644 index 0000000000..1fc7a9a529 --- /dev/null +++ b/group07/764189149/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/group07/764189149/.gitignore b/group07/764189149/.gitignore new file mode 100644 index 0000000000..8d9372e204 --- /dev/null +++ b/group07/764189149/.gitignore @@ -0,0 +1,23 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +/bin/ diff --git a/group07/764189149/.project b/group07/764189149/.project new file mode 100644 index 0000000000..2076c6b51c --- /dev/null +++ b/group07/764189149/.project @@ -0,0 +1,17 @@ + + + 764189149Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group07/764189149/src/com/coderising/download/DownloadThread.java b/group07/764189149/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..d9514ac5cf --- /dev/null +++ b/group07/764189149/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,38 @@ +package com.coderising.download; + +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + CyclicBarrier barrier ; + String filePath; + + public DownloadThread(CyclicBarrier barrier , Connection conn, int startPos, int endPos , String filePath){ + + this.barrier = barrier; + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.filePath = filePath; + } + public void run(){ + try{ + System.out.println("begin download startPos="+startPos+",endPos="+endPos); + byte[] buffer = conn.read(startPos , endPos); + RandomAccessFile file = new RandomAccessFile(filePath, "rw"); + file.seek(startPos); + file.write(buffer, 0, buffer.length); + file.close(); + barrier.await(); + }catch(Exception e){ + System.out.println("download error:startPos="+startPos+",endPos="+endPos); + } + + } +} diff --git a/group07/764189149/src/com/coderising/download/FileDownloader.java b/group07/764189149/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..f63b39d0af --- /dev/null +++ b/group07/764189149/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,127 @@ +package com.coderising.download; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.concurrent.CyclicBarrier; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + boolean isFinished = false; + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + private static final int THREAD_NUM = 3; + + private static final String BASE_PATH = "F:/download/"; + + + public FileDownloader(String _url) { + this.url = _url; + File baseFile = new File(BASE_PATH); + if(!baseFile.exists()){ + baseFile.mkdirs(); + } + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + CyclicBarrier barrier = new CyclicBarrier(THREAD_NUM, new Runnable() { + + @Override + public void run() { + listener.notifyFinished(); + } + }); + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + String filePath = BASE_PATH + "download."+getFileType(this.url); + //System.out.println(filePath); + + File file = new File(filePath); + if(!file.exists()){ + try { + file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try{ + FileOutputStream fos = new FileOutputStream(file); + fos.write(new byte[length], 0, length);//占位 + fos.close(); + } + catch (IOException e) { + System.out.println(e.getMessage()); + } + + int blockSize = (length % THREAD_NUM == 0 ) ? length / THREAD_NUM : (length / THREAD_NUM + 1); + for (int i = 0; i < THREAD_NUM; i++) { + int startPos = i * blockSize; + int endPos = startPos + blockSize - 1; + if(endPos >= length - 1){ + endPos = length - 1; + } + new DownloadThread(barrier , conn, startPos, endPos , filePath).start(); + } + + } catch (ConnectionException e) { + System.out.println(e.getMessage()); + } finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + private String getFileType(String url) { + int index = url.lastIndexOf("."); + return url.substring(index + 1 , url.length()); + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group07/764189149/src/com/coderising/download/FileDownloaderTest.java b/group07/764189149/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..5e325db7a4 --- /dev/null +++ b/group07/764189149/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,55 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488796402240&di=8ca9322617d5338cad61232a06f6ed7a&imgtype=0&src=http%3A%2F%2Fjiangsu.china.com.cn%2Fuploadfile%2F2017%2F0212%2F1486868426284307.jpg"; + FileDownloader downloader = new FileDownloader(url); + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group07/764189149/src/com/coderising/download/api/Connection.java b/group07/764189149/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/group07/764189149/src/com/coderising/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group07/764189149/src/com/coderising/download/api/ConnectionException.java b/group07/764189149/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..c2a0b14c82 --- /dev/null +++ b/group07/764189149/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + String message; + public ConnectionException(String message){ + super("message:"+message); + this.message = message; + } + +} diff --git a/group07/764189149/src/com/coderising/download/api/ConnectionManager.java b/group07/764189149/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group07/764189149/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group07/764189149/src/com/coderising/download/api/DownloadListener.java b/group07/764189149/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group07/764189149/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group07/764189149/src/com/coderising/download/impl/ConnectionImpl.java b/group07/764189149/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..8881230f80 --- /dev/null +++ b/group07/764189149/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,40 @@ +package com.coderising.download.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URLConnection; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + private URLConnection connection; + + @Override + public byte[] read(int startPos, int endPos) throws IOException { +// connection.setAllowUserInteraction(true); +// connection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + InputStream inputstream = connection.getInputStream(); + byte[] buffer = new byte[endPos - startPos + 1]; + inputstream.skip(startPos); + inputstream.read(buffer); + inputstream.close(); + return buffer; + } + + @Override + public int getContentLength(){ + return connection.getContentLength(); + } + + @Override + public void close() { + } + + public void setConnection(URLConnection connection) { + this.connection = connection; + } + + + +} diff --git a/group07/764189149/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group07/764189149/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..20dfaaad80 --- /dev/null +++ b/group07/764189149/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,30 @@ +package com.coderising.download.impl; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + URL urlObj; + ConnectionImpl connection = null; + try { + urlObj = new URL(url); + connection = new ConnectionImpl(); + connection.setConnection(urlObj.openConnection()); + } catch (MalformedURLException e) { + throw new ConnectionException("URL格式错误"); + }catch (IOException e) { + throw new ConnectionException("IO异常"); + } + + return connection; + } + +} diff --git a/group07/764189149/src/com/leijing/coderising/array/ArrayUtil.java b/group07/764189149/src/com/leijing/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..544b788ffb --- /dev/null +++ b/group07/764189149/src/com/leijing/coderising/array/ArrayUtil.java @@ -0,0 +1,279 @@ +package com.leijing.coderising.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +/** + * @author: leijing + * @date: 2017年3月2日 下午5:30:38 + */ +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + * @throws Exception + */ + public void reverseArray(int[] origin) throws Exception{ + if(origin.length < 1){ + throw new Exception("array origin is empty"); + } + int size = origin.length; + int[] copy = Arrays.copyOf(origin, size); + for (int i = 0; i < size; i++) { + origin[size - i - 1] = copy[i]; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int newSize = countNotZero(oldArray);//先计算非零元素个数 + int[] newArray = new int[newSize];//创建新数组 + int newIndex = 0;//新数组索引 + int oldIndex = 0;//旧数组索引 + while(newIndex < newSize){ + if(oldArray[oldIndex] != 0){ + newArray[newIndex++] = oldArray[oldIndex]; + } + + oldIndex++; + } + + return newArray; + } + + private int countNotZero(int[] oldArray) { + int count = 0; + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i] != 0){ + count++; + } + } + return count; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int size = getSize(array1 , array2); + int[] newArray = new int[size]; + + int minIndex1 = 0; + int minIndex2 = 0; + + for (int i = 0; i < newArray.length; i++) { + + if(minIndex1 < array1.length && minIndex2 == array2.length ){//如果array2的元素取完了,就取array1的元素 + newArray[i] = array1[minIndex1++]; + }else if(minIndex1 == array1.length && minIndex2 < array2.length){//如果array1的元素取完了,就取array2的元素 + newArray[i] = array2[minIndex2++]; + }else{//两个数组都没有取完 + if(array1[minIndex1] < array2[minIndex2]){//第一个数组的元素小 + newArray[i] = array1[minIndex1++]; + }else if(array1[minIndex1] == array2[minIndex2]){//元素相等,保留第一个数组的,第二个数组索引加一 + newArray[i] = array1[minIndex1++]; + minIndex2++; + } + else{//第二个数组元素小 + newArray[i] = array2[minIndex2++]; + } + } + } + + return newArray; + } + + private int getSize(int[] array1 , int[] array2) { + Set set = new HashSet(); + int sameNum = 0; + + for (int i = 0; i < array1.length; i++) { + set.add(array1[i]); + } + + for (int i = 0; i < array2.length; i++) { + if(!set.add(array2[i])){ + sameNum++; + } + } + return array1.length + array2.length - sameNum; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + if(size < 1){ + return oldArray; + } + int[] newArray = new int[oldArray.length + size]; + + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if(max == 1){ + return new int[0]; + } + List list = new ArrayList(); + list.add(1); + list.add(1); + + int next = 0; + int i = 2; + while(next < max) { + next = list.get(i - 1) + list.get(i - 2 ); + list.add(next); + i++; + } + int[] array = new int[list.size()]; + list2Array(list , array); + return array; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + List list = new ArrayList(); + for (int i = 2; i < max; i++) { + if(isPrimes(i)){ + list.add(i); + } + } + int[] array = new int[list.size()]; + list2Array(list , array); + return array; + } + + private boolean isPrimes(int num) { + for (int i = 2; i <= num / 2; i++) { + if(num % i == 0){ + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + + List list = new ArrayList(); + for (int i = 1; i < max; i++) { + if(isPerfectNum(i)){ + list.add(i); + } + } + int[] array = new int[list.size()]; + list2Array(list , array); + return array; + } + + private void list2Array(List list, int[] array) { + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + } + + private boolean isPerfectNum(int num) { + Set list = new HashSet(); + if(num == 1){ + return false; + }else{ + list.add(1); + } + for (int i = 2; i <= num / 2; i++) { + if(num % i == 0){ + list.add(i); + list.add(num / i); + } + } + Iterator iter = list.iterator(); + int sum = 0; + while (iter.hasNext()) { + Integer val = iter.next(); + sum += val; + } + + if(sum == num){ + System.out.println("num:"+num+","+list.toString()); + return true; + } + return false; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]); + if(i < array.length - 1){ + sb.append(seperator); + } + } + return sb.toString(); + } + + public void printArray(int[] array , String msg){ + System.out.print(msg+"["); + for (int i = 0; i < array.length; i++) { + System.out.print(array[i]); + if(i < array.length - 1){ + System.out.print(","); + } + } + System.out.println("]"); + } + + +} diff --git a/group07/764189149/src/com/leijing/coderising/array/ArrayUtilTest.java b/group07/764189149/src/com/leijing/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..235ffb0f15 --- /dev/null +++ b/group07/764189149/src/com/leijing/coderising/array/ArrayUtilTest.java @@ -0,0 +1,77 @@ +package com.leijing.coderising.array; + +import org.junit.Test; + +public class ArrayUtilTest { + private ArrayUtil arrayUtil = new ArrayUtil(); + + @Test + public void testReverseArray() { + int[] origin = {7, 9 , 30, 3 , 18 , 21}; + arrayUtil.printArray(origin,"before:"); + + try { + arrayUtil.reverseArray(origin); + arrayUtil.printArray(origin , "after:"); + } catch (Exception e) { + System.out.println(e); + } + } + + @Test + public void testRemoveZero() { + int[] oldArray={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + arrayUtil.printArray(oldArray , "before:"); + int[] newArray = arrayUtil.removeZero(oldArray); + arrayUtil.printArray(newArray , "after:"); + } + + @Test + public void testMerge() { + int[] array1 = {3, 5, 7,8}; + int[] array2 = {4, 5, 6,7}; + arrayUtil.printArray(array1 , "array1:"); + arrayUtil.printArray(array2 , "array2:"); + int[] newArray = arrayUtil.merge(array1, array2); + arrayUtil.printArray(newArray , "mergre after:"); + } + + @Test + public void testGrow() { + int[] oldArray = {2,3,6}; + int size = 3; + arrayUtil.printArray(oldArray , "grow before:"); + int[] newArray = arrayUtil.grow(oldArray, size); + arrayUtil.printArray(newArray , "grow after:"); + } + + @Test + public void testFibonacci() { + int max = 20; + int[] array = arrayUtil.fibonacci(max); + arrayUtil.printArray(array , max + "以内的所有斐波那契数列:"); + } + + @Test + public void testGetPrimes() { + int max = 100; + int[] array = arrayUtil.getPrimes(max); + arrayUtil.printArray(array , max + "以内的所有素数:"); + } + + @Test + public void testGetPerfectNumbers() { + int max = 1000; + int[] array = arrayUtil.getPerfectNumbers(max); + arrayUtil.printArray(array , max + "以内的所有完数:"); + } + + @Test + public void testJoin() { + int[] array = {3,8,9}; + String seperator = "-"; + String result = arrayUtil.join(array, seperator); + System.out.println(result); + } + +} diff --git a/group07/764189149/src/com/leijing/coderising/litestruts/LoginAction.java b/group07/764189149/src/com/leijing/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..833e1464b4 --- /dev/null +++ b/group07/764189149/src/com/leijing/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.leijing.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group07/764189149/src/com/leijing/coderising/litestruts/Struts.java b/group07/764189149/src/com/leijing/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..fbabd397ed --- /dev/null +++ b/group07/764189149/src/com/leijing/coderising/litestruts/Struts.java @@ -0,0 +1,134 @@ +package com.leijing.coderising.litestruts; + +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + +/** + * @Description: 解析Struts文件、处理action请求 + * @author: leijing + * @date: 2017年3月3日 下午3:03:38 + */ +public class Struts { + private static String STRUTS_XML = "struts.xml"; + + private static Map actionsMap = new HashMap(); + private static Map resultMap = new HashMap(); + private Struts(){ + try { + init(); + } catch (Exception e) { + System.out.println("Struts init error:"+e.getMessage()); + } + + } + + /** + * @Description: 确保配置的是需要的节点 + * @param xmlName + * @param name + * @return: void + * @author: leijing + * @date: 2017年3月3日 下午3:20:31 + */ + private void checkTag(String xmlName , String name) throws Exception{ + if(xmlName == null || name == null || !xmlName.equals(name)){ + throw new Exception("xml parse error,"+xmlName+"can not be parsed,"+name+" is required!"); + } + } + private void init() throws Exception{ + InputStream inputStream = this.getClass().getResourceAsStream(STRUTS_XML); + SAXReader reader = new SAXReader();//创建SAXReader对象 + Document document = reader.read(inputStream); //用SAXReader对象加载配置文件得到Document对象 + Element struts = document.getRootElement();//得到根节点 + checkTag(struts.getName(), "struts"); + List actions = struts.elements();//得到所有action节点 + + for(Iterator it = actions.iterator() ; it.hasNext();){//遍历action节点 + Element action = (Element) it.next(); + checkTag(action.getName(), "action"); + Attribute actionName = action.attribute("name"); + Attribute actionClazz = action.attribute("class"); + actionsMap.put(actionName.getText(), actionClazz.getText()); + System.out.println("add to actionsMap:"+actionName.getText()+":"+actionClazz.getText()); + + List results = action.elements();//得到配置的result节点 + for(Iterator rit = results.iterator() ; rit.hasNext();){//遍历result节点 + Element result = (Element) rit.next(); + checkTag(result.getName(), "result"); + Attribute resultName = result.attribute("name"); + resultMap.put(actionName.getText()+"_"+resultName.getText() , result.getData().toString()); + System.out.println("add to resultMap: result:"+resultName.getText()+",url:"+result.getData()); + } + } + + + } + + public static View runAction(String actionName, Map parameters) throws Exception { + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + if(!actionsMap.containsKey(actionName)){ + throw new Exception("action "+actionName+"not found!"); + } + + String className = actionsMap.get(actionName); + Class clazz = Class.forName(className); + Object obj = clazz.newInstance(); + Field[] fields = clazz.getDeclaredFields(); + + for (Field field : fields) { + field.setAccessible(true); + if(parameters.containsKey(field.getName())){ + field.set(obj, parameters.get(field.getName())); + } + } + Method execute = clazz.getDeclaredMethod("execute"); + String result = (String) execute.invoke(obj, new Object[]{}); + String jsp = resultMap.get(actionName+"_"+result); + if(null == jsp){ + throw new Exception("jsp config at action:"+actionName +",result:"+ result+" not found !"); + } + Field message = clazz.getDeclaredField("message"); + message.setAccessible(true); + View view = new View(); + view.setJsp(jsp); + Map params = new HashMap(); + params.put("message", message.get(obj)); + view.setParameters(params); + return view; + } + public static Struts getInstance(){ + return StrutsHoldler.INSTANCE; + } + private static class StrutsHoldler{ + private static Struts INSTANCE = new Struts();//struts对象应该是单例的 + } +} diff --git a/group07/764189149/src/com/leijing/coderising/litestruts/StrutsTest.java b/group07/764189149/src/com/leijing/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..787d2bcd28 --- /dev/null +++ b/group07/764189149/src/com/leijing/coderising/litestruts/StrutsTest.java @@ -0,0 +1,44 @@ +package com.leijing.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { +private Struts struts = Struts.getInstance();//struts对象应该是单例的 + + @Test + public void testLoginActionSuccess() throws Exception { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group07/764189149/src/com/leijing/coderising/litestruts/View.java b/group07/764189149/src/com/leijing/coderising/litestruts/View.java new file mode 100644 index 0000000000..3411bf9130 --- /dev/null +++ b/group07/764189149/src/com/leijing/coderising/litestruts/View.java @@ -0,0 +1,38 @@ +package com.leijing.coderising.litestruts; + +import java.util.Map; +import java.util.Set; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("jsp:").append(jsp); + if(null == parameters){ + return sb.toString(); + } + Set keys = parameters.keySet(); + + for (String key : keys) { + sb.append(",").append(key).append(":").append(parameters.get(key)); + } + return sb.toString(); + } +} diff --git a/group07/764189149/src/com/leijing/coderising/litestruts/struts.xml b/group07/764189149/src/com/leijing/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..0ef54148e1 --- /dev/null +++ b/group07/764189149/src/com/leijing/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group07/764189149/src/firstHomeWork/util/ArrayList.java b/group07/764189149/src/firstHomeWork/util/ArrayList.java new file mode 100644 index 0000000000..88b97d828f --- /dev/null +++ b/group07/764189149/src/firstHomeWork/util/ArrayList.java @@ -0,0 +1,197 @@ +package firstHomeWork.util; + +import java.util.NoSuchElementException; + +/** + * @Description: 基于数组的列表 + * @author: leijing + * @date: 2017年2月21日 下午9:03:17 + * @param + */ +public class ArrayList implements List { + private static int initialCapacity = 10 ;//数组默认初始容量 + Object[] elements;//元素的数组 + private int size;//元素的个数 + + public ArrayList(){ + this(initialCapacity); + } + public ArrayList(int capacity){ + elements = new Object[capacity]; + } + private void ensureCapacity(int minCapacity){ + if(minCapacity > 0){ + + } + } + @Override + public boolean add(E e) { + ensureCapacity(size + 1); + elements[size++] = e; + return true; + } + + @Override + public E remove(int index) { + rangeCheck(index); + E oldElement = (E) elements[index]; + //将其后的元素前移 + int needMovedNum = size - index - 1; + move(elements, index+1, elements,index, needMovedNum); + size--; + return oldElement; + } + + /** + * @Description: 移动数组中的元素 + * @param src 原数组 + * @param from 复制元素起始下标 + * @param dest 目标元素数组 + * @param num 要复制的元素个数 + * @return: void + * @author: leijing + * @date: 2017年2月22日 下午7:54:08 + */ + private void move(Object[] src , int srcPosition , Object[] dest , int destPosition, int num){ + for(int i = 0 ; i < num ; i ++){ + dest[destPosition++] = src[srcPosition++]; + } + } + + /** + * @Description: 检查下标是否正确,如果越界抛出异常 + * @param index + * @return: void + * @author: leijing + * @date: 2017年2月22日 下午7:52:59 + */ + private void rangeCheck(int index){ + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException(); + } + } + + @Override + public boolean remove(Object o) { + if(o == null){ + for (int index = 0; index < size; index++) { + if(elements[index] == null){ + remove(index); + return true; + } + } + }else{ + for (int index = 0; index < size; index++) { + if(o.equals(elements[index])){ + remove(index); + return true; + } + } + } + return false; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public E get(int index) { + rangeCheck(index); + return (E) elements[index]; + } + + @Override + public E set(int index, E e) { + rangeCheck(index); + E oldElement = (E) elements[index]; + elements[index] = e; + return oldElement; + } + + @Override + public boolean contains(Object o) { + return indexOf(o) >= 0; + } + + private int indexOf(Object o){ + if(o == null){ + for (int index = 0; index < size; index++) { + if(elements[index] == null){ + return index; + } + } + }else{ + for (int index = 0; index < size; index++) { + if(o.equals(elements[index])){ + return index; + } + } + } + return -1; + } + + @Override + public void clear() { + for (int index = 0; index < size; index++) { + elements[index] = null; + } + size = 0; + } + + @Override + public Iterator iterator() { + return new ArraylistIterator(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (int index = 0; index < size; index++) { + if(index == size -1){ + sb.append(elements[index]); + }else{ + sb.append(elements[index]).append(","); + } + + } + return sb.toString(); + } + private class ArraylistIterator implements Iterator{ + private int position; + + @Override + public boolean hasNext() { + return position != size; + } + + @Override + public E next() { + Object[] elements = ArrayList.this.elements; + int i = position; + if(i >= size){ + throw new NoSuchElementException(); + } + position = i + 1; + return (E) elements[i+1]; + } + + @Override + public void remove() { + if(position > size){ + throw new NoSuchElementException(); + } + ArrayList.this.remove(position); + } + + } + + + +} diff --git a/group07/764189149/src/firstHomeWork/util/BinaryTreeNode.java b/group07/764189149/src/firstHomeWork/util/BinaryTreeNode.java new file mode 100644 index 0000000000..c7e85d4915 --- /dev/null +++ b/group07/764189149/src/firstHomeWork/util/BinaryTreeNode.java @@ -0,0 +1,31 @@ +package firstHomeWork.util; +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group07/764189149/src/firstHomeWork/util/DoubleLinkedList.java b/group07/764189149/src/firstHomeWork/util/DoubleLinkedList.java new file mode 100644 index 0000000000..9e83297a46 --- /dev/null +++ b/group07/764189149/src/firstHomeWork/util/DoubleLinkedList.java @@ -0,0 +1,335 @@ +package firstHomeWork.util; + +import java.util.NoSuchElementException; + +/** + * @Description: 双向链表 + * @author: leijing + * @date: 2017年2月24日 上午11:37:58 + * @param + */ +public class DoubleLinkedList { + + private int size;//节点个数 + private Node head;//头节点 + private Node tail;//尾节点 + + public Node getHead() { + return head; + } + public void setHead(Node head) { + this.head = head; + } + public Node getTail() { + return tail; + } + public void setTail(Node tail) { + this.tail = tail; + } + /** + * @Description: 添加元素到头部 + * @param e + * @return: boolean + * @author: leijing + * @date: 2017年2月24日 上午11:38:20 + */ + public boolean addFirst(E e) { + Node node = new Node(e); + if(null == head){ + node.prev = null; + head = node; + tail = head; + }else{ + node.next = head; + head.prev = node; + head = node; + } + size++; + return true; + } + /** + * @Description: 添加元素到尾部 + * @param e + * @return: boolean + * @author: leijing + * @date: 2017年2月24日 上午11:38:20 + */ + public boolean addLast(E e) { + Node node = new Node(e); + if(null == tail){ + tail.next = null; + tail = node; + head = tail; + }else{ + tail.next = node; + node.prev = tail; + tail = node; + } + size++; + return true; + } + + public boolean remove(E o) throws Exception { + if(isEmpty()){ + throw new Exception("链表为空,没有元素可以删除"); + } + Node current = head;//从头节点开始删 + if(o == null){ + while(current != null){ + if(current.data == null){ + current.prev.next = current.next;//将当前节点的前驱节点的后继节点改为当前节点的后继 + current.next.prev = current.prev;//将当前节点后继节点的前驱节点改为当前节点的前驱节点 + current.next = null;//当前节点的前驱改为null + current.prev = null;//当前节点的后继改为null + size--; + return true; + } + current = current.next; + } + }else{ + while(current != null){ + if(o.equals(current.data)){ + current.prev.next = current.next;//将当前节点的前驱节点的后继节点改为当前节点的后继 + current.next.prev = current.prev;//将当前节点后继节点的前驱节点改为当前节点的前驱节点 + current.next = null;//当前节点的前驱改为null + current.prev = null;//当前节点的后继改为null + size--; + return true; + } + current = current.next; + } + } + + return false; + } + + /** + * @Description: 返回元素个数 + * @return: int + * @author: leijing + * @date: 2017年2月24日 上午11:38:20 + */ + public int size() { + return size; + } + /** + * @Description: 是否空链表 + * @return: boolean + * @author: leijing + * @date: 2017年2月24日 上午11:38:20 + */ + public boolean isEmpty() { + return size == 0; + } + /** + * @Description: 检查下标有效性 + * @param index + * @return: void + * @author: leijing + * @date: 2017年2月24日 上午11:40:15 + */ + private void rangeCheck(int index){ + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException(); + } + } + public E get(int index) { + rangeCheck(index); + Node current = head;//从头节点开始 + int i = 0; + while(current != null){ + if(i == index){ + return current.data; + } + current = current.next; + i++; + } + return null; + } + public Node node(int index) { + rangeCheck(index); + if(index < size >> 1){//小于元素大小的二分之一,从头节点开始遍历 + Node current = head;//从头节点开始 + for(int i = 0 ; i < index ; i++){ + current = current.next; + } + return (Node)current; + }else{//从尾节点开始遍历 + Node current = tail;//从尾节点开始 + for(int i = 0 ; i < index ; i++){ + current = current.prev; + } + return (Node)current; + } + } + /** + * @Description: 设置某个位置的元素 + * @param index + * @param data + * @return: E + * @author: leijing + * @date: 2017年2月24日 上午11:58:32 + */ + public E set(int index, E data) { + rangeCheck(index); + Node current = head;//从头节点开始 + int i = 0; + while(current != null){ + if(i == index){ + Node node = new Node(data); + Node prev = current.prev; + prev.next = node; + node.prev = prev; + node.next = current; + current.prev = node; + size++; + return data; + } + current = current.next; + i++; + } + return null; + } + /** + * @Description: 判断是否包含某个元素 + * @param o + * @throws Exception + * @return: boolean + * @author: leijing + * @date: 2017年2月24日 上午11:57:35 + */ + public boolean contains(Object o) throws Exception { + if(isEmpty()){ + throw new Exception("链表为空,没有任何元素"); + } + Node current = head;//从头节点开始找 + if(o == null){ + while(current != null){ + if(current.data == null){ + return true; + } + current = current.next; + } + }else{ + while(current != null){ + if(o.equals(current.data)){ + return true; + } + current = current.next; + } + } + return false; + } + /** + * @Description: 清空链表,删除所有元素 + * @return: void + * @author: leijing + * @date: 2017年2月24日 下午4:41:56 + */ + public void clear() { + Node current = head;//从头节点开始遍历 + while(current != null){ + Node tmp = current; + current = current.next; + tmp.prev = null; + tmp.next = null; + } + size = 0; + } + + public Iterator iterator() { + return new ListItr(0); + } + private class ListItr implements Iterator{ + private Node lastReturned = null;//当前的节点 + private Node next;//下一个节点 + private int nextIndex;//当前索引的下标 + + public ListItr(int nextIndex){ + next = (nextIndex == size) ? null : node(nextIndex); + } + + @Override + public boolean hasNext() { + return nextIndex < size; + } + + @Override + public E next() { + if (!hasNext()){ + throw new NoSuchElementException(); + } + + lastReturned = next; + next = next.next; + nextIndex++; + return lastReturned.data; + } + + @Override + public void remove() { + if (lastReturned == null){ + throw new IllegalStateException(); + } + + if(lastReturned == next){//tail node + lastReturned.prev.next = null; + lastReturned.prev = null; + }else{ + lastReturned.prev.next = lastReturned.next; + lastReturned.next.prev = lastReturned.prev; + lastReturned.next = null; + lastReturned.prev = null; + } + nextIndex--; + } + + public boolean hasPrev(){ + return nextIndex > 0; + } + + public E prev(){ + if(!hasPrev()){ + throw new NoSuchElementException(); + } + next = lastReturned = (next == null ) ? tail : next.prev;//如果是头节点,前一个指向尾节点 + nextIndex--; + return lastReturned.data; + } + + } + + static class Node{ + private E data; + private Node prev;//前驱节点 + private Node next;//后继节点 + + public Node(E data){ + this.data = data; + } + + public E getData() { + return data; + } + + public void setData(E data) { + this.data = data; + } + + public Node getPrev() { + return prev; + } + + public void setPrev(Node prev) { + this.prev = prev; + } + + public Node getNext() { + return next; + } + + public void setNext(Node next) { + this.next = next; + } + } +} diff --git a/group07/764189149/src/firstHomeWork/util/Iterator.java b/group07/764189149/src/firstHomeWork/util/Iterator.java new file mode 100644 index 0000000000..ecbf3015e0 --- /dev/null +++ b/group07/764189149/src/firstHomeWork/util/Iterator.java @@ -0,0 +1,30 @@ +package firstHomeWork.util; + +/** + * @Description: 迭代器 + * @author: leijing + * @date: 2017年2月21日 下午8:49:10 + * @param + */ +public interface Iterator { + /** + * @Description: 返回迭代器中是否有下一个元素 + * @return: boolean + * @author: leijing + * @date: 2017年2月21日 下午8:49:52 + */ + boolean hasNext(); + /** + * @Description: 返回迭代器中的下一个元素 + * @return: E + * @author: leijing + * @date: 2017年2月21日 下午8:50:35 + */ + E next(); + /** + * @Description: 删除迭代器中的当前元素 + * @author: leijing + * @date: 2017年2月21日 下午8:51:07 + */ + void remove(); +} diff --git a/group07/764189149/src/firstHomeWork/util/List.java b/group07/764189149/src/firstHomeWork/util/List.java new file mode 100644 index 0000000000..fac6efa0cc --- /dev/null +++ b/group07/764189149/src/firstHomeWork/util/List.java @@ -0,0 +1,87 @@ +package firstHomeWork.util; + +/** + * @Description: 定义一组操作有序列表的接口 + * @author: leijing + * @date: 2017年2月21日 下午8:53:52 + * @param + */ +public interface List { + /** + * @Description: 添加元素 + * @param e + * @return: boolean + * @author: leijing + * @date: 2017年2月21日 下午8:55:32 + */ + boolean add(E e); + /** + * @Description: 删除指定索引的元素 + * @param index + * @return: E + * @author: leijing + * @date: 2017年2月21日 下午8:56:08 + */ + E remove(int index); + /** + * @Description: 删除元素 + * @param o + * @return: boolean + * @author: leijing + * @date: 2017年2月21日 下午8:56:28 + */ + boolean remove(Object o); + /** + * @Description: 返回元素个数 + * @return: int + * @author: leijing + * @date: 2017年2月21日 下午8:57:25 + */ + int size(); + /** + * @Description: 判断集合是否为空 + * @return: boolean + * @author: leijing + * @date: 2017年2月21日 下午8:57:51 + */ + boolean isEmpty(); + /** + * @Description: 获取指定位置的元素 + * @param index + * @return: E + * @author: leijing + * @date: 2017年2月21日 下午8:58:27 + */ + E get(int index); + /** + * @Description: 设置指定位置的元素 + * @param index + * @param e + * @return: E + * @author: leijing + * @date: 2017年2月21日 下午8:58:58 + */ + E set(int index , E e); + /** + * @Description: 判断集合是否包含某个元素 + * @param o + * @return: boolean + * @author: leijing + * @date: 2017年2月21日 下午8:59:32 + */ + boolean contains(Object o); + /** + * @Description: 清空集合 + * @return: void + * @author: leijing + * @date: 2017年2月21日 下午9:00:12 + */ + void clear(); + /** + * @Description: 获取集合的迭代器 + * @return: Iterator + * @author: leijing + * @date: 2017年2月21日 下午9:00:47 + */ + Iterator iterator(); +} diff --git a/group07/764189149/src/firstHomeWork/util/Queue.java b/group07/764189149/src/firstHomeWork/util/Queue.java new file mode 100644 index 0000000000..78185c3ae8 --- /dev/null +++ b/group07/764189149/src/firstHomeWork/util/Queue.java @@ -0,0 +1,59 @@ +package firstHomeWork.util; + +/** + * @Description: 循环队列 + * @author: leijing + * @date: 2017年2月24日 下午9:00:30 + * @param + */ +public class Queue { + private Object[] queue; + private int capacity; + private static int INITIAL_CAPACITY = 10; + private int front; //队头 + private int rear; //队尾 + + public Queue(int capacity){ + this.capacity = capacity; + this.front = 0; + this.rear = 0; + queue = new Object[capacity]; + } + public Queue(){ + this(INITIAL_CAPACITY); + } + + public boolean enQueue(E e) throws Exception{ + if(isFull()){ + return false; + } + if(rear == capacity - 1){//循环利用 + rear = 0; + } + queue[rear++] = e; + return true; + } + + public E deQueue(){ + if(isEmpty()){ + return null; + } + if(front == capacity - 1){ + front = 0; + } + + return (E) queue[front++]; + } + + public boolean isEmpty(){ + return front == rear; + } + + public int size(){ + return Math.abs(rear - front) + 1; + } + + public boolean isFull(){ + return (rear + 1) % capacity == front; + } +} diff --git a/group07/764189149/src/firstHomeWork/util/Stack.java b/group07/764189149/src/firstHomeWork/util/Stack.java new file mode 100644 index 0000000000..a217fd0c74 --- /dev/null +++ b/group07/764189149/src/firstHomeWork/util/Stack.java @@ -0,0 +1,22 @@ +package firstHomeWork.util; + +public class Stack { + private ArrayList elementData = new ArrayList(); + public void push(E e){ + elementData.add(e); + } + + public Object pop(){ + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return elementData.isEmpty(); + } + public int size(){ + return elementData.size(); + } +} diff --git "a/group07/770164810/git\345\221\275\344\273\244.txt" "b/group07/770164810/git\345\221\275\344\273\244.txt" new file mode 100644 index 0000000000..8bcf2ffa0f --- /dev/null +++ "b/group07/770164810/git\345\221\275\344\273\244.txt" @@ -0,0 +1,11 @@ +װgit guigit bash +1.¡ +git clone git@github.com:leijing1992/coding2017.git +2.޸ĵļ +git add -A +3.ύݴ +git commit -m "ύ***" +4.master +git pull origin master +5.ύmaster +git push origin master \ No newline at end of file diff --git a/group07/770164810/src/com/coding/basic/ArrayList.java b/group07/770164810/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..265f4398ed --- /dev/null +++ b/group07/770164810/src/com/coding/basic/ArrayList.java @@ -0,0 +1,68 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private int modifyNum = 0; + + private Object[] elementData = new Object[100]; + public void add(Object o){ + elementData[size]=o; + size++; + } + public void add(int index, Object o){ + for(int i=size;i>index;i--) + { + elementData[i]=elementData[i-1]; + } + elementData[index]=o; + } + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + Object oj=elementData[index]; + for(int i=index;i= size || index < 0) throw new IndexOutOfBoundsException(); + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node n = first; + first = new Node(o); + if(n != null){ + first.next = n; + }else{ + last = first; + } + size++; + } + + public void addLast(Object o) { + Node n = new Node(o); + if(last != null){ + last.next = n; + }else{ + first = n; + } + last = n; + size++; + } + + public Object removeFirst() { + return null; + } + + public Object removeLast() { + return null; + } + + public Iterator iterator() { + return null; + } + + private static class Node { + Object data; + Node next; + + public Node(Object data){ + this.data = data; + } + + public Node(){} + + } + + public static void main(String[] args) { + LinkedList l = new LinkedList(); + l.add(1); + l.add(2); + l.add(3); + l.add(4); + l.add(2, 5); + l.remove(0); + + for(int i=0;i= elementData.length-1){ + return true; + } + return false; + } + + public boolean isEmpty() { + if(size == 0) { + return true; + } + return false; + } + + private void ifOutOfBounds(int index) { + if(index >= size || index < 0) { + throw new IndexOutOfBoundsException(); + } + } + + private Object[] expandArray(Object[] arr) { + return Arrays.copyOf(arr, arr.length+10); + } + + public Iterator iterator = new ArrayListIterator(this); + + private class ArrayListIterator implements Iterator{ + + private ArrayList arrList; + int position = 0,length; + + private ArrayListIterator(ArrayList arrList){ + this.arrList = arrList; + this.length = arrList.size(); + } + + @Override + public boolean hasNext() { + return position < length; + } + + @Override + public Object next() { + return arrList.get(position++); + } + + } + + public static void main(String[] args) { + ArrayList arr = new ArrayList(); + arr.add(1); + arr.add(2); + arr.add(3); + arr.add(1,4); + arr.remove(2); + System.out.println(arr.toString()); + System.out.println(arr.size()); + System.out.println(arr.iterator.next()); + System.out.println(arr.iterator.next()); + } +} diff --git a/group08/108621969/2-26/com/coding/basic/BinaryTreeNode.java b/group08/108621969/2-26/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..f86efd62f5 --- /dev/null +++ b/group08/108621969/2-26/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,56 @@ +package com.coding.basic; + +/** + * Created by zhangjiatao on 2017/2/25. + */ +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Object o) { + this.data = o; + this.left = null; + this.right = null; + } + + public int getData() { + return (int) data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + BinaryTreeNode newNode = new BinaryTreeNode(o); + insertInto(this, newNode); + return this; + } + + private void insertInto(BinaryTreeNode tree, BinaryTreeNode o) { + if (o.getData() <= tree.getData()) { + if (tree.getLeft() != null) insertInto(tree.getLeft(), o); + else tree.setLeft(o); + } else { + if (tree.getRight() != null) insertInto(tree.getRight(), o); + else tree.setRight(o); + } + } +} diff --git a/group08/108621969/2-26/com/coding/basic/Iterator.java b/group08/108621969/2-26/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..ae5e36f464 --- /dev/null +++ b/group08/108621969/2-26/com/coding/basic/Iterator.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +/** + * Created by zhangjiatao on 2017/2/25. + */ +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group08/108621969/2-26/com/coding/basic/LinkedList.java b/group08/108621969/2-26/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..dadf8caeaf --- /dev/null +++ b/group08/108621969/2-26/com/coding/basic/LinkedList.java @@ -0,0 +1,174 @@ +package com.coding.basic; + +import java.util.Objects; + +/** + * Created by zhangjiatao on 2017/2/25. + */ +public class LinkedList implements List { + private Node head = null,tail = null; + private int size=0; + private LinkedListIterator iterator = null; + + @Override + public void add(Object o) { + Node newNode = new Node(o); + if(tail == null) { + head = tail = newNode; + }else { + tail.next = newNode; + tail = newNode; + } + size++; + } + + @Override + public void add(int index, Object o) { + ifOutOfBounds(index); + Node temp = head,previousNode = head; + Node newNode = new Node(o); + if(index == 0) { + newNode.next = head; + head = newNode; + return ; + } + while(index-- > 0) { + previousNode = temp; + temp = temp.next; + } + previousNode.next = newNode; + newNode.next = temp; + size++; + } + + @Override + public Object get(int index) { + ifOutOfBounds(index); + Node temp = head; + while(index-- > 0) { + temp = temp.next; + } + return temp; + } + + @Override + public Object remove(int index) { + ifOutOfBounds(index); + Node temp = head,previousNode = head; + if(head == tail) { + head = tail = null; + return temp; + } + while(index-- > 0) { + previousNode = temp; + temp = temp.next; + } + if(tail == temp) { + tail = previousNode; + } + previousNode.next = temp.next; + size--; + return temp; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object o) { + add(0,o); + } + + public void addLast(Object o) { + add(o); + } + + public Object removeFirst() { + return remove(0); + } + + public Object removeLast() { + return remove(size()-1); + } + + public LinkedListIterator Iterator() { + if(iterator ==null) { + iterator = new LinkedListIterator(this); + } + return iterator; + } + + private void ifOutOfBounds(int index) { + if(index >= size || index < 0) { + throw new IndexOutOfBoundsException(); + } + } + + private boolean isEmpty() { + return size==0; + } + + public String toString() { + String str = ""; + Node temp = head; + while(temp!=tail) { + str = str + temp.data + " "; + temp = temp.next; + } + return str + tail.data; + } + + private static class Node { + Object data; + Node next; + public Node(Object o) { + this.data = o; + this.next = null; + } + } + + private class LinkedListIterator implements Iterator { + private LinkedList linkedList = null; + private Node currentNode = null; + + public LinkedListIterator(LinkedList linkedList) { + this.linkedList = linkedList; + this.currentNode = this.linkedList.head; + } + + @Override + public boolean hasNext() { + if(linkedList.isEmpty()) return false; + return currentNode.next != null; + } + + @Override + public Object next() { + Object data = currentNode.data; + if(hasNext()) { + currentNode = currentNode.next; + } + return data; + } + } + + public static void main(String[] args) { + LinkedList arr = new LinkedList(); + arr.add(1); + arr.add(2); + arr.add(3); + arr.add(5); + arr.add(1,4); + arr.remove(2); + arr.removeLast(); + arr.addFirst(5); + System.out.println(arr.toString()); + System.out.println(arr.size()); + System.out.println(arr.Iterator().hasNext()); + System.out.println(arr.Iterator().next()); + System.out.println(arr.Iterator().next()); + System.out.println(arr.Iterator().next()); + System.out.println(arr.Iterator().next()); + } +} diff --git a/group08/108621969/2-26/com/coding/basic/List.java b/group08/108621969/2-26/com/coding/basic/List.java new file mode 100644 index 0000000000..30a4b4e7cb --- /dev/null +++ b/group08/108621969/2-26/com/coding/basic/List.java @@ -0,0 +1,12 @@ +package com.coding.basic; + +/** + * Created by zhangjiatao on 2017/2/25. + */ +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group08/108621969/2-26/com/coding/basic/Queue.java b/group08/108621969/2-26/com/coding/basic/Queue.java new file mode 100644 index 0000000000..fd087cbd9b --- /dev/null +++ b/group08/108621969/2-26/com/coding/basic/Queue.java @@ -0,0 +1,33 @@ +package com.coding.basic; + +/** + * Created by zhangjiatao on 2017/2/25. + */ +public class Queue { + private ArrayList elementData = new ArrayList(); + + public void enQueue(Object o) { + elementData.add(0, o); + } + + public Object deQueue() { + return elementData.remove(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.isEmpty(); + } + + public int size() { + return elementData.size(); + } + + public static void main(String[] args) { + Queue queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + System.out.println(queue.deQueue()); + System.out.println(queue.toString()); + } +} diff --git a/group08/108621969/2-26/com/coding/basic/Stack.java b/group08/108621969/2-26/com/coding/basic/Stack.java new file mode 100644 index 0000000000..d600d86fe5 --- /dev/null +++ b/group08/108621969/2-26/com/coding/basic/Stack.java @@ -0,0 +1,40 @@ +package com.coding.basic; + +import java.util.ArrayList; + + +/** + * Created by zhangjiatao on 2017/2/25. + */ +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(elementData.size(), o); + } + + public Object pop() { + return elementData.remove(elementData.size() - 1); + } + + public Object peek() { + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.isEmpty(); + } + + public int size() { + return elementData.size(); + } + + public static void main(String[] args) { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + System.out.println(stack.pop()); + System.out.println(stack.toString()); + } +} diff --git a/group08/108621969/README.md b/group08/108621969/README.md new file mode 100644 index 0000000000..413f53e93a --- /dev/null +++ b/group08/108621969/README.md @@ -0,0 +1,7 @@ +# About Me +1. 姓名: 张加涛 +2. 性别: 男 +3. 状态: 实习 +4. 年龄: 22 +5. 职业: web前端 +6. 坐标: 上海浦东 diff --git a/group08/108621969/article/Comp-Units-Relations(2-16).md b/group08/108621969/article/Comp-Units-Relations(2-16).md new file mode 100644 index 0000000000..b3fdcbb61b --- /dev/null +++ b/group08/108621969/article/Comp-Units-Relations(2-16).md @@ -0,0 +1,14 @@ +# CPU +由寄存器、运算器、控制器组成 +还有一级缓存、二级缓存等 +# 内存 +我们所说的内存都是系统内存,是SDRAM,动态随机存储器 +速度快容量小 +# 硬盘 +容量大速度慢 +# 指令 +程序在计算机中被分解为一条条的指令 +# 关系 +程序文件在硬盘中,当调用时,从硬盘载入内存, +控制器从内存中读取程序的第一条指令,指令通知运算器读取内存中的数据的地址, +运算器结合寄存器计算出结果,读取下一条指令,直到指令结束。 diff --git a/group08/1144989424/Readme.md b/group08/1144989424/Readme.md new file mode 100644 index 0000000000..3a515bb88b --- /dev/null +++ b/group08/1144989424/Readme.md @@ -0,0 +1,3 @@ +### 目录说明 + +个人目录,他人勿动 diff --git a/group08/1144989424/firstPractice/readme.md b/group08/1144989424/firstPractice/readme.md new file mode 100644 index 0000000000..ac4feb57b8 --- /dev/null +++ b/group08/1144989424/firstPractice/readme.md @@ -0,0 +1,4 @@ +### 第一次作业: +1. 实现ArrayList, LinkedList, Queue, Stack +2. 有余力的同学可以实现 BinaryTree 和Iterator +3. 写一篇文章,建议: 描述CPU,内存, 硬盘,指令之间的关系。 \ No newline at end of file diff --git a/group08/1144989424/firstPractice/src/basic/BinaryTreeNode.java b/group08/1144989424/firstPractice/src/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..6300e92259 --- /dev/null +++ b/group08/1144989424/firstPractice/src/basic/BinaryTreeNode.java @@ -0,0 +1,49 @@ +package basic; + +/** + * 二叉树的数据结构 + * @author Wayss + * 2017-02-25 + */ + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(){ + + } + + public BinaryTreeNode(Integer val){ + data = val; + left = null; + right = null; + } + + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group08/1144989424/firstPractice/src/basic/MyArrayList.java b/group08/1144989424/firstPractice/src/basic/MyArrayList.java new file mode 100644 index 0000000000..f9cf5b1b80 --- /dev/null +++ b/group08/1144989424/firstPractice/src/basic/MyArrayList.java @@ -0,0 +1,97 @@ +package basic; + +/** + * 我的ArrayList实现 + * @author Wayss + * 2017-02-22 + */ + +public class MyArrayList implements MyList { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + /** + * 往集合中添加一个元素 + */ + public void add(Object o){ + int length = elementData.length; + //1.比较元素个数和数组大小,判断是否需要扩大数组 + if(size == length){ + expandArray(); + } + //2.直接赋值给size,即最后一个元素 + elementData[size] = o; + size++; + } + + /** + * 往集合指定位置添加一个元素,该位置和其之后的元素向后移动一位。 + * 位置不合法时,抛出异常。 + */ + public void add(int index, Object o){ + int length = elementData.length; + //0.先对index的值进行判断,小于0,或者,大于size,越界 + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); + } + //1.比较元素个数和数组大小,判断是否需要扩大数组 + if(size == length){ + expandArray(); + } + //2.移动index之后的数组元素 + for(int i = size; i > index; i--){ + elementData[i] = elementData[i-1]; + } + elementData[index] = o; + size++; + } + + public Object get(int index){ + int length = elementData.length; + //0.先对index的值进行判断,小于0,或者,大于等于size,便越界 + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); + } + //2.拿出index位置的值, + Object o = elementData[index]; + + return o; + } + + public Object remove(int index){ + //remove 前两步的逻辑和get方法相同 + int length = elementData.length; + //0.先对index的值进行判断,小于0,或者,大于等于size,便越界 + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); + } + //2.拿出index位置的值, + Object o = elementData[index]; + + //3.删除index位置的值,之后的值,向前移动。 + for(int i = index; i < size-1; i++){ + elementData[i] = elementData[i+1]; + } + size--; + return null; + } + + public int size(){ + return size; + } + + public MyIterator iterator(){ + return null; + } + + private void expandArray(){ + int length = elementData.length; + Object [] newArr = new Object[length * 2]; + for(int i = 0; i < length; i++){ + newArr[i] = elementData[i]; + } + elementData = newArr; + } +} diff --git a/group08/1144989424/firstPractice/src/basic/MyIterator.java b/group08/1144989424/firstPractice/src/basic/MyIterator.java new file mode 100644 index 0000000000..2aa1de62c4 --- /dev/null +++ b/group08/1144989424/firstPractice/src/basic/MyIterator.java @@ -0,0 +1,7 @@ +package basic; + +public interface MyIterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group08/1144989424/firstPractice/src/basic/MyLinkedList.java b/group08/1144989424/firstPractice/src/basic/MyLinkedList.java new file mode 100644 index 0000000000..3894884373 --- /dev/null +++ b/group08/1144989424/firstPractice/src/basic/MyLinkedList.java @@ -0,0 +1,113 @@ +package basic; + +/** + * 实现LinkedList基本功能 + * @author Wayss + * 2017-02-23 + */ + +public class MyLinkedList implements MyList { + + private Node head; + private int size = 0; + + public void add(Object o){ + Node n = new Node(o); + head.next = n; + size++; + } + public void add(int index , Object o){ + //1.index校验 + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); + } + //2. 查找index位置的前一个节点 + //tempNode为当前链表的第一个节点 + Node tempNode = head.next; + for(int i = 0; i < index - 1 ; i++){ + tempNode = tempNode.next; + } + Node behindNode = tempNode.next; + Node insertNode = new Node(o); + tempNode.next = insertNode; + insertNode.next = behindNode; + size++; + } + public Object get(int index){ + //1.index校验 + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); + } + //2. 查找当前节点 + Node tempNode = head.next; + for(int i = 0; i < index; i++){ + tempNode = tempNode.next; + } + return tempNode.data; + } + public Object remove(int index){ + //1.index校验 + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size); + } + //2. 查找当前节点的上一个节点 + Node tempNode = head.next; + for(int i = 0; i < index - 1; i++){ + tempNode = tempNode.next; + } + Node deleteNode = tempNode.next; + Node behideNode = tempNode.next.next; + tempNode.next = behideNode; + size--; + return deleteNode.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node insertNode = new Node(o); + insertNode.next = head.next; + head.next = insertNode; + size++; + } + public void addLast(Object o){ + Node insertNode = new Node(o); + Node tempNode = head.next; + for(int i = 0; i < size; i++){ + tempNode = tempNode.next; + } + tempNode.next = insertNode; + size++; + } + public Object removeFirst(){ + Node firstNode = head.next; + head = firstNode.next; + size--; + return firstNode; + } + public Object removeLast(){ + Node tempNode = head.next; + //1.移除需要找到最后一个点的前一个点 + for(int i = 0; i < size - 1; i++){ + tempNode = tempNode.next; + } + Node deleteNode = tempNode.next; + tempNode.next = null; + size--; + return deleteNode; + } + public MyIterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + public Node(Object data){ + this.data = data; + } + } +} diff --git a/group08/1144989424/firstPractice/src/basic/MyList.java b/group08/1144989424/firstPractice/src/basic/MyList.java new file mode 100644 index 0000000000..c017431b22 --- /dev/null +++ b/group08/1144989424/firstPractice/src/basic/MyList.java @@ -0,0 +1,9 @@ +package basic; + +public interface MyList { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group08/1144989424/firstPractice/src/basic/MyQueue.java b/group08/1144989424/firstPractice/src/basic/MyQueue.java new file mode 100644 index 0000000000..31fab53105 --- /dev/null +++ b/group08/1144989424/firstPractice/src/basic/MyQueue.java @@ -0,0 +1,31 @@ +package basic; + +/** + * 实现队列 + * @author Wayss + * 2017-02-25 + */ + +public class MyQueue { + + MyLinkedList linkList = new MyLinkedList(); + + public void enQueue(Object o){ + linkList.addLast(o); + } + + public Object deQueue(){ + return linkList.removeFirst(); + } + + public boolean isEmpty(){ + if(linkList.size() == 0){ + return true; + } + return false; + } + + public int size(){ + return linkList.size(); + } +} diff --git a/group08/1144989424/firstPractice/src/basic/MySortBinaryTree.java b/group08/1144989424/firstPractice/src/basic/MySortBinaryTree.java new file mode 100644 index 0000000000..a4579217e5 --- /dev/null +++ b/group08/1144989424/firstPractice/src/basic/MySortBinaryTree.java @@ -0,0 +1,81 @@ +package basic; + +import java.util.Comparator; + +/** + * 实现二叉排序树,使左节点的值,始终父节点小,右节点的值,始终比父节点大 + * @author Wayss + * 2017-02-25 + */ + +public class MySortBinaryTree { + + public BinaryTreeNode root = new BinaryTreeNode(); + + /** + * 1. 添加时,先判断与root节点值的大小 + * 2. insert的值小于root的值,则插入到root的左边。 + * 3. insert的值大于root的值,则插入到root的右边。 + * PS:目前只支持Integer类型的对象插入 + * @param val + */ + public void add(Integer val){ + BinaryTreeNode treeNode = new BinaryTreeNode(val); + insert(root, treeNode); + } + + private void insert(BinaryTreeNode node, BinaryTreeNode insertNode){ + + int result = compare((Integer)insertNode.getData(),(Integer)node.getData()); + + if(0 == result){ + //相等的话,当重复数据,不插了.呵呵 + } + //insert的值小于root的值,则插入到root的左边。 + //如果左节点有值,则递归 + if(-1 == result){ + if(node.getLeft() != null){ + insert(node.getLeft(), insertNode); + }else{ + node.setLeft(insertNode); + } + } + //insert的值大于root的值,则插入到root的右边。 + if(1 == result){ + if(node.getRight() != null){ + insert(node.getRight(), insertNode); + }else{ + node.setRight(insertNode); + } + } + } + + public MyArrayList getValue(){ + MyArrayList malist = new MyArrayList(); + getTreeValue(root,malist); + return malist; + } + + private void getTreeValue(BinaryTreeNode node,MyArrayList list){ + //遍历左子数 + if(node.getLeft() != null){ + getTreeValue(node.getLeft(),list); + } + list.add(node.getData()); + //遍历右子数 + if(node.getRight() != null){ + getTreeValue(node.getRight(),list); + } + } + + public static int compare(Integer i1, Integer i2){ + if(i1 < i2){ + return -1; + }else if(i1 == i2){ + return 0; + }else { + return 1; + } + } + +} diff --git a/group08/1144989424/firstPractice/src/basic/MyStack.java b/group08/1144989424/firstPractice/src/basic/MyStack.java new file mode 100644 index 0000000000..c8e8e0d2fd --- /dev/null +++ b/group08/1144989424/firstPractice/src/basic/MyStack.java @@ -0,0 +1,33 @@ +package basic; + +/** + * 栈实现 + * @author Wayss + * 2017-02-25 + */ + +public class MyStack { + private MyArrayList arrList = new MyArrayList(); + + public void push(Object o){ + arrList.add(o); + } + + public Object pop(){ + //elementData.size()-1是当前数组的最后一个元素的下标 + return arrList.remove(arrList.size() - 1); + } + + public Object peek(){ + return arrList.get(arrList.size() - 1); + } + public boolean isEmpty(){ + if(arrList.size() == 0){ + return true; + } + return false; + } + public int size(){ + return arrList.size(); + } +} diff --git "a/group08/121027265/0226/cpu_\345\206\205\345\255\230_\347\241\254\347\233\230_\346\214\207\344\273\244\344\271\213\351\227\264\345\205\263\347\263\273.md" "b/group08/121027265/0226/cpu_\345\206\205\345\255\230_\347\241\254\347\233\230_\346\214\207\344\273\244\344\271\213\351\227\264\345\205\263\347\263\273.md" new file mode 100644 index 0000000000..3b869cdfb0 --- /dev/null +++ "b/group08/121027265/0226/cpu_\345\206\205\345\255\230_\347\241\254\347\233\230_\346\214\207\344\273\244\344\271\213\351\227\264\345\205\263\347\263\273.md" @@ -0,0 +1,8 @@ +## cpu 内存 硬盘 指令之间的关系 +> 计算机整体分为软件和硬件。 +> 软件是由指令和数据组成的程序,硬件包含主板、CPU、内存、硬盘等 + + +指令指的是计算机可以识别的机器语言,每个操作系统都有内置的指令集,计算机可根据不同的指令来驱动计算机工作或是相应的输出。指令是以二进制的形式存储在硬盘中,当CPU执行某个指令的时候,需要将指令先从硬盘加载到内存,CPU从内存中获取执行解释执行。 + +CPU是计算的核心部件,相当于人类的大脑。CPU执行指令的时候其实不关心也不知道指令的意思,只是按照指令执行。由于硬盘读写性能比较差,CPU从硬盘中直接读取数据的时候比较费时,就有的内存的存在。内存比硬盘读写速度快很多,CPU要执行程序时,先将程序加载到内存中在执行。 \ No newline at end of file diff --git a/group08/121027265/0226/src/com/my/list/ArrayList.java b/group08/121027265/0226/src/com/my/list/ArrayList.java new file mode 100644 index 0000000000..8859116267 --- /dev/null +++ b/group08/121027265/0226/src/com/my/list/ArrayList.java @@ -0,0 +1,131 @@ +package com.my.list; + +/** + * 实现ArrayList + * + */ +public class ArrayList { + //初始化容量 + private static final int INIT = 5; + //增长因子 + private static final double GROWTH = 0.5; + + //初始化数组 + Object[] baseArr = new Object[INIT]; + //当前下标 + int currentIndex = 0; + //最大下标 + int maxIndex = INIT-1; + + /** + * 添加元素 + * @param obj + * @return + */ + public Object add(Object obj){ + if(judgeCapacity()){ + baseArr = arrayDilatation(baseArr, GROWTH); + maxIndex = baseArr.length-1; + } + baseArr[currentIndex] = obj; + ++currentIndex; + return obj; + } + + /** + * 指定下标添加元素 + * @param index + * @param obj + * @return + */ + public Object add(int index , Object obj){ + if (index < 0 || index > currentIndex) { + throw new IndexOutOfBoundsException(); + } + Object[] dest = new Object[currentIndex+1]; + System.arraycopy(baseArr, 0, dest, 0, index); + dest[index] = obj; + System.arraycopy(baseArr, index, dest, index+1, currentIndex-index); + ++currentIndex; + baseArr = dest; + return obj; + } + + /** + * 指定下标删除元素 + * @param index + * @return + */ + public Object remove(int index){ + if (index < 0 || index >= currentIndex) { + throw new IndexOutOfBoundsException(); + } + Object object = baseArr[index]; + Object[] dest = new Object[currentIndex]; + System.arraycopy(baseArr, 0, dest, 0, index); + System.arraycopy(baseArr, index+1, dest, index, currentIndex-index-1); + --currentIndex; + baseArr = dest; + return object; + } + + /** + * 根据下标获取元素 + * @param index + * @return + */ + public Object get(int index){ + + return baseArr[index]; + } + + /** + * 获取集合大小 + * @return + */ + public int size(){ + return currentIndex; + } + + /** + * 判断容量是否需要增加 + * @return + */ + public boolean judgeCapacity(){ + if(currentIndex > maxIndex){ + return true; + } + return false; + } + + /** + * 数组扩容 + * @param objArr + * @param groth + * @return + */ + public static Object[] arrayDilatation(Object[] objArr , double groth){ + int length = objArr.length; + int newLength = (int) (length * groth + length); + Object[] baseArr = new Object[newLength]; + System.arraycopy(objArr, 0, baseArr, 0, length); + return baseArr; + } + + +} + + + + + + + + + + + + + + + diff --git a/group08/121027265/0226/src/com/my/list/LinkedList.java b/group08/121027265/0226/src/com/my/list/LinkedList.java new file mode 100644 index 0000000000..ed6d05f87f --- /dev/null +++ b/group08/121027265/0226/src/com/my/list/LinkedList.java @@ -0,0 +1,156 @@ +package com.my.list; + +/** + * 实现 LinkedList + * + */ +public class LinkedList { + + //首节点 + Node first = new Node(); + //集合大小 + int size = 0; + + /** + * 添加元素 + * @param object + * @return + */ + public Object add(Object object){ + if (size == 0) { + first.setObject(object); + }else{ + Node previous = first; + Node temp = first.getNext(); + while (temp != null) { + previous = temp; + temp = temp.getNext(); + } + Node node = new Node(); + node.setObject(object); + previous.setNext(node); + } + ++size; + return object; + } + + /** + * 根据下标添加元素 + * @param index + * @param object + * @return + */ + public Object add(int index , Object object){ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + + if (size == 0) { + first.setObject(object); + }else{ + if (index == 0) { + Node temp = new Node(); + temp.setObject(object); + temp.setNext(first); + first = temp; + }else{ + int count = 1; + Node temp = first; + while (temp != null) { + if (count++ == index) { + Node next = temp.getNext(); + Node node = new Node(); + temp.setNext(node); + node.setObject(object); + node.setNext(next); + break; + } + temp = temp.getNext(); + } + } + } + ++size; + return object; + } + + /** + * 根据下标删除元素 + * @param index + * @return + */ + public Object remove(int index){ + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + Node node = null; + if (index == 0) { + Node next = first.getNext(); + first = next; + node = first; + }else{ + int count = 1; + Node temp = first; + while (temp != null) { + if (count++ == index) { + node = temp.getNext(); + Node next = node.getNext(); + temp.setNext(next); + break; + } + temp = temp.getNext(); + } + } + --size; + return node.getObject(); + } + + /** + * 根据下标获取元素 + * @param index + * @return + */ + public Object get(int index) { + Node temp = first; + int count = 0; + while (temp != null) { + if (count++ == index) { + break; + } + temp = temp.getNext(); + } + return temp.getObject(); + } + + /** + * 获取集合大小 + * @return + */ + public int size() { + return size; + } + + +} + + +/** + * 节点元素 + * + */ +class Node{ + private Object object ; + private Node next; + public Object getObject() { + return object; + } + public void setObject(Object object) { + this.object = object; + } + public Node getNext() { + return next; + } + public void setNext(Node next) { + this.next = next; + } + +} diff --git a/group08/121027265/0226/src/com/my/list/Test.java b/group08/121027265/0226/src/com/my/list/Test.java new file mode 100644 index 0000000000..e7d2a12742 --- /dev/null +++ b/group08/121027265/0226/src/com/my/list/Test.java @@ -0,0 +1,65 @@ +package com.my.list; + +public class Test { + + public static void main(String[] args) { + + testArrayList(); + System.out.println("--------------------------------"); + testLinkedList(); + } + + /** + * ArrayList 测试 + */ + public static void testArrayList(){ + System.out.println("ArrayList 测试 --开始"); + ArrayList list = new ArrayList(); + list.add("123"); + list.add("123"); + list.add("123"); + list.add("123"); + list.add("123"); + list.add("123"); + + list.add(1, 111); + + list.remove(1); + + System.out.println(list.baseArr.length); + System.out.println(list.size()); + + for (int i = 0; i < list.size(); i++) { + Object object = list.get(i); + System.out.println(object); + } + System.out.println("ArrayList 测试 --结束"); + } + + /** + * LinkedList 测试 + */ + public static void testLinkedList(){ + System.out.println("LinkedList 测试 --开始"); + LinkedList list = new LinkedList(); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + + list.add(1, 111); + + list.remove(1); + + System.out.println(list.size()); + + for (int i = 0; i < list.size(); i++) { + Object object = list.get(i); + System.out.println(object); + } + System.out.println("LinkedList 测试 --结束"); + } + +} diff --git a/group08/121027265/README.md b/group08/121027265/README.md new file mode 100644 index 0000000000..488916d101 --- /dev/null +++ b/group08/121027265/README.md @@ -0,0 +1,3 @@ +# 是标题 +* aaa +* bbb diff --git a/group08/1226637491/2_26/ArrayList.java b/group08/1226637491/2_26/ArrayList.java new file mode 100644 index 0000000000..1d4aaf7bc4 --- /dev/null +++ b/group08/1226637491/2_26/ArrayList.java @@ -0,0 +1,95 @@ +interface MyIterator{ + public boolean hasNext(); + public Object next(); + +} + + +public class ArrayList { +/* public static void main(String[] d){ + ArrayList p = new ArrayList(); + p.add("asd");p.add("123");p.add("123");p.add("234");p.add("456"); + p.remove(1); + p.add(1, 345); + MyIterator it = p.iterator(); + while(it.hasNext()){ + System.out.println(it.next().toString()); + } + } +*/ + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + if(size >= elementData.length){//鳤 + Object[] tem = new Object[elementData.length*2]; + for(int i=0;i= elementData.length){ + Object[] tem = new Object[elementData.length*2]; + for(int i=0;i=size){ + throw new IndexOutOfBoundsException(); + } + for(int i = index; i < size; i++){ + elementData[i-1] = elementData[i]; + } + size--; + return elementData[index]; + } + + public int size(){ + return size; + + } + + + class MMIt implements MyIterator{ + int loc = 0; + + public boolean hasNext() { + if(loc>=size) + return false; + else + return true; + } + + + public Object next() { + ++loc; + return elementData[loc-1]; + } + + } + + + public MyIterator iterator(){ + return new MMIt(); + } + +} \ No newline at end of file diff --git a/group08/1226637491/2_26/LinkedList.java b/group08/1226637491/2_26/LinkedList.java new file mode 100644 index 0000000000..4534272573 --- /dev/null +++ b/group08/1226637491/2_26/LinkedList.java @@ -0,0 +1,127 @@ + + +public class LinkedList { + + private Node head = new Node(); + private int size = 0; + + public void add(Object o){ + Node tem = new Node(); + tem.data = o; + tem.next = null; + Node temp = head; + int i = 0; + while(isize+1) + throw new IndexOutOfBoundsException(); + Node tem = new Node(); + tem.data = o; + tem.next = null; + ++size; + Node temp = head; + int i = 0; + while(isize+1) + throw new IndexOutOfBoundsException(); + --size; + Node temp = head; + int i = 0; + while(iindex; i++) { + elementData[i] = elementData[i - 1]; + } + elementData[index] = o; + } + + public Object get(int index){ + return elementData[index]; + } + + public Object removeLast() { + return elementData[size--]; + } + + public Object remove(int index){ + Object temp = elementData[index]; + for (int i = index; i < size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + size -= 1; + return temp; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new myIterator(this); + } + +} diff --git a/group08/125980622/first_hw/BinaryTreeNode.java b/group08/125980622/first_hw/BinaryTreeNode.java new file mode 100644 index 0000000000..0de773afd1 --- /dev/null +++ b/group08/125980622/first_hw/BinaryTreeNode.java @@ -0,0 +1,52 @@ +import com.sun.xml.internal.bind.v2.runtime.AttributeAccessor; + +public class BinaryTreeNode { + + private int data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public int getData() { + return data; + } + public void setData(int data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(int o){ + BinaryTreeNode returnNode = null; + if (data < o) { + if (right == null) { + right = new BinaryTreeNode(o, null, null); + returnNode = right; + } else { + returnNode = right.insert(o); + } + } else if (data > o) { + if (left == null) { + returnNode = left = new BinaryTreeNode(o, null, null); + } else { + returnNode = left.insert(o); + } + } + return returnNode; + } + + BinaryTreeNode (int initData, BinaryTreeNode initLeft, BinaryTreeNode initRight) { + data = initData; + left = initLeft; + right = initRight; + } +} diff --git a/group08/125980622/first_hw/Iterator.java b/group08/125980622/first_hw/Iterator.java new file mode 100644 index 0000000000..57b7ad9d11 --- /dev/null +++ b/group08/125980622/first_hw/Iterator.java @@ -0,0 +1,4 @@ +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group08/125980622/first_hw/LinkedList.java b/group08/125980622/first_hw/LinkedList.java new file mode 100644 index 0000000000..f5477064bb --- /dev/null +++ b/group08/125980622/first_hw/LinkedList.java @@ -0,0 +1,90 @@ +public class LinkedList implements List { + + private Node head; + private int size = 0; + + public void add(Object o){ + if (head == null) { + head = new Node(o); + } else { + Node pointer = head.next; + while (pointer.next != null) { + pointer = pointer.next; + } + pointer.next = new Node(o); + } + size++; + } + public void add(int index , Object o){ + Node pointer = head; + for (int i = 0; i < index - 1; i++) { + pointer = pointer.next; + } + Node nNode = new Node(o, pointer.next); + pointer.next = nNode; + size++; + } + public Object get(int index){ + Node pointer = head; + for (int i= 0; i < index; i++) { + pointer = pointer.next; + } + return pointer; + } + public Object remove(int index){ + Node pointer = head; + for (int i = 0; i < index - 1; i++) { + pointer = pointer.next; + } + Node temp = pointer.next; + pointer.next = temp.next; + size--; + return temp; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + head = new Node(o, head); + } + public void addLast(Object o){ + Node pointer = head; + while (pointer.next != null) { + pointer = pointer.next; + } + pointer.next = new Node(o); + } + public Object removeFirst(){ + Node temp = head; + head = head.next; + return temp; + } + public Object removeLast(){ + Node pointer = head; + while (pointer.next.next != null) { + pointer = pointer.next; + } + Node temp = pointer.next; + pointer.next = null; + return temp; + } + public myIterator iterator(){ + return new myIterator(this); + } + + + private static class Node{ + Object data; + Node next; + Node (Object o, Node n) { + data = o; + next = n; + } + Node (Object o) { + data = o; + next = null; + } + } +} diff --git a/group08/125980622/first_hw/List.java b/group08/125980622/first_hw/List.java new file mode 100644 index 0000000000..4f7bcc71a8 --- /dev/null +++ b/group08/125980622/first_hw/List.java @@ -0,0 +1,7 @@ +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group08/125980622/first_hw/Queue.java b/group08/125980622/first_hw/Queue.java new file mode 100644 index 0000000000..f176f2a256 --- /dev/null +++ b/group08/125980622/first_hw/Queue.java @@ -0,0 +1,21 @@ + +public class Queue { + + LinkedList queueList = new LinkedList(); + + public void enQueue(Object o){ + queueList.addLast(o); + } + + public Object deQueue(){ + return queueList.removeFirst(); + } + + public boolean isEmpty(){ + return queueList.size() <= 0; + } + + public int size(){ + return queueList.size(); + } +} diff --git a/group08/125980622/first_hw/Stack.java b/group08/125980622/first_hw/Stack.java new file mode 100644 index 0000000000..e3c15480b8 --- /dev/null +++ b/group08/125980622/first_hw/Stack.java @@ -0,0 +1,24 @@ +public class Stack { + private ArrayList elementData = new ArrayList(); + + private int size = 0; + + public void push(Object o){ + elementData.add(o); + size++; + } + + public Object pop(){ + return elementData.remove(size); + } + + public Object peek(){ + return elementData.get(size); + } + public boolean isEmpty(){ + return size <= 0; + } + public int size(){ + return size; + } +} diff --git a/group08/125980622/first_hw/myIterator.java b/group08/125980622/first_hw/myIterator.java new file mode 100644 index 0000000000..0a2f9bb13d --- /dev/null +++ b/group08/125980622/first_hw/myIterator.java @@ -0,0 +1,37 @@ +import java.util.Objects; + +/** + * Created by Yusen Meng on 25/02/2017. + */ +public class myIterator implements Iterator { + int index = 0; + ArrayList _array = null; + LinkedList _list = null; + myIterator (LinkedList theList) { + _list = theList; + } + myIterator (ArrayList theArray) { + _array = theArray; + } + public boolean hasNext() { + boolean result; + if (_array != null) { + result = index < _array.size(); + } else { + result = index < _list.size(); + } + return result; + } + + public Object next() { + Object returnValue; + if (_array != null) { + returnValue = _array.get(index); + index++; + } else { + returnValue = _list.get(index); + index++; + } + return returnValue; + } +} diff --git a/group08/1277959541/1277959541 b/group08/1277959541/1277959541 new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group08/1277959541/1277959541 @@ -0,0 +1 @@ + diff --git a/group08/1287324781/1287324781 b/group08/1287324781/1287324781 new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group08/1287324781/1287324781 @@ -0,0 +1 @@ + diff --git a/group08/1425809544/02-26/com/xuyangyang/util/BinaryTree.java b/group08/1425809544/02-26/com/xuyangyang/util/BinaryTree.java new file mode 100644 index 0000000000..2e566de023 --- /dev/null +++ b/group08/1425809544/02-26/com/xuyangyang/util/BinaryTree.java @@ -0,0 +1,65 @@ +/** + * Created by 呢喃 on 2017/2/26. + */ +public class BinaryTree { + + + private Node root; + + private static class Node { + Node left; + Node right; + int data; + + Node(int newData){ + left = null; + right = null; + data = newData; + } + } + + public BinaryTree(){ + root = null; + } + + +public void insert(int data){ + root = insert( root,data); +} + +private Node insert(Node node,int data){ + + if (node == null){ + node = new Node(data); + } + else { + if (data<= node.data){ + node.left = insert(node.left,data); + }else { + node.right = insert(node.right,data); + } + } + return node; +} + + public void bulidTree(int[] data){ + for (int i= 0;i index; i--) { + elementData[i] = elementData[i - 1]; + } + elementData[2] = o; + size++; + + } + + @Override + public Object get(int index) { + + if (index < 0 || index >= size()) { + throw new ArrayIndexOutOfBoundsException(); + } + + return elementData[index]; + + } + + @Override + public Object remove(int index) { + + if (index < 0 || index >= size()) { + throw new ArrayIndexOutOfBoundsException(); + } + Object value = elementData[index]; + for (int i = index; i < size() - 1; i++) { + elementData[i] = elementData[i + 1]; + } + return value; + + } + + @Override + public int size() { + // TODO Auto-generated method stub + return size; + } + + /** + * + * + * @Author xuyangyang + * @Describe + * @date 2017220 + * @param newCapacity + */ + public void ensureCapacity(int newCapacity) { + if (newCapacity < size) { + return; + } + Object[] old = elementData;// + + elementData = new Object[newCapacity];// µ + + for (int i = 0; i < old.length; i++) { + elementData[i] = old[i]; + } + + } + + private class InnerIterator implements MyIterator { + + private int current = 0; + + public boolean hasNext() { + return current < size(); + } + + @Override + public Object next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + return elementData[current++]; + } + + public void remove() { + MyArrayList.this.remove(--current); + } + + } + +} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyIterator.java b/group08/1425809544/02-26/com/xuyangyang/util/MyIterator.java new file mode 100644 index 0000000000..1b83f8988d --- /dev/null +++ b/group08/1425809544/02-26/com/xuyangyang/util/MyIterator.java @@ -0,0 +1,8 @@ +package com; + +public interface MyIterator { + + public boolean hasNext(); + public Object next(); + +} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyLinkedList.java b/group08/1425809544/02-26/com/xuyangyang/util/MyLinkedList.java new file mode 100644 index 0000000000..3d84ecd268 --- /dev/null +++ b/group08/1425809544/02-26/com/xuyangyang/util/MyLinkedList.java @@ -0,0 +1,277 @@ +package com; + +import java.util.NoSuchElementException; + +public class MyLinkedList implements MyList { + + int size = 0; + Node first; + Node last; + + private static class Node { + Object item; + Node next;// ָһڵ + Node prev;// ָһڵ + + Node(Node prev, Object element, Node next) { + this.item = element; + this.next = next; + this.prev = prev; + } + } + + public boolean add(Object o) { + linkLast(o); + return true; + + } + + /** + * Ԫزָ± + * + * @Author xuyangyang + * @Describe + * @date 2017221 + * @param index + * @param o + */ + public void add(int index, Object o) { + checkPositionIndex(index); + if (index == size) { + linkLast(0); + } else { + LinkBefore(o, node(index)); + } + + } + + public void addFirst(Object o) { + linkFirst(o); + } + + public void addLast(Object o) { + linkLast(o); + } + + private void linkFirst(Object o) { + final Node f = first; + final Node newNode = new Node(null, o, f); + first = newNode; + if (first == null) { + first = newNode; + } else { + f.prev = newNode; + } + size++; + + } + + void LinkBefore(Object o, Node succ) { + final Node pred = succ.prev; + final Node newNode = new Node(pred, o, succ);// Ȱ½ڵǰָ븳ֵ + succ.prev = newNode;// Ѳĺһڵǰָָ½ڵ + if (pred == null) { + first = newNode;// ڵǰָΪ,Ϊͷָ + } else { + pred.next = newNode;// ǰһڵĺָָ½ڵ; + } + size++; + } + + /** + * ָ뷵ؽڵϢ + * + * @Author xuyangyang + * @Describe + * @date 2017221 + * @param index + * @return + */ + Node node(int index) { + + if (index < (size >> 1)) {// ڵǰ벿, + Node x = first;// ͷָx; + for (int i = 0; i < index; i++) + // ǰ벿ֽڵ, + x = x.next;// Ѱindexǰһڵ,nextָ + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) + x = x.prev; + return x; + } + } + + /** + * + * + * @Author xuyangyang + * @Describe + * @date 2017221 + * @param o + */ + private void linkLast(Object o) { + final Node l = last; + final Node newNode = new Node(l, o, null); + last = newNode; + if (last == null) { + first = newNode; + } else { + l.next = newNode; + } + size++; + + } + + public Object get(int index) { + checkElementIndex(index); + return node(index).item; + + } + + /** + * ԪǼ + * + * @Author xuyangyang + * @Describe + * @date 2017221 + * @param index + */ + private void checkElementIndex(int index) { + if (index >= 0 && index < size) { + + } else { + throw new IndexOutOfBoundsException(); + } + + } + + /** + * Ԫʱָ + * + * @Author xuyangyang + * @Describe + * @date 2017221 + * @param index + */ + private void checkPositionIndex(int index) { + if (index >= 0 && index <= size) + throw new IndexOutOfBoundsException(); + } + + public boolean reomve(Object o) { + + if (o == null) { + for (Node x = first; x != null; x = x.next) { + if (x.item == null) { + unlink(x); + return true; + } + } + + } else { + for (Node x = first; x != null; x = x.next) { + if (o.equals(x.item)) { + unlink(x); + return true; + } + } + + } + + return false; + + } + + @Override + public Object remove(int index) { + checkElementIndex(index); + return unlink(node(index)); + + } + + private Object unlink(Node x) { + + final Object element = x.item; + final Node next = x.next; + final Node prev = x.prev; + + if (prev == null) { + first = next; + } else { + prev.next = next; + x.prev = null; + } + + if (next == null) { + last = prev; + } else { + next.prev = prev; + x.next = null; + } + + x.item = null; + size--; + return element; + + } + + public Object removeFirst() { + + final Node f = first; + if (f == null) { + throw new NoSuchElementException(); + } + + return unlinkFirst(f); + + } + + private Object unlinkFirst(Node f) { + + final Object element = f.item; + final Node next = f.next; + f.item = null; + f.next = null; + first = next; + if (next == null) { + last = null; + } else { + next.prev = null; + } + size--; + + return element; + } + + public Object removeLast() { + Node l = last; + if (l == null) { + throw new NoSuchElementException(); + } + return unLinkLast(l); + } + + private Object unLinkLast(Node l) { + final Object element = l.item; + final Node prev = l.prev; + last = prev; + l.item = null; + l.prev = null; + if (prev == null) { + first = null; + } else { + prev.next = null; + } + size--; + + return element; + } + + public int size() { + + return size; + } + +} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyList.java b/group08/1425809544/02-26/com/xuyangyang/util/MyList.java new file mode 100644 index 0000000000..8a2c653c8b --- /dev/null +++ b/group08/1425809544/02-26/com/xuyangyang/util/MyList.java @@ -0,0 +1,14 @@ +package com; + +public interface MyList { + + public boolean add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public int size(); + + public Object remove(int index); +} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyQueueArray.java b/group08/1425809544/02-26/com/xuyangyang/util/MyQueueArray.java new file mode 100644 index 0000000000..248edbce26 --- /dev/null +++ b/group08/1425809544/02-26/com/xuyangyang/util/MyQueueArray.java @@ -0,0 +1,107 @@ +package com; + +import java.util.Arrays; + +/** + * ʵֶ + * + * @Author xuyangyang + * @Describe + * @date 2017223 + */ +public class MyQueueArray { + + private int size;// С + private int head;// ͷ + private Object[] elementData;// Ŷе + private int initCapacity = 10;// ʼ + + /** + * ʼ10 + * + * @Author xuyangyang + * @Describe + * @date 2017223 + */ + public MyQueueArray() { + elementData = new Object[initCapacity]; + } + + /** + * ȡдС + * + * @Author xuyangyang + * @Describe + * @date 2017223 + * @return + */ + public int size() { + return size; + } + + /** + * + * + * @Author xuyangyang + * @Describe + * @date 2017223 + * @param o + */ + public void enQueue(Object o) { + if (size + 1 > elementData.length) { + int oldLength = elementData.length; + int newLength = oldLength + oldLength >> 1; + elementData = Arrays.copyOf(elementData, newLength); + } + elementData[size++] = o; + } + + /** + * + * + * @Author xuyangyang + * @Describe + * @date 2017223 + * @return + */ + public Object deQueue() { + if (size == 0) { + throw new NullPointerException(); + } + Object obj = elementData[head]; + elementData[head] = 0; + head++; + size--; + return obj; + } + + /** + * + * + * @Author xuyangyang + * @Describe + * @date 2017223 + * @param args + */ + public static void main(String[] args) { + MyQueueArray myQueue = new MyQueueArray(); + MyQueueLinked myQueueLinked = new MyQueueLinked(); + myQueue.enQueue("1"); + myQueue.enQueue("2"); + myQueue.enQueue("3"); + myQueue.enQueue("4"); + myQueue.enQueue("5"); + myQueue.enQueue("6"); + System.out.println(myQueue.size); + + System.out.println(myQueue.deQueue()); + System.out.println(myQueue.size); + + System.out.println(myQueue.deQueue()); + System.out.println(myQueue.size); + + System.out.println(myQueue.size); + + } + +} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyQueueLinked.java b/group08/1425809544/02-26/com/xuyangyang/util/MyQueueLinked.java new file mode 100644 index 0000000000..5b4f443975 --- /dev/null +++ b/group08/1425809544/02-26/com/xuyangyang/util/MyQueueLinked.java @@ -0,0 +1,139 @@ +package com; + +/** + * ʵֶ--- + * + * @Author xuyangyang + * @Describe + * @date 2017223 + */ +public class MyQueueLinked { + + private Node head; + + private Node tail; + // еij + private int size; + + /** + * ضеij + * + * @Author xuyangyang + * @Describe + * @date 2017223 + * @return + */ + public int size() { + return size; + } + + /** + * + * + * @Author xuyangyang + * @Describe + * @date 2017223 + */ + public void enQueue(Object obj) { + + // Ϊ + if (head == null) { + head = new Node(obj, null); + tail = head; + size++; + } else { + Node oldNode = tail; + Node newNode = new Node(obj, null); + tail.next = newNode; + tail = newNode; + size++; + } + + } + + /** + * + * + * @Author xuyangyang + * @Describe + * @date 2017223 + * @return + */ + public Object deQueue() { + + if (head == null) { + throw new NullPointerException(); + } + Object oldNode = head.element; + head = head.next; + size--; + return oldNode; + } + + /** + * ȡɾ + * + * @Author xuyangyang + * @Describe + * @date 2017223 + * @return + */ + public Object peek() { + if (head == null) { + throw new NullPointerException(); + } + return head.element; + } + + /** + * ڵ + * + * @Author xuyangyang + * @Describe + * @date 2017223 + */ + private class Node { + private Object element; + private Node next; + + public Node() { + + } + + public Node(Object element, Node next) { + this.element = element; + this.next = next; + } + + } + + /** + * + * + * @Author xuyangyang + * @Describe + * @date 2017223 + * @param args + */ + public static void main(String[] args) { + MyQueueLinked myQueueLinked = new MyQueueLinked(); + myQueueLinked.enQueue("1"); + myQueueLinked.enQueue("2"); + myQueueLinked.enQueue("3"); + myQueueLinked.enQueue("4"); + myQueueLinked.enQueue("5"); + myQueueLinked.enQueue("6"); + System.out.println(myQueueLinked.size); + + System.out.println(myQueueLinked.deQueue()); + System.out.println(myQueueLinked.size); + + System.out.println(myQueueLinked.deQueue()); + System.out.println(myQueueLinked.size); + + System.out.println(myQueueLinked.peek()); + System.out.println(myQueueLinked.size); + + } + +} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/MyStack.java b/group08/1425809544/02-26/com/xuyangyang/util/MyStack.java new file mode 100644 index 0000000000..9c0a9a6149 --- /dev/null +++ b/group08/1425809544/02-26/com/xuyangyang/util/MyStack.java @@ -0,0 +1,95 @@ +package com; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EmptyStackException; + +public class MyStack { + + private ArrayList elementDataArrayList = new ArrayList<>(); + + private Object[] elementData; + private int elementCount; + private int size; + + public MyStack() { + this.elementData = new Object[10]; + + } + + public Object push(Object o) { + addElement(o); + return o; + + } + + public void addElement(Object o) { + ensureCapacity(elementCount + 1); + elementData[elementCount++] = o; + } + + private void ensureCapacity(int minCapacity) { + if (minCapacity - elementData.length > 0) { + grow(minCapacity); + } + + } + + private void grow(int minCapacity) { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + (oldCapacity >> 1); + if (newCapacity - minCapacity < 0) { + newCapacity = minCapacity; + } + elementData = Arrays.copyOf(elementData, newCapacity); + + } + + public synchronized Object pop() { + Object o; + int len = size(); + o = peek(); + removeElement(len - 1); + + return o; + + } + + private void removeElement(int index) { + + if (index >= elementCount) { + throw new ArrayIndexOutOfBoundsException(); + } else if (index < 0) { + throw new ArrayIndexOutOfBoundsException(); + } + int j = elementCount - index - 1; + if (j > 0) { + System.arraycopy(elementData, index + 1, elementData, index, j); + } + elementCount--; + elementData[elementCount] = null; + } + + private Object peek() { + + int len = size(); + if (len == 0) { + throw new EmptyStackException(); + } + return elementAt(len - 1); + + } + + private Object elementAt(int index) { + if (index > +elementCount) { + throw new ArrayIndexOutOfBoundsException(); + } + return elementData[index]; + } + + private int size() { + // TODO Auto-generated method stub + return elementCount; + } + +} diff --git a/group08/1425809544/02-26/com/xuyangyang/util/Test.java b/group08/1425809544/02-26/com/xuyangyang/util/Test.java new file mode 100644 index 0000000000..0fc81acb8e --- /dev/null +++ b/group08/1425809544/02-26/com/xuyangyang/util/Test.java @@ -0,0 +1,29 @@ +package com; + +import java.util.ArrayList; + +public class Test { + + public static void main(String[] args) { + + ArrayList items = new ArrayList<>(); + items.add("1"); + items.add("2"); + items.add("3"); + items.add("4"); + items.add("5"); + items.add("6"); + items.add("7"); + items.add("8"); + items.add("9"); + items.add("10"); + items.add("11"); + items.add("12"); + + + + + + } + +} diff --git "a/group08/1425809544/02-26/cpu \345\206\205\345\255\230 \347\241\254\347\233\230 \345\222\214\346\214\207\344\273\244\347\232\204\345\205\263\347\263\273.txt" "b/group08/1425809544/02-26/cpu \345\206\205\345\255\230 \347\241\254\347\233\230 \345\222\214\346\214\207\344\273\244\347\232\204\345\205\263\347\263\273.txt" new file mode 100644 index 0000000000..036bb225b0 --- /dev/null +++ "b/group08/1425809544/02-26/cpu \345\206\205\345\255\230 \347\241\254\347\233\230 \345\222\214\346\214\207\344\273\244\347\232\204\345\205\263\347\263\273.txt" @@ -0,0 +1,16 @@ + + +CPU 相当于大脑,是由PC(程序计数器),运算器,控制器,寄存器三大部分组成; + 1.cpu从内存读取指令,有pc指定位置,放入指令寄存器; + 2,根据读取到的指令,由运算器执行加减命令, + + 1.程序在cpu,内存和硬盘运行的速度依次递减,由快到慢,同样的他们价格成本由高到底;存储容量也是由大到小; + + 2,cpu和内存中的数据断电后就会消失,硬盘不会消失,所以要把需要长期使用的程序放在硬盘中,程序是由指令组成的, + 当开机后,先加载需要的数据从硬盘中读取放到内存中,有cpu从内存中读取指令,要执行的指令和执行后的结果放入cpu的 + 寄存器中;就相当于原料进机器之前排队一样,把半成品也要在这里放一下,再进去加工,它只是一个临时中转站(寄存器); + + 3.CPU从内存中取出指令,放入指令寄存器,并对指令译码操作控制器,操作指令,指令在cpu中暂存在寄存器中; + 但是,cpu不能直接操作硬盘,所以需要内存,要把硬盘中的数据先加载到内存;内存相当于中转站,内存的速度决定电脑程序运行的速度; + + 有的网络文章形象比喻:“CPU是工厂,硬盘是大仓库,内存是正规中转中心 \ No newline at end of file diff --git "a/group08/1425809544/02-26/\346\226\207\347\253\240\351\223\276\346\216\245-java\351\233\206\345\220\210 \345\256\271\345\231\250 \347\256\200\345\215\225\346\246\202\350\277\260" "b/group08/1425809544/02-26/\346\226\207\347\253\240\351\223\276\346\216\245-java\351\233\206\345\220\210 \345\256\271\345\231\250 \347\256\200\345\215\225\346\246\202\350\277\260" new file mode 100644 index 0000000000..ff19095823 --- /dev/null +++ "b/group08/1425809544/02-26/\346\226\207\347\253\240\351\223\276\346\216\245-java\351\233\206\345\220\210 \345\256\271\345\231\250 \347\256\200\345\215\225\346\246\202\350\277\260" @@ -0,0 +1 @@ +http://m.blog.csdn.net/article/details?id=56674070 diff --git a/group08/1425809544/1425809544.md b/group08/1425809544/1425809544.md new file mode 100644 index 0000000000..61de0edff4 --- /dev/null +++ b/group08/1425809544/1425809544.md @@ -0,0 +1 @@ +测试 \ No newline at end of file diff --git a/group08/1509102580/2.27/ArrayList.java b/group08/1509102580/2.27/ArrayList.java new file mode 100644 index 0000000000..33f344e24e --- /dev/null +++ b/group08/1509102580/2.27/ArrayList.java @@ -0,0 +1,103 @@ +package com.zzk.coding2017.zuoye_1; + + +public class ArrayList implements List { + + private int size = 0; + private int length = 100; + private Object[] elementData = new Object[length]; + + public void add(Object o){ + if(sizesize-1){ + return ; + }else{ + if(sizesize-1){ + return null; + }else{ + return elementData[index]; + } + } + + public Object remove(int index){ + if(index<0||index>size-1){ + return null; + }else{ + Object result = elementData[index]; + if(index+1==size){//即index是最后一个元素 + elementData[index] = null; + size--; + return result; + }else{ + System.arraycopy(elementData, index+1, elementData, index, size-1-index); + size--; + return result; + } + } + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new Iterator() { + int current = 0; + @Override + public Object next() { + // TODO Auto-generated method stub + if(current + + + + + diff --git a/group08/283677872/2-26/.gitignore b/group08/283677872/2-26/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group08/283677872/2-26/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group08/283677872/2-26/.project b/group08/283677872/2-26/.project new file mode 100644 index 0000000000..60cb1d1b6e --- /dev/null +++ b/group08/283677872/2-26/.project @@ -0,0 +1,17 @@ + + + 2-26 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git "a/group08/283677872/2-26/CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\345\205\263\347\263\273.docx" "b/group08/283677872/2-26/CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\345\205\263\347\263\273.docx" new file mode 100644 index 0000000000000000000000000000000000000000..c5a97b818945a2e47c96589f6259cd2196ae1c83 GIT binary patch literal 865923 zcmeFX^Or6`*CklCZCg*dZr!qN+qP}nwr$d?=+2ty?|6hm7uZbwMVarlCpbij4zIY^Kb5%(L>6x=*wr1=QvmYAL&*E% zjM2XjM2o>ZJAM4vCf+2&{r~r14=0)uUvq9_NR{Ql7L$Na5e$JlU1*`nI^eyldiFAnrc+TiF6K zi_{s5Pw7!2&>ZJE8WfOcvZ%P~-p{FDe0S`mGT+6pYQYYh>gaFM=kA|o=^sBx{r(08 zlK+2Tm>>bC?fz$B%KktU_6NgyjwaSl0EYiu|2KC37Y6MAF!kuf4M|V|xX^3x9fL6+ zjtv-+g|%(*0ymO#(BO;Rm@)~1WnSo~TVl(v?wstE3?u6t5?r5f}!u_UD0Ww|^QUl`NtzmpN@V~_@RYYc`o z))FI*F_zSibU4l2C8vIRdXRvC@PMFz-RvBV0sjps#&$+7Ha{-!Kfdn& z0uAtw!}}TizjoamMaoO`o`Q6(_9Z92vNa1Cd?5Y;KtMYI533sAanZYDxg4TnMqDVC@ zT5l8x8a|v8CNLbDzXC}KhXzbv8|-ql%+p78#$$Mc(BdJI6tG8Z0+n9?T8f3wf`bGy z2owl01P3lK1eUKH4h@e^GV%v%9r4|aUl!f^xBnO&5F6~?HESd-7=<|(1}oJNmJsq% zZS}?~FG64S_~qdSw}3Wj zgCJnQz%y^a6b4Yu2S7S@s9kv^g#Q!M3UaedHvf@T=)O= z7^9>`^i?=OK#fm8K*&Ff{J+rfKjPp*N6TqLG}U*f@)MDY_folrR2vG#SR^x%j+#p) zw|e#V11PaFjQNLiU*4Td!Bt zN$d|MBHtB&qJ$1>4YYOQ^rrouy-4`|WynsdEsidA>TSzS=0g@5tjv%gSL$RoD&+T@ z$4eR(np|j>{85@W4F}ODmnOuQ@3!vy?pBaHLoR!^)G^eb!Lj58d^3k5TF~3NIyqg= z`l#Q7O%Gd+TQL=GW>PJ5$QWpVkg@q*D8ufTgvRrp4$B^u9w-)piNJ!erc$I&7ucgBL$h%t3d*a!tLff3>! zz%T6C8%1htx#D{pV}E4mHp!2q8`l}`+-m)u?9R69o?$|ZFJqQ{$}Fvlqb?m$_v7iy z^KoW2rL(RQkvF+5)oQZNLC3dKY5T3GEu3aiT4amX_n&?iO&AQnCfmQ{LGU zjcRu+>3YPdTlGT;!wgV0R*e;=phs(lteJ?po=(xb^?B@WLu}IZF|;{0b@@jCZg99= z*V)!HD1LNga$ojt4%U3e*Ny8>`~lFVIf0&2C`hL%iNsVafbM5Q)93_~W?)86xjCSF zF(b_oZ`z+)a_~Ja7Ex-tyQPj~mj#C`$bNEIM!Wpz zykys-$C{?AM!;t_>-|`K_r{Q0&D*s({)~;Pl+(3MfLZbNN8{aoL)&w^m-xHePe|p; zF4JmfDb=sM$9rwOT;1tEqa!2(aHdclP4;}v_rpH-6U{p9A6LNB@2xbx@oQ|gyLGMPTXCgytVIa#U z{$40EXw0UAIVH=5h34deRj}fHlke`J6TgTUD#PTZJ_~tuHf#-l7iK@ZZHi4reI05? zX;OKBh*=%nuUOo!n8}_b%v*IbQ%WiU;mz}oEh)g*e~;NYEsw2`J`ZKc29zQ)1_=H( z$OZ_qy<(|3e9ZE~s^LGUcG@$;!_C(M!-UciC6K_njsHc{!ix8g>Mlr3p^aiQd0KT0A=G7lXnPqQkfbd?zxjK*I4ycu&_m|pK zVsCvB*c_NYh+(~ItE~AjMRGXCVQ^tYqGe5WcN^?*;;jTt9{LzKMF3)p=PDqZDnV|f z>{e_{znwdyi!DW3Rvim*SXrY**M4)nG)7rrtk{6disUtJAfV5KBCT1M{lPg@*T`QQ z;onU}qtr(;gjusFM)^HQtqp@em0C~O0jGN+C>;Dd^x17g?{8U{DFCdY6vfc zwd`valdd9S#J=Dd=#9)ZIseG{v8iH+Aw#Gg2w(+EAB*j3w^*n&%Sl}PzYcuc`5yNi z+FQ-vheu~>M{08EDbLGlhc#w%F_U(6tF8nYwDoanS^ZT8+LPcb=AAMfF&zA@T6(@! z6&BksHq$M4p=KL{-jDMbyO5KAKCVPesyxq3J((*oQ!^VpF2RjA}aW((Q;9-6#z2v~oJr*0;FWCJ>@3ZXCj zhEw+;_cW|uQk#oJQ?b^Jn82vvH#wL9tjfd%zG;?8bquksl6A~dd(77EA>`}Ockiw* zM@ms$ltEylHXXBI8!%@`qx{TwU50&UlEca_5%-?Nv7AEk<@P?U~% zLl>J*htir@%mNYJzbh5a2*!;l3WdMSZuB^>2oruYH?=P=F_%0KjU*ty2c3CD9|{E4z$P5nyL>SCeDfz z!L$cts6eW42_+SFWStEc!voAP>%4exX*Jw8~x8)EC>^l6jMwq;$;o}h*J zS;4d~S{V(an}oWswA|N+Au|}>+b%CEco#J7FaMypHLC;{RQ_s6AuW_)(9N-a#mZiN zDUw+cIXfCtWk0l&Gd^HiDEYlo^SWXYyI3V#@^H6Uj$H1{Oi5`t**ErvARNufX0hvG zPFpufYFN!$Tp3|DlxJ{tEl2i{(4!ZBZ<%KVAR>Yt5M_-YMv6S%*3@0W2ku&*b?&6V z%#0D*uO3h53?6WvWP(jqi)a~9PPX5_|F$PC9gySW+}=YMh4Ua>i==evBdKIIEYUe% zK;B8%W_V;OV&SRkKr=&@`oNNC$jTGs3pjyFFWruM+0KzWzb5H9)5&cLc0CL`B*K}?B)2*ci)z0QaR`5DfMgn zZ^4WrlXJWbn|M=kdS};ZghJTb8QxX5e$>=lEigVU$9F^kL1p@-bcVk_-SQ4~0zV_& z8PZiMkscOdnP98-`E+>I-5Wq+A?|Q^X8HO#IFZBAM=SB7>!;9tAN6|FBC{q=NO>>` zomQ$wg8Xq)<4-EkqutQ1bo;OS6TYgf;HIZ?xYc)=}FUZS2ie zn$yyNj#seEb--!THGMoU9+5cVHS<^JH@DY_nQ!L?zj0@(ON`iX?nj*Rx;U!bP{q>P zJ$AP^+*zxP=h5;Ywc6_~#w zhzo&B=byf@5?(Y0m&iJzmnDfK#eDCxND7(+thf^u^5mKN#MxMLpx832=GuAUiA^`U zRVu6BV72oQraQ4z8%|ZE9Z?ta{E7~4ziA2mukaLP5&k^(O|B-jBk?pk`ZTq^C3o=b zEeFpBX*<3Mmp|Tbykk_@_~g1cIc&k{8OK5slOBWw+uQo(w9h)7j#!d43H1=(TJm^; zR9`aiR$tN$`pC>{dc2}pI@$a~e|0ZrWC~}+aS_Gl#2*`Ja`=U~{M9oDNHp)ZDtdI>CrVZA)2pmBM8(A;~>oQ3((NIH? z7*Ca;k6L1Qlq_vTm}50m?M1YeoWOu|k|gZ*8>(qaCm2TS1gH-*qD%U|tfiPe$mPh2 zxrLnL;G*-CfM_p#{L_S9O} zs`U1<2`=`7@_8Nq^>|(SxDk3Bp}0q^=EkyQWuuSXLTue;AzOP-W}jr?=n*D8BQJEP zbU3f>A+T(g2+M?y}!`7 zDv$@Ki{^+3gL(v|RDjO$C0tn*I{IB&^puiwiW`JUMr1D#VasgqO;Fw(t9>?f)JJq4 z9n4iEyCc9cZ(LG3)guKpTNwpC4yyC+A1^M9oCc=17CyFs{eT8%WKGd2)EEyaU9!D$ zlkAZ{oB^UU6G6LN6DjV~VNKORH1pL`)unfoGMKt|i{6*6-TC8~%-ZPqh>jA@ywaxZ z>m@1*-UI9IakqLzfVrI90@?tH_`@ zHXez|oS+&~a{umfbSjz1q1dvBVFOi+JmF=@l}Z=xNcU2~5)xvPu$8V;rPpKT?xTDW z39OSa7-pr)-I*k03=T<3&1RylatUII{=ilwJIs zEkJYNmj`;^?~lUTh%8rkW3Y=0iqUCUh9ET5OEYizplLB{kn1^=Z-OLS9HH`;+I8|B zHW8)5&4?{Y-rzx+gGe*Hu42}u2cgL^JRAaI0Y)r1>HxzBV5eBpe@H5f8S!%idH#85LKA-HD!GS3F#`#M~kN(PlzT9p%a4_5Zibh4m+{Px+V{ zSDB2MWE|BMj_cbZVtlT!ZT-HuY?P)djGAh`>pcF}))uSP^zgdOi;AN?k7~)O+e4@1 zw0`E8-rz&ZdwmyiI&EohZuGjQygz~gDe)HB{Ufl)O}^n%W@WYTY=9>9 znrGD&)0B0Nd{b?zr95GoWqyfe3c5od>dk+pXgKgKvbU1)=A_4l{h2+7yy=hj$-e_i*CTBpX70+e5qE7y8&^9TG&jrxSYC>G2GANwO$j zpu@}L)8uuKZ7EzVht0hb6uiW?d}X?A3X*kMx1kMV_}Xiv_I>(qeN^D4-_l!_6Clhdt_&9TDesf+xe|IMY|^99J@;D{FAQ!GN*;kNMQWeTwH2Td+D ze>eHG@3`juO1`qsH`)sA5(;9N(kfQA#5FLiROFN65hz=PH~qEl41wzBRgM(vet`7_ zpM|&^Xr6pC>yP z#uPxUpPzZ$cS?wXLHyO*#XpoJHT=*Nw{UfJFMeyt`{Ig#;Yg*+vo3zy0@YcteLvT6 z_FT1`xAXeDYzrT5#Wnq}`7r!-q*E!yvn-G^AWlkP+(yLkF^CMl1lhcSoKRv?0ldy5 z^t5OTeHD{n_ykdfL``4tLBiJ{Ur?E!VLp9A=%=B2c4kFs=T@oum-(wm)@%5riE9gS zEbqT4jn()ISuvpj`MU)*93ylf1XV7G`DeA%{MZgOg|L1$0u&KQ)-&3fi=7sLi;*aT z9L?C(Xuem*KbIJUnpK}s7&Jqfl_j1|3qq=J-hdI~tW!o^w=~tN4crHFqI8=j{VE&5 z5>1vm?s{}j!+*AV{jV%XE2-^IMjl>1&wH9CpEfo|X3yK9pXw%uS*A#335v0t*r;W} z5_@rvvu!*T6cPUT&s_5hx^_Gn3m3+%e0Y%T@rbw_xY4hZR`MI`gXI$kR!B5-#NeZ{db_*Ak*CX`$(Y;o|O}08;iaI@yKHM6i zGFucm3?2=bSFV)nT(#9YwxD=CRe#?o4nX7PEDi0C9d(&q?f8a#EBNCoI0wH+Uria3FUN> zqc#Q?>6D#|E8I-MkK?iJuSuG^Kxd|&ZFIB>oC8TJq=w3o_N3SO5%32{RB3DGn2Pu& z>~KP+pdxBW%(x(KW7y>)QFlVXCE?}ckt!G$H^)JoWDHEf$||a63MnflmGz>2(J@X# zw#+ONDCi2LGZ3`5WThdbzOxgl@g)mGu&R19;s|jIT4CexBRA+^p`ss60e3-cMd^dH zbKEICwK!hV5%^;a@=kWiLZB{A*FMeXGj}E29Lt^cMP*Qt^wjdS z2iQ3`Z6RBOxw0JV=G>L##jP(8+YF4<{5FHZVKzFueA?~~6Fm;o?pD}-Sy=z`e(rC& z+n}AIJFZKg?dfMZTBtj`gk;>B9-Xw8$7?K^+jsBEbtv~$Y63tC=g>L+BEqxZjZI9A z#i+G)db+0m8qidS^Lpd{nmX6^!9n#M8gL@qUCwy$)0yrBjd^uH99q^v~fS@|-nN#=#-4W5&!IU0|eTNn@n%k#?JV$;(bHKJXVfE)h?kqea_ zlM*!Mx11E``{$icyt|q=K+SeyCQvVjCo0GFKD`BdmZAcF*d~GQ-I!M(T3G30J}1Co zRwDlC3SmL)VH@&d?&XTrYKGktSf3-XZwA_uBLF3;@^@S(SRXC9fV4F6zo;5n@9NS2 zPRIiOR_)!RurKcvo<)}#ht?A-p+<1ITDT1_MNqPI)=S<6rU7HCo95*i-NkBR3K0l zD{EtG%i=+t!GK+cY=!!N(tFF)jwTki6;YxzW>67P|A;kINh60q-i%ce`vZvs=B@?W z88{=ir(M?e9!P7s$h6b;XrZ(@+{4r+=1^V}bQ@{HPH)Y`Qcgz(Sd`??dD0oW7m*i5 z>JC0vMx1Aha*Yzqe@PZLgqOz@W_wKm(uNHB+-JFTFgUc=sb_>ss@o=0AHQLLG=T5# zVr41YjURzOG9Of#(9aMyH6TAC2t>kwj542Gl7uD!L_$pVS%ia!KcE)Ic}*v^U3Npe z$j-dNAritI7c@1LB|C#7E^fgj-f9I}gWUxwY>(AEJ-&x>c`|Z5kuWROjQx?6Pn{vK zR;F=v)hx3mWlS}b&ATQIHZ|ERuFcBQ0wwh=rNssXjH1eYa0+(WF+#n-d5|tu&Y6eG zWq|I!Rr5ovLeMM#g;v;a})cK`%^jsRJx(UA`NF&d`<_R;Y_ekQd9C-NsWRJnf1E=;zJSn>iYs zr@h*fL=ji(9Rz}_Lk^57Kc^kpSwZDGwRiViBG^fK!8rCD&}P-jzIK1_fp4r}y{QeE z#2>^j^{Ps021UahXS`)&ds%}ykv(OVtMtC^pmYu~T=V&Le?KJbt{)4n4jNm1Zpi!b z!2`eE?tQj(0(N$`ws*Eakuw7%^T#PGx*c~K81Z5#?vt1ffFmcW+Qj`03(W~+PmyT; zF0Pr28ZU&xijvn@?h(d0%qr+5qnpPOk!so|x4=~546p$Z3X1`;<7P?W?3j`Qq4Fo( zr6%nywx>gX$ulZX)nz7`H!GQhFXRtsxE4vohPIob;(Opqk{U4nbXM?1?tgtebN>n2 zDE}D2F0Z%w(>$5?Uu*XNeHOwMn`PJKN4ebr1p-3(zmzRgJ3D7vJ7*K8|46*mi5owv z=8qIkd5JH7WszT53Xfh{qf=LgPe24)AWZ6z45q&03jxEWqQZ7b0mb$8wbPJR<)#82 zQ!g7RE5RKlPQ)6feWoL+o7=X>2Ays8+YH@2A+g)uI7LU7Zlf6J2B*s&n7LUBM>=gg zD_C((?#8u79T%+^jtTG9iAzv2#{7ML3P%P*l{)f%|{hh{<~d#w+6L|Hnq!|FMx%O}p@aZ1gO@-0up@&VljA z9-$~p$dP1Zp7U}KglkCIAtEF%vj}y#IG1tD8Se*>?kwKio^z%6XPwAhQ5RmRf$Xygm4w=JMMZ}7I2EW~CX$>t-Q@f5Zv@(4qtzrHTNP_vf|4$(XDj}1D zz&i&4`cK99dGlWyv5kqbg#p0A#=y*k=@)~&tyzS;tQb5D&VN3Gmk<|L1Oful00IIg zg8I*KK`6c3;GYKANl{D?sCEYL^ydNEUR=Wo2nb>5KNUEI76JFi^|VL`3n;tmUVK8j z>zsP*L|tujc-E1L`x6PE5cO|!hOiW!>NJvbjHgOnWFH(+$jxwa+){I_w%;Z>+0uYj5~vy%)JX2z?5mucXrHJB;hM1I7;O6{-Y*bNTX~1 zqU~N_S~Rs^md2Bz^EAX=eAMBgZ#h9p$fK@;&5J)m_ zJQ^J_jlLXW`1`H3da}HpLx(O?|ME<2>M+D%1vli9T)g5=w`cENq^^DjX~~`FZ0;Am z=a%=?fUf$ND^#X)z0j-T@Ahg532rnMuy~V?i#^=}x~danL;BR)R!DbYp}F{(r!va( zxtzl!f|?LNe+6&fxJ-iJqVI{={l(eY<2JdYXPbimK7kdypJ`>!T5Pc$8wluPEiIAp ze(n;KgVPU-C_1Fp6m!p=vl6NvP)P(yX=ipZc6oO*a)LWu+stHgrGqKm0<@a16|k}@)61w+om_U?xK-Z~ch*Rvav_oe=Q)_n7NnFMg(6Ri5s z@0zP(Ciz@=iphi|t6)=pUEIh><)TQUW(X`|En=VKW5G_s{Z)ZE61?6z2 z{%9Qa9aRd$Gg4|OxGGp=80awZD#=?`5>xHo)dwS_o(?;1^T4D$M-@W^N*!gME_Y%h z>9JZp(xoq)DPYtw3Pq*g3xG=nVMFy2jMFTf#e*nvlhMOP$Z2Sg{5AP!Z6{iWZ}b7s z#7*(aW#x$BiMfFethSH%qdHcx1~OtcVWZ7^#N!r4>Ju3cO1D-uin75>F~{u#C%1i8_&CK;QF0?^gb~WK+Wyt-BG7BCk~&Q@r??FCS?*kbUhU zn8OR<9SYE32T1?XV0%6m{9MV7hr}uFIL_2^c&$^9#|&MfD151f9WE>Y!*!2O%1sVq zrIaL$JtMvKsqp1rBeRT<^odWA&O-t1Con#F9NiS7j*h-VB` z`ymw6udH42i+>8Y9eR7ZSy5|r+51%ZFHJ+T#mdi{^U;+C<&C#&-ug^iOAB?jTrrxiD35k3k zG{O@!3=l4eX?CJs;qCIe5A8jN#J`_T{R(pj<#yHq-QZ7Up28EydY+>_C;r@^p5o!_ zC#W!^UAhJ&F*r)cv&aIbkq)A-RzpZJGvBIZELIgL2Ad?I9#g{d8t}E&vd%IC(dOLw zMDk0BRC)}}BWJ$UuA0*Y^kv}FW@ssD(haHT^2<)#1`u#QbIbg+^9GMpta@dC57hB$9yLa&wRp8PE|5gFmdrJ_Ad^h>&zL)k zxC<*3%gfZ1jO2U!vwx{sdgwL5zJMj$`>pX8rc0!q6}x2P8u#QQofn6+qDtKtd% z_Ujwf-3Rfwv5$~TWv#bZoAHZLvn;5!TA+RWn*tf#P|ma$tKxiX;uY`(ExT1W6t8cW z-MpkM<=HW9%pA;ga{g#Pw7(DM5C~=z4ErWnaGH!3wDrYkz>W8d;X@uFjFWzP-&s?K zLFyOYAD>P)&-L^BQ%Z_Jf;fBhduhfO*l4xa6!ieW@7rOxaO_<&3R?#-BpynNZr|QK zqyCEQ3?FgvqFKVnH?RkuVH>85LiK0l&BaB0dx0j6oUfB8l^62aKFqG0v@W1T3s_gI ztn~DZY`o|9QAmj2S(!NBdxXB;U*0*z3@1BY*C%>khdUf>@K`Mm*W{2yy@8!=ZYO8U zp))hO>+P;JUx2TDz}2>mz%?E&u9byF|H_HII{M3a;>C z-#yRW*Q?9R|B_nQ2t?sh+%2(e*LV0FzXoECj(X&wxR6>i<|>qqYqi^pLOwprSSxyE zjWpshC)`sHH(^g7C+yOcKSYkuYTU*dJsD1cW27=Huq)e;s=X7y=dD%mrCPWw$06k( zlf7;)iDG1(d+Y38I(I(z^1e=cU(>$t{Js#s_xP5Vm*Ei*LI;V9$M*L2=I0e+X>2m5 z4Qa0KW5$mJY^Tl92tr?Pa}yGfWp@#MZ-V&y5H;ORO(BG2q@+f7KBjlN?q|4oc)E$g zPobZ*+CNRIdzewDz8!P(zNNcDLb`m$G0R(#_nRFpWa~V?Qf8+R9jHEz9Wiv8G#=TN zI2vDgwNKP43!p`WnSsK`kA1_pYJDdYynb)QwJCXinnsj+|rWLF<{jT`(%?f`?Z18oIN-5P-$j!~? z37>DI%-HpAn?#dp^`&=h)Gz@mg`j(>AoV5bWM0W2Q55cmKXm``RZiH~own(B4?00M zK*`s43k$|CNRpgx{-Z4{XO9IzB7UvqeF~Ty;#jBq_PRMcZ=OGDKxaRqN0K~?|WnCl}px8S6A24GIIWfQDF-JTVlf)=|v{>Akt zyqsSE^ltC%FD|uC`67t1rdInB+12c zu(1^^=ybYXe!Nbyuxw{$K7MHT+lm9f+;T7~-EaAbcKg=boeYG)K0dm1cXwwyWleAY zl(jYJ_KciI{gGRD?#IVR9v&WQ>I&I1RKG^iq0cS@sv`BoXof%L&=*sJ^kY>38-FrD z@{8byqGm3sV*qBN(W*+Dww-E16SzX0Aa%vCmjbx|;+K%r9d2++PlN zA;)<+nRh*pD_TK8MTdunH8q!*09|Vv8=r%OZb$??b*=VwYbL)h3MB`U1JZi3Vksxp zWuc@O!w*$_Ato+OG`ossT*U6k$*;XSCV+5Gf=9t$Ps9kNrSvjAAV4y>_v=b=1k7?$ z1^0>k%N%7MUbp+LrO==aubbQRPUk8F=4OMDn5-;J? zA+#L8=rZsUeU(I#T-dQZ@jyf5GYDbhN6n@}DhPgzJ4$#W;}8NkqSwqKJqHb>*F< zrHO4^EG%&unPaTdvNFHV^Ijd@hRV9Sx>sE%UEQ7^2y8gMS`j<4i0o$!V-4IHC8wyB zhfxr}@25?0-^;~fjuf&hm%Q6jfCNcpljsX68O{U`(K~l?a+uBzfj0J#?4U?=d`nEf z(I-yW?5JR`pDC$3J_>Ru~&x{lmy7?h83DjP}di@Ck`11-@8ZTCr8_c0oRT1nv*jZ!XX4 zZJV=;v!Nu&5>bl7W~9x#2NpS*S!uAKFSEQ)6nuPa{Oul}sAbcL8MbbUOX7RgX+!3N zJfu{GT%e7V;DNWJekoY_zc4!!9 zFMmr`j`bQT3bgNvhl~h|p`c2@J(^*)9qWVZwZ>?vQeqmT z1UpdSk;cg%jjrfTg6CQ6{)UC?CLHH+k+?SgStHK(EMc{R-E;=5Ww_g&);C|>a_x1L zASJtR`LuZ!(R8Zi+GzliGh`eq`+aHcq~YYUftFjBqTiEeGMm*(Uc0`JCdWR*M5<*6 z9BCrVpX>hOb<4Bj66PQ5hG)4p^Q;KNiid@NQGp3-9=*__MHObQR=&o(0h>6oKE@rg zKrqcZQ-uQNvJ-LxhVK@Jtvp^s{61C!*-p5~obc)5kHAx+LPu85%jn{ril0|2y-i$C#yk>hi%;N!hS| z0e?{0f1UboE3auZ9}uaMZrNxQM_iGWEGt+7p4%Rw*M(8C=!sW~Ww-h?&Lm$}`L26FcT3R1M8$sS^m3lhvWb^y39|a87OeyUz`iZX=KPZJuI|+BjJ7vB^H33LD+xY ziNO(ITIgKfz7LF-naf>_vi!dQlC2^wTFO6Jq;C1Cjb=|rJCaFsZ~^fJWIuAht8R~W zT0*XhRwp|EVD@jsvW%s>sQWy_EZ6U>f|4F%^kM2Hm&Xgm36-*B2#*F9IhMpkLe;qe zdmopGlyuA5(b(9y6YnV+t#dqoc6!|N=yY^`#+BwsP{l4AlxIS>d;d`U^)78ofQ{Pru2<=yO z5tS4FOz}6XWvD)&Yom~bC3mq5;Qjq>r+@!C!r|N2;aPIQ5`^jdv%j{O&GHJq^L@R% z^z~6~xxe&#-%bKdcUN5@0{fx3BTzZm(7}!^8nF5j4B0|{lj834y8lV=;AR<(#pm*T zpn4+c<+Fc0Q<3HH$Nw`~AQbj>+56e{eYNum_`d$W|90P>3pjK?A*@Bz`>^C>xd8`g z&(QhA&Wh*D+-!CT`48N>nkpibc zZv~kFeUcp3e{Wjqd@l7qtG+Ah>w%WRAR%%EwV%7Jc6xMrAGLZP2Ven2gPz=z^kN^J zvJ;pxeoUafH$TbL1Oj7L%mw37MFo^>WOa4*#f5a%G!&)RAA*A4d)IZfwc9;5QYtDc zwzjp^Z}t!MbHDHq#=|u^ez88;yVr)DFJty*@`1vxi@VJKidAN38s#Y-NJX;y;if{+ zj6J`H;=r%#D}HHGG%zDrBG_Da-AQmQuHdqD5m#5|H3~SR!GD%E1Y3Oiz;$O%mG%Aqv2%1 z+*Kqajr8@&NC!X1DJkV4dmlWh%J$V!UCXZaAoU3Ly;^O5X(#*&04 ze-b4jd}}MKnz~Mic--u#So{r5t&McKDQ>^#%Wqy*R%Jy+&G)3@739{q$@)pD) z??hUytwX7X*zIQ+I=RSq`IvA8O(o56EwSTnZwbwsHJ!IXTKUlo$gh-{(gf=S?;B4a zs>7+?F(}C;HAX5tq5E3$wfG~i+fW|^(&cUb-XS|=P8)W|fDy(qAR}r9hSXtyVPSFF>1yM9fQ&YygNp{%|C)#RYKR`X>O^RUz0pmp5MM2Br_9a{ZURV zE3lL$tOU@mUk+P&%{1w_Nfqp&H+xuko?4g6Dnjv-Ik;djlTi$_3Weu%pyWbz*g2h{PygtB(%M zXM3YFGu-GUs@SxW8Uz~~M?r7+uwzG81TXp&b+nVya+3ZzcN9|rYIdK(B3l-hU}L`P z{JxJ#9IBn247L*QXQSeJXZH7CGP{tv3b8`qG?WYGP>JzweMbgqiFBY33XE+N^`Ju; zzF?M)jTs}Le!{(%lTbML<>-oCd_$b$g7;>fMyIIMh6UL&au$~9Jw`k}Ukret1vL|* zY1OiETZZk9EzFCMR@-u5I9nDzkpUAQ=ynGpC_5nv1ptXMJBgi%$?@Iwe#6f1W-m-^ z4oc7KvSm7}DtkuxhuZAYh=Yn2Awhz2nvuw_^Ve6okKdePCQ|*&v828@)JLv;{n?hj zEBt+cPtH*mT1=}{HY|N@QG zMUo^qEciE0mO!+R?qbx9AW?fnQ|d=fz4I-f#ggc)030U)4jCj=L=K)Ge=wPaPNtWN zr9`YDN?UX%29`k0SjnppvH&5;g0R=_y;s45fbo3-A^^aK6=99+0i<%`0KQ5;_?9?5nzH9U#7#sqJ!7q+r{`*Olg_YkMOigkMp~ZK^m7Eh z&6a~Xcp1GaXzylk@OrDqr?b+sd(Bz_Yuh_#ujw%4>@?A1f#j0b)G1?ov@IJYp2Gim zJaR~KcDWfRci`E+S-25|4KiV1R7TXiyX)LNXlyJ5gMmWRfE7pDT_Q!=>mJq(s8gEX zz~rQFZI@vK%h0u1a?Rp6n2nSb$Fn0 zSh;u}u{X2Y(aIE;&@5|(zbo%07$CVTeV~O%V^ZS{iufs=6&5y%EJETB*126`8)LJr zPRjJrP&YBTEh_W|#!rYIOte!<_^}&9Di&)9F3911H%_U*Bf*iKm38V^G61C@YPVT_ zOqGg;S=O<2$Cxw^SIMb%4at_Tjos1WA!}$Ps42+*5$!N9&{HOnabBnj^nD0MNUzWf(Y#SR$bGnOUAfcgXlZHv@WYRf z9Ql|7^2#eOkn-ZkKYkPN8sh2hJ=+17;lQ%nY$Erdbg2VVR767wvcdN;b+i5keu~Yt z)o0INICJh?dS+(%nu?CDEL#nEXDkYOOsT7=Dbkha0)M6NaR#vDnzWe z*n3hyn#2p`EvIRoQS(9>xDEzhtry8#ns4|Mv|bKUlo_Ge(IPmD=Vf(KI1A@@@8Ni1 zBt~(FJpqbrMajUAq=<;_`E{ENS~n z?i_KBq1OjzH9zXfR5tLE^Ak6>EY=CEK9;Nu5)fFAJ zi_IF6{3O{)oaoWGXJt-J$i&0ya>2ei^^cc06iQ9kxu-Dh2T~*PM0OoKU6T0+n4XqSP3=Rbc>JZh=W0>_fCx!~HI;PGcn8(gUfHPX7SzO3Gmvb_o@-7; zBpQHYNClLc{X{a$g?M2k=$6d8b7WiAO3D1Cl%bSh<#AT`>3QK?<}YCV_vwXdMLEfX zRrTD}Y**ohYB|?n`Yd_jl5YP8<%Jdtj8Gu9~sCgkYPHrt~(O4az$TUed}ZZ1Xyi2!;)> z*1eMUVG3_0h|;I$g*v#ml%kW1Ocw;#3hF3IYK!_35Phj=8pT^UH5LhzAOsPyxJk!S za=4m`OPn@hZS6Ob6)%kcC4zNRQ&>p+av{woDc#4t^YRf$ zzEHv2$&P>d`b>DC@(xW}p&qiyyo4J1aEc3xqx=?*9H!KTPRf1XYtH0Cv_k2a`d6B& zr}|4Zqgs*|#%vmsqe%)Ddc~4@;WB52#}-m~lcO*uDXrBMk0M*pbSV{iMpr;%(C&kj zIZWJ|X8q;&dyyxl4v1S*BKS;R@kJx@A(YG);^IH$bq^u<{FAt_u}el^cIt9{JfGjV zk?N%Wi2L(<%P*j1!N1M%`xo#!$wl3JU0=A#!Ym^=1sH zL0xPntP6y6_C!PSE|f3f*`LRjK*>U7B+rwO6Xgs#TtO*HV3A9agBG%!cs+5QR0em* zO^K9OiT-F>?bVhF=lJ1Lb9W_y%aQ<}2b@@q$HnX=wCp7l$KYy~o8XM#!jnJa z@Iz_4uW8{8OEjzKcIsiyLBLAz47mlTQ^Twrq}pLPK2b?PY0N}ocllT9))ey&tAhnH zKD{A!RQwgnoQpUWYG2H|lm!x2h=i3&9an2H#jTp8x5HuJ##(#3l#px#== zFsA*}!bNJt_Y-DxatjW-L+Ojx=aoOR%Pi*j>r5(}dr+6~g{UHWl%~WF6V(vaJ6Y*D zw$FeBU%KxV!LUdx#VFv9BBn~Zl`B>Kj)+@uaV+yRz^ z)T*|!YMLK49|%%VaM=z4rxt-(^1bR=(;S+56q-}4X`|*zZKPhJiLhR$tVKMcS)PBb z@tUK_nN*r3oGPqk2V!J{jAn`*a^I-Yu@o0c^9miEBY|z%Q&NR<9w9o=6 zYq1cNatKvcK^ses!}#_j9v^{7emfD0@&`F*ru^A%j3vY&VYrvSq(-1-i~%}Z z`~eUQBA`fIawxz28HOQ$P!CN4!blh}cwsC~5hXB?Mi_&~=aJw-RLe=8F#4-Zpz^(h zb&Y>-N`U2f%wmXh1A+8RK!`1dBv}&iukt(yUKXDRrRTznlMvt3uVACfqk!+Cv?gX! zYUi`FPiyi*oIA_sh296@g%EN1T9PMeJ`j2kUg-GLyijv!@Iqx2$|g~NcxYZ2ObYSI zC0>XZDt%CRAyEgKywI|2UMLP%;)uxkndK{F6T4PQBh3GgKVi}0g$pf^vK9}`3zfBa zXkMtygXXHKzl0YC7w3iksBVgQ8gDcpAcgUDlT+j*_BRpf_nRwYpvNLq$P<_3m5Kk* zxRk4TNnRKVC}4r42osGFRS*|#G?Qm)@+N|TVgg%AKRenHr@yefr;kZ7e?t^4aOz@h_1p z6}IPa#Q6aRRmG-i(TAz&Cby|H6{5Vc*8D3hM`Y|sTxu+jq6sJv96Fn%ekDd%RFzg6`- zSwLL<3Q_${8idVYv?qr4i_r@~k0}bALW|YPih4^x{+4;kX%^&5(8L7U4QpWzG#`*N znJn|tV<)*ZqySQo$(WM8Z^drGBt?-UM%t=-FL-|SRYYzpvY4ANCF*aTEa%E zQ1Atj)=^cS=%nB*LPO*(D7^4Kr9tVST5(jA2F0?+V}#8nj&4#Pn&X~izeu^`MdlPO zQoCeKh0+-b*q=~4v|^{!^BPXrLV3HQBSsSOXX+=_yil!rCWk3@XL467^Po4z4R>m@ zr`mv=v~UU=X?&tYFmz%ql1+)Iuf#zQ`UT^Yt|fV4l8dW2y4p*v@T55`KVi?|OJz#c z98|r6upimz%FvYW)i!FSG@bet>KRiTZ`D?JWfc^OO1%%&+*CcQ%Iqm7DTm3Bo`_14 zx7ept3)S7w)C(y(%^lzQiFH%US?U%<_}lU>2?85`RIQ{dYVKUHd$N{qQV+&dwY+!n z6q(!RKP%-DiMK%(`}q&d+3l(alH^D=3eCRIx*~ASp%qHhw(5a7M>Vmo>Z#UB$uKA9 zr!qMzNo-EP)RKl~Ys%9CtDF#U)wIG8jiCRKZH{w6f=2my^=c;Hx4;4^YoVThwRuCc zW9kPKVOTxA%ias(!DXi*K_~&w9X0C=R-N7kfuC<9#a}o)6B?W#1lv5LS3HKQ{)l?- z_rDPvX)q8Y7@Sm==p0FYVfeI_@bIU^kE<%6N^~G$BVAInT>ez5^+L5~$?25?@}wYi z4H}ii=}Jv3|BcIhQt|*MA}spA?Xh?5iVq!6JNb3~{OBbW$8PPw@kt`0>g z)*QIH59+WD&4(2;??Q8!?78ZRC5O4t1It{ghkndy)aQ}{_OrXxZp(m{CLyx8Ez049 zf}2=G2YhpR7fZbODyy57Hr@TBhAL_2Y0~O|mo!@QE_Jg|{>2|KBzy-vrVx`QN1<+0 z{R+(8i_8wRhD0Ej(NwG=H_EKm6g}l~_t? zdNp~WBFFNQ#pLz5ybzJ={!T4}7bg3F%%P=$C)-r;Sqt;RE6KO_Q*lgf=4C6z(oFG(2JQlpr|3stXB`LZ4QM}(Lg19d7)_Z#o>RSa`~3?b9iClvhgX) zX>dti7|*`Fa9e_CCRQ;mk(+SIR|ioq7S&PI%}N5;{ZFGDkl$sQ*JL6Gruunxvm*cU zyi5InO^X*UIf^+uP4x;O!He`9rO>u)UZ~lJg<6<>AYPbQR`ons{lbQ)KuP6M_<`!o zqu~oJkg^t<%etHeb$x1Hxcqs57n@GExA}C+D6BOnPkwD@a}9vu!RL(qO;2IV6ghB?;e5AO-cS+Jm zP>a5hE{sP{e%PqE! z4W**1L42nY5XELk>lGEa!IWq!D~dUAPC8>?lLC|_uH|Qqky^Na_c56fts`bi#KH^n zdP1v1E0?B0Tp})$ZZjT|x*0Wyfd#{#z`2LN2T1EXA}8Ptiy+e@8;h75jwW z&3ZyMi;)*9=TkA|t4E>s1AT_3Z+UvyHq=WU&~~ zn*pBs0#U0aISMi9qB&7;3^R$(LoQ#As?O{bxqRhqH8T@(IynNk$@SEMpj|`|v;mvQ z?WbeQb9i~9@Z!(}81tykX3|?YTGGX$h&1BT>E;K*TOxrq{0ST*8#MxuP6|yXX{Vf4 zm<(B*%YD=L<%ZN=xEQv!+tpILD<_fTTo=Sfv9f6cloy39kf$HPDLBACO&KEDcW( zB{L1h3CCPcL7Fh<(>)F{e}d-FCcjeK_2rl#QKE;AOO;_njy!MJZZ-G=^qCxNaowDQ z1#lQ5=l3&*hG0EPCFSYq)e*hGNkg9RHZ1< z2`b_U1EawZk`fHrSUeJ*f{0cr=%QpEvOCgwkJNO%jGkQo;z$7T=_bl8K#p_s?(ld?7%r&)Qqeu`cn3X(gMPC^64 zMrC1{UUq_5HM1F-#7jBLVhAEU9R|P*1K(M$DPB3b_kCEtjWibH*@#sSlLHqM_ZJ%f z9W|Rcm?FMV6hNK!>!y8d6}$<;n=ft-SvX>|=>6V6cW1}c_^4-kdTM-pbZD@rv(q;- z>m8o32mI|#_a??BMB3RzO}nVaKhW3Tey^jrAYT+>5fxu_R7VI$f+WA>b~>!Ak0`Si z5u}!L&AWWFvlq@@8txxRPf2(1he(L}8f;ydoi~E?66F~SrD`aK8w$IPhSvIfZS_rg zSvi8Ev&jTm1=$L_)CIy}=j5zD6dvsA4&WCapA30C{;8RQ{EX>wPrx%3^7+EP*|DLq z%v5W@FR~7@FU>3-`9MPLA?;U$8_CvCjw+t*XVy8AcwIUm=rR`PFimg1kwT%58`#g1<_) z2t7>%WF$&PDzzh}t>v4wAbBBLiGV&sG#Ex85sOP=OR4^kax?qf9AEtW6ey6geMz^8 zr4}Yw^=;I#Wbt*8$HhH5FgVcFZPuG9Pi{7tWY334hYro0w}KpBr5uk)TfV#%T=Fpy zB8ChnxsFWXsEp@y7<5)dJ*^AcB&=7WaxS#gKn&;T*u>SVx7=F$~9UU06JDrdz zvq3*O<>~C`p?(7U5kP_fC`tPPml7lr7_u)E8ttC|l+I@o+)0}@#tnC2-bKz_RyGji z1cm(p7lmr40+B$(X(jVx%w~vL_2RaOe7LblKuXXWL8vt_2O+Po{a%aJY_(fWQaQC) zXM1ORTYGv|CRGDPf2A^bToj>qTa5mh(A20W)owIIj3#;?j!X>AL;~RyJ7WauXD~(e z^35RF=YzeYy~L6FG?c`Y=s@>aQ$uTBW>$tvP=si} zOIK-`8!E;|H31_GumcS#HiOe>up7WX@?f*EsQ1oV)TL|4Qq7V1STL=aiz-ksibCtTa$oe4mTh6l&)+-`Q+9jPu` zC=lfj923A$0AK>M5j&fk(;A5|3Nr!+$3DP;603+D~yfKqm0NbfYqW+%OUUHx{eBN}GQMchu?_~@)>+H1Ag zEqViT40p&Ub{9wZZo?gpbE?A;4MtLJ76$>mu?WK%Z%R-Lv-~ao6FX<7?mGG3#`ePm+c}qoQH2G}8;e9@2AJfRl z@#&YgRA@3vCOwx*`m#yZE*iGV+3yesX#w8z6&mp3Z(`l#Fa9`g5 z|E8q4ksKuC%l*6oU~Q1NS4rZG7oU_%Pzsq%hW4m$4VzWVFMb7BF)O5uQMNQ7KMH@)!n>v;lkC*%JS@N`|$9%FA#A#&EYWW zSM*_wzl5G?;b8IEiKGWLoZaYmaHuLfzKbh+0b(N?8Ovk3Odup zi#Nu{DN8iW-9#&09Y}y~H-*R{G5V(Fd$Y5i{QMm9y$=sh`nix!h7n(nV-G+bBdN`XQxX`5Ib@F!pRe7a|&~Up#YUtXbs1n!(l@s86An8 zI(6>Gja!*nC247PY*#}=({KFbXM;ln`T51@D{3oCPgj4)AB9$&IC^6B%2oZn!$GeP zM*d&^>c64VRjw&lww!SK1a)`sw%66&T(@qm)v7ywyzbbsi&vTV>-F3>Z#JGjeIY9= zGe19@myV2jx_XBC`bRoCdd{4^{NDSY^z`(mXQXAMrh}%jVdNr*1Bw_&kZ}88XlQ7d zIY>)!fytYi!LWw_gS<*Ikl@txOeo+(O=nsJ@sRYwYu9f7@CR=O{Kmq<6ugrtSXZy! zynOizg}BjH$H)C6GyMi$WVI39?eoX_ddJ7dW@l!+6Jwsq2_JV`Ye)Ufp(7t&z1`Rf zv9LQ*P<4A9^Gly>;LGZV=P2wMoLG=z>j|X zv$po0tJiK_xX{qtG<5CS9o|(`lqGChk{lgbHbiTgM0kFFJMliQ*r{VeN> zx^?;7wc)WL`4PL_PTekx*$6{wxZW^2I?CQiA~ zdge>ndAWX%@9go@9W8CCc8Ako>22%CbftdpAAjcYWAPLZ>z!6_IJl;2-M&ZnPE7|g zGF&j+ZQHgzacF-e8vgsg{{i}6R#w)oUAta*ZeMrL__5<>*zQutLYM%8Nr>Cc{ zU%$R@-@c;4w9zsD@(Txk`lV90Aan>V9=xPiB@zi7J$e+Q#H(L^*`!xRrzBc;rLm^E z>1j+)1{hLY^pPzVbFX=Lsn2YPC?Amci3xO_tLf?KMMb%2)13DCd3i)hBT_(6Lc_u_ zR&h!#pO9w%s0w-ZtiG1 zvzISlcIix|r3G*%>d?|Rc@AQxNM>%jIKo+(>8U9`zn|Imcsx!=Rx}!XNMc6Xlv_iYwe_t(y5c@&!4-(U`t9$E?v3=Q~b~W`9CAEWn^S* z-n{w1fdi>-%I@0H!>EEpY0rX!6gi(cZkOrlnN6EF=I6Sx1*r4gv^KVI>Ro1Qs?9Mm zIDGo_=`CAoEfuBICakJjE7|Ac3(1S5!!F87xZM<*H%v`U(FclP%TF+(c%*wQhg_V*7fP!zafc6KW5u$lT>JJN z$Vf@|g(Ho(TYmoY_q`rUyrn2;YDtv0GuvrtnVh&36l$Y>e8Nw7?%?2HBG08TcTY@A zvPlXG3UYJY>gWl08yjzYe7rC>kMKE=lGmnZSzD^t9A$e`?fhve(_b(Q+?ZyQR`*U$(dNVGr6ef48(=h;k#v-AB{X zEEi8*3{B4r_V!JWPmB!>qg-Pn?P~4l>F(|6>vgB4R&J;w9Y^2b$hGS?#+pZZJ9`Ft zdi4=&-PQWAKU9$8`pFw_7UbrlKGR5dd&kDL8}hSVqkWU-PMkitci)zp>K)9E$<skvk8 z*3EbZF`O}L2%|nSxK@YzgGPGw~|Br+lguA%jU zOBOmb!V!=S+zCt_w4SX4zp+@*5k-YkHX^es;f(Nu=yNiJ;do}o4`1+lsq%&8FJ`v~ zq5fWP*kLo;h518=SqA%z!(u>G_s@o0Zlm-QO#C62OZaYu703{=TQSPh8BzHD+`01z z7Bw5!ns*w z=0ci=++c6886*Axs4FYSj1yRppNZiN`=~J9iAv6bKJYK6`exnjd(B-1`Nepjg~S{d zK12SB#xy+@L;$A-j@PS4rp85q*CbKf7eZD*C1MXlkKjY4rKS8Q6q$<;au}$? zVO_Pl1XGpYAD;CDPoKW{_~TDlEw)dNezao6%C4^NmX;Rk%0d?5E>qK!Pd>3f&28-) z7}rN<8*aD2$cpkZQd|z3$v84JIXX1FcFnppw<8oF@ed9HaW4Eme{bL5;lm#=C$B#L zY<^A(p_}{nZ`-$T?|}p2-o1C%rrJ#_SCrW8Hdftgu{fMAm}Pq#{CMNeom=T^pdc>=Lz^WETRnR0ls;-L`Gl@nff7dhxYaUU_{* zMLx3lH@@)=j5M$i78P;4zi+g@z7eJZE&(vRE@nZ6YHe%Tw{M%vVICRtOSubU)CI&O z0x6iC^mwLbCP&B62rJ4~?ccq<{%#8!kDjWeqqk4mBsx7Be^-5g@yUyptqo~n9=Rtxvi+Ulv3DV{mQfH>Ditc z&%gio|DT&T8}8g`uDfyT`0-Qw_wBSh9C8R&dwcuX*jQy{rOjq9FJD_xQO-@V?y|B~ zH8s_Rg*gxh3}!yB|J`>#z`FC*-~3IND-C|Vaz!Ebt=ih!M;>_u){7j#hl=$pT`srT zjACfK*U~pV?fLreeSQDItxr6)vM2-%m)ot5q zd_He`d-t9_+f!&3FNP7@HQu(^@aQ;-?#-Jmt5>bW6Fo5=1$FV#OOI5oEiEW0sje=V zozYEBja9Bgo5W3wDIpRwex_LJMH!&b2n8TgSVtegMv9OwsEZyQdFpOm{i8cs^ldAO zOFh#w<0GRRtJeR;mq@;r=+IYZJwEN zrwakm&1@mQ;RUeR^|`qvo2&DR^7Hz-hO^Vt5ALfi$u|^c8}oB5E6Y;z^X(O7nfV2o zk+3=DBhQ}k&YdQ>+Lfyf>}kZVlCtuVkukR8g$s3eo7#|Wii^vv4vWkSg;b*_iXUUt zEd<_u`*vfH0VS&rorE-7tv3F}ZX68ykPNU?+bQy4Wy-|;(@@ZgV?*Kyj&lOxN#H5 ze7ex|?9_xIYINHz@H)0~L&F_x&*|x@Mx%9h7Fr$ChrA*GjKdO(hLC&pDGuYztc*88 z5sATirS}SE#;AF@5CDanL3qePOi0LE6D%L`8iTyBy$G(44UhCI2n5Iu9(~Lw<$^J~ z$Zuvf7G&D9^GdU_vVFb~bUej@$=(}|a5xdkeHrQYsj1nkm+Pk{eZm-SHwOd8tSsg# zIz1KUm|`D;#1qzt<&!dvR!ekvbVQtYQ56=38W%iqfJ{xypsCc>*1-Ff!}4hh!Y)(n zlpe!t#4X!M&4?OwQ7=5@3-LncFg3-#az)XG^%Wa8RCIL@q6+-!pZxy8{ab4{Rc+h4 zamV&eJGa-=Zm!D7%VjUwE%sn2+HmXc(9rmkPwrT`B9j~#DJdyix2{L6L~eWLnP*_A z2M_LFv!=A8YxLN$6Yqa;3^vKM^mPyQwfFUO4mLG3-l=bh1;fpa_pV;NR(c|QBICSVx*c<5U9xg7v(ot<5O_qRXl?CeBo`{a|8qodyPij{A@b$D!S7$fA>>kYSW-^OrQ zP?%5m#>b~my??Z?yQkr1{XlPDBpB-L>gG(HyKx1@2yOE0xy$vpntc8!h2}du2Y>RD z4{)HMz4iBFtYZ63p^L*C@3nN-*WbO@(s}bH=F>IEZeBkXU0@8hj7%r~6wb(+iqe@` z>H+(Dd&mFykAAnNW^-m{KGML3jT=+bs8EQ3*MSKHIflVkR+Q&vxe@WX3-YrIi}JEE zA$S(2-R=wdZ{E6nyW#GOFTS#(#0^TwGvljVQ^tN?vt|`EhZ0W}6>F-h$}BGIuvX4s zIAZAQ9YOLwcwikyGyJf!ZuR`tue^NCM@Np| zyLXRo82;_sP3;}sr7H@Z4%6_+%;EPw6gG*To)IQum`NU@>U&*X1H2i6Ha0cGPo}25 zc{#4`-XRR9t!|9ZJp%Bs~=a^BBXc?T04vqUjGeih(;GPNIPH_Yd~;3}Ttg$<8JxkU8Qj#v;3> zJa0t-fS!V~LVt*ysshsJw8XAoynFQU2mg8X9@)gQKs#_8O|iPk!>|=FOX)d*+2TkYkS zpSp9W^YG!rS*huvDUlB%Cp#x2BYhY)J~jsb_FD~y4jrssSMNg9c!;+c1XLR99zZXLSyA-@4a=*^O~w0@|>l3Z4xYgvoh4 zVH~aq7R;4w^2*G#pFVw+THeeI!=aq_&Ye3}tjI@N?CR>ja-|OQ4l~0`SFI|#eWUK_ zr@xe)o$}5*N06y^@2VXcoyNIKgDeEfJ+kxOJzLJ6yLRl8i?h?wHEY&9`|QEIT<49t z_Qu=oCZ#o;N-~E=BUi6Bj0_KV_cw0ezJ1fCnv@idUwm0DhS=oj#DDyc zfBC`-&+Xc^Lt$aQCC$wb!tEA+7MHjm-ABrJX^(+5;MS2N9Xze(zT%kpl&I~F z6Diw6p=sSc_WU3H!PfJ$JsZ+p~T9X1CjV`*u6#4OBPw=bmG6J~Pw(?z_hz{Ra+i>FnymB#3hn!M1wiI-x4{4z;#+4G#9>WW0T+ zosGR`_qM*iDU-nozxcyH{Ed_p6WsQ1{^o~&_(xyP%}@0QNXRaHNnW3yjfw*_7E}Be zV4#3I2tZg`s-tv8K9zpGAUuth?|=WD=_yZ67CvGVMgk@W3AnATjl=lllLyHyD?A(I z1k)Lh9J%=BPu|(Mp~mOsq&wpTEwQ&^hS|()%SNsZYoOu(_`Nrtc;Zp)F5O+-pBz12 zU0uzL?b*FEBQwKpvq0FdT)Fno|Ll)5(w(!O020QXyRGlPbJ$_Avg;my{Bazd997z4 z`?d6Rv9F$c_R0K$5~ss5I5Z5g{n<~Bz4Fp?(gO7yKXLldq5aUPPd@p0bM3~`6$Plj z>(;M~k@#LppAt#*_Om-}3$_GC2wcT|xw+@~3njRR6lDU4IguVm%9tp?%5Jyg@h2X+ zcI-Sb>8;y#?b)+?Vq&0waAfn2o!bxWa;MlQrv2dj940G2^^FH7t@_!B*OX#$XBnav zK&&Azwk@+Bhjss$*N5s9^ab@XP%)s&ipujmv(uiauc@nJ=OeoxIk*Q41yJCO<&5$dBJSV(c+K{`8j$ zSC-7q%o>8m?|tuwm_ZPV<@jw*%lPQz$qzqZm?>t{h2zItZr$RqPrdSNPFb-)E{CH| zsHQg*7@x||&13MK$NLOrCr{KhH{E;UiN~rcD_pMVxBly!S1(@QyL}@Q^|LpQ+f3%) z{o_B($~5-$PM62--`%|VRha2t{rz`O z9XnIC>h+<%0V}q|sx|CUEImQ5XP~>+s@DlXtUt(~tj5^UkB?uxcgvsjk%>S3XMc$1-O8B6o=cOJ$e)-m|J51)m z16976@X3=Gj=p*9YhV3Rmc?Fw@+?yPZ~RZM=jP-%oEDK^O>AdzVe-vSbvca|->eVC zLO?TR`A~}&E{UC)lYDEbm$R#&PS$hn=0I=g z_7Xc2k2RXB%VJttR7gO|k)x-xGSX1#zVn^$z^h~&B)uJ-nn=saPa+ntU%%dLvtZ#x5A%9sB_*Nsbm89uSQH4(5;fJ+=fkrl z!Z7>-wGWGRU^+1vLqX_1NPPjVWI245!(sEvYk;9P< zu(!XzhvN*zqKA`{W1#T^9{+_4SC}YF`UslMcUmVWCZ}e@NdGJWj193HjS?jf*Kb~7 zh6@am%P=)AWKf&kiDWr3fp-RT)ChEm4+x8_*Mwh$od`1vXkL@PYJJ7me(Pls(GUUR zD=55-b>P3ffoVKA7ONGXJgx>mKD>e=VkqFU@It2RrI%i;UcU0r8nyuF?6H< ziI@s+ptYrARoQCK^c2zqE>hvD%+1}qcUM6{#*g1RnU$Hfb!*kswBKo`Xm(-1uS<2g z_?+T2r>EEpb2GNrRtybKG&dFQ*ipNFeaYnXEPUOaY8PH1t#o=zovMfbyOcm5XOJ)+ zDXrYk3uRSCL<9!o6as@GaW?#m&#bF+psRP#XtCdFY&v!J0-N>8C!ciXWX=%YVAZ+O ztR9bu&=vgFXaW2?;h(}c;zcbBds3X~ltqXlM7kaRsD-LIGm)UdX`T#*ItF_=D(Ko= ztnRwn^*+7Vnr_~(z4pYJ)2FUnD5+j;cDXHXXMRzRe=OA5-1+@~{2_8p@rvR}Z!j(0 zY7ZN;GIi};V|SYyU;FK^mTxGUn8k}HnA&gr#;d6C3=2&KLlCq7{GrE%X=QS1)5eXP zf8#4qCNTCuzdb=eK0`bE6o*wf<~CTI0D!|F3vg%=bCaC<{H%g?&#tMhEk@vt1a+CI zS(qBIjQYY}91^d-`liqdon>*>Hb*SGFs4*QQM_HnHBgdETM~utb(ky)#YJBBs0T;<(Uz& zpmwuGn2w1liRZu`f7e1jRYgKLZG4({5!qPUPw1|uSH z2_?WrV2s@s4tO_htlG1)b`~BJ4EOg8@7b|;@AlQxGr_zp+v5jzf9E@I2BrhEqmwfu z`n0 zSP4NRrtxv_8$b9FuCG^Kc`iN024A;YoSQdqTfMrH z4SC?eri+))yKMHNyd1aP-dKO9q@W0{nU$7q#<^Hg9L9z%JSH&?GK%=BlGS#L^YZ2M zlaoP{%}I38=!A!5VfBSgT!iH4@a~?udgbt2?|%Kaeq-&L)ft&7Sl4L{=>TsjYq6@PQ=8>DBy;!zFz1C$6;n#_--MUFTC*d#_BQ@*1WvTmX=Q5h#Uqp z+q9_~DeK0KYa*}+o=s*-ov2Ad0K@puBtOI`?W+y!+`bEBUvtM$f8P+Q+7nOgOHZ=^ z1ZB_`n@E@`#YP!mf$&17Bc-UQIE}mv(#7N;fJ&9l*bJObNQlm00zKe0TVk162*3m# zik&+-IgP9@R8b;916HR!4UG+?5(tEdKRP)YNKLW$Ma-_Tx_Tp+&l`0Og~cU#IjOk+ zi8SNvFx#D-JwN@~M=MvZEL@w>-O=&fb5Dy25zuDr4$ zRd4O;YQ>rC_Xp`STjR^Gzr1(Lrje1E>(}czrPw)FtSCXUvlr!NuUTPpm?6`_sX(d? zldC0}oO@9*aX|l0x+^HKL8!tYQ0-8%nbh2>&2=tdt*(TUR;SwX`9s-~_TB0h5Kp`#x z#Iidq`}S=f92`4(^h{e@Hzb0iSW$sRH-6#jL!$*VjmZ)C5zwBoF_In_@nP`9`1llC z90_{e+G4lcI295EL;j^CoQmpw#FaXo#@Si$I6;I~tT&UB-9tloMChlLZ;+0$(b3g) z>&o~wkmU3at41=Ds?>gA^JuC0ttO+X!PoZ zOE<1w!(N7wyt{jFY>nKGAAQuPx9I-O|MJh-U7%*rRIuKoB<_i@hD@B>zN$WyP*sxjN~YJa}*)+fv#v!k5WkAA9T(juIjQR(Ez$c{zyX zDEs!x)f*g4yaRaF(QgGW4C^}D@C)8%xUw0nAL;@Y(qVe86qd;DRGEl#F6=&Sa1gVCMyzNb^Ru}Hxv&AG(DpA^GN1Z=^b!K`xV)J2gPfK;;-M@Ib&Uo$C zSHAqbI_-ze=Emu;b7%F3?|sNi)6$%Ug=sv{*4ECHPE2e=2-uvnnltPqxGfyR)ipXa z%UrD}!4*<`?b@w_2M<2+!~w!}(z9~+9^9LeX#*2Z7^&D@!YsV(c(u>%2reLws@_L0 z;bO3!!NDP%2XDUl=Gn7nVIh3q*4BFJ)M!d-76#@iDx`#b`_x$Of{^`H|*Z=yD|M-u;{`Iea^PArUF!tNO{oAj+^2*CE zKjU({o_gYu|NNK#=U2Y+3bGq}0yg|-fA+`n-Zhylg7HiS21Ww|<1_Be^wF6qQs<0& zW&oDu=jRO!2!Oza3m35Xb0)z_5zyGsaGR6HfrqMo^wG!X&tE|DlB-@wPA-9z5e^T< zLpXN9lrNaZ=F|6f8`ZA658NN>s`AloT+_0(jj|OZh={xrA$tuVW>0`5~=L^UN zOdf)W=;Tt;!{>I~9=Kta8>i9m$QYOxOwi0&eSPzhBd0ib$B&Ye{Imb=-~F?H^Kbs(pa1hehO)!sM#p9@ zUAln`1O-PYfK{wqnf=mBPqLZW`Nxl6fVi{S*aEOsw(cx(OFkc3-D8hECIUR{qP~w@ z@lJwD0b>R`gNuYw zunL&~(jhp4p@g?OG}?vbw7UwauE(myaNaiHYkrNdKGUdRB* zN#;S?!@8j%P%6z>`|SYq01pY?xdr%2Is3#uW@n|) zGMnoBg=^|SVJIh#((irmM`zAlXliQu_P4+Ht#ADuj?%Sj%NfY~?;l}AaCCGg@}1mi zx^wv5_fMU=z??ks#Gc~fR2VI<09VLZFnS9jsb_}(wG%;7%+ap`FT7tbl(KFLpPW?k zS6ouL8^O$2b9MkiD1sG3Kq~p*gCkEr{d8t={((Hly_Q~}R+vY4hF~=ozOQePeS>2h zw>)2pNCVKdfxzhKBpZ)oCdJc;%-4m5*;%PBWG{%42s~jZ=|l zpZyYBnbQsjWjGi~043t`1-rqKZfd<4W;2 zm>ZIF_2Gxd5sLr#kG~3opgR0J@0>%$L^O4!fH?Jg@Kc(2p+J|6jrnd~yz=^Mk1;Mr z)Yp%A>k<(N=IHU`m*_)fWijK0#*x-$cx);yD+QYm(Y`6d5W;pJ8m?;uX?+Od(Ja{+{rsz!$)sZTw*ab%S33bxD8-7{)*n5P3M0){D~ zcU0s-mKB6ygUl)D;US)P@Sk!n6)8*V62io%JgAbs8y9=!j23ccRH+XlC636xBswG1 zV!1x0QVa{lpFnkl1E=2n?vH=U`ab^n?p^zLl17MNq3hRgqZ|FvAN?L0o)6Hv(a3&b z-UwFVeBoT@4Hlb)6I52Vf?$lHp)Le}q!V<+NaXbur8%#?_HuTX`;DKxCv55@JOK?q zJkIHR@x^Dc1r867vM%&WiYWpV>UidvFBRmaeeVZdyoJWGKSLqdV{BTX+&yL&*SFXED9ff_+jmiL#ZIn$@vuvqrKE@s>#nSJAULS6moQQ8VXFu{^NhV2CX=7spY)SxQY+&f! zkAC##cfRvorjM~PzZ^NN(#QzN4m|e!^Ur+kYcKEKy_;>pgaiX&wp}m`kws+@$%#aO zvR*{&Ny4T`G|Cbht;Uc^@6JhySxRH@j`FnNo3RaZU6%Ng?V;UQ~&YwRoF#W`C8bL6AuQ|(QVt*D{X)=@g0;oekC>-+B=5zde7|4*y+>P zzyE`G5Glyhfj)Zc)?HTIZVwC&46sAwV<{;XLdih?0J?VK#5s#`rZ78NSy{+77#W!` zn_%05EMg1;O@MQSAi2ADyA6g3gJt%;V`mS4a-7)@qry6^u1q4Ylb38m7F@xqZ@JgT zk`V|l_)y|n@(8IPUjDDt&1$wFeJOHai;x)UX}P3M{A;N!Fg{>nZ&Gm+k^IcU3=q%) zFab%0Y*0ZaMB1?;yCzn5HUBq{ukOG7?RP=awi1s|CQ-7+0L3%I3BtrRapEL<1|zZ&!nkW^ zEh2`PUt!7DudRd!ui_at=bAMuI7-hy|9oCv3LZ1|zcdg-AjqK;%%HS1zq)z_#xRD7 zpolYt07O{kp+k@VhyUg*|}g?%YoBB2HpaF)|nix23&fuy1|s7UDYmXh@N;TR5U)m_U)&u3Wu?a}h@V%oC5i{r3Cp z9u^5TpO-%QryF{UB6#M^bt3nB zdk0x&=7&5KIXU?}+||`{>C)vRN6rGvW)ttx@gdwH zsm;s;D=Nx*dq>}T>s`NJPZTk#GcfvFw{Byr;a`Xg(k=lolaryzsi_UsHLye@x$h8a zmw8R@_j6%`g2K9P3SkgQG-@kRYlsALx8#V`J0#3zv@` zJ=@mS138!)8{WNpXL`CDV;$$5U^3otx2@yY>C30i)&aG^v;ypV#v{_RH#Ri1w)U=G zRlIfErvCmBOog{@wI9E7tAA)@*WNwO)N~SjUB7v&q^u}AHyJ*toRHv5=vPULxq+mGapCUz*`;-UlzMsokQ|0(VvTPCai)K!iQFLaZq$b2+1#SaQKA!g_ z7&&v|bj|vW#f3T05355!PKZMV0J(49F7$tqG(Yh&LhxH#+cs5iz!^5wJIsMaSH!EG zk&%P9n1j~RcJHx62Vj^Yy`L`Bbgwfn7YB~(=*OIt;otkc*D+nCrW#vX2Jkx;ugHD( z@CUiMIr(`R*e78vb#=G1(oB&t61w@_O zU=J_6`rO9#YbwfDfgd5_jR=p{w%&JtcDTD6Ve48$!(B{Jk3Nbl4lRjUZJ27!_gcGP z(wl2H5Zq?B7+iKY!TzL+yKvzeN*?MXscZiF@4pK{c>VR)VJh9-10*FdBQYUv8be@c z(SG!LC&1TNUU?b=uRA@htSleWh(b9sI>i7hDhhRaE6&97)x{)_P2U zX3N$c85!9)6yf@Nc5h8_+3M|pR$XK#2+pvIhqzkt|TmX1x^twPE!}(h(_|tRf1SXDTX4 zF(V?frD$&JiT6Kw>+tQdiE*{m0Fja)+`@Fp_fQJdzP65mi235&Jl{ zf+Ax+Qkbx~Lj7T!{6zLEK!u4$f=_Vrk#RyHlNZ)WRDo2hm{j4DlZM=!3?x(RGxVSL zpsFb-mD<`hWo3ETg}}`g7Nml_5ow76!g@)l907C4!dP$#y@D5-MNu#iD52fEYpbi* zkP8@;W=3HKxsb3g(YK8oSF@q9^^H!A=N08_^{<{Y0SQv@~#J$n>&0e|hGLp#>3B^Y!Z zrcN5e++0jCLy~1uMh|g&%UsY%@xyaF0kneutnWqr0H5nM1=)LCV*FX-Nwdz!VwoLEyYz@=+%p|V9 zD>rW3(0mVy8HyC)0q784I`C9!Y0>fH!^|gI2qp(5RgL`H^OqVw_~3&VUwq--ouf?+ z&ENdy?@5LSBRiID3C;cg{ng(hb&)ET*f=Fmq58d~jDhL$Mh=VeJ)0DB1-l5>KJ`%E zdFP}5@?ZW&PL(3Nx@Y`e;sCG)5or7T^G}nJm90HGHU*zRphPc$Pm9wNMg{aDFJ@-g zL@sw}j12im`QTE%_*THTsb7cm<+k)4|TZ9%$6blc(ALG)t(L#T-MG<= z!w(Z8>LwOrOjALV|M$P~yDL|g5G{@RcJ}Ofm{W?~)!Q4WuWv&A0{u}_QEav4a<4V>(Z_bIC@vnbOcCBrxB1i4UwX7K5AR^KzP=5jTvU`N znLuMT)-@POTiT}~Wjj$DsQn_M!7Tw#>cj|c1@va2lVbV;Go@S%#O^>fB(luniH$-M zT}~TTK@ts(O$5fqChj!eK~hOe6V43}3A$$dvGechByetelC7aC6fjtAL;k?cKBqx;KLU0EO%u8j+K{kByIE?D;$o%7eAN zV5~h!%(YsA5bMUqX4&-24dj@3Ne-TZID*l5JfIM#n1%J#MRE(m0II-*h^COMr!3>b zxel*_;+K{Jk&n~h8C}?!;ldfoZpJhrH#6Bg)mq=qX$RU0zFBG8ADR$>RDl4FZc?$J zK_Wj^R^+v|kMhjwvaIn*4g3J~_nF9PW1UYxFgP?c_0ykS>zi))*Z)w6s_aTT@F~^MAGY+vUG1 zEoe@!x&@MKD0SO;SQ;#WMY^;EO_2APveT5R^w==rSV*6k8D@Mw27)IQdoPN6&4vwb zn|<8tk-=YFQck4{FTL~u5|0<}DV(fu@Ls;QzY?)JM&tNd5<;Na< zloT~$Kj`##+FF4TfTR$Ttgn(_dA4kpB}igR+W)ZZk24$N0|Rn_?P zw9Dx{^6|%!X)pFc0iyAEfE~aUo_PE*pGr1F0bq2mKKq0uX1!_n!rZu zdi#eE1u*Kcj=Wk1(lZJ!k^W+H4e+{8KKX>G1>|@n^76H7zyguD`}W;Cd6=i`rHhwxrR8QH`qGoYF~mBC!#{iH9pnjIiAeOAg)d&c0t$&0XHJ+3T4qk*3r`$6 zgvj3B(LoEyQp{mtK_Qg#?D=!ZM(DDzPr8a{4XQ%GK4NryqC~kGamhY{`R9&cx8)qh z;cXv1>52OLxBT~08UJHIExF)g&v0Kg+CGPD}Oo1 z7YZ*_R~1{d<2DD42Wbr*3oAkV2oW=A7O)X!pGlX$v_nM+=9dBiacwHC8cYF6j}*F; ztYXs{P@QOIe8!N1OgFy^vgju;M8qJ6y{xD(va2{c0g{XJLhv9;vzln(&yW}LBE@5HEy!$_*^o?6P@b#Ak~54A-yUgxE2kv@t!`7`e)6?Yc0kun< znZz7a$k-)qmCNUaazPI^f=HzgLMn0nTJS2PnNQ0)mO870^K`fH*+v(V^)X^20%nnSXhI zlDnBR10Cfvhry4>T1rhYGCCqDI&OIiIVuRh%q%c@BsHJ*5$?}3S(%w|T%dXs@S_pQNjwcRmU*Fo2;ih7A>71-3k9Fh4T27X z;&t)MWE}TQkByIKXJ(SiJh{sLkX?jzVTloNCEWj#?vx~jG>dnQ!D74iMuE6{$tHjc z6sDePv%_6-U1`}OApo31pcYWIgnFdPWRKuZ_s}MF!LT&}wNrMNKuhAfBQ>2!o`3~W zd|5F_Dn1M35bDPx$UQ5pa$aH)XGYAlXo($)m+EiG@(+1T%X;DSFOgu_2H% zK;BKy!Zi^(p+6|@sG;~z1w0J~AmI~nbbwDTF32TM5WJ8-(K7uf={X5C;cBZY%b9jI z0Gt+d#_;%h+VeGaet6XHsky zQTl+ylKsO&6)RQ-K!cl1BjdmljWQ{aFNM|p3i84^v4C=SsU!k)UMeFXCe-H-azqi7 z6m>*!ZfSFiJ+DuyK1u2(YGf~0FSOXi!9i@12x7cHF~BnM;!61N<2o6I%CHGa4-06C zGQW|S@DSh(SPtBMc(@H*5IS;bVCwU=6^sv<$lFIfP&G_=klPEZ%atic5k-%P={5b8S$R{iiu0YrZ z*edZf#YUy*aVhRapuYfBabROnJi#(Aq+_B&tSGLncT%KJs+djJkf0<;7j*(fS#JhG zg-9k#*(!Dd%!5G`B3kzN0+Jnq(veAtA1e_37Xt(t0AZ#efhdDbmB|R%2K-bf#&;s& z(GbKPq~X_LIts@eNwXubWyXAz*px5_@nI%VA@q~+Sd65q0EQ-X2C2rW;L5V3&R_Xg zmR3c{Uoq1$ht*7cD37vlSwBW33IRl-D1QXVQ;Cz-lv3W(8-*;)*hJw^U~U2$D?(c& z8BqM0Z#Za-0us&|+o=I56nNkfoVysA;am9_uBXfudBqm(VVL4h|T!vjiC9NhBU+ll*G&LbQO9 znHa%&LD2J3j`#a6rdh^VbIfq9ml| zY90r4-DS5TEX8bq38HKCG#(}EP$L%`@67x|nNZB^z{YC{4pMy&-(8b(FIO6j84 zQq^Q}0o73bD*gZ~DCnwGS5lFpq-~(-v`DU?Qu{_wg~aqKUrMi5%m7*vgL(iW$58wk zMlGwslnhKybU~h6Wr_odnPfohRZ$n3IQJmXK1$=-Jmk5Of@0 zJPO@Jqb2bLM449#c~_WhkbHHvC`y&c8qSj}hv1&zK1C%EDzbCR+Zzv`#Kpq7rF)R{TQp8bgKfoBg zl(2Gy5@`d`vO*q}lchfX>Z7APp#JjVJ}+$}B`j~kM`T`*GK`oVm-(9e=x>rzV%VR5 z31x9H@7J7PXtf}OnZ!d14I)t*)u!ja&16g(NtQXB`yK;u&8BBRsck+KZ;w&*H~Fy1WOROi6x~$4g6hXa zJ)wD*6z(7YHcYul>6+65A-coBVRJoV5ibTx)mGZEFB_~?bXhB-c#T=a2G(<&L=}PiKmA~-5t}47x z{kM4;`degf0k(P)AvEWK#;n{ zx0dpN6kdhcAudTc`E+ai>1R!=g{65R0SGf8-IQ174@RfL{5&Z9`F#meDUr0N(nai}`~kZX`nB?~az2dCcnfly!U`rz8z$!uSJwPj zsO$kc0$Ss*zyp*p9vFcHCoaeD|vRkkDjUAROC^)qp~~ z!Hg!q8ippJrgexq?giM&@`<$^n<%#|sjr_sFPxXfd~q_DWVUnpP(lp)e0U))PgQc) zWDh?*FSO3V7Q|crf)~b5UxHc26o3Us5j=+*`WjQN%APl}chB;t!CI0tbftrJ9?DDE%xC zQ%tXbT%n{f16q2l_PE_i1ZJ`iA(cy7oit8qB57O~nJqP1*8J5%Gq3E!IrE_P^jsWi zeBEtEopXUz{gvW{tfj(Wh3{(7&8>boS(HfRbc+A%bJ7b%;8>!UYN_PY^Fk%*r&wjh zO`rvS`1CrN=G6XL=!J39tAuZYBrMwoxaem3tpB()FQkMaywHQ#UHSd;aE;1CZlXRTXE6KVbeOV2D=``-<$#rq`@`6V}?Pssx|O=0)tYR)=wQ zNGLDyq-=%b7F8M~FEn?;MI}tM%Gp!C746ed)p6GSLZW_;FEM)={lbd{FVmRtfs>MykU&AYu z4y#Sn%5sY(OT2duuhrs(qT*@dQdCoTo-*xf4yyD=eHN6T3y)pmKcJG-5|RIlX4x2` zP5w;`SpJ*RXR0&Lztj#DQ4lDxit$WbbN$MiMi|ZAj$2H4#-xjGB<;e9SFl}_^Q3ll zXky{`xw79CUdXg7%9WZIDlM=;%F?Tw)gFZ=p`Clsl-W}RX!U$*mIskMqw!vdP}any zxO{}mS;JDE951fOc~M1kmQkRV5??5UOFif6sZMSrDS@ASN$8XKXUzn>>LpfsE0|NF z1@!`HR+N{MQ6yd$pKAOLqBsOMqMVrd+Ohy2PA z4G~LDX?uZt7EmK;&kH||utpInCL@N z?Ng7PV9>+^0=Xf7riP8ij7deB?xn~AjUrA3aid!(}@xaLJNYtt9ju}FxE5T9iQ=;EHrKkO-BvnWMBuwIS(8PX2<3q#r-p<|#)PP$ zb|_A3v2N6El?hs5GX@e0&0io>0=S|e4|&Gnq}pNpz$wxCx|sF?DV@htNQj~QpK^^b z`Lm27=2F{-)ng~$to(pnQ&#@08E8S?IOSw2&8i=UVM$5z#WfX3a!6dZ@|U1bHT|_p zkh=i2DD>A5N7-^f6sK~G>ea#cD}cz#jF4bdTS9t}f37s5#M&zpb>9aCz#^eGHOQwX z!bS68VRT4PPxS+uuTVd{WFb}sJEI0dtMx*qg@u}39H+C;7v)dtne<_Kmo8cq=}@JMqYF|%{;bIh)vr?)Xvv;ONPerBUsO+< zRRO!o*J6nitXFdd)eH1+J9)_tYd)|vFZ4!qePh9iS-;U@C7OJhuTcZd)mokA&!b`T z48;Xw5&kJ%M3{=gmC~i=h1BOQkZVlTbFFdP+qmRNQrfaT+Onn%Lh-?97sfe}RKXtWT0+CYeXV zzd2`U*Z~#1zQPM5xH7dYaC$9(l~~I84@>2V7QPl*;w1w=G@I1a3*#xp=l#I0weWM% zH%pkKRYF4&%&8bE)JqJ@QzS81uasoKl$T~o6UA~xl#VQCDEirwyzt?+gyyf*=u>sr z#>2fr9dx0ITk#9G_`}#RAFe;2;jh#ar8%?*dRLMcs*u2vo%a4_P*~y9^0#sg2l=xC zbP&8S@qi|NM{OfjFR>ycF4=QI<+L8sY(a4J#KX(apr#ozv}DH~=z&O-!m%PZkV9v( zqbba{k$z6RP%Q+735}kIQNcKAifDNDJX*wBd(0xHEl#l1ywISPEEK1y(um>}ikc%a z#Zjj9jwN}a+N`1Gg_`6{5hvAz5`B$?6Owj9n$x&`p|)^7(0VHmgKbjr!lc*D8jG`A z_0Xt`r39HJN&ExxLNUGbBu7>!u|V2{Sn9<5Km8i>!h~f-?MyY1gfn5$Qg~s0iYfC8 zUifgE`vSe4Yg&`;J36A^)Wz=~2LesPgM%V1h8rf^AWAfoGa()vP>bf=bHs6N}8W&riHYwLvxUWoXvz@sc$ys*G+${~#U z3%zj3t^BL;z%PIoVwIck%@=y17B6%r%<>P-3q8w*{h%*sf_gMtu&Poz{F?DX7GPi^ zIy&V?H}Po!b$#PgW4!|vRclC0V|CduhDl@u1DXg2kQ1A6#Y0RIz;+x|q*A0zU>?;w zRu<|KzzV63qsXiXp2r*p^CikK!5c^miz~6PC@*Lu`=1E5lR(Y_#D{`|0g=k>JVusb z(i)78j8XezT~#?i91)Gc>>Ei!Bd~imt5H9Lug>7}kwurB-2$fo`~icvR6?C3<7B@T zMW10mV_|>TNt!ibaEJv%_`Jw}KQ=N-nz@`DN@ioaB-c#*Eb^Z?-N*zyw^}goT44COn+XJnfN^addR7G$-3iHThYe z*8Fj>WN!?Us^HDFc@_CNMJ7J1v^D4a1EO=qU+bUA9iu!+Wf6|i2KG*RrDhY9JKnF)JlLwUJ&uc%NP zb2^P9BQw*}l;6r@CyN6maC73s0a@a8YzZ5=GNqUuDTqii8%dX6FH+W_#qt2@gXjxs z!BK80L``9gK!7yU(UFlcQS`?}UbnbeOr*&aOarGKPVg|0Sw_arV7z1F)6AGV)uDvG z;6mZ>au@|oj*2AvRCEzS$6`b6zfV7gK~ zt_XV|_zEYr43`&K-r_OAQlF*#oCLj+;(V6;(QX0rmL3+kZdL4!IE>Onh#J}=S-JQi zJKPx^$b+yaYIhj$OJbX(n!L*?I?Xfj5rtxQt4O*hx}lGTMdnUWnB+tieG5fNhfP}$ z2oV%X3Nva}<9A~jM1Yo_Qd9bwS&{RSwH9Dw31TcSN=THm7b`_YMnfP*U1G-052vPs z6m=#QI$ag%+L&`DgjJBLzp?;O0)99%8?%#bLIU$KfdN~X%&Vjh!GT9M4*3;oZ=Z5B zAdmAi7V%fj;2)F=<>BS?LN#kV5sS5YCbzrT;lf&;^Y6O+^%;doBLR1%dr1w}V{L!{2-rV2MDyiOiHUYMI-T9mI3 z>CF-8j#B;$>!^YBw_%^3q>3pH&Z+*^jrvo^k8^Y~)7|0}(E@+6S{x?uuZE~Ukmx+qGw`cVJ6;B z5Pmi#H@#(P`QWx2fmXEP~GX#jXd}}_;!az#o8`>s+;D^dQs9R8)mA8ldpAr?4 zvers7D}M$}i@z}OM(Xbvkx38^LF%Bk;y;U57?yxs+%AeIpr^wd%sLni4)hyW>o1(W zSW;A+N;)EJ-&Daih?}4y(p3t&7ZnX&KHJpZJdm52otaJrdLvxo>ZQg@=dYHPmRgMF zkUx^@|dP-_RP6{nEU9eULz~b|c$#LJga~HF-v(i$n@b&TWsne&=Q^2yc zxX5gPEeos_2`+uJA+l?xT8)(BrNd!ww5PqNziVK)Z@A@7`{?L&Peg##2H!M-2$dwi2)6N7z2UG3epZ@1V;KTS|Ab@`ea+Z%2+73OAI zsqMk;4C~LGKHu8hUX))%-eEY1V2JP};n@}}mm2{W7Q(2lAm(O6zFDu;Y;joVw+MCO z)$Dtb5FFy8i#qId44hO5`GA9j6lXR`8Nfwb9J^42GpD!k{{lfaJyppAF{9tiDU+~+ zA%83|8#sO9vUfU=nUZcdn%ri6U&rv3vlla*DNZuQ#snNjL_Oi`@`g-d-C$S$x#Q>3 zTscK~sga=GH|zW8{gXDcy&yN$MioOL>wv=3i=s?|_tVE%*dG}k9RK*k(`>4YlngRu zM}ySB@=|0Kx2=a#z46x18=IQ0*WJ2)ipH%A^V_MO8%6v5ARkYS&SPIWs5IFRBHI44+i(Lf#R4HyrNi67?zv z2M0Pjy7&{SVQ+6A8waJ2>Ll&$9b;1I8E_>tGoF@~raN~UJ3D&@28Qq4X+h~^;zmX$ z1_nk31_mk6+|kiVO#;e8r@Jf&m1oYJL*b<4ti@uZ-uKpR)fX>brnfaUo4^xN>}})5 zYNOj8kj?=V(_u2(%*OGtiK8EX;?Bw3uwjkILpogcY+OEYSxlcCIeqMt69K<3FDL!h z%^Ssqg+?=+TIjsXxs8czVd@|UA&RqQW!Vp@R{9`eqcv7pPIDiJeM;Hjx#2@WpYQ6` z>nLr7g$44@i0^+dv71n>}(ZxOYA5zP;!nLN=9o5srQ356`KiYa=bE{N6@BQ%8rH8n|@G78qW zQ-hN-dz4!OVCD1ry&mcIk|%@Q^j0DM$8_(%e`aKa2fb!XBr}8Ro4Tgvb}FrJ+O(1A zm8;k4SXv|d+-7NPY(9PZOle7x-{ZY>;VNb4Zr;3o_ihuFS2?rXy%SRu@Jmm1(lDps z;-za8uIugW8y}tQ?Ck6A?yaxC19#-;wY0WgzH+^zvnM?xlOoI_alb)-uciCD-~Dd& z#tk{yX-o<5)pO@Ba%QOxt>jWC!*;{%dlbOy@9A&7*LCk6wMavM^EcnVbLZaJ*z|=9 zw0d`P(sT0EsqCE0!lHaBk7Mlk(W^iF;m_;pZr{4q`2PFHPM^7W_AFBFh4U9KT)A@n z=FR%@@-=9y4m%j7sNH5defkE+f6LZQD4oRb%z8pU`RQATl)H9rvRN%YxHwWE8Y)_H zV&B*(9BeRjcJ*Gobfxj;-78ma3=IvlfDXG8QxivNa&q?CHAvqKnlTiKPTFj4lCJQ& zq2URrm>HW1+OkQHtPKCN7_7s?)BXKaVsaw=k=FuQR?cmJy{fl&;=>P)<>r=@t;*wo zQ{VfB7~L%jZfB&Yz?yiY?0#nN*sP}Ro*{}RuCJ<=^+HbN2OoUma=D?C&_=U`9O-1h z7v^_rW=UBc^fsGec*Jw!#A&P5Sy)))bcm#(&|#7GUC7r->y4&fxO{%YlWOeDk|*wg zTK<#|e+InJKRE+CT(_}u+7sBYscPenNwR6xeUGchqm^cZD7F_TVt zW+~B0DN$PUc)XPOaXM{XUA^beU%Gp@eR|q|{rW9Y-zz0$bacF}jrx%tG%`Fq*3r>} z%_l!UFC)cHBFx_2fsGq0pLu2nHMKiC``50kpujh^t)G8>ufyT$>FM9JsXA&kE4}~1$@ekgt-BkU^ft|C{Bd1QB+*G}hI`zE}W*m)lXLl2Pvf#L~FhAu+=E=SVE*XIgHcps!q6I-eIx zCXpawM`PpNidAKcvu%YRt9dbUE+jZD&53~DbFZzUveNFx<7SXinqTljCE(;U;e{@< zd3a$66>Jg6zi3%xtRNQuKS>y2{O) zH|*H4b@%Qa2M+9UyVEG(C!JaY^&8KfyC&CI_jo93q3`P(yL9eg$Vhp4XR+UxAypZqf>KZm~ ztYYmx{OD*}dRj?Iw$D#R`>A{PTD!aYhKDCwTf2MvhWJmU1lEG3p)UH}w!4FnTxhY~ zu4IM!AB`6-9l(bljy-+vUK_<%iL{`^<%J8^?WyV6CE3mtYt)b3--U&m4TmZwlx)n_ zMk94Tzxvg$um?Grs36F*V`F1zW`!$@(e>q|no=cYVID*|gNbsSDl1p!<)z=e*-owJ zM<0E3)2>RJ%{Vz3LD=zle4Iu^8!A43c2I060d!tKG@W5i$-ckbL78tP@|`Tf*Sp$e65N=XPJ)tiBE zaJ=1avB}sZk{TeYi}C;L2J`CT(pR26ke~0kc)2rz_f)R0>JL!ak-AYRF<9aGmu|Da zWEY@Ri9v5CnKbqj{ENPM!D^T?FyD!ai4kU0@=8(wC2Yr5A{vB1;JLvOXy%#OF)wv? zNLxyfD<&GJOOM2Dvgv~s$0LvIOiiU)G#*^a1d1HFD2(`K@N>`&%+M4aMH)yIjuYYA zkTo1^V|WVCT8QQliHM9kAN`eTa_P+k?bmKWf(usU3*#O~RCdV8 z?k(w(ll2IRQ1*WCpFV>^! z8DCnO`?1FkY}>Yp67Ux;Tt!`@8u-eUB{<-y;)@Crz}PJ|SQ!07GO_F1+Isl^+qaiE z9qw}%d*Fq&wHsz;L`6f4D;%yz9^F^AvdC^1R+IHrWmfA~e*EJfZ?CO={PA6f4(*b4 zaV6324BjBzCb4LHM-R$YPEO9QT|0-nhn-d@#nzbz7~2zv_D~p>*vaQ#c&Z>j9q0gu z8kGcl3_A_d@w1=(9L=Dlr1;TCAHgn!uzTgowauHV(Oa-3=H{k8`Q#&8YHQwq=i|K0 z{AZpyfL{1lfAzPV)}EfByLa!pv+@T9ruzH(jmAyNd@&q0;Y%+)ijz_zJ99D}vfX@w z5{Obk#9m&xdPlCMe)VdD*BjZkZQbZ7gkb{d`Mvi&NO&0;nKd;V&1S1XD!eH6txng~ zJ@D3B?_kh+?%6L@m6f5tPR|5Ro;-c&(&f_9lC;#d2;x+V|K>M;J0l%+P(L<0arw%v z%U3RSc5jr7RU@KY3?^OS%)?)VFn}sK$%IHnC~?sRYzBk|_@Ta|y&a+eEJ4%01ZjfZ zc655nD@rD(X1cn%klIh5Iq!#+nk*2>%nTP!#OCG}r_-9Ap27S>VDU0aMi|8!6j}DMs-^0~_rf80hHE$jRyK>9)Jv)1KL}$yu+@3xH*4Xmosh zQX>7Xv@}>-S}`7iw3NKOw2F!>%5~koeRto!JvFr}a&prP3Ni`{GhD9hjEq$F99Dj( z9fo1R1c3m1;lf3h4Xn-S^H7JZ=GyJ5?jj=^SzG^2JMF9;$b2C2a^aj!i~WycggV4$~~4V|r>SCQ$@UA%hX;`s1b z&%j`3XE(*cQ&Zgv=P>Ic&9_>*+S*(0w6-<36z1k+rJ6fC`p;fCgC&ILr=}+GyEvVe z*;$`06t2I1>(-5%_1Ei128Jl-h@X}7kdl_x*w};w0M)}D($?1b?&0^2d~&p@xy9{H z%}lqpwDx@T(GkpNea$V#m?^`ZHaRkS_f{i)yK(tiS8HchT1G~SV`jorcjd;!$Y@_z zPiJ?x4NB}HHXjcJ%-BMaNN^wb>TgrKwR+Q9^0^Z;Ayh+2i&c)0I8jnHc~$(q_9>94 zxrU!$Y3IQ&$wn%hL+`uPV^j1(^$;XQJZT7B(ne~*VMj$-i-p;Tx?Q|@Wu>@En%Lz{ z%}q`B;4~v6gV;k5D>E|FXvc%43d0V+QJ^QFa^IApzE585gVJ3c;9wQem6MNiN0*w`e5Ix8zDE6bdgmY{`f>({UA>FIs!vBzG2?TKA`cdgs7J~b^>6cko2;f6uD5`w|Q z@xp&C+d_oT+PQxPzL-t~!6I{zl#1Tet2tG_+Jyu=51g-)1qdU6a3J zMNW0~hW`FBWVbzg_Hd#AJnr4Q>*=SrY}~jOjh;eAqJp+Sgoc`$I?tcK$dd;T9x$0~ znOXU3*H)F5uAH9sojrGDP34B2J2w$q;hpkay?Ud)9gUFsnFwO~*4D18S1+=qpe&7z zjfhA%B&Mf5*0fYyhB7Y%!ZtfKbLqmxqJn}A+iE0Fp~!oTeuGj4jWCQxJX2FEOG;O- zC^N+TUF{vawrv4l&rHs&!@X8s zIWy_Gcmvl(>#9|&3JS6mcq({=n^)>i9y^(zo42NXO@3}>SI5wYAAXpTo3&-jCgQTM zU$5iP)@&@DnvR}*|M*AmeUR=>+pxB3sIULT(UT1~Z?9gnF1IlK```Z=9X`0f>ULw# zkAM6ozNPBgEzkw*q5ui9vI@Gox|!ac>uNV`SUWN}cKGLq{T~1N%Ju2)jNYz+zOMeN z%GLNo&YixL;b_I}gGODcv3sCIJi>$B&<4r@s91b5KBkAYym8 zkmbGJ!0FTHaH}6YxIZg1WoT&f#PKuNuH7VxroDaoAHVwn7@^+Y{)-o{LrLL<=w!l~ zG}zzO-MM=8s>#VQpl^4Yx}fqOzJKKS(UWkXciuU2`0$Y%H*VM0-#vBe+?`Im^Qc?mt!Aglo6K$}zcB2enMkHcyU@+wKGhcel>9WC` zP;siN$`Ol^L|3ma`{a{j`T2!;x#`iEp{r|fbab-$?!D=WX`3z6YPBKSzWnkF`}Wli z42*Buvi-T|cGlJ1DP2(rKa+Xk@SqoSaZXOY$k{89rs|B=Lh4|;5Quqxd}8MErE9x592uZvyCWy>8{ovS*%sYW?~(t5%g37M9f4*RQWy<96A-5DJv3m~MD<7O4>_ z{E@xeB=n1-)$2=2N>{8X0B_#b+KrB|bxSqSBP*)3UOzPC8yXsft>W!Nd#kFd%Fc4b z?19HbjKF)$?XA6VENr?C!+|qo`yFluO!-^+J!k>RCz3|tI z7cOlhmE8COScF-l;r8v&(8Pxy9^1HO(>K2HRlQB$)jxLe^0kc{Hb9`+^pn#deGzjg zTxVOi4)-433!%xSq~J%4p;&ZacmxsZa0vM;altreXASlB4e(3J=J{fIdA7$>+txq) z=9_OfHn!~AwJSeAAM3VMR9e^G-j6(p*8l9Y&t_&?9gb|PmGgk{!HeGwXWFI9vL4S-no5S)%w(%_2XC}Ig9>KG%qWA_x3H7mAP!9ij}$D?H%L8BSEjP zt@&Ow7<%QEmy3$B_4+{7n#!(;VXPkzH6&1M>lN9WV*I(uKMf0 z{_lNVgBK^tM>ZqFQa*oZ9E(mh1uUd{0aLIYW_RF^V?th+H2V5Cnjb;`Q$iU z06nymO)hcy0|A`+0Ib-J zT|Gk?8EF`PkU{as@hf^&UcM3~_2$in^3^LG4kLz8PISk;PEvx>|S4&s?JCvIFkcjoxfmfN?AQ`5#;+FLH(>bh~Kv!%y|bNF6s ze_vl~N4q~7PR&Xg9T`3H(I=Sx+26P;Qd2Qaj0VTXBf~SjcUyYz-rZYM6P@y!{dyFB zYnt9_jaF|c%E-*~`)7%P%rD6Kz2Ey|xNz}oR(2XEVPIf#bZFc+<7sYe+P7=#-Nx4IH*P%g#G(9> ztclrZW}ZE2bhLDKtSKp5lat?cwK3nBR#jRy+CJnR8VgL#rZ}S6F4LOQ@`8-~yi{BL zY_gqE-owVADLQNY_+Vf-e|CxrN|DU7uty25Y^kINX?K4;Sl$tN+IWJj$X(Quu}PXm&) z=bP0>Q**LWaqt@kr^g=OySeR7U0zwi%F?W($But;?2|||IP00gh0xN}T)UytVR5dn zT>I$$gHvM@L_Abhlp*^Gesu5N-o1MP$QTU7-lbX{v4V^=q&5?FzOW%UtLtkYjrwM- zq&W1>WTe6+P0^5ldSVo3`G)F^ptWt57z*q6fA9vj9|YflwxP;Z1&ue`cW+Sa% zI~`_c)rJbMFMv~{sCY#|ZkpNR!hnJ8q@=I}MwOqBF;n0$F#@Cdg!D6g186z6;^LCD zw5&*&iLwlK3?gV&uC8cqL_ZoF9vHiKXJC4AVt8=SZ;Ui+QA0?$M1a?$V_ELDPF+aw;Q)^+bjYWh*Sn{4|HW>w*B_q(u~|q z+o9vtYub#I8|1bqX^VpJ$L!s1<3lk)#XGq@j>M1 z7a83Ibe>y|J-F}24lZhtNhe)1(8zkL1Lt^+%>3v&nxLJ}z`EQ~mv>nhi#+MPOIkUKuh z{$Ped-`?Mwk(uerOhcHRnF$a?0T(=Y@F1H2*Z2GHHzQHn!r{WyRCKcP;jr84j55M~^a24yWNA_>qzeipP^i;XB zgjB~|2#ku|V3DOtNikl(d=Ho(6UCfh1)>Epdw#TDp^RFs^2~^|lMo1|3-7lSeiVnN z3M3hx9SN@rIlaQ6yUH=IP0jk84uXj|9VXVDgTeX2@WW@$Bb}k;fstWqH6Ty&d^BbT z{#H~}z|K1H{;3Z?yuc995tUWtNUmRB#lLK0Bq0<>kXkh8w73ci(w$Dji!VNdeCqRs z-hTUolFFh3`?p6S(*k2nD4fn86vqm4AAZN9M~^~b3LzuH5QI5nR%BYTSpL`l^0M1pE=aGmMfSO4$HV z0pl7iEA_z#A20-dGBh~0b<5729OsrTTfYDO?{i4M{N+dalgs5yaU%!BoOa{c^EXbN zI>lH7VhhNdL!G^Kt6|m3T*v|w3uOQ*4~pl>C!g4|d9%xD0$Ey7QNDhCIkE-w zeDL6|wd?Z{fFKbv*zJGJYiVA{ax%HB--ZnviZZi0o7z^bN^NZH#}rUrUJhJ%a9|KB zzhOfa2yal!2M*vyHVqDrz4_*w5MNFm_Q_|TJ%noC(9p1_8g~N73$VhM)^FWZSXRik z*tE4K&0?&--UzNb)neBJ>nc4Q1o-U3-c2QPP505v4mIhTvTsyolFE0;E z?Ed|`9R_`>)o}IdEr`M^ue<^uPs#QR`u|WwK7-nCAeN~m?(b_DnZG%US9ND>Z$1ATq57|O4 ze&dZdF$W=baHx38*q8?vh=vIvgPcJ`Cn-`Th7jgjvqe{lY{?Z1mzhv;zu8SWKIiK zudfmCu|Ux0iTeF|u-wxVeQYNV5s&c`wjvJ{5I%3V%*^^ZFYN7|J2t@@^YgM=>f279 zJo&Y+eGTys45vImPH1UyMrOtiG>1S?B$^46D?^gbV2ZuH;|SA{2s=Ci@U?%kHyD^f zXBMWs6~#ugetaCr%-utW9*5WPb{em$DnZsH3k-TSy41C6*VQwLe)gNc`7)dq+2Ziw z_c@+C_UNPgpa7kny;)hgY9@_MnAssjvaq0_e_#NdrV%Y75gAIVniD6^B5f1BFg-hF zcbal?Q&Q7R8Cf>;MQ|?gYy?DE6h_JnhDlr{EB(4Dfk>K#>#z_wXE=aLF;r~bsQA?z zD?u2&@y20^0mmvTihk#Je&fQ0Yb`C4Otoz0otX_aHMc=S=mXT1C*h9c<34;$PaJw| zaA*W=8#$w}FdyJOOZ@m_d-v|y9*qP-;lRk~^!PZ)gL-5g6oZP2JZw7nfFC=!UkFCz zr}-cCQlWIU@C5xqhdG*y7$bf(cZqJ^*ef@nz?BW0byy;<$%(2eF-oc5n z?fbTD-Mih9nZ|$Ogy&q0kB%m~~$=yznK zncdFp;{43QJe|!|)^w!#Z!l&kr4uI2N-caz}BA6ipFa`CK83vdb`5$ESS*R5N}Ugyi4EM#ii?b}U9 zj(j{gGQ(RSK%k;0C&9Dn3AKb?AR&tMXOIR`P*4cbY&>(d?!SKLC&QCdl@)nUKfNEB z5v>A2nZ^ItD-+F?J~@j!^pKun_siqv5jg zZ-58z;{vxM?TqFLQhxH;3Y&}DKOZ!zcgapFuTwjfHODI{{hF?;ha@nZtn_sEiWP+% zL)HSsV|I2%`RZbVM^~;WVC@j{aJ;QtS+J&}EGIjis2q%^fRh0bvgOz$?0+COa4+^7 z+KC@ii~vPT#U9C7D3lTs@>wC!$Bvzq0_|`9!$17PfBH{<^{sFHJrDu*2Ab2Xch>1} z3=WN+J9qQwQJ|HhsVS-GF|uYxH)xH286@$23})-yZ|j&vM$!Vxx_VCN`XX6%`P5TP1< zFpuKmJj_MBn$KxzxYJC*pkK1RR7^=iN_^pB$T*6uICM*OD5dh>e!h zMTm?M8n=}B?$_p8&|iohRl$NYvqa7^MH3^F)8msio0CKG+;h(mEYaUT)zRI%W^IMr z?ZkI#5k#B?&8t)`UCrS?=f3rH*dF9*Vf>Jz!o1rodc;QT``|D!tzfJ$ zS&SBkt)r(GC`Vbv8hl%bPh|MOdCA!$j0Qpg{`3CV;8+`t_USsz4e*Cde%+uB==I4iH7QxfxSLQ(Id{y469>(5ej^-RW-Jhq9*)OUm7w zjj+$+Vp7J4e2lS}rRg4#3%Bny*59nZ+tt-WS2;)+FrAiE%vod-K|00-0(oL+rK?tE z7i68icr7b0x2&RsjCwu&eXVUBt<9}B>h2I{4P2YWZdAj^9utnpO`B>-%UD!g0uv${0a6Zu#opiF z*F|DB^g{Rw`y3&djyc`Vpp@-CJ3E)qDW}LP6$46o?&KwoDw`j51S2I;ad7X9Y`Z@w z06a{J%W3ZE88~+A)a_f1qeG)KwPVMo&6^Rg2?<$^S!!j)iYFf5UAm&IAkXcvV_l3L zJ$5=fEobZ2^$6ei>X2?>v3O)e_=uhik;Clj>gx4~u-K5W?~sUwsU=Ge7tzv)r+Il9 z27qQx(x?fL9d^Ynn`?sPGPW3DAS?~bl;%zi`vO-lU+L-Ya%X4pZ^LcG&Sr+Qd)GF8 z*m(CA`G3}LSjT%gO=5K=!I2CvVI)(%5j!?a9cdY{puM9L>W7SiaVs^|B^QoH8DM>x zRro8D39*Hw5J;MmlD58T1;ROGCoNTgU+Qi)u3BB1la)R+Jc&tW=g#f0XMTkpl{nz{ zKlqS@CuLNZ^A|4CX9C_DZr$FpW#gKPY&@^4%5tcUT3VVD z2>Joj!5vFWN)iWMJun3;mo_GgY`?kG_$9YKN}SW|F?9<{e=tiLb9yQ zAH+~^|8V~x34w6Bf<}XSl0#wE=d0Slo`YN2(ET$r-Ea={HqKR6mTPo$hIA4v45^-O z+^BDEXe9U$-dO-Xaz(KLbUtBC$U)!S1~AJ$AHGcTQ2~%c zz+@wC-&Re!CY*(ReZ&0&LkPv>%t_6(DfOL*UI3fGxk7=%=Cfu^g_IvWS(%pP-|QPm zjD(;Qn}@(#m&2HmmW_Oe+*(|`601aY^+u6oytKsacBQ6fR3*8{f-6?7v^tzAL<(kQaTF&1*+l@#F*W0K zfkC1&Lf!W7-;|1sBCLYc zTzEJ7dU_A++l$h0`*zE>zx|KcUFbQ76uTL~C@D(=!SVqbA08f^35?Iqcx-l8VL|@7 z$`W9o06k`>#`o{r^TZPeHf&g3SXfNh1_rl%2ez*&UsF|8nVI3n4~~>c!nR|_PCv5u zQPRhxr{^HlH8k8NyblWA+IsJCrLOE=n{;USXp+|?kp)u9U7V@+N7?oj-)D3n7X=Kw=ys<#3kq^k=9GMfXqI9h=#5w@)6z0AX2PwBXoBJ4 z=HIhtXK6`}vX5}V@+=uj!3ksO0dCXOe6QtR>#DMHjBQv@ZC0|8#70JE$gNmbwt{Hs z^o%qRQl-UNgF_QcCToX(3K@F;{(TsMK~6bc=`hRV$4@|lkgDr%-2r&@+_O)T{hXlc zf`URcb%d6Y(eWSr;BDZhq+$SjPQ)a;3*A^gFAtP=Mx%OwoQ(IE%nG$LiEHvgVStwW zV8)PCC1h|i3S1E+Zp5Skofv5E?zr3X)Kib}E9`P;X2Ro|n{(*tM@aq7DS}W!2-tia zGbv7ic$F9+E6$iK^Aa-%lGoy}1DrEBjFaeFWX`oj0+FE8Y;{?UPJ=Gfrt{6{x;jSB zzI(Ezy=_%h<_5bfd=p)d@ZdgpA%^0l(%``kEYc=1WabZzGdnxgJ0&F!HtR?LKRG3=Py9-F!qcqx?sY*{ z2$2Spf@K%R^Z#e>KcnP2&pThVE9dH*yU{rz=RgF4BtTLUC5jR)(Y9tR+vD+g#&hT1 zHTTo`GI!mz?pf=cbb>9n#wS1j=e@sw8|C%Y*IuSbQ`BH4j+C8ejVB#Qqkj$|EjpoH*ZOSdP( z*(haNEwQvn3jF;Ke(>XOed`-VMPv|xAGY{E{>NWnoFL@#`BNthCOz{X!oG*PnaCNq z-#ggV_w_G5-`_i2y|a-(jUWH`7fc$;P(^uRPw()Zo40@W+uvdXV~}L?95~R1hH?9L z55X76e_U`2IlP`TYtD~Vlvn-sYu_m^Ex&m2=6mm6G#MRV{qoa?54MrDMt>I;{Nz48 z_0+*_JDWwYwS#R5@<4V!Wvkl}jW+>AG9#>JX)+OZak>TWm@P|#O=^YK_5yL3Tr zfs&9etWqKjGi^qKl7z!SjsVPtVjhw?G%Hv`Be)aw_-8+RgW#r?rn;pS&-H8fc5L6d zb!$0vfV@lwh&|J0xBR<5{R66MfMiAW53*D4bq*4vfYA$S=9O1ouCL!B@KiC>OLULG zz-OO*rlzKX31^jeY_A_1Tln7J{X{makfklfgj-2p*}AVut}>A!r$y>HHVfApo32JnnXzxaV{^Wh;|>0os9iL^!Jpz@SY;q6V0AS%GV5IYNCBs}+9W zlES@msB9C?JSQqfh_MJk!9TsoA*3nlvnWaNQQ)tvw9JqMdOv}*v=H?~@+_S8DCq_{ zIyj1O9dKJH7M`75`RJo_#H11FL$nbnP=rzM-n;wQiCuHc5u?>CG%75!ktiCntNrv^VT}=fACD=C6(Rc3L@$zqf$(s=R z9Epm!KO~G8vcqCd5Sqo@vDrnJ0s;Iqx-fY8Oan2;MzTUV9(Y7iyK{m*MhBd+C?_P~ zm03p#YgE2OS)pXgAHbJ0Ut3z~a9KhThF}qeh$R;gAo_}pR9OgEgr?-EFvy2_p#~d~ zD{9EshI*l9%_e~)rInbk0@)Ueo*t%3pv}UqQAbBpVa(V_MQt&GW+&AuT2C*Oaw?>% z7oxs|*+4~z9OpVVQjw}5T^Kp>KsPrxm|1=U!eq|M z;?mOW;_e--3?e`YvlzM9Gm>-BiGN{X$+s{)yS=3m&lb{>lpPwR%nud|4!Z zFer;kVWMn`9$mr@OsH( z%`B1Sq^ElfRzRUrw2s1WPz0o(iDf7!#f5NZVpV4UGPr-b=4P5y-t7#*}@WJ{M-b4zE@a{_effq)E zeJf>*>Dl!9Sx;nc#ZN7ZMT0v-cd}@TGA!&P7YS01%#Wg=TITz5M${E%XEh$<8XK}^ zv%IBTf-U7jXkvS%iGqbvc#of}>|Y~V`QJ)Sd37t~$B^MCU&Q_>e<}=X%(^l(bqlsw zj!i2F3mpqX2k5;E3-egIIE@%03LCbNLFIB8h!<5FQTIXBGRbxtxoVE(K7*Ch;JK*UO%prS#B$81Y$>F0&|TyrR$7c zDJd-U>c?uZfcO2P%YK2G9`OPndHby`n%mW_Xh3(A1T9^@!k^3vbBgr{XibGXQ+yV=t9O zMZ!drE)m?5qR=X`eH^85Z3F6IQWi+QK~$yJGFNCWkR~q_yD&rI#d+Cu@foFuq7R>r z7gA?e(`@6^6t}hJ)=1n_3I#yOAj;p@<%M4TW_cmv5Fhzc6H0$(YpF#E4!=5!Aibxx zSS){XXKH;)j-2!+5NXYurin2OMr$sGWT^ilurxDVPfc_RwBS^fp{ZNIq9TkcYc8QS z>T_&1MEiIoB9bVuPFM>~5-bkVE?Qt#7tu0GX!Amg4_u{`-4@5mA5G#x5m3J=&~`Kk z0WD~px0p_Y7g9k+V5zNtJ~sAJcp)_$<#(xxiCwBB{>b%2 zywIVtA)!q@X4`*$f7*~2g1?@ouEf4(_>c^hg$jw>PKm{}-TPb2#sK7A@52k8joJudSOgUFWdw#%*y+`T}q-76Ssk0s68}Q z$#`j>J!Vyf;<#xU$b@d7ami7B>s}k{g$Yd0pNi7O}Y;;j||mT^Fp=Uri6dg^ zEgFYGnP2tTHI0Y@h<4Muzsd@mof4YWnlzCeqD(JeIJ6=kIf{?}(Ti%t$nKB+N@aRI zp*P}^QjyX+BG?7;o$A>GyOEFlyF%mSS(1O0v$P($VLfR^X+b?SwZNo#jMv#Dq73XK z@8zGG<~4IlV1+z#p*Qo9f83DpNwsg%7ZQy8jZ8{BXX)>XO1sV&l(EYWVEHcG!C<_| z-w6yM^cn+~i!7y#!X@9S+@G>-)^Nx6Qw$#JL!?P+1;SQ_sUe=q{ZXHE^_Y}_thdVR zOhEQ$du9~E8ken>RmaPV3;sHZyeiG(Ww%&f-3$@Eq+hidjqz3v-!JVk_Srfh}g?5SHYZ`#7F zwvnp$fM$Qx8$;O-Y#Vhs4dubi(cExkIr!PE8L?QI#)oXAB=4<+lMCL6-e>~5LT*yc zMdZB7M_vU~uU`ri<>G8BCuc(kspc6Yz*nhutr#uH&>%5DeuYJZ&OF)&^(iGSH#<9~ zv|h;eRVX-sy2=eam?red(o%HuBbOout9hZO{<4A6@o>AE(M@XIG<&-My3A55j5;z} zO*E;&3k}4(WMUe#V@$!uWL_w0A}V5LObMP=1$m;if{iLat1J+NCQHqEcgEwpA(hPX z!iS=7vYO?F+cx`(1Ob8y56*4?l~T8|eJbgD5Tm7PGbk*aUAtDIE|Yz2YXZ$%@yim%~e{`5qSj*!UXgz}OW^4k| zG)mAN2%M?(rk3B8RhTyI!&2*o@B&3}PD`l|_f(`_WPZtXO{z4h^*V*Kh?Ig2ced6I z$^@>*3pJBAm5$M5CJyhR)(MMLF6Gd3Dn$78noH9NZP6N!7-r`8j1=_nd%^4ZWD}8T zMm^P$O)s&!6VS4?U7)4M#-B+kH=ABT)Ck2)wV`)n)2=!xen-nTpxH0=#!&VHtEP#S z?A`QCuEz_rITevqYQdlKh7x9*F_v+(J!C)=NyO>d&PHN`q zNxwo-Olc&N0-1?H@m0zgkSFVQKP}<)s?4CEt)GM&x>Ap345H7RXe#%xrTMOJCcz z3>GE-&Qr{rJd=tP^-%hd*5Q`8R=Q!*QL?X4aw=3k*HkG8)mL^sG9QTq+(w=Q#%&RT zEh5CkCR8Lp&9p7`(3In*4pnE)G83Ppi7Klmn##h-Wn1M-9SyG>W6q71Lwuc8RQ;^j zW7TSluy#km6%|0-t%IlOqs9R9?VZ%`Jz6KY@zl> zDf>ZG5Y*aqX@A(mf6|Our4osN&yz05yZq&$Tzihq%t~U}7p26YpTN~MmpTbdu}!HB zr&6wQ`Z0wLs+&;-S_`D<%%2_+aWVw-VYp8DW)hhdnO&p;J^m6165^6NnSLFLpz@GP zvr)&zWyK&oWf-y;i{$lr+{@O>3eXId)YN8BcNC3Bb7-g!%86EPAQDxX5VeM84v_A1PK( zk<}U&Nt}gl9r<_AUo6q`oUb*1tv6|C`x^ZubUE{@NOgPii?v_NIs`BLM6GG(J3mP( zx8?}c#XmKNsdk=ePLyWH)X_Ie45zvS>Ur4k6;D3*k3OLc^Apd%W*^i`y!lO{eu@Ji zl1V?KOLHxhIOQBmc=psU*WiW70qHx0x{{`iQYLkp7XrYcY9g~AqCh&Nf6nTKs`Skb z*WzJ;X~V;&b%Rz8iF%`g2q77bMXD{R2y3_2I%1aEMyk>&Hq8quu>~-Q{5k<~5{e*b z73CT20`c`T*}toU7nB>+KdPk)O=q53KUUg(NSaaUg;W{H@Irtt(z-G# z4wgJwFC@?@!$q<|Rlwv3Afq(7&te;HK7A_<3;1vg>n*Y7M8%UD_7e3H%cZzvybo~c z){a8c-o0)h<)(R|z>ENGDLph%2$0=Xl5cUEKTBRH$(9+8tED(@NTAg%WcP`%tvuc# zrQPu7#0xj%LmS?(AurS%k7l}p5Nb!7|1OAlP~my zMl#eN5+ONu8G$Pqtmj-zBH!qnG^S+Lcx&N-=-QV^N-0hNga6 zVmV5-gZM7}Gy4YGP$ue;*UHoWh@DOKqqe4%X)Wy);$2GYs8mEFO$4Pm%)0!Ph&XAX zr6pidq&gu|sSx456!EbeolN!LmBnJ=2&86jNLeJ>DU6TIL)zC!IG5I?ev33ea-Y+y zCOsj$Q68N=^}1*FgK7f+{FT|XYX>ShbTe}f6kWzY$;M-(YNI7vF z5E!R?pcJkw|MQVcAbv@?fVh3-JH^qH+>rbi@kF$+_A&KG*K z^0A2Are>w;EHULkLHEV36Hz?au#mqbv~kSlnG>g;A3<0$wGl)`HR;ZWhW2oLiLzJa zc@R^fIDYTL1lET8PTZi`Y^HXDyrDCTBBI2_ z-~=`|;MbCkROp48Hd6SD$le8_%_NX2(?><@tW0wv-t$q(kvuBi0v4iJP69GA>!C>W za{4(i&@h4sQVlV;+W}LA zt%|%v=>ox>LYn*&hQ}tCvWbL(pd3^Q&o|0H?RM}*lb{KcDD8;GnTf2l zK!4We2}uJHs5JDPqo~=!rZ&PSxJeV71)`LVW!1=tP^(--8!53=O3(2iY6l!?_mCYR z_7qu^Y#5dp$v_}PZW?gNsEGiy(QIg@&#E6%>xB>P0bqXDztsLhwO+`&v%`U0D9WQi zTKaij@d$-Y|3RDzXcocFBBY7`MXAjiiLf)*zFE`?l87WJuMk}M22ngPDLlbYcd_F$ zX@wij%4eYNSb$3v6g$iBMSoQO!YoJ_(PKg^pr#J&TwvP>$hBn34B)+VsdX}S&!d3i z8Vo+a58c)7NMk8$4o%2A8G2<^K`bc?N=Ugvf(3h%aL<@cC7@$rMWO9IS>G-QPdL9#C%)IGkKcm#e$GU(z8cydX+CP&kIVWs(voPP^1q8Wdt3OohI|GJyc4 zk`z4_B_Le(;$j!ommXm@>^F8B!}0mTz{5){JgXpXNIU)~zX4JbH9Y!xBKZ!^M=1st zeRI^1y z9>or<)?e{davuEwP^qa~zrh-!&;%)_2ZlGaJ4fd*np`$}uG6{U(mPD1NHhW$bUv05 z3OR$6Vnkr+vthI1;A7+fabGiD`Qhie8U7uJMkr&4(g5#KBHdr45(oGri#<8!55EzECn0jZ=0Zt`SEju)YQchA2WdH|GI>0|v$i z(DTJbN)oN`fibGlB9v+8smqtIP(Hn&pjd(YPz*;@ih+s2ljJfn%0<;pYHA-jvJbd- zMR}46WD9AC>leTH#n!DY@H{$DTI#xUr)z3z3dnX?AZmmN{>(|DZca{4QSx+VW`^6S zVra9OCMW0kWqy8Pcz6QqjqDUu7`e=P8IGuwIyOdwFiW`Um43DQjt@zy@`~nP>Ff&Ib=D%`FPrs6eCETch#m zsrEZ}D7=v8a+96%m~ly}W}1N54B1>|WkJ=(TXfA(I83kR7Z)fOEH|s}gW5(ac%i88 zLAB8(FLjh);VRWY(nm9)?2;+i>+=o{4MO+$6ZA*cCfD|yzRoSoQ})j3a$C)2Zee99 zS;e|=Fl^M<%RCc~gsC2b3IRD<unX(K;wtL0%rQVv4dTd66W|Te1_R_oPlwRd9$N z_cNJFXOul48B*0gg$+a7HnYXVJ-<>LDUt_30$eI9=DNIa#iYlGfoX&CDywsg9oKH1 zdGnon=dbo&zmr(;mpk(K@B2Uf#rXZc)$y6(uAbgI9ixLoyZ7udSc$t4*r^te-#fQx z*DZMGqvYLBQaQc5*B(u|soNV*`Y8uLzu+p+`C>U^!=u;FU7Q>pE6OX#cR8F^qi4xm zT4)OlEiO;ZHrF>p0F%@(Bemw)lT-tV(S;+>aopWM6e&A)%WP-kf=s<`mhM+MH@ zww6XLuIwtkNw_tMo&CH2{{7H`e`RELvSV4zq5O4aOCu{ zBYKN5DA~@T+M&hOLbKJ8OuqU3pSmhbT3efBgRrt=FsCXXPAl15FkdREQfw|ki9v%d z7>@#eL7N7v!Ado%NGuitUm|5UgBU96FD@f!N`U$Va7U3l4QTAbJ%aWsGVb*`)N2X} z*wSQzVxFR|Jm-vJgE|u)lq6qre0ou!hEJF~%qfeLFZ@%~gT$YJp)x|wB-S)S_z7Ob zS+M59Zh~`<4`H9wcgBXv2hlw!{;T7Y!qliUiVsv<>J^`uE+re0_)wZdeoBvcD%JKA z<^4F*z_lCoZd;PfavfD`k|{lgRmt8fQyfkEfpTcx{ihCY4|rmB zJC?T1o~yXgz-u4*U|%FBML0em{s8YFUytvVU{QjRr60%nBJ9TU=dqWX7lw>UpE)U; z2Zf_3o`9A)EaYzEst^G$vfEK<&lk?2?z+dTE3%p`QKK!U>$=!;{o;)mPe1D*^GRp1 zQ$(BE+{|-4M*NM_U>1iY62EljZeQo5-C(VBIt*beRBfVn?%J7KCl5U3)LZ<^^LC>p z8qf{*jtun-Pmj*E?Xkc1-8(=5oWM1s+I(+Q;8bnM_Wi!=zi7TKVh0`dRIkR=W+rgk&U?ibcb53O2o6VlZ;P?LW?;ENc>nqAAmBgNhhzMY!1cfb$*N9WE)s$miom=_)zy4)` zy|TKf*q+ombh^GflW+gz-TiI5iyd}dBtVNa=9KrRvN<=D9XESirTY{LqyF+lEeNB!)JZjk(QGzm;0$8!6Jhm8L!!(a zpa1lq{*yE~2&^a&sOW`3NmS(yhgt7L^D>x`L9kZ*%=8V}JUmzklS& z?n8(70&Ft3u(12!J_=_E=YTHfXMgke@4ff_?c0>Ize`zdyoSW8%udbp^!D7o(|-N- z&5?<5vn{WUVo5S1MIfR>sM|b+_(2%efMjnMdhnY zo~`@Z&Yr#a^wUrO!5_R@T2em0u!QRAi?V0aWx*-%Or5u`&YpXB?(RB%h{B<=Qj*mR zrMgA(2Q^jlH6qhV6>UW7zW4~`3IR2dV~8W;N6Afd- zz%3z#+zZ`I1e~z zLExpjXl7q;c!XjRoV_}`9cOTivfWixb;ZRcfZlH2vX@f)Z>qy2ss?JEt<8t#r2})M zMjl&0>7m!Cd7+3Rr8=f`_5jF6K44qetilkddF=7)EqlTre{}xZ#oPVeLw9fA@4VOH z4f*_$$hGUY`uhi=;2j+g`um4gJ*!2U46&2DuJMW)6caGwhTvJoi!^6`*|M`2PqZ11Yi~aorLqo%S z=2z#@=jv;#EM}tu!G?4yi4G5akUy2YME;1XBT`nPk*gQGIyyQ~W!`@KOn?9Q;NaMm zEA6XZKXrQZb8&B_7MH2^2~pAy^bH36p%W(#5L7fXGtX0Xb+z5yBX58BA$lz(7#kY4 z6c*TUwQvL&DaH8+Pl3q1{`%|KZ_sI+4tr5?u1&(VQ?h26+qYi7z*x|AT3Q+oAKus2 z)_CJa$6tQ$udZCVGB6-Y7`ol=nwr}Dd{;6ST3Pi_9Mtb$_4z^z3*L`DI!`_N+Pd;^ z*pExn@AU*iLEL|Cmn9HL+HHogsNl&;3gS93u`)d~xoulp&6ZOBiB#YZq-;=711U7I zv9al{uAbYsJI2Omdwct+K8Oak>IqCu%}-6uVq=?|Tj0Z?r2;b(VzU_A@AUTe44iuI zSaFdR%K!$d^XG4XGMb`J;RApa+E8y?fhGLVx+zM?@c%lvH$e-9K<( zS80h`Dl5q`;v9$o3!gW9`SQ)Crk0X20C9<*h?p&AsL+KAw;CE6w=`sVq2}h?@E|`C zC;Rj_D?0inIwqJ23V`%UlZB0WVG?|ecq-rRuCFbF3{Q?vA3eIAO*S+%&IZCV84CGV zR+olH=N4C&ckbJx@WS(Ny?6BJ(Qka?rKYCVmX_vY$MzpNvcI9Wsivl;sik@MzI{9Q z?Jlh-H;PJ^y7Hou#zs-6)ZxJ9Z`6$zqmyAui)cz&|=PwX(Rp@92)su3q#2icR0S z+f7yI-MjbrV^OeZg((o7#-O)bbg%#X&7jZ!HQ5R9iRDCb%>+Yc33H7P(*`cg z+O3wPM^ZKmr$`x^u$+)&5JSgI7;*MXuTX#B`N}^v!(kY@!>%76nfUO%4{EEoUk&dtrgbLSp~<@W5^8lujoCPbLl8Tx0#3n5s{o6j4{wOh-J z3;G`PV}twBSHF~BQUGFjWo0RPOi@t*HDHU1a`Ow^$RV7a-rhmKFZ}hFpLaUlmoHo> zE2H3h5VFfuVSBuO{d!$v-GM`U+%8jDY5A#BC!aZaoX?TNhqrIvIxsNu{PWNM&hLEv z*=LVF^NjfHrGR~FJ>f5*Ft`&LkdAc3oNPQ#e#>n>cp>p_yohr0=gwXB`2tuS>zb>- z{__#$;S1L; z-Z_5!sV{%|U`0j6mMul4rM9zY+n;^m_{%SU>FK9W96NUO$l*PC`3_F-)YR(j+ueu} zy}hH8lk?}#UxCHKdqzfw`}+8dbUzq^oipmf!eYWuW$U$ojZMf zJ<(`*Y<&8DcmLSf6db*{xR`i79JmM>v$L~O@PzsH?c2@G&7~!UcrM9K3IqeVn!H{Q zAA>1XTv9+W-UmIyw{PFY1XNK`Iy)`s%(0*0_{+g7K`PSrSSlFPgh3KH;#Z``?{%|%hQ>NOAB+!=+`M_SqpQ>Aaor>CB+t}K>Ul&sR5TY^OFQ?NQ z4My^vmP90c`P}7+kx|dmvKyT{M>owVolNXihJva%xJr%`YrOtaH-{SSIa28IHwJ_@hf37^f;%}z|ME-qD< z;^JUcrFg_RWx+zhxq3iETh`P!vx4?4RDA8=T#RNEE|bu@fI^P@O@&Q5(3yZ$K|phM>EyOj_qDv4IwtcPq{&@ zlktm;^5JTw7V3@4SAc zedqQa$DcV8iUmtbirg+c2Z7i$qMR!$$^@~CCH&sNFMjb>S!rckTYY_9$*yhN;g^+_ z#a?en3R|_IH+JtEW@#3{@+qTuz6bAz2kD`U-n2BI9=nxdy zKnPBoAi4!MI zJ$I1P3HUNO0z{_t^$oE-W~XL{28Ll{cDn;P01fru{@dR}0ou|~lb>rF8J)R&`I^~c zFD=OnM^ej6zJK`1+jsAFVdH_>TP=n|2e)IkxN-9aOsK835%xnz<=t}U`u&?XZ(qH7 z{iBaA4GxY}S6B7*jaJl_wzkx|on|Chn+WUEVMof(b2K;C?%A{ZnUi~6?)-s);qQFs zTQ9zN%xtmk+qdiF(+3Y7+P!b@&Z^3Cs})O+ZgzI{jW>Q-US8hZyd^)sC@;^=ey*+C z!tA@iE`pDMp zyBb>Rbp&kVN;9IiC)>|mIed6Wb8~%LTicEuyOE5Zd+tO-P35gyclYk!ckrnrHWwx| z!=)=XKmOqC^!UV;E7xjj>TcXc;Sl2BVLaWli+iwPaQnE^U}53+js3edi+>X38IrJ9Q1E(solT3b?3I` zEtM5h6SL=UT>Q#cPGMiUcJ2DUeS3H9Y7odH7BhYpnHS~=l_>h*`{!%7Y-!%VlZYWH zsUsVG`}W)KzxUpIFgBPm6y?&TOR$87EmdXtc_RZOXWswd{=E+0swdy&uBj}$e(TQN zyZ1^;N^p|HFh)m*IfqW86?4nmZ@l@S>j6fKm4(GV!GT65M<aU%q`{?{2%x^2=YogYgP6AC5&+ zkh8kVN}MGFJ$($yX0ntOl{D0pUcG+n-H$$k5po-5PbA;w<~oew$Ok|C;g4X1$P;yS zb$NMq#t4s($3(z{!=WD-7$+Ry>8B5_cp@gWe34us2()qu3+$R}y`oy5p^a4It?U1! z^j6IaZ6*^gU8FSdNTqG3ap7Hp9@$KM^dG%aCl9`L}vZdgI2eOP6jEp2kYCX_?_U#M{M%hWahJ zxlDMb--H@QlRV4mUR=avw^UP8A`S%ZTPc~9Kq%62%|`fQIxXQ5X+Vl7lI(E8PM(9R z$7b8JXV2GOI8;+x)7?Gri(kAwGBS4Za9~>JSEiB8&wn=JL zBpf9S5DPFp35U_eg=8>1JoDarAD5Mt?c28l=-t2j-j8SyI>t!}hY57W=P&FtgyS)> z-}uJYw{ERPKtV4b85uf$;@GxrEtQpJ1qJ!=U<7Wv!;U1uc0~n5PL(xl@uKoLe|EJGBb7bG%ZT-FD9e3}t zOJ08Ys}QdJ`?t5XH9dIH4=*e&b)f%k zh4~5iL(J`4Z++0+-8(WeIX?LyKQC`|bP9W^%W1!KvE6F1hvF+9-!gR1X0?jqs9M)& z$i_Z>Q=4Xlyh?)?Zj4&a=Em#R+FI=`DIDt`N2qcz)S@CsU*9as`;{vfIc*IM4X=Isg#~ZiZa0K;lEp>E z)}1?3K{S;+*b<+9`p}*|yX3@|x$cpIp_1SE?pNnMfh0=_swtZFVn>DjewYe|Va6vHC1^!iVJJ~K8>f2=urQbN4TD~l=5 zpZ(ciBS_ZP*515%3z=@$u3e|T@l{iSTV4+ah;fsWUF%i3ljE=U?%mtcQtxtF`VQ>= zi;I`KQNzEW3TJU!+8!4Licnf>>_`&x0ayZgb| zkAL)&tLJZi?OR`#60F7LcIZb($0sHxzy9^Fw$yBamf^y=bEos<(}#GFqgYW|_TAt4 zR#CBIczEg0{@b6mU%S~*{UUD>M&VcvPERzC;HsZrhyp0gH{%0ln6JI|a(;f^%*^te zZ@x3wH}u=Dp7tI((0~8Ii_e|fQeC+`zkKQ9^^)4^7hZTiH`j^x;%7g59mnvY11;1x zh993keHzO-$}UVU90oQwdoBbc7lJ)RWJ9d{Pk)+z<62>{~KBtdS^8OZFZ;dKDIy{O#ZV$Y6-=+_^KFlXBR}8Bfj6E&6?4`Bs8RNKt&` zF0T%L;DY?)?7u|Gu?(*Vn%G<;u!@ zk`JGK_Aue-on6B(zkGE6K8}CknKS1uUAkUgzNMnn70yXPvM{mYIxQ?jvb-FPl6n>Y zo4@%Rq5+sd$S8d~a^%R~y}JwY1S0p)@XU{Y{5tIFh38MYT)0hgV8f*)#VC=`CiMAG zn4I*K#VWA$Bn%^5A()_Z$m~LTLrQko9ujaQnjw6sBwUP*O~4>u`}Q~OR`Y-SfBd`U zRbQ^lKELRB^Ub#)UnftVKq!o7>QUpwu~rr0RmGvv($a#~-qu!0&NgRX`^Ov{rCiZeIRp7A^W4cfztA+L#wI-C>WCWgIzjJU`#fHdabcA|B1a%O09(HjeGX>Q)Lx6P)@>F*dNK%9se2x38jT}EOvdqbVQ-H`Pd@g)vx zC;?nn9G3v}@%Mi38@Fx=pWnWH+gn;1+3pw5-MMn^?6K2_L*YKtavi>FT3R2HlTKnrug@*5lLg$;97 zn1x{szLkJ5>crwZ+O{^=7l%So7irr@b5&JkMX}T4_3dn{`6#ad4L#3^_ddPk9OH?J ziBqReJ$0xxuu86y?#PitQq@V*z~C5y&bMFws>5OmdV*D@g-;(nMkdS)&mAS$51S=n ze#HLasv*zUtTW_0O^Zt&rV$ENR*E?#)lgr|iJF<1GV4=SrEWt?*RZ8LFVAxK?npcu z!z@-`TL7ZPzTIu_y@zam|LCC>WKzu3kRU0i9=}PFzTg}t1W4{NvnK;${Lje?AzZ<5 zVq{?K;`0dY zEYkLCxp!}h2oao2cDqfI0=HCbDGUTj`-@328joJ(<)tsYaQcTo{D)vL-nxIQlZeS= z>dLiSoPGILGS(7nYa{9KeXk;?{?>2(*6y9HeSQ6;z<2lb##U1vj~7P78HWzw75nH6 z*2?yR!n~TA%KG}o`nn1nk@FN1pP9!<@ZpC#{q)1Ltcp+5TjnH3o^I^D`jpsVWv;yXOA zw(x}6r~m-}^hrcPRJPjg07D?@5V#=1rKMzB;9*7aDB`xdy7GVVFJ8NF`SzhhJFBWH2#=y~Av{R} z+e^@Vr`?<^DzuudUXQ1$s;Imo7jj290(qT&$};G5Cr%tY@@#|E2?Z79Qa2yA_8ZLX zHt5<~UMOHt2+y)&oRQ-03}(H(ByZIl=ouX`y6oi@Rn5(fxXK!KY%MLdjE>Ic^_I5m zZmXzrRYY}xXq*&K^6#0`h1KQuj&Al7XOA>t7AX`YO(5CV(~I!3f=6t1>r?xDZXvNBH&o9oOn)eawM2x@4F460wVa%?Co2I<0Ub?rs?2Y*XSKdE! z=YkP&oXrqfSPkVa8^cLk%F@=*NU-UWpNMi@oQbxGs34M!M7?72eF+y9$(=Z&gkA_o zek4O$L3Nj%8uETuN-(OozxbQBe7kwX2|052lV6-St5oZPY!?iVB1eV93hZVoATC;0 z!b+X`obkEU3un$xjE_bVq5LxEy}qHT`RUw(Tzq!O6EL3b+gfklyn|n?rL|>CRb6Fy zUBFLBF}^z{G2+g(j*ZX#?B_pOTwFpt?d!+;aL-xf`oH}@{{(BH({4b@k;h}r(Gk#U z)%aP2*gqVI9hD%BA{Hqs%KMXl`$xu#LM%^B&6RJw{?5I7 zU66i=2L1~EKZNG&ISW}EW{c$yfB*NMI=UOq7Y2vjWSn1}zH#^F{Az`WH%a;pR?;yd zt!=es#RW4nlRn>aO-+SKm_0%Z^PcP1yKlGOs;jTAsxCsggisK9fMpBTi?qRiG13$i z6=6;U?Fu20{2dW3mrCHLTwa;~@|REDzH{x(H$V6{fBZ)#qm3U=N?1hB~W!6mine}m|G>#T?4!}FW*gP z&~J$|=Ny3i7YZZ|lsq+v+^299qpZ0&&y7z$6%SREI<~JF!GNh9ryiX`5$n0r@w5JZg6H-f*mLpR zm4M&>umAK9ipmT396IpvnU7DMdae{@f;7Q!qOPRKGd&*Mb zFW$u->$cd46pH#oB@G28GJA-SBzcUSC9IidtGm2pHt0#kl4kM@kP1ZdoCxCB=1rU*Kk)shUv0X~G&Bg2Lx{$MDO zms`mhrIQ{H(JS*#MOQfcj7gr*| z=~Zu$(?+_T#bGwv9VGLS?!_>1C?T>$un3_*BNOH5$@8{}{v-*XuG z1Fm2p0|f6&NQC3!loq9(QaMhjtmK^~s1N_5h^S4_9|K@~>Et#Q4OZf4_T-U+Km5^;=q!@qqnFhJ5m--B*~xiFp%_VxNb%M+u$B7)gw{q2AGFB)pfp!=bC z{91bl^HAT?6j%xD+9xb7#HD}h+pjb>l%x7!FP)qB{n?-WrAS*M4M~{M6L=8z?A;C{ zByLCx@X66RpEr6@JFc024zr1+i&e5X>sJJS6p$C%26pHJ1A2`D3 z`uYa$_fKQ&wdVL`AU%@GI271drPF8s#w%YzDZ$_Q{PU-YZiCYL{7W{trq#M@U-RJD zK=(k;!2<`%x0JDz(WEXAjuMaN%*$oE=2r+tjYyeb$dRJb4(A#hRaIq8zPpg^Mvs}u z7@1hc1X&`BGaxZv1EW0>F$yFI6>s{FTq`(>QKW8(|&yz>!qP-R&z27^F|C};4Lb8yM>4*bS} z0Mr^Yy2EC}DIH$%dF^@T`Bf4Hj7Lr!FRm=~hDeno#T@WYJE=S!9o-nsFr-8x+7xR0 z?#8ByyubeImDa6WkDqECo|{;_9|T)uhz z>)-k+v7^Jocz}(^W z#=#>I($Mhu z?yZ&nsGc*>b-$0E6uEQoPhfG1goA{Mx}EXqS&<^bi_i&jX)$wQ(ztu?0f+w&{_qsZ zh2%h7y%vZ>{foo}l4ywX1*4KHB0XFX4%Q|k)v2Q{A+*Tpc+|ISsW8RF34{?6qFrA8 zDsFrt4u(d@s-DURY!AwHr+c8Fti-$A>^Q4lS?=3S?f&!h}eIgWGf$b#|@uyGhJ9%QifV&jg!YStG#pjJZA)NKE9X4#t;ggpO=5?$Z-iQREQbKMv~aNsS8n%SpR*y zb`yZ+8CeYm{dILU|Lwp1Ij&9OVy35OTK2Z3%+{0vBOI>hwYrIx$-5m%j9Za4!JzVm4r#;ICLvVTRbPWch>SA9nbTo!fTq+&w%ziunpp zORkF{TM5oXSSKPE?TS;3vv6@K2*$F*A*uq{XL}z^ zD!s)!01Z6#>~_d-N9S;NcUNUI3|L*8P)?zUIdZaI7T;=tIfFM?wwF}LF5b>46=zckO5Yl01XLV<813M`AWz!{9K z@*_7G;4wL1kcu!%X_W=r!_k6?25*5JCa%WZ;zwN8zx*Znznz4A|HD7Lj{^Wq0LBs| z=U<-#bRbE91Rc1G@`(yLbLQgx{*{4&+3VMDu(^*P-9NJw!QIGPE?jIM8=LIvo_qiO z3$iJOtaNpqSl(V$UApR7xOr<}cFuq1Z2w1R&U(Cy8etql|o zT(}%3yuIOY3X=ekPDrm_e@OF0peZW-85o=Kh7;vArSR+z&tK{pnwwu;K6mZ@$kc?{ zX%BDW;31A+24ufw(E0y4p2GFVgybQYTEu1n#e+(MjUUAnp2X!Nl6>S)h(It3J%!Zr zoh_`!$$S6(_X!(Dt9a?97ytdg|D%8XuYZqd2oB=o=TSsp@@AOFp7zxFB{6-uJ?Ar#5+hmz;cxBvN{|IN>TapwH_TPVu7 zrMI=UI&30kM1U0wBw<0dAX7!u#*n7;l2n9N=1@o-vU; zB=jWC8fi2ne&PFFm|Gng8fj~*`Nc0jeDGlG%C!gW?Op7H-rnIW*L$zu?8Pg-e}B{9 z;5f0!B>mLYRjsT$Ae|Y|!KN5QB z>n~5tPPcd7BksGTvMdRxkfqaJ|gXAcjR4AI5TP5;i+wNU-n9=Di=Cblq049*iVRdYAA|2}LYZDQOf@Q~!T_1k8P|ZorW-Qlk-@10YooU>E?l9_32se`)AF0FKQ-#6NvB^A~7To;S=F*c*l?#bD?y@w8L-MK9y zY_j21Z?LAm&S)_~8w98q3Jyi*Q%RdG+0oJe(MKPB=}V_eOAA&!F$G0a0{BRO6s=e7 zFH~DHrQ#=#yEcEM*&9kjYT0P>EvWBA@IrE@L5yum=&a1f6n~*rPmByxD}aH{o<0Bc z(?`ip1A96cR-$9{Ju6eo6pQeM2n>6`l9H5y7EX>^+3V zXiP_j>+noL!!tS;A@p&q8s0(9=t39#&Zwk?>LD;?gQH@XtMa6f7GE z9or2}m&`H}L(#4m7d?0HbyZdsZ>ics9E1+*GgSnpaHNjx+qFF@qU5lk>VOYpvG(lQ zQB>ff^Tf*_DB$Sjgo3Wsey8i~*-Lctslx}$N^)@k5thg(N5`h19&_it z`O5Qod9Ii8UV8oYH?fP>wKUc@mV(D!RbRV%|330wN%IicwNX=DOB1=VXl&T-=={W- z-(sieMmlO=9tboCR0wPi*gYgnVG%nc;!kwgI&4^Rq0#$~9@aSwDT~pa?+S*(%fXy2 zjrBE64Z>oXxhg9QUwY{!o^rd%D8oi0L{ZHCx7!C1Jpb?i;oq!!s3B#FM)j}1{!7F_ z5{*$A33K2(dKjCqp|QBK>MLH<+hCYz2SVVe#o>tuU4_o0&pb^(QI&aP%4FENXSdDb z^m>JT2?qf2qSV_Es7o2k2fq`pO_(_8Xi4E01luLo;Xvj^R7^n~Dr?KfX6A^=KB|dh5yO zPchqtMMd;&*MS{P+geE#V^)weK>xz=y0q#mDk^p46+&6eMw?($(R^hb661uCJNC*lYkq*z7ja z+Ma#tIFKcXVu<`$Tsbu~BC-H;bm%o8Ghok`9|Mn1Ds zD&p;lXZ!oXbrUF2G;Xu$z^;mzlGobrj7+VNS;+SEc)}MhT%qzzOI-_=Ko}=B;h+BW z%`*iB$c0mri`Yo{g~!1nl)J_lh#e~~BCWhJH}_w@`R3bLHFxZ6+pstgJv* zaiLVmMrCEC@4WNwpZ~c}F)Yu_P9okw3Eg?Q#LzZ1RI+P6I&*olf11ZwtRMamr=tb_ zN;Gf(Y){ghAe$VoB$54}Zae%Fcv_gzl=_8)w9T$2=axeVFA?G9&mOJx=8MGQ;ZQ+= zTf(XqVj>E=K7uTRjCqiff8pYuttw)EM6h|)DPJsCqR8{4dg2e#(i9mUf zn>CX}MQ8`W)&ko%D}K%nO-wJ&?>V$LjK#n#u)>jjZP+(PSW#nBV;LYS;6g1fu6P5% zikdRXC7C38)8~s~e0MrsfatQTJYG*#SpoEw``J=Xy=i&H3p@nzi9~H6(t`Fb>r8Tg z0M^6=DTOg5j&Jy@|Ls5L7Z-i^U;R!9lnX~HkVueTi6lr7TWW++N(BRx zGJ8?4pTj`k5ZRe139wCX*XQ8MCP{z$cCz71V6g2SW9&slJQ90_WhO4%KZqG*I4>Tx3y9oyk8g6qqsy z4Y-d2L>C#rC;+>wwY3g)Jp$rM27^t)L`q*+dgX5dXIBAf(`U2sKd0)CPgKKFlM-NP zK?tCGMQ)=bBRt9Krh=?!0q$M8d_F%g6#Mp(F6Jg1b!vJMzy~~VK$?LO!)l81s~J)| z43^o**y+>92$Z)-5Pr9B-><1DbAnZ9vn(zKddCNM9N39MLUavQKlv4Ioj$VYyMFU# zO><*SQynHbR4RJ&XcnP#GkT%g61#SQ3Fv(wK!_)cSz&eqp-DnIHi;Krcn-aU+6?}b zZZ#CiBZmRrgXrT4-MQ0|2*sLfo9gRJ+5Er!1c&;${u z+qX3uC8i5U!HA0KSRMr<Y;oioNvD=?0EumAXmH=2eGaod8P)^Hb?;us z)~#(vkL(GCQwYj|kci`>+yzSE?%mr!CPHjoSo9X;J254&&fVR8qyVCFkZun z!F3ZB!F*FVCqg+CKo{0R-=m^ zLUPT49A)s?Julc7nAiRgf*ZL$Qh>YAI3&}NfM3F^j75}93A&PhL6pPgLT17^BMRL7yP?+N%Kc`7+)U|TZhh{Ts9c;ZlMQO8j*PRzap${~=LMHK=GZCemtS{E^OQZj>F zYn?B+i2#VEWB55(P$(U|kjDuymEEx-cu%T2$rzm}12GKfp9IZA-ekyG11YWkFrbw1 zQI~^U>;&*yYy$-~Kg;t(d_LcUi@9|~jVD|DF@_uV5lQV|U!UF;b-P!=*romRWZ?8cfGC9RB*6M>6M zlyycFV48`=AXSbvHHdOEEOaC{*Gj~Pu;7_=UXCs20O5r=+N0LB{G(WEF) z^hLf9NKHC+t9X|6;>dDFSw5wHBU=?t4*ouINfA*4#D>ik;=mi&?Kb!sXsaYBNpI)> z7zHN_qpR2e!2KH}lsgG^Ulg(z0mEsn{ij^sM^G4joDyC?;pnG9rWI%YImkb}gk zh>_wK zrQNYqj1(A>!pM_GnUFCN;DulwL(_~T1VmE$nU&D8KWroiGnF<(sJkNj2OjC1?72yw zSnT+j&12CDtytA3h|U*EB+(EVD~u>^x9O=Au7Wke@oPiv)0=X$G)jbfXaaXxwCa6^ zXGNNkRL3}rh0n5~)@<@}iiBU0(trXD%cCh=+#%|Otg%czk*(g8BAP7SgrW}t6ctQ9 z&cq>C&wwQIVRbP*J#yjGRfw|Y041F){TIsau1!fIJ=BPOUb-GyL9M-x(N4)}$`ERq z3TeC?qL5i@VVsb^t8);uEv&aT`gG-Y_1`tMNy!DEu~XyW%}UMc1(Mti;Qks5ofi8# zjAd1&;40lS!^qZz`-$*ft?j35U|BGg8$ku%Je6^NKB0wSMCUaN3gr^8F2AbFuQg*& z)CcVrQgI?-A033K6sBYm4t#MWGz zlk-I5)$EvNUHf%;p+B|Rs3oq2Hc%V6E^(&Mc zG?_Gi-B>5cG$G_206Rg%zAd`Emgw+Afn?4_KtlwRr9UnyX?nBEWD~qaJcy;jXcEOm z5kj#vQ*ZH+CZ32Fk`-ps;)UT2cp;LXuu%(M2s+N1brV4qk4-gth!;|jagE#uFEogw zB`vp<-IKmFQ`ZGGT+8>cVmxko)izSaa4PMA$3Dg#pPm;+HhWmq3$z(t$az^iW~za% zt(Nsfybuc!+jWzd{qy04yAFc=pRrN6Q(sC8hUs1MpLq~fMc^TJQxhtFWTHq8sy z+c}%xBu~T(H7DnZ#;e(}C*y@-0xQ>CYSB`~hqA)5`UahVw0`so5WoX=w_t|CuO|Ol zF6Xw%Yr{UM+u6LYNVdUh&>by>)kJz0Ql3=HNO?%Kuxa`tSu!z+i0XnO=|ONBLTXbO zbROx0#0xjuE@l|A)#VnHvE!D*Liw2Km0ZSxX9#19a0ot1{Lm~h$vmb7wQYdB{+<@kyEpxuIyiZ`nle)>Lq z2Gg}^Uij&4q))^PH*dXIZxS?j@1}SmpkLll!eq5X!rF!-Vn^h+g0CWf5z#l9&`$wg zmx;c8$eNV#>I=josq&e8$t|Fq66z=_#iJ}n1tMFTiivnvafxzv8QYW!X-k00r&|!} zXu36Zx~M|YM0`-jx~pa_w3{Akuu7 zSow5#s_+K!zqN!w9m&4Yu1|rAl3^Ix=V059;j zOlIak8@PdabL}9w56H-Lv+5CP9YU(W;vLJpF4Gsr^?1jgaGhl0XtIhYI_L&^p%e%v zF0nB)H!I$who(aI&t!&y!vN1G`-&{>YzwNygSE@0ULe`ugIGwhuPnC0!_TP7lRoSk zSTn^CDFK8p4@9L_TQb6&nDxi@ZKKWg>-@WBv$5ULjIZvYXm8aiRg72QoWTnvh+E+(QtqcDirjk<3@sq^9=()4hyuEq z4lAUMyM%c%LPmw;n$rc1amzEuH z^At=d2W#dD?ez)lPJ-n;dW=yD6<(;0AJGgj5zJzZLDd8fl_pCPz-?Q#L$Rz{Jy0(Y^ThUKr?7L@+C1f_ zEt&17HkGr)YxgShiz2-WlSSt3ni?yr4=>&1wGIH(CZAsSHbMl}E|TWZXhNmuXB$*i zQTv3QQ3M6`^Xv6N^BwE7K=8GORIABaK7AiP;ou*7Ow$gomZ{QrueWnHze!+(QaIG3 zS4>M#(43qn8n0%@)O{d4OK$KXUWos0Ig$j}1zzaXLS)tCDC!(%kQo$BEAB`KW6S6# z^7{ltZDt;_W+=jWMI5s*or-w!%ng8U$WIY;YRMGTR!@X-D`8rSmrG5c72Q;=hN=}- zn9ofgdST69L(Q3U%ccpR zV1#Q-kuXBiBIGW~k!JFDZNw%~?C#M{zzbF4foct(fEQ|XY`s%~>vQu5hJf45(4K@B zN*c7p3k7g{riE-AnPvyn3nX|U(ht$aR3=%+9c#~s3Tj>m?_TTedm>&a_Ufji)q+nj zmz$q;VR2c@k2Qxzqn{Hmv};Ait=9+5v8~fW5`erl_p{A3)T~e6hbNfyb#L7)FI;cu zY<`nG5iiu7oF^KuX2&+>h5l%AdfD%bBrP_F!7H*aAGze(x$=)Ph@VUx)%A1~LK)9X zN1_T)rHtDL_zJ}zkmZHMrbR@}vm$j$IxRc_FZ}d612>qUVokE=s7Htdy@9+SS5S4gN#A`pYLA(Q4}3gWBLV`UWTP)V~Yu|zZHTFR_X zUm4E+P{%bVM;)@SP;=x9xo@LFfj|9z_zBYbE=1wV~2E=yQPu4chAIZ&p{LoAp z6En;Y#+T`ss^^)*BJJcy8&fZ94BR#1#w4q?orJDPz-cuX$c{YH@zE0Pp3*odBBwMK|0|8&#)2>z!6OwbypVn9~ES6Dbd z-;r&64m9Uqr2lG}?mwqdh(xtDs_7F=jv7uu*=Cx}G9#L9qm5_k*K~(wuKlli*GPpR z()co;(>y5cZvy%GbLv8RfO1cMqb?ayZ<8HU?)*)tU`8J{-*e45mx`SVpd|qPuC4W9?Gr#`lV1P_Cj1XZ_RA>@4f*t}5|MhqAiynM21F9ML zRr5j#kqZ1hr@Qdq<8TiedfpvMIY}k=6L}?sgVEF)&B1_hC$u7wX0zhAs9|h=_gmtN0;DpIx z7HZ%RDTN>b#O)(t7uhrm;f4_q_@W4V=8~bWB%M;QQt~d856DcC4G{5Dq^nB;X!fEr zawLxQCxMEINlkvW?AHWKQ!dq%4Ko#fN=&J7kW1y>0+dBFn3QC68$Jw;!HNWRQ64OP zsasI@LG!zerzN+)VGGKX%9HRIld_D8Cx6r%PGW&VI%gm<+NxANbc0J7uR0P~b2#!; z$RCEr{K&3E^`dCLOmpm-cS>W|tmUgwD?zgb0L=k6mk_Sg?mhXo4Hs*pdCD%zn(WX= zA61QFV;-!2Smd8dNVx*OPU3r32T z6#t>`@Lh-m|5a!)V5c(pwbZ5br5@%ZeOODdWJJ$LwxhZQ&1To*2TIQ+UMNs{6=bpu zt*5p%1+m44o^SG`Wk;dP^jPNzrRkBNG7{K3uan4Px-)B``{X`v{)|a^rRht(bCg9< zf6+W+^osO$u#zd)fb^q$HspnJWR^N;=#lm{g@$$dpm20;UMQEMQr`H;fdaggU)Z{A zSCBP@D5h04NtCOV@GS7sF>09)3HB*n;w-^wB;LT~@vK6l?M9PR!hMHE(*cVpydc04 z;Eu{G1PFtus~2BfTI5ig$(#iRN+JdFMTcw@Qj(w{c%w`-i2RZhx#$cBhQA3H`@@w`-1ABKiFziLVXj9RvN!xww%b2`sy1sQWlzHZ zXsfGB6e)y#u%X$kfS~vG_F{J;{8MIE%KP}|`1mCI4w9(+NF_<&)!7wFzJyE=Wwt7d zy}-r~3=FC*oU)e2VH3ODEU?%!A7gLt7}d5A`DNIYMI3Ks3v;Dz=aiLMovtkYD#b3)7dcuyI6OQ8hB6q_BJ@3TL1tvNRh;VI_={!X zxKSAZT~HDZ#G+F<Bhm?&-pul6_=->8lp@bPQIzSYfA43~0tW-)4p2IC zJ2*TnS9 zOK0cj7FSjna|ErFGTxGWFgiZQ&FU5qW$YqB3JE?E3Wr!hlPFyvAin{@4*@hT5d6t6 z6F}x)T)*NOc&L^yxoy5sG6eFvk?{U>Pvm$rYMM|p1r~Dg;zjCsaj|TyC})zwLkQXh z1=Jl(2pKRFpVryaP4%z3ItuPk-yoeG(cjZ|zpHE8wiXdtmWiqoP@J)}If6#05l-=@-BXXiXlwN22VaP)XSHza@whKC)rNL=aD2Hh{DaAx2VcHF)>NWO|N%l z+qR}lm#)6^&U@|cce}fL=I0kECBp_rij`l7CXC^9W@ho)wdJS;EDMe)jqS7JLA z5nSNiZL+(PqM&uJoSP$GsvFi|3q10ycF$GH0jktvx~5(fNFCV!Qpj?O$k-H42cv;v z9*W{EPp=ByCfzU-OPK;JY*(&c?d$8St*x~=>*&Zt%&)M_mDdbem z-k=PVs8y1lH-&d{mQgnu<_8~sNWN1|bv4}AOg;EaAEf=AZaC}wDvkUXru3bZzU~^L9*z5OG?l)_h$Q(oZU^SVqT)XD; z`zeZ~w9wbzf9v*b3RxEw7G=*Ymd|+X>hAE^vm*%SwbtLlnZ;{C?NieVXS*t^<=k)T)_O zo>w13&65rz=d<>GzxLSOP16SXMllmqc9lM9!txL=g#UR0FwQ20B+uO3$b%j}i<47>{r!<>Y;k@8v9P?jgvwoss5s#x_Z9~`Mi1`T zlM19`BMf9P?@RWv9Yd>&XK{P`N^5d!QtTi^1|>0 zCGEqDt20AmQ={V(qhoNtqT*r>=g7dsg)^6j`bP)*Mh1F^M+U|s!PwI5{9t#_aPI)0 zv4NrSp^;=bTAWvq;JvX>JJq!78c#p9*Pb+m=6y|#71uA{Y^d7u%1h5IOfCABS9i2* zr@}W{r{GLfSBa(I6?d-OesJ^dkt6#ms!IK_SRfiPnDmxJ(iTgeJA2Wy>?tcQbJ|Q6 zs^>&e67@-305Oat#yE9kWEdOilZb-%W8}Z#K!idrHn?D1?;)HXb`D~RiBd_aV1&hi zKk5MKC!c`Fg_&0Rz{bLubl`_39jTXCmkbztbtzB{M0$$AJ>=v7^NKShAxt!sT{2+a zNhP9~q)46TQ5IVm%ZB>LuU)xXRbEz@=Zc1if)+(fxhED*B2$w(9`Ht1eF5C07HSI% z=`O7k4fSV(u_%#Gpx8Dr9& z14Kt8dHLM6y7Iarm+SiZ_FZi|iYZo0#k5EqL|J1}XVL4HW+S~FlZW^0wxrA-zjJPB zYNfHN&YUtE6K03m+1=S+l3(6XU6PFIBY~tD|WQhgTsXa z#k5irGa8Ijb7^6AWuRwZVsL75aC&BJ{^q6IE|beM@0+Iv@Z{3)&?Lj39GUU2h6>!d z4l}U3y4k7K%a?A}Y-uPfEyMQ6)ZM*{O=-BTrM0xMFdn6PSPm_VLWhy0A(9GvV%_aM zh0cPenmXS?=*+ukZ@0H!yK)d8t z#FMyj?Y>!O-`d=4HyHqqNG0et=UtdnZ(YB$G`qTI+pbtZfAw4^{oLBpa_Q{#*2Y$c zITtn81|bUT>}G*Jw!G*$_tANq$=+C7N981}(jZYJTQS-|7=Gwoh>TM!XQJ2QQ>jdYPPtX*1TN(RBt2}iXT1L?66w;?hjtQc)p>g zZgqBkW^$&kwk1ODHPyOIIV-;4-Fx@uXJ(rk8k_2Bs|rgDG0G|DJbU!m?yXx2^YSbf z`{2+JLR{;%7K_cqW;Nzms2*RKU%b4y$_&5w!s$GxyP~AHthj{F&h2%1u0lH%+0B-S zK^O1^@7-!|sIJbnIQu($P4U$3gKc+icZGwY>WY$?sYPVKw&oUWuUPc3&j`da(4peV z+gERPAeajB+ozoO$>IUJ%P9Ot5vprjdz4z#QQx_iUlw4Yj*zI^p|(DaNzAqUSDMVjT7LMIH}@#lyS;hKEfk9;MuwfJWny zP>=$YI@*VGN!~{hY6O3h6?a!sfA`u=m($g{wE?sm!3(9)$iAINKQK%ABj!H+Q6m{C zypV~&Ii@Hm%JzrltYKsV%tezIieh*2N7WOPFd8fIAL%b~Tt%6iapTC})xaT=HD2&S zAqQvy*()8x^CW-;<(>3>ef8DVd2fIJ zu-j3xFtc#KqdO9e`c`~bE?&*ebG2=4blGf63n7cq;sI_dY6y7zW)#8l>f=YYjtxyN z&j*ei*ozU5T6>q~E4-HK7&&Bzrf&M|K-C11VLUfy- zTOH^dSe{$)F8Z%szMhJu@?8aEP~c(Eh;E-+Vu-_!Ry!Bsq{&` zUy~7&Bal9Zix+RBfHnwQ6js@AFc8ag*<+NZj;F4jyWMktpr@-h;0>)T_{;|Du5E2w zw>P&oH&s_w&rHqvz5YErTUiGT#RLfUbWPM$)m4_dFmBMjf!_In!HKVa`MFpm^5KW) z(C|u&^94shY&95$`p4#HmYzL%i0Qi5J|6T3cJJIaIy||(t*yM&5e}dm==>he2t*(i zizKdHxm90V-_~3+IkD2;Jp{B=uG`gqt8>?m?Hn8q7aIz}_K`g-Z6WdNBOh(NK@9=# zq3SQ1yl_LVBKVv*&W|2CPJ#Ta?AKr0j&j3#uh_hqYQs)$;)YG|LT?aNK-fsB7oAon zC3)Cx*XQS(+*Z?_>$gTmMld5#a2ZSe)YR0#=;*$~hj;8~z}GH?oak0py<=nZLp{^W zD+?}nzSC{$>Fe(8>pFOFuYc9MwCvfvcdOl*v*M4UO5nFxn4d@FFUZSZU0PY3nV%dT z=i_uZ2@&x6(E6f*NI173zq+=eqJLD)NKD1U8?_%F6osLMmdGms;Fz6Q6iI zU^2NJ4i|m^N3j(xZER>{VRpXrPUrOaL`hL`!eaJ#JRKb!_wGILdc8Fi{4OiQ35gRx z7#3307S=~Y;hWcQ7UdW0IItsOGQbGf0hlXc(s0Vb(Q)jzRaIrnct2Kr7zp$7sQe69 z5Yc&fC2>zKFMH&V)r!@J0^D#*qT?cqiyq9j;Y8F1?iN}jLMTXL6|(F?OH%4f_LGxCKF>v51^$+tVLLxJe(P>8L!(lt@3JH*O|;UH5E-w)xluAqM`z;9i4ya(}qT{`SvCN5`tSG>wi_1;a7Xs`j{f}TKPN&B%PO?O z=kq;y@Bq%iZsFW5EzMuPatR5$pu#)fT5cKhNoMxn}1Uarf-m)#?w% zrzVyk+#m1k>~c69KA+gyM9^Qnc(ta!e&@~#qUg?@zp%J8S6NjCh4Fhs_{YaaCquz# zuDi%#w+;=?0}QZdZ_VJ~q|4>@c!Hgs19p3!%WVgOBM>CYG~U-Y0O6{wsQ`WQ!*|~+ zEG(|9EWUlagSB+IoaFgnztfPf#KF)|0-peTSGD^;F)!3+br}!wdak0!gFifSs5imP zKIJW+h!;v}10b#?R#zj5P;_Bx9E&;Io&Vyc=)%YFRu z$4fJw$*IwW#i_!gyePHJUIK&+0J`C z?d=cvT)o;s&^)}VvNCTW5YBho%Zkg79olvB`0gVI_S-DB_6Hr$Jo5~G6gcAP)2H|E z-$R*uG%tl0Vpjxn#QG^#>yLAT#DkR{&_dX;PsJFMz zit^}i;0A}sT)%$%?AdcYJ-za$prE9pqKIgt`}cb|Q5P>>!j0NDIBYh!N(xI%dfia} z#D%lx-hb!ab7wAeb>b+s78aH$@f~D{=Q^yTL!&pZT^|}4yL-F6v97+NG{67B$mI)H z&z(7cul>&C*tEl1Xf;_7KasCL{P4oN@18k#?tD*AA6$86c8;LA+S;n&;VGQEwY4?y zlEJ}|ciuU}Kkwh~jz*JESOSDuxW$EqP$1~AI;+Y{G3vJ8y#Mwu-@AD3!chN+E@><+ zDuN?+-tE3|^+v~?!3RSOW82L^V&;ot@Uunyu7^q`}ZTU;V*pZ z*wNbhx_$e$=jIYVilHJhGBWzjZ+_#Ym!8?TcQ3n|L(Pf%&Ue0c`0)PL*5>i?3H*-i zOevaDh&th5>fW8f`}gnf-o5)rKYH`hr90=&-Q;ur%AGgf_{i%`6c*+ai;mEF{ra6f zd-lBg>X#bo8_>1!0>W$a^YefI_g~w-W5>RIdtf=}A}uYo_(s{52X;4Y-@csy+rx(s zedQ~s>+4II)nLTC;_)x9taf+zA|-5VYnYw$b>8i|e&xpG5ANM1zDsz*S5^pAL(cL9 zf-T#(x3pAqZ1MdPfdXOOxpSw(;s{6lfB3I{x1`KHJ2$z!GP7sTuIaJ4%U7<4A`ybt zOg3vlNfGLHLB6xDx~QSnR*+Y`FthBm+MhafIM?k)``oi{&z=KKt=p>!6b(kAHoGZr%FSQ%@Z`c8n7a$v_jWtu5{A8~pg=bI(5e?CI0b?A*BxvI70uy0yjc z4{@B};eYV^zeTrar|0kA>pZ-_EfNU6^UDu#JAU)!ubnu4w0g^y%a^az*H^k+dGf+x z8>}qQPmIjJ`{rACKu;Vw+SXLFvf#OT;X0m}ufF(Vb6vyY?EFw~e{p_sT}|GlEB82Q z%)pB;zPM}GF6Qvcl}km%1-o}Q&&{pezI}V^*4C93@B8n+Ut8Pw^2=XFKD}|{CiMF7 z;W~?@U}|i7=(RPW`|IpT!VgUY#QZv&w-tvj2CLAjtFO}h?r-O3AtX`)tY)CNM9Pc78><4 zq#4fKEWT&VJNUAcS192Xa-;HvSzFE?;StT)nMg7n4yKMl5WYi!po4E0Pa#GQp%*%Z zUdUJc?0C;bi8DcftaZirA&>b66MWWn^qH91CI|#2LN3HiMp;@4_VtZ4))(ixZMScCHa9o#*;9!~ zG&{Te%(I8;8i=7oW417AkPSLJ@9)~RqpH#k2?>RKSFhfJ?$_29i9`uqs<*EnovgLB zR!XzWF&R^H({t~=bB0Z|b!%HeK^}=r&CN{>4UMk+JOp3%b5m12>rX^r*_yDUxw&}+)0;OtE?>U+ zqo4l_8}jYjcVXmk-Fe0q3zXm(~2wGRoE z*uibBTT4qTjvqgR;RgwfJ@k$GvgPL7Vz^Sr#GvuDp=y?X85y-s40@IN{8UGfeTwO*wQQW+D)QN%73 zdo^Qf!E?DbwMM;}H93enkW5k9cf{K;&^#`71}h$MqyhLLseu_@hyjfqN$^-8;GZ5HT9}&Lv113umTlX% zp%9R*wYch`P-`T@*7r+RC<7{&+ijm3h5s!){mfpo#WXhFzp^^NcmK}up=pGyZ@l`= zr%oJcXlb-LZALTk#KDDG|Hbq7&!4?))*F87m9HPz+i>XMw*36ciEOYg5X@V* z?(w1nd#mgYm(^e=N~EEtfq0hb@ySysPafQdbZoAuF6-{@XNr*4<$ZwRHP@^gADJEO z>woU#Gds4nn)F6|Ki4i@f8o^Wy}Pg+6ADw>-FctR<8eKA@j8~4S6+F#yxdJHT~SdP zf-L&__U%n`bE^dC9z3`w5C~&UI&%2f);4^;g_wXipH)@W_#Jz@dbc(;?buqovgkYW z!I`ZsttXD|uPS$LZP_w9G&?;pxo6i7{4PPC|K*pyTD7$5tk*s_vvFFN|qfWaU6U z*+#1HLfJ+tlF>405(+Pj`Ax!NmWsUp{$)g*7hZUN_pZv4VrP9r&6euiU@&^+$_;EY zFTVIfT|-eQp`RF^4|u%L&bG$peY&uFx%s7!Kf1gyyYS^NpF#^QEOcNs#XgL!;B|gkz$mrQwAapTiD( z=+G|K^udF^hK7c!s=WMsXKk&J-I3Q%o;>;V(??253U6Jz&0nEF9UWb;Oz0|MuH{=w zK`4;-ST@>L1cIs!0Zlr^(T_(h^+dF6DO*x+4m$P!itFPiiJW!0Yyv| zR$YuwD1BkAhuW@-@PdU_tfn46pHZMpaX zO;%gNzhv;N`mjixK6!H6iN>Cu$&QXrl)~BBnW7>mowpVjk%ql?W{C~qg8Dup5aDI4 zudhJU@OYvvEn6lgTEsjM;L}=LR%X9*=k~`R`#5+4PC|!)E1sY4XlrZh>FN2;|8;iv z?(HqL70;bGUcbe5>*}h1#nW}SgSgn~rPb1!5*lG{m7Z`i6NK)BV@2+~wub6_hba`y znHm|(wK?V{Cf*nx#*7S`4z7Bm_&P*ZN%YX6J){q!s}YzZPQ8?%tz76;#l;0^w8VT5 z3?P74?%&^HvE-GPS%!u~NDR3I9qAG?W7Dxfhyc<%*AY8Hxw(erx%pT$77`H_`l^z$ z{X6TH@(g}I!2~30W;c?A4J2P$Atf7b-Y;%Y&4AsWGd#RXMo@QmHl%CbJKy#^W5f#l`tI-~0#%KT;Zo zJGfC^vHf>`@0$pVsENPzTd&q^DSQ1NFO(L!%ggh(YkCGpXP-UL+dFyhUdIbxdESDfK-BZLk^`dJa{AHHc{cxZ z&pn5>^#1#2B9W)->MNBSNL{|$F>vP0$0Plt`OX4VJrpvB!x@cwuyCF|dy8Sd_~NPI zkr^5%Nd%_CF@NKYH@dnSpaV$2@J0NHot^y;dO8sljy|=I-x)h@dYA^5)h~bfS(qsO z#HsO(Z+xY&(EjF|7o)~-bK@3C7tiqr$i++%N9J9Q@;aE){QN594!IU)j1hI2IB=py z$gxa?h#lOwe+NgKpdPE$!b$gfLUnb8%}p=<~(x548{ zVIXCOZC1nNluwxiI5fij&Yd;Us6JuI3IFrWYX8kV;_LIm44}MTpRB4bs;qhjiEO54 z0J?bW=u_KwH2?G`Z(`Cpar{I{+0A9*rgrbzx385n!eCIhvJx<(`J|E#vvqc2UdV9) zomH2okJu=UXen@;b8Q%d?0QQe5-%?*u08#nOK%PZ0KQC+(t*NcF(fT!2RImmqa(U@ z+p}MO-r{ze9Oif`nQOOx>Ev-(9lphiF-bw?9TwY)cXeib`r^kQvwO*D%S&c9vC8$DU;0%yhI=x zHrP#Wy^A<2yIG3>A_r^O14j!l~d0rO{yDcWC(NI-XhKDn#OMK;}XC01w zDfK|UsD&|4L}rQz;b!l164x#{(u!R1r&%5htco>*4Qf8k)l=OIAR z!+*m;V_tDlj>W$BNJ*|cH(@kIa-wFpB@mB?LON^)P)UfNA}a_WN{EX=A0~8GPAx&9 zlVWt&UP|?2^`F#PP|EL87^w_0@=*AIW((?DG)tmCBphU-da&&Y!+=PI{0vU3(oeO& zklyl<%?}Kd0DfH2{8y_Wrs%_hCpf)0?Th%1JbeVckS$Bb{M7hFRDeYou3WuBUhl2j zHv}4tLAT$0qM@q9X-ByU#v{Z`g-L$9b?@f&_QZpM?%(_FzdW$N73=c3^Y=Qs?htiJ zVAsm((!IOq7Z+BLcgstQuU!8Se)-3L{GAu9l`_}MKUnuEG#U>;)z|mTi`>84#?=tzXW-c z6HDZ{oW}3J{ucHUq~VE?!T_rlbm{X_u$a<^vvX*-8+f-j2lz&7zI|{HmeDpl8EbI z$ZNG3tu}+*fhjw_wCu$S?{b6WLqJ?ABEg0*WK;_rI!LZMLQ4&}7x7O;jAWV`Ow`1T z5}2LQ3zfadF*0R>wHv6nn*S`*5?|GxaA_gRl6al6=P6Ml{?q!^ZQ8oEvzcr^VGo{;annd%TVGm zy7wBU`iD@12p2&mBAZ^wY;&E-SGE1mGot zez@Jt=zMQ)|L)y;Uwr0pAh4&qwc*^ki_?>b3Jb_|uswa^P|cQtg-|?dHPRIHB1Z>1 zlrCwpa83n?{-i9Lo>I>#r`wH({=nhwD791|T3LzRyVo0vqD|&im6Z^zyL)@}>?|Iu zxZP@KS- z&%S5>&I1P;7XwM7Q@^wnnw?z;6JZ|@JG>MNdeXO_Y4xcz^H5|^hSs|o^CPFw~ zef8@k@OZ+}unCBal-q6u#vIZNwh3qlrB#G(RSb;}Ub=qq!qqcYvuSY|Uj{77Y>EMA zQGDRwZVcuppM9~Rq5c=Yc*9-jV(o}zHakr7D|0XJ{+h#XlOSAD_`HB>!fx^An{Os_ zq7#$jusSk)r)R8$nKU)mEiBI8>FiiuSuQIrFj=hRpoYReuW$9|uV0*+o_hZI=h>K_`k=UPslKK@nL3#1^STK(jwgowMJ zfBrdaJOT0(;3`HPjFaIv)R#u%sT(&*PZD@(#1kAkybl?jdt@9d;;LcfBBebQ+uB+` zKfh!#=@0DPiRBj0T*REq&UIQ%3v-@ZH#;iIw-n^t^9!ucoONu!x+k8%i$VJj}K&W}) z<@R~p< zn$(-{X0~i=`w#!|-~aKy`=dk0j#{0VK|plM;%KMmI-SBUh^)l$0ADg%YzC*(iiXGk z3JUVwxo$*Av?YtfXeDL0ApgjTt*2gWYuUEdV6~vKlvI`{5T3K#) zIh2J#;zsu>FE7LN0Y0i+RvwnA+`zJ-QQ;%OH-Mao7X)+h&fU9=Hp}AbGAV-j#Wt+b z6SK3o?%f@qo%^9WK~ zw>H<+Z9%rfEXmEt8JOuHa1!dF!0E-ZDxe7FE2zrLZ^`}lL)VPxxW4F zSN`-*|A1f<;<^P<(-~o7Jjl6NT3Yq`{KttU1nnJu1 z(FQJSX-S^QWRvkGK=@2wM5^17GA(96_QeHh2D%e%Pnpl6LKmKzw$@rBeLCXmMip6P?W;~skBLp&%$GqXe!Pz%{`R>qAKm9BzEygwj%nwOcOg@1K^pL@R z^{ZbdKbx_WfQ|m$*Vm8GkMcS&I4a|tOW2cw7;bV`d~w_7F#`|b&O8)5lPPQq>4da# zP7WM6@a0n{wzh8De`sfYa|^Mc)wMORy!!Q{Cy#8~y}fm7{ni~js%vV)(b(my*ZPM> zckkQ#oqze--u>I%`PQ+?`A96fedqRhGBe__wzei%AlVlT38rPYm{Gtwy1E|p_TIU7 z=U!K5@4z5Aj@z1ASN-1c>FL((TTNCA#y4W{3<>g8^$W|(M54BB+nQJ4B%vE)VI&;u z>V9B#I%*p0xD(7k-e?HtEU$WRw%Gh_jgxN5^w7Tl^9z3!iB17aNLP;nZx!ch(F+JbeJuoyf z##-#!vkQCy#8u)3yYBZ9u?CZV@StaAcDA;me%H>X>6sPu)IEE46c-l;0->(XuCa;9 z?w-D-RSyILC|AG84^)+dO=cU(A@q&$CW!o# zB0l)1BGyd}j`sKT9y@WOu%u9`%1g|a3|p+Rfi<-{O&jSa#$Z!yr0d1bsJkTv*9jY` zwrsl&#)oF?jAnkJdKAnU8cDro^&SC;sT3&5$zeA#Z ze_#JAuY7HAa2Qs!b!(GQy>h^inq)uh+SLY6A#9TEhxz@PXOB13*UC=iU{8Hr*jE4+!VSb4%Dn$_q1bj@O>^CXIrqN~kBdu7y&^hv zkjW$jhEoIMw%G*6=gnIkQVw5vAP~KKw+r;OrIl60bk5G!9otBeFRLoryMIq}OA|R5 z&pms%wY6UOJ;-}E>6e$iw{G7Bk$|*bI241we*J1oTQh=SI2=X3#G!cLz#cTXo44)} zH+TH_Q!jn>`NM}>Dl6UOSj7|3y?b{MSXf_Q)lgSqF&i#jzCnBxIVA7A^FHDQu|wpR zeC?~JbMp#8h-4B<%SvwEyuEE(tJ~!g_74GT@x%mQZ6kf62$T&YU$O>&84X>!)cAi7 z*(bFOm=C!O9(%)v!AYy)-ert6BCm(iYYO=2rUfTWCvrlh3u!q!mR55Ng ztm39#dhfmW*=-yrLftqXbqy7-zy3OrEcAzv1Uf@rMBHjlfzk=_2D&K{sVug2-y3`L z^*6Vl+;jT$5#khZiYdHsW!fXhp%I2abUiWLWo0FV#p44)&?6FuQ;K*?h)Qv>lY~9? z0op2m!p#XsVR9HdaR(A+nZVbdnOWjQ!7Lqa7p5wra3hh78kz+89%U=QtP=B0W|fSR z6o~|xUY3w1WY|MQS0HU7AapGGKur&aML7|O&Rg$(R8m#(r58`m%&yY0`uZBX%?yaa zyPFn6sRB@!rP6N_Ugl{HuCMKr-{LlaL5C8BFDk>_S#-wL?<#zjha#cA&Cr=&&=K-5R z60jw`F6fPZ{N6_nooQFw*6UZVRqbdwcwp=Q^k&xIDPKOPKhd{Qqt?^z*0PR2$zwgbPH<8c2{`HrzyY%%9pE+}eEwN|& z&Z_c?6DJP*_y7KPY~7tZx5Mguq2R5%cM+I=|GU2nkMAEC|H)5&@{Mo2vSVixs*+?; z5M@j_HRzP2X5l->2zmVI5d>d;hbDA(^t|`pnSb|h|IlJ}qG^%W|KLF{nFa{r_#M!D z;{>>ypjxTF{HyOnE;!fB8{7rm^ebOJMY{6hl7D4ok)+z|H*UZB>Z>hHWn&X7KmYkZ zHn$@0HC?}P2Qvw06a3Ho{9HgPumHh(uqQ+3T3g%p@7oUEay;{B}_hp}eScNf)+FAWC!~%NTzAlQ-abMBL=(<+73R zN>XWHVR8ATm%dU|RLt>bG97mF>>QGG5BR`H8(3C3ZUi4OjhLfIOXKV`wKh0xHlQCZ zX0l8-b*Wu(>*2p-ceNx^$p2LKoBAnrYl<@u0}|3mdSj~?k{vskbZzJkRNtVEKPLcC zZUMHEJuex|YW4W(gJL69jJMoi%@{n_v(qY#V9euyTl7Y{ZG(bJKt7N1!l|X$vM)>+ zsKN^|l|XF?MnnxFE($A*+@genEiR^p59liF46D^CVXugb{J`mHAmc+ktCZ6Nf`#-I z`38^2%Z3xM-H1$?W??YotmBG&k6D31Y&god^i+J zE{%*6@D+vT5%SY}xI5f(%Dr!d@DL+H!WZocM z!lwS1OJ*dZzz(37f*uIRn>rMQok5S0YRZuq;W{v+wD65 zl-H0+Mazpzgn-6iF-$37Hw=~`96o&b>8DQsi0JXgP+n`dH2|X&Pv!)I5t3ggrsh~d zOFSFKi4_)BS5a0rGB(Bu+PiC)&EXI>TcdGwY6=JE>E~X~&$Idiv7VlOp54B^jUngg zRfX!LWYdMk#i7B8iSb!TA6^<5HjEQWg*jUBFHk6I671#4DMV`eFYhIpUPuwA33y@4 zwnnOG5wEa$Uidgdv*vGVhN1AG4O>w2A@$7)FWj&N^$qGumRVk?@;GXCOx*`#h6mHE zB9MMwyihnKM0s0L&rD!@XE>P|7-{JW#ZkgAvqK*RNmYn7(jR|yB4pYK?oTrhlS=g` z$SV*KRS!jOk>ryTXJ0S|0XHKUlIEB&ZO-YH3OeqV-)dIn{Eh@D|njUe*48YT*nHEAZy^`Dj2%hT&Mu?|mZvp2J(O$$B z;#rjnK5&ZUW-$wcrzn3{^Fp;qrObK0DYZDdNYbv1HATya`KMlZ{wuGXM(bEviGmuX zu)SnDmzO?>Pv#X_oe6jm`A1zO4nV8S3*p6>zp#}tEu>$_H;8aJ0*)+15`~Q3aA`p< zkA~sxX5$yUFg>%<|NF$ekY|^cyhR00s!RZu4-G~SWJ6*z z8{;V#)}3I?R3!AC**Oo^3pv^s3k{o7axRJ!q0@zJ=vzoT#HMkQ^*Xyvm^io-^fI^$ zhH!$Vc?Grv3G)Tm4ITX0?-kID!5}VkPMNqBqE#w$&@06 z0*KdQ6;QxA`bZ+Sw7gVYSOJ1ECeuJrNT(1DPL08oElehx3Y;WCi~3MG9v_izbUtYj zWtw!6SXSbc!nrx=)Wb2j>^g5i&{DTUXeOd+6>)`_0reus9{U!td+IIpS$+S47e29G zC|8}83i^tI)S{lJbfF>0Us8r70T&QQ_8x1m0BK@8ghor0m&MI!R77`VY(yAE-EJ2L z685ARucVDD#4F*e_eZ^9OoRrCgeHu_+9r9DL{NZ4dBw(N_wbgyWR4xkC4iuv`em#| z8NDzR5apsIgij8jo;RrWCD(6}LBx*s#&~EiIFGLy?l>?Fj-ahOkYl7l` zR?;UFUP$zwvLlr+mngL;GIl^w*Hp9&*fwnAaV~M$8X(&!z`L7 z%!%bYluBDUp{PMrh?JrgM3}oscE+coFHEyj$SZw=W<{e3vp-f*Y@J`0f;z0`FLd=+q{y0#ugwqC0(C#o2 zDd&Jd5=jL?!W2epk@1G#0a=sSN{&DT#sjNm--9=Af_9_)!+6;LXk8AwKsyl7wMouV z$_9fB^VcK-B$gv~G3Exq-l5+lQ$z%AMULN3pf#~=$aCpAkkD8`yytvS+ePoRS$!dZ zdG$FGU@yOlBDd60k|+R04{3+PAu^Q#?v18MjR3h+E}$*yn3|H_fRF{;4x=}KaBP$< z958P}!4g>Ilk&l52+1(jTM*o1coC>>m=y5ABs!B1p7gW8i+lB^Y$`B)2m4o)>19@M;UZ;F<|P(~Qehuq;`uR6Go=YZC?G+F zR0|eXobFUS9A%g~m(xI27(7;<2lf8>48MQD3)k?%B#tS81sl_wA}RgMN@&?125;Ht z$(rC4wL>=OJ+dBZ0u3cqOucxC)>3fowM>~%=r*~`1|VQEMm)vbm&DhZdZ_T`V_K7G zx@49__RMbO$9F)j7i#Kca(cPkh|;l#=%7lo%o-}=B0FBbP5lbxL3L!a+8@4lAs%T# zIYqL9xOQ|wYg$0z2F3e@15fecWqIL7Yol&K^IrAP=*(Jn`;hrpko`3IRPID#0h35> zT$wSx`#0J+$|&GN!uhu5N`=#gGIbv`n^jNFLsOd4u#qa$tA3$1m9#2h=q98wVYQ}s zk{cc)3<>GuqpV$IGhi6f3t&MYB7K5ObFZq~p}5!DOPw6@30^855#SqZdQ5$I4Is`> z_y+Z3%6h3+`7>zupHvg597;%+rXf)(Gnys~noAtgB}rahJLvqxrg!S6p0S87C%Wmt zB2jTLb14>AstZ|CfGA;}&u(sV(6xCX8kO9_BX+sZhZl+>Hk+IxLyCDw_btl{scV#} z3cHzh6kdqvx0(CJ$(6l-nK@COQYJ*r4>akEx&>9wWl>!s4ysqEd-YHVmR79>Hn>n}b3>P;AYoCP|) zfzzv|ihNOb(hyHeQR+TuHmjbT4SAt5z3O*aa&RrC88W)V7rgM%-SP!5-0-k{iW@#X zFAVFFRAF7)h1`r|`&0C8vyT$3L00Z&uTRel;~CfguYwm!@NAnL8}+{^vnt=5l@n%b3SPlPWa!-ud;DfeK~l)o!~Rd-C?l)43_=jx}_Hz*HEw$@Cvi|{|D zEw1W5C^t)eRK+|?e~_bE)(*-CNXD8Q)(e$<{OYXt3RTClvnL`S6bS6haMt66$}mNd z-;AwIF}c(Jh7zJWF;vswWF>l7x*qC-mTacBa6ZfnHI!3jdeu{B!hDuVF8P8NexVm` zlIVR_w|#nE7*)k^s(a;7#jt! zthIQdDnCBkt{ej?UD=*L%(OIDAxq5_=EQwUuqEF`!PX2_UE72dGoPM495c!d%2Seq zK(P&`|1MPsNw0;RzaalX-3L`u0+L<+C+Jq0MG+2vWqOre1RPYlw-PH`+u_Y8|4K{z zI8jYKc1>QWRvd{FQzTDin1UB(hDL&^(pyctU}isxyGWFlZx-e3wT_TYa%zjbA}P6W z?K~(i%ZAwEkW)Dez#2<9H z$kwoAq#)*Ltua`@;AIAv#S2j-hN^E+PXguc*N#qYKvU*S-K@F=tx2Uf!gIN1wmIAy zW7Z^nn@+KjR$nPLyN>lGv$-U^z{ir>hh|Uf&JAx^yT^Vtzo@y0*l%lM+#j-Csj`@q z6%-Cxt;l#a23z)QKFJDgeivn^thB7ES7>gtpb7*>;TL3KTSch~nQW!^_d_<)U_2)% z>dT5_Ni@^i<&o>)$d`h~3>DSP)(UA&gjCPv(S~sYX@*Lv_(k>+f#$WgXX{M5D4_e; zONA+&y-&-zCdT-9m`e5JY`C+P_o|;#zv7eiVZ--I!3*iTG*xjq7vL2H0gTSfeWr0G%05|d9+aM|hp9QV4R82$oiBE; zvMbfAso5XRC0-BmLW^Ap(8|YWl&Rml`CX*$gPKli5_6B1umU4g-1a0t%iVa07Xps$ zi{%h793z%6qZd9rO+sdpe^I?yEiPwok7a~+xqwyX57`!!Th%;34p?3Difpsmyl`Di z_YLT}W}X?rU28Xo)XB$*i_$PRyUCUJs-IH7;*<4Z!`G{)+Nc$5MA)bH%5T{8XLkdA zSj!r4*eiMN>P@dX3iS=jX(0|Js_Ed5gozB46wvHW29-{^l*J-4R>>?S04RGyMsZh5 zHtH6XJL4dqXNJMe#Bb3!nRE_KoJp|vHmw(;+zO_izO+u+KV@D>1nk=VrQ~;gCR^_d zUiio~YVtynXRIaegta#6=fn%ueb|r}E@^daV_xWwCRaj9PbdcFQ!=3ulYow?xM~zD zpA>|z#RR}ymoAbDlw5l$<7chJDy)_A&2rk!6Z1mhanuNve0*-7#L+dTO6je7b4Ui& z$8lCE#&)wt0p-1NfVli3^(#JEA2uWkYO}BsbK-^SK5WPf7qmLI4lktaFZn+ya`^P2L~72P09>1dTasMmsS#?L0tbfcKSLL? zwjeP(T09`57mA$3j94etOiuGcmFp41ZJOMm4`msvSwjy)D$zi;6!j4`PK(059tyBj z5k$qyg{+~hu_kL@FUV8bKpVzVs<)a#UeSTG!5vuWGDbSJ+MztC=46}KK_xDmZbLl^ zOD2_G-7&QlC2LZ{aGF^P^?MaqHK_`2x*5%m0Y;?YE2?kMlrGk>7iOzIsXVMXb|raD zHH?JHp{Q(M{LGsE!f3<~vH__VYF=njS>hFEsye4g4OpsRut}4Uaj0uWgGG#S@=#?Y zHY<*SSi)wpkU$Tbk|=qvAOI=;buH(aHUkg{fazCj?$w8k{F)9$x}X&z$jL~P0@aHV z36#T`HC1Xg%R^M~)ao;va;pB)5`A)U4tfuBl3+f*wc+_;a0gPKaztCT;#n3*+%HwKD zdBfDPPrc8`C_&R@l9+0q=^Npw%ID3lxq;mmnwran~A8l z?y7H4UaB6N`i2d$&@@M+9=jU%K)G2H|7^WgiN%2l6fn>dFMKpaS^X5cmnej}=28V+ zXAS9^3ncSGG($+U9flZ=I)VPm7m)`7%P=!F*$nH?E>wL(hqv%0Y4Jkhv^L(*8{DDE z3!yM;4>(G*rl%p@2X$7QC6R45o3Kk5o)#~(Xt{4S)$aB3P$LG-QEYZ{pjw*zc=M|N zr(T6G8c5H8W`5z5g-OWE`N&68O!!Tn^|eFbmw$4j_)VVSFZ%XRa|WOWa;EPipHDv; z&1N;d?@!bR&1RpBraj5nKBvifk}iC4@8>oHPquGh7{YJ)@aLZ#7g;-mb#%?oZPveN z_=_3%O`HLklWezq zztA5}g`x?)(GV6%Ug?A<0?w)SpaaAY4DFOI9*$Ff*O;TXQHa1FPQ(*fc$`jQViL&L zxGkgyse?C3AmE#tnk^}DQ>0yS<`E|%g^J*p;VFs}dGX&+(T0+2 za#M033CM@S#Ypf0wFcuUu%RVrU=PM0pD#%2ql|M6K$n!CPGAC%E-6q?LDsfeC~03S-vV$JMV;w;<3s z#nKDlN+pI_Gfs*-_^ds3q=3qEE_r`7CQ5lkZ`K=aMyt_iH5g4|nnfi-%7sM$#+F)s z#MNgOp*mt@(jtkCL`tIH>$6f-+Y_=`(yfR!CCL$9K)v~>R8J}q1q>II=@@XMAmXQV z9xvtWsU1Smm{f$~*+lN>X;{GxtrPv}- zsE~L#x|2DeR9FmiCdH&>4v|2dm+CT5hFYH#AmD^Kh=S2M0v7`eZbIq^8X_toEQ5kd z=bZZ?Cw@N&#|eTHXn)2y&DF!;dDDG#HFVC`O@JW-(RMG3baW`zFh}=)=-y`AxR|&$XOHcp}N5UhIMq>qWCh|gH*u<|7(9)(O1DV$thS+SYe6v?HP6^p^ZM;y`r$u4;($n*2~ zc*gZ6hFxW3XG5`TZeN_6FDb|+Kg#Z~zz*O+ z)K20!E1jcM9)<2)E~+wt0xW1Q7_}5?85tR?t80)}F#QU43+#b#5R9Hi>% zqLct?7bJ$w#t~!haa%kRci2GI<_wD*>9^kc&}wy6R2BmaP2DIyRHET^;8Sz!w=8H z(J2kX5a@=&3poZ1CpVXZEO7~__i-01CrXk69i9}B;`A91VWp{uB5u^#e;e&@6}~|> ziARcIQFwz!6Y_jY3^*PSQ$qt#R?#KpDXE8IvGC?XKp~WZ9j@cU(ToL1JQrg{q0uTcN4zR3;)s%Wr&f4kwVH8Yvi;*V{^`)zuwW+-B`cH=D?i}e-b$9e4q`S zYbmM-&a7*{dms91M-s7^!IU-|b#J`+9;M1^w^U0UL126f*-J1W06-IOy?4Q8wdA?& zFmygPv;G%vT%;~^Rk;&dPv?+_h);nKM?&Gb#Ra#+sYE-#kr$VjI_}>uEGkmaUlAW+ zcVbGB6XLOj#lYP=eXA>8tIZ9vEPUDk%)3Dczm@7{hzKYSIRlY!!gU{fcr&GQP@ckM zpeQENt&rCQ7y<_6s^<3!DE6E65v6gVeZ5c00LZr*8U;_MCw0ucD3f}Ve?nd;^EPV3dcBMBU=XVWz@L!Pciwz!c4oe+qIlWsTk=pp zlLF9`AfeVmn$!08_usg2uooV2|)Ykk@xRE zpeQJ{i@8&&=J6}$g>Z4JRX;bk%n-^7i}UjA=(tqIQSm}SAHgyODpQhyB%nKldCf@S zbz;$Y5a|Ib^}z=pNF`Eh5Un0B!2VCd3*$PR&E#g+Tr{SK$oZMQ8f1$>_6B~Rd^k3Ke=%!LIdln&+N^M9Xc-xkexhWu+ppic^%sBf7Y7a=#M+XU9d)|t+1YpAdFRB5>{SkZn2;k{cr#8znPs4j*cu}yl}6hW3;8E_WR#^qi=Y4 zXuQ9pqhr2*Sf{!mH+ks`@d6dvAU*4Xq=haY6vJ0 zr{Uq@>({UE-MiOnHV%(Yy#4muH`}M~-0A1j^I-JW&3ol#MMxSpvyu8QVNrHNhYAk2 zHW@`67W_%(h2Q`F_o*LVRaqhA6pHQ`^_};--+%x8?c29gzqjjt_x1K$JKEaLoI8g} zOxFWHCcMS#m0iQW9MT+49cM#r?h_if|{B zU0ov_;8V{X0BX%`cerfWWGG}x^(8?xyKmpUcJVUhE{ludE>S}uT5NHqJi+OEJupm9 zz(2h(SKrjwP+dhmnepMVJGXAjxmgr%@~wC#N5|$SCSwt3H^M9B%_tabq_wi#TtcyP z&9=&d@|RDYZfhyHe0}it?XEnl!KyPnf8xa6J#~p-XldD#Z%-`*QUo8$5yJ*jwRAam zuiq-PyLRkorTDn0h$dvZ^j=z=oXNL2{fj}wa2%Dn9C+0_`exX4R z&7g=}e`hzfi;wQx?pY1%Ojff+C|p4VV>D(d7ZZAsipK=-i{5|^4P7u1=#Q?9?jT3^ z#1s6NLWki{Bqv{}zYeP|5Jn{sQ!Xcbo6N#W#<|9>ER_w(;b{UF<+|zARTEMA;n?KB zaB6$2(^M3T#wlKhB}ypev7BfkYIPVX5ZQU>E_I`J?b@BdxQ!f6{J*dX31hGPU(vFW zAE}}zL||5&!;Ii=%d;j)&eNqD>gt+m>TX@QeCqIl9Fr|a7^cM~-z@EsER2zCT32pR zS$#KfX)8}{s75y+q)l0Hq0uukt zZ@z4HQcEcZanok79oV(!d*AzE_pS2p{O-5k|K*v{2g9EHmA_y9F?D8Ld5-$35<_90 zcggejKlri9Xqlc|imbM`U%n@gmuySw&QA{X4s_i+@xqQ=yUpTon^Sr_mO82*#T~gO zw<8Ck%8!vlZ@1|~MqSWgqb8t8(9&T7#HxPrqw5zgTtoqKnncNNw#VYcWM?AjotsA& zT=CCDCS@t5*k@A`r7E&h*@|=UR7EUb%96WMtHu#D@~2IvbQ>b~X?V zS)YCGXaVKsb8?nfe3YkeYuI|?@bLnxRdC#3oPTE_6M{i+j@&28@ z-~JaTi2 z-OTtxMR}p!Xtcy_F1<4+oMQqplOvxL7$s(O?aY3a;QSt^JZ+c*rZ(4WrkSaahNi7j zkd;h_HgC*ScTCg3v(X`w@&F$@c8s2Q#poJ4K}0i4o!pogG7ISUEiKJ3xiY)cGqGT| zn|}18pZ)*Y`w#Fq((7Ch?woTsa?UvsAeeI;l9Q7r$Vy(xmhH9u@Ab8J*J*$6y}Nhs z?&E7)YhPQIC5_S~ab_5YIRPMuoO8~pfzCPX`&D&U7l{G^a>lYGPpO_!vr+xk7f*c8 zInSRu4kfIutt-E#!Y$?{Cz~`HRIX7%CPEon&|dLbG{DcG*Ds+GU`#(B!^61W;J75Y`O2tkmYV46>gfOZghn!R(l%Pnj+rK)y z^5IWDQOJFL{WCc^`2my&_60tC_r1F}O(P={J9q9vF=Es;LsAlSk6=oJA&=X$Ffo-J zk80ggs}*@kNZomc+MYUeRHsv;`kKSxRLNCfNFEP7h+b6ORw+f0Zb{wLP*@=rOH~r$ zEARwW=u23DBESMteq02j51ce$RSMK1l1cG_R5|wqV4ao8ps2w}#YcKr70Mb*`DQ{L z$%4T_s{upt^E5JvLmaZW0va5cUd0I!E9)$mZm&X2>TQx5j_Lo_+GZ-?3J^g6sC zC@9j zj)fgXNlUO(#rPlFy2#EjzUdL#dYmQu6>Q52tA$v)mJOPX#ZiLVb4b}7`CcA*3gk)% znT1HQDM6)9kjLm#^ciMI4}xZM(^JwDPeFGRilqPi&p)Uvu6*mwm*JSeGsOEv zXdX#kV>Y``#aAKXTdje?o{{v#^s@Za7f!u!|JGe`KyYH;5!-^Lva%8!ba`^&*<&X% zk`rNL%}q=E{onqk-5UJx!^@>b@CF#@j(`V!^wCGpKmTl5S;3rjTCY-qy?LEJXmAd* zPvBFC`~VAt?q052T%7*HKm3*?AdOQbAdvtps3bFRSS%5X&2zQ{UB>Tx`>T5Faz5|u z*=yL(&p!KXUS0}BXNTYO(Yf<>vjgW8X2_bd@?=x8Wz7kp?%j9a-?e@3v7@^v&k(u5 z{@2z#(8G`w0XAE(1%Y3(vN+dtzsX?G^z@9{EoN}v#kuK`z5$jOZ;F$IJmF+h3iNEZ)qC^&?L&w5W@IF|mOVj3faeXXVYQCth=8CH^LkQX4|+A3 zl$-3mNMvJHuFmzFnH_ug_$MFpiWpDgN}b7Zf+#_ddEG{_IFC=q#BPCe>|n8&C>&Ps zKM+*X8dRXa_=~@wCJfjZBAhbV8OC3T83lI%mok|QE3*rYcNz)`@?c?m@x_y7vt?#x zE+sp)p|u5iOjc$Z_}bLe^n(Y@cka~NmR6uXj*d7UA$q8{DR38ClH`WHZ+Akfb}}~ zO=yJ`TBFzDXliH;1%elDLWo{78ROu98W|eCa{1c*`liADA+<`QRqL?>Ogh=h@>)}4 z)AcL2yW4wUWW%gtMIc;5!R+elPmEXV^;(qtt-IIQc)zWsx!=69MnFem;jLSD+uAzj z=jUN$%g9ISm2b}e|U$*ZiP&Od^-d~BapVX zbc3snj}5@1k85yn5C^uryfh;tQESx7#WMK2=jQ?4fTLkyabZcX(U^?diHZ5~@u_3S zcH3-joPr%Yx5?xZKP==hXo!T9lR&Z9ES8n?AD?Y%Y8@IH$J-$jkBtq&R=KdUgbjku zXmtkUF^8SUV9;lznSivat80Au<(DjLOHi|bUL*E;j~8YV6ygTOAPkbYy9JY@6Zqr8 z!U|(ugh~o8Oiyp0(P%0uDN0XIgiMUJo}ON~Th~=oR47--;7ox9H9IHc%GE0c`6W2n z&^$d}AG)+}-%faQ>h8deIN00U4^!66%p!iPP^h4e=j5ir&tkVbmX?<9+^O5OYX|5C z@O>tu9>Pdzah6o3Xm9VtyxqK6S6|=S&;Vt%3ClD%I5IoC4Ekxcx^CTS=<4c*O6qdC zwOZ}c(wfU=hY@RFV03P77R2PzrJHKCHX}RE8wi5}n9Zwob@!nYQzhX<^>^>*<>e+N znL0ZMFkLx0X`qD5ZWqWCRc9MoIbngZ9RD;gpuV7l<^dK`& zvOC797qat_ZaTCL-b+wnfPYeVgiCME3&8_m2Xi>!?i#GW*^rf-qS5HU+m0REc`p4@V9xN`d)Ymt` zcoH9P!d}cuO-f5lN=S&y&CLVc6uT!WDT%NXf$-SzW+@yJ9qBK#U-YvXHXl6?{Y!T(&Nl$X2z$an1+X^ zR_14S?b?Y=4PFJNsMG1-subze9w0L*UI?GKd1<+$t$ketr(DM3*mL!I>#2ErmHM!VCSOmHDNA{-=MjTOCUl z3s`ktPI^aMcV}A%Y@om#_}reU@u{+sLX%$ZaX8PPyV`WWS*y~(eSswzBqV5Ldrc{5 z$9KN-k45?Eg*j>0uh(~X5Ak`jU{EkVzA!X8R#sUsJWO1&I1HJYSx^?>#6@RtvLXBe zDh#TZkdP1`Z&+Mf{HK5VZg+PtWg$<;87AjP3YD1Qg}&AYEm;|v>G>I7@IvOaZ=Dw+ zE}wD-0A}ca_uWq<5-Ch@_wHdS+DAsGhDRnJJZQUedWb~*eFJ`v2R<+mYY14iwN+qGcrPrM6SE^Y>@fF< zgyO`+wBnLn6o)rz!3LZ#x`LBUPfvq!=I57ajry{Rvg+z$gH9%eQx5p!FaY81ciwqV zp-}GFvF&gF?z^2`{k^@zy?w)tjjcCs+yu`qF3vU?VbUb_|NXmn6&9A1m6h+_y&Wg+ z{{5yyhYndRW&k!195|4ZlZlfHrCBZ)g5@l&c)szCQ{-l^)zz zB$un8fxYHUcyvn+2>Fw^R*;Z{xNr1DE${QJj(>LF(hoZTyI(K}02^{V>e&b6A z_HW;|tt2ri2?uibu9|Sr^UjanhYtFizxg)4hco~d(%#-)h_hRqdH%wUMYH8gUwZlE z$=b@w(r{P=OaYE=ae+~xGTpm}#!VnMU^&k{cRDjS!wn}DrAf%(`V08(+`Ly-TKd8Z z&sLS?@cqG0etuzlRmEGc9Y46cDl09oud@dsBGsiC^>@4O-MaJqsWWf9a-zJVG9x1c z9u%D6)2EL?@&XMlF3iYIPdWR^m3@2nzWU0cT|3KU(zu!V>Ab?!owX%By(77~x!?Nc z3u_kdyFdFNK0ficfBVg6o~bD>D{OCv+Ay}gra&g)UA}T_&z?P}PoGRnOT~GFcuLAk zMtLEMO|~?)73AgV5)zOMiMHcY&O)NNv8{|W(13m*<}IUB07k!wWn*ET-L30|#McLq z3T5VGH$^9VdF0+yaooCINGvwdq0u7*h5{w1i2r#ry->=7UdRI|^2QB_EWK~O`3e|b zVq(Jn{ksky-j$h|4I>H!lrMehmC}-I)Zm(#S%&EkPWO_MVu&lBetKhD`8L3{l9J*9 zD1*`aH-Gc%wY578CUssxwp1d84_Hq4koSH=zu)JyS(kxF1F8ke&FJV@YHGS(uXFnC zm>fKunv_skS*_P61pL8o{pQ>0X^F$blW?Bx*;DCoc(J46lJ!onRUucwDkBuYG9rkN z1MFYqbvaj7)_|;e;e}&`h50Z|frBQcn99p>E=Y6+C^(d})m2-4eRErDCk|9rR^0x5 zyN(?@c=YI=;-dWNnZ@Gb;%A>drq{vD=xc5sx_!I8tE~${IT(C%b4yQ8KQ<+-6sv1y zh_vWcb8{=sbxKNtTrRNNy+gy`Nx4|o*}0{z?yghM9N$q}gBU9bfVN`6;?fFc5_lG> zh!0{>g4eI#g8T{{ATu)&|LyM|`44~eI|mQ$+_kF)f&#F6d3ia|%;1#Q>hw?+Z``f|peg4_QP{dtMM^RB`T%7jCjk+U84ipuo!r%huZe?Yr+s#MI-}=^9Ai<#XaKs!t zb{L+Nva*ubUOPN6Fb%qtotw%N!upa9>>k)BysEFha$2V~HZ?S7XJ;D>x`u`pI6EjX zjWnY;jgTi2{zMKJebKH>=AY}i9j9JM|1k0^D!_;S;pR5d4OGvVwii3f%$bI7J@$&H z(+jCMBaZ9w?}gJAh>%D0!bfdM6h(N57|~fnfwroyuFlNNeE7)lv;H}gWfqvn{(hvz6=)qnsnv}!ngyF=+8GZ0L1~5xn zuz&nwYKEX%w{NcjopLxrKA#BVg%*pynpfQ|EiHH>WYrrtx|*80?RF<+JF;2qfyBh* zqel<_aSmD zo*$cpS8{o3F6i(~^bcpmCmq^Z?X-|Hl9Ll(Qc?o;3_*tq`V?Xjy&)mg;=6Yn-h1zE zSJ!xMp5g7cUrI@dce)802S*pdmpJDLZ^CRtJiT(Ix2=5&v;g*Ahs}X0LOWSmnXv0( zk|3>9_!RcJg8&htTq&_V%h+BX@wlyLgw!O*cp<0sy7ez9UKk6?WUc0-jBryJ&emVb z9>OC>b}Nk_D#7IfrltRrPcC4#vmmiK0hxgX-V5^~Y@s+lFTeb9Rb{%3*gXCD`Dw4c z_Hu1)E!GakZTtiX(A?bky1Hh_uaN&58=HRiv!4x*j2ZRX6|)sO<=_0bfBCEb{do#t5;Q6mLW9WV^8q&H z!%=$nnbU8)^2Xjhd$FmkHv5emP2c&>$A9uC{~1OI0)p}RySj#5E(bP06r&&i7HI{L9$b1VE(FkI_SwLWJ-?!~>o^djTf}-Js}4NfHwq2 zh)6&btX$yS#O1^n!GQ@K5p&*fzwy9o zJ$?ERG*Pq+IT)k~M+uK%dck5rfQVsSqXuokw!ur26HRI*2}OZyL7&atyKCNh>!lZ8 z+zq7=-%x}r!U8Ea7`wN!)97a~9_ELfqUY9|dgRFsSk?we^ew;U@r-bz)5lp#YIE!i zY^2!4SSn)go?e>l9>5_1WrUd#E~vh~KA1l6fWd&WH%5>=gx=8u0jY(fTPpQpBjTUL z#fQKu7CsLL71&HHB%XxA1a^gEfE|hdVynR{pp_|PO2zcbVrp8NAqb;$|zB_(NebiARV0Y(Ni2wn)0D$b;qO2b)M zX?UQyxfxJt@M+lV%Z~0%sw$#;PJA7(*dVGIV)JGfIuHLJI4J`EnP(Ad2^yi*D(Jvo zw1a4Wyb%uosTz4Li5Cb$CRG3ou5)u;NZQ z0?q;s0<84cuS@Vxm`}5^;^lHeu$j4lY^{T)Zgc%9P2kh{rmtM@t z(PU+1wYEKIZ-+tk251y6U~6?c4FodG*x1-Of=~pafZbsS4mu&;i0A+IZ~yVn{`8Mj zDg}Co$DB@oQ&TTg%-3Ff4KnN3zy8Yf^xDD#F^YcoyWhh(MW4}sL}vlBgGmN?1n*3U zgS#gllmubc2(N{w7Uvq)-TnLba&Afzzd`1o1T0ZRlB6R6$sy1)66q+y-0~$6dO}GX z00ZKz$BL&AsI7~XOZNkKzSWedzlI0oa~#rEcp=e{s6coj*x?H=Ja_i&$3#v^HWd_P z!$MfScL#Rr+8T++X9wG1yk z*cAmcvyRkM4Nd~2vbOeq5I&r%o}S^odu!c(VjQNMl>+oFq7z~8TsA=0khUY7nwa#p zFTZ6lC?T{W%ou}mIz5RdfkGm6+U#CuNUfB6!eD7(XrCZ+%I3ARFw$ z5$xRwC7IG4>3Z>B@WLlPxi~r%6{Qg4luF6F@BUn=Rk9@w>nKb%k6wHnt`SFWYQDWszPy5sw$wHY7n@Af&ugMU>HY^?1%K2mX-p{j!rA<=!kE>--N${VS^)Hym;x% znM2UV3`PwMHJAa=A23b;=ztW{>(!MNm0$b%5g2c}dWI~PC1^iNx%}Y417O(0BhzRW z%m(hEsi{TqY{&%2jfFD^UXzz+g6kB=9AAR1;-up&Lyd;n339(o1C2HWYbE3ouw-E9 ziVA>o*T8EC){DK*x#XCukrDVKu~-2r#}-isVFl~zn#5QD$%c}^7Q->m3(KD6g;l0C zlJ@}6ZazFyA)a>2RW6@+1O7YufdD`q#ML2JI@~$9@%fQ^jo3Ov9zM_Pa<95w>UjB~ zQ^(CN`=@v6|KET4Az&TF6$L2$20H+>L*TvCY6c>ylr2}uG1wNQe7s&W^VJmIX&xB$LYZ zngF5_NQ%i4^diR%eQzC6_S6Rv`9HRPbG}93 zMU+Y8hC7?SC2;a_wanQ9ZDxl=PnbmX;!8v!nJ6d~g`^_P6{!{prypQg{N$SSNUEU3;FYQ@tQuU`^e^RIb@ zF0a5Dlm}Dev|oMWMU9l-Qh)3GhwuLM`#)M+m>L_K50GfU@XXT8C)c|F+jqZb4MOl) zY3=Bnnhnh@3LdodOBL}vVd{VWFYo{TKVRz@Tycj4h?em3TvIsR7W3cz?f-+gf)o>? zaO`0Z4_V}7d>jOUGc30HL|&whK`@U(Xz_bKzH#>N{_lUfe)0URPjCF>Uw(A!)AM1E zKgFc>gls~kK&%%AWPG=fpHY%-%rMz`ZYLkz=2h=6tJ+t!<3MTAwp>NLA~9cExwByJ zsp_iF}A zlqMlg&KhmCny|t^TG*f`fvY--_I>8SaR5Os(R;xPkKhDgev`l zZ4Mc9*1Tp%$Tl$5x9`NBl-xvt2v9iKyphez?sZAqTSou(uYWK)Hfs-B{bFxW680f# zNfhKO1yT)iS|P??K+^TVVhgJgb#tCFY)C4N7`fRlz!=R38HeqPx;Ya?k;uGtJmQJU z!mwKaXK{f%J$!qR-z@ryC!zqKv16NI&v`r;_moQ5*2H?fA|XkKXl!@DYe8WcD8}Kg>n&7I06=Gv@gRp(%yWuA%$zdj< z)FzS>5;rM@i10j>%$OK2*C4dcCRHgkMvdF=M+!tw!0z@ff?k85yAegsjxyu(l9Gu1 z1YR+~prOz}C}#T$Z7!!&sepM%qL4ei2&F?Rp0LXoSXi+wnpco6Co?Cmu(V`oZ1miv zd&A??7q2|Hb?>g(YJo2`BoNo`-UW#EPd~W+pk=tZd9bO8q|V9AOa)dOe$cYAvbZ=y zb#)1}vFq2bBPks-cEncUpCGbUmv7Y)bUI1o2DHqdpS^PHUf;~j!tHzAQ**OvS?Nfi zo|2KCo}Km1PcL-!jsw;G(MQ*y#M4#!aDhN0iGe>Xn4F#Y==|;W?uoXp$)>grWRFy8 zH5dy%U@R>i3sR-5qN)->G9O)d0AmrtC*ah&T;VSbelw35>=A z1H+V?Rt;5zE@Mg63qEP03J^;pRSAl*IICB%Q}%~${EkN?L%{-6Kg;Ne4Bod!F)XTb8#Pp)6Oe6g@7-)PdG{pjWgA2!Y* zoO@*+!MF7dZ5f#DDX}#I$33&oA_{$9%0DOcbw=nGgY6(0EBIV{r$N%(c!Q#=vlrf$BS((Z)|8z*d9u5^XKHp4wj~fZP)^!GfT@7?+&3`)!ylht zT$(?4X#Y2U^UKdZcL0^b}w`C{$vklROM zeHa`miT^|VbSMZNV|)b3hkDvNJDnc){zC^|dgaW_{8D>YXZ`&K;4h}8=2R-JS`8;z z7yy=+&YUsC#kF?yboWiRcC;@eaKYy3?&+U{_i15ucx)WOM+%JwXG0VYD#S=>XoXZW zIkP-Av5X``=~Abfx#1YPJHildVx~w?imK~5}O8yM=C=j zGHN0`I5agocelQNWzF5yJJUPRuQO^8;ClV`O&ryZp2?2x9;B!$E-yu3D?G5`$G!wd^H&yX7=_|7fJlPFa%8%gA{xTIuw2@qCAa8Y7m1`;Frc-eV5 zro;r~7#ta&)EKn+Mfrs#CCTZjDjmZAjA?n9z@)(V1Ctc2!La`rbc(L-QJ8mXYk}b= zB0^FU!P@Bc2KXMBj)4~nh2qT29CVXpRhEg;($ZlFf&&AsSyoqf)b7a6&p>K*sOpt9 zl^~YwogK3?%kZ9RwK|ZMojYs65iv!%h4~3da+NOG=5+KA4fPF83~X6!TC7mOUF4mbS^_Tz zHm{4TH;^vV*apFifkenWZk2242$MdrIHKgch4NltF zOD;ABKiW$I)@DcU^@U}*$@95|}yzf9sc^OXO{L*q$Ye!pWPyg_c zpC8_}zZN+(;5#^W>_BO0c2Qw!ZFSYI9i{X0D{_StezNMCqMV$B#6-oR*`%HuW0nTxJ2Xp^5Ve6=+50caMDQvYboSoGFOPU8W|o#_6)cc5F@{4UY%c9 z?jIO3nl$AlB}j;YDMb`NrV6g>8<%feZSJ0)v4O!pB=OG8&4ioK?zHs|^kS|ct^w{x zqbre!_|nyz6C}#;0rC>V;#yHrrco;-Bp4sz&ECPGQOxj;nhNAgg3Axqi<$Yw@u{iW zo!gNNYH(z{Z*X8}bhM+px1+nie|WUJueY*#TYOSN>%i#cE7$fTiPg3$NX6MXnFfO? zB`HoSfA?NWlBAAmBbqKw8czk*J*+-A=EH275AS0I$@fc$(3v;mgrluqysT-27 zj*d-UxOi=00m&LOn_HXo2F>x~2MY_+lnNwTwRU#(0NG0b2c6xBdIZ(6TGp1GR!~vc zRsE2(ADf?(LPc`yG-dZoN9pcTc`d959M6|l1h8u7c>gsy_`RCzm1GX3*5r}3W;D-(!MDPHGW+WGqje+_@y(`EsfRkZ6)KMJVqm0Lj)3N6@G{lPCwuex@Z&t7&AqKsFXB; zphAMYi>TT`k|Pt`okm6ywBWZ=p4$hH9oPZVwU9({GA(%*_AN?(xV%W+xC2w(~b)QOb;1;&RY{ZJ{z zR;N!Wg;R$N69!=%hh?)1A)DA3fJngKL1j~8GOc3*{c!Do&BGZ3c?IdY?H(^Fqd;9$ z5+9~gbi@*~DKDg#fBk{stVqmxuIOlr^%tjwN5tZgAU&{8VCJ#?por5guzBG|HX@oA z(l|i+S2$HTv80x7kO!kHiX$Mywnhatk2`faP9Ob4EG5t)r%s(pN&v*)3yA;a%a;*C z@a=DZyR;}5yb!ZXr7prA3!XcF5jK*;2X~K6OciD3Vn4k5-p{vftBg14;1X+Z@3Og_ zCr%$%s*w65+|ki}`_^r^6?F<7jwQfZIH8E3z-+@mjni@T#UlmzISOn5>^7ta2n0vQ zX7Am+ZG&los&WF>Lg#FQMFG|z7;<2r2iyi((s{C$}W~ z?JvIprO@s5%4KqrLDZ3-Sf^nZJG6{Z!32;`!4X8O1eNngx(;H8T|z9{GdO}0z}rpgn}q6JFG&b3^q)X zFCm7IiVc5tei5KJ3Vuo2q?#ef5$GJ)1TZZC4nsc;TM#xAGSDOI7~5Zs4$}{?DQSr3 zrWg#tio(ngc^`?Vj1XulCIntTq(WZ9Ut#5=21U|;&<}@Y9I_QOYt9v7O1D#X`p1<` zXH~o*l?Nj4q9&T2R7lWh1j~W0Q}!`<2FRb-IvF#4i;K%2ee^LzfzsS$X)xT^KMSD* zmK@lA>1Ui#NGbchbg84qTvU$J$ne>CMdl|I&j!elED(LXNn8!Y3u)wi?6qKM{o`J_ zZUxy7Z=Dxz^a^CTTmL6G3z;vmyC9R{AP}X51;k|@*t)-j%?m~TAmF`9DNhbw!CCU0 zREde~1K^mT2~l`sy<8%-Slr_i({U!P(UeGc1KEC1F$HoAP6q@~@S*&?bR+=x5oDRT zrM)*hJ435c0ON&pQNDoN6sJSsC&VmiSxLf#OGbzED+hRMuKQ7eUZ zn3H9UQGuj~i7cEah=48t3Go$7OR)FqG%6U6VMw7Lkcx#qZvfm9_5i4V^p_D?pZaVK z+R3hv0*nzmn4jp*{y1YOI3bn-Oh$aP%q#(&CMN63R;kHYP}q-8U;$XTC@&;NHmZ6bG_A;1gun`+n0greCf1Zl z9$|Hn!edl_G+Gh_2}lr52r%W5PQs)}`CxESfrBJNE`^RG9RLp_gdnQf_!JzxkgO2b z$>8LLC|}35-t1-{nh;te#PP;FfKt#Dc|9*ARd}Mm6AFV!aMRV*GdVOOaR-2@J9uzE zvfB`F9DRf$YA_k`!<~6_E!akhO?e@uE)#l)*`xA7+J zBRR%Ye8~ER`vveq%pJ1BfJfo&pp4jz2y2636-EX6qKb@yPY|;tP85I?@N5vIB0r>6 zh*zv0lU9ZUjLc22_KQjAQ-lM-xDPu&%1|H~uZYR8LDY)K*>S+r0P7J%0c<%c*B6!- z#SWu#9r35reL$ipoJ+4ifG9xx9OcXqU=B({3BcsS=|p`tfj)_=SNedwH$jcL57f>gm2uz!#%q7eLGy#`bDTl%f zLWOaFnbKzm^$uMW4UtI%sB8tEjvvC)$ww_FR7G_oaVVmqsnqG{84T0ZMU@%kAzM8< z=Hs-m!*>A2CnJ?_;7XumN6-|Wk9eZU#pXlGAZlJ=aY^HN5G>FO4+lRaj7Cbph)kTT zNV*TBQB*{uE8Im|BT@>|i4)KR!`{B&g^@kU1vPm}UPvneRJbVL<@W+MB9p;ijl5zJ z0?LN~NX&XL@jXP}VF*}%slW@dwJ5#Nh4h*rm*foN;vg|Ha?r`4L>Fk70JHoQ`G!Z3 zvC9#61Kd~8Na!%W$S#ShK5TVIt|W(n<}QqwFANEUQ2;cK1Y(ELzDk9ZV{qNW3<)oKyUFh~_7my@_CTx-$dZtVARnj+bP*j9KUrNxq>uh=B8P=TPKb}axO z^m~8h^gxt2tTQO*TW4Dux!Rw^XOeS_k_*tke#PY(nAM7cJVSb)9|oF;W4bCyB^Bso+! zq|oLdTqu5xn^u7^1n@CJxRALV;s$lmb!a1>t%&SGY!prki9)8A5N+d*JOE1<0UMzR zFbHi_prn#0(N{nO5yyjnLqSInQ{eokI%ekJk0zI%1Rw*i}%dnI>>Jfs9KA(iPnTb6OlR+#CJ&ACq>>Otzo_4^&!Pk zQFnt>D1@ zq+?OqO81*yZc@pdTy%D{$6P^Rrnsal)(XddP0_%}6;OS60WA0gxM@^CSfhYQbdyj! zgfRnxld+qiR|nliX)vlkaAQX$Ka82OUeGQ*{1wqF7>I>bvvX)p9e)`BrGh(+W{!V1tJkt!*c6hr$kvrT?P6&b+)Nbn5BkkKUDUP7ag zh~o_=N>Ty$Ayr!lVnFs1c>!#LIGtpNQ}}*XMyyCLp{EgshUr4?;;6HqV3ld=K!q4G z``Lw3ks=|<9Um!^LiQl#=O()XW5ZlwAaH{a>O``FkS$M8X7HGxkT}?0)J1|aXVhLG zjE?Ar>n?~1xG4$)soG0bk)y3?%z2?FhFl^vPbH?IXbwfZ2>*;|iuhNAK9B~X>_u5G z`F)gbKuROdY?5Rh0zTa=9lamj*wLd$I>GcIhNA&$AhPbH%Tabq3ROIMCdnS*I;SvM zte*$a4d&q(`euU`09{~uOR_jp7nCKA>4o`$%RIyBqGBH)oQufh@R8>?j7pHOP!Kvw zy$yu~ypWdQ-S-Q`R=0n};j^ODh!^F0BiaMID-hbEmj77pb2jRMO-UJ32D=5QgX{SP zTTx)E9URjD>p34(F{WWepFzpMC_I62wILvcK!P5<*!pYCMi-8?!2W?$&SCfT@R_*$ z*t1Y80Y&BLGe6P?V(5r+I7c8tYuWw}lCnAaHs(oyQ$r~1!{^i4M!;I&_51Rf zl<_uV$YswtoQs?j82b`K-r7ZKm_!c%=K_J~;Jin+GF&ulUPOHh>^P#OINlcR!$!~; z<|phvY}#wK>6MvDP+92y^lveZOd}GJn*PkzkKq(x9)Q69_%{YZZjNn6%2ux1d&nvh zwdP?zzy=7NKq0{Jn;fwp;3P+zzGu@{a4yhBqu^|f>BFY*v5k7mG`kTg z-gKCplfx+%Z`u_50kXu86>!-Pld$e}$B=t^Nlq6ICMo5PyoB!)EhBrd{@wZL|@Yrbs=?b&@r8Y#3UwN&J}<^-rTsFnvH? zGGA0;VxLSoF?g(_N35Z-9)_8MV}2zlz_{-6a)G9Vr0@=>aXLb+pjk2=M`u(Jqj+It z6Fkfdqd*>#N0!KEYpCuLuF!A2X&G{FRoiEOyk+C4sq!;6(m2M%-ufLSpTSlI5tL zw$VlH^Bd+0Anc|#{w$3?};KRQgd3=~AARc3{v&A{LU10BcfP^^}^NEpatjil^8 zY}#!E1TxP6j1heW$&SReK+ymXDlx$jkyc&kQGHO&?$^5gNoQgbQm4V*_CxfMXc~GW{^YXssJ7`x~hc zHqu9*aPkGNsDR8ST#S{9iWG?KL=j8$gl~ch%7+60G&91W*crLST=pFwmvs>~)+o>n zM(3DS4M^F@?6JcYxL`J9B4b|9$ONN@@T$`Pa5@oj2*fP0mM3b6YDs_y5HGlBHTn~I zFTt@yeE=-wmqMRW%Np|la_?Ru%+T<2rT~2qOASaPb;*%|EPBP3YNNEOu~8788~rZ| z{v5gdzUWM{mKYHV9J7fBqrLQ!paUM6Euz&iEs$R^GaLe+j9yIYBZPS}-!gm%ei2|7 z>1PRcCVC_{GnDg?$B28?ANwtUWX$+CZ9x@1z(lZ%c9N4&66<1gr@@L9o8jo@VGoV7 zgXA~S5k*DiCmSExNDM4xGusNXS27nO&*;xMugpPaMnQNXr#Kk>J*h4meJ@eLqoeRf z`@nvHJ(KK-VmiZqfOGupnPlX%Cz>hH;r05?rc1ohE0|5fet^AuH{E6oFWhKo%tR5r zCrVV|nT@O(+h1t+23Ot46dHhyl(8~JG6+$RZ@>#KXjr%M>%M*uMCX4xjtP#}h5;>N~AyTTqO+i)5R#&!-flOiq~ zDIyA>x6tiT@diLghY`6ajqYCh=P~1dv{(VYjM*w#JR698x;0`Wjj|^K1KTn$BzT)A zzX)z8`m0S_Kwh2oTX9of$ZTM0LYNKwP&UN%9cOcqUobDEGH#HI$}1F=OSq2V2J;=W zTd);(;NGIo#~xrGYW74iEwdlsd>wm}aLTEhZVGk_obP=iy^z@??Dw*H;ilV+;e{Iw zjhQIe@EAuMH!rlfd`mVD!Oj3E71lF-Vvt1u@^K+wVkx!Q*(Mp^7%{3vrD>qg87nI* zKmxCd$;C_*D$@aWFpU5SIoDaT5%!B{ANqL)8j8>I2<{bUi51++lIW!}k|~CYK*HD} zL<&Jt%&Q?Qtltv?6^EM6hi(}~JTqg*Z$*-*en!!Ix;0OfYqA?hc$S0;uENETc);9( zQA8qsP9T{SFNEI|vrPwpbMit)Q6tF1DEC4O47nExB1Sc;UypNT0Ah|bIFWM>JYke@ zBM%1sB~<`4O5zb#A5$Wu_%u{H;EKNFhZ&_glCBJ`Aw|)8dnt)h=OWq+HjM3cW*~pm zOh)^FxS1$nV)I&5osG^p$vgQN5hDAaad}nf`z=lAI3$ zWN^|%v8<2qLV^ONE&~3H3NHkv86~^SK0#ogB5K%RukxlIM-sO9TQ35DQOaK{wOtILH0edLdJgP7K6-)CkRa3_0IRqi3Vb9n1E| zNFD44*fYtVD5hoh1Dvm8ZxT)@%BGuw-2&%(pNJPSn}q#d_U_$uqcXg3qoFYq1#1gq zaEbB4P!LoO5xPRCRyKcV*5)(2p_B_0!6>+n#mNvZz1|fB&P1db3jac}oXA+1FbM)x zkA4|osRxW_3pY~ z9x4Xd(s{VBwWx;UZKGTl#gBToQRROBac)8s`B3 zi)UNBSZ9EtoMTf)FQyV=AEVM%Rt4iZh859@=JH4d8@8hN1J30;dlT64K9W zRD$RVKZ>34g(IREo3zpJn#h92;>iFIk0ueMh(TmfDD+HSR3aH>8({N9K{w38;0$mk z!4GkOa=ZwLh;H{-u3!YhaRJbf&n7mRjI$q^KcZ)r`77|WU?lWE+2AjJG1BseF}!difGcz8=`d8fH8z`PrWc5R_zn>Vf^b+;FN=DXk9bi6ct<8A0nZZTjjp*D zT^=FMrUw2HgMvFxv}vLzGo}}E{+ts_ zNry}@XPcqysH__OGRDcCD8CVB3r{hwUy`5D)^%zhg86gdIS96iYfnZWW@~l6C|_ZZ zZlmN+oHM`~fFD34m@r84k%o8*fO9=Ql}u*Pfdy@#k4CY+?7nehZoz~?Tp$%;1pGx{ zIx$Nu33Pn4+X()7sA^vH??Dcvm`CUhtOIFFkexWh;nh_}`7wJGeu0RC7lz?oXWRrV z^Gp;MM42$6j(_gtP2BsD$pOY@Gf%g5H|oP@daQ;di`?MyN) zKo5=?nYO$Z?Ac?_Ka)vyqX(FWpJ;M8ml(bh1eBtbGAeK4%+NX5o(#7{D=v@R8)Vpj zf^EjxEN2Wg*(H=rP2Wfy;dLU%7f}kCFKL2ByO-AYmi_bCPgn}sBmE|hQ|e;2=@Sg> z^LP}yjZPp(A{Dld4EsD@{Y4x9_A@~9Z#r2n^Le8W+~+>h0`?Ax<)-eK?d74LK#Y&R zj{SkFSxV1;^k$qX>kbjg_7Xiqv@eXC@_-l6(Lt;r;eY!@_@W2@9%kUlcp<^6QNgh6 zdn2Z`_37hmcB7D6QtSp0f9i%O&S&@Vya5y(W4^=>>CfxCN`J#V$^Nj>DE`fPA?Q}5 z_$F03XzR23#go4dGeA;6&^O{=na^AwHVQ_F{wfqilz*fiHT(h`7vX=LEpt2z1Cb~s ze&mKzm~+lq?*&I^UcvG37rgM-VblI1Xp zn>AKfSHTsGT8ZD`S)7?)U0M$NJxguC zo7eDPlqIoRZEIGvgxbG$WYgFB=`dki?y$-C+PL*)oQT<*br0( zK(HgMukarLDdH!p9x6bAt0ARP$b0wZJ*`4z(y37^gTB!SDH4k44j_d+sPq;X>>c(w z-76^IHn)hfvVe__4h*?%j^%~Lm4!v9k4mYGz@Vd6M~np(lzcvKS64T>io*98JM7Mk z85TKI*I(EGObfKVj`JCMpHTkHSSm95%Z=>d^!LmaX@Lq~p?tB3)<60zstbQozL; z*$$+8Y+Mg8!jw`-Kx+v6!Ab1t9zwA_gWiOaSuRvr>0t<`|U`6 zs@EGmE)TlBw6xaI(XY~}kYqDrHHFTKRQ|zGcUP~+=|#HZP|)iFjc|LdR)^OMK%W&A zS4i?wRD+A29ri?RzC~$2Vf5Pk`NuxN-PC7(1?Nd;Izk~gsPJCu#KwjneJ=&=dID7N zXPl6Shx?T8F^T7Gf&$faj87Rz()E%)=Jj4s(;I??fF8Kf8ON|yYQmIh!+1u9E z-r3m+x3<^f?r3fu8yxOz?XaW%^3?RrJGXlV`@z2Op<5}w<(Z1Xu?8o4*eQ^&b; z=SoUSke8V*T*d4&?hGo_iqR{ysX>(v8=#+OZ0^iA>}B5QcrcD)JTN*sHaa?~QfcHW zIYU)9O&hU6$-K|D$NuepP4hx}N{vRz)b!%e(6C;wMS3`f(=nS9#01Zy431JMjOBx6 z%{9dfAH9&ekolG>TrNZ%!7Ep;Boy>i>>@YQT9SEFP)0L39MQs(-+6kdU(oF;WBkpuIccYd_6u&CDP z;`DlGgf6@N!iC!oySKc!00@olzA5CqL48f6*~AOy=a)bD;KMjmib|;mZ+19%4tvP! zvG?~)-n!YivStPwQ!6DT)4JaWo&=nEz!_ScGGD!Tz2$yqQEqX1q6~@H13na|@gedO z;Ja`zFgiYi0+z^~+t%2NY;&_StL<%lCSXy4n%FafyL(Y@(_^tOD>HbDXax33& z@k~6P5fVZ{!%C=&jR1POp*`KNKKpn#;&bce(Z_JaEl%mik8Q>ap%)?t8&Y$VYAaD* zNTqd09Wwdc++1H(ZhRlv-1Kze@apkIXND8RzV)Br6(urL5P@IdL8XOD9HZS zTd(ZfSDl=ki6U^Rsi|Lj~(Xr;fZZP0`_rOH^Aie5zao~w}uh(C>c=A1k%L#xUeT23iy^6SHAM)mtK0|pv!?;aZ;U8-PzuK>g36{UO%&Hb{KT} zyqxqkn^O?Y)B@2HUX?3XZlXZJv13P3s0_sx*b!+P)iK{XFZ}E&1Q}%p$ePa1?&0BK z6eiT@RSX7Wb6)uCWpJg`wFn=w+DQRtRD0HHbto;no)8eX||yXDg>^{uS~ z4Gj-a{11kfj?Vsu#-6&m_WO-Jjg9Rno{n>rnwlt+3OwErSO~T*&ex}(UXja8sPT3F z!d+|KX~Ug3}Yz^V4&qgJaE&{rBs-MkeRX4u@K6Qmdq> z`2Z32-o5&Sgv8;Vaivn%-PMzsnO#_zGBAL0fWck6D+q#>nlc42H-P}2@9FMKPDm*! z%ov}Thk52pufMW)->yRk_LfwZf?1+=ab;yCX9>yAOdNj&8hD5ovLx?cfv*43b@8cq zAzjKjK3FXOt>D`jzWR+U5wB&4QX{o5F(Cbx@VS8FS^it*NlSlXLtjx~HUYJ{iedM{* zr}m!OTUJ)8(;1P66Gi(fD)N*{agsivsGE%a$QW&F%yHw;wvV zQz6$3^be({Wt3MJW#ptK#%pm>94?Z=0)7oJFxMK&Vp~uvbl<)ms5yG;R-IC*Dz3`( zhQJepq;{I$U)S6;IXyi*Ff0*D6-om{8F*6;?B9)Fp^_0mvVNa`ZehNvs){q3_Lq*> z{ws9o3tss7O)3{J{9ph7e}ObYC;$VHDaw$!T%n*lAVqL@G$MiyU&GOoNW@7-y-6d# zchcUvOmy}4wsjAzIqmxR1fSJOypo;WJ?&jyr)$^tTCGCi67%gcA#MDW^TpG{(<5EI zW!d?eMTM{@qr@7%2b)Kz2JB!`FRH6qUFPMrIa|=-HYvrZ?x7P0VK`Etyo=4@v8=7k zEV)-La-P?y(DFTkpu-b(If9O$*J2y&7()GQ+oB^uqYgPkB0mr5x&roP``mJ9&8p#t z)I7NkF;aFPzEKFg(=)39w^yf>`dvKxs$+g?VR>#vV6}zazEq>cXY&W_p4pM{nvyb< zJg}4EJSgGH3qg!G+q5WRXm`v{&RZ8(6nw7=8R0@ArGW3TI2PPCQx zr?7Sgh0L>nZo6$uHlNj|LcP-23wRt3+v=;gh*dJa*Xi-QEMBKs#0#L(3W^~kJPpYWf)*d&v$iy8 z76)9UDx_N&bObbFsoxe<3zexx4c~)rT#n`Cwb_-h%O>Y}1YW7Y8?Y{{Hs5VWeU`Me zG*Y(@g<5z4m({X7huID*5u}FVu5iM7eD-Av=F7dhM*NR_XpF#(pcbH8rIx~GIz2P# zU9jz{DJP+W0v?hzdqg}hs={(bNf2mrSS&!DBKQjtQ5AB*GmnC?q|6Xi(~frFGG|^K z;2U+~0dZ~RDt?yUS8Pe?Cl)7dFATqV@J1F z=kDB*bL_~rowfN$cpDCyPoLbaknpgSGWh@efq|YGzE6~(Rhm?ZD75Pi*wqGwT;(5| zUJCI22aj%xkCXcSR=EDuGWp89<<_SSO?BUTS=y`2-6 zKEB-1(hz4*=(VZ`ciR>xJyU}-F6_+dMY%{ZIxyDU(B9G9-TI)r_wG<{(_mI=c20H{ z5>f;OC{Y}9No+(S;e(`S6*oH_)#pc2f1xd5z;rkb?G^upzWdkfWs+b>5kf+Ign<&! zBpuYpN6@#QRB0xu#^8ycTlKHnNqk}0A5oG(`cXu7b=3+0i<&3U3S@uxci(~Y3>KJ$ zg#`$G)!TMhZO;DT!Lpid2TmM8oFbi`=GqV5hf@%SJHSt%5kgkgXf*K}JtD{5exJqV z`0_Wuk(8C_4F#9S7KAR}ERZ&fi__E7a7aMVhTq&ISI4C!Rqfmk)l;NW$hC;b;!6S{ zI7-ZB%atoP;KtjxZ{Mw3x8Q4Z+Z`x!i~itC2#~NsGj{ao(bCeCr6tFQAD*{3T}w_^adGkf z{d)jAdhnoie0&^zkbB**T%A6BIw3*d+S-lA-+uc|S+d@O48JJb4fewebvAePbadj- z%$b)dK#&}bKl99?lqB7SOZTU3=2NGRA@d1H1?K$HrB5+$yUOxzp1V6TGJ=v%Sg+l? zcVm_NhlhkR2~g(Y(aD!yI>F;9Z{NO+{h5-IQn|b0`RDcxk1RJewP2URn2#2A z?%cV5{|?|nMn>lGBpd|j?V;lb({s}3velR$B^-SM9`@l>$Jn=j@9Q4O6atxovz;fxhapMLQH9U-M zQ&wKQV@FA1V*J41)CV7Y00aA<|Jk49=cb|^Pap_$Yfn!PrsB2NUIQQo!*#(6@ARKL zcip#aEuyChCo;8Zm?|SZ)FiwMg@L63qnO;V~wB?bnN{e=(Y;nE`Ro zFI|_LTli;x`4^C1>B4zP>0)<>fI)%!!`2JO$ER-Iyw%v)GCMw9Q&!a5JAgfnbBLpb zO6%EKDG1)5nVXACN=(m&-2?R~Njc4h;c--*{o2=FKXqzPMn=~7`1Ik!hu?Vh8Q5p! zO3k8qrKF-vqL3?8LgdRxi`T`)seqaTvpI5P|IQti@D3*EjfOa5c3w(iYNA9gMPx4N zD)bzS?Z%DUU_WROz?Rh1lpVEIJGO62PtO2Ir@Fd&_wMaRqaHYduCBg|7caq6($h28 z(a{V4M{{%Y!t|uYVuu9={)wTXk>=(ekQ+t3!7oL9M=Gx)UobU3F)}z*SzcjCNsJm! zDV4?R#gO0o@y|g54j(@7(o09v)3b+%M?pA>iVAXalN%e`z|^04=HzRy9Nn{fr&ywF zZtf^7%)xK3U%v%`?wMzffygE%CcyXOc880L(m(w94N&dl#}7Yu`rwZ3l`tB^1yx#F zqL7QvU$`n1OLpwrw|8$P7ztdbXyN$rLnlt`&P`44=^>D%veJx+i3RWp*hoccxd(yf zRJf#4!td`HxOL+u$olb9V6S_CSOgOSGcGC0={QStt>NZd|(qxZsL-UG9&t<9O9S-XDyMs;;*!0)?${SGGK%Wpqh zRaLsW>N1<{RaLn#zAY}U!2h&sU#Z>Z{`uMS;4a6HA9?kqBRZYw?mY-D!s4Qoxj9H( zSGH~2cIwm#ol%c+tTdt+y#@b51~u%Zk*=ZIoiz}10Ca(Ih16z;M8c^Tl1v;#76rQ` ziGzYZ3CY36S=5N^x3CvDYJuJE!`AKY?mm6`8CZSwdP7Zh`HmesAbAWAkATmeJbALX zJP!bxzMjdt+jq>1%h-!^(=*qvT~E%=$GC8;Mn^{>2LP~EQBjIwlPa}(acK=~9zVxl zYiqXyCjcy`+ZA*>`O8c8l_f`BUcTQO^5YAa%b?dLCuQ#0Q|@x|0Xj`cG%A!*tQ{_J zM2IYC2ab!EUOH1&T5ixAaF$wI`|sST&&bG>i-i!KCnqPtYq2_D#(8ge;jT_6Pj1VPNAys*KMkqM*5SWuX{VwtwPT@s}NAUa>r3v24* z2_dU$PRw`nG_>=J-~4*b0J5JE-vgDRiW%9K;tPw4a=-SqFXQZi4L}eE3xOD@(`msE zaEioY4d80HVBkT+Z5QCD}rp`iiH zI4dg?E(rkD5Pt!9%jL^gKrs&-*rnB~D6~sx-@ek*r%%4|#;cG+p(dKmX6SGre={>P zAP_Y*HP1bF=4)SjZU6pil`2;820R{m5>B|mpry0f;4_trnbhOPZ!w$`Cyqj2fzh;} zAZ5pn?I7IH)c~{`AD_s}%fo4(pI=#6Sc0a4NdxhPaGji-jBb>aWMYh^CAoM8GwE~% zz?H$jOG`6BBuxfwQBgh~7#o|D$)q40AoS(sB~%(6-mYC0M~)oK%uEK95A%%42LW<8 zNvsKxe5tbC%+i9IK;KGAOx(G%Dk;e%5sN_w_wV07Jw0zHinmV=OCwK!k^yi;Hb8vsLRx9f1oq+y*{P?ltGjI=bkmU| zHQ1$?7N?7cm*L!+trz|a&X^1y+81qIna zXKt%5LC1jGaySD34?*z0cvp6I_R*t9^m+}cPYwx-a6ytG8v6w7kemWI7TiAa{gaRk z3U^9ylmq}u0tLuT2XQdXU_pJp006OP&z=P*D=*K-TT)Z?S($Mgp;SfjxVw zUVr^LuGtPcPsnSSGiZgjZqea7F(XTZmS)r9JC4B z4#)(~wp17hxcSf&VW|1!lTVyZKV^q0Yik>YKn+b5$`+U(UUA~Yp_&ri^tAWx-NufN zj?T_@xf~Gu)Usm-r0MbW%2UubLe^-@Jmqjeq+@kSh4UTm<^#p;xSMkH~gw$Kw}bpmAzWZ_F;%4ijR2Wesibs*W=tK)fgD{@yb*l>DHMq$ z_`BDOD(V8GQQgtuL~AfTIn5SPAPAKt;0Z}We7OJ>_uv^O{lr25Y!9_nrz30%+IwPx z+U^K~xgcr=GY=y$X!Pvt9HtZ^4WtFPTWBzZA&bn-ndM3u6e%#d?|kR`kXI@zt7^*% z6Er-p)#F^XT>0b@xHtM73T=$)1^U0URHn>+c`5teJs15s73l9ztk`4&Yp9}S*qjKEMb9-FWmi|v#fz6=lgIafp~9SAUQv>r^CqmvnVA_*rvqEM zs;ctE7juCoqY}gfrl+Sc=Vj%EkbeB3Op_^Ise~*`NC8#>Jg>L6Z+=0AvE!e33%ZTN zo}3DCK>}Wd{$qPU=uA#Z?CBZ6GYboAMMYUyR)`cBNOyN{SR^qe#^HP+sKV`WcXz@s zI1XF%o*mo4#bKj`DgMZj9q0_+QkGMG=x7ye9@wuzF)E_@Pz-d_x&Afq5pFuhFCO^3 zW?)NtA@edqCW-drhoINca391DN)i|nsQL8tjL%O1+Ek(zQXBxB5Ax<~uf6j8^Uv1S z*1|CZ5%SELQ?I`I(y?R5a&mK^JG$LLa4+aOU;gr2ufP5}#7sEGC|Aw?uYBbzzwsL{ zKvah|^YyQP>9>CCYZc{%LZJffJons5Jb-tBhJe`+q?ybBTstT@l&!?XbPx`Zxj+C; z9cZz>*49qYZW6%caxE<_zyJQH|LH&dmwWf_;h!rjt2SFuqk(1_$wiK4A^w97qJ_0J z8#8t)$16x@2ycWC0L=`96j6e(FO&ZghC#v~aoRz2o_XdO_*&k0Sz<~p&PMv)A*=OPQ`}05llY|5vO?1E{K>vZ=u~?j!FW>F&AAs`} zkseTL@qt>74NEIPOaW~|6q?ryy_Vv}Fb=>cI2Z8@i8k|k!79MR+#WQ@hliA~D6a>f_wL;T{}AQ@ zj1A(;jjOj;7hH%>H7GUPO3U}u>>&5{9j8v6f>r_LfDHvev;#VTRlqCUZsP8RevFL) z{tBxg%yF2~f`VMcg`;m+bPN&wbh&~agwU*m&tlPp^vNgZA?lqy`^o?DfBfzJ z`|W^^13(TjbZK!JPDD%?QfQ*a)Y76EO8|r%{4Z%~s`+`ydyAiZa{1P+dVFYYZM}1+ zv9E7Xw609_R;KZbXTF$$O=sZAcp*aRA@hO!f!x3K)*B#9Fgbqpt1o})jTaDZj6Dsy z9OZ?CoIxJ1tjsDY$;r>p1b2bKa9ed=NlCU+sTdm_gWCfcG2~D>6msBD-hco73y254 zef#?L>j-iOt^vpe96S(WD4IB~Ak7M;V$Yr(MFq*=M$n&NtOLzGefl{3b|+5kMf(*M zxz9ge`|7J_cJ8cEDy1;tz{Q2L_tslqdimw&LBU5xCItd;KJBy5o(8=`w?Sp#38Rss z^o96B^cI{JhP8)zA*p%`;tN4_dV0=k4IqDx(-j&WoyC(l$ub!qq#-#usidT+tSk?Q z8f1bnQBqJMmV}#I4 z!J_JIh2VwwD^ptGk;Mjw2BE}HR#q%BnMAEtpoNKvS-cAj7;*q87BW;KQxBreZL1c) z%MFOV*F)4PiWf3sO~A5dSy;3=9BybVHoF^bVq6djFjxo~Yillr0{RWl;Rry(z|;Zt zGc+`mnwq?CU*+3xzf@6CcE6$3yyQwW8FgyS_HEgxPE?&bvHjF>SlIF@BnsI%O#iXa zp!-mmd_JgpLUb6qCnjG~ zYBvzZ#tGQ?LKg~I`-3j08zD|U#E?MA2G$ox4^jo}ADDT-qhQj+8?h762)=PR9gv`a zjLpnU|JJv@x?|@~F!I0r%RfDQ_z)N;%ovcUN=tJwZ%&spEtLp!FknJ8M1b;- zlwS(R38xWmbI?kdD3g_&D z2XRDT$Fv4KD*+s`P*5S!CdP@N4dA6go>nDO$doV)Wo2X@I(TsJo?UvK&g=26fY5{k zF7Oc{ByWuX;5#qkCHxB(_lk85)hZC5gzScJel6PUv)0vl`=ZtF7+bR0pz=t=_Ans( zU?HpFus17HTU4lr6*fIxCsS+1a&=Kzc1lKqN*@>CiL@s8?MY8C8xT~1;7QC$YDB$p^huym0@aBVx)u=$U*_W&*8IM-4>xNoSC2A(bsmqys*`6M5uj=N3A;$KJbirE7F>*=1Yvx$UTlqm3!NJk7nT4gXsmb>4E*P%) z@bicSAbV6yDPJa~h-x@IJ~er>zIoNQvamAU)X`;iInr~o;G)be&PI~U2kkA3Ys(XJ zvk%&vRvqU2l028+cje}dPj6iB9h&xs9RjIHVUz~s?$jcaJWhJ?c0@2LeeTn1){ECJEL&Inf>70t zO54g}M^l^MIpem@w%%_T?(LGGkclF^>T^4I0iT#>_Ben3>5Y%B-Wi*oSX%?HoC6n! zWCa7NKmarEcmNjll;pJd#Eu7@1D&IY>FH|j|J#51=jN_9tKaVo*!_Iy(IoK21HUYQ zG1MJE7v0D|=v`U1YLeq&xC49|fiO5tK#ZLYvUP z7_jyabiw$4*Y2fk*Pm*@2hk?UR{ z*89Uci4;STpt~@RBSzR44oxo23{G`s7RRe((t?zXz6DFHie|0f$fE4~ukh zI-v^Z)`nP`q24huKe%t#_C2-Re&da2zxvkcum0gH$G@~+9*;Kd1e_E?k&Dg!J4F7B z-kij7(+8e{q;BOWq&(AOJGPZZzIf)TX8@rTD2IZh3i^s|MBl={pz@JY*h3x;gToc_ zctIvafmn@fK5Sxl?=}D`DH93d@?J#<0x!I>>e3ku5YCa6%4zefHCnY^0|$s)ts0w{ zKl|~=S=m`-l@&apNUr9u*?f>J6H}7Ka(QR(P-jo~vUvq2FR)dlky0SFHczx>waqUr zBAm8=a7ck&Yw1GbNQ-6PX&C}f8KQ%X}F&J_R zvRz2!3G#&5<@1pGFdk!PFKNSS`-J-oCNXiM7== zlhKGD7FU)k4O%5&JQ7J=L&MA^4eqkPjaTvYeIE3L4wlJ7{r>16- zQc`mZ^6f6CDIpH>yhtiZNlz2VB!KKks&jFm6nwd zFO@{0QK|+;hVL~zKxB+J;5Wp_W#;DSjGBd|H6$7_nDmIl7K(WtT|)@>1mkRN@2YEP zb~v3ocI`ZTq{im(X?0NZ)Puu=_ZyogCZ}+`kp&^YAV+Uh3PlPm5EA#bbqrc;_OkM# z^vo2MUSo()7@eBEUDwjwF*Z57ux(EzEa!48BFp;&D=VB<=^1HKfQP|5#1f;)Ff=@T zul~XPrjCiJi5FjbAtw(3-~x$Em7S0b2iTRXciP*#4MqdBOkk<Hf8e7K4<}EgBacOZu5kYOt%)>@*mP%!*sp$!ci3^L1_4PnyHNoJ&0}z{{ z0#lrJZeayMgxG=Dd{CUAL{W*{NFhR}!wq~gezJSt-uOh5+XLZ)*Z@dT32YUTv+vQ1 zPDKg<1A7f6i$cC2*bYK7Hp)AL5JcFD(b(kV1f1igWu>sfBQdB#F16V$O>Ir-S!rpR znV38w)iKJq9cb_B(wU5Qk85arq`asoJw2_yp$z zFy^%Mw7CUaN6+NQ*!<}DLRZgFTYEQB8Md?zjEs+nWm1z)F|)XG@$wb1RJdc;w!W6$ zqMY24qO_!hl-%sZHM6&)t-rjc{POLai_2@-`2{c-Yt@p(Lsnin{yRhHD3E&z8-zv;Zg%}A>eq&=J)I`{A zU>o$o z0yt4xTALm`Aklkozx|rgn8Yk|x=C>NZeL^L16Yb+1cN0OE(#Q`0+IqG7)ZQ(_wK{q zyK7g`iYw%cs>4u%latkLZNrx?T{^b+!0z2O7K@9Wn|r={DnCEXXppR~Ay!(_);0pz z#j~%!kdl`Q;s=bPK_^DQJw$Z18r>slcaZwhZg;@7i3vxaflydnTt+`(^&&FAA8x!L z+%Z5QiKQ^Pi9mLNm>Hj3H5zpu56Om#oI5zWX0r|L#K#+qMg_cpZg+t8Yht3HtotEO ziy_7n?F0nl>V+#)V-sKd#@h&%26_ngSQxmVk&uXSq6I+5_5fi4u7Dm=Y0$Am60>;~ z|EJNYpdrKZ`TqOo0cS6--8R2qhZzkEgt3@R8kBHGf-ap-f&L);6b+(r?ZDqzlqyK#9LsD3-Tjj2Q5fPg{!tEzxaXU1zJa}jwSZ-paT$haNbbWI(rX8WuscvyRuFqc)h{&ZNiYU|(bSm< z29Wpx?GgI}p%!fMrlz;wejB}oa@yJ73uGxQ(!cdvzXdx#sbGnD5{e1(#qa(84}OAO z4Ok7V0=p_IWD?<@|K)#%gPC&f261>Rt4iTG^!bAdnZ)jJ{{27vcbu|?Wyi?GBHa!6 z|7d40^k|{j2QLHs9RRi<_y_*`(xTjV{{ClbF)Tw#cn0=TSoP8JAO0`j96%bLWpin1 z5f=LPo%(Cnt^v)IpIecipN))nFweqLx_9qh#IzuZ&4o{I-Mo1dKJr6{cFoN#fAYzN zmC4!dCFNKS1h4{)02~~=>DWJ^I3eBweA73-`AxV6=uU1LGPr4c;ieD#D=`d`k^HHu zF#ap`=ighipaRP1L1l{lZq5s_YM@O3^&wKiX11%SRAgSS8|M(T31mCq4(L=$z)Sfu zu~02j7*vgIJy0CC=NEx#EiWT|8ldRFkHOm?w%c8ZG=OTAkr8LJ5uYM1NW~$5&q#O% z2q*yr!XLD-VC@|o!kL73K_rTS48dvQOp=~nU@4d2y{CEM#Kh>#>?95e982tUg#cp8 zWMaHDK3)(1+4S@>3Q!1mfH{EO0#V|DITh60Xp}CjffYoy1o$o_1dJLiGu0ShP>=zR zPhj8C>HF|sKEPXEdT}rOmy3(;pZ)A3{OJ$=;8wWS0QH1B z61Wo}LGTTb{a|$p1u^n~fWkcn<1@&;QU>jr562z=wg5&_)ETG{Vn2j30OITQ2H*q* zGs9=_9*jb-mk=6zPRjq_Cm$gx`S1O~H@zg54L1qg1}YU(jt*cV zD0)YHavl%Z070vQvud^IKgrcWnbE=@e|$bMIjOp)QlpUo>jdN=G*rB9ZOu!Gv3$c3*1~nY9YiooLL;fHqQPf_4OLZ9Q;h6&7X!xkI@*|FwAGz`!7czh}>!hO`6> z_UP0EQcUdKvnMY%511_%dgBdh)LNPsUc7W|TV+{BdMeVchyx+uP0oIF>7^HrQ{ZP& z{rzs_sM}UmO!LAutNmv```NRnPpM4_FfY(&fE25SWd)W~=yz1QcVshKUS0txCLTdHsJSeZtY4mm?{dhp)&(9*4Z@-`v>A&O-A)v$OT_aQ%lQ{ zBS#ny?ial9-y0A6yvF;Kypa8RA(BT$3;ltn(SJfXaL7vxlE~&A1Vu)sd}tngp31Qy zzVVSEkqCOOj6%>Pwmf(w_u_aRXW~$3JL{W;rbG%st-DBCuXR^vOCJ#D5R*X#pcz9E zIeGF#R&E?Dsax(a$Ad&#jKUzPILjx#NIE@XB=3w~Ha-?pSU-y9|T|&rjt%Xe-R>*j{b~#%Mp|ZzM*1N$ORp7>wwJ5 z7cP>VG8D2Ok`oN?yLN5oM`=2{&m;w5bbWx}VE)8_k0|$E%I zyJh4jAu8p}!*%T?$P2jpx+XOBEUYBNQyC^(kg!oz9GqYH;rf}BX&=w!27fY`Qvm9Z?$ z$~;ugmn*9N7p&EN#} z5n^U;A1VbR*BKBCBvT|Q7)a&a(Al=i3rS)sF0QBKsui%o`f~F^FDFCc;)NtB9Tzv{ z+q7|>wa{fr^KpD!;I2YlvvGd~bACBz5i9PFQaa#-_A@h3!W z&cJI$fKi{}Leefj&4`e*6Ba=vyCZ>mA*nx7BO+Q9kfzj6@FoOL4h>J+Y<9>c(7s_= zg})Fb*Vi|JZOLr2O?jb|Xprmq4P9b>OV_U;FNF3T;aU$dOTf3N>mhDRl*UKrAsj@= z4VO45pvqyO1uCH?{W(agfIj*#PCTC_5-~4`rpEp5bKmxq42cwrdE58}wD zwsI8h0MQwlngoFJH{g&wty2Gg#+L_XI>~^_$AyN?| z@7((Sa`M6zyGN@<&_l@OBKb!^y%B?l-~<`Wj-TQBe0gEmOZZkky3x&kaSZm^05PVhj|{FcA`zBoDukWeB2?moA?*W3{s&Z5sLXFsfPg>#ZDCR zk(?d1{@_xjSShlCuDhT#Guv!aUZ{RZD~Y!CYpxfc_CjgypRQ_l5@5C1uy&z#O7D;r@v5M=nRBs zR=if1Um}y+{IM`|X4>En0tcY~33pnAioy9nLNkb6loY9;Fz5KE9MH^l7mcfXc2K}gAn5JwSH>Ow7KrUizku*+{ol%$6z0>K-=i__mR zL&LD5X6enhFH|3_LIg*O0g;*rB*B*hCB~_XnuiEo*<3HAve00;gqSfd!3HRf^;du| zhV|f)?-88lC38eg4)VPc>jM56mii;cTQ)Bw#=5Ajl4%FOVAY?GHSZ31uwG~psT-(F z0zf7Ukm8(q!cQ<+!sKkS@GTGRfKE!5< zIB#QJ6H7RlA+xe%Q?X7Q^D}my1ZE~FK`Y9SHLk@39 zA``9o%uNYF${^Wq^zwm3LR+PS`Ce!hnJlFr423uS!7Pg;+bjgk?W0#9WTC$z!SB)WdUyg4 zUx3|?v8Y568D9veIHCsqQBqCw!u4l_$^#e~Kikr{=`go0O~agy${CN@zz_e4P2?h* zV>$1Nn;{@E=^5rG%8gKu?-*)3ox*UPUyUWiF#NQE&!DvxXmvL%}& zy8GB%Mi$*9#5lyIU@<8uU_JtPkM1frjucvj)yH#qc~Uvg#&s&>p)hV{`_UhuUT|s{ zfV8b&8wjT)|M0^XjeA^w1)UM;o>J-}+ZMogA(L{G%KC=O9waw?v56FNfYVH+AMWte z^&!&nO?lzE$@v`j05f@;%s+dQp?omB@JW_9)&?gpgq!$bf6L>C$uZ{-Z<5%EnEZU7 z11|&$a@7@b_;?Z-&%NF=j+$=*7XN(uJ7nI|)$R6r#feGW0WWMU`@nQ~Q(m~~5^wszrki5Z`DeF)&A<$Q z>r4F50&(eu#L5~y4%j&BX&bwfoKwo?g%2G=<`6xdUPvV&B>APOSo`q&TEOD;i=|>N z@Bx)?+b0wkC&I;g5QGS(67|7-PJc91`1z>0&JwTajbb;D^vp(dv3+ z2+;}gB6piGh^Y4x`IZLoSc>AK0`%2l^0;FVE{{ZJ|!jZ{R z$vLAtG)4!*=t86kcCKp9{6;}JhjVfx;|$XW!UJI4LRJ?MN&m>K5yIpnz2%{nLktPB zei7L&cV{#bk>an>X9+KSbo*j@Wl=5>0ZCGiGwfueJmOqbw$$`K&gMpV zAt~2KDp#N#W>%R!O}o3Py#;y-{Vj5OS$!b%&T^TaqABI4<$D33bFF#TccJ1O;&ka1YOy$!Q-LUA5@+Yu5=Bj~ z>{auLJU+3PwvlS3@-R}{NToWB5QbA`a`1uiLT&2&W|o!BhB>|R8|@S3dohYxa>k-W zr7m`}?CpnX2P4F~ghT=X(#dRmvFC^VRE(Hx;4gG@8IIVed(-2<_zT&`kh9s1y3f3B zqYP@CeTYFbfWeQNo;K|R`+-e|#&nqQLMCJdDNnZ^rOP#D%3l~cJIq052PSb&6x*52 z=7r2C*e$S!wrS=B=5-s<>P>ez^MHu1YyU`m;S=#fUnuO45-EnnKoMYUgKS>NurxLe zV#BhTo_YCUgjLWNg%60(1(qlm6GB0l7`=^IA%t-tU2l|{#MlYbN%k~(BIwkIrcM$> z5@L?Ye3%!ajyb76>|(j27+xq0NkyTEZpz7n*+{tpjsCG!-EzWTXZbVMT> zSomS~0boY)kXA>cB%*RRRT>Z%u&e?oxD+pBGbBz574pZ5OE5AS)k!X1DB+Zi2FWeYYOe^6J->{PT5Jf=UbnjCCV7%~ysK;N{DmA;u*K%7FATKWd5V7?EL{Kn*lb%uEz?19Y9`Cjh6 zY}CWp!faw-z;ULuhlf&YK74dp4?K24*xiPKglQIONgn?S_Uq(w8GW;p(s6DxcF$Sw zioF+M(aiJ`gH5#a%t8Qci<{&gLSPDq8Ilk?s+bqK7_%oi7+jYp6mUgvU`pv5iYark zf5d#re#Ij!pB~f`h46Dt)P@^?>Ce_hc(jiygY@;8JGL3|_*eKlRYNUuF`r{!ajq+i zeLm8oSW_GPkaGl_+hEhNZnRG}{UPTnZ`z00&{)g7X&*LyfU~zaSx>hWHy!(De}Hp| z*`(mJzv45t!1skw0tWOA1-nUZ?zz=SZf+oGp5kIl_l!>P6zxQQ5>0r)ZUL1x*2h*s zSHOX!3;uDw_vx%gcrT+YveA$1%mAElS$2n^maU%w=2w)e5rxShd^u`NW`07#yQ3le zY&0g*F?I{cxQW%If6Mt^c26Y0Hb3@a40P}|G69iPF84=&#-1Ef35A0lawkLJ3^<{q zBpp3L#~LV)h>3d#T;lPEoKBxsBaf}2fCIrm zN={MXZp2SXWnCxa8<;2l<7}jCvk;YQ;fZO(L-GEser-KvA=_k)s#(YrjIQG(NF`#M zizHYUhDAQ0fT)Wqtp!6pOaicH+oTdHDwb1u=cA_bpmzNj>|Pu4B*T(HqTi5oAL(!L zR%GoWwM588#Suqdq3}47q8H9uyonWfM?!7rhmma0@Z7}RL0vH^kPVMQ$uq|2!mtaZ zvIHany(JlKA;7L91si2nQFBrwVGK2ezC}_%gi#wQvdzTN_yUY*k!w2{2-M-x3p0&z zN_ip~k9hS7VWG;)d~tm-17FO*FZ&FDsQSR}czmT2hZaU;uvB>BW8DT@B;o>f2i&NP z%ohgW{t@MX?sIq z4^r3%kTRagqEuFfUom=u$WOb^zlNNOq)r$(94IU-@vK<|F(z1l&T;Hl0w%c z+bxZD9TpP->mN{r<=efhdg45lJ@7@k6|cs#*5vy}>Yofx(QmEa5@@Ac#W6f>-s4WF{1+)q?MiP5N0Z(x2 z74o&Em5|GsZqkRneg(2YdHmhogMIyDaz5~@0=7b?Q;OHjE7sLjNdM3@C#IHr1}D6} z#|H@Tz&8E9(Bi_%={JB9>m zC^S0M+_2l-lauo(^9>aeWlTtZfBNRSWPB0Wpfn^((imi6lwuL0;PdF{EXo+rH*{iV zvD6BwOah&aq(ep$ipY)9JYc!h{dAKPE7A_O><>c$GAJZSWf$=H>D%WH_+3E&wuwp_ z9S)pLh}rgg$vr#0h-x!Xh}pSa*qs4TT_NGqw?-7XB`_6u14K|l$TpXv#_kw12^*%- zVCFd_o?cp7vpZlV10J902Ba|NVur^4u=Uv!{@Gvt1?2!DI4!v4?Cy{o_4Y&}c;+5| z(STHvH-L5FC$!ghBf!|!dq$q*%DazBwd(;8Y|9ec2ED#}Pu2lieWot9n-_LSI?c~U z$$r>x;fyP1fJO9^bUSdhtxs7*m79#nLG0JDIu@(0z>Xnfzn8|g;HK6k@;c7^s}J`) zA}UeM#$++}iqoHAu_10R`l7wQ(MgLo$d!&MGIpv@(HSP7L@vB1hy}t+m{-$Axd@J* z)oISXxBkmb!A+by`4My<(<~<>hv^jiERfuCcsJAnkRKQsgFXog^P+GR9f=Z6${Oo% zSPX`T>4DJ+tA}I%qaVNP@wy8O^GTEulGp(_NLjE*Gy=S;o`B!ug+KpCKm4)R5YN~NeH z=3sJ;$cBX0f^Py|pHB{GD=U(NdVt(Wg#-XQz-&)PPi}4|vIR;7Jk$q6`eK+w`GN4_oTH(>=Rsp{SJy~y&)DcF zN*Rx!I5z%=I$ezqS~MC>LcD=wFeDJRn5Ojz;eCX%`RrcH+}h&o;`s3Rxu0L27@fA7 zEe{$WEH9a-#-^qq^2{&IOibowW_X=$0JBlT6#4UDdq7MCD7(+kZ) zZW`t74dW0p{tNS}1!cK<`-i%E`o{;xh6YA(kB^Lx4Gt^B(qxm4=#x=UnAPe)*;<#& z<8gU>E>FLo3z?=!#=`Zz z{2X{;?EFwHB*F_piyuEHv3Ld+FI>Oq6zL%dQhMoWUPwJgM3KkyLN+^L1Q%9dPOO92 z_vE-lFPae&uSPUvlg+)@K*WUAJpH^%g(90 zQ(swH67qX*U%%DU+2eP6ljGz1`-VF^IunzV6$-gR%GW5QW0P}uX+>!P3h)k%OrqrV zt{vM^vipZW{PFqo7kqwKZcZ+#QwWX(0t8|YNN<4m$tSlL=9kJVwzao)6&4o8nPg5+ z05m2d*in=9$OhYp7rGoap;$6AGkfFO)e9Fd-@JM2?%jK>t*uU%JuWU$E|)50{MNRv z4?jGMy4?8dJzRJ1fYhRPqd~7i-R!!$It?ilipq3kIlwW&JMY}OJvlXvI?Nsvo0LW~ zO!@qnWDo|}b-`iL+nE_#YisxMV+WC*NkROx0@Te08^-ZKwQ8%?w!C5nwVfQFH?P`I zFB%97*pn|_xN+&?mD{&(pg$;aoSmJm*P*5~yt(4VspY!s_cK$o^lDAm7xp-ObCW9z zbMx8RsR6Khm&<9fhW!CG3Tub?^GlX%*KR6R3W*eql0QB%v9K_2iqj%z7U(-x0Y%75 z3bPT$44*N>3m?x2F$VLD`GX&PaPi!w>GA1|lvK4s>392Y-nfAogS51|vf!<1unqF2E zc>n05kKkb?71KO{fX9m)Os=V+QK!;WSL8tfW*FzWa~E&jx{Z?5D0_MR^3`jXuQcCB z{q@GWJNH^2H1~9N@7TSAZWb%p+1Ydd{)4zUqd}*JMFe{1irMqtyFah3sWBOK5FrWP zj6$wM_x$wAmA<~dqJn~@sioP;DT{e^WpT-6bA`0R(up`0%iB} zixP#5D1Uc)!W@)cjs|i{|s^&rg7dOwSe<7e9OER7F*(POnqSOY-=BEuh0Ggm9`uYb3Kl$VnP+PxG2wCLHr#HL0`jZmV`uYY-ip!okd0@r7hMLl+ zPaYA8B}%zC6!dpB^*ffF9*6hprQ0nJy1QBjMh8bnh6jg6dK>HR*WIaGUN9$^5|b13 z*wvE@bBzz`zxLIackeE%uFjpDp3!LKU;XMURTZVCxH!~sM)l*uf^0~bLeWEd;p2C^ zQKl}>E{rq8t;{d}hd=ygNkN{=ZkLEGd&jOF z)m7zXQcWbOFLZs#y{)ZngM-5*#gz`b$LkGEPA$#PE#>DIA&l7{KvHZ{>C^rtEJvl`r7F!(-CNBAN=7l(uG%=#7AU!)@ z@WS;Q^p}7ak{J0Y1~n$Fe~!G6+5?drypSlkU+}`{R`@Ku(4PT5>c}80L^yJjxgNL-xR06@*-+J8;r-cc$;ePXjrqC>lAoH({?M^#c{9I`%5Oin`l2OpCNMQb)|dq?}VD-U+>I<#X)l~xl@&&ciW8k(4x zPs>P=sUqsv6Y)aC0e5tCH8k8mb?Vf?g9oy+l65-W_UbZ(r(eH*Jv}`mEj4LmbP~0i z|A()=QC5;yT2@q6US_vDo12@ftGB_H37w;Mdv#iBA{ZE@TM%9d-f1)%_tsV*28>B- z1b0(U&%itH{J6cnmw%0`;85Q!~G>C#cGujmPw^jxw5hn z7Z>-X*IvrZ%$=T^tEt((e@}5w?_^1FK|+GIuKs>bPELM4tkxo^%wyv-=RUZUms;@r zvxka{ifXo1RFoCzG)8FQuf6{4j_uoa@7!KkP+-s-WD?{*39q?V??1S=cWMo))iW|Qj5h+7Iy^WwGc%Kz80WA%%u8m! z*9((o^|mU+kDc1*Ih=m6fGCcGOf?R}>eQm6w+# zr6iI>W7M^}x(fZ=>9AYYRwsJ~Mu$gn&rHotPE2N`rx)aB*6*N7@oH03*Mr8U_O=e_ ztS}FZjtv8|1rZ@hZ$QX9KBT9oTdmge>|%(^NV+mVJAduU)s^MtXHT8dCF-P9F#uXT zkGz6YFZ|QL_;V^okoXHx*vIPhyF7mU491R4rEGe;vw`ND^1_JW>|sOO#xEj1v`20# z4H<`RifNMFhpp>{6mmM!23xshp~^_Zkr&4-ubd`BVkTlK4V&0VnfH=29F5w9kC2#~ zhkM(e5i;l+lv* zMRMPC%XkpDdIag9ekDoE6-I3q! zC=>Shjmnr_*^jYJpzKYu(JtaNNo{JUVgy8HPj1m)$aFRAhTaIkda6bvb9+4xn%i63yUNO{P!~a?Ri~$94-E|a zyx#uaA(%9$r)G6pgI=qZi-bmvGUyJJD+9y`9|Ve4!WTB&yT5CDjangZZ*H$FD~UJ80~mz3 zB7!91@g6iZ!t%JSvI725pByBOU|oa$@Z`wMQ1{4hfA#ApP9E65r$VEax*V(jzu*4` z6qG{;Dzz&0P~Xsz1G^yhI>aS#q{Dciy{wYuC=Ig3`2`cW?F&b)?M(_kRrI2#4Lr5jLKybK!{Nlx1_Zk~ltd_yC@xk#4wZUj}+oAD|O-xVEEv&BD z;u90nvoe%OGc6F{q;|A*6y~P;+^+h2^&M?3O^vOy({ug(BUi56{OIfjtHqw0nx@go zA-K3a0sI$6W*h<7oKShiZHL`i!k0)b4xdVIC@d|FOV$JU;t9GDg%S?<$Q}lAClGeq zygePgsVV6wfsWtEq+(!NMFOc0B_4!4o83JDSs9R)f+#0yad56}o|(&%NOZwlu`>ur&5$d_F9Z1w^%GfAM}5RK?4 zBd(jCI^x44L<%|iA}>M`(%AD{EDHpY9xu70LHs14VRSK=KCG{WMo-$NHHI0V@kZNh z(_O^rb>1Q)q+j~fywIQk(n4gj1lwDCpurtFaImyETc_34)>Q1+UY(wnJ3qHPJF`$- zRa0J`2Qj3rqx8%7)LUu+XA~|4D zMPOuz1hbKi5ZTexXC(9|p=cE9$LkE%-@0>j|AC}*gP+RQKmsR0pv9t$jI@Nr_^_8h zGCaP#xVU>qtx7J2mJ{>~u3x)jvs$;;)MAS2?%t~?D~>ZIpjZKXnFNW?=hxq>Qz{hO zwpEFRLZ^g+g}~hz5}4;#NBTz396zem$<=Ccdm9wp=KcG3B_`;R8&(hswl;Sk+`j|a z4}(5yd)p|E;_UQnC@5}gX@#7dnv!9)_-1FOp{-u|^e&PmKX-ap2&IWbf%o4%-`U<7 z^n13~R>mh9fA-${6;%~Gch^|$R+rCp=-3gTKXC5+#j5IRtzJibO9K8t@67Pv=<%aR zw^f#BW@Jr{&x!?-Q%8>%W#=R%CeAM{!Lyr_pGosVN^)S1b@T(}m7^#;srpD{T^?Vn z(q(33&M&Pjt}LH=_Sr*+cOqSKYFb=DVLH_AxP-XGM4eova=Lsnr5XS(Oc!*o-0ZZ{ zqU_4@ypobUl~Pw+oRpN9I!g-*r`3Vp$l z#qNUcB9_WlRxJjTUaAtxB+{9=nXA|Cp8fbr!~NctrvCo!{+{*@huwMmc1uS`-~EQR zhKAP0##wcowf(b+z(*BV_m7r5Z7uf9-LTDfXogZlo)8_yy9rMsVU}!|C?^MHzm%I7QpO?rG1^B$GZoI>a`M85=ONM*&8r@BF}#qV z5|Dz1g)x5oL~(L5&OQ*ym#eK!c_G_?zjdeb)9oV8!G0EA7;wUQ;vXKKy?ps{K|#T@ z&+b>N1aNyur82}_D3hVX4o}Q7rckk+S33+)b5{b8>qO`KIcHh1| z2M_K$e0bmP{e`J%TKH^`fG;yM_}En9EgxCL_`uu$7;iu?io;*zDKy=&jTTBImw zYa4j)z4vBkXR(Vw_ldw74gWF*H5G?cG&Qv?EUt}>O#*I|k{kz_151N1)6&zSusWOpv)MT_z3}eO&fmV%0GHugZ@rn7 zrBld}kijXGO2BY&KrUXqgbb8u0Yj7UB+JXo0F;3*0`7}#nUhmwOhl-K(BW|}Etz3r zO;68GNlqix&)sgAlre96_UuVbO--OKsa{c-pJmc1QqnWsZV!z1QkimUbP=62n;r0u zkBp3HwR(pmJUu(TVxDumyc(5uYI1IAakaar9%>$>hLxQD=yquHsjM7XpOFn6Ei`z`qhNL?#HhP1u(6 z$ISc}ypS`df|)UuNY>pm1xD4=(^FDXl9`!4I%-Ck0U}qXXUxD=fHC;BdO_ zCL`qij0;F9kB|qSFXTeVgx57THiJn3X)eXXk6R+SJs{f`Yu>?ruOJQ&W>08=Haht*dJR40vR8q@#Ce zWMm9H13lMjAuEt;dTOb$u@TGR@w(R5+`YX+U|lA?&g-&5pTB?>WinIIhdWDHNUX9W5 zKNWXIK^9Ds{-6Mvm{QZy%FD~`c1QiK25>b%dEvtb5rcdW(9_uXz~a(0c2_1m)wvi@ z0T>^QB|5cac6Jfcp3!Ims0Y&C(W85P9y?$)hmRgqs1#lpu0AhbNaao>r7j>T&^gcG zSI0cY6egCV41cB9MJgpZgo4OyK_V(i%?cWH!zr-i1ZYsVkS_qHi>a=FCz)_YX0hp? z)2XqskaXX0G4Ew-jl_HxeSlM&Wa}dMj6sn!LL#0<5w=?4ry~EPg9LDIK^KW(NjNzH z!*1CYPHHPh?#FX(qV{n;jC>I=l+lU^Gkfe4!nPAiNlee97h8#B{sx-Hgyyh2#!NNw zDN@onSt(+Hh&;t!i&$%{O|o@fh}t)>bkU7q(HXrB{z8BZCGZ^)Q*-2jM>YxFn};X` zmEel5u7D48u_>$t(>2Z(HeD3X2iWf=K42^y6<-Kb9|~^(sfSV(c^;dshTU%XJREl5e^xER$oS~t~OP4MIwU6aHeE9J8?PaTG$E{m; zLH!RM+Er8pr%xf^8*SZ9P^}b71+)@`HhR5IgHe;1kZ3Z2?K(k;N%*ae6 z*77hS?ffuT$|WJ2&CM73u`mc>bGY0RNhCg<%?mLh9c^7%X&G9h-UXlwynRBx)#|m| z;OO%?9NyG;J-9FU-yi(Jw`yy*Z`)Q;T3VEv8t3y1pp9V??%%%;u^=No#ZN*3{cu+z z5}>WU6KY3UX)Ziy9tmDZ^g=k=`?>~421kw@-0$?*{`)`vGoE?%)#m|~1Wsq$wlYwr zw$_fFJGVhUgUo>d#P5IqJp_0(G&DgdfdvmH=!%NG{(*6g#*~>EmzkM`7yv}c7Z+z4 z;e%C55oDs*Y4Y-Nl9N+08zz$p3#vC5s%ok+UEsTj7Emf9>EmZ-mhRoF>+I|u9Gq-x z>xR;a#X{s?drRl^?84;CbV+#`%?l|EX*?ej_d}f%p^nPOr~jSKnA#S|AYx9WIYiry!1okN{CD*KgJVA_UYD<{8uju|jat zfGIxz{PSoNYklk1t<%q)Fq*XROTv?Szp)ueHMNJ>g`SQjy$JNN9AD`Y_!1t=1ZgHB|$hvN%32gtCGw_GmKXcWjngu|oLNf91H z5tL0x1h^F}&LBE#YfiU&lYADKP|yUzgrZR_k8fRtxEzW2ki=q3NWoTd(!=%Ri{~J;dk;!3Cir^_y^LLHH0;x7kMg6&xyb`@MU2z543Q z5WO+vtgOuEo_p>qU-`-({^9R@`O9xsRaF7-`R#9i{r7(F+k5x!g(U!iGkATN;*3*jNAPkNyKJjasc*r4lF<0H2E!6V*neNT&Xn_7$`kl#lO0N< zSS;QfH+x!|hw2+U&E_@ASItduNS0KQ2*6IrnTWE3uiRnt=|Jd2g7@FO(A6=>xpZ_` zJvt1f78pg3+l8ol1d026z;qy5Jb>VC5)1EpC^s+O1+@}H-)gmg@B2T&=hLT80U>+r z=mDJi8#nH;GYmtdglYtp8l2$FnWMngfo|KorB z{V%=oDrS{=5`<1A>b_x}BVfB*KKMi?8R z$o}9*AD=yYX>4-U?jXX4$4AP)R86psb!>e?YEr=_JpUZ(QJAmJ$y zKoL766@^uD!r$>F{&(w6!{FecUQhVe=;#!d^3b7!Hk)s9auJ+TqtIwI8j`Dr0EWS| zArO--4XF_efeZW(8w0`M_q*s8t27o?J+Wb6h>~<>S!zM9> zIEQw-4Y4UWZ`eJLUqS@*Ao6E*6}f*lCtVPK78aIlHv8s}KFJf5MKp{;!BEnzRvHW$ zD^LF1y$h1gfv!8~eM1nVD)tR4PI)DD|mQz- zTTsXaD#Ue!5tliJ34wMCi@-ybstFoAgkg4fk3&m)^UXJtlj2lLfzcHI)?05un}Hy~ zybhEang>*?y?eJ;l;>{SRs!vW3MV7cb(qF*$ZNAMfD|I$gZULLiDIUZ&vVb7TF4(w zO-*{e(d!FAE2e%M8xTy^_-%G}N_@N~E>4MNv1%rx%Ai*wc>m$D)xoa*$-n-)@BQdU z?=G)cAHUC_{_NemL$3#TNCDLxiDO=Q`Q(56qu)M$>`-QA=E;-C{>R__#&3N2jr`ms z6&NfpjFb+LrSyh4n=|Zif%*j@`rtxmAasJED-_B@hYqMzu{3+oAkn?mHRtH)81|vb zlz9GpV|_!9)9J->AnyT5Ru{coE`M`#FZS87qes)y;=uHfPY3uF5GpW`l@G&tCnvvW1N4+2vFFQzGXsz0+fejk`48>b}bA~ z37lReT?8`NLW{P91!$X1l|I@ETIT91tJavwVD%IFr(>?QNe zYQW_~ZUX4!Qal$iG&*091aRELEA6?b=CSO0_l(3(%_4GU~;WHgY4kw*$5 zC6)%ID?$i#LTUP-)5G`p?p?j%SXq;WQLG+cl3N@IGq)1y8Qq?-&ff8^zLoJAd7FyW%YDxU}RaaY}g#ico9u?QenmJ~}yO2p&8 zNNx;>2ujPkAj1#<_~UK{9!X>d3hzbYl|?Y-(l@l=$Q=}h0(cj7GhYH)0JgUNMm{Fg zbiD#=0F6ghWU5u(s%ya=UTf`dw+EeWzE`LgDok>jL6(q}EYgU* z!jLl*^a%WNz0eB`pfuzS3Vd!~T5`hi!@IxvjhBDxH^21C3&&0zIS6w+vSebnV=DqB zERc$18fAK3YX4Z*|MQ)H`0Ky_8;g78Yu|iBV^VhG1KOjI{gMZmN7ni0jsY)s@ z&08@qEUm1N!0Tv~6m~uQf%q?psSyQ>EAtDg3hy@F{r(T%`QAJ4{L2r&|Igq5(VBJk z%`d;0onyj7B85<8P?CDiNO}{w(I1rjz&wQa9p32;d;aO2AOG>R!$-swmvHqu3jA z$dKm?IjKcRRpJQE?~AcdpK^Oo)_W(t-vQ&Wktx^*{U*Ul!PNc$*(} z>&0Qa*X|P_)KdgI{`9hEe9kOX>O4I0&HC2HmZA9-C-Gu{mI={xcxrZSW_hBlrZ6B3 zx58&P_~Aj-ZfgY`;ZaE40;=-bjTd z*{L~ke2`6fNFbGYkzOcy}*cyr+Wh4Kq!E4cr4|SLwmhG`@OomEv@%=9;k^+QO}tt zFI>BP_Tne{M0H%M8en)R`GBfeZEKxf2-&FLR+GQ)V2Ma2Ty^^uMw1(PKP9|1x33pD zZt8AYZFZzzwL4bs-n(In(^XX#E?FEOU%X|APs%PRfIlTZIYBH}-K=XEoSZ88b>W|FfFl(l zu8Aak`?gN+0CJ=^Eo!#zqDG@a3L#7`vRLG#d?)L7~#3Us5gLnZU0k_xb zfmEiJi?vFj#Lt@?9=m?=YS86fnOk^puRcMiwl0}}`u(4*Ei6xsjLnQrm^8YSxC9T` zYgC|RkO#+zO3d$S>gsyXQn;;1r`I5_1Sl^lLPFpM3oU*9G6fP}D3P5XGG{C*fC&#^ zeSniRf_NsT*O1+6S1M7v6*4WgG6Z%BI!Zo=0756}%Rr~YR7?f=5^*rn5Eg=bVBfG) zV})FRRR#T+QT%CQY;1mMPN{*VLhSXBq6YLuV0jcQm3%|98tTGn+A7f}UQH76_s9(+ z2p#f5svtySoJg8WB|@_7R;0|pTXZ@l44485k^sY17KxnzdzQ-KLU4mqgBwB42K^`e zDIzV9V@_koNy119icioK(IG*YpzFvWZOVfyH?v^uOHM+J2~1-oeh3izEu=r9-FP(P zArrHOpKLT;tW1CO)RK$Ss1CXl76yrn1H(b60g6LFiNGG9f>Ovb(U~i#G}*ZP0?@*+ zSjund=?U;dWfjGI2_(JH^76`^`g=3;v)i_BOGz<0d_h0~foqV-1WT*7mX5ZR^kfhP zzBqX5xo1)`63%^kdD*fyJ~KN$Gqqq|l&U3#Wd(4xE?HKZ;Q{OKPD)RyD98)C+!xMY zoERUUnVtp0zQ3>M*3DZ!B@ap)43Ur>AZmaxW6!I!%EZ)oZ@|5mV)yM~G_Bus&9BAg+yP#34y88r%} zNPJH_hgYQvb;B~_SM~zT3Tr|Gkf;zo;f>b-+Oc3+4KI;?(FPH)2kWH$n;2EU8bwM zd=-n{gCqz?c<;SU?~r((8<80Z5CH;YRrj=dDimExCL(X#xN-0Ox$p1$Tg1vB^%Da0 za~E$fx`^5T|*Vu6+A$=Qj{-uBGwv}?EO&Rx3L(%xQo=T`qv|LDXx6a$Sd z&7d#=8L$hTy?8DqJq4VOh!X0e7F{k96PsEaO*TXAj%@}THR8mqMarVQj*g97y?Xfu z6gpQg6D2!-;#grx9styg-1MT-e7k$`c0=9t{7iaAW~?oil%5+mueY|f?Ag0x=k6Lv za8Uy0mI9r9y><1so7>wPTYEqj50crK1PoGJMW#ncB9T{u}sg* z6VB`#9K|OwH8-)MUk38ZoVk7X&Xt>&3rlkKrl{+enw%~iD2S_2GJw=rqtmtQHM>2b z;DW=En34jqo{UkJ3-4|Wz_=)#$K|sKwL7Y=u7%h>;bM3zV9j9mB&Q0nHQ*~LxFrIuS1;bUe(~nr zyDbfk?Zd;PP8aE?3s4{3yn5koV?$m2o%XJtB#^~fDf5fY8<%gM`SjeaTLPK|lorbX z*Dy49&CT~%)STeKrlzJboZ0A75^Uq+lLTzP|NWPD?bbZ8W5r43QI4d zNg(?aa#IPwMOa9{xTXe2C@8mWM`e^jM}n-V+J+7BB?Q}6^#j#)8>EnGv?NL$>xI@J zUaQ#uvAC!{A#c*+kRuKXm9&U^;Y2a$r)CA9zpS)~fx*dn>B80K<`%p_xPTJltt36e zYK>M2L~MT1g~w8ml~h)cM3JAHfu+t8c=qWho_pqWX?X>{3>I`zaUl)jbb9mWKj#B0 zG%Go6Y2MY_*I&JD+o8h;a&q%Q|7B!m%?IqYwL6&ncm`$5LsqBo7P59A)*|HqCsk2F zfgg`X1TuI#dC;P#~F73JkA@d^CN z?SmXUKx^F5Y{Vs`@pgj&h{)55ONuKhf&6R-&ypA)uTBI~lPR)kpxxp|Gh!r04#GI+ z&YxrVV0fQ=@=5TC5OuQklM=vF?Af#D@yCwu-m$X~-qEBabgw&i?}Ah$t1>M)#b&i4 zt$Ay*(*=}&T3Xih%%aojc;bmuyLS~A<;Uk2=A@)%0OaWH8>AFQVNn4vmpk=MRW*e? zEWKdCG7ECDvVcc&=bnK9-VXOANh2vfo_C9b8}G&R%rp>{+HKp^6dW2uimN(Ec@6f` zrIRO4=H}(n`P%KZ`}XfU4NhwR{_4ugn(CTu)iu00_{l(;0Nv!#ga)>}ys)(N#o4nY zvG64w;Qh+Cz&c{7&Mz(9ZET#Goh3?r;=~EYL82v!f`2tNCAGY?G$AR8TQdnW($aY8 zvvYIIlYM*k5+q}sd_Dspqm-0nb_SCvmLwdU&)aIt$b6k8Reo`ic?CF%ZiJR?1qJyq z_ar4HR8?2(*;94+;I90FEcBYZyj&`LI0+J)%{);>dBxt^Jv;}5g*R^8x_zgixuv7^ zUW?r~E9R%skei>6uRAhO8nRI5Bku)OTB_yi3Pz32dgdKocKv9od`Jg#o2Npa0noa3 z?owH90W)>`_HB?Jksv~FH69y-2zdfwxj#?k7Pi}!x~@yEaicvWmh7E3r131=XVY-0Y2iSef80J%Vy zE?wKRhZN(4bLXzIL4ddg5Ow0jf&9GmU%Yo7&Zq6$^C$gL3+SrQTP{b%MTgvr&cFP> zezI@Zo~OS16fX>lUiJcZ5GQI8?>V%V!-xC*Oh97HSU{In*N?Ta)La(g!L4t0s;6eTQ&);JS zef!%lEiDBYTcrY#NQjOI2jT(Yp5qvZgepME5&v*H{XA*?7uV{WoBsHp|1l*SfU1$f z%``XvW??jPMESl$b9jTeuA}i(Md8@9gmg9-EKNEq^<*QDCQksikH}*imfXQ)TlDCx zoj5(j#JoPdGK=$00!#VXsY|Y4j7?M(u$iNro)xMO0^l4Sn~I6CW~Ha#&ti{bp`pxy z7^F?6vD@wQ_&u?)@Qbo@FB5GQBvl5ZaF6Mt8ykD_^Rv>^W9R1sAiC$~JR|OL!i|{E z0u&K3pV={`Fl{s-SV9flB0o1z%3_WT1*X5j7+4NEKpA*EDak3IV}fK_XdUF?h)oS^ z&}bAu4&e~TB?N3zP%zU?A(imH2A6R=DFtuUEioEG&5+D!#0FkMCXuqT#OhPs8SNQJ z1^bdZtZvmuPk^I!I=NS2b`Ey|dXD}Dec|}zL|SSpjl@~3zR)tF9V)xV=B8pKZeoJ; z%7iT?QV6BjH#9JrlAI;3k1@o>M0@=qpshv|^(uG-YLf&A99m;UIi|k;sl*f=0%OVH zKowvB$qPiRGH!z50qP)8GAKwy$-Nvz2(jy-=&<|4vH9RRE`mtn~hcy@$&U92!Zh2p>Ulpwl_LUJM2f_G(y)lre`|NC)xP*RNl{%d?b}6d8>cuP)>#=A_qQOd%0FTD#lswH`nASYmdHRN973 zM9gCro6F@~@$1r)5@M~<<3m%+e$Q~*|FBA;A{UGsRlW{oQ>G)KFhPB}FLoIoQ*mBp}%ax{VKYY-q%7cO*mj z7-GgO_4bZ*c6KA_=?{2{sO7-G!0_eEm)Y!+@dzYZu?fK4#ZfeLdBwftoERSMq8iQM zFixv@D#t_{{4U?(?3{g`N-h)KZ5>17V+5QN63okBts`5Qw1fiKzGTgGcJ{C}ppn5n zzc@A9)z%Jmz1QhVj&HBfr^uwjgY zL0Dy^(gzOl%a5vMSrR4?XhPN}q@aYeB(bf|o>J^Wz6VZ%m8q7LbPOO&Ol&Os zzO=vV*pdZd8<7Y@H1-O}TRMaEkOobFP0&GYRtp#;%r8WU?40C3bTtY4C>|FX&R)I4 z3D8C8;5z{!}!J7mI>g zCirQTcPD&I63ia33>Wh~?Jx);PeGEeG)4cJC?e{?;{dggyakMsknUUqU$Nwd#n|T& zEmn~bCFZJxjK%g9L=t=@Dw~l3!_bL=!e=fy%A`t8M2@1Ph1E!F7)4U8F1ik1rbwEJ zUa?sPoQgfwin0k!INKZm7O6q`ke*)bdWcuWDYLd_Q&g1GyW%C?5sR2jMLKvS`c_(+ zotl~sqwDs{@}oy9(fPnwVi(rcHD9}2clq3n8&__EUE5w&4Fu)PC!b%tc%`MIo0QVW zA3rcZ?}P!D>=_tT_w27+w7UWIk~<0hlY%VF%Wc&~B?UQI*?3gkUELkAap2|*v$GS% zkmbPPL;DZ!Dk#oNOi9D5?ezz(Wa`8lMnm@9p_;0c!lL|+j$xJ-ragKM8vzhIHf|6sUZE$5j7Vf5@PqD-?vcTv zLkAAnQsd>^L{=rMgO`c}_7^{WyC}CXH6i8Zl^gHB`>PO2UzFbGbl<#k&1SUhtjV{} z&A$8QuaIOZ@rfhdeaOFDeD;avzAkE?^yFsd78d5tPE7y&zy3pCXSdJk+EHEUT6CU2 zb2ce9F*7BVN-_wVs~0Z8F~4hjY0tpen{WP#q+Q-V}YtO~A=eVh3VQF@9nj$Il)AL1nxolnUy!rN(3zxhOK`+D;Ub=K8 zGZW1(RWZMquH)kqfAJT8arbUB&}1xZ+-#lA9hW~pi_C_swx^?WbZ|5^G1(GrpIr8=5-z*_p=M^;DB-yxrK})kmS3?DRNF!M**nw~*Wpm)#s| zjfqJB?;;WgB>Ha=bar}M+FFr?X=!n8LP=kdk5nB3+%%o$!LpE*th6SCIKfV$YT&<6 zx^Pz-qHUIqWuX-M5o=i5DCHef_8|+rQCQCvn}sYT!r&umQx^D1DIF-XZAu#|>LfJG z(q<%IkNz!vPvk5bZJBzq#1X;sEk`2`1<*;dBEq+pBbpqtoRb5t@)mQSh?1|Ae-?p6 zZ72%Gt|uLG((=XX3pESQthqpP14``(3s?wX@n~U1D7=kE zWW9Vlp&v*iAon~hrzLSHKLI}%v}wF=qzQ3J$kGG|3@jV_zWAr~Ww;$#w#hvgf>2VR z)Wa(e&gu|7K(mOvFQviouu83mPjO#K`G`D=3$FA?JuEYrfxBaMK3N@#>|X0jr*0AnG(IhD(#D_1!MP*8+UBM+L; z8X0X#ZD2`>&*EzNzDk>-s{#VaG!NrL<%zOZ7OHCbs$`+K4s*)k@Uo8&^$i*f{iYa?!1gEjMr0 z-?)Lu=($th2dEb@j5XQZ+>Cg`qM{LaYB3@cGE)P9qXeP^Qztk)FgQLsdT{?9OENXd z#DSqBz`M~G|tdZ|3FX z78mA8@w1g{SFYpY*s*KRrE7N>u9seV@rfr69o%2p-7`j>^%IXDD=AK&oTQ>n>G9)x za8RQJguMO(yJ|lF^gJxafBfSgKl9{~qlfldOtCkvT_*^Uo)TYwyRj(0;N=%yIC5xL z>GrDrfnk)|;^Gnswj!%OzhGu=jLU6{PEd+wKaeG z`>!9|zZ+obKyTmfo#ok?nN+T!SI<6mLKpIV`q5b`3jOenZ@v1`shY~_o~}U#YI{u) z3eK&Y^}BcOeC*WG;>rTlZC=5elvaSFg=+Ek z*oDYKFc2Hrg{aW$cf5`0=pMK?uKi;;ax1=6WQN%CBD)4#)G9S@gw-#+3rj6+no0E# zo%u>H-H0zxlVwTs&g#d!PX=tUrvf|_*@4m4G)R?|0KT|vHA_KhU)_f--t=KF6A2Sq zkyp(=JlZ&H&?ULt!g``V1*EY#Lf85JDHbzF*rE$ z!3Wnr_@Mr0KZDz%6Gt#n%`;!zy>sUt2H8_jJ$dx#k@$E(hMva8d$;f0_}QC3y?X5; zqy{syGh-7|aq(7Sfn=3-bwlhvJT^ARo3q(0NQE!H_yX1y$HBGVS zB3z-LVCx~6gje(M;r-wF&TD`2CqE$L1e5`B3w*YOqcQOLOj_#?e((larNz{{QK=1x z2T>y%XtHpvYaBQ~C?Ia1_u{_G&B)3~j#-=u`UPpa885LlTAvh44bNalOWXL+qSc^3 zdf*V3>G3`D5`!VQ)fZ;m_W30+bNhByyXRzN7UdY^ zUE8-k`{a{BZ*)A43^c)IiZB?a#~nCtch~O7NJ;Q}9L4zwCHaL|nf5t5s!xI~wx+x? zBQ2J~FfRl}&Z@l?NBSJX(&)Vk>)udxfkWK(g&1sosuZZs@{z>!IXh?-fL|JBDI z_6-lt&Cb61>dQsth4oF%*XnMHGOC8?;F2pQ5Y^ezO1b8mUA2DP{0T9xsFf>MFHKAi zJDdw7=oA05JLUpG&%oqJ_wYbger`c&4nANu?}nC^raLXOqYH`gnenmdPDk)|T}yLg zS94R>(84sS4)u)wiRaOBw0;ge0GjVp_JN5G+PgS5fqEvuq@0>wRLq+ieqGA zyt%D?-tLS|Oq^=yKL7C-{cU}BuieH+S6f#3doMiq;*;C6lXH#1Ku2RkcXRU$^-Bf@ zlX6q_NfwfP&Ctd9ytC8elj9>hchp*vgpX7@gsYu2-kF(s%9|CImll?1)VH)HrYDwE z71_ORTVl+-)7~@Gvt!?`D3c+e3*2hFb-SrC^r>Uu|x-up)k%1+4-PqciQ<$Hen%vshabVBhth6LTiC!ngy)4P` z$@C-`GC;nJi=eQum{=weTtMwPWyRO-*4OOam6VX>zbPtPkT$S%s&S>rB!aei_D zg=P$WxuSxg46!cak-hL!?B8FD|NO#*3uq^uo&6Us+-kf#I?z9YWs+A=n3$w%XsSE? zF2~)b*6llM4c1s9Mvvelm10ujl+2y*l9ACsYD~}r z*3zc&LZvC3WU#oHmh~b81c1c|xBy^3reau--xn_=R|>7=zEfL4LxYa?03N#UbQq{X zd;f{+&OkvOk_r(gE0yOJL&eb}^FW`KE_I#>GpPR%}OHVd#K6y+s*jdM-+NNisB zXi<94eUBgK%&${Q7M0B?#4s87P0Xyo$i7S}3|qxlq~Jf855s*OUCzbn#IwshhvR;YS-OkRr?= zx3;-mh<1+^h@k)(4=EiI!H00}6J>%0^@ra-_Rs$8xj*=$r}rN^V2-hYZkNl^G0rc( z`1~7heCNkM{@xFN_}y1tdF4<4^v4wHB!-E#2cas=3n=&mH8JBbbpGHEeu!`Lg%@6c z`|gc5-uT8hzVWAj`lsLf-gmhef~Y_GqaVKZ+G~Wn`4s?8+TmA7CoI$~=^(~S^qyWp z#l)9f$p?UxR79rsaeGGxP&RhCNho<7i~soM*|*<)XL5SV7x1@rv;z_Y-iA@7j2b&N zjq?+T{WjGmG%o;50I4Gn0)V!@x$$rR;k~;p1A=?gh|F7o$U*a0>@OHnGAcwOfrB5! z<8%gi1yXJ}m_Q)Nv=X%2p*Rv0pmIfJr8S9)Q2Y~FrQnB=vwju<$T}eWW|K$}lg>>K z3B-qc+?1J}wSCvl-TU`!+qq-+{(aBB_ySpLnYk1NCCq9Rv3OBM5CcsFmjP@kE#q1@ z7*|S5iogGZ?^SKzHaR=<-UlDO`Of9(d9TqLZFftY_pAe(H6bNAry#!?(D&|L>DgI( z4(>mG>hbdGY{rTv1;P9V2o@XwAj){&`{F~JKHcx!1#;@t{ijm4QvE@*+=0lqiPX4M zfB5nPrP(YwGV6OQg?Kbh%|2}X(fIk+o0W2TH2Su|IA~tEh1Ip%oD$Cx#T+9wMm3w= z=*x&G6hTN)ZIn~vJfW7Sj_;wE|Y^ndK^_tsEzWAU;Kh{8-(;AAO>!OL_rL&8Xs?k zRB7kV8rYQ(4;2;ZM~>_}eE0w-TzLq^y?ggO`|J~^PMw4p7wFl6U=jg&DgeC#S&gTNxQ%Aa4}}?%bTav$Kz6 zSEXg7l+P2Sym&@-@{=!|_#gk(|M1#(zBw{I!EaZLdPp2haWTt=sMwVFxYVSS?2Oud zwR?{oIQ`tA?7|c`2;F6`lO#f$nHjYa+bES5n2j(UM>113eXQTn3j~2W1Yh@`(1@-- zaTcr}1*x8q#>HQLytMlOpVGSC>O&eG;OCls*!rXK^M`meM3UA>YLA2FmBQ}X>ahaZ zjC4Y*pmdUP(C)(nJB9%#k$j2+dAP;*E;_3H6q`$jtv=*Gh3hta+K6LN)NDkg`TgGc zMLV)f0qAODv>`q7_!yL!(~oy`=4Y75s3DJ2$zlqeFyB?x=o zPk!>B-+S+u{N%ako+8L6<&+4Aix1)o57v*^;>ofA4_Q@J3Rs-|9q$?U!YGk0lX>Sb zn?$)9enr$!vIBt2nqy)t32{b=pWe@R(0@w?4Sbd68K=VoS=+MT5Nk}#OoEKv8?|hV zi{VRmC`5G5hYe;i>TFRioI_HEAHsvDggw@3vq5QyH75Io=rHL4xcDRxqeyt-MuJ=x zv=8Pm1*QF>&l0#1{#6HQs_(q}8RafNK7V!2<*+6vxI8uNk;%@EU6&xe{!z1Z*&4&t8-Crvse>tFgdQ6jgyOWqq9r4 z*@IX((RAVUK^R23K}dSlg_;o^sEF)PEsi=L1E zQ<3&GSDZ4FH-dXe>}%rOG;wLO=d01o~Bwj8_8KiFs_819pDIgdt z%oE5tJwrnyBG4|O{Uu~Rz5Go)1=A zXAK$5%LdnshwJ&k$;I5AQ}Ts~2dB5R%;V5Wu6ItmXwwp6y5N+MF`VI3T3lkxX@sW4 zP)O~|jf+O4QRTl(bs2fe12TG|x{uKC#E`-V%_3ubySjSE#wHYKuG9_T2n`0JIbE&* zU|dRNQIiMvjC{)JG%{Y3e=>A@CI?Q^WrefD6g2r30>ho7LHja&qlbF0KICId6yxKA zy$wer3GSpn2tQ%?6sTW-lMEo&%QddBE_{CUPM-&FO%#P|z4Jcjw42rfOUw32XJ9E{ z6gcMa!Q-%dF@<0w5t%P~gWE+JreT*e$i3JV!jT~fx4fw=Qz!_fl9b^?aAvMM)XPkL zf#$E&_g#%zs9N1%m1*2p-4V^Dz9wFXn_Q{o%UY9XITM>#NcLVwM_+$eZ*@62<_YAw zG3a0;#>WQR+B!zYM(dl}$)DV|cURD;BMyMpZwcs9QerYPvdEAizmS+8$*sA?`8s%n z1mTvL*>e1W>Sgd!aRJs(cXuz=7;*xyY+Q26@bCyLwY{d z)oU`-F^0hU^9TsC=xTC0lSGqHr*1 zz?hShA&T>H_q_bv%*-qnHs51p^O|7nIduG3a$3^p)Pg7Aqcf?Qi2(vCqAZS}HLt2F zrW%a2#UKV(0zQ!=2%`cSIy^XyC#9xLEzI4xefN4@y*IeL@6f@DYIt7sF(zA1cG1j? z{pyt)-QE3WBUQq|{KoFzSLJZ65N6IVF2<&$d^Q5UskxaJhR4TBD#|Kr${?m)a(mBT zzG#h0%*@Tn%FBZ&py^&~b6Xn;uBEVt?A&HcwE9Dy$+?;GnhLgS+^~_Uk2na~th$lW zsq5!1XXWPX+FM0Vx+uuAE~i4urxM3T*gVN2{iQhAlor$_zCc00nQl=b zNM{Hlk-COdK{kd{=v4U$>?|OLV6$^VZJ!uVy&fThh-d{v)VH0Snt%K4cj1m8O*TZT zB2vS%Or?8D>$SGDUATDT;)SagovF8@yQQI(dgAw*I_4&4W+s=ClM~rm<=#@Vf?%^5 z@wl=w+COvY?B(|6b~2-q;uA?DT?yd-<}V>2%?N9gQKb9{_G(C}$<8(yNv&fg^026G zM5Cc=5sA{MTrO{OOPj~-ic5$$;4H#S5rxL0@76Up-fkjchO$KxS({WDNFPnh79*MF zI-k?$vU@*%{|xksiLnXk$+1zvki+GK&&ntCRY{XT8}J9>O$O3cU5l>IKfch_*1f&5 zl)$P8REpsgEJZ%TZ4$2^Ke=}9#`(`lG-|ll(7Nmkr6*@xyLk2Ng)eU3slV6S=61PL zQZva2L~4$X&X7EooS4AA=Wz#u{^c`YTpk%7hqCJ3cYg`(Mp6<Ff1r2N>74^L6C6D%(y~Li|C0P!gK{gqND<;Sd*kIiu)JGed|IY9$v*W z3+^7F+;OUFx+z!6{9N)sH6tTJ#70_JB{mMPav41t@v%D_^Ye4r?y=-p zGwC@wW*hl@VNEf>*zkE-w+=gIKff}$2{n$_Z z7HBBa9&X0EI}O)w-sCfcI59D+gz>f*{p8F%+@U-7>_Q|!=9CC4zhfymEtSm09lN&y z6w1!aNl8nmOqn2zmT(GW3Z}rK>GDsGPo(ANQomGCa7)5iw&Bu~Qwd2jV=46o6&tzC z=;=f&nS%IfN!Y?3qF`8AnLvLcO^eHl%r=Wio3&Z9a`}Q4VG%72p(3VRPFH~))K+4LBtEwvY?%i2ZQY;rL;??l5WENs@Lq0&4 z_`pVll+DV@JaAw)bu}Rd+O>CwH8D=mj_Y*X9pU7M|C22+w1O*`^cd=1ftLsaC_I5! zTTF6tN)|+MBKJuYLrKm^Dz2=k-L>q4KJ7r#I*ggtBt84#+IXx z9nHy4BWIGB=z3YGSYW>aocgBfv#g{^TQ;zYRawZ+EtfD<)VPRh4MI4GOT2$z2!s@Q z^KdS~oQW~Vj!(%wIKv3!m*l6DkmhzR*Wc~><*z=Wx?xw>KuK{~X-WCw*lcq{nH-om&kXcENw0A_62uAaiQHQu+Nw{`0{6_7rVO#h_5V6*@M22$L_m);i_40wLv`Q z56wYT0hb0!YEm52-sSdp_4GTZ?9N5s(!8g&r89aZI@T7qH1FiHiJ8gSS#W-HQF;?R zJA^zKuB)G2OG!wJwIz3V^aE4bURCwUhv!0OU1Cxy)KuL){Uk%n(7L48QDH&ec-UDzteo~+{N33GPWlfByi+10n+F$h8}{KK|rPUrT>~&%m9V_0USRwNQt>C&+%7 zm=G0hI)CmO<&+&xJZHg$1t*%{^wh%CB_`H;KsIIAI z7lK9T_Vw2C;_}lc4({Amy+R6fFsgQEmD+tvagtyD@&m}BsCH?!L|?wrv@mZkFDp$- zFvH}D@`1VxV}c-~iGZdyl7*7}FAiDu$e-5`>Tk9-)Ur@%L9@Q8I;UtOS-4rch~!0i zSXn4nXp$h5u^5HW%8(%iV4lQziX&5$3xTv_cV$vqmO0jzke&+T4QNJAE4=HJ(3Hw> zu;Bt`5x|z@L^MEI7Ak|I$0%WY7C;rj(JW#50m7It2r!Ix?%YYpN^vR4`yksrlaf^K zgai{F2|E-gak2CS@;X858#z$Sl2g;^H4xPJ#H5U@98~C>g6xvglDxv4*!UQ>3tMa) zgg;Wrg)mVhb<+agU}9WCCPZ#oX+%sJ1lG4iaUk5b(8NGtg@(wOASxhO;ijNk@N;5B z^2mfX@qbFbJ1F1H6pl8SaJELHZ5d34m^jcNqKk+_*$FJmLhv8VBdA`a@(H3~vMBk1 z)DkK@T0dWkGAfeKhfxx$5kH5fF)@*D@EdShfW!n#C|equ2i{}IeSCpspFlI|k-D+* zW~^~)qhKrH6XX66DbN!Mf+JoE9v#px+z2HG4S-hZ;X zhC3ZiO>Hihqr9vLHt_4$>u=v~EicL`D9Cbo0tqScfROQ+%9u4HW+N7Mkf;b;0-~(5 zk#aZ`#xnvB!y1S5!~j=^HO6A2uooyxLFS=%d7Me92@pNwB%>eli)D9X@EH(P?40DZ z@``c+8;mxh?EQ|(LWvS9n(zVDGTgea%hxK0kAg&Hc*N>y1q$_>OO@u1-lz z!mNY#Wqe|SsQ;cl`y~0n+|-dGEF}$3q*{`$U%h?1?rw9#z5ZS@cgIEshexL78(KO> zN2f7>N{dpPn)`nG55E{4n7nhneq?Zbe00JKdd=k})AZKOrpxtLFJHONjIZ5Z$$v3? zKm72c*1F!&;i*qP`fOr!oC*tLBa;pFEqHzE?={_P>)^zB6CWST!lV-1NXN+QuRghd zPr1_$Wz+Jm9c5kZgHOCfuJ1k%vUY9`RZf{f z+S*Poa#nUGQjoRDp5S$d?%ut3`&PrY?X^db>`KCtO-$RfXWPF0yZ7!D=e~XWYHF%d zQ=y=P+EQ;YTCgIZCyY-_cDVq`;UFe&YQ^JnmlT!TEO91-Ejb}QEh9m1Fhm2^YEk_#Kdi(6|vkVz*kuM+z*DLP_!i!`}lwP#6_aRH%1NaLGZ|n8wp@Bm0^T*5iuSSFBD{|(SBb*&=-mLB0Ndt z*NI9z9Q2&!Cjn28`#QglfTB?Pr4bNfPw)W=?4<}%0kjk`B*}5k{}@|FT9AN~%mVaS zs0K)B;r>Dd5~<}Iu3=07o(K^mv;Rp#OQZ!*Kw4tIplu%9C~9j^8fFG z*TsKviJA3mRADWL*G1?P*^hxF3YgFWS`;J6&Lyu^?i)E2_l|5J$}Ayjz>&tv-ojVP z?A_>E&0Ekz9uMyrcDDhCJ2*If_U!fVe&I+2?T8@AQP3NSO8DTV1NDe!*j z-5%f66i#)b)S=rq8@fAt4jkBz6cK!8`slua{+_siMMsqakp&v7@f;&U24H6(4O)NQ`Q39=vm> z{^W_16%`p2VqJ+dUAlZ7P3e^vpTJul5b-vT&JSG6{?=RX5H&b@WE*sJxH?181UV%a z4r?F6V;qP$0|SBo^ndl&^T2=UjN3^Nr@sH zNH{$vDV7ioaR2RZzQP_z zF4M(}R{;kQ@xk%N1WU?@MGeKuEGx;E%ZiCTgw0Qjwm=CJstq!cCBKEGBww;>dMZ9Z z!APeOs)UG1;&)r~D>2%UPO8I!c>C5L=Fl>%gCe*t6VpkJJwO%;CSNh7gt-uIP0FSS ze^yePrOhbZGdVUBxk9UMr{EE|pMDzUms9?g6m1q9aNJ06IIlZI+&}Voa-iY?hr)0z z8(#92>YDExWz#EdswsUnZ=_Vg7KsXxj;(1Hdd;mJVjLpWcY>o&I`~Q?1W8Aj&`A0W zqGWxmqReDu_?5>*JMn9#^lkvp+gfMERYvi$5Wxgagx3ytFDDs6YYC6Um6$i01Q4R` z>-twL^EOF`@`|N&F%5X0-wZL!O)r3&*B2XVXDY&!P<`hQ<(94tc77;T!J-e>dcull6z)b zd|WK-%`Gh*P}JgDAau=s&Bnd6vWCw{Zsd?mF+m*q=*iv5X>n|D9&hN)H{V7UR##WI zHn#aee@IRV4&-h}M+cM(uYd2`7~&SH0DAnNP)sg4`Sj_XXFt7z=)>@$<^$mmY!Twq zt=)~adn)7Nk{>^L+UE|AkJ&AjP-R7WAQYdNs2>_ys;j#NzU-A(o?;Wae5>KH<9mg+ z7z$E~lzOlPl`SD-XG1%xHg}hpDWP2zM`Ct7K1@F3<|aw$Sg46;j-fMWuJfzspMM^O z3{Zl2wZ^C=STMX^faRoP!QPH0!3MoJK^Y?KFv02E-A!jl5ae%v^cF+(_~VafXQ$<4 zr{cIqSqTF5MimW2xm=X|oo6P#_uhw8PB?s|_N}+ytEs7}tSrNQfqp*jB11`{m0-pBi5$VXQB{>mJw4n;xN3(7 zrvLMQdGn1QzNk0)e)`w%1>NS-vVz*$%I@CQ;gMcQze_8spLyXWMiq%E@-w2iWrw`Xvv3KAd9Tq^@q&9BONLSv51Ds zUrH`M!E(o`nTCgAtt9-a!FZZ)XN?a!BBa$WX3Z>VbyJ&CHz^jC+Iz63*@*1lbpA*o zVI}8UB)^Lh5Q(X)N{}+_1o$+hh-BB^H@t#HUYl&`A&}piorio!nhDff*MV!r>IW4Z zadfZwg;di{OGDEd9Cct%dBws-t3tskt+P1g&ziqdcS4?=vdG+Y=4|@1Gy@gtUuoV# z%w4HO7ejC4ZHwBI@R4H73p+*~+LW7WZD_xI<>tjpH%3Rta`W<%6Jx34>vFqNldMU} zaSn$MHbIfiswo%cG`spcX zEa)vr30z?}Z`L6lpMK)--rZFNc?G;g%0Y7d^z;(`z?WZs-Wq3-HDGLu&dveuXf`Je z_Vrg)RzCjtuB@!|ef#$8-(TYK=skYd_ulyC&e|Q2HeR@J<;-A_!-H8!;`&bV;yEGS+T7fU?OR<_ zc;hC&D&4iSA|6v-a6W_*6JoM5t>fc!U!1*!aY^X$%oo>h+@yG1`;8m**Kag;bq!KN zsHFJ-Enk7-Ksb~9Lk>gsKXI;40}X$q5Fs#i_T zchBg^W|} z_tQ_jfFGMs{or5^+EPhL;r!y#&RyGydQj7b5#XKTU`GZwH?=a($B!RwYHGo?Q&pMC z95tDZNs#PYOf=6_ktd{7Rc-^?mrd8q!(SlKyz34j0<`*|xmRmO9P!FvsELh0wJANE zER;QY@+k%Oq&?_sSs0!rtDf{PFAF8*PmD8~gTe%--tK=JWFdQ`j5H&e#p`94f^uFi zrE>rAwJeNmB@ZVHO;Kh975EeqMr&)gCnv>G4EFNnD^?qFDs_H-0VcT)ldonxhy%4Gs6Oehxo&I6f(Ee0;`g zrVJBMhGnPQ({Q^D7OJVKsb`)!ee&c1c!nv_aqir?-k~1wjd5`?1ZRYyC-O<`@4Wp> z?7!Dve;)E-LVcALqD-4qh-DT5dGh2j%IyH*?Cl)_VKme`+}AgF{ra67H||1Dj5*le z-Vulr))jUw!VsgmtgLW!bmIE8n{_vDk&HxzJi9$GKW_)W&1y``NG5{?ffsGCE-YfO zn}A5;ZyX+8_~PtkUeN2Wzl3)LlN$dgFnDAPUm|M}>Kvt|d8MTV+qPA64Y%91s~RMf z#~TC{gei`7%dY@$Bb*zO`8A-eYzyn4T=wDn6qCN(} z0z&KzGA<9&A)K&EzoUOF^g<5&z1EwZzR4qYWgtAeR^FxdKHI zKY>UoGB}D=C-cQf&%O!^mdMuSI&s2F6IOu1J4GyMNf!wpnS}PU{~{ zC^wNeq&$WCOMFwZ2V2+*AdV#BCj~bx61hl&5;b<#m|qVi3)PRQ^jmEgs)rW{P*}{U z21io?Ri+9fBcgDTQ&0f- zI+rRX#QZ1%WHMP1Conl2J-laVcpNJYeqD|Gwzhn6aUSQy;-a6DIKO)TeQ@1} z4jtn0LFFI`5KNeWhxS%vW)=W{W3PYu>8J6FGR>CUiwLdPUwfWxuacq+8yJ=3)Qa+| zva$-s5RVK99m<0b3=A+Pef>RMU0r;@7{!?hew(T(bF-6Qd~peb4@m~GMs+oocS%J> zJ|$5}m7be(0quVM_2&?83=4&{kk*KQ8UgV>F##5|zc|0Jy1KBnwF}S_o>eGg<6cXvWNY5Me7WxIS#H>P<7Uh3th=J3EHTbBx8P}O9lmw*URPJg z)6YEq)H5fk+C&{jHD#elXo|2(s!_6nu243hr9=L#Y?P8iSb6qUoj_?pq$)>bp}PB< z%EHybky!E8A4+Ue{in5^)bPzp!Y_OZq>6N?U$KNky8kgBN)~EMGL?^1J-mu6e5kjt ze(#Sa3)Q#Vx-66;1hS75sTeS$w&MufSQf%X0^$Q2Td?)y*nsB*oJ>#_Pg-$F5#J++ z09xZwM4FQR%JvFvJ;5-x=GR|;9efi-VvI(-Xx{dAOe^7`G@I!{w8?@o5k;CrQ`0>J z3`PtUeu3#=Z?crwtPwK^D)#+L*RD$S>&pdr(qJN4g2I+mvfRFHdvdbPV2H!aLLbV_ z&2GNev}gZLkzNR!G58K$)U8{s@o@=NHF@#z`s5^&)fPkCi`E{0{Me0K*FZJ{doh@7 zKupHQCq-^a|FJd`fE1qb`r7Mi{ru`Ff~Q&Bg?{j_gZUfcK~D{G@Fs0lAe)6Rjip=cKmi( z7J{w`2151qP1sLx;ewYrefmglZcg*vmTTAQySn-@^?=WGbWjm`1fY0UZaM-C4h&2T z#2z)*0Miq(BUv#fCIzyEmtTH*|NctwBXGuor^v{N!RRC(>iYEtnkvZ49~>AiDJc^n zD{~yy6>hq|!Jb`vYc*tHb>8ss)Q2Blx^d%9etzDG6G!k{wsf?gdgAfa)HE}ZOM@XR z8+c~6Yta$(_%P|>Wo1Pb6(sr>LdjHJQ+4>zzT%>y^o)$W+*Df(^uoI7G0KVO;t0hQBQ?AmNx#eUKV0j+H8qeuioN~OpT4xCA`Nl+SJ## zH8ytNyVtKX>JyV=VHBF0oLX93a5^2!L5jn>eg37D5SVR09Uxka&Ae?}xj*Q&T4IZf z^0PBDM#rZ19jHl6w1k3&(V@lq`a2U7qqB39I7`dQi{lcg154rMIGIk1=%#RwmlunW ztt1QU>Kd>FtyV_Bv1ng(68X@ZV`E6=imdeCU0Jv}xz5_XlC^w4wfwKI?1+q@k(H@c zD@Wq5QjGNVf==;$spXt(ekoqEtt%!9lePK-=?==d`n}-LTFW6I-A3k5;si`2BW49? zRsdp@GeYXm{0y$hr$B^Cr^MZGKk>id)`(o7{-9+*ZuqRSGgfv=uMV#&B)sV;X%3F; z>$~p-NltHt>g-W0c#O@Ih9U6)GJ==C)aq;4Te`m?XP+%N^4tkPKe|bMnGCe z;=fYSweVYJlB_w|6Y-chJORDQ>cZt`AVX%w>GeB(?sq@vcYL}yznL{R<{@~*W|L9+Q?^{25HN7zN_%kQ}+5hx|SHJgqL0LW}Vo0c+ zn4N}SB)cGw`rX!w_Z&%zGChMs%&{6S9(zojR7Do8%5IyMxZpE?jHrym$2R zqmMs#s(*6mW^;pA7ua`v`@ZAb<~(reCHhE{0g?kTVbt=RbBWR{A)|X}Vz{xbJtHsU z#n+!Zc546iJ2&6`;N6n4lCsi#-Wq8J1UX}^MsS{O_gd@=^CbmY`*u|=%uLQtPuNV+ zuBCYr^2sz3QU><4l~8I{MrvkylqqUvX@;`Yxy9+(g{f&-@dhgt1|ce0mQ+z7B@5mn zchGB&H61v%AJ^qS|K~sc(?9u9MR_&(kTJHHyxhX)UwQFIKmOihr%uKuC2rrnJ)~cz z)C_C_^L9AsY|uemx_+;zwPV}PJ<*of1v30sLL@yey1Yv;M+O5+Zih9&%HTNtPCubZ zI7Zk|O@foz1;3hM#T9VzPvO|XOyqSNsecjht@u*1QoJE=aYfT@ znDzAOli&WvvoAgWWKC7Yg2Q+7PSdYG{_K-;*WUm1;;%lv_{HTL=dRr0pI=*xR=aaNH$OEqD+RNXRH*p)Zvp&PR1NvQa;07ZZN#sPoWI82x&%Q#@eM@v}NI{qVP!0Y-a81m`f~-;q%ue z3)fXj62rT}yLbp$C6u9muLm26ZMS-7by;=Ef*TSZ*d+tKBg0dU*^znbV>)~! zrkYl!osKETjEAkj2w{TvZcDS#WDak6xf>O~H z@ZF&bS6A!)qx<(C+7_1bBCHdWGbC-Lro}BR+Q+7+JNt)6rzV}aB*{FsSiH+CJ%c0HZq;}8 z^JA;*m5^jRco-h5nzLsw{q$#Vb@dMb1SPoP z53P8DewW`TL^Tx`umyeI?85BlUU}}1{_ID8^k={S-S2(l@S(lb1`y;OiY)xK?e=Tc z@dsHu8_5u5J3`5mWV|>jlB%4<>gAKo1X&2$K?FkOEtU2D|N1xoAA#G)MyA%?rt!j! zLW7#U`_l13?Pu1`%2)obNa){#eEjhk-0*rqz+L=&dFX->sM zy-LkE@upGFP5XehL)=p;;IrpJUQAq^mtvxGi!FU!$BrI` z-3WGR z*KT$HR1%VepDd0AOUQIfP1;)ji8QTVexRpDN4KdzAP8Qi11Z9(v5+5Xbv^K6nUo-W z3EJVhW22l3xTng*i<8?1A%(HzX2}r9DV1`f#6e5uxFd8TgFvSxuD_%jhRFyg-Q(sR%P z)Ymr<+I;M>W5oq&@Zb{5B;M(8ILpgmz#(F&W6vkzwQFZ}O>ITxw#sd_WeaxCoA11P z>&~4W2lj5;MiLI;k3c`0 zU&NW8Us95hl^LH9!(;MhAqp21%Gp_hXJ$DBkcyfWi~~8Ng54%0_{9ZZyecC8J1h&= z@Xj~`E2FcXMW+uIAWtC7!M4^Gk%Js-zte(8O6xw%JEIo!qJI1OG)XyfwzUINPeIf# z9g2pij!vlwK@@rsb)--YYS6R`H52e36{)%!>{Q3)6eJ|-n3A9ZFjY5Y3b!0K+Y1^9$d&WSPUMCYEVvg+xPSAsWBa4~$x|9$kIW}}UOfH&cmlxhn+?~Q86LJ*bWnx0SpvhfXA+J0+DUk{r zB+MZfFkeWT0;3_34~tYH5mZLX;?$xx8UPj-#Jm>JB?8Z4*25rA%iK$l=1PZDX50aF z0KetAFxn99v2m8Tcp|94=B3JQ0wF1?`r)aJiv>hOZXamaXiPl>z;a+EhKk>Qim&0P zB{x>$9gL0w-z(;%pe+m`kYJ?a|3LoATZgcrMXl@@M#JSo78tLfaFv6l(3GbZ@cz%k!B5J{Zm+VgLNUS-J4;o9O%j3tCwA;z9AvuFz1uZ-yGf;3E zi+49SCkTnK{sk2x<+7KTr>15S65ux$#mrHw%%!g9Mrc>Ev>Z2u_8MRT8Uc!KrDEGFYOBlS*7&JnP1Mq+t%W zHIE<%3)dcMG4oIyY^%*Yj4V`huqiD(lq}rzrDzhfsRhQSEofdK$LHifDZ8Fp7OEN4 zHowJ|*~?JTi3dcMQ#dh5{4>JArhYVaCpYhd))j^jag+N+(MD2)Eo*(pG$BrG2ny{V zE-cAuB*Y=`$w%wwgManNvhcyps%4=iDqu6}Vl2@lG_X%fvQX@U917VfPc79$5M?Hz zeHSI{@a(Ag|CKTM@`E6D4#nnDHK*u{(%r*yNUl=(fI}F-ktn|^$3~k>N@+*h#57u! z7)HgRBph#eYY~DCPYJbJ?29HPGR)(u46oU*vCD}9auF464Od@C<6?DskHVX%*-2@o zYdnQ&uU>toO_@B^!>c(5z!@pZvhcx62Rn>H+NtiOa)Bfx#T?@lS>x;8v6^Y}%TKvY zTTpYbDV>yjOb_CLLtP{b4`Mnh0c>3sJ|uQ#)4qRw!Pg`3>mLEROfXi3nuq<@f7{=d zJ4o>N@c9+?37HoTOs)NYk9G@@lKt?VL=Xx$#=7&-`k?-muoB=}S$l5KtQJ~+oed!W zR?-i`=c9E}^LaHD0(JYF&H-W6!sWB}{IcGXM|;A5BER}t7XA}?QD1jcH3E`*O&n7F zuK(^1O#6s7@KxHxxV)r**8S(Bjqjs%Qh4NkU9wQhW`bHeoYo{hZ18BJ7h0#rj3vPmCJ!E3nzshppnY*0HN zq~MSe3JSy0#jPWCDrl3RQ7H*;6ZKYC?V`DmsI*9^`BDAI4f+7}y2;2J_H>}<%_d)IDj){sU zB}o2Wc}(AOz^4igD&uC0_?R|I9^JGgh0;k;q@Po*0T2@RJ zvdq|*^xiEMZ! zhw?@IW1=c$2-c19Enid7>F#-*kLz*06U`^S+xdfsHQEyze9A5I>*;>RW7D znM7$vJ(9|^3*|s-0&n{G)Pq}pjd;Pq@cP|)$3!wzWGhg=3$vC^#U8buuL>8dvK`4p zhWGVN^0bGimSzi^KJP_XNttNPCp>i#4*)?hDO2S7cczRg?`^ zZ{ccL4@ER8A`nKT@WLbJ8;K8ro8lGS*B^B(6uMx*VCyy;GK0cvTM{LNvI7jL(ouDg z7Cu4(!g34q^GoWchRh;^d$fsI!oMV0Xv;Sq_%z}4Faf{-*V`2rad!r>1sbFLprqTlkD z>Q1UJQ~I#}xAHg2I0$5a2lW3lOC;MdfdmGW=* z$wENwEC^Bp5J}roTQ}sBBo8_uc5dZ2J8_ z30e5%pIu!`K^YUZB-^?yl(;Nc@ny;!(3XYp=C1P_sw0k?*ctV1AJA%H)7Sb?7pMmZ zXxM{)t4x@fPzch(2gyQDD9Y}ST5_*=sht^zT%lC2D3ZYFv9EGUmBYffi9q3lOe zmR|Vl`$Vx6b|R*%i#BU`jN#9SY_+Q`Xi^jij+kXJK6C(jNac_U0N;On6|ykgraA^L z)AY!PG7cLB?bVU|2jd{r&8`{$$WZgrmB{u&kgRP{dLH?!=tY*570$>=3LIm&myr!w z{S;m))DadQ5wk`(d9-AJJ~AQIom3C^W;HHX5e@uGi!67|jM7|et5JQ`pI7%6mC*6S zo+EA}=Mx5Dg#?^wqWWyaq?6GKN(vX&o|yZX{t_M(J(h3y_4>dM;#E=DrBxQb#HUhx zm3@#F*3Wf87^Gd>E3yPwnpy({h5m#0AapJH0?qqA__q)EtLA-0)f~;Y_(-==--40f zVjJp_{PNGP83$0m;)m#%YUZfl1vqAnJxcOd-*=#LDH(qvWqsYxBwTU$TS4riwPv?C zj9a-(Jvf`DA}DXu5)8&r_WS{Mp?ev-5FaUGl`GlHUvFI&Zsa3f>zq)hD}-;XhN`ZL9(7XuDkZq6n<&2&wZBv`nDB+j zaC6>XB5W1>>yz%zY*j?Fn%IN1=73pC znSm>3{jJ%k6&7M)qO2QP@ro5$s9LkD6E&Qbv*9~=5DIqK%Yvg`e zC?t(oA|hUB_brdic$~gvvo%JEH*7kM(AL+R(i{B>F~;2#kE?tcelks(55gO=zf|CS zBTM(8;sMbyVY#UG4U*cmzI$Txj_ew0pMw{E#&ri`lZ^B63&i!Xq^o z83Xm?G=L7nk_39tI;aF^I>mA*hd;sD1}EF|E}!BMxcy3$pN?G`OrxOJ7{(FXs&@vo%qTbyf(C~0+y;gf~IeaDx70Hr}q74pls z|JAmj9tWjm>B}&5Q@wvVb<68dC3wuwm1p-Z>zpBT5dM0VJ?H=MJ5#QxFKY=0wvJ9oWgM`W%iINB>2nZ7C>@JK`((YGQeFg9dwNnra1px zZrt`-F(C<|5WZLyi_`nV4ntZ~f+aY*l(8YA6aFmngu@@z5l+DpvhMKdMLB!XNq!W0 zcG5<`%gfg;M}W1WSE~eRDg%gmpZSA zfvsj}cp|QC=}kwnAfyTp;dh}Vy}%o$j|AOSkynaeDbJz2Vw3Qh-ya(kkdeqpDlsVMd%Kb=$&jKv@=sMXO{!t)|V6&W))@MuRw1i6uZSya{qh3oeV2e`q= zf`VRjg}9G&@MfveAS$DQ%`rk79_8_ctR|{htXNG^kiGH3!=oWqb7Zu2M8wy5)!#wWU@k2S~gbRNIQY&1)*LjfQsVF14|@zDS% zb9;eBWg~4;NmZY99vM0d4XPWaHdIV#VQ79kghCgs56^mHVj{ zBSll;XtPD)Cfvm&^0s8!Kl-c8Ix*>hDKOv=-N^&RLI(Y7kb=Fz$iBq?4@DM+x?@Vb zV52D~MogIlku8Q75#eZC1+#2AX*cqbYHd-xT@A3YfF^0;n6>UL-c4jqDn4N~mR0>D zCCNuUIFIH)R>PIWN|!kYRfsB0AL$wnwpCde6SM4FV=~IIu4t2vN*}y<^5>9(5*xj! zX~fPY^LVK_*j7viNd$(-j^e*^GKN`i0Qz$OxG^Oom<4hK`Mbj*7Eg4H1}Cb+BC4=1-}3)oj!m{=U0aKhj3Ksy=usQ$h1nHA$o&<4x2&lzhqq$VUNd}a5^LYQRbZm{TR#3tbu{J@phsdFMZTs1Y^ z?m(=~xUl3dND_12NVW*^N$OrL6V^r)Mf)RH0~n(E5ONlwWie9RO~%MXxx7qKy$|$& zS!=yeD``Cy3%!jH`=M5e0!mP)3g|4*U~!Nu$=zctF>HJWaIX~nTcI9`T7TQnv$CDG2^t#yfuOr&Wt|Fcp6-^tTu;qAa>7&kFrnRb;IJq4AT4?DmOwAzv+^7J#UQq8#Oo zv_K(vXaW-wti;w=)gT?^bsr_!9YVD543{8`@@KiUtNd9b{cwZ1yOAv1`c(h*U8xy) zeKc9PX(t~sUMP!GH3-FxQ4+&0=dvu$j{m6B5ZojyA|= z!0AQNjShxHf$GSSkYGtpj*+mSzh;o{rte|n3)szhZu$HY&3yGgjbqHMRyHzH;Q;r3 z^*8vs#Vw2gyEZD_(8S#2%;NgX1%6LdSQIDeisU3(b)if_vWy*XvOC=)laup{OH@fj zG^>%Z@STo~Elf>2*;%PxzzT7=yxbx>3g?ACDP{xROH^A_*Q1u{^;a(jsOxt7$7Y;v zL`3AuSWCRk6zg<)qNps7c@@&5!}9+*N$>Tz{fkQud_sJ`a65hT4mXc3d{U9K ze{f=9(J3L%*C2%1seA#y+Z&embT!6m%t(zPFVv`@oVW0PzrN(Z?Fej8zYt>hNHUkq zACH5Db$G9-8O5@+C}(lbo}6HvpP4&%=4?)O*2w6X#CI-)jpC=m1Ple1eQr-jYujMo zfXy5yD234#*JmK&`HA=^8yXr$M@RGW@{*Eb(J0p+0gnJ1LFB%FWRN0dL(>zp6Qff| zVtg*sQ`5aYy^~`ToB{80&=)cr%r-N0yo!%Bw6Ngp>gwt5@6RjF-TI&_(9ktjwu-$; z(@;|ja^(Uw(ig6G8FMK4vBKRENn`@%Bbne4>skG)johJIf1FLP6ioQ*v<1}Ok)e^h zckiO`#>XeEf(f;92~@<cp?%U5i+*sSyxHdT!P=dc4c2smbz} z>~VOeA7NT5_Memw71_|FB(L!8w%n-NdH5UHOt#!FaiM0W{IAIkCKZYa@4!kY*X$V* zzC4=ESWTM(%8s%rHk%2`n2F)hc%wc>A2J3>o%VAE?5>o!m220oUAS<;>vc)#E1dqB znaOCsKSu9OG@Ij%mX3zzD`(Dm<`;rK2Zg>U1IFQUxwsJ|EuoOpZeP;t9Y&*Le0-eF z*=$%Li?g${+}h{!c)e3D*A#XMGb+x!a^aKD&wcc1N%28t}7JT$m#-vr`J31c+Y_R`FkI>v)Kh zL=LdfV6SP=-2Kdn=@xlnuGEOs^We}7r4Tcq}wT+F9z5Vvvi~|RiTDOvQ zBj+t>ay8xe7KFd*fjC~t?=8r<@8jcEzT7km@S#@bujyh2Rw@D@I4`zx3qZ9|e%G?c z9&j!CTuVOp5^If;xwuT_GvIgme5|8oYL(-94S7Q=z7_YPv*~tydvjM`*Pu^KMn74M zmoDC5X?i{0zP_o6@mbmTfK@~eDCKrNZs$s9ImWnRAfBlUaTi?TAAkJu)vGu4WX@tv ziYa0L%fI}OKmF;OfBxtH?%(~ppZtfv{Ler65C7%={&#=%mw)ls|Nj5}kALy+{}W%f zxA(*tg)mqS2GUdFfBDN_Ivh(Beuo6qukCj(| zwOHM(N-?{PE1}`8-pn+jxQM0m*Cb{hxra)})E^$X zwMY2j8oQ7ngxwwV_=BQwWW+BK8%qFBgxT5B2fBJQ5>pf7lF^lLTrAAG`nr3beD;(n zCW#9ud6tqAkJRkz8+rHL_nNNVzIg81y{3E4CHw5u^wRvo-1KaHb4%ag!0_-edpFfA zc_;n-12?YSzH#mPz`*$3yX_qv9c<;jy?qxhT<;m^Yiw-1d9&`?wL6Q8ZfaNJsnhv_ z?M-d__w4=CKYlGSF0H4t=gCvMuU=`$&dmDffATG}!8Xu4aP;6_!W3cwMpDNT;&t6U z!xt}JJbHA0YF5Vjkz!>bnb=e0d=vrmF+`7!PA<*5GBZ=8v^o(+fq5<_#*~yKW)t2g zIc6Ew`=sC~aRR54l4fQYLT=r9V0v6!t^BX0pXfby85qjTNe zefjyB+(pf24Yb7#!vb2lv^CQ=%mtH$r(?estO#-o>{F@9=A|V!%EXQxyHWFbYKrGY zMM^=bbxcjGPSe~}zXi4Vt8U@ZR_t%BT}ZkWLm}CP7;s3lP3%IlD{tOz{`~Bvt2gd6 z-|K8>Y#ACFT3A@Te*MO^Yu7oOo7=Bnztz{*A8)l~#k2fCD6L#Rf7R=BCC4Xx_{)#B z@7g^+zVN~O=VxXXW@jA}6H6D)U)CF=3rq5B0@xCwY*t%acY10vW!6_%={nuSDT*9baBvBNMfDcJ}<@7r)BR#E+L>no@;9rJ@ zCYzhPpE!Mr(trWNh*ADeKfQ*T_~a9(65^TEVD$VUolyw!6~EWz2zvdEjV(;t>guwk zCD)xhci2_1&-(huTJLp`E1OqP?DGkr5}AE%t^M(F$=hm*@Q9+2QmyaJpMU!JsmHcg z74`Oyr6yU8X0bF-Sgi(KZ|4A8){%pIkr>SlE%t@Q#||I3ap!JDMMYXlJnMo8D*zh8 z{bXkYleu~Gc4}&BQE_>U4O#2K#(@#!#;pcw_NJw!g!hL>wF@=3bqRm=(01V?NQmFb zpJ>{Jo6ACyom*Qw8ylONo12Hb`)oRcbIEBnn*(0o{OsJ+_=GVgVRC*J?Tqa#Jw2Pv zoZ`sL%in+Pn@0}q*}1(2!VH(gxoi85LkA9&Z?DWNDs;Kr*h~iw96;Hm{j`*%s*1{@ zq9Wu_TwL4>FFd(pM;TSQckZp)xwCTDu4+ne7ZsJEs0z5F%hPhF(T8Kg=NulKUYMCX zbYOeyy@9duF_XdA(>35&v@?m}3kUWZjNmmW_Id976(rNEFF%byTmORLdSrnhT0pTH z3?@V)f&7~{Z%&R(RaTZtMCAfvhh0U

F0=U`5qCHNq524k<`|PTH~Aj90JTz`8no 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 z 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 z

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

0sTD@yAzh49u#zC757TvW?QEsVl^; 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

>#HDk@5q!b;RdRG~tzlW6f9#%m)uV2IjS zjsI<#cDl@A^*t{(y5q>DQM04{i{>`8R8>PZT+9W=A_n z7?|EUAPY+T3(H*v@MD5_{@=6pBaFZ=(5@ghW%r<&RZ}HDhNu7do?_SB&>OD_3@pY! zKJX9xJn%VyI(K(C4O7A%dk-qzrCdOzZU$022?+`M+3il4nSnHa7pkrQ=-Zf$4qqNv z2S<1u?wPLskYuo_W^YZOZ`z|5fj1qad)c#^j&`vFMBl{40fKm~Bd|JwVVQFErM zWLi)(v0!wX0wNO94{}`PU`GH;a)JFP6tQvii}8j4+4;cdl1^YheOy5rXAYOO7r5X5 zwt{i9YLYgoTW`T{E-WknQQx+s3x?uGOUtG|dMK_a|7EigdN zQvbM|2zks@LG#sVAr&>{<#gJ`Yrtp$8zliFUFMRb-)U(Sj4^rpIoton4Y2=sW_nR` zVeCKSb8>Q4Tit%MTmwj6V8GC(AnF#W0h_WZ`ybA9!leDN4xl?x*&G=YgWU*$C-K*D zoczb+bg<&xO@6BYGh}N~dgV{qJY|(JtiS6{d8Ibat1+4p4YdB3IsX5Ab^Bk9i~jEo z{0~O}Fl;|0olh2O0Mjez`=Y)8Z%#mnV>6n}47i(R6&1T2#?sQ#E-tq(FWweq^Ru%R z0An7Yl}uy_CNVhsA{v`-VCOhU)5m~93IL2;T3TB7zD8P8G&9==95g`9t{x52 z(e4h&i2{J^UkweX3pIIw?9gJJnb1MpJq;x#OjUha+H$o)FF+$O11QHY;yp*PH~052 zOMt}DJD_}{qpeL=1(>-;uX|hN6do5EDht2|0Koen1+Wbj4uGnntE;Q0CnrEo3Z0(5 z0#N0Xlw?4S1Y`%yk&*uvsY>RsSpvuvfHWMrx2LvtdQ#Fnu*w5l34!Ch+}z+_hG3B4 zd%M6NfQ**k(;=mO?v4wfPZsVV?(Y_*3IgSnmOkAB==q7is9-=qsPpyI?(f9Y(o|9D z_lV`I3Y+u+7!WvzfXvSYpi6^?hbPr<4v;I(C-Y!XpQp3lzF|S55Jjy^av4i*HCUHF zuez;o+9Xxm0(y8Sq%&e!mn(k*AUaY5ov;AZZtCKTMz;0@nvvFhp(e!Em=&+D6mugbbCAx`!5AB80{X3 zSR6A*_uuBpgGabL`JO~l0GMy|8~K8Z%4N1xg_@c= zuI^(KPW~N0A4to|2b`g=y4d_M8`a{Wh`114m-OKg5pe`;Lzkbw+QME$Pck9OFarFe zQI0>0f0YTHMs2L&l@YWo-k;_>_1QP*6TNR|xVlbGPQuYCx1iFvolJ#<0+c_%EOE($ zEmiZ9>3OgV2unzW8i?3h_5^@o`6#f#NE3LOZIEsN6&wXhLJ$p-mXUsE*2S|&ty&q*j*+ss?*x;zR z6gZ7tYoTKP-Z{1tMb}A_OXyIZSb)|i><1uIZ*cHK{4*z{{#N%2sffHSy!&%^pE(~0 z(nSP>=1=@pU;k6!0)`7%&k>Lof4PP0gn9xT2lTx@ON(k zM*(?k69MJ7&jUJYiNhE9GZnze4W?p)Bpqp|oB{vziBr6+stT~4WoB?gSnRN~?4q9l z{e;potA!m*#UlI3K5QbQG<$KSLGZTqjOg%ip+Qke$-!r&4|?K^l;Y?rlhJNH3h`>>Dw!!=tZB2GzSo!bEhJ8TYQYkX+%bzuzH{=<)wTlF}&k zy#WSbSDpsc_D#g1=e5%a?i&eu=il|d6rzQ>pvXO2m>)dpHRfeG@U&69e3ioQK}9Gk*^yaN-y&1 zfd(ImT=yg|!i$=bX#Xr7)!y8!a7OSFF!M`e7jc_?NCpnxaK0U8A+`1;Vfgnog(nHeb>wmFAOw6C|g;~sAG$K{sE_!(aOELPfb z@hF>vmL-c(&a!kk%Vd1zZa7$!tg*L%S5eT{TI*!Jb7MqFOg0=mZ`3bF)JK?FQ zX^5#f2xKT%B*!m?LE+K1mLMmls!)zw8B$j`L00_CU58W5-kw z|1Q$d7WCzrSyRQ}Nq~{ph24eTMknFX6G35*{bfPHbYey!jsN_MsG;1+5ZZ?jI|2N< z-l2;k;ud5)fzlB_-rG~&jnK+=ag>wU%}~9))K&n;iFqQ9H>LoTd@zTCIQ?yYkbiL7 z$jPCUMvc^3rS2SIIgD`jd)4Dd;{Ar|PQx+i;zo$^-U(b1A4+8s~k zD)nk+XJ12%o&p1_*B z7onD_UJ`^~K~P8mzj6~6E*6!<4=My78T8sKmoG++Uh?GjEU(q}Rp*)aH>OM@bAy!E zEQSnA8$*7l+=hc1GkhkaR#Not;=K?W#UA` z`p|isTHuykLR+SgekoQ_72WBNPt(*(8e_x~{%6lMTF_k{LI`V78CA@4<9U8XsN8Dv z`-AdE#eQVAmAV6|S~Kdq8fNMTUtM zaA(8@l3iSl{Jo+*XLGZ-b$r}9EOVSDr!%J0c3D?-KKC7;PrHp{Rc06}uRyTLQowIq zDk~_7K@VxILvFo`C(eb%z+C4o4Xub>iq^;j7j92>VH zP&gq}rPH%CG&Ve~w%n~X!T%sN z9IY*^=SY}yZpw4HL7ojmRVjm~gM_@=7!8%wRe(X`#z%K#&Rpp?*f?b_ z$fd-|wJ#Dk4=d4`Mu~SB0H0&`dcZ5X2rFr0TG7t-fAy-{EbI#+YwXontXIB{>>VX@6OEUZ z%OhSJ;Z#%>+8?v9lGc%jNVhX)a5oy)Tza=ZUSlm}HM#S%@Oht`o{zy){hV)WoU|n% zejZ`mE*xW5&*ravj(I=jGwulJ=99f0U-hl|88;bQ8b(5k>2BE|G`~Ay9*?5iVqC`V z(NsJBBkY;o1&L23GpXL^drfWO>8{oa7%@`2+cst#YkB3`BfabXYP0?8)izqqG zM07LZ^Mz@0_#EQ33Vt*sF}L%@#wKYumklek?vCG{95=HjuYAeV)t~Ru&o0l+*Ifqj zi7Kkr0z0O~b{$XVy1VbH87?M^pm_${TlI>Z&ZB`0t&k(Bx_x}vO#SM$-^*X-4Z{-) zdNToPaaiz!yZc#-IuiLDHbFIKhRw$O1#{UjZ--0Xb2LJnUpWxY0NnPesi`GgL{EY& zv{=Tx?Rhr64^8rNT>gj*{;_F@uEr^aeWc=# z&em$Y=gOE%fw6Q7@d#jSE-Z zkjv>!HQl9yMtYe^&n!g4e}@C_Njxd#+WV^B@BX379Enj@!vW;ME~1kApb+DL=XzNJ z$AE?08YrJ~%y_j{zq&9$=w;awxe`YWQR-9lRmbAUb2~+ezEOwQP5(tEegq|RKVM*7 zpD9o8J^YCxvR-)rnV=L#yv!Y~gw>@d>~j#bJO>w%uW!I`vO|0kGGXp+!;rMyoiHuJ zwYa!em7w0lroDrPiHg{OKpM0-Eg--|C382GCHR}C*at>J9vu(jMZca?p`vQ|jw97# z!?l#;esZbbl{Y4xXyRL+m&+5%zjcj%cEMDG5$Kj#c_x8<~KA^+3v7 zT*YDB)eFDK20Ow^7ci|&Q=_kE(|jNsjj8KCRKF}JX*cpBO2)a=&gTOQt=uv10>LWV2Tjoq&&$!Icq_pWH6IKbtm*(FK{Xc(VAz&jO&shPRM=|>W!p^d` zQFj+7b9&G*e2?`vgvsz(=~)YY#cBr`*D!n($hiCx6Xtzg26)q^NJJHuY!VF}kb?XKedwY9lXE9mV zXUA51dsi2S7M(@{if}Qw|D3Ucl#_nq)Qt%4Sg4LdsxyjFuh^&vR;;2zX_x zf|Rt<<3Hl#XQ?TM^RqNnsHi4v7bZtUNImE(&(FN!4Jm86zKi$GYV9yApQU2Xec0_c zuiCKI($JWlsY7J#C~U!7e@Q(m4WVAoS5`G3)+jwSGO&>G%?k)}mi<1HlN5JTsmS)t=KtR--m zW~-qkV#`J~XgGVwI4|25ue)4m6}*k4Y!ej)5*iy7C83LjG&``EV3@ij$HY1W&CAns z=`hpN@4;ZgtE$v@c2?*7z}7%SBnS-Qqy7&thhey2;f!HAYHDV7cANDMek5w)D0sY? zYPe3g`psV+=7b-!g~0Lxq1mi^oFH&8`P`UNC4#`jp^(fMzU@OY(YT-Kv&BGz18x3P z!%e{HD_^X1n-d`cr?O=mpl70Y6>l^LP4eLZr<#B1rQoCV2X#BaMQ^850Q13 z1A5;_7QZ$}?JCX&M@qX$2YR0%jM|(0a05Z)I z&^K?e;&eVxD7C33;skD4;Z_UKkl1y61oZBS`P{!WAkA%4fRAQ39dgcSCP7~4=474$ zsX`+|!@*8|-kC6w<6K+T8>FL><$dZ4PrHI$i)b#a^$$@U6 z^v6v&!_9-NL}R+~>IbsAjJjEAV$4QD&P`(m47a7JP48gRcNppDU0$e~IWB+`5p)~arT+$zOB|LdOz9lW$ zeSh+JCUe^T)mX+N!oT`5{$?rgtXE>-RQ{d)3D)iFif0mI;1uL|jvE6VQK81NYP0>* zSu=ocXc%a2Za%Eg8AdEE*kfmB_bh8{jF>Hmw2^@-L?FE?`>La|_l=Rs4$|PLe!DYR z1y71PDS{xU9trD}x#&*G^}KHds<-6}*=^g- zL+AExEDO7`N!HTMsbJPJ5IzzgrFQiDR8ln_yp|~Ys2+S{5H?6!hoMMhmrnDHeyEpT zrbtB!PI`rLQ&jaM#qg(lC8B^}j0P)e3kwS-#ZXHD0Rdo-X-=MX-9iQ9&}I{DO-5Sc$IVJA z_+cyGp0!jKM(RUMfA6wjH0GGgdK}M;JlWdIm^uO}yDA#DdJKK|erML7g3J4e`i(=^ zH%G>=-V5c0-_yQvS^ch@PC8#QD3|`54?#F}P_yHviuMwnb`J&A< zi-!gkOl7}L)$m0o$oG?Ir%8lGQu+{lL&Iq7rjiG<%iGCn-8e9$Fd}PFF*S`r-h|7b z77~4O4pUJ>%f7tIRv$4tc{f|8Hk3DnQVQ?YyqUsPY-(gQ-RxwxP~-M^wTsd? zRVeJ@(l87$82ecSD12FPat)-XHFcBE*E`Sm_hATo!aVNJRx8XA8spvSda1ntDX3yQ zD=P#_@E3=Ni%noQcM-!N6a2XvBV{TNbz|?M>j$<`*&(>B7pjT)J?p3PbLcFRMpzyP ziYwS#>G;l0xqeM7*6y1D3h$>c@As7{Rr&fVyHgf^t%hgR33oZ~s7Zg=t6HQMz^FZof#|kp zoQwgjFR)dvw8xSE78MuQlNo=mra&riL(hk5fG~2pj;=5r>+xk3i5yxy?cv1X*FrA3eIH>Mm*W)5n*0cmQ&qcr#~M4nfH6cp?)HiT$! zm4TvA+S&xol!+x;HZz}=GI`yQ=j0P!osVWLPL~?+TzH-KMmKvymCO~@Fq&6-Nbyx^ z=9W_D3ZPIxL)q~22oUM~m5e`3x%*LmT@x3@386(|1}>r{`Q4nXJ9m_6RhbWR3pmxz zaOy1HQSn@AGIu9 zBSMh}aYro_04M5xfD6CVjgiPSYFX_pf~tfSm{xlMkqwHm@N37$Zn4;`ubEp-<6X)> z_D8F}V{!bl?XYRLFE)Y)|AErYa<`tknb42pYG<;OQ>)+0@ilaoiFjIB_1*q8ywNOS zfb_>b=fP3~t@#I54#c~m&dQtXM|gKyf(N;zyi+`lK8W45j-_A6n2WXf#j$pj9F=Na zwjHHgCwlqw(SYbg#*rr!^HQPiU>YpDKzMSSnt~dx6&_K*QIVs1lKWe6zT&51+VKes z?FEj*hpU16Ev*mOJj=J=P6@?ruH23yE?L2RXig~vHA$u+KgtK z>&jN+#sEHF^{KXd2zaJwFpJBPa-&HepCzQdw$OLP?QZfw_o|J!UkYljfSX#~ zi(6nH4tS+WZNV+IB7nb2I8GHT4S2LoJM=S&gn+MmVlPguO#-;K>aH0QwD;st0C-!qn)EDr$?jLBVu<`K`&IdR+IYUwU4oWKNN`pb& zB-XF!4bF#Cv9YLs5IVZ@ukeUom45PnX9_ZmVVBy12Rf~EhrczB0q)4F9Q0A`?;Z6k z6;paaCKK4~@9uUl?*l5dN%UHUbAfw`Ycj zBQ9gk9Fj2NK|%_HgM&DLeb*#mx|ev~?pYBl7fkJKt=U9cH1^RaQr(?)f66JEjKTJID02q$&-Dq(blVf-+H7pVSBL1ShI&QehYv8>+mX2xwrWd-S!xhbU42 zfdDS1DjN;Xl$Js#l|HF{3IPO1cQ$uMdNTYUUx3-Evl0gYU zAqu0mij|wWxw&yJ6ldptGK_>LfrSnH=IrLS+I^e0{XtYzNOaiF?|h&4>~4AW@%+TQ zuC9(%9Xcq$q6(NB=78ki>8!Ay1lpH>9S6*i)n{jCgogx)dxS!86+tBa!0|^3R-ZRF z?S5wCk1q&P;a>+&7+7V{?H@}jh<_jLxZujE_j`*%zeE1r1~}1T4V3@K^Z$PScLdsT z1N<~nr?-7pD_c5-%dHT~vz?hcN`#>2kIABHg1C zv=VO1d^VJh3W4gjz&5cgy-ef%srO zD69ZfOB$$Xf>g9vI*XwU8s28K*4zgbG5&rjk;wFZzemL^z^MgTe z-$&KxlMa>b%UQVJ9Or;*%PEdvFdhNnBNh8*$nSmP7jYB|l(q5Z~+T+R!lT?fW3p=ozv zTXTcu#4VfRG_|nLQwe?K&*h1xgN!#P8k}%Oh9ymn3at@oQlQ+C-C)f?K) zi!pN&Mr(Uu2cu{Ewz)h$?t3dVuV=2^=PupM)VRRS->sw2z6^y`D~1@oQQZ|^YjPhFI6Dv}UTi?Mpl}KA=BLSg$;hG&IuUqS}=4L*lroG^Y%Kf6f_VLzZ*&&_#0!EG0QR?|cF& z`(MuO>JCg`-jqgcnXi|*)~N}|9?kYdYwG<-`FSzKSf3w~7L<^rCe)*kLtK^Kggz8Y zLAlm;2FOSY2KE=1Fx>cgTAW2Sym7x;7EKZ9)!*`_2i}b+Vs1ZX0Ux{GxdM#ZJEaCO zcecVzn#atUC^HG@@9K8~Jk#gHrnjG2&pW+aOt)rsC03#tGMW#XmQ%=oHiqgpLWIVh zvZ_icSe@;%@LXd%X2v9zCydQe=IeryP#-mpcl~hN#up#ZS2lg1C!iD5KRHWS8n7!R zT`^OyLMHEuA@eKZHzh5yzny%V|1f?YUSUrA&^BzF5SX9spZ>&zejIeah0|BuKd_{VPc%EXN04b? z%4XAQr?@x)R`S(@RYy(H`{rj;ggD0m_`%@gc>@kI@3yi*JEkN z?Fh0$KXv{d1yx~DVX^r>=N{SjsB(W=p4t$J^*vP9H5vSJcGt1sDkzx&o4N!sclDvj zVp*>AH@iAhKYpkRgnK0Pv^LL2HY+CtX#{C4CGstsd;PH*R<>{5#xhcHmmbe+%d6X$ zyzlbNhw2(%pY|^h;ixlb290$ay1g+SOak!?G0|{e23$?)2{Z?rC6bm_hv%JJT-3Fa zJtD&P6EVx4y$=TIBbEjygUCGRnu8T^obLP8=tmr&S!A>XL;V9Gq(^^vy|rxbABD3@ z;9txvR-x)W%u))pGTj7c#olh+#v?tti_Y9c4ajA+8omw>_3jSW9)>h>;Kj97SWu$~ zdTj`N6|Lkc(so;M7h8L4Ejx}5*p2Vk$}Dq&wH$Qp6Pv4a^>y_g zLu9WkpKe8VPrSsZsWC1r#K7M5z4JLedn2JJf}NnOpdy_)%1@P*6ideOcwDN0PnnDl z9lS-1+~V48fS!eH){aEyc00YH!yf@b4>t#lm!Yim9BU#b?*G32S{$Z`Aojg-rMbhg zk(*(6w(-L_nHZ9WjDfb4uZueRkZMR zE*VmyIu<0~wd3ozn#gju`f_OErdUQv=($II``w4Oj>p%+7CEoJPiIEPunrH_22p6Y z)vl?hepk@QOiI)HTKwAp*BPErq=*@3;at6w=X49mVCu#;YV+}`CKg%LYS60@F6oEx zH=0kqIx7#k z&m(EA)(9_a-cc4K0^?NSPpQ4#<9pA4NE=&1<@l@VAPlddgV=V1MGG*KX%&UM`hK$R zQy>^;t@%|!26b<8hpD)4UbR$h5{tZK60f-FS!`PTdYx7;gLia{go2T8-h14cA?bB~ zHw!4S!PTKk>9)XJDc`wAS($#@jDLEg94lFb>)@TY_4tUMn5?*Rc1pjM%lgRXfJfZQgoW?Dw|UnE)DAs8Q?)i2$D+7nG0J z^TW}t{Ky>f0;^(R$)U-Epcf|U%g#~aMw9(K0%aCuVq%hlEEX{j(*zxDI~nWnbD@N! zi|kiJaq-g_=}gdu_cm_P-T|Dd>fVzuAmugk27b9zLB?X)QD}^`?&^8Uq>8e?4~P&O ze$ih6!>@>4mh<)SR@z@mlf+u@^rftYq%AV7vHgwrLCnHM=fgIL^@I|avn8VuhliTJ zYr50(Z0{60pE2`oy_2#fQ5X@oO$EnU^V)|uy*dh2upt-EdIv{S$Q}2qWccmVSCrD5 zi++Rw$NbI??};@3ZPr?iYMWbcBTNeeT$gJNtvT8Gw@KN?tFkIPzTXiUX<`ULdZ9_K zj2i95zkI32oZ>zX#d&_XApb!uqC1pP@p1e;|8_SjtA9+#%8h4b=29nBuovH*tws( zY_8iL5zOT0FdiAceQ}dx$BHykpxqMoPN{tvqs@xRqNNH9OviET{j?)7+F}1bS3qh7 zO=B*jRcF)k12Iv3>)dsBI1h!54uO)B5xWx%8=De_7U2%YBJ=ugd@MT^4xtdvKwZWr zL=DE1FS7JdZtBTL&!r!iyMTZv)pBp{i8^aNc*nQZNc(E>^oYGGf8q_qTw_NpFpi$U zfatxOr8=RRV*jjbpFH2N8+rE(4b=hvrWpMUN}d)Fa8K^5d|H1p*=Aex)`KD${bK~h z7Cmq)BIoXV{FTnugU0uObW@Bt0?WLAa_g*hSpQ|=-z17Rd$IO(S;0}@3^f+5toGyxC zsK#9|X5Jud*1rZw`Er>8UT-TMaN>%v3-G-~#Ov&lS<#@3>hayt(g3N{GGxLvCM3jN z7cQd5=GF;<^pemS3>AErfz!!?S=DsG6bd51 z5}dHl1%0;JlKhTmQhxJo`*$vi!bH~rdDj(tGy!B)yk=+uuSKztrSVh?)`WOWk%H+O zoIN-t{2LWYBJP7PlPL|JQ(qobY-etmBcOiAtiHIZWOr68BPhl_hDLqt(swqcuiYH- zx?yQ+M#pmXJ!S6QeXJ2>ftu(a8V}6bZrWuB*kLgCPSsubZPAJHU;IOnB#Pdt1|o#V zxu454WQa&eSbDTMU)w|Vgkm1`HW!;=zn*g}PMH4Gm@cGWh@97}w<{D-7^eADP*N}^ zO*&&#y`oJ(=giaUUtd{MlbVk4Gr(ly5(8NX4cwJ3=x+O9D8-J@P9jAvt(1hygkPBb zGQ~`^>TdlJVP$&8_&t8F6Z~gFbnt5aq#*$g0I18+jQBVVU1z5G)hUo~kHF-Y=kwB# zA|E}5jdiOOXC;i7$A`sFu_fP1DUysiHcLjZV)Ds&JUoMx3~X#imDG~1y~f1{LizZ7 zEmX?q;XWtIww3wc>YNftdfb zFXACPDN`T|jttdVrqaqC>AhIukFJj3YlpH$zm%5x{)ci3!~t==rpJy@>wO%a=1e7n zgTlO`l-<5dBTCLoa$T*4T~i@`anr%kG&j5SRTeefe&_3@l%-rc6|s^vc_NtpqMGWB zn(AZ7H{*Jt&(>+gnS6vj+{Uwf=wH;`dPFaW{ma}0-6s2PYE0iOEY^PSm9}p>ItBXi zb?j1`TWCsg5LPjibs-gHdvyPn)Ah#Ah}l(6Yu(@3qCTomO}(1x*}B4ug<`||Ad=T5 zxSsK%D8+~J^6O{{yLEdX8^wx^r<)2|cHL1wU@j=bb$VV8R+`aBAmpdumuxzo7FAKv zZ$X+$N=hoS#FheaoZK5e+IjQ{%C6WljVF+7lni@n*3_!tTiT{Kv!K+$nu&ZnaPn5DyP+nTQrVtctKNgQ#4XN03 z9A%Or7*?gF9BevSKf+q}9y>yzD4gJ5`Y>K(o}?24*8Yio>nXZK+x?Qfh`7U+>Ye~a z?#~<^pXqkdiKl63{nJzgo)qXpRB4&@Eio$f&sUKOMyMprXC6f6#n*yrGR7*dIg|K- zi^r@|Jnci;k8-2L&{(Mst;DJ?TpLGyuddKtrw~EdZPGUGVDuTHV8YPNPi6`o{Ib#- z2IT^-%d9(TwTx~Ri1jxvFyU8`-x~#Yo-a?er-iP9qC$?5lsOl-H`{*yF~8I)`XDm4 z=Z@`XmB;hePbQ`dH~syRo+4Bi!?Nmg7+PJ^9YaS2EmQ_sc2Epdx^_03wTCr=+tZCi z8WYZ1!9A%Uubsm5%=EPK7CLVI(L-L0JOd&|(iE|2F14Wk+@9C|yc|(`U$@0GMjht7 zrIxcQ&YmUB5H;(ef_UUHk;~z^waEe(dr>o_$xV8Y56tJoEz4rtwf(hD8{}kAI&Oxf zs&<`6z!!sLd696*3Sz&F()l`85fgkFGA>sGa3U;66%Pkp4|Z@R9gwn`#Ar;L!}NEm zPx({~J!+V3>)r7*`JdKMt>c7?^XzFym$#jtyJP~0pLbN2-4<_GmYVOb&5+(1(ly?@ z>XwW3jobVP<7Jc*?F@eRmdG%vdHS7Ru$$gMMP=u1wjs63r!TR}NKZKLZGkAR*jg@T z=&{cU^yqt}c9jWgoG&3&1o#pUnFA498SYLShS1Ht>b`gE)vL9Om2;OTZ+9`NhywkC(e5bTs@pw4c^N1)Ff3HX> zB>ff|RNTvXepby|RZ(!LHLlL(01Fc=Wx$q!_{XY;UtTu3g-Oo3@wk5so?gz68-t!u zdmM%CCf$tHbPp@E_=Pw~(`|Xj)k{L>#q~?t@hYss$h2M)|3iXq|0j&lZ(@5``wx7+ zC&YS?c?{qETK(QNIv=p$i56&DiS+est&OA%PWLmLmty5tDG7j%H)S~w zTv{BfCotmnn?Cffw+o`X5U3~?=NJ&CHN@-Z}eyMu>6_cm$rf6~1zm<>7AC$9eSRq^<3pXpE`@}e6P5YktH@%vg2fx9 zOoTur$sZk9|99$O;oo)Db!{L4tu=04QC3%UixfEXd#+t>?0e`QZ(6=@u za!~yD8lE2@d~{Rijm7=sD&`1H;(Yx^5?0Unya9EEHab*gP{PW8 z?-=pLZ_4!b$0b4!J^s$ObURp&CjD_L?AG0Rx{|WK0_(YvtxE3Id!1g{=So@0g<4U= z)lrTbI)*YaX}+$yrshkr0@g#4_~-bcTSyXF1w~y@M3#8}Wh7jU5%W$Q&aY>ptR6>6 zE{;i|km>y~wpeS#U_CtVMdzzA%(Kjv$s)>gZxYroA9Yc1@CbuKyV7y!khPSOso9zGg57_2tp;uOa>y+j>>zzv1Byj7UR5BQl z!k68&Q~$$qC!6_NE7$MYM1w#W80LS`&uYn<)#}H-=)CCg`ez_Ds+QL)x=%8SyUi1k zGGxcY__!`NCy8O)vI$E2xXt(mf)TB%x~RoNcYfV$Fzj0Ki0acYI2{3P8zqy8$6}LE zBkgbeYD06q6-NFEHT7S1Oj~(822lMbJspDuh(U%xniE2|$dQz`#69 zh?~J4GCFZtP_Deq6~Dbrq1|yxF+zq^5{?^x70!Jg>}I89J&moYD%@6X>)Lp}RH+@Qv2`C_L2KYX22 zU?g3*c4ON%CbrE9C&|RNZQD*Jm{=3rM#oOa_Qc7==HK5r=lZ|wuDYn+Rn@g?zwfh_ zyyZ#YZ>bQSeeb<@&5Hs$jaL&i4uY8adN|bar+xvALF=aP9HD}&h}0W5?;OF&kEV-z z!kmb;td~;C;Y&!EV`_$IUcQIv=fi%GrK>>p#YN7=pJ}S3+#sx#5eV!61M|K}kdw6j zti7PHR7{`-my=rQwrUDQ(pc(`fe?Z~>Y&&FPWI)+4(@E-tcUU>&pB6Aj61U#{@HKj zGdDA*T60a=2jx2V_lx?%A_Cy$(Ul3=?2@$p^oQx-TwHx|G3O4kFm3;Qqx)#Q0{Cmc zL2lGQiB=}bQo#uDAVvVl|J0JxO4e4;PXSqKEdNp;_Pn5l<0j+m+wr7*Pc&Mn5~yL0 z^S+^oQI(U6LR^$tf9s;H8yU|P=3IC?80g5J5%m6C-x!_z_o#pMtivSn2LxpS^%f#H zbD!1RPgH~T0Wwm>nPs(wTXB}_)>r?&IXbU9h_Fg9GgKu(t$b;Ftv0k&|AOQ^94-$# z+YjlcpfE@>cwc@(loFLo?HW~EuIw(ytuyg9FNWsTrqd3H4hk(xGcUdSQpF!S1h|ur8F#x%pqbXP$ zr$Ny{ATY zLRY+~h;&q#s7+A0+P*bvJ2$Hk+YXk{KJE#l*r=Uz8FZ9f-_oelBnfcyer3Ul)pT^M zWwz3+D$iCdzIJA1`8ebnOE>yyVWgoDB5C0j512hMJPnRL5OLBcPuU9DZu9;fnfA&# ze{9I^&H1{RarT%fu1fwjPr-|no<`i5rb4I2pDxD4Ts^OQcDuK^`W*BfRb+A6z@&`) z1v$wfvhd1XOB2icaGUl)1=IeXoP|cRA>Pn|Q`q>P?(0sYt1Pk8P-NY^EjLW&5dZwe zx^%S1aoWaPPbKeW{3ZdnFhMdBPFL%N?(W}rPJ5*$1Coa4tB1=(VCoi*Ht`L5a&piL zBZGiIo*1QSMSUhc3!Q3)3)g*uzVvEJSDhRUQ_dfjo$i%0VLaR0!P?G%xwb5`+Ucnf zjML_ccc(_z+3aNJGOp6iralkj)?U52Hx5K*8UZhFB@LT~4^y=lL)U=JJlI!1rszUr zD^n3m&LIL*9GB%~=hohdjh(CHOimXQE$TjA76zQrfsvR$Y->0YwCcY#t@$E*2&VCU zr-u#A@2kfL*SCs2NNEDMRSnaQ!pdPyzkHjIKDVsT6uZaBj%h|qj&PPR@N(V-bL_n8 zoq6P4=_~SN$iy1^#eA}g^c0{Y^>F;H=86QY-#rj7?53r&@#w)OvHUxGcZ1qu7(Yh7 z&+FIGE~IG>65+(Jf4w}P1C}J9@VrSG8EK9(c>{Xb+Dc9)e0=?u$2adTapS|f*3Lw| zeD~ZMFT&JS?|a?#NVv@hs_O(P)8hyLMiJd3`!}oe8EtKbyEAXT>*w5~7L~pM0adil zaSJofVBbd;{@e*_JLqp!PC%OoyQb81NUUB1y_t)guR;({_KR{JS{@YY$YdY}2WFEwWW8r%)6FtaBrdAOt&bpNyjg1<(gRs&}WKN_KJ9v?oQ+G~!1Y}TnX9m3yR7?l+G zKDVv2*Dvu+A=SBGh;zgG4=#yJFnRW$n^aqOj0$kKwHg?Fhq5F*Ig|t(#RFtA*@*?HMXCoSBWsXzWbB@@7$-ETvXy)`H z*lUZZHfI|SJ>a9fk;W+Lb8gl5dx=l3v6(y{+B6kh`??5^-fKYTzTCU~f}(ji&4Y)< zVCi*hO8Okx>L4Xv*MpqZ(bNME@>%r0WZ}7Xe7~4cWggpLBI{v358@Xh?)rg^L%j=B> z&q&2IAX{5w`BMS0C$Rs;pFcDuO)oK-yOE%jk({E|oX;W-yD4s;IZo*tAalC8%_PR< z8}C-MD)q1J_Q*r`wTs862=<1-|t9F_z)(9bX% z2fOf;u9JqBKRyEPsBe*sfnB7oo{|Y<+ZSXp^dw$BrI|x?HdMnOzLN`$v2Ocq0TEHt0C~=%bgn;5AzyUiD6dDEt zKG{DqF*3olXlH2s+#yKGRhK>ye-RQc8Ek87Q$AH@vkxTdOO+~W{5g)tjgEMiTr?mE z`CW@b&sI1}goY-V+*okMfhfwQ99ZRG&7|`QxD)Egj{eHtdQi7E&{dHpSM3wQ98fun z&Irb2G3e_K93261hiVOm8LL)69fvN1(dRsBL43E9z!sSFN{=(-a3>>anTfW>J0 zQ3EOyR`p(V^@XqOlK$B7*OO+uuNoT?W)%&X+%>1PjY98IL{u8eA$2LfTD^|P-7O;V z*n?9q{F2~|W1z&_!oYK^sw|63&s(yt8QB6HMEH+rk1nrMZ;Yrqn1GQ6*ZF-xrBz^f z;}|6!<-wfr(I_9sF-fmF7+MouTqBwrZ~LQ|8hk_sb{5c-$Fmg=MHTI+)2>Vc9QQYz zfC5qV`Ri}X^vqTJ*m8%H@SNRdV3c9$QKdHiDAy~F!ia4XSM3>68599C*%ir-c}c~+`* zT&8(ys8?)I(mpWoQk9ni8`mGzt(h6=rY9mOL)ogOf;YGA-uEF7UUmeCwHw@bpkX8B zQBZJy5bHG!u+AT+OI+wTH=L#t`Y+3GKj8+aLU4cMoNh~COWz!?y3jcfOH(69$bGx^f4#o^ zYlNL5>zZ+@f5iD)d!Y=NQJ#!_@^~ge)FAt{klXO^PTzvaQA5kZC$-XIXj0Ozrc>@U zJtzOPnvM9&c3eU5`Cid&f>OM%cyWN#osSM23Vq|W$*r%c(kP9JN=^i})T2u6 ziNAWu=)qD8#Y}Mad1OF1<{uyxvxB*`YC9=31!6JGakaaFp4J(Wd>4&!a1Neko z3QQZm+0eb@(46zc$Q=qJ0fTG>^;{t_ije9@*7F#! z!Tg#*NMxx`&S)r=Z^UE=ALoGD+@=?5INdW}(loVX1Zz2#ev->bF44>5PCL1JixE*+ zgFYUnIn-7#vb?*ov^1i%lRhE5pPcazo3fOw_K&Doy6W~+J7)e`=H90Md7tgcd2m7v z1)ShRxDiR_4yi5=t<$KbkT-la)g_)oXllmxJ$-3K6gdnGVtWyL8F}4;q*Me)3pXb{ z>)$gDO5DquB^?K%OzO4sQxuXnRw^f)1TDfM0@;NQ{wL4TrlU&#bUBh!^t9EqN4w=0 z^pfSiF*DI55g0BF(rTfkmb2LZaxI_`9WLEsJ}%Dn6y_x*0sJDl=XOlJ8B50}N`91M z|EYbD#(B{B#92YXQkC?LVtXJhCn>;fp)w7Y2t)uR-R?V|FX9#GY8Pzxw_0l4qV+$^ zQuh}8N~%CiU&k-&={WTIl644uWa6>eZkdFgPJ5O$vw<|w$~FG;U@hBAUNB(lg3*T) z8;y!zxP;)&rXuFz{L_T3GPkWSBij4)#T<*x8oZePhp6{>vaMztFwJ;av=*kc_Qwb^ zo{;C)B`60)s?Fx!J_feH1ftOJd0p)8!^=!)Fh*WLy_MWCnnC0+?>Hk%E(f*Gxs5W6 zj#R`BFo5%Yky_aa=WuO2sUrC?%O#8-W3zIu*t$29Gg3s+DMbTKdn>!j)GW)eHRgs& z&<(M2B8GqR9LsaWAClw4y3Q{0$JCE(+DC#gIL`L~8zE;|$~Q#;kAEToCROp^cimX! zze)K$UOGD{(t>fB_2K1gW$a@xv)isVZ;<~!Hz;=5kho7qSF))DvteJmIy?PDUjeAR z&hK~|>^+Bv<3Z0=bZkj@@!ZdAmhe^O^kycDn%LYV;`LAJYbnHGz1Y2tAZPQ`?zoTi zAONY!VSX@sA=S`fGG7%8$4+s)>uvfE^aUXIU8R+qaI7da(t$HY^bgD!ydK{Ca$dk; zG;FZGigu0kWYn*J6qD1q*f_6Rt~Tg(YW-Inx;Lz_fyCIi*iN5YIH=a8$u*jEE;H15 zRrkzRZWkggpU|}>+~f7R$=77@!!jM8!xE^|?)Ekv*@kmU*Tl{;P7$7r|9tY^^8CfT z`QYsxap~%IcC=BlTb5vcc(h*}$iZd&tp1R?D3fRa8`P|X9Q}KDnTwEW9>IesK}CrI z?F?OX_Lc#vT#}+N9cj6vRIb~HMxuEUYOL6i8_kJWJb;*0IXdZu`b^*<8RydbMUQMF zT0m)MTOY&QcsdKQ7uit-hr|H|#>q>yE9Z9o%%`2!ARrA%K}QQoGpNda_l*MMgGgePcTXW%0>i6}eu6Rc~Fl zfm%z)o}(x!U}n>eDN2eD4vCYWQ6ZPE4BG{N1Wa=~AgJ6$K~cjFTg-HGb~*Z?UW=fn zH*0koX1)*36*LjYs~*EcY|7e2ec5?V5~EIudKj|dPy8?#J+9?RBn@{tc@=I8m%#D5chRjJpb-O!DVh=P`7LQv|RHdgX{E=B`Jv*1I&%5HiqPc z47_*eY`(ihtPZU;#iwe;A|N!nB9i?P!t=;bT%v)}bU`6CUEh+eg`$$AhBC7D8zt6a z6sRL3B)0}un)|YB-Fh7yeUAORZP?mC@mXquzi#Bw%@WPP-4<{q|D~i7oUN{4*&4YZ z)(yNvy@~fFHp2{^jXeBKYR>f|5?P51HvkEEK*FikG)H-%3zUQiSCTOhEADyb2~19T zQ&`v~XQm!ktfuzo*{3m%07G?<;Npu8E|lGuE|n{u@)SGWq1Tko7x6}=19l0uznrbjH{HoG?4n;>1cKJwHvs^kXPE?H6bDi?)!Nn z2rvB8mZV%7qq9*}nI&f1QjSJeRVBhV$e}ahQ0sD6M))a|t1hYdShlA6h9u90+zga+ z{WCU$;H=qv@8i4!>gXvo1u0y{(-)Xwcm}_Ffev`2B)>fD2!wSIW zX)9K!vj}asYT~Pg=!xi-h9IN_`n2ZW7$$zAyo!l@@4k$2tI754F?Yi< zVV-OW?F@e^yMYM-N1jIgD3y#sN>WwVP!G=yyBMOoTr@RwDP}~E9KzL8KVYvpgoj74 zyk2KvBFI`LD0>fTE(7dfX7}s|i^+FD>4W((!@& zakn0ioW{^g2`(}oN3pRyG}3K6X5-!M$?favFr;1*PEy*Z73aq8XaG&*c+hxU8)clHUVHiY#ng3V&-^fD@G<;8`{d>uaFecW4fCv00sdd7hgVNqN4MDeKeur+O5a z*XES>k;=B92}@%EYq(}3FtcpZJ~u|UVM?IxE$*OEvd62MjAFFW+kF1SrFCF8ooXvT ze;!bf>OGvRqgXxme0yTi9&~CJfBW|>ACE)u6O*NaDHq zN*U0wr~NdU+jN8&+bOiODU zJCi1w<~cWsaaoqR7Php1Gyc@s^IjY;F-38tH7;8Ge~MZ=sW`4%<)?VN=)5mS4KQFG zGidznf$4v`G*~wMnX+TpGMa1>G(O@}5cNh(X$d!aBJkih+3T^ ztN}b;<1GmJPic9i5~{lH>YORM!sNq%{h9@L`8d}PD=2G9Wm(Pl&(*C>^U>{TChVKBx-Oa@o+5$Yc z(_EyK*4OpcUF$?~K|ujj%s>&BeDg3N4-Tiel((2HafCkrAO;f(LhW;ba+T$^TwXJk zTfUx*#I*ue1(l7Z5eeyTgV6jwa~s#|bClBkOvj(91SX|LC3O_a7!PK^bkpF>B~dV@ zue)Wg$wZ;(m*k8yE2TH%*A$J*rx4$t|8V7U+9LlB)2_My)1+1}>&olcy~rMLD;AZH zM3)J0w!OR59Y1^+!%VfiIz@mvCmzH@GT9Z#A0uM-)6V^Ps4xnPdvNdlrrg_O^O|ZQa{oh=0U}Ho@xFz32>*6-V^> z6RxqoRsuh_#iGNnE4T%Y4yy`GiZ6kPE$kmREr=xf^BZLmKkvr>E{~sIP56X7KSr*s z5%@n?1b%tvezH+plL{J2X(Z$bNa%(kUOJif<U|yKv4Pp6;QZxB>3Q^JNZYzHcQM? zM_Wf(`u*e-M}yJW(UEy(a2f3rc5q;wEBJY%KT(7D;)7o>)bSPcuk>-gN|JUI7rY%!scgyrP5gL3y>6XXY@kaD z{NESIa0T<-JW~+-F#lUX75T498V^T9O&!c(Xl%Tf7=-}`)h+@x2ls_#cklhbJM~3? z(N7Z=`h(00-QIV-0UxiFi^IdiXsHYR{d;xO;+~vHiQBVv3015y@wSDur-1NRZkVPnY+aJHj z(F?F7D(7^Rj13L-u8K%&iD#HWTa!~(PRj1`m7w~ZVe}}z1hGNg-Q03=b2m2qMBg_- zDEN?k+wWQ8=WZepb8~ZKb>ufUiTWVsZNCyYIQW)GCG!Ov2M1=kjLb9h2+q9l3I6p0 zC=VY{8tb;l`s$`y&Uv-4@I)92>kEp}>X@4!CIW-dfY#so=7@A!e9=Xlk#W+w8?7mw zIo~>4!3)`g5Ii2abGY^}!a*nkQc^?HoUTi$Uet#OxjSJ_?Lba7K@wDqLPh7G>LPC3 zc~bXi;kf_eJMsUGJz>9em-zpjoM&6m=l43XSnmI}{{OenF2NQ2_^uys)n|j6cC@1i z@(+c&GI%{$fDZPU12XBcYRy509?HRBw-*8mWKb$X>Grn`*!xEKj&6Ke08r# zZ&njS^NCjPzQv$l%+*?ef)*{QjJCVe7wL=IIyL1#D{1tldg+6gG)fAO-#`yyl;HT$wR#DusMEZ*J)sJDQO1^ zkxRZbEeOWR-7U`sV?!jEkUc`bZ&+*j-i6jnz|I??#wM+0N5&-l`>ulW4$p>Xw4XG_ z^ifCl9?dA4DiUZLFgN^8tmo8NTvdfQx4zx&?fQ2FnF>QWklx7$#5V!Gv}04Kbl@;(|G8VwDNYsadO?}lYJb$GyUy(}-wZ7=l>AqN=J38p*q_{PBU=;h+wQDAs-QYebLJ z^Xy&^eYaQs;6UGsd%L$UxWG>z@W;L$mlgJ+!=c<~QmzQ9A9`lJ*5O;KGdAZg50^V>S86?@oL*uoW%D`sO zxYsm%>qB_hvDzFThu1x5c@LL3h zW%vHxEdzHK2vQcbSbu}{MeGjUlS9YLBJW|kwj|9Go+S(t0o^Z3M&fjI72GeFb}S&V z&VRJ}sHktCBawjeU>Roh~OW4FmT?`W+<(^&lOT=7gPbb#n^?UMm`s*9RtIK4T8$6cG;awT<#L$F3x5W4+zbM0Dk=aCN^$VxN0Wm7wXnn@ z1sSIBpHaoF%AX(I97ghJhu1Dr&rQ>B`K%pieb8E1&#DRv)s8o`tW@8&z`&AVNY|U= zAbD;shbuyB5vyBT{BQ;N7GVMMOU%0v0F0RNZed!3CKK%Wd?h_atX}9 zy(k7klw@VW>DSG~R{g+U>T_PJa9tgBy@*Ls>q&Y4k-x85Ovz{L%+LQc(%%IN`=l~a zQbIaX)_a3SqM$0o9U5U3ey?WP`Q)=BD|h+qZ924Ghb(m$bVY=RhxgmOQ|cRe&(6>5 zv^$Y&u^Jz5;KE0`?_XRXt@9iRJG#Dupwlo-b|xkiXrL_@qoy$MD0{}iBE}m~4OttU zl7MvQ!-+JJrs9VHr(LyO5Cx>bv(N9Pae6MK3L+fl*@f}+Il z-!rV24|#>W^#KHdPpgN7gzVNLU%>7iY)ws7E2=77!J=`O8L5S9wHJgA7N(SzS~Ow6 zG8}-gJfbayh2&#yi}2NL(==09CpDlGo)fYNDbWN1Yu%BN2i<{4LdGtm@r1Bfe?2~w zeF@#iyo~&u(D$5!xy&X+b#Vn$TZ z!((=V$9^3uLhxE6Y~z>mE*>!o##_U2-4hmhoZHVj=kO=Hjmz%6`dI;vrfJS;6NY;Zr<(24^wszDU< zFb;3l0l+xUME<{9S|5a0WC|_Rn3x!l?JHj-Fv662w+uuhVyyv8obu#AjTVAX_A$}X z;E0T4&Z}jiuGt9*KfYq0=a|o*h7l$vCX6T|eGTgU!ypGiXo}!p;Fta%5=%k&;7kY? zGNNSHwAJ71T|-1D$_e}@Rm#e=5YvwA$xt-}pK%_WjKVMeM2s0;W9C%$vw_V*PY~mo zsn7=J>GnQ%Kh)jj&Ykq(cxQ%zXf`P2-O2{a=ofaMIdyPK$-?UUKrh% z=bOL%aVQbppOPTGXfVI>`R+R=BU8OP>{giw`f8tbu!MMqK!zA^d&I2TN1})^5PelS zNW>UC#9monzb6oAt*NpSSj>kf4G2YJqzd%9gN~zD)~L~eW+z5MuirYigvSe}xE_Ww zq`40Fy4i>3rIYXq{c(r6KeY`s@XD3`i;D`OynBTzOc=Pz%SyYd4sr=0Y5MhVASjrL zbV*!C5(Kh>=2k?%0iK)kh_FSQ0%n;5n&r)90V;L497Q-w}!@ zARF%I<|;B%5DH@H_@_-Y#0Sa*DF&R}0?17QQWUw~><s>S?j3;6K+OLB}?*`olDgOwot~ z3f-+gx+zfk{;3?y8U>d?EaC0-^|QxdHeHtj4EM0PrG!{~^Z%E00JNHqg>Q z>e)CxK8{udH2m$vSKJXaI0#~EJykRC=e$W|K{%;GcA<5T>_Xb9?4`l{?lw03 z(oKbMa|$P5V+&qG5EfM}@E?p1giD^YP~ClmY%m14T_;|c1tJ19($M7*WpLnhHXN`- z;o4D;UjVha!muI5b=S4w6)!1lU*k1W$5+6dx#KT~Y9e5~0K|#`h)yvHl@_oFzBJK|uR@hn@mFwdp4O(LNxX@~soud!q z!N?_Av*|~F$zMPu22UK2l5@&AyHTFpO`Xp%hP;`VdUgcStNY~X4m`w6QpBzCiM-~D zq(p2H2G#)(kXdm z>9+;}AN{$vQO|rBYK&~30&H4g{{xcLpSR}?OTTe{gDe(zJ=0~cX(c7oxO7fSApDC` zE(9-o`ZQ30{;EYPS$2g=JDuQwz(@9i5$((bFqjP(Y0(jicY+ zH@Udje0`<)`7=KF^>hC9RBYDAb;alm8V4HJg|#k}3srA1(6hN912T|;DM*4}()V)< zr?XhtZk;S5EPa_wxmH~r*47G1VgS`mIcpF*FiHo(GhIsR5E&`r=7vpGaG)tLnvk!3 zbw5O(o47MYK4e-Dxf3G|J53EYatk~?O-WB&%peYSumD6vQ8lHDfxiZ(=(pHsa+343 zl{Yv3DzId;-`iv>T0KKRL&h%Q>wq?gqKA=)zVr9Fd|tZtBdC3^n*3NX$5VJI(|vO+ zt=SBmW!-RJfUbMZC!e7)V>2iExXXo(O`u+GzUp55D&bQIY?2EADRV*9v(`-6*1trX zM3|5+tRd!@cErSik1R`JjMEPf_hC>9+W1aDQf#Zr+5{5ZNIK?EG5nW55p$6OVWJ$K z{cJFL=pj?##6Hzh)CUKUy+Jq@(^*SR%$&%Xd-a)_#fxgs*S^Jo4y;)f4QX&%E{cZu z`}4k)O%~gx$po!Fs~966H5=#gE>(e2V3zy4w^l&;2F4q-JnA;xOdN01cEFL_n<)!s zR#wH6bKoGm+0i^(cNr~#)d_xP77}64wdnN|BxB~qNw7+@}58W$%T7|wIk%f z+IL;#eP($%2BxS7?bb8S$&!h z*Kq%x9e)^R4T{N4W=IB>XAJ5+4uFXg5$RD=^DUHR3kF`sIq8-OWfjuF1q(ao-3&(l z?s95z>!kZ>uN@HJEtDBixM)#QW`V2z(Oylbt{n`H?tK`~kf&mJ@HF<%-N+>yqM(ICQ>Bu@>h1_jaRa`5PxkK^HFm0uyg}IPVd#Brppb1 zF`}8(GlG2E8-(S33Y7tI)-wk7IKm==Sa*!jzA|r7c0xG>^ptJJC8h;NL6#sZOoV5k z8+nR*HQj13tCn^ZGEy^HEp(I%o`k5V=$%o}w=mIXT!_V%%%tiHN=6h|#if(8N-+~F zD+Dpfi;h`>p=L-4)zOH>3Z472*-_NZyl|dL9h0erahR0a2o00#@JNjxdH!eWcS_U5 zsiT7V4njWT6)R&u3p7jgHyW(ABV6a~|EWz-kY;R5b)&1r3C@&9t#bCuNChruS3kCK zEjeFGEJfIL@otW684>2oXPU*<+0)9gZ@{`SR1fhz&y!c1OD~82hF1ErT(m-U; z7#*c!5KS!`*@ekQR(#ijcudXB0(Gn|8sQo5I!VIA|8P1D1}kxbd%xTgz=L0X5(&6Z zOjL?!$57Z9K`k*h2j}_a?KMUzoe{!-*bGC900=`?eg-em-%pq-XFvk!VHE)@_lqHN z7UBh=cQ}~5+{6^1NFL#>2)?HlHyk@iUfwZbpWa}spe<;A|XsYa%o-yyopi{<- zu9eU#z+@l}Bu1Lf;d5Qa;t*yJR~j_=mo7Cjfjr;GPA8a|cjWBXHb{JYo;Xn={coq! zt!TPkHl=LJu;HO`VUQL`N|a?;Q6?lR9rf{@h{E5Gor<$X3Xwzz*&*_n-*0_mgQ4|w z!3Cs=(l`+^6_3wxWO=#|z<~$kcpA=UIYab}QSLy(J*4&`b&Jfq8(x4DWr)^|SV%Xv0-nD|4bB8` zxxK!&Dy=>D*D0sAq_wFZQ}p}2kkODx;0qM>em*oi;c)D?`naJ52~U{*{ri-yhJfLr zq|XlYad&9Q8%Ovea+#cHew|1?Q7)^&d@h+HGK3yA6Z=?yBcz?E$ksvPYBe~`P zy#(uPu-bm^qDGFHR0-6CZckhBE#_RT^7HlqCP*-A6HhX&)+!-(o77ZS>p0`KF9%ci zm^T*A{V9tGXQS_%d$pfJ+r%>f)aZceA|Iebak$+*?KZ5~zrz=fi)9BqUf|DDK7Vf^ z*j{aLCHFP8wlxl61%#jb};ezMe)EIrrzA@4A8G2zS%cXYYMT{&J#4S6(Zw&z=-xOO^eL}h^4N*q}pM- zg?EQApzu#1uRp`|oXJM}DWSdFC~^4#yKo8qXmowk-~NE?KjEOoBYBz7Y#vAHU)TLU zkoovlg)bE%&68ixE}z3Z1+Jj=-2OhmGFf{+CfIw!F2~ptsPT;}(#$5I3ObENuYLAN z1GkmI@SUcVm-_j(A;prUyRHQ5 zRZqnI?|a(w=KNI9_hVolzw@!ZY*UOu{_DN|{x!5NqxQ~593Go-#Fn1#n=UB=REG;u z+YE^1BjVpZ9YzDe zAyB{vRQ>e3F_%;c*-4(xMltYJF-Y>dy02x@ZOiFCQUo-rrL!rN)?|xlK}%Fx5+p*U zrmA}h_aKcqtg@PyP?ws*zVmEVI>$t1);c8S?X=(Sn~oiig0w#Ib&T}pD%k;k$3!m9 zQWpEi=b9vvM`~teBWCF9v)!?f`R!8b*$Vg~+a6dTdX1+sbswO2N6u9_JgBL^7NS=X z?FL(KE_j8!1+DlaVw!;0adiW@x3?!9hUEmKX9MOeXur;x6lx#g4epP_Jy3u`hCF}_ zr+nR?kIL2uplN%lK*?M8G?HpIgpQM`-+{6x$k`Dq9h`)5bHyV;gRsRTawkMNVM`i; zhKmgTZ}oGZwE0vE-WF0PNYDJ5R}@xJY~FHpTf7m)3Y;9l?XK@YZC0UjY}b0_ijTQo zxil4vYLuF)^k^9)IvhXRa9@=H-kob$`{u^kkOMK>+#x-2bn^Mkn41P8hX`XI;$3j_ z;=(RupWR08=XPQk-eY@?(rtE(ZRL30Y znRid+T#p?lq|4!ZVfMDPk{6Ciu%pfU!+^XyCI>1oMFi%~Ji;rp!Q~DyIyT0ctMj={ zM7ysXT=-~L6>c5I3D*c^0MYFyuL9&{2t4$MDTwRF8oj zRu0b;)I>KA;TM6+*Bqz!Ep)747b?7dXondj$twOv7HEvL%Zqve1&xQ%8to(o?)MEA zm3wiSgx?4t>QrpkNpoYbjAjDOY3qd}$R!~mv8QbX^$7(Htv6=;5F7xb?}m)+g<`DY zjISc>L!7MZeJ@sKX`ocAdyc}X@AbYETgLqTx6C(!i|)^Z!*g8Rr>Wh+#*8|l3qPL+ zFk!|_Inze?*whDB$Xed7B+gwq9TPiFi=_S}F_U=Hzp3>bUhfBU`WB&ToTH2e=JsR3 ze-0#jdj7svmPZUsPY=_5n;L{vn1~pCFQA>1&t=}MPH$@ENik7jC!jX;{kl9i+;qD_ z_;EoX+0~8>7Yfe}ZlsqaTu+5&kL7{{;X23z5}*NI>siqiF-;sp)*%|e0*xaeUwA>w z?2_qXp=1xD05M#dTUet768Id%EAn=X@UgXYou&e^xUxAYu)aJ&Z(dhfpns#S86=M8$4rAm}3_&ErwGpN}i71y~&{%#Y{Wzh3n4E8k) zBgEak;$MVyi)Dt+P7@Wy^$Rj~6Q;R(HBL;>kcGV20CHNGj_)VPkvZ+_Klzm|S0a_Z zHMWf7G6y#D`I*;BuJ;@lN+LM`zP;ghDM-?PDDepyQ8 znNMC=c=RU3vdkcZ@-x!eWmZPn6{dB<#p|V}8rmDV0+}D%>|MEeNH;B93jiU>pen%# zRD2Z3W`4Q@4EMLE5%u@5V8dw1kut>k3+f}|=$2D-3|EdJ6+#D)YdeQmL@ zuKgj5wm|`wUd7S+TO-0So7e0Vm~_`XYRa<0xHe7A3R{9)ugsZE9l(B38tt+PpYwxf z-CH!?kFDk@3gD#iSIMZh)KDu;)(lD9QrO-m!0xJRi z-QI|v`gN6K0WNM2?=MbStY0?D?D6q`VVOEOW`izlVMuuqBuS>Q2K0@zz>ulvD)6Ru zUSDId3>`37l2^2_A1?q^ZL3Uh9gnb#q>Vvgjo)8&~daPc;bP}jzZyN zU6?mvp`%Twf}&bzMnZnh4&%$!B6|HC{*z6+EfwY;;B~UgmCvuijZj$G-Th19kHl{g z%0l78!-|6&-mqg_U0!M@}!NEQk;a?j7VhIV#rAy=#FBJZf(C=O7-!*kfDvrKi$M&5tkd_ zlb#-u-d#T@2qlp2hZy$A*V!1Sj-a;YbeW#d8?W2Q(bL-?6tKHSjSVC>RaVASwu4X#g17Sa0^zVh+1d}-C;pDT|-HEV$$O&Ic*H%zebFp~*WBzo!wJVvWg;3gRd z*X=$w`<>L0Fjw9nzA`~6w@*X#Fzw)=F;BY7ihql0gDm&f)7~C?X&Q29#SC2U(KRoV z$g8%@^gCqaNK*up$Ptg@zqr&dh&}RI6YYPH3PRi=eueZRU2HYI!yf?NDypl)WU3<$Vg5ky zq11gh64_;2O$h1)+W{oh^VulN7a2wOi-(pVJQ#n0Grd!A*uegAm^+*BcgWxN-Txt+ zE1~B;X2pRlMnYG$#=#Y?Z9I-8)zf{H#yRBENFY+vN>WxJtQ-bOCB27^DepKAJsHn_ z)h&zt3(edVx{HU8X%+F3FGCTJfhDMBY$~PIz|&*Y%fuQwFU7_a#?9?q-0rTvc!TAwOgL~&JqeisuHa!#dCWq!(Jdbl}c!2!tg$btr<&_PQO z-(x|O8knGs0Hz6aa+G6DWgorNK_kHS*l@V2nwqkvC5b5o)Ii_01w`jAWKjXR8+dTk z%L#5B=`*$rq#1v}!yi``4j1HP2nOuYDn75~mJYf=eWt#+IWxosbjoS7Fz6vzf~>5} zglsb|QKU_>Ram6u6*Qw7+66*X8t+uMh;KCAw@OqdRvog&UfhbV5|XJBd#Xg8hf}9L zv34cu5lp$}YFNY4(q?I?9CdM_<~UO_JGKJm4Zt#H{bLeno>zix*t8Zm{xq%O zI7p;$Wvp(iJD9fe5fOp!j$KN@C~)9VprX1Fy_ie?Bf16nC$vF0D%p_OKH%U}Aywjy z>|ytwBm@7bXY>VgELcYG*RLXgFIjtVu8|C@czZpv8X*4~UyywR>rfPtk@>)kWDLBh zlWLr+MR56WS+yavZ2PT~iHHV`bl3g(?9>~R$=+^M2~Q;8#^HP4N+ORUNl|Sfm+PA= zf^FzjvHG!v`XYvPPDs(_MYUFYAfgU=f`8B{NS0T1t=xwk59WIHYWM2K~hHVOdEpK|8W z4c@zpkogD;Q;V6bK99S{EnknT%??umv$D-r@0XCZ!4_&lhP`20$IWh++Hur?FQ(CW z=&9_~W+Q`6xtFhFtg4x81g4~KAq;7muqi(Oy2wD_9L>>$iOmxX&Ds3cez~{-` zyN7Gq_#nA=p8h3}_ z4#C}BgS)#2cMt9!T!Xv2yF0-lI1CV+;I6y>z0Y~(s&8hxdzMtK`s)3DihP5jHRyT^F+;9dvpO-=5);Kjxk7p#?(AI^W6^sSDw0E#0bF8Av-SgqFCoR;^!5bjzWO~&Rl zoZWKT$)8a#_?YSH+A30(pkZ}n2CBFfEew%kOQ%RwB8%cu*7Nac?%e`_$>WOf^~Tm$ z-&g*-`j2lvtfa?r0%kc!_oV&0^Sfh9u=&FV3ha0sYdJ|uqV*Qt5_^cVg`j<2)hFZD z1kAK=E7ATCzK-9Xgmf`IZW0T7?LFU(WP$3-GwM`!k+%eT>NQ0*f0pRgYCiN$NYb9V zKz*p7jxdc~@7P_{{h(=u|H_j^Dhk~%{oZ4qrTBGaIr$o>U@;Ii{a`Twl#lASM45+K zFGwy#iKBzlYrF0A_XoVzBb3f~Ug)_Gc_+;gdwmnS24e28f>>R}b=z}rm06GBIwE6p z#1PXmmi|us0}b`gAzg;B61;aqzSPa#C~I#h{fz_v{ymJ`v=z9(P1vBQpG49)#tYne zVg)gY0As@d%v6bEp8k!d^UBa&$vE;MihQmP?YM1$@S=NQ*%Iyop$(J(kw+Gej@2%^ z@+RmzKFb{V<6BO=kgC?-*S*~sP_d0{NNC9llsDgn;A{0A_4QV?>6@cr$1Y~h4zG|b zqKmN0-``o~-6TaNa|95bEi_1UVe*9>0aN)ZGASrfQ4o=!Q3JVSFu`^rl-A(1c23Hd z)3&$8jk=G*=G0!ZK^x{$6dcqI8i%lKuOyI0RPPIU^}J| zpDs1d#L`RyPslY5@3O~lY^aikbYXyefWo-`V_cW9z=J$SMBX(r6A_F{bQoggmUJ0W zzdM)DolajAN)LM2G?bJK?K>{hWsQEv&E7~%0F~X#=VHzIVZtE1%XOe9@?f5m29bk% zXIIzIf#kRjcq;l80l8%bA@9vxzerNNS43q~37y@jNU~?rC-jrSylJcW-725SOT{oG zv(N=m*_~Mt^tNS$E>UyO?pb@g#PB2+KedICu$zE{%U&+0*;8h+iLDN(aa zq)1hSmBvXew?nA;iU^XJ06l+R=*Ql2s|>f|_G^+vsdzg^y9TY0`&L@T=z=iCm%p6f zVnPWe;l4>bQ5s7d%NZ*^5ktg?jmxy_N3T!wPciiz@@D8pzMuyAkQ!s_&%q8rvBA}% zhp@QV(V+Q3UsNbr(};-;0;;Z+y1d|Sm%hUM-u|&=lYf(`Q(Po|H?$SzAN%LyfpflL zsb}Y3@mkPwBV_lptlEtCz7YvD;A7LJidB9^lVNPOFmzBP6IwRmn=b4Y5*8F}YcIwn zNBxri*P__sizc})0`}~Ps60=z>3VR{>`nCTexcdz&Fz%U39f^tiw3%{qTJ88r_A~6 z&oo_ZpR>_@3>0Vs_v^ZN#~nYS_%f}hXPAAYQn8tI6}C|B_+Z)7bzZtq<(PzT@EA#= z-4g&}6!IGyALI?RcsAM-n5eAioJg^C0uLHo!4!o2BmUv@2Bc`?3}gV172}J9TcM#@ z<2_-L6N#nx!nwmk2Sb3jUI~I`r=~D5FpmGa&CFh!!H!DCJqGwXZM;BFweoeoVz<)`M~qYuBscL5A_z)XL=7EeVmU-(ePYGoC(1NF z^P7oAvYkVio>8!^yMZe=Cnv?neCuaNmjQbW!XCxGak`3Fe!a8ve5IU7)Qo%-e5_1` zy)OF?`I7Xi7)Jz)gkEgH`}fqT*-6~hpGud7&ZjXSdd*Io{q5!@n{>y}`?*lUDNk2DTre4fmPTflxqyj4DY*GhaomXDDHtMb!N>NZ_)d z=MT{q0QWZ0Mv4h+k(|&a>hVX?yTtB>Y51!3z+inhzh!OY#m|f02R|3{h_s~Z0V(IZ zQEv^c!+7Ne!R$1gUhn$m?gz9*Krn*L$%bpn;dWeaGNd3+YSXj8Q#OZCp8Ikgc2+c& z-YTE|Mb#+aVSAr?R-dFtnr^y-a}180YJ#4Yeq09rn%2=X?uiS=rg!LN%@svB{)(@t zt}?%*tge5oLH^<2_x1y{;_`N~+*RTDbI?<5KHZ=Ie0WX}4yiUJ@2J0o-=x^S~ zXz5q;?(c3to&3(e$?R5Kx+c152{WR>5zGY|bJklV$f7afen3SC{8d_A>kkGm!4UHF zqv|k1t!4g<{+<*fA6m~GsxJn{Mw8U<52uhI54)>`_J|fz!h4TD{2eG=nl83U33A?i zFcG;o<+SC#_PYJz`?liUB4@sDmwZvvlt$7@Tf$;;;6yYM#X!Xzsp>jJ0z25K9W*eTBAbD<3Olz*vH*ez%JyU@hw z$mgHQv{Y`Jh<;P95ZC)1K7J(EKyc|_iNSzOBuzG;N5OG$aK`%syFC;X6imVbqY)5c zo{Z=6MS=0sP5K9wMyhX|Q|12t!2BrmdIsm8eF`h?z0+gaMQxpy{4&~rX(a7stzfjK zUbBRzzQt-NZ{fLVHv>Q+p9+o$+|b6w=&2=dOOO&rV)*)#XO>>?LaL!YIi?EU0S8s6 zc4lVaxHCc^UjyT5xJJn+dsYvt-TuC%QgVt47q@|@`){S|V;YOoQekn^%6$h^D4StU zhC992!S$5cmo=NJN@;EMs8ZhIeQ1uo@|MAByL;=5Og%*0XAm9lMt`#{&@TtCFI zp&BRO?#Jre+5tTay{QIe7olx`jB#9kB^~|EACp*#-b|w7ts;=@DD3f21jCG^S{AAE zEhD>`d=$Gi8|y{PVPPi+8I$QN@lQ!N>sJ-*f@Kc-h|niRD#6I{vo zhL1=0q5j2pt(qJcFP!_erRYe6#k@1s@#A+p_3cw4=f12@(p4w8sFf4I#A@hha0yP@ z?`)@YhArFho#J8`*xwD4<%y*!cFdIU{plbqs zt=BU7?p47$a}rC6dGSHxIMPCj&5vj)UBv`V*<#ib(~`4afb%?pHB2>9!H_{NJnVkH+TZ1YUa;1T&a;%G4_*`3CIRGW+E-djXUI;BM5BR79D-*(Wrlk zPuv7gS!w5Sz@+7bow~bh4F4k25+n-m5o)d%us+$o#Z1wb=D{EuLOOnKg5VKhSpYoQ zIJE*vW2UbuvRYCOe-e@wtE#Dy)tIM$SNe=uXqL)?`GE2T(LkI-!U=~!2s!T!ABu{y z`Jf#qAYv(s4&-jX33f}F(8J$Uy;G8X>42BemJmdy?2m~22}P}ENc82UGGNbXfV)dG zELJlfJ-f?U%Im9ybUyEkp@g<^V|iz5u+zRQtDei#+4(!C3HRuRpi#hQh5g7h{QeF| zTbpcm`?ji5|(aP@Xek$!oX9X`j zkqC82OF)oyD4F;bDIgdsFhCC+8lU)znlQtik`uR{dkOXnnvBEZk!)SsVZC+muu5MT zZFfmPmA@3-ZFCHLQ$khcz|B}x!J%&yoklY!+7Q}1)8)3uBPPnwNc0F;T*}f4yL}t& zxr=-D*pdyqp+Sy-d)`Y>I`iW?7Xu4JT?W=S%bMauXG#?fPSyfD6chn!eQ)qAVdJ*!>{PjZF{vcwWA}qFYPWgJ(E6adX)UDWbpBRG-9UI0(Ls*3+-GNSFvaZ?Th7i?9$4^xFu7zz#W{uuDd81oA9m?E*#7ZQnV>A3d)J0?{ zs?G)galGCPKz+tfy1N=H4)$!&iu5QhL}s0awp%$XM@OVKaPg72@o-f9Nrp^R#raJ1 zAE}UtlPKJ_Un5=V;B}Ac$O0{~h)vY+vnIiMwYXb#`kqfuT61b>(g#MyW`}a$Ia?}Q zDXDlwN}^Fs;a1es)V#h#;FZ@e-d;LvT{Q=i4UfS)@>sPqY(J{m5g(q{;tt?nosbCu zM4hh{D7H?Z7YD&zVFf4%X2oNOMqAMno~49iLIxG0x*Z>z2UTm7SHD$*;BDAn6$K4o2zdb&LgtHlm=0LA zX=!M@7b4CVcx)U(3G#TV9}3@!39n$WB-arlYo^sDK6mba?!Uh!!i?P}+-a$YhcxXi z$0&^*odhi@D#}cbS&b;*UY#Ga}=4F>9pGT&OP*^w7z-$h1w9)B$I*9 z?Y!y6iIbu@=0l{45^(nuw3#^Fa#ff4GLm|aB;h`-$(pElO^yo*YRC13`BS3@n?>;S zrCX=J8&Rsri34^D@}VY>3*&%L1QG|Lyw&&lCQe@Ma`)AN7``y;a;pnxZ6GiZG7lRJ z59J5Q7_T=-T{)raekxr#5X&WW& zZAG?*_4}e46?Dwz+&dROwy`{l$}7I|e(2)*vOmN0iH`h^ES#2~!q^)P`|cJqo2}2} z{UsGdy@=WZOOcc|3JHVBLuQv(0gEIqdr2-UB=KuniP1>!)4Uf7S&V{U>}iISqI?Z z$Md!73`Hv$p`qO~jGvGSF3?}`i><@6H4+fJ*N|2;JsHF%5q@6HK016)!NQ)1ZB<7% zEtSmx>R(hfp!3y0++l(YBiB7pP>>->A-yItPIZ)mY(Fw9rz+-Cuc)e_3ABo&)KBPS zNNg#j)t7+ZOYi^Sq1|&jlf3LX=iOp{Rmwa>8I9WJaf~Wb6LIEaC!AA$Wo2ArBX%GXEmZ;oCfs;qBV-`sE~MQ9xOO@GsN0V$8ylOCBw+&Qy_5uW z^H9B^LGP9{^J_=)#(wd76N7N6K=X6|341tIn>5YOTA_xjsYp$D&P^D{(Mi>g1 zHkT4}EUeTkI63KC(-Sn+q>xnT_*VuQ7dm>phT^sk~S*sA(s8oAp2C|78N#n#^h zjDv9nOPKv8Rk?DKXh}5arxFoA8)@h#rW6t3AFgFdXV)&BtXJ+ZNXi7q3@*ABr=?I- zk`mEDVN)~yJtRcDe@@k`QTkli>$yDU!9a&?xG)&zHywOIEIpso5;(R?f zNnvS0&nF1wNv{^!g$p;fCexH-TN~BvPMa}5N4FOQ9wJ?(nR`KcDteg)%8L+q-irOx ztf#V*Hr_>Jv-$zY-cB~GA)+-5<3B&~|N7dT!7&c|q)RN?=n3p*6G6=o0weC zWReBX0-YcE!dxUYLEb2h@G=BFfMgqGX1-4!`P!P5le40tVrI5%tLOF0PJ&81-gklA zk%58Nbxz?Y4Cfq4)%swW9tzt6^7UzXHOmq;$XjKXMD{^W4a?rUj6dQ*8Lnow{fh-ov`m^ z$EnnSQNq^DZN2on#r!oJkDNm2$6S!ufUupX0z%LAI5)R;_woQwuFFE~U@$%VAhV$TT12+9ImQw^n!Z{|k8)v{R^QEDX?wthN;m=^np#Hwr{|AYX%YR!dXrB$Mdk_p z;jbfD4H_LJ9OyTTtGwP_hy)SV|rJecbV5x(rr(|cF4vreHB^46- zgpLkE$Ae+F?(V}Dkzj<%WF`mwv1H%!ho(^FHHdh1Y^Y$~!QlG;4hEQ-@~EkOX?M}k z8pGm)BLR%vb+wO0T#%$`Q7nQEFGU4IhpqqBh8?fWvR8dURbsJ9uwTFyhust+NYo4q zLMFol;gxr-!eV#7Pi?`wOlaUQ_o~gR&QuJ}IvXQLnwSlMf>X?C)6UwXse| zMi!?(I2R%IT}&z0M8StYbP@vO2!V%h@se7E{%|Rg=b8h7r`bJ2M7J98BXt$m4PjNn zpHcBH_7%IR@^ZA9_%0u(6QV?&qlYR-oo=c;1r-$$eQ^c4M#KF<@$?fu`?A8c1YZ)`7%Er{w^#2H z8{c!3xo;RbFdXa=c?hRH-@SiI+M)=nkCN&)EGKEUu0f(8Z(t)~r5GGx#R*8xT(_pB z{`vu-5-e>fb#$iVC~I|`VR+>noLPMMCRf7f!JKMTdscx@bc>|)^WHGOh}U_m39Kzg zHT-rkBMV`)i4!wrj0ilo2NChqaod>%eQR@g7)lYJ??Zje7AD7ll*!~n0P>op&b^)+ zgQT4SW`6X9H$Q7?rfa>t0@BjF7&{sFSFVqGSnMS=3uji^*XLa>6ZGjOGWpc^lV134 zY=UU(?`6x_)sqx$;OQ3zwG&?j&k~IGDGtbzQx6zd1gW_1u-vR$J|e#u(c$}7N9tSA z2peziW~b37W!HZX{qw~5h@rOUSlgnqypE6lyr4aHmEb8Ppz`q0935O^X*hQBp)oyk zayUnhiy<00w7gl1C*|1^Ji2D}xJ=LGeC_t9eGFEy$M%LjHLPc@M|K4@CUj%)iV7_I52x|0Lb+j+-bQ(7KM5 zv&gy*zL_q-2M6op66Su9tDcNikdKp*rmdh7^_D%%z{LvSroM!jcP;{P{KUV#+swSZ zEav!#O-=&v#%dV-1``|;1&}9E!bSg2+;7Sr70MLNLR4vVfkAab_Wio z6jzvkgi|N4UD+R+*y2Dmi(N{Ic)tDIWrIF?AojW54T%^6FN50*c-1QB*3JEuC1S|6 z$39l%YQenKXm+VVeIy6lTDuXzUczuTAt9aG>ea9nY;YtD;WHQAOUQRH$Up4RiXx@s zZ0Dp+cuvsaY|J~hIC;BohPiK+gb?LK4dHB45Z<}trT3GYNI2z-xZHhL<3(UZLZ*J{ zts_P;JK;3%sIWc>TmJ5$=pleePf*Hte0>j4=L|d^ zX@^XX{S;|0h~9!^Z#|B{>jeECle>Jr(hpv2-ILo+``?YvYqp$th}%mjT1XH@iIvmE z#m7ZQMnhp*e*4a#IrHO9`aZh3F41IHw6y;rV>&--Eita3a)Pw=>dw6Eps?@Z-2BpF;HI^P<7G#w#&XGPXLhIC z*px6&SDNRaQAo9x21U#4y@9rd0%O+Z$_0)-%ST6EVFbD9O6qyiJ5OheN$MSLW<#$C zYIBj%oV-v7TO6onF-NIDxsk)PtXqA9N%r&z6Y~YB>`Rhg6^q9>s#?hgs_GJjONp}k zm_-y6MZKY6;S%4Hi|_2lP^rY25+bk4+uLvO5m3avogMltga6hR(SNlG{ug_%*gf-$ zXFV8Ed}eYYpMJy8*}db)Wl+@+L#oDX(vqbx;HT;C99{`^)Bu_PpJ6-x)R434ADyA#%TR6Wt&6WJ| z^>TfTQwn*GOmKg^`V+!!h{NWYpXxuujg=HRko+T|NM^+ardFDM) zSnBhN8ZyNTYjFMw^*0mpH~iAl>_#}+XK($yEDdO3paZ1@W$Jfc7)?zo#qbRD)Zn#*DYn__eX|q!aySTQ1ULlw z{6@G7&hSxG!l2hB2;hrzoyz>oED1YFTHBB{N;-6U?+q#oKponth;y4ugaGQJcU!xs zMAnTtd;p?_CsL4h`j@=urvcSFW9#SR$w+jgVESnK|=8WGUxRT>j4=;y2NqQVcVBzMPPkT8AnZz zKOPGsF4N6wz1W^R_@w3wmu$kKP)y=tjt~xolEz4%PM_2KgDdj}#u3k@8bJ-!rGga- zNO6Lv)A%lstZDn;ZBIIu@WR9H<@{dgBz9Nf1t#N|Mg?kJ45*OO7`Y)rxD{T;7TIzU zed;e9YYxp)lSb~RV;l@Sxti9$nFcS^K)NnjzW7ERaAtD4^012$V?DF7V{iOSvZ(m# zFZ{Q2?`~GK&Tntg%H?fD#i(&ILs67uhQwnEt4)QB-^hdMqvB!O*vxVowZn$nQcl{$ zsEcla@iyFJAp#BHu8?F__X?;hcC=)Dn9Tw>q;yrZPm9l>p(6u7_!8^K8A5*7D_waV z=ckP`sd!?6qf@o{zu$E5pFh+xuV&s|)oSe*7FlyR>|d7F^vF+7zFaG%Df~hR&_P+r zbG`l&C^nAB-|SkZ74Tbk}kubD?xp_U3t|rmLfO)nKcz z{`R*a*`@XMriR;}>F$;7=6LlJ4{(Y3n3Z=|!lYw=>4Rm`!pW3Ir<(*=jtFw}XA{FW zg>SzHRmoH3L#xf8JD^9F(W0vhmU=qQ2!|^8^p#|^b!8>gG!%7JRpq?{YjY35zIZ`H zd+Auy@_w~80cRF$}8E@@}jdR6zo0|lp3bCY!FMIF$G3 zdaQuWccz9QPAk4nQ;log|6rkHidu4v-icl~#r_A%%qG$j5wk--y% zjbrb}KO=}ZM1(|4*@8Y7Z_fs2T8`^}o6kXGGF`jKqaJ*lg<;N%{oo$t*|6JgEQ2vuX zbkd&0Lss7N^m#XF!Dj0vKI8*IM{jsN=af90rlo5!xL(U4qYiJ_%3$OOBL*GFGs~a&g*RM z>wm8oAH%U0Dw83^=}OAhG8^X;#;*y<&s&Vd3_~qgQR%EDe$7ja>EFJ)XQPFZ+T>henK&f8BOy|n2e;D7zg!Npdy>6I9$=kmJ{V|n8 z#>eX(6NP9(%Cnm?OuZ+gL5^gWiK?MJBH=dCR+~i54xOoAle5IFh;DL1Kw4N%+qD1$ zA>!S(Syi@?<7YGLb2%e=1`r^iV6M9ld%0xrX71}@HcZKc;d zkV9lc_ahx%CBWnC#w};;x^!zJrT?rArz0UwIuPM;IxLr1LY8dQ^uI<7>0|2~O;P2P zI-B553{k^--|4`VLaE82rKsXGZ>*sct_4*68L2ADhHFl|*dJz+0#+furVA5A+}g;N zOwB1FM$=_VdounWyA#62)?$MZJwA`2;SfbI>+4L%q!FatahF@J@CXP!-pfXMK31?K z->Tj<{#)0yK+wD38`?lOfk{DKe!sld>IuZW7Ad-^iAitCfw8&ywPM@iJ}Miu?NEyY zu8jF`&)H>T#40}fCn*ago61BD@}K6kJ*^*sQK{cm73GBrxX5V}IX0!G9`t&bUoxWy zyXAM{3p!{o+h%p#ncE|!RL$>-Pq0JCoQ=iV?O_GVeO#>0rj>&jU$rKuo zUvJW4ffn;U)dwD%057n9gS9oCj*gDQ!w^^`t5l_nGC%QStS3e?vRsjJB4I-#`D(<) z@K5vLSNB_B-+ws?BUDf5{rmQe*yZVHW=4PXS{VFDheje(Z=Ek z-3@-v6F^ZUSCfT|U26b!>f~kDLn`KOeKQhs%pon!T$s1*@nsS1Ix(g;ccVP$Ta+a_ zOEbr^%5Lb7+z~(6!g+XbDE+>on_PHAkrS+ShQx&VSC{2gNTojUS;SU7D*1Y%~dV zxYoZkQ!l#BE>aHCQ_^zXR_)#uCL$QD@zrt+lqL^+eiN~KkEWeXq`vDEi<1`vvlKvK zgrwO!0zmJJOfGvmr}oH5xT}ZZsAN+!v#yY+IiYoNV4D6TyW{U0LcxlAotm;8jnCt8 zKjqNT;Uyu-qgKk5l$7*;xua!fMs36aID}t>#DQ55EIyORiK-wWDT#%ZqN^95!)D%D zS$X>U*b9K|uHFIm2FUpsuCeT6=GeQIspRgW0GV3InNP^=SDm`oV_etHQM{+3yUU%9Vxyzd>Rf?0^H8aT1A30L|IKmED$)l6!Ir?=W(zfQla=eY4|Fc zq}_o&V3304`)D0`^S0=4q$S&&a)8`d`BUfe!o?v2DtGWJ!@#m54&0TAhevN%*cT_9 zzeM-9w?1!AtSof(U!7KtW(&f?G>S)^EO&Td_g=yy0?5#4Fad{O0L}(?hr?{x?fZa~f{!$Od;0mUy zyd0os+2o4Z+yBc8f^#v_)KrzT{jQGHBr7Y6ac&P#l8_DhF@mx44*~-N`#52VY}(6?dJJKQDQd7wzX|kuc}#UK%VDo7{9-d-Z$4oM`rC!vC!6tHHFG=C*D{U*U*^5i zrwfO6y}p!;j4Zngmon#TreYuBq$FmFnWy{vwL0$`e%h%j+(ek6)XuYlzjE94Jx2X9 z7yA9Le!BhnF_v-OsX)P2%r5y5stQFwvXPIu*W;_1*nR$D{Ex<8O? z7n#?})wPK%##3%$aAwB+x=_i(!|d(j5C&)ngo1u%WIQS@W$Syr8t6(DNJ>e8qW3)_ zJ-sRWXn8ucYK^Y_PR66={r++=lLIR+KN{jK$uekP15fQVEqW2?Mm^$ zW45}zn)>=aXFDTYmpm`G|7~~<|F%o2`3J?$uJ+^f??f``0U0!xFE$p|IsZa8JL%%M z`*5d)&elBky8H^bRQ0_AUMAnVvewF({leS3PaY&}T+k3uui2N1#fK&|x3xVxIeC7$ zxAl4Dbs7gyYRae zTOaFWZvDFw&-WPR$1)-B*G5M@hT)3#OpS|I8yj8bdjFlDV>9W)AqVCM?E{hm3OqbK z0b*f?O&)gkraVrhz3qjCg~7q*ZUI_W)>^>&EHf!R9d?V*JE$yS6N`vIE3Z1t>;UxF z_|*VmV;E|7a%N_oTJ*^$gjjHWbJW63LPAzmRbbp`l}#~E$nWOwL`a5&k(Oshb~c)i zE7NVM^VQW=90B+Cs&-c~CHn6JPEIHT0|O=|CTr^xi5Tnw%Q>!(?Tq=ffY|>+m|XGS zza^huhoECblzV`NGJcz-@x48C_ftm}KiQGs!BwQX&vg9iQOfCvXHUYvlSYHlv2$ubWapX0A(`RaPy z>(ezs#86g#Z7s_0gL>|NJNS~!mY9IV`W-3=f@!{R?!-<9S!>b+6%mJjKzHxoKV)B2 z2%?i$0Bxw(YPZ&EPaqwz8XqDG(<|x^@%XL2O2q66z9%h+A)OG(#$v($nhz%i+S}A|VmcYz{vT1_s0^wu6I1 zDB^ZsKtM@BU>5lJvCrcLSykaQMDF=jb$va{8)98-?m^KujQeci{J^#kqZNou!!RyA zT}x91{pg6g+xO%d*oR3cS5_Wx%&*{jZrGK+u{43H%*@R2^6~;pM1LVs=$@n2S&Q=L z*TIIKD~V2^f8Nv6Gr`KZ|BPpi6n5Ygc7oft2~C zajr)c2tpJFUY>Sc8-)Hxr(F1uPzXdYY~G~^Xw+8s)waQO;igJ)iuzdzO_cFFVoFSG zuI^9}64-Vx4wL@zSF6W$6X4Xpfh(KaVYME-v>hiGn~R<9C$bv_+A$bakcibt9^7S1 z^UZ*ZZQ9M1VE4XHNF1Ck9l&zj3{GbAB-6>F-rlRdsRsjT>t93=Pqr2UN9;6OZ5D z;Co| zV}OiIBJ?)am0us-kB`E1y2XjmOoA1}g$CAzc168OXLGOT;lZWv4YnciDOnSLdiXw9 zR-$ATnZFX)ds`GkX6kw_YWpKk1eNITjwIL<+U~4oHQWO^0EjF|{j`ttHhBdi#jxaH z6!`zOeg(Aw4A^H!@o=I4$hrVq7x6zPEOR!Nn=}o?f1kep7Lou0w!8mqWC0^t!${!T zXSXyb*3E2}$U|#v;X=OpYY>XcGC0a3b;rK=^}-ifXJP zy@T|&_PYPuEpxT^gA}+A7nsB_@Mn6`pKMTpP(dg`v2)7{$!ft5TM*!sj|^8wKk?WD zfu^-?<&X1eq+r?G+&m)6aB}?Ik|Rq9B2hiK{I@l&Cy3NTL1DFgaIz4qkGWejF)83R zgn~`x`Gw&CkD_IPKt%n2k5c#Fxy|e?>~NAK40y+Zw?D@*oHA6e6xhLR?;v`QN+yNm z-`-$QUc8!$ii(DYJAk=NDBH^;f1523*E@!R3KZ5*R}YjR^Sc!u%!{NJ%e$32j$I&B zG!T({$9aM&K)qcliN9R}KlHRyYB1U`h3bzl81W>;i=Y*$EX@ot=DCRHX+^0Pqt)LM9AM zEiboV+84&>!@0pjBsBb)oJ3#?7E^3V^CSgEFarYvsEmNy!A(X=a6?){;|m%@MT&0a zE+`BS2j}STUk;xKJ4nb7l7D$uLW^^A87wAZj%wRJMI4uF@E=t@A=|Nkqak4$o0~&t z?PYHPOe~PPi2h;v-ZeHevwgG_+J``~{$wNuwyR`Cc(bUO$q^M3b0%et;%jSR;qm@* ze|Y{kJ3HI&?vI|PW*Tto49%Js->;|{_@qa+Efl4mTmZh|1bP6k+(KZZiE=NfH9MT2Tw&A@Zwq z_4Lxy(?c{-vf*_{fbC9ivik4e@0gg$K%g^z|9fl<)&=pmuBrhUheGRloiCs;k8q9ad810Rvo%}9RgmL z?{d0<4aSTza&nN4VWFXcG!Z?yz*`9p79;tJN8~{w2G;u1DW2qsot74!At*l=GQBlL zM;V+_=!!b>1_Ux@85e<``?H%R^v&W{Su`?)7pEH)6o}(7k#8{&Q+a#@ox)fSMhOs& z@3~ZFC=r}VMddun1JCD$e4nn)6h&Q0xE=I8QIP&2N`Rp`xw-w_-GxU&dgH_g9YDBr z2au-afx5&()A)!*E4yBmCep-d?+xR)6qiC=E_gct$wMpbF)AN~qS zMn*vvW@FEg_e@~BxdSk@xBGAaXBXH|2E0)$uvtd(xj%f2lRkEtg04m6Z*OmhP*i1Q zPo*ebTwFx{28j;N&DF>2{?#&!iZPp7H~2s$i62yy6PQA~u@bRHfac?E@CEpu~o z9@2j~n?bq35B=R>u3%&Gzu2Hr76+c5_Td09V3W&%tdkfw7Z(iIX%JbV!N(9>zXuxB z3xJer@8~e<{&8Kz=KOqfV87AY1LOoxO)Jr@GYX{Hb_0V@O2j;{4i4Z@e1u4WhbX=9 zIkv4nxnd<=kDyISW+2@JZ}V1m1yG`#Kdy|6Va7dq(!*<*tiVC<(>>P_>$|7wt;k~ zQ-1eT_3y%4K5~~FN1qf$!DenC3|LrL9(o|?ErIZ7a2g2!aPyyV5H!Df@W5HHLqwk! zO5~g>kVoO);9*1n1#~;ndRD~NS2M^Y6OCXr{=ntNGd@v0 zG4x|f2w?omGZ}jY@}tcS0~lb@l#s#s%V$hO-AD)_V58&NJEip9`p{N-ZDtuiNd4lj zPymV7d_%1`hAN0uY>X?zT<5ssE=1nP+6!viLM}Qzd2YE~F?iDL?{0<}h0n{{upg`Q zOJ5qj=1Wt#xq3?5;@;Mr!zUm;f&$RW59d=E9z)*qbQlIGm;9eJ`K?=(Ia}UA_9&YM zyYHwds!k}7ov3!#-@bk8U+ZpCD4Z>TbHjsh8Y6OZ1u0#LL`cfX$&vjc)c$-C3>b`} zITy|kY{7Ks^uWsx=qMmgJCv!LjU_g@#MX#Th%z^a66igw77hOX6FaZa1{PphXBO>&&!E|o-GPAl2$MJbg(*=b8F}&1nAkh4HUNU5v zog8T|qNin$mYSm`N;>4&{&N26gR=cNBf?TSsq~zgp(A?!lHWo)R}dHh2It0O5ybss zln&J3hr&V;-$lj1~F{`^VaDAu%tLPV=i7Spm)7?w_3WCfW?QSy$@ZB%)j& z`?P5N);nc88Qb}{`wPQ&a7+?O4VDsKM0(-8>a<2W9ClzMx(x{_IJkRd)i4mM1L#g$ z9j;|HHH?HogC>05|C*-IB?;azp-7pJ0h@a@IbMY&tmf$>4|^FMKaWu%}s_Z>NR}~DoGBvqCb4z z)@@(Zv04g6*R?UTP{{Wauw=K`6B?6Z)%i+k6S9ZmErdNJhMky%9Xgv&#?JEd@F|ah z2O9w=E5UeWL&TUpMt>)QV5nZ**ymNNjL@D?0@Q{E_5s!B(*6L ziaA>WEZWot=aU~EnP2)!p%p-hpR(^H-GU(H5k9DF!cxHUOEW43F&;U zmZ6^6Pz>2V4NLIgaega3oB>lq$jyllNlR6wtS&8K7zi0iFg)MNWA~j2PDEI{bgUD) zv8aC+2!psx-+gw&4`X1kr5V7!dhz>}u~wpY#F+Zal<#yhvw@%~yD3jE+LR>}w6?(B z@hH&I5p^Pz@$r2uFeivfspsF4GVE2~beh%c|HXzPN~eeJI%Keq4qHv1paud%i623t zoiC@S;RvQ;!KyZ=`1pL282Z_J>oE8s5qM;UgyQ3!ZhwEsy9?42q{R(Pp3tR+Ls5m~ zloXUlD;pXKxUW%L&P5gg4yGZrF$fiViay>R2Mw?)@FR^O(+qb9Uz!;YnYBGYzgu9n z2;)h%`us-rzDynA(sI~r8e>u}TZTQoK=~ou+&=4zRLsgDJmX?v;o@Gg3Vh-F7hB-r z@3Sxu`(M=gLIxq|)s&}>dkdO3i|234OOsWc+r9JfA;u%vyFc`k^dh1!T6&z$0<}XR z(SN;mH8#bIp8*^2wB)XCCt?_!p(VFxv%Fwo5?h#gUSu|xX3VvNYmI6wr;bUxm`ZNZ zW|7Q7X4rCDh}gh^gs)y5OsSK2`?S~Yf4SfOlgu>Fx?9(CvlRPREa!q!Gfn9FN-Mi@ zRlRlBK4>6?GQ1n*BOC3@`PuD7jgqmcsEVlQ&5?1Rr{m7cQve;sjiP?Nwp8e^bSTFE zi_v=!f^wIpy_TvSJNh=+9h<>W`Ac~CIY>c8d5&(fWEBFlJ4Zt+%@AS+yDPIn1EM4p z$+Dz%$qB*p;s3_cvXJ_hxSu#~%Hvq@)IpdT$`hd+{G3c7esjSmX`65gOAB+y8TIM8 zmqKA*VTC(ynJT-J7%Us_()O9m$>MJIHuLA6AlT@OYTMf<6v8AcFbOzk*;z>YNkThj zeP)|1^vTVzjqd!8_8|kdc>CP$AsFW!AN_omzZHgv0{$LPW9Y{+)+io`SA+v5c=u41 zo5yP_f?GLt_KR4Wts9;jBWuq~E(FjzXHB(Co?9e&y0!=xF(H;U0*%Xx*=$ z>~vloyu9rlt2#Q`I@(vrO!Ug*yg{!=m%aqzXrYLiZ@zEA-FDi9{M5JXDM7lOF1%ie zCKaDNWBGrJ;F`rifMWts5(_^2pkWh?5s8;|r8@cDm3bwM&2=bkO56d1-p;w4q3Ou8 zQ9M7+iL4cTg)F1>OBE-gjO#hC-$*t*{Jfi2$uOY6Om^?>wgnbR?Gu|Df|`=Htgw=H zFs5!Y>IFoiBWAix)U~;L?jWvVV(LfWu)o@wM7q=ecVRRSSN%{fMA5O^^BbLvQ-?D( zWyG(of1Ze;-hl}WPFhc%B;U@8;O_jPNE0uMq~bw)R+l6;pTs8da;{vO*n}`+lTjlH zjqeYHJ`85O%le6UPDwL?A}MzyObZaQch-~ zdR8t*NzvQopEq5^NsvLz69G(Ei7A;1iRGeTHC4yV9o@hlYm3Ig*RSTwl!*tgaSnO> zH1jL`u{lPr`EWtNfwHQ;uA%r)qFNH>!o-`Z=?#pUNA9|iT%_bKwiXx168f%L(cIeb z@HZ$PC;7UYO9b{-h;AlQ80?Z<`G_WUQw`)$j_Ml5x@sy`qB(w76-);)5<#J{c3za`aW`7DLq4LVB4*ekRX=*bx&_ zVcL4*Lfsj4)n{ZsYSCKG9vTJ_mY}^cxn4GW|07FKG9^bAn^o}0+q#v@QbtE1`3o@> zPJBtJkKsDotpDh+OfvQK)~;I4k-x*d6DH<(BG06QCr9ik3V+lNb3!_zsZhVGlNN4E z+nbR8G3I}($v=v@$gPH_NA)7`glU-dxnY?z<1HELqcf*ZL+lds-f(D0RJz zG!>Z84cr58HKA+tlEbB2#PwFZbL9DYz zal)A{i)1`IeSz$19zMu1W-3~yVVNS9Y5w9(rHIFX4A;y13SP*Kv6dQqG|=bia+SZo zKalU{*n;~Z{CD60cG3WX!@{T$rFu2w=?<`z2J|rl`6@;RQQr?W`>LqMvcW(cDz z*ul~hNLO9P6jp-O>xDgBVPjWG5qrFW#1{+h_hENK-ECA&-2kh_(24rQ%DBVVr>3UvEFXFU2a8XDHx9F2BLAc%OQMc5${bfAN6erNOEUTk%N z)`H0woBoHrw+^eS>)u8I5h>}GmXHvTM!KXy=>`P^K|s1o5F`}Xbc=L%$3|(8E~UG3 z(|sn!`||s~bFS~N^Vc~(mpqr7wbzl ztUX&rgYYY6uk`GguvtH4N9fSxCg|A;z`_1vFTIa;b}HW7hG@$$aPCZ6TQk&W*ShN0 z*00a~7{mZ-J>7BDW)+drsS#GD zSgeUHi|uZXfwHSkRXS8gR7@5?$?9=&aS3aE1C9}Tx8^?I64+p$zgqkpu@(>h0Iytb zPU6AF8$^+pepIs$P#3i%D`3gVSmoE-;$R$gm=@((Rw9&~oWtGS02U#UsHv_#0q04m zsj1ba8kD2q`H)M2l$xN>-Bq|+a`=uKD|7RpWNs(HQnTO&q8rM_e5Yu@C<9_s`5J0y;o*wit5)A zKJDqR5~>}6JIc)5H9|syX!l#Eiii+sGvUE2r-k%0VHx&6!bAG}DdS1r?6J|;Xo9Hz zpQo*e)v+>$Pht;D-5i!D4OT8}XLu!%lB4iL`*s^E_p--+-dQ0?=n|I|L5=b^H8J}3 zavz~cA-=XuOx`DqOs|l$$L1Un8=H%3pq6zm2c0=e-o$XvnbcQYW~@ctfZz=&@M}Eq zZYF&oa6`D6E;94p-TGtqU0wI1xjPX$rt*)2u1^;C>M&)rY}2C2^o+lErPqzyTvemB zstYM{*R`>JY}yUnFB`~FMUC@cF*f~XxVD(98{eOtptOuR|IIKvYKiNuu7lL;P-tsI z`Rp{iv(Vu;Av8BBpVZp zF5GS$O{KoOEEei)Z-11FOYHuP9u#G91=*rM8CW?=kk9H{LOUUpgsbbj z`KGguoL%sf(NT2*0)p4CWiOa1y8<2XJgG!kFjxpkKPytJzhaB59Up&+@IlBdYhUNl z4ml~YUwg!A$TT9#Q$Uter0RFWG5zxJ)Crri^;aCp<7$FI9G~yAI&`jd=PC5=m~y9| zOkOvwJ-esR<*rmn-QTG8CECv`kb&ws2{bik>ZkCGVQgSrPDwr+Vcy5V{<-F7+WB?v z?+Q?3T740zRntrxNjr0DFJxPwXhO0sUca~SA%+CSx;ElR2UU{GI_4a%Kq;pgEE1^2 z%!$uT?N_x^eUM~Zdx+HD`~6Gv@#5l21SfjcRIucFdP9x*Ys2z`M5i=JpWzqwWlb9I%wjJZl!M)J=VrHH(v?s^!iaYd6bM#+&bd1| zJx;ouku|+8N21=KrdC#?V__drr@`*rrxs#Fv$PwfIt1cIRp1 zXDV-7+xB;277k1ZlY?D@_R4}eB`Pd}L!z7Mxg?9ZroQUax{>!D<*=2G+e<|! zP_Wa>46}NKjymVtd~^qMi14jW0c+>8mhN7VC{6yvi1zuul%hRfqvec`2S0|M66K3; zMh!Y^;{4*+Cule4^s#yeai7*9d%q89p4TMlnIb|zf2U*DJHP4&Yx75T;N1#L(_x%K zFAnFt=*SWtSz0<*DZ7{9d5{HBYfH%Caq7*Mb9*--XEs@jzfk_>@bFOLYgpyhr~;F{ zUlVP(s+x9ULXwWEvS@0=i+imzNl(f>StWp0ZFr}ARX{Z$?e{%B^5Wuq{lV}&OncE@ zdDMPcS*6!4V5enyk>+l#AZwU5cRSAZE)M}I6Kf-Epr%gh%;amyJg?r6YzUDk#YaY1Nc$H^fyjkyW6l1CT3WJ9??t?0)7Ph` zLmL5H`lF_J+p%oRPaPFu`vu>Lt;jsUxoU5zt+mqbS(Qop|L5d?S;h)n#x=v*|iVEmlSD zy{GQ4xVh3|PeMoh Wki2W-4$=}Gf@P8Y>FBUh+rLp8^#A7Lo32f0!pNSRaFD}+KQfYv5`|)h@1M)vK}5az0Q{kXBW+Y^ zJ$wZRck>q?eBxwnYs_kCV*KVM>l@3LrY5{B@2pG%pDRk;Ma4#t zg_8JbS9 zKNRshW`{oyStDYJz`_6hA&q4y+vM=?3UIA=+TB^a4HB= zn8Ha?|GAHdHv|0G?T39PFqEBLoy*$)@AHxUN?73u;Sr(2pb_>a3)VS(upBRE(5o%?S9p&9 z_Z4GBy%~InpZO4BA?r4A(DJ^U73qY~-YI(YE3PMj$Ds0U-0@H_A#1dj&;R^V3l&EQ z!ju2ZFES+-JACjo?Z;4lw{6*N0lsDg@8Hm2zIRP(`MN&&@QI1j4Brr=^`|aKeIgML z>g0BRnWk(_)(q7tykXKP)Sd1tHyij0IJzO|e+Q05% z2XXjS$4(_+)>#!rZf0q`a-^tME!PdyC63_4uCh^W9rxvcmb~k^cf5pV-1cg%J8)K< z^21h76^i|hutT-WK z(fG`WZ-qH=l%hC->R(0N$U--b@APUXI%7uR%w2q0xfR#r@t_WK+WDl|W1UGowup_h z!e3;$8joThGq*x&3_pzb$xlO^2afZ+JjcICe?wLBIBoysl_ywX-aqy7Wsj7lz=~() z^QqdUsePX^=zR+!g3+^~o|5tV#9UPWmElRpKQz#XoCT8&@z*)?ix&T(Nw z3yO{x8a`!4l0(go_MKkab*3yAJh;y{U@}@-#2+Jj$Z=-0pYn)t<=M7-fqLe~1RbZ< z!T0s2MM|EP`qMPH=?_djuVHK98V{+V9tF`(r7f*wxV7poFPElLm<{%951CP#vFmJ9 z6UHx@e(;}ZO{5tyjwbgTP6y?X$vO+qq)KPvwOfLY_kjE`Xe*u5{Sv{t@pKvFg)@fY zy&8D=7OQO*0MTatvYuH4kDQ#PkJEBI5}i6g&()srX5%(JLnw7Ck?i_pG2kVY^s~(N z+xHA8nShtQzEez|d`r>!m!@s9{-;G*-6OozF!%Wt>y|=yjjL%Vu9W(X+Oy8n zj*o4*5Q}hZ6J3+qKK{tX)8Q~Q0%o(cyud;~Wsyw8HfXe`jA8d^d+7f@2g90LR zB(J@o>(VYxRkX#y^YeS#j4pBm0a-P==VvoIwVnx5DW27isnkmWg#wM%m+wblHf#QY z9<>7QW%lj|Yen2i)yr3MTe3frFQ3@#U0;n55I(5jVLYlmPZ>C`dMmGAxf!Z>K(D{K z%!ixRmjE?fONrTDc#S!Yw=kqpkv)=Rev(uHSVjIGcT{#OdNZF2ssdbBC?)Aj=Y0ILL*xa7HVsir76f4L9Nw&b>y9mus^>H;~# zg{buyZ})G<;E-9{AoxJ>&N~l;Jum$4KUh2s!e`3W(ZBzIo5r`J2z$}+&)yVcF-&Ff zDGdtcKN<>aPfmzPQ})?u6y}DtOPY+jmuGw{c8bRrs&W_cJ))>RyQ*Jq$UJ4Q{Td@+ zP}_rPT{v-iq<3A&P10aKd{3?rkHOhwBA;sLsA~OEHp+b|Wjo$QvpXP5Em-r+H3DJV z{yG+aN2uRRF6E6~om#Xtg+WN5O%$~1WlkcBa8U3syC${V#HWf;Oi%c^FKG=JF_?7I zta5Z2+&$*zeJG$aDo0o6ax1SdsU*4WSNp-~h?&l7-H2~~#6F?&QqyFDd#FJwE1n5* zv4GGPc_&jL0kp&5u^`5I{6|Y-5Eeh54+|MS{5gdN%1hRcF{>UNImQg4c!i~W9$o|QYcs+kBT!Mfv(=4)R+UANR( zwOE}(iRH$wFZ=wJ)@P*6*TG(a_22Z4QoCd1@VeTY+@}1tE^D27=@j zztmPg&)Y&N4{_Ygq*TS)K6F=Xv@;k9C9zvHM(%hCFWTx&*1mfAU3j@CncZ>tZ4sA5 zpEc1C>|3K8W)~sS=VwVJy%GeQ5NT-P&I+pU!QxXBC}h3#1up}N7s zSNp{p_dJ9wztxIsWNcZODs7&5_Ft0u7id4palwvZe&MewRjH5WAdg>wg~IvPfXvWm>2GP z$|A+(_^!dBfh0rut znm6R{G79~)*oO7Fjj_hBO;%C}ou6D5IhsN*M}NS0q%(EC?`v$qe#OQ-h(uvcY_8y2 zKN%US56*1+~Bi!_%mDBGx>7ufyc8SN`jFy9es7KDyTpToa)7#1@^9ebBWyqWHw`WPkibBXC^}l}xAN-5g|T14o@` zyx6tpOuXY?YuJZ~j*#De24m8cxjaGC1Vgu#Td;;uK zH>kE2Yjr3Cx24LMWr6l5W)9DD);^6RV+=h_u59Hrsuw&=k3gYgk5L6%xZIY`@>Tfp zv)2rq%hUHQ?YFF*ge%MD^qO^8r}%T5@N&Mnk)@@ZW>n0F#j#=}z0xT*^kIfPjJiG? zGblX^69}tAOndfeFo$nK!va!77)r+P2qfdHUfF8}6dCg20v!!*_Og;|&^4;hqI+Ws7VHiy#hDB2j4|@5gE^5S^jBeYWB%ner%^2Ft?7RWqJL=T*|5 zN%?;4i1_{XM7gnw73ag4ECMr?1ZN5s#2sKMC*5k-1)fFrF4f`z(N4>C_CM6l2hJI5 zIQ-cC$7-$vsqcARShYSGYfzdp*qd3Bnu1n0f8SZ6bCVhHv%PGYD`3$G zgwe_x^Kl#}jh)L8vsnHMSsvWQ=TkM2o`rRFn5V8&1KoQ( zz1!zUQ*=Bjj|ZxE$~$lal>@9CNB8f}KR7pa2p2x*SD1E?QGkOeq130?q_7z9e%7ry z*hmE?mc$h&-~tMfCWXx~f8dZN9rSw=D@*t1O;AL9vX&mRro^CbjZcT8qB=ltEOht9P7(v6!e_l6m zC$xdXDKy_`yzRr`Bt=5obGLsiMVIVt*~}(_{;D9`!f9ecS;E>!ZR)t z9Jr$_aTlXQN(Zicr}9H7Ihxmdm|ng8E(b->&mOhEn(si9_ud?n6#l$#XKEeV6Frjj z*nY1GR#Ud(#c{c@Q`rrj56zEfcX{!4q&>w-d)>g_Oiw>gw z$dt2XA|L}WQ7Z?|u_CDJ2Cj;`5P!iP;2&n2A4PIoj%U-=cYk`o!};d3?C%#&WHL;0 zqva{Q6x=zrt+5?3pK)7V^n-R-Xa8L2wLb5QfVn4SQ7>QG%#Zh&PR$^l(A$nDC@K7O zUz$;z=4CIEswUYWnVMOfkW~&@4-Kjhdlw{2dghdx>euQov^gaEIjTao!8Wu|()!x& z`m|*tOi!PuJYC!7kxfmpqnVl$hDz(PdUAsmndt&Gt&KFU1x^6x%i(m0@b!gC15`Cf zSuz4OLc{jb6*VDIw`SfYVkk!|SMtWF7uR@yIHHv{8h2buA@ee2HYhawT7;2h?|xCT z^swy$l4jcgP8!K}w8*SB(s49xOtbZ28#^4zYioS^#;!2>PMbYTkt6%Z&|epqT^<@} zqt0Jm=9I&NSSU0r4niYNBPa-fFD50tls}Z|u`w=*^Vnl?62)vjIh5$hD?na_k)Goq z+R4Nk8z3kV);jG7d7RmwW-*J6gM6}K?duvllax;&+m^@ht>*`FU?_B zB&A$*i(J~98FsGUCjF;Y6S)cke`wgJ^R`Hlh;LjIk+W%`LT9HdDH#^WQ%(lpD0!~6 zG&ROwfN)==-(a7F(-ELrpj{!00GkhH&2f>Ktp>v~R6bbU2sAC^+=EE7bS{^{=TPwz`NRH^v&v7QWlP zfp<|E@t?Z^?&}fz1kU&t%)j)0&TUg1W-SJzZ-{XMS$D^SC{h&WcfuRF@CZalp==?48gz^#iOmxqN{cqrZ zbEP`r>_#iN4z0a!ESQT}pvR?dzh{#4pwYnS#&b^rDQa(TT108m(iS#snp>~rit;W-gjH)@LBqQa zaSi9x7S0L9{RR68(KZedx}u$IlU)oYGjqPxRPECebP~=-odsF^JM|oHN1IQ%q$-dp z4MPAnWR&=Z_AZ#NcwGW87u>o=1#i(;fZT zTvuReyu#u&atKjA)AI~j{6muC$UFBiXli}{H`8ni1BVZx7Z2PxZow)@KY};ClMOfx z*?+?oa$xm>cYX0hMO<&VcF;s(EsV`eS;NeJ~_Op{c0IpzY34_(N(Iu5K3(P_rR z>FwKmds(5nsI9zux0M>XV!IVZ$j5TBwvn>rVT{F*{%1o$kXV zds+^Z8Z5+}kWcC}DOC&=93qyqhBt#~tpw?p7%axQ(kMPy&jSc2Znfh-&2e8$H|v zNir0zeV%X0g|$8EK$Qk`01ZNYU!?m)tiVMpf^$;BLXPqd4-^-^*!6YA2DX_~^>QRf zuX9jckAu?Y(J93x;N}nH7(^G2`UQ$#U+jnOr31lMC!`M)Z<~$aH4fn@pfr>Nfb0)` zormnVR3JKlm<{3B75wByxVOWj#xibn$Y@>ISCuY_4%ckc=F+h6!F@a}&Sy`6UBz1C zL+}}U9DJSqf=RnPnc(hf-udj4o|fhIH_vXTF`n zYnVptp1Rn47>PYj0D9wz3@JO2KZFXTEVj^*cDu(;npYR6Y7|_oTBXJ% ziT=%Z)MFa(`qaXy?pVVxppRA?2N1N%UaRf2!9*I!`;rCoWUxvn3?auZTGCDXxf+;& z^N}N?qdG4EPd`JQx|53E&uU{f_x;0q>twE4UjI?}Xc7ZfZVOdkd@+pvBk>}51!p|z zoA=mSe%+T`;EC(7+Ao^ba0hgTGh=-)CjwUy)p&dgHtj&Vpv#!*Y-{d#9}Zy| zyV`Lp-uPi`R>!?^*vkUEzGDxE3Yfj_HcqyqgXQNgY~*Jm+`GyeId(z$c2-+y1hEA_CBf@r}?f$8dNk{OLgt{CSH$tWMiuW1hzjZ&LK@jO_02vS8!g*45jGV9G7V1Hr!C_?MTP(jGDs1w^yy-Rl9*Y!&B8N$ zC6GW;6##XwD0InoE4?|W5rn7X-sa!yi1x|+4P9GmfLBuN{Z=h=npVL2`3F>dc3!0T zvS?sCEj|$r{0AmOruG@V#`zj`#s)}ctmN$RjF(2Bpu@(f+7qC( z_$vG;pvk~tn}{&Imt$%S_zwpuyf@!kK|v>Gr zIUTU%#fQ6teE-Z7r2_ov?m0nFj0nku0R|DK%a@&M4{OzoPi;mUXuw?h_{kg^x#qH@hkIXFh8Sdt+N}OQ*};oW1R(6wYeHfCqO%%^d7Hs^1y{p{*Q?G zO5+`i=|npGE^0A&U8I`J7u}^pQ+Rt;&gf9<nX3dLi(IUDw>`;sn6~-LF4xy?smq88F7y8;q5z>&g7U*Z&I}b^ zHSktt3c7h_+#fQLWN3ndbi(i8Y`3)xxtQF6SV6Z+gp2jOq8}98*sf@JjEj)ByrBQcp5=BA-uOpEyCX3o|lClDn294M1Q8HG_I_hgfW1G zNFe54;Y^ac?C*u&k*B465N6T|*)?c%cNwO1wLXZZQSJK{#~zo9yN1{t*(94LnSVTd)WDI^U_U|8Jl)J##baB6%HaS=oRm-hj6qZY$dP0l*O;SAK zzc1{F6Q+R9M90z^gx?k2Lwjw~`_|_(J8f|jB{ub+)%$(z8H!)$dh6MUVh?gU6>xZv z4-YTE+k?rL70&}*CvH?XHM`jD*ox2j{Ade!p+|en7#xZq zag2v3M!gHZl#QkbBoe9k-JFP1Ny_Rs~^$ zu_yM4_@P)P;^@|gH0qs^ycioV$^N*^m!XDN4Or+ix-=)X9^xyUlXANq$lgFOvZM#XO<1rZsUh~28#1L zZc4*qUI8XbPyaEV5g1^(cpAb(n~skzgqDAxq(6FI8-O91WF!dUe@wcMJtD{qtM}QwXr(6-bB8QTDerQ4`M$XKz!YK+W>gxg@Usz zK+!qh1j~{>0y6I7s~B@jwVtE^)mn)3ZzoVb@&OuUdV%G}Pr!d{(5NezrWVe{r%umu zeYxZ1iy9w+y$gV|rlsF6c=H31_8p*+b8Ua+UX8-R#Z5~d$OQ(lN_1Yi>~+tV_shnJ zu{iJU-fZV9&PC?Eagfsj zQhIM;fFOvm_>Thyz9I!2lXnNZLoWZO2>kMYd7)V|aO2P9o=;;8ur>yG2W76bR6X1&`_RihImoRlBSQ?50TJ`DEkgK z#+0Jj#==YozDfdwJqA^$!n^_iHuo(u899(UMm36{SG5v@pj@Vg*3v)hErsu<5P%0t z%IiRji!9Gn`;E~a#p8RgdlP?ESZJ(i07r27N1V}lNu}<+6qn^Vka?E-3F=!`fo5Hr zud;7~SpmP$gkpvm5U(OYpdxoXw*0M|pZBg$7_vLCJ?kUDrdZz5tbUi8s|AeEsJ!KC zEFwPJbP|I&oLDMy`j+Q;>IL>*ge*FhKcewK66?7~41>>OezQYGLEzn)dmGCd9yV&S zT!F?<_A|r)STL>ehD+63EGXMiQg^S}BzzHZPBRPG02$B|W z#z0RwH_&9GJTx5B0szo?mTzBYf4bosijh1C<4qre>)ctjw-5rIZE8CXl(Vg$994XNBdkSOqXRuy52h(pm7b$CjcP zpc7rBVu4D*9s&)1vHB&K}-SR z98Jpm8JCqLg?P>qGw8+r^C2Z+1*d{g09T&_;Q7tiMKAvjh$)(8Mw9FWZbq>I+#3*m zTjQkbwpC5q20N7lH!Al_HFP9%}nhHNV!$nhhCrxiTfW|@3*zIoT$;?qbCGw!l)q$D+peC{GIWe z1^x;kObuQ>X)iz1eaCZ=k|w$4Y^B~1}5vpH#Ew# z-FQ4D^ffN~8INO`uOIyS!TaLS%69lpSk*o5oEo`D?)=4mZ4fB{NYA&~BMU{AO`scH zj^(&p7?jhcg9L$p;0}yDv(G!ggaiHHG9Ijhy)`8GtT8AFFv9FH7rZ%da!p-JR1Yga z0JCF;M#z#l&a=5OTEIkct(9THs93Yc13*1OB?ZKn!|o7&N%Bg50aEY<-LWBm*ZhaJ>hq~xxs81i=gHYgZsd@o+hg z+43tGd??orE^!D@BIr}t%Am z2Q=XCc}VSl^oF+1;dNKMR`NkbONu_fO-uezAz*Wi^$-&fM9)P}=tPv&N%>vs>_IQ2mY#xg50W{SBYRG-OKeSc7W}!Fr zXYEsW_uW?RO;y{k9@juOJJs^k&Kc)4F!X9oe+hY0x8F(PfB$?6<7)OS91ML&K( zPQHB^!aPB(lu1-E8F#r+1YMK@t?IIMYiyeYAKE-Je5xp~Fbfi$mmo}0xyV_>Oiv)A z=W}?hUEUuBTEwUiJ{YtT6S_KHT4)NyrSHnZt$il9L=7->2i7|>Wv6RdDas*G&5~Cj z{86a0aGJDf*K?XOkv|5&9wU=i`qU^;UqcFnktQ+zm=sp>KgwV6z(-6L^z(&?@7H!) z`T$~V?%OZ>;n<(_3fsgV>c^N4F~fK+Pft#&RV<{q!-Y3D(6w9`2h7FBs2_G!f46Y( zVw#(7ZrZNUE!*Y)|#@cdE!I^_ff(hv_$!25v( zU9Y>DN-4?P6HY*IFAGLz7BI;LVy%cutAFc2PoSaKOdouYH`$u9HwXj+BrzE~wWdth%#YnKF{wRp z+f3f|vime|gh?Sl9P`|+k#Q^8OQ8#}A3KCeoZPtPC_HMp6i=vG@7{7RBhYxC+C0k0 zPp&rFcfw#1}nBK;pyM#A5b_vj*o=HFQL)urD-+E5H7bMPO7g3*Z z(&u%x|I;Yc1eoh~i}?iW#&A+!Jk02ZHpt>>`U}&Wsks*l@Ih{)UC+i>tw8`tl`R0Fhq}A2@TSxJY-mMwJUN%C2W25w;7!&+}DR0Dgv}gmS9WWK=r$gw|BTwrg&Y| zguZ+iTZvGr-5t+mQNIysSxh4(m%Ij2f3+J8W)ILS*6523zrD9NC;-yJszTRb{N77E z^5FySx3RC9l4lg&*slQFoxo$QSO*0Rv2y?hWu>5S@#{4aJ3UjKe-4@NU9WMx=%bAY z5E6D@Ly5wUJPQ&ZyVk!-VU==>5hjd>3b}08TW2c7UasW$wWPAMb4l}Z4g8ru+<7!?UD7eFWtPKZ{r_YXf4+P2k!sF>NI%yay zVoijwMEnxxIen}Ft?}3Z1!z#Y`Tdm?uS~bv3uUMH+=?@PkUShldI6&7b+iE_hS@RM zBrxqt1vNCFFy7gx^Z59ENHnOXP;Pn=C@!N;Y71rL&=1yTKTAT{kG2*}>fM2%S8=(_ z4`e#wy{nNOaVz!+2&g-BPuKpMG&FRn<9+8}fCWT}Ed|(pzTN^7<)Q(%cDElB+%@6@ z#gVuHx;9y#lX|phuDOntCGjVj2=#$fUiWPdn4p8{%7$5iI$AO3p z`b2<1Vs3A5A0!MpL>$gEYQ#Hb^8{H^+jP@bDuZ6g;nY~69+Onp_4W*O<~)*I&^4PM z6J+z$g84dvcHr}eN{u@qKqYstl`4q=CO$YGa?6PO?awc;4-mo{Im#)_MilenDsT56 z*8@@%89&Ej=e`}{|cF;ei;L6QB zUyGA6&cv^idgd#1;`HW4l=s26FJ~VnDNeFVkaKpd@qQ;e|Hk1WX234XmWFCF28#1Y zNfkUy#|gmU<_(_U&3y$bM>LQMbzz>(?r%c2?D_=hXZRHN;5zea-p#!Sy4ihKv{QWd zST0Fzua zGp67{Sm-@FO>>0On22=rP9>+U@eEtKOU8Q`q?%AqkDx5zuEwO_$B34DG&RYgrO*-c z>28$&g)GctheK;fo&dcZ{-IuRh&RVJB)xI|`QTL+`1w8DoGjJvai3M<%vld+ozZcT zHk%E#q9 z{h5Hc@1xqxcgxw16=~`W6t@u{d+c&vC=e(`wbhauyJRi!Zl>eYwhCkAr&w5u=V5d6 zRl)4f3;H0TdOB*`6^jZSNDw3nP&h!km0Km#k7BuV0d+qyw##7`aK*Z)>0!+jUKcO6 zwCJ2r7}atYcT6JM)J;lVBF621sL*(bS^2sO57jyC4694;@<3?XEgIG0n9l)XNmU@7 zm2LqO*~XE+QVX-Ot#ElZcjGsiLWs{?5;RM=jAzE&BC zAD>M5^4qV5Z9h>I67gRH{4jj@8ab>co)8czu;}o(-jRLwRhE|8rbBTo>Ox52m@e74 zDl-9(2KsU-rXrNRlsWlgejgk;=FxIY#tj$|#7(tcLeIXxRK!NUdggoAyxPW4eFefe z*G{&Tp;tD&I(>QiF^c}`zR>o;QHn7~xXX+?SGgS*vD>c(O|o@0E8VH{8J4+iw6sYh zY`Nn^X!yy>c1tQmd`wSKQleL<2BvFlTz^5B#rN$sThoS%T9#ZizP&`t% ztmO|(_YZ;XtF|K$^`xKM0y;)#XI~#9{qpjKq}yt|vCD*y3_RNno<1oxjXPY7gRs*Oe4P$E=bXbod~eVa#K4 z+<+cB`t@yL3&noBLF2p8rKi>Bs|*wd-$+4*`=5Myqac!k41DlGj+(DF4@qf-`~n6U zzwp)Mf`Z&iSL|l_Mpo5Z0rgt-B|Oi?TI>q8qz+!V54cd9fsGN*C?)nTAx>+?Jtg+i}mdv||BGdSt zHs!oaScVkUGnV;vgu41;UQXYZbnr zUIqwaDL}Hl*?L0#KBqT!B6%ABrVeoD!MF9kh~zp$zFMNPAjz zR|R|uiHQ$+45;{#!dJ5nH2Ln%yBtf@P#fGB{RzOEnWd~#)*pl;1D3wiz6H^4~ zFOVp-H=q;uM}Hzy9`BdB-28@6YeY4oGP|V^LC8xvX*#2=?-oWY(i8+dOfAFVa#_+` zkOg*^o}B`{ZF-I^RXAe+U|^@5rRKalE2@Pf;riHZ`ovqRp95%9Pz$C(aVF#&tuCv={_v)8em-AM5x+!3pIV+)i2P%f{9 z>Q}>0Rb~LvoAc%q{Q!G>q^@`oMe~X0<*Or$gne+f#5!T%OD@1mBC2@v01^k1(qZyq zLrBEmo4%%{U7nS3`K1opO9T4^+qnDv+domf!4(t$u7DO|26js6$1rUTQ5*+=(wQV< zfO{pE6syyep2uqY${k&Xf67?&VP-oVlw;M(BdmSKLwR`Tr&R8oMV|) z`Rp@k&h&S{a<$0v{E*9fLkc^Nd6m9dY}UmNTnYU8x7ztC-ub-gxcTZMuF*?LY%kxd zJ1B=Dr=M3+-b;MyfXXz13@ltXSKt2vv;cZ+Ks4x40Ef_s+@WY`dn~*~otNCr$iff} zBJh(z)OG+YS0LUvF4GU18*UtH^Br`+#Vb+w3LG^_I49%YMh+Ce!q^5CY$FyrpbYR> z_cIR^ID>7WFGvi;wM$-o*xPf~rm=bCcS83jz9kh4L&DkF+1yK}JEl>Lh)CfcWs@F4 z=7(Dg^*?a+Mr2iB&_x+Rdd^&7-uCR^jludN5lHIRdZ&|R9`zQ3ZB4U-4*a}QSFbHH zVHE_oP}YWRESz0m(Y*y|GnvE~a6jnDR4J zQujLkpAmMfY7vm1GkM4{v~5D*+|COqr|+@C-ijagh5TV>wI9J3i5~4P#TZ;Iv6Pwi6)v)XOnQXR))3y!v%P1)Z2X^dtXR7` zV8k=ViMR70Nnj~{zTsR$`_D_jA$Wo`%x*#m?yZ+CjsQs({!ersw`=#T!SFmIZ2ps6 z0{3+U`6|P#fppe?QvybQa+8j+W>>tO6Hx>s-sFrwxE)wS!Q`DNw4vPk>Q5Ok;-qI0 zjki)-vsGXy(9ZwCX!%Ru9whvS+yRNcxGBBoA*R3eRYQ6(Vn-5%vs(=T{{PAQUndXQ zrwQOpNqQ@`V|q>>z8GToW8RU>B0oa{|69d|*F3aiW zY7|)oHe#j!Z`)LwChUn(+ir`bGDMM{1<;oy@B1`?oq@RArgd8!C4e|8AVIAD$keRJ zP0EPEDFy_(__i?&z_;%gB_L7WE4P}`ZrvYNQCh=O0-=?vPBOdKmHUVpK+f&WBh9x! zCabCNp&azj(2Jqo%-t?|b-Dn!_p9@BBqP@%lx~gSvQP&J@J@l!>~QmL6`B%hE)rZ^ zqwA8afOu3k+WyFhu3K+j91k`{-Y25Hzf?OB_M0AUq>eFw&w$S(>N59%FoYrl0M3v6 zfNo{F!~QXZ;%;yy(Bfb3NC92>d)9Y_eL!}fz%Hh`y80pAqf-6sz2=8`I1GM(;K}Ig zb#>Z)!e%xQ1ZF*-*SzI-Y096~@_r3I<4jAZ{=5Bl@%{Z76O0eLQGYu({$^7bgpn?bnWkTFBDfp2{&-2&LGG zBy~-)(vWrp^_Q|(Y-IGe_=JY{ZniX$|T zlK{O!HEbdJt8E9JOIgi>Mk^HYvasFu@z?1JU7lQ=&{TKOTi`}_VQ{P9RCnvwo3KqGRHlQBi zmst5_Ej8F`Firsme&6x&C+_>R0(yET?{7whzLw647X#~ktdNODM}wJyFHiXLM6xre zBww{}he8RJgm20Y1 z`3(c`(-vh1bX2sWQ;pwjgM$OhDUYS{hi=B#lzJeC+mLNK>Z{W|*$g{d3Mf&ea zi=1}pI&>;$l0wcNa+?$^|1P-#cf}akpDZcJJC)v{;*n~d0w#)Tg$lOwHDJJouJy`l zwJNj$*fLRTRn8YIB`4PlAb+le6L7ZB$<~AwP9&8&naxy5tS>5;Zmm=YRDj#L<8&6A z_9fj6K+pbwQfIpT)dAj9KtoxH+E@w!q?FnBRo!e|uHXBSjtE~sp^sDt)G9p^Q9cgk zGHj;P^1nJ7U^7~e=I%rsK<(9AJlXZyU$}y(1HDP*G#KuAg5?bb$1ebYcO`anIAsSM zg>*bJQ=xNTz^+I`%#Hiu&^2lcqz>dC8txgIO8}Apz4DQ^a%oU=-Q|G-_L!$#=t;&jLQj9@18sRSEk6JU0G zrsaXb(r)qajG6*HUN`qupv6d&uo_86vh$9m)IZNw8&zo3ROvdFsTTvK=;nhKW>**u z0T8nFsT#Fywz@HXWBxwy`towef7%EQ5{}ks{~?kUS+5*eO0OZh%w|P%dg&`-(u_#M zRd#5>u}3%RpcKwBw@B=z*Fzo3lCX*!PV1$AdX@VUh$+aegZ^6}ugARL3alTfZ0n{oH3|e|r*d|Y->IQ>yl*ZO^sDCGLRkYh!eRpc zQG}1H2atz1Oi!0_X;U9lrjmzWk=M^2G3mM50Kg9*w{;&p?($jawtAF(h{gJnWu!xm zM`uaWXD@ z41`>00(R3pOt1yB0|0NQG+KDq8h7{(1p^W@+%1~7YN;gUbmv@NVLxsE>g(dYuLn$mjNMVPH^yMAT(3!g zA14HC7yyes^QdbN5G3+HnDx;IV}A-^C-lJ(V@H6QZJLS@5^`PKH)^PfA=L$D(<-6N0z zsX9I`kZ65-?0v)`&3T?M!+%M>uwANE=k`Q!F#qqKzr}>$&RzFsyqc@fp*$u03J`;7 z{ZC0hHa}qEZ&M&>$PIp`hH01sbp2}r^S@@gGnhz3`W6;NzV6l9RT(RZb2TPUZ=zQL z*TJ{xzV0=Y5Ob5_P!Ie^>S9fKy_$-G@UjWWZ;o46?cvC$J2@Nf4 zY>(z(E?7)i!W4b4jMPPP2BxP|oi-j0v)7b1MFS@xg9?16_(q`ifUiXP0THK}ah*kE z53PvXTBkqPZ*I}W^$s{rJZm5(RwOZC;TuTJ`rH5D0?bVWrgbqWDj7rMKo?%?Xu48Q zqmRMw{We*=3a+NXihP~ERvT*x`A;(386fg}gUMymS-C=C5y^b&b<~YclrCcWsgDW2 zm)VEC8uZ<^LwC(e4jCAl24`O$f9;E=*rElA0|A8oACE0B7sVjur*(zisDsufH={wy zZ+5GR@0L?9JYP$Bg)abF{Ggxf+3rH_t4nxKse18nqvH}mv^5wb(B(#KZhp?bPf5v4 zgrre4JtM%UdmlDmKC(&=&Tq1;d-{e0;asa?lgX}D5VAYX#7oAizP{gfAjp&s&PY{m zo74u0lDGjW)l`GI!4UxRamd)UTV+B+#DCUVdA?cY6zNF7-E14mvX4PwC;YuL0%mrU z-t`6GwU(S~TW^h7DiK4}#~w*BG1KGH!3%-R=8#1fOmSJ0s7;$nkO*Lz;7%H9Y9?=Y z05yPfHboT+zSLXe?E&RABw1o)DjLZu z1uV(61hGJ%g`BVL1{Jf<#5Jd2i!$P`0{KZ5JNf#V8Ic7f`B zq%W%uaH^$cBQe_hne5LBq`N!OK-XKNrW5E*O6LlP z*Cz_8#eFs3Z?GcGIP5%t8IW%SEL#vMwfp{|*dAa69DyKt^Khqx8>VI}71!pztFK1! zwMRpRFRRsbf{`zqE39lQ*DyS;qMu29dv)$SBb}?t{_oUTUr4&SrYU7Sp zUPryw6u@As$llx7=|c*}I=Ow0*G0Vdvl{M$lZpV<>^u51&N{$uIZg%gs!rp|uWvW8 zg8hV=0I3@E+dlCFGV~wdtFj>tw!VxbYHHU#RJ1fO`M6 z=c1sIc^^1x#0}7bw~N{B-(ea?4n0k_WF+wO(+5w7(tTeC9yBwKW*w#n?NY+aT;PMgYP|#284n6@rlCm+@ z4XzI$n23I=#HkKS#?v06`8v7od_a ze*@+iPqVjs-SdKVxx3UzI|y2zb&}xw#Ue|1^SjmIoNcn;Dj&B?!5+Q&(3FMtX>!+L zVmtZgH~a$w?hibvB4zEGfn4yS4g_H&6xOW@Q0fJ*I>mwitRAqA4&?!6YmzMUk|0tR zm8cu3Om-q0y!OxwgV7A)@zgn}c9Ulu%7Ikn3sSmVR86Ava29AWIx>ab)+6*6Hi4L_ z(x|Pmy2_yR7^E%!zcaa-JYSY^L5gSuto!}N_n+FV#xUzawg{&1 z&cv31a|fdzKYa86;GW%q=%+S4GM*Vct~S%9YTHk~0|wbx0zsP5Cs_7ZgT9@x@dn$eReOG|J2~Xx1fXZS;yPyMjr36?SGEbp^;tu_{WH{M z{P3&T1nyfB+bjv&9di{MeyxHX>`zkIKRBT zIk<%i$mgV;9x&QU(|7=fA3z}8Ji>)T=|R`&q!nZl-~ihb1>gn*fKLtD3j4O9Wsp2; z`5GTTG*RK!D2bsle`htC0ai6^6f_`fbZT;Fp6Hf-2J(2M91QJqhCoI8+#7ngyUF0s z%22nzc_Ok30C1=!D)!3VcZO-8U*IzM>gKm~TPI}*$UXTVfrYPD3o@}Omv#>Q6h=rm zv}vij2J;e7IFs7FKx!}~MT~{^6AvNWdqDV)Z%@q$qAzAxZZG{EY&hgTQhWM5l)lCe z=#uRI)FPmSKCRrpWdNqF>5bd!xkKTWI*w)9)0+=+SAeK0>jD7@=IJV^BVct$hBgyu z_WnNsxC4%Ib2n(PaRm%FOzlX=&xw{LD?UFS{8Swz4VM5-eZ4r9hoC?kOJ+?HLp0%} zyi))fN)ld?A8jDI442f}v%&E05!4W`J`lv!+XYq9g-^yLZ_|JC5ef@}rCh=f@;U$@ zYra0Yy7_Z}O2h?lfPe(B4&Hc_E9m~C9-~55$W+$)(%qYA;JA01eJ*eqX3BD55onoD zZ2Fh@fv`zI#cvhkJL4C%t5~u^EY`%E5A;q+0QltjjY2|$HcM=5?+PyQ%1{e4>lvTsn#<~!*eW#Cts%Sjarm=?75BeWlmzxC;CfoK~**#?FZA8F{x1yr@_dqef zdf&PIxh_WC-35Te6}JF5-?x#8r}7l>sCO<}wnw!PB(jp=t5HyCAb%h~_l8w^%Ry$= zErm@>tS#m4T?`F0hWEC}T^r!?k+T19MEeWC??*03fk8}rOQ`;%TcaS5L4mg0j7$+~ zINP5fq-01{=z{A5Kwzs)y14cLJ4jMO!kFge#kX+KLB?-ppb$*}4Zu4T0NeukEof`_ zcsTXOA5LsO|XaRs4nh7UodA6D#PQ%9( zvueP*G#C9EY@whR4C?~vAszeSU@$N;Xa_jZhx2I%fh=KHGr;?Y%z&L*++m)_=NUNC z55(A?4}Jg$C-D*eIW~1BAD9)VohzlZs2Euf>6-FcnJ8I+?5LI6dw2f%@iTP%v7}az zpXGMj;jC5ydZ@sAN*|Ckp_lS#z8%cXFK0Mreo<<6=+p%4SJ-j@Mh!^(*Jc;M%r@p$ zJOS8zUHe+}WndFf|F?uZ(w_ndd?5BY)5do;$ol?fSUlg>lWic za=KL*e{Txkw$C9_77*=#k|VrCJT& zsy^6b?XWw65)K&!foQ)dj=-0W{qVV7rO5gQXCc__iKhAr}q=k?RT3cK&Z9QGJ<;#p zc1|}SV6J}vT*6$xeGwnJ0jgTz5q$1;7r-^ORXt-wjIbL`OqRC)%Mu7=7N8mnVWV2~ zi~}L;^Idyi&|PXpb~aLUGKaJI84q88M_LW?&&9)HooH^2pmondv}8VKc#V_n>(9yE z&z$b@hl8$%dknf7=z(qkaYWq}@#KHilVGnVS>=-E@x{vC>2AXSi|iVR7ClZ=LTL3o zU>S!XnFpjSV9dDr;HiVdF6a_?#EuUP_iY3BCN~$@KBUs5%ebz*$P?rpV6O(}#k`CE z;7)}m4UC8AU{b0`AyP890enMT!Yl|C51TEAOh&us?=@)wEOh)FfRVwkNXr)twz4-t<0GQL`LC|5Ns+Dy|;mBGe1~Y`3Z`=d4>rW_F zxdK;urvIU_10F$OH`)HC_Q5qxDqi~d3nSt&3a$T1f;TC%YSyzhC!b-*re#6bH97Gf zoKDp-qoCWXACiE-jMv%o$PQtEQAZzqj(U98@nhH>Psik860m^VFbrux+7`fs>>fRz zZUPQgz8AhF7(?tedi9$?j&f?F880fXfhNxORQ(44;WzBju^!2h;#?rbm5MBc$jxMu zg3dL99pfL5T@fERilBWQGeQ%`8Uj{Y;Iz~C_H$=W1%OKr*sF7eYU10;%P4>Vb6P6m zlMT|QGLx=OUdIVM!0P~SrDTjlcDX0XO_dN_YFk9$84XZfyw`d|gZhjaXfV0Elj&Z_ z+96XB2aq%8b9 zOG3JoQBV~#DyKSlrs){_Y!G@cboe!4t})5|XIxNF*+B=nwugn}-y;0K?`;LXAmg#A zQUA3hh--tuf@6eU>nyC;2dz(IFb^ZYyUaOqO zbq5dJ*{Vw**b2d+QyRn;r=bAy6)_CnM`GTnpaj54=SpVQuF!S_N|yYXfJWr?NpT2h zC0+uLK_;9KV&tQ?M?yS%M-0CI^&K#RkS>2vy0`xV&;NEL|G&-ok#p$pydkb_1Yg2F zo_69N?{h?;-B{{QdC{jXW~|7+~JZ_(v3 z+kW7GRr-bk{`sHJ$)Y= zRTBe$`1ctb^fTZXj~S3IHe{oq$Z7xQj1BL30r_hhm&e+~ehdW>_tY@hgL(mr8Z*X> zlAOHO6ji<(k3yT^yjTQ(Jr+HNm@Iaohl;)$|pZJjQ(7*pBbABbKZ7BP$eJny=_<_WVGL$lWV?!2=zC4~l) z__Hv!U-yaY;MIBC?ag@?HnUUQ@ z&eyBhlIdS?RA2r6WU_MB*d%^7Z+?56)}`WXS^BPyfhWM?avBpFG6cY`m!tN^zcRmG zmG}vZ>@`ePzuaJdy=QOo>&J<9*gf{gXy~x=5-#E2Lr-7Tfeu&ut|j-M9h2M3aLKE0 z--upc02JaD`Q=gIGj!Ds#i&rulDHG$tHY1Z?wLzhCvPP!2Taae=fqE^HLyb(s6Nb8 ziUt(*wUaP?y_{`2TePnc>O6`a^PR0vXW31%G2_&~TVB10LqKQCYkt_BaC$Kyd7~iI zI^kLEo-Ne=?T*^VD8*)Z1KF9GyMf?Zn^C<1;ZI*3C#AK0*`Q*Uyqt)~deK1DnNkI= zvOLYJ{0e-v_LE|6|D~ms{$G#5FAuA%_K@%7+*G{k8a9n;plZ{q2CqKdmH&ySsV^xe zRvQEcsHm@~PvNa)$9c!WH5fRt^j*$=r<4jpaASVbn3-~&v&zQDiR4;MW{P)aHLrV# z=*nm-UX!FgB)Qo4?)rmoa?wMM8A+tNuNTezwGsI~@!PIH%Ln`Z2Y!;bzsF3}M5p$; zuJ@cPq7P?D1%IKV!}JNBLx-GS|5*yK$g8I?ZyMIZMl_^%6gVyKIe8-{2qKlW(QhgVVtO4 zEqpO{d3csaYSL*N4Z^j`5HIEiUjNQuVG&$g#fZS$9&+IK^^e5$&!<0Njz@>jJS`PX zk)OyQ4om#=<%h&m|7{KIj~&bNRStWOlu#0UR)fq=tL!i6xNtY1V!K7i626-hABrmu zO~6v5IZw3;oiw$5e&uQF)1E!~Eun^GC~ZiaOXL&70p~K8Kh-A6Pf4>P##N)t+7rUw6|laJ?@S=(4S~dMY%0HMe|o654$xn7{2|Y z{_3ngcj2JNw~nms06dGYf54i$%|3YfqwVW;^-fdQwd2m8uA9@EwpXVWCgR^?_&br) z=P26b%GqG}t>pF3c>i7VT(Ee*yhL7UOHuL?tlsfc2HM{dqn63Y72KGq$4TGbNGGio z8bGYU%7VMhf)NztTl!QfKZlrj`(2gxF!!sY=-X@OjS>DaITr8EU)i)LdDtz|vN$+* zS#1XKUXbO1b!d{n6yr-)WN!X=!#(#;7W>d!?y=cpPZNiy5a4!f-aDPe$p8RkLA+hfo zU(d6whej6kUU(d3q)s^;QM(ra~0QQi1g#+=m8%oT92;70TC zyS*wOC3f##<`enjv`1nJ-%h`kz&uQ#>cue*V4V+&aiD*G^CuND^!-w@F`4%EVxZa= zXQ^W2m#z>(&X%4l=c1SSA-8WrP@h=?OaBQAAjBL_<(xe-yxS6i%a;DAHDTWVDQ8iz zq4Dowoq`-vRpD=*HGU7Ge6Dv);(fm?G53i#D>(InFhvWd7iEsJq|7%nL%TK$Ncagi`zK91EQL#9`LoWxf?((U_w_gI9S z*OMpQ`g$5|?4sWy+~%)3=6U27>@yxddCcs)+1#(&Fy+e6okDxPrI;Ck3dKJ&3y~-Y z&&wxSn;(bT=;Je_er*03`N&ov-gmn2i<~1%zigSxLg%15!f2PDwG)#umzaXQM@rMW2u!cTa36f|o}6olL)kBwDZ z6vfs^EVnWQ$HMq$>@M}Ss%a6P8coL=n*ptu%pFtjYy-OAW58p0-S|ES%b7=QOg*yd z=ZsCTyDyP)_IqLQn}eQqOtsbZQQEAA`;=W>#$tGbtae1yl)r7~`;WFMNIu}Ar>+&` zrziT-Q)moJ&Rre9XvwATtC9VA@Hi#3-hf1&WP{_zb>GdPzx|?*dsAF;Gu>RyG?^hz zxJP?!>_tC+h^3A8dYC;`Y7ZmJF+&6fGZq3yQoELCy}A&f5HV{f$XnsJykpD;v@%Cx zn|+V@$T`_yOk2x%0&@2Fi603c#{|x|IXW__pnI{@#^TS8e6g6MR@-OR@L`L$mtZLW zg!7i$mX9H01g25`ptd7F?hOp`~rzpK#Z5MKn)3 zqoT|7X3J#-D4yWHFno?%K-@u^-|AraRLnx+L;$!jLK z3{3W)a)o6Y(xCP!7@The90)}8oz`t|P1ufY4s9cKA7=KfAKP>uhH}#_L>sO@On~wc zY0j3YKTKhu|3uPOoQ|;}d#wEH=}7b!7Fi*6{uF*;G9EV-xpZMS6LbhPXP_-^yy0j!0MEMl~OqqG49vdxcrI zpKz;@9-=?)hbD(?>yLd!EVKa zd{ELT{q7=jOK56gz)Bb5Eu+~$nc5K4Xm}TQnrIQ9TBfk_E(O{H_-}3lyx!sVf@&79 z$3NaMVLTW7+2qR=tS~&nEOCU}!e3_vHB3o7xm(BhM(3sBbG)i8TRTfy8I3BD8eu;A zMhSs<)2zh{CM^(s$q1p`pDe~jqcC#)F$9XGuU@t7H5R_lz23F<&LHwl#8(M)RmggX ziSHxd1Q%^xc;Y3xtiQs`r0=$v}KUSju+l< zCXANWH`0j!yTTXb?+#xn-pPF1|E$St{y8>Vr>Trdt6|r*;o_`KBuBLpVx7Hc4Lx$? zO5T5ZF(~9R&iu4uFzizgt_iUQ#5r20)4R`KZJHHI?<1@fu=?~A~P3Z>$|Cm-1Mwg{gUq()5) z330}RFg-@-PBoU&8-ej|(;yE1l;Uoy#_+h^`y&ZrsRwrj4_c5VBO46;nN+YgMaD}U zS&!2=RubN5MH85$DjM0!7-al45%UBZd8m5La6M}%1cwA;zgto zp1tU3w6xpFAc9F81`=`D>CVnFJ#R*b3w`uQKrW&Nodkrz5kVir_I!Ok`1_<5Z zsk_kVj2Opn9kV)WP1}z0bO|zS37Q$-3;L}cr5~CbcD6cvk&oRyT)Cqt)p-9vo84eS zJB{MO;F-xZqM9CNW~oX|_pZ}h&DPBxAJWpQ zFk3eRw1Q%MJ{WaW`I%im9vr;Do_lEkH(PQm|A3Mx!8&DQCZ;gUwkNT)EVwva#zZQp zm&Ins6qDq*-Lh#QqRC-nZag`Kg*Z_O(5?m*&f^k~`-+wG*S)GNx}C-K*^K?O#*WHl zBA#(C%MLR8a-@1VDO_eH=XFL;HJf7MhVq;ep!j!ZJ4>u{_M{>lNY>Lm(;CBwyOak@ z2b@fer>nH-=;01jbmpEY@OaXrnv#|C&hxu^%&$(q>|Y9E6MR-}>1E_XrB6Lr`q=~7 zS`naDe3<~PqGppalZ=&4JbCJi){wOWpk+84_M8;13DqNiuwno`L7550*U*gbC%;5&8NQI|fQlkEz<2mF7a`et+=Rcex(VYjPLdCKe%g;~U(tBwCm!uRYCTB5cckEF!-aLn$5cPZvwjfuUT zs1)=BbY(@sEn4o$P|s+W($@^{WD^J95t;c7>`mu@t)=n|3eS?0@Wctj`$dgvkc)tN z9aX$$MeuytlYbOY^lH4^4zeTEGW5g&-$=`^^id579Xwziln<4!^9LEena7vbrFmV~ zcT5`^z|o-80;)m#mg!*%m-kTdXP3$iC@>c!zBmP=!!9#IZ@+#9b&RcGB*#w9(u0gl zM~vMaY^dR{(@_kl7apyY`ePf*A|}64$@7-6h40IPKi}^Wo^JA?#mT-iP-6Ftu87rH zG`>XQ0xaDwPgEx`6tU6OvU-y>-#^yOn8VSvvau|9@?3yV1hGIveK+z9F_5;DTgfxmZ zpJ(q&9UlZ!gutRrS43VSnCCvcRu%P{MlDhA{j^?8IL#?IR3J4;7B(cv&8!pqHTgjd zMX~Di)XuIzl}>`WOwP2>1`ny?kLPhqk6?IrFi}$b7N#aAGUNI^9_H64u+)h_t0Zuf z8|dM})H}?DomOgS_0vna4bp;%D3alU4lZr4#1DMN+?@)4$z_}Ei^&Zzh_+`Hq)$Pz zd)@=?p2+2NeB7Z&CqGyBr=KzE@fsYA9Q1KPx$+Z=*Xf$G7)1783^08rg5^y=ht=d> z4}aFwHo)^_r;~PM`4|Q)MO_>!#RVKT=}13!Db*QuEQguvz1ce4xKv~dS9uRZ7Y$B1 z`Hb3kFL2>`Q49u__CZ~TCXj{Qfd6&v1v7Rw8{uaxs_p>lbHZiu)d2J? z$a7~(=B-T+!#$f=d_O=97NWz-|J9FwN-L0?q2fimq?BkXMdULm>yicVf{6Kd8M_WY zgzH6#Q-iG^5V1df9Hyw@S(Xc4`)sUofaqXZnuOnQh=;Zo94FWTb0eYGaE#L#rdXtk#9fcavW z%bx4>TJj*FU)ULwz(3`x#&@$7m+EQjW3o-r zz=lF2HTEbOm4BcnmULp!WYvF*({wqkHAmMf(zBMeqf%>KLuG$yc|~$4HBdeJ+Of2y zxF>8*T{0v`vLnst6-c3V&?cw5Ut5Q~;JNBCV_>uKYM}Z##u3ZCtv8~!ukDYRV^&Ob zao`yC<0V3bFsM^qR1%7A*jh>=&R>f)u>1bU&~%FEtydG~*oncC~Ds z>pxB1WQSLl@|ygVJ2796zJ`l2|305fO~=_oxL`^fHp1)Xj7wih@B)5LA-`7NHKzp8 zruI?)noRTq%i_XPYMXYqVv{MT2$A7q8L9rN5zJp?QkUqG@hvWc^{K{}!k3Erro2lZ zBr8;m$j^AEQc1y)mw1TO1LGf}bMHR!srMi2O^UG<_yjW`!%H*>`YWv`RZ77tzbGWjr3aT{ptg(tTe^AN zw?4Y-LNoL+lG>(NjF>?N?}r44j6R>;j}dj5HSNW_KpQ0!3s^2Y zz(K*Gf<RR>j9;k*q(~P`aLm%D$VR)RFcG6}?2`T_1Bn0G_iaq=K z`_SoELm%^++Ts@zS~b2}+@~CQPG^g&Xb@VzX*ET?>>tI0_ViyG!qV-wUA`WrHyw*+ zTq;T&Cp3;M5gy_k&O?mksm_{U~j*5 zq7*!!@se>AZ+=`HULXK7-ytQFab6Gj$c}?i5a1FK(f#KXPrItKC!oxWDU9IT=~|+j zEGN^+5QWZqHO`?1*30BbkN6)OPwOIVl)lZRFv*q^Yh>Pm$gWrL(v7FI^cL}w9ZDVh55x;ekiL9Caml3SKIfg~1Ia=njcFJv@8|V<_+6v+(AjDmd*b2>a z_MHBp2Oq|Bm^Yyo2v$Jvyzsih750QC`b`7MFJhK=p;Sf9G`?H;UZNIJ%dp?sp=;wPHF z)Wy>2EzI*jAFvT^7DMZ5MSVA-lM~o3;abWHdV#|ivA6yBZ_^z{f-+I3hYW%uevMM8 zmqLAqvm4tufi0vfuXNHt!yvx`mAQ9hyn(=^y+}}7C~`?F;oRV zGL`)vnWe*RdG^9%F?mi!mp;4avAu8O^K4(^pdIwclhn@#b`t65YisXz%i_dTi=x*1 zK!qO^-6M!828fUwiAB0l3}r*gQp1~v3M{BYW>mviRk+b4Olt(II;L^xC@mktKSrz> z2fI*^Jl+O#n!GTswNFc`h$rM?OIts294!F)hFBiwX%54QLbb#uZ@gZzbqzl3!eC)7 zt2Tvp0sl>-BL=T4bako&p(*uHC)YljIri2&{DIeMDk5c2Ik5LSXp7v50M|$^(Bz7c z;3XAGUI4b?kWH_Nuo&HTvWDt6>bV&zHv&#o94_oUH0TX3%dx`YD$hE)=SQvOPn7Q; zjCF2X>xA3}!9?bmN4~b&Sve(88<((0sX5+$MrMg8SEU`Rs-yLi;iiqiDC(t-Q zZ$0q-l8_!mTrDQbSs%{S@4Roa4p%KP@kAh?yVbtMD1tE}Oa3WRL3zGi(kKl`2X_C;K2);j|x%nmsK7JXpFZK$13Pjw*H{j z$3aD>f2p6UX~XhRR~Q9p9u)mFg5*GbkU~=?k?PF2v($<}sF3hS$iZ4y*=^K|Th@yD zrH19s(r73yZ1DPCaFIci)oZ->6YlHPV=KuNeB!XXef(cGa(GpRcN(0V+<$z6$y!Jf z3p7?f5uSOiw;m)?nkywsLFURA0{xcvomb}ztjfD5kdDL3Hlf^wlpOzXJxnj9_{qUB zv%7o-!@y!WHfdl8dN#Bym$H36eM&Prv*>2Q*sc*PvT2ff3thR|X~L0iK~18AKtoEV zt7nnayK5Db+s2dLNRQ*oBK$6Uz&E=Jyw^%b&)@SeBuISEA(1Ig9Z3|36b)MwsT-tS zvAB~cgAvU_ESvj8#;}`6_yg4%u}nudCYK99%jYyY?cexJO;3~r;nlo97FAeI{7$9w zZCdBVI9~t;gG)mMaY^0ZI6_`#K=YeU_$*x24(IU<5%gD9rP`^y<$cFLRbR#TZ-o8c zr@Vdd7)pjQO+>D4QuQ>1c!!wND*57$@>(qiDZ;c4|5ws03_^QjuJ{a<*P{1zC&$-g zjz~1-L-=$aK!xSSVFg=@SRsav2#LZVW_KI337}RUzomm} z-SQTu-((u*_tv`jy2*w`&_yy};@%kv3VZUTK&eF?w^S<#=2QxwG-|1W87;C}^TxXz ze;Ev4H)}n@w`I`YlFs3>4;W$}4`RW2KILwq(NM5SqMaxFhjLVyu3qf(&w-P*j2egD zfgY@h;Vd4k(DCTDwME6JZe1>s_c;RtlfJ%xr0H&1{2Ophc~DYy*SM zw2^@ilnvwazL zVVRUkJVfPr_2mTZ4-IaqBbZA}4VaNvs>5uE5s6I4$6w@^CzXv~S0*skj|fIm(~q=q zBQTgx*f#@3Hk&q<RW$}mR>3Abzq5SZN-m_5J!(pJa$h89|D$wqC7k`%*1 z9nMTAVYY_GhQnx=?qS90lI=>3PT(VRht%B=M`%yV;J(B|<&P+QHaquEIxINADGv5G z!nT}n4-%4e9oy}r-_x)6#O#kX@H-+0MsFtRA+J4mEpkGz^zFZ*c262&c zXZxJ1WJUXNQbuZWSipH54mlP{w7ALriU}p~_7!Z3;m&;>&(0i!_K^lu#yd|1lvT)k zAa*(1nW;$L*RVCRy*SK3bk)Zh~lWG${*UGgsJ79GJz5Hs1x=BABVQo5ik1UK#_H=b=?o)xj%ckkIy zydbCtTS;^}Z@@ciDrFBg39}rtJ4yx?*};$a!%iQvs>)Cv>b{YCd+IQ$PNu&Aq6{3O zms7>TPM7dQ8wxjZsd9cR0E=psmo{;Oo3-H6m`GA2*a2o3$IiEbiH>2;SPr>~} z$$HMPH<&`HJX=URWZ-Wa`bpbtSQaO1&?;pLk06AITzL&`gH2*>H*s5$hm>NRjFj;W zYd2G#f@9MDdt#@>Ii6t~3`q3h_8Uq>?N=Vk#G;$BPSGzDESrmksN^?YOtQU>_z3Fw7;ugLA9Yw}WHE1%IrVJ`W z?2zcsBex`Bh5XNEkZ$6b0pa{0Xu??!8Hw)tt>tfGzWUb_G3b1szT;%KWz}=>>rQDx z;nP*22t#}LT7^a9TAq~p?*sw#iAGh9pSTZDAS=3wMU;udU-Fz?Ayy5JCKnmHD=Ih| zpJzUq*7Cqep8WXpkn2j-*M)QkD+dh)mg{DD3Og&QWt7KFdDb04m?{e6QIq@X6M}p9 zNNy}@WH2&>G#)yUzvsgF^qND#tb8W8_gv{WE8UyhrUtA?nomS?=Fe-!O@4{~AOdWS ztISmH?=D^l40^m=j$87$xXVbg6@GR3abkk@Xmq9LRSBj+RnzD*r4$P^nb(f>=8?W@ z!3)Caid2v~z|hO5>);VX;ABPO@<_h;XqX>;&2T41Z!C!^$+B3wN49VHA$&W#1&SLV z5twp5lNM&O*$`%C5G+^7hfgdmL(HlScbjY(e>NavRjMZ+-%NF%DyK8-=bQsAFw~VSX za^thRKV+!CRlYP!XP0MRdZ5-I#d3cRooFVmZ|y1JRwvn@aage|15UP0AJaB&|EhbL zd!Xk2x!zO-!imw{`3|H?qiG&W7Hn!R68|}`e;n5j6`qj#kmjn^P-_?Fg-J{H>3+S` zc(PUdSHq}OQ@@oRMcI&(mdBVvEINAXGS<IQvzX7}_FZ;$!5oa{{V0m$#6<*D6<6~Xzs zAOl?P#Mj5OpDgo-|L|FC&z=+vEg+=Hr7#dfkbA=D=&g_Ct5Ul2kld&z+@T3l-6kVV z!nm?x?|iBlQMmOV@;cS*vHz9E1$k_mP+I>wZdI83LvtKMsFQBC4bH4G%n6Tf9-%5 zc*$yu##$8eo-r>p<@h&VN_VgeDHOp&%tFJ>Ha4N6kZ}LrSSRV~hYX$E#?6G{2fs2R zqoJ&=zM~9MYZbg{G>q_3KjmyLx=3$!*FsLAM_%W{y)q5EMAogx2#w zoERKJJSSqx)<6!o0>EVEjxLOmDNS04fZ2)L)3D87^EGc-6=4(e$>?gov`J+Bxq;Fz zR69vG;qzU#XCSZY`E$GDbpClaGesZhxd7(~482Nv&Ao6B{Wwq+w=` z&Murk%9#?g(A*WWQ@W+eM|gKiN&82uk|fDpC|>&AU1v`lJwx3nI$YO4?nQ32Rs=pl zt?nay2nHs`W#7S|j7G8o;iG_e@gxf=MjL-F3!Km&f7gKG>d0}hpKDCLds&$Q40>4h zOzEL>m{91@aWF;_7Q|M~KOxx*C4OSag0c;f6;v52k!Xs>Z=uZhWJ|4@MZ#K(U1S?0 z(s~s4kMS!!hw;&iwyiA`1`iZ9J>IdR=i~gd@1A~sgqM>U@_VQ{B^4T$FohNmd+Akf z2|*l&x%#C~bz0SvPlEu*Z5!yudpRuQJhOZ`tkyI?3ocA#&6DS6+tq;SOZm_$bShy> z&59Q+vGEFLS`ZuH6Kdeo?P0?`%HvU$<+kUTl>}1%JG!?XqP-; z>4>bsU3wyO7x{F#9u`v+9YZNOiuH&(zclA>H^&N-R>h3Cm*1A-pk-M~Gl%!Y`Yz7F z)to{2?0~{80?yZrst#?|xSWjfJ9q z{wEA`{dm@(TkvA$r2yhEMn{6rPtw{GH3^CnTJQE|hEp#+#^Kil1AHQqvHSZ@Y3gq- zFKN133OB+e0cgAWT1+^#8xA%hX^@0fp3SqwlKQ0JH%uxKWNuiH3$KN>b@VqMBhKlX zi2h(?2}hvf%3Q#p8pA>Pt_f_(tu$SwCT8UhcYff(?6wE8Exl2J0Rl(JdMgZ)^O#+& z<(6{tdq#qm;vwprGki$dK}l2;*qzid?x14{eU$XS6mQ5&ZM}%c%0U1+fnSZm@>8FJz7N2rSWtZc?(g?X^; zCkh0gcv}|n6TWnL|Ex;@wzksGz}Ueh0^2$=dntZwM394#ch-&N%P7u~6eS~npi~MS z_`TVE0cBN!J$HklGGV0C)}qpPcbB2axKTbT)myPJ=6GXTaO(Sc{nJlG&O`S)ipkOP zx5ep%S@^0cQ8Hk7_u$T}`|;)B~-w>S#9XBVR?_$KmEvU5#yd$ccIH zcieBHGWUD$rYH^MpGd9I?vR`bm@GR#c=YjHN`KaQV9QTrO3xD7@_EDr(U=NF#l7{9 zr;m8`mcHtUYutAA%?|#};%5{6`YGL!N*1eZGg_RH3BH{}6n)IJ&=&qRx9lDOm1@JBvIc ztS5rCAWVGVfiu>76{mUu*dxVfW|Px9zSwy1QQ-h+cHB zm#Uv|MG=cxSdzn7;QdeQ?H<5T(voKeH5QV4F{2EAu4KO07RNrv-l?n!&G%%G_4*J$dzcaM+YVG@O54> zzzig96U_?w!h7JbNXS-OrsenQ&R=$&aC@kzT%)34ijpfCJPZXzmvq?6ccF~JD1D!$ zU0Q;v-(K;M zXN5ALQ_2PUtXfW;;T*KAG2A1?l#Mp=jIAc(@a7UKEE%)7Z~CU&z9lmFstX(Z?bF90 zWhhJX8dc5i!}L@IVR*0&MFGo~rX5DhjcP6Op}*ditYEv*8$`P1UG%n4&uFu5Jk<+a zScKIE1qgq`-P@A$Wj+sD7Qi&af^-teD|5XfYIue1)LKqUHZjl} zV7!9vHqGXN?+D$cKFf29{Rmz!7-gD=7-JNZy}eE=DYE8tc{R@Z0!QsSC6|u-JlTz8 zd8laz83lA14+%_cd8dH2f|liIcwUVp{%*k4N_0fa9_2f0QO2j45YPkjjC=&^H!h^v z)$t!6mCZbW_K)<_B(L$X4}KkpvkYIRPA7O^KFj;nwypTlZ5IbxAzvy!#sH^4@1*Q* znJz~0X9&k*dhkg!`-Nc-xz|tyDdq>fps?z;@WL?1LD3B}Q%8iP5OkHK$HvhiW&o2?-vF(-ZvC=LN ze#`DWMupqQV}ZPA+3@0)4JM=Y|W-JcR6lm_gK%{=mOM$y!w0s2vBke zfpB6r^Zdb}smcwh{+4DUl}_qIrc`iRGJa`wova)qLVN_0lDe#)m)fIId(K8GeVKxX zQX;$x^gKqx3p!Q_bqDYOny&eWwhT&86O}^f1r$`ouu!9BCA{Vbw4IGrFTS>}P}UY= zN7g^u2ola%Fk;c*+0g>!aJ}2pZXbxY^BwSEHho+z)W88C26=3%5w*4NMnTmddrCfl zFB*hyY%u(+XbD|;3^3iWg7-JptP()@Bez&Tc*MI_I%;$Mt86>|VRKC`L z|GuY8kSUWaXK3aO9R>~&6A{-^UCsP~E(SzI_7l7UM>n4yU^1OvakF_^i$=V|?yw6C zukOE(!d^&+x?-t~Cli>$Md#Sh!n%vXyMKU&U%^}_>;>r&c{r5Or3GXAx=L}Gx0clRrEw=4tAEwt)w-kMUnRIfS6Sa?;v0-Di) z(G~;$*z8Am$c(S1n3MviV-zD~IJrlPB%4h^Iunw?SI%LuNmozu+)2}gZdDn7WunTK znQ%Ztb!kjqj+*99PwvrE#8V~J3gZhKPy~GfsR4OTi77`iJO)NEO>J&%c#KQpN`D+DIaLw9kgjn%@oD5}KAJmlMS{hcor7qIx-5KDY(5<0+8 z^;R}1sMOm0=4;$=3_(^ejWrFKgUul_3sa+TU8m%yzOkTF4S09uDQEJj_M?%VX#57j zD@KFS_knUuR@PS`Pvd)8JH}KPpR?0ikdS@8P;U)Pqs9Ly7A0E>I*GRDP@tC;rRTdP zGihz)I-z~CY5k~}AM%01E2ES=ebqpLSX_6ip7Q%^{^T?Z{{EunLurKAjpgj6RA zVm0G^A_MJV?@jbH!>bwIay47a6!8z1Y5NC`wUFUG4uafUvo=qfRqfQ$1O~e80FOtq zz|w3Qt1quGhMsYG5NVK5bK!`X^0OLs*<{JT%9l$(N_MBVwOWnugB2y3v#a^PkzeQE zvG+vnfIvfJTLP2X!>3THF7B`qI?7$QV3{>UGlzWgtECsSZ~ByZ>F2qG$yK?YQjC#P zAQBslu&1~)nh474I~efP0#nl{`{Gz_J>bu4-}c_VZP2^Qtk)lN)S{H51+&OC-a4

814Us)!IB+1;1(ncNor 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 elementData.length) + { + Object[] elementDataNew = new Object[elementData.length + stepLength]; + System.arraycopy(elementData, 0, elementDataNew, 0, elementData.length); + elementData = elementDataNew; + } + + elementData[size] = o; + size++; + + } + public void add(int index, Object o){ + if(size > elementData.length) + { + Object[] elementDataNew = new Object[elementData.length + stepLength]; + System.arraycopy(elementData, 0, elementDataNew, 0, elementData.length); + elementData = elementDataNew; + } + System.arraycopy(elementData, index, elementData, index+1, size-index+1); + elementData[index] = o; + size++; + + } + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + Object obj = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + size--; + return obj; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + + public String toString() + { + StringBuffer sb = new StringBuffer(); + for(int i=0;i0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group08/283677872/2-26/src/com/coding/basic/Stack.java b/group08/283677872/2-26/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..9c6d9f7985 --- /dev/null +++ b/group08/283677872/2-26/src/com/coding/basic/Stack.java @@ -0,0 +1,31 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop() throws Exception{ + if(isEmpty()) + { + throw new Exception("Stack pop error"); + } + return elementData.remove(elementData.size()-1); + } + + public Object peek() throws Exception{ + if(isEmpty()) + { + throw new Exception("Stack pop error"); + } + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size()>0; + } + public int size(){ + return elementData.size(); + } +} diff --git "a/group08/286060098/2-26/blong/\345\237\272\346\234\254\347\273\223\346\236\204.md" "b/group08/286060098/2-26/blong/\345\237\272\346\234\254\347\273\223\346\236\204.md" new file mode 100644 index 0000000000..23d6a12c12 --- /dev/null +++ "b/group08/286060098/2-26/blong/\345\237\272\346\234\254\347\273\223\346\236\204.md" @@ -0,0 +1,54 @@ +#指令集 +---- +通俗的理解,指令集就是CPU能认识的语言,指令集运行于一定的微架构之上.指令集有很多,比如复杂指令集AMD,INTEL用的,精简指令集ARM用的 + +# CPU +--- +CPU使整个计算机的核心,进行整体的逻辑操作,他的运算速度很快,我们在主机上的操作最终都会变成原子指令由CPU来执行 + +历史上的CPU对程序的执行存在很多的执行方案,比如说时间片法,令牌环之类的的,每个程序依次交换执行,这样就存在一个问题,程序的换入换出需要保留当前执行情况的现场,还要加载历史程序的历史现场 + +这些数据存储在哪里?由于CPU的速度过快,而我们是用的大规模的数据存储一般是价格较低速度较慢的磁盘.如果说CPU直接从磁盘加载,CPU的资源利用率会变的很低,会严重浪费了CPU的运算能力.因此我们需要缓存 + +# 缓存 +--- +缓存的出是为加载相关的数据提供CPU路基运算的存储,CPU中的寄存器就是一种缓存,这是CPU本身对操作的优化.但是说这样高速的缓存本身的制造成本是非常高的,完全使用这样高性能的存储设备并不是一个具有性价比的解决方案 + +因此出现了多级缓存,常见的如INTEL的L1,L2,L3,这是多级缓存的一种实现,随着层级的升高,存储空间在升高,速度在下将,通过诸如LFU、LRU的缓存置换算法优化相关的缓存命中率提高CPU利用率 + +理解 Cache --> 传送门 `http://www.mouseos.com/arch/cache.html` + +即便是L3的缓存也以就是十分昂贵的,依旧是很难大规模使用的存储设备,因此需要速度相对较快,但是价格又是普通用户可以接收的中间设备,比如内存 + +# 内存 +--- +内存的存在实际上解决了很多问题,他的价格相对高速缓存来说相对较低,能够提供较大的存储,也可以看作缓存的一种,将磁盘的数据预加载,供高速缓存加载. + +内存有很多的工作频率,内存主频越高在一定程度上代表着内存所能达到的速度越快,计算机系统的时钟速度是以频率来衡量的.晶体振荡器控制着时钟速度,在石英晶片上加上电压,其就以正弦波的形式震动起来,这一震动可以通过晶片的形变和大小记录下来。晶体的震动以正弦调和变化的电流的形式表现出来,这一变化的电流就是时钟信号. + +内存是一种断电后存储洗洗就会丢失的存储设备,这就尴尬了,对于宕机我们并无法预测,我们需要将众多的资源数据进行存储,这个时候我们需要硬盘. + +# 硬盘 +--- +硬盘对于我们而言他的速度反而是其次的,他最大的意义是数据的安全性.在数据安全的基础之上我们再去追求硬盘的速度. + +硬盘有很多比如说机械硬盘,固态硬盘,PCI硬盘.机械硬盘.机械硬盘的大体结构如下图,数据的读取需要磁头的移动读取扇区上的信息,这时候磁盘的转速就很重要了 +![yingpan.jpg-19.4kB][1] + +固态硬盘可以看作式闪存的堆积,闪存的制造价格的降低带来了他的春天,但是闪存的数据擦除次数有限,固态硬盘的寿命要注意 + + + + + + + + + + + + + + + + [1]: http://static.zybuluo.com/Haipop/finuq0bs9p1d90q38bccqjea/yingpan.jpg \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/AbstractCollection.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/AbstractCollection.java new file mode 100644 index 0000000000..52b095dc23 --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/AbstractCollection.java @@ -0,0 +1,25 @@ +package com.pop.practice.homework.first.collection; + +/** + * @author haipop Date: 17-2-19 Time: 下午3:40 + */ +public abstract class AbstractCollection implements Collection { + + @Override + @SuppressWarnings("unchecked") + public void addAll(Collection collection) throws IllegalAccessException { + Iterator iterator = collection.iterator(); + while (iterator.hasNext()) { + add((T) iterator.next()); + } + } + + @Override + @SuppressWarnings("unchecked") + public void removeAll(Collection collection) { + Iterator iterator = collection.iterator(); + while (iterator.hasNext()) { + remove((T) iterator.next()); + } + } +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Collection.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Collection.java new file mode 100644 index 0000000000..9355d7761f --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Collection.java @@ -0,0 +1,42 @@ +package com.pop.practice.homework.first.collection; + +/** + * @author haipop Date: 17-2-16 Time: 下午6:35 + */ +public interface Collection extends Iterator { + + /** + * 是否为空 + */ + boolean isEmpty(); + + /** + * 获取大小 + */ + int size(); + + /** + * 添加元素 + */ + void add(T element) throws IllegalAccessException; + + /** + * 批量添加元素 + */ + void addAll(Collection collection) throws IllegalAccessException; + + /** + * 删除元素 + */ + void remove(T element); + + /** + * 批量删除元素 + */ + void removeAll(Collection collection); + + /** + * 元素查找,返回索引,找不到返回-1 + */ + int contain(T element); +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Iterator.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Iterator.java new file mode 100644 index 0000000000..0bbe4fa605 --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Iterator.java @@ -0,0 +1,23 @@ +package com.pop.practice.homework.first.collection; + +/** + * @author haipop Date: 17-2-16 Time: 下午6:34 + */ +public interface Iterator { + + /** + * 实例化 + */ + Iterator iterator(); + + /** + * 是否存在下一个 + */ + boolean hasNext(); + + /** + * 获取下一个元素 + */ + T next(); + +} diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/ArrayList.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/ArrayList.java new file mode 100644 index 0000000000..9c355cc8b4 --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/ArrayList.java @@ -0,0 +1,166 @@ +package com.pop.practice.homework.first.collection.list; + +import java.io.Serializable; +import java.util.Objects; + +import com.pop.practice.homework.first.collection.AbstractCollection; +import com.pop.practice.homework.first.collection.Iterator; +import com.pop.practice.homework.utils.Math; + +/** + * @author haipop Date: 17-2-16 Time: 下午6:33 + */ +public class ArrayList extends AbstractCollection implements List, Serializable { + + private static final long serialVersionUID = -3408657766857424074L; + + /** + * 阈值 + */ + private static final double THRESHOLD = 0.75F; + + /** + * 大小 + */ + private int size; + + /** + * 当前的存储位置 + */ + private int flag; + + /** + * 元素集合 + */ + private Object[] store; + + /** + * 是否容量自增 + */ + private boolean autoIncrement; + + /** + * 遍历器 + */ + private Iterator iterator; + + /** + * 默认无参 + */ + public ArrayList() { + this.size = 8; + this.flag = 0; + this.autoIncrement = true; + this.store = new Object[this.size]; + } + + /** + * 指定大小,不可自增 + */ + public ArrayList(int size) { + this.size = size; + this.flag = 0; + this.autoIncrement = false; + this.store = new Object[size]; + } + + @Override + public Iterator iterator() { + this.iterator = new ArrayListIterator(); + return iterator; + } + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + @SuppressWarnings("unchecked") + public T next() { + return (T) iterator.next(); + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public int size() { + return flag; + } + + @Override + public void add(T element) throws IllegalAccessException { + assessStore(flag + 1, size, store, flag); + flag++; + this.store[flag] = element; + } + + private void assessStore(int left, int size, Object[] store, int flag) throws IllegalAccessException { + if (!autoIncrement) { + return; + } + double coefficient = Math.div(left, size); + if (coefficient > THRESHOLD) { + // 达到阈值,拓展 + Object[] newStore = new Object[this.size * 2]; + System.arraycopy(store, 0, newStore, 0, flag); + this.store = newStore; + this.size = size * 2; + } + } + + @Override + public void remove(T element) { + for (int i = 0; i < flag; i++) { + if (Objects.equals(this.store[i], element)) { + System.arraycopy(store, i + 1, store, i, flag - i); + flag--; + break; + } + } + } + + @Override + public int contain(T element) { + int result = -1; + for (int i = 0; i < flag; i++) { + if (Objects.equals(element, store[i])) { + return i; + } + } + return result; + } + + @Override + @SuppressWarnings("uncheckd") + public T get(int index) throws IndexOutOfBoundsException { + return (T) this.store[index]; + } + + private class ArrayListIterator implements Iterator { + + private int index; + + ArrayListIterator() { + index = 0; + } + + @Override + public Iterator iterator() { + return new ArrayListIterator(); + } + + @Override + public boolean hasNext() { + return index < size; + } + + @Override + public Object next() { + return store[index++]; + } + } +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/LinkedList.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/LinkedList.java new file mode 100644 index 0000000000..874195596e --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/LinkedList.java @@ -0,0 +1,240 @@ +package com.pop.practice.homework.first.collection.list; + +import java.io.Serializable; +import java.util.Objects; + +import com.pop.practice.homework.first.collection.AbstractCollection; +import com.pop.practice.homework.first.collection.Iterator; + +/** + * @author haipop Date: 17-2-16 Time: 下午6:34 + */ +public class LinkedList extends AbstractCollection implements List, Serializable { + + private static final long serialVersionUID = 365915684200725970L; + + /** + * 头节点 + */ + private Node head; + + /** + * 尾节点 + */ + private Node tail; + + /** + * 标记位 + */ + private int flag; + + /** + * 遍历器 + */ + private Iterator iterator; + + public LinkedList() { + this.head = new Node(); + this.tail = new Node(); + this.flag = 0; + this.head.setNext(tail); + } + + @Override + public boolean isEmpty() { + return this.flag == 0; + } + + @Override + public int size() { + return this.flag; + } + + @Override + public void add(T element) throws IllegalAccessException { + if (this.head.getData() == null) { + this.head.setData(element); + flag++; + return; + } + if (this.tail.getData() == null) { + this.tail.setData(element); + this.tail.setBefore(this.head); + flag++; + return; + } + Node node = new Node(element); + node.setBefore(this.tail); + this.tail.next = node; + this.tail = node; + flag++; + } + + @Override + public void remove(T element) { + if (this.head == null) { + return; + } + Node tmp = this.head; + while (tmp.next != null) { + if (Objects.equals(tmp.getData(), element)) { + if (tmp == this.head) { + if (this.tail.getData() == null) { + this.head.setData(null); + } else { + this.head = this.head.next; + this.head.before = null; + } + flag--; + return; + } + Node next = tmp.next; + Node before = tmp.before; + if (next == null) { + before.setNext(null); + } else { + before.setNext(next); + } + next.setBefore(before); + flag--; + tmp = null; + } + tmp = tmp.next; + } + } + + @Override + public int contain(T element) { + Node tmp = this.head; + int index = 0; + while (tmp.next != null) { + if (Objects.equals(tmp.getData(), element)) { + return index; + } else { + tmp = tmp.next; + index++; + } + } + return -1; + } + + @Override + public T get(int index) throws IndexOutOfBoundsException { + Node tmp = this.head; + for (int i = 1; i < index; i++) { + if (tail == tmp) { + // 到最后还没到指定位置,越界 + throw new IndexOutOfBoundsException(); + } + tmp = tmp.getNext(); + } + return tmp.getData(); + } + + @Override + public Iterator iterator() { + this.iterator = new LinkListIterator(); + return iterator; + } + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + @SuppressWarnings("unchecked") + public T next() { + return (T) iterator.next(); + } + + private class LinkListIterator implements Iterator { + + private Node cache; + + LinkListIterator() { + cache = head; + } + + @Override + public Iterator iterator() { + return new LinkListIterator(); + } + + @Override + public boolean hasNext() { + return cache.getNext() == null; + } + + @Override + public Object next() { + return cache.getNext(); + } + } + + /** + * 链表节点类 --> 这里做了双向链表,这里如果是一个跳表的话查询性能会更好一点 + */ + private class Node implements Serializable { + + private static final long serialVersionUID = 6327349429030778592L; + /** + * 数据 + */ + private T data; + + /** + * 下一节点 + */ + private Node before; + + /** + * 下一节点 + */ + private Node next; + + Node() { + } + + Node(T data) { + this.data = data; + this.next = null; + } + + Node(T data, Node before) { + this.data = data; + this.before = before; + } + + Node(T data, Node before, Node next) { + this.data = data; + this.before = before; + this.next = next; + } + + T getData() { + return data; + } + + void setData(T data) { + this.data = data; + } + + Node getBefore() { + return before; + } + + void setBefore(Node before) { + this.before = before; + } + + Node getNext() { + return next; + } + + void setNext(Node next) { + this.next = next; + } + } + +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/List.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/List.java new file mode 100644 index 0000000000..7be9392b75 --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/List.java @@ -0,0 +1,14 @@ +package com.pop.practice.homework.first.collection.list; + +import com.pop.practice.homework.first.collection.Collection; + +/** + * @author haipop Date: 17-2-19 Time: 下午4:03 + */ +public interface List extends Collection { + + /** + * 获取指定位置元素 + */ + T get(int index) throws IndexOutOfBoundsException; +} diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/LinkQueue.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/LinkQueue.java new file mode 100644 index 0000000000..bb371d64ca --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/LinkQueue.java @@ -0,0 +1,202 @@ +package com.pop.practice.homework.first.collection.queue; + +import java.io.Serializable; +import java.util.Objects; + +import com.pop.practice.homework.first.collection.AbstractCollection; +import com.pop.practice.homework.first.collection.Collection; +import com.pop.practice.homework.first.collection.Iterator; + +/** + * @author haipop Date: 17-2-16 Time: 下午6:34 + */ +public class LinkQueue extends AbstractCollection implements Queue, Serializable { + + private static final long serialVersionUID = 7942321140756962637L; + + /** + * 头节点 + */ + private Node head; + + /** + * 尾节点,伪节点,这个节点指用来指上一个 + */ + private Node tail; + + /** + * 现有的元素个数 + */ + private int size; + + /** + * 遍历器 + */ + private Iterator iterator; + + public LinkQueue() { + this.size = 0; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public int size() { + return size; + } + + @Override + public void add(T element) throws IllegalAccessException { + if (this.head == null) { + this.head = new Node(element); + this.tail.setBefore(this.head); + this.size++; + return; + } + Node node = new Node(element); + node.setBefore(null); + node.setNext(this.head.getNext()); + this.head.getNext().setBefore(node); + this.head = node; + this.size++; + } + + @Override + public void remove(T element) { + if (isEmpty()) { + throw new IndexOutOfBoundsException(); + } + Node tmp = this.head; + while (tmp.getNext() == null && tmp.getNext() != this.tail) { + if (Objects.equals(tmp.getData(), element)) { + Node before = tmp.getBefore(); + Node next = tmp.getNext(); + before.setNext(next); + next.setBefore(before); + tmp = null; + break; + } + tmp = tmp.getNext(); + } + } + + @Override + public void push(T element) throws IllegalAccessException { + add(element); + } + + @Override + public void push(Collection collection) throws IllegalAccessException { + addAll(collection); + } + + @Override + public int contain(T element) { + Node tmp = this.head; + int index = 0; + while (tmp.next != null && tmp != this.tail) { + if (Objects.equals(tmp.getData(), element)) { + return index; + } else { + tmp = tmp.next; + index++; + } + } + return -1; + } + + @Override + public T pull() { + if (isEmpty()) { + throw new IndexOutOfBoundsException(); + } + Node node = this.tail.getBefore(); + this.tail.setBefore(node.getBefore()); + size--; + return node.getData(); + } + + @Override + public Iterator iterator() { + this.iterator = new LinkQueueIterator(); + return iterator; + } + + @Override + public boolean hasNext() { + return this.iterator.hasNext(); + } + + @Override + @SuppressWarnings("unchecked") + public T next() { + return (T) this.iterator.next(); + } + + private class LinkQueueIterator implements Iterator { + + private Node cache; + + LinkQueueIterator() { + this.cache = head; + } + + @Override + public Iterator iterator() { + return new LinkQueueIterator(); + } + + @Override + public boolean hasNext() { + return cache.getNext() == tail; + } + + @Override + public T next() { + return cache.getNext().getData(); + } + } + + private class Node implements Serializable { + + private static final long serialVersionUID = 6400564182277299061L; + + private T data; + + private Node before; + + private Node next; + + Node(T data) { + this.data = data; + } + + T getData() { + return data; + } + + void setData(T data) { + this.data = data; + } + + Node getBefore() { + return before; + } + + void setBefore(Node before) { + this.before = before; + } + + Node getNext() { + return next; + } + + void setNext(Node next) { + this.next = next; + } + } + +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/Queue.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/Queue.java new file mode 100644 index 0000000000..92f46378e0 --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/Queue.java @@ -0,0 +1,26 @@ +package com.pop.practice.homework.first.collection.queue; + +import com.pop.practice.homework.first.collection.Collection; + +/** + * 更符合Queue语义的方法 + * + * @author haipop Date: 17-2-19 Time: 下午3:23 + */ +public interface Queue extends Collection { + + /** + * 添加元素 + */ + void push(T element) throws IllegalAccessException; + + /** + * 添加元素 + */ + void push(Collection collection) throws IllegalAccessException; + + /** + * 取元素,删除最后一个并返回 + */ + T pull(); +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/LinkStack.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/LinkStack.java new file mode 100644 index 0000000000..c9a0edd124 --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/LinkStack.java @@ -0,0 +1,94 @@ +package com.pop.practice.homework.first.collection.stack; + +import java.io.Serializable; + +import com.pop.practice.homework.first.collection.AbstractCollection; +import com.pop.practice.homework.first.collection.Iterator; +import com.pop.practice.homework.first.collection.list.LinkedList; +import com.pop.practice.homework.first.collection.list.List; + +/** + * @author haipop Date: 17-2-16 Time: 下午6:33 + */ +public class LinkStack extends AbstractCollection implements Stack, Serializable { + + private static final long serialVersionUID = -2813631170103864318L; + + /** + * 数据存储 + */ + private List cache; + + /** + * 数据量 + */ + private int size; + + /** + * 遍历器 + */ + private Iterator iterator; + + public LinkStack() { + this.size = 0; + this.cache = new LinkedList(); + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public int size() { + return size; + } + + @Override + public void push(T element) throws IllegalAccessException { + this.cache.add(element); + size++; + } + + @Override + public void add(T element) throws IllegalAccessException { + this.cache.add(element); + size++; + } + + @Override + public T pull() throws IndexOutOfBoundsException { + T result = this.cache.get(size - 1); + size--; + return result; + } + + @Override + public void remove(T element) { + cache.remove(element); + size--; + } + + @Override + public int contain(T element) { + return cache.contain(element); + } + + @Override + public Iterator iterator() { + this.iterator = this.cache.iterator(); + return iterator; + } + + @Override + public boolean hasNext() { + return this.iterator.hasNext(); + } + + @Override + @SuppressWarnings("unchecked") + public T next() { + return (T) this.iterator.next(); + } + +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/Stack.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/Stack.java new file mode 100644 index 0000000000..c9ea66dd2b --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/Stack.java @@ -0,0 +1,22 @@ +package com.pop.practice.homework.first.collection.stack; + +import com.pop.practice.homework.first.collection.Collection; + +/** + * + * 更符合Stack语义的方法 + * + * @author haipop Date: 17-2-19 Time: 下午3:50 + */ +public interface Stack extends Collection { + + /** + * 添加元素 + */ + void push(T element) throws IllegalAccessException; + + /** + * 取元素 + */ + T pull(); +} diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/AbstractTree.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/AbstractTree.java new file mode 100644 index 0000000000..4e86940103 --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/AbstractTree.java @@ -0,0 +1,29 @@ +package com.pop.practice.homework.first.tree; + +import com.pop.practice.homework.first.collection.Iterator; +import com.pop.practice.homework.first.collection.list.List; + +/** + * @author haipop Date: 17-2-20 Time: 上午9:53 + */ +public abstract class AbstractTree implements Tree { + + @Override + public void addNode(T[] elements) throws IllegalAccessException { + for (T ele : elements) { + addNode(ele); + } + } + + @Override + @SuppressWarnings("unchecked") + public void addNode(List elements) throws IllegalAccessException { + Iterator iterator = elements.iterator(); + while (iterator.hasNext()) { + addNode((T) iterator.next()); + } + } + + + protected abstract void addNode(T elements) throws IllegalAccessException; +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryNode.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryNode.java new file mode 100644 index 0000000000..db34c48460 --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryNode.java @@ -0,0 +1,40 @@ +package com.pop.practice.homework.first.tree; + +class BinaryNode { + + private T data; + + private BinaryNode left; + + private BinaryNode right; + + public BinaryNode(T data, BinaryNode left, BinaryNode right) { + this.data = data; + this.left = left; + this.right = right; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public BinaryNode getLeft() { + return left; + } + + public void setLeft(BinaryNode left) { + this.left = left; + } + + public BinaryNode getRight() { + return right; + } + + public void setRight(BinaryNode right) { + this.right = right; + } +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryTree.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryTree.java new file mode 100644 index 0000000000..eff95ec6f9 --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryTree.java @@ -0,0 +1,125 @@ +package com.pop.practice.homework.first.tree; + +import java.io.Serializable; + +import com.pop.practice.homework.first.collection.queue.LinkQueue; +import com.pop.practice.homework.first.collection.queue.Queue; + +/** + * 左大右小 + * + * @author haipop Date: 17-2-20 Time: 上午9:42 + */ +public class BinaryTree extends AbstractTree implements Serializable { + + private static final long serialVersionUID = -1467347526158258388L; + + /** + * 根节点 + */ + private BinaryNode root; + + @Override + @SuppressWarnings("unchecked") + protected void addNode(T elements) throws IllegalAccessException { + if (root == null) { + root = new BinaryNode(elements, null, null); + } + BinaryNode newNode = new BinaryNode<>(elements, null, null); + Queue queue = new LinkQueue<>(); + queue.add(root); + while (queue.isEmpty()) { + BinaryNode node = queue.pull(); + if (((Comparable) node.getData()).compareTo(elements) > 0) { + if (node.getRight() == null) { + node.setRight(newNode); + break; + } else { + queue.add(node.getRight()); + } + } else if (((Comparable) node.getData()).compareTo(elements) < 0) { + if (node.getLeft() == null) { + node.setLeft(newNode); + break; + } else { + queue.add(node.getLeft()); + } + } + } + } + + @Override + @SuppressWarnings("unchecked") + public void removeNode(T elements) throws IllegalAccessException { + if (root == null) { + return; + } + root = removeNode(elements, root); + } + + @SuppressWarnings("unchecked") + private BinaryNode removeNode(T element, BinaryNode node) { + BinaryNode left = node.getLeft(); + BinaryNode right = node.getRight(); + if (node.getData().compareTo(element) > 0) { + BinaryNode removeNode = removeNode(element, right); + moveNode(element, node, left, right, removeNode); + node.setRight(removeNode); + } else if (node.getData().compareTo(element) < 0) { + BinaryNode removeNode = removeNode(element, left); + moveNode(element, node, left, right, removeNode); + node.setLeft(removeNode); + } + if (left != null) { + return left; + } else if (right != null) { + return right; + } else { + return null; + } + } + + @SuppressWarnings("unchecked") + private void moveNode(T element, BinaryNode node, BinaryNode left, BinaryNode right, + BinaryNode removeNode) { + if (removeNode.getData().compareTo(right) > 0) { + BinaryNode tmp = removeNode.getRight(); + while (tmp != null) { + tmp = tmp.getRight(); + } + tmp.setRight(left.getRight()); + } else if (node.getData().compareTo(element) < 0) { + BinaryNode tmp = removeNode.getLeft(); + while (tmp != null) { + tmp = tmp.getLeft(); + } + tmp.setLeft(right.getLeft()); + } + } + + @Override + @SuppressWarnings("unchecked") + public boolean contain(T data) throws IllegalAccessException { + if (root == null) { + return false; + } + Queue queue = new LinkQueue<>(); + queue.add(root); + while (queue.isEmpty()) { + BinaryNode node = queue.pull(); + if (((Comparable) node.getData()).compareTo(data) > 0) { + if (node.getRight() != null) { + queue.add(node.getRight()); + } + } else if (((Comparable) node.getData()).compareTo(data) < 0) { + if (node.getLeft() == null) { + queue.add(node.getLeft()); + } + } else { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/Tree.java b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/Tree.java new file mode 100644 index 0000000000..174a98bc2c --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/first/tree/Tree.java @@ -0,0 +1,30 @@ +package com.pop.practice.homework.first.tree; + +import com.pop.practice.homework.first.collection.list.List; + +/** + * @author haipop Date: 17-2-19 Time: 下午5:12 + */ +public interface Tree { + + /** + * 添加节点 + */ + void addNode(T... elements) throws IllegalAccessException; + + /** + * 添加节点 + */ + void addNode(List elements) throws IllegalAccessException; + + /** + * 删除节点 + */ + void removeNode(T element) throws IllegalAccessException; + + /** + * 节点查找,找到返回节点信息,找不到返回null + */ + boolean contain(T data) throws IllegalAccessException; + +} \ No newline at end of file diff --git a/group08/286060098/2-26/src/com/pop/practice/homework/utils/Math.java b/group08/286060098/2-26/src/com/pop/practice/homework/utils/Math.java new file mode 100644 index 0000000000..b20c1bb486 --- /dev/null +++ b/group08/286060098/2-26/src/com/pop/practice/homework/utils/Math.java @@ -0,0 +1,29 @@ +package com.pop.practice.homework.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * @author haipop Date: 17-2-18 Time: 下午1:00 + */ +public class Math { + + public static double div(int left, int right) throws IllegalAccessException { + return div((double) left, (double) right, 2); + } + + public static double div(int left, int right, int scale) throws IllegalAccessException { + return div((double) left, (double) right, scale); + } + + @SuppressWarnings("unchecked") + public static double div(double left, double right, int scale) throws IllegalAccessException { + // 如果精确范围小于0,抛出异常信息 + if (scale < 0) { + throw new IllegalAccessException("精确度不能小于0"); + } + BigDecimal divisor = new BigDecimal(left); + BigDecimal dividend = new BigDecimal(right); + return divisor.divide(dividend, scale, RoundingMode.HALF_EVEN).doubleValue(); + } +} \ No newline at end of file diff --git a/group08/286060098/readme.md b/group08/286060098/readme.md new file mode 100644 index 0000000000..a6325e29da --- /dev/null +++ b/group08/286060098/readme.md @@ -0,0 +1,17 @@ +# Module说明 + +--- + +### 文件夹说明 +| 文件夹 | 描述   | +| -------- | :----: | +| blong |相关的说明文档,博客 | +| script | 相关的脚本信息,如有sql脚本也请在这里查找 | +| src | 代码目录| + +### 代码说明 + +> 作业在homework目录下 + + + diff --git a/group08/406166841/2-26/CPU.md b/group08/406166841/2-26/CPU.md new file mode 100644 index 0000000000..0184372f60 --- /dev/null +++ b/group08/406166841/2-26/CPU.md @@ -0,0 +1,76 @@ +CPU:中央处理单元(Cntral Pocessing Uit)的缩写,也叫处理器,是计算机的运算核心和控制核心。人靠大脑思考,电脑靠CPU来运算、控制。让电脑的各个部件顺利工作,起到协调和控制作用。 + +内存:1. 负责硬盘等硬件上的数据与CPU之间数据交换处理;2. 缓存系统中的临时数据。3. 断电后数据丢失。 +硬盘:存储资料和软件等数据的设备,有容量大,断电数据不丢失的特点。也被人们称之为“数据仓库”。 + +现在我们来说一下CPU、硬盘、内存三者之间的关系。 + +首先 ,我们先回想一下三者的作用: + +CPU:是计算机的运算核心和控制核心,让电脑的各个部件顺利工作,起到协调和控制作用。 +硬盘:存储资料和软件等数据的设备,有容量大,断电数据不丢失的特点。也被人们称之为“数据仓库”。 +内存:1. 负责硬盘等硬件上的数据与CPU之间数据交换处理;2. 缓存系统中的临时数据。3. 断电后数据丢失。 + +然后, 我们再来看一下程序是如何执行起来的。 + +当我们在电脑上打开QQ时(右键-打开 或者双击QQ图标),其实是通过鼠标(输入设备)向CPU发送了一条命令,CPU接收到这条命令后,QQ程序就从硬盘里被加载到内存(加载时不通过处理器,直接从硬盘加载程序到内存里),加载完成后,CPU就开始执行QQ程序。程序执行起来后,CPU可以让QQ程序显示在我们的在显示器上。也就是你看到了QQ 程序运行起来了。如果这个时候,你用QQ截取了一张屏幕的图片,那么这张图片会首先保存到内存,在没有退出截屏状态时,你可以在这张图片上写字、画线条,等你右键保存这张图片的时候,这张图片就会保存到硬盘里。 + +通过了解一个程序是如何运行起来的,我们就可以了解三者是如何工作的 。 + +可能有些人会不明白,如果程序是这样执行起来的话,那么为什么CPU不直接在硬盘里执行程序,而非要把程序放到内存后在执行呢? + +因为速度差别太大: +内存存取数据的速度比硬盘的存取速度快了10倍, 在某些环境里,硬盘和内存之间的速度差距可能会更大。 + +而CPU的速度比内存不知还要快多少倍。当我们把程序从硬盘放到内存以后,CPU就直接在内存运行程序,这样比CPU直接在硬盘运行程序就要快很多。 + +内存解决了一部分CPU运行过快,而硬盘数据存取太慢的问题。 提高了我们的电脑的运行速度。 + +内存就如同一条“高速车道”一般,数据由传输速度较慢的硬盘通过这条高速车道传送至CPU进行处理! + +但内存是带电存储的(一旦断电数据就会消失),而且容量有限,所以要长时间储存程序或数据就需要使用硬盘。 + +其实内存在这里起了两个作用: + +1. 保存从硬盘读取的数据,提供给CPU使用 + +2. 保存CPU的一些临时执行结果,以便CPU下次使用或保存到硬盘 + + + +数字电子中有各种逻辑功能,最简单的是与或非,数字电子中用01表示数据比如你表示 12(10进制) + +12 = 8*1+4*1+2*0+1*0表示为 1100你可以试试所有数字都可以这么表示出来,而1和0在数电中用"高电平","低电平"表示,说白了就是通电表示1断电表示0. + +硅片上的集成电路可以把这些门电路作到非常小,这样人们用各种逻辑电路就能实现复杂的计算器功能, + +我们姑且认为只能算加减乘除吧.你想算什么算式都可以用逻辑电路来实现.但是人们往往想算的东西都比较复杂比如这个 + +1*1+2*2+3*3+4*4...10000000*10000000 + +如果一次运算需要一个逻辑电路,那么这就需要2*10000000个逻辑电路, + +额,恕我直言,这个成本有点高, + +于是人们想到了一个好办法,就是做一个逻辑器件,有2个输入,分别是数据输入,指令输入,数据输入就是输入要运算的两个数据,指令输入输入让这个器件干什么,比如00就是做加法,01就是做减法,10是乘法,11是除法,然后给他配个储存设备用来保存数据,这样我们让这一个设备不断的运行,按照一定规则把输出的数据送回输入就能完成上面提到的运算了. + +后来这个设备被称为CPU, + +CPU除了运算逻辑以外,还能执行: 1 移动数据 2 逻辑运算 3 跳转指令 还有些杂七杂八的指令 + +移动数据就是把输出的数据送回输入的指令,通常数据存储在寄存器或者RAM中,储存器就像游泳馆的柜子,上面有个编号,里面存了个数字.后来编号被程序猿称为地址. + +有了这些我们还有一件事没做,想想是什么? + +就是告诉CPU,今天要做的指令,最开始指令是存储在穿孔纸带上的,现在是储存在硬盘里的 + +CPU一个一个地读进来,读一个执行一个操作.因此执行上面的操作要在纸带上打 2*10000000个以上的孔,这也有点麻烦 + +幸好我们的运算是有规律的,因此我们可以让纸带走一走倒带再走一走,直到某个条件满足了为止.这样的指令就是转移指令。 + +from: + +http://www.guokr.com/question/482025/ + + + diff --git a/group08/406166841/2-26/CustomArrayList.java b/group08/406166841/2-26/CustomArrayList.java new file mode 100644 index 0000000000..46dbe3d40d --- /dev/null +++ b/group08/406166841/2-26/CustomArrayList.java @@ -0,0 +1,92 @@ +package net.iyouqu.bruceretrofit.util.java; + +import java.util.Arrays; + +/** + * Created by liq on 2017/2/25. + */ + +public class CustomArrayList implements List { + + private int size = 0; + + private final static int DEFAULT_CAPACITY = 10; + private final static int MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8; + + private Object[] elementData = new Object[DEFAULT_CAPACITY]; + private String desc = "index超过界限"; + + @Override + public void add(Object o) { + isCapacityEnough(size + 1); + elementData[size++] = o; + } + + @Override + public void add(int index, Object o) { + checkRangeForAdd(index); + isCapacityEnough(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + @Override + public Object get(int index) { + checkRange(index); + return elementData[index]; + } + + @Override + public Object remove(int index) { + Object value = get(index); + int moveSize = size - index - 1; + if (moveSize > 0){ + System.arraycopy(elementData,index + 1, elementData,index,size - index - 1); + } + elementData[--size] = null; + return value; + } + + @Override + public int size() { + return size; + } + + private void checkRange(int index) { + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(desc); + } + } + + private void checkRangeForAdd(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(desc); + } + } + + private void explicitCapacity(int capacity) { + int newLength = elementData.length * 2; + if (newLength - capacity < 0) { + newLength = capacity; + } + if (newLength > (MAX_ARRAY_LENGTH)) { + newLength = (capacity > MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH); + } + elementData = Arrays.copyOf(elementData, newLength); + } + + private void isCapacityEnough(int size) { + if (size > DEFAULT_CAPACITY) { + explicitCapacity(size); + } + if (size < 0) { + throw new OutOfMemoryError(); + } + } + + public Iterator iterator() { + return null; + } + +} diff --git a/group08/406166841/2-26/CustomLinkedList.java b/group08/406166841/2-26/CustomLinkedList.java new file mode 100644 index 0000000000..532b9b8eaf --- /dev/null +++ b/group08/406166841/2-26/CustomLinkedList.java @@ -0,0 +1,172 @@ +package net.iyouqu.bruceretrofit.util.java; + +/** + * Created by liq on 2017/2/25. + */ + +public class CustomLinkedList implements List { + + //链表长度 + private int size = 0; + //链表头指针 + private Node first; + //链表尾部指针 + private Node last; + //操作次数 + private int modCount; + + @Override + public void add(Object o) { + linkLast(o); + } + + @Override + public void add(int index, Object o) { + checkPositionIndex(index); + if (index == size) { + linkLast(o); + } else { + linkBefore(o, node(index)); + } + } + + @Override + public Object get(int index) { + checkPositionIndex(index); + return node(index).data; + } + + @Override + public Object remove(int index) { + checkPositionIndex(index); + return unlink(node(index)); + } + + @Override + public int size() { + return size; + } + + /** + * 添加节点到链表尾部 + */ + public void addLast(Object e) { + linkLast(e); + } + + /** + * 解除传入节点的属性,并且将传入节点的上一个和下一个节点 链接。使传入节点的属性 全部为 null + */ + private Object unlink(Node node) { + //获取当前节点node的属性 + final Object element = node.data; + final Node next = node.next; + final Node prev = node.prev; + if (prev == null) { + //上一个节点为null将首节点设置为下一个节点 + first = next; + } else { + //上一个节点有 将上一个节点的下一个节点 设置为当前节点的下一个节点 + prev.next = next; + //将当前节点的上一个节点设置为null + node.prev = null; + } + if (next == null) { + //下一个节点为null将末尾节点设置为上一个节点 + last = prev; + } else { + //将下一个节点的上一个节点 设置为当前节点的上一个节点 + next.prev = prev; + node.next = null; + } + node.data = null; + size--; + modCount++; + return element; + } + + /** + * 获取一个节点 + * 判断index 在前半区间还是后半区间。而不是一直从头到尾搜索 + * 将节点访问复杂度从O(n)变为O(n/2) + */ + private Node node(int index) { + checkPositionIndex(index); + if (index < (size / 2)) { + Node x = first; + for (int i = 0; i < index; i++) { + x = x.next; + } + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) { + x = x.prev; + } + return x; + } + } + + /** + * 在参数节点之前插入一个节点 + */ + private void linkBefore(Object element, Node node) { + //获取添加节点的上一个节点 + final Node pred = node.prev; + //创建一个新节点 + final Node newNode = new Node<>(pred, element, node); + //添加节点的上一个节点为 新节点 + node.prev = newNode; + //判断上一个节点是否为null + if (pred == null) { + //首节点设置为新创建的节点 + first = newNode; + } else { + //上个节点不为null。将其下个节点设置为新创建的节点。 + pred.next = newNode; + } + size++; + modCount++; + } + + /** + * 链接 节点到 last + */ + private void linkLast(Object e) { + final Node l = last; + final Node newNode = new Node<>(l, e, null); + last = newNode; + //判断链表last是否为null + if (l == null) { + //链表first指向新添加的 节点 + first = newNode; + } else { + //链表last不为null将链表last节点的的next设置为新节点 + l.next = newNode; + } + size++; + modCount++; + } + + /** + * 检查index是否越界 + */ + private void checkPositionIndex(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("index超过界限"); + } + } + + private static class Node { + Object data; + //下一个节点 + Node next; + //上一个节点 + Node prev; + public Node(Node prev, Object item, Node next) { + this.data = item; + this.next = next; + this.prev = prev; + } + } +} diff --git a/group08/406166841/2-26/CustomQueue.java b/group08/406166841/2-26/CustomQueue.java new file mode 100644 index 0000000000..00f3d89f6d --- /dev/null +++ b/group08/406166841/2-26/CustomQueue.java @@ -0,0 +1,51 @@ +package net.iyouqu.bruceretrofit.util.java; + +/** + * Created by liq on 2017/2/25. + */ + +public class CustomQueue { + + Object[] data = null; + //容量 + private int capacity; + //队尾指针 + private int tail; + + CustomQueue(int initSize) { + if (initSize >= 0) { + this.capacity = initSize; + data = new Object[initSize]; + tail = 0; + } else { + throw new RuntimeException("初始化大小不能小于0" + initSize); + } + } + + public void enQueue(E o){ + ensureCapacity(); + data[tail] = o; + tail++; + } + + public E deQueue(){ + return (E) data[0]; + } + + public boolean isEmpty(){ + return tail == 0; + } + + public int size(){ + return tail; + } + + private void ensureCapacity() { + if (tail == capacity) { + capacity *= 2; + Object[] newData = new Object[capacity]; + System.arraycopy(data, 0, newData, 0, tail); + data = newData; + } + } +} diff --git a/group08/406166841/2-26/CustomStack.java b/group08/406166841/2-26/CustomStack.java new file mode 100644 index 0000000000..c83c7aee78 --- /dev/null +++ b/group08/406166841/2-26/CustomStack.java @@ -0,0 +1,70 @@ +package net.iyouqu.bruceretrofit.util.java; + +import java.util.ArrayList; + +/** + * Created by liq on 2017/2/25. + */ + +public class CustomStack { + + //重载因子 + private static final float LOAD_FACTOR = 0.75f; + //需要扩充容量时的大小 + private int resizeCapacity; + private Object[] data = null; + //栈容量 + private int capacity; + //栈顶 + private int top; + + public CustomStack(int initSize) { + if (initSize >= 0) { + this.capacity = initSize; + data = new Object[initSize]; + top = 0; + this.resizeCapacity = (int) (capacity * LOAD_FACTOR); + } else { + throw new RuntimeException("初始化大小不能小于0:" + initSize); + } + } + + private ArrayList elementData = new ArrayList(); + + public void push(E o){ + checkStackCapacity(); + data[top] = o; + top++; + } + + public E pop(){ + if(top<=0) + throw new RuntimeException("没有元素不能弹出"); + E e = (E) data[top - 1]; + data[top-1] = null; + --top; + return e; + } + + public E peek(){ + + return (E) data[top - 1]; + + } + public boolean isEmpty(){ + return top == 0; + } + public int size(){ + return top; + } + + private void checkStackCapacity() { + if (top == resizeCapacity) { + capacity = capacity * 2; + Object[] newData = new Object[capacity]; + System.arraycopy(data, 0, newData, 0, top); + data = newData; + } + } + +} diff --git a/group08/406166841/2-26/Iterator.java b/group08/406166841/2-26/Iterator.java new file mode 100644 index 0000000000..2a90aac57b --- /dev/null +++ b/group08/406166841/2-26/Iterator.java @@ -0,0 +1,10 @@ +package net.iyouqu.bruceretrofit.util.java; + +/** + * Created by liq on 2017/2/25. + */ + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group08/406166841/2-26/List.java b/group08/406166841/2-26/List.java new file mode 100644 index 0000000000..b302910fb0 --- /dev/null +++ b/group08/406166841/2-26/List.java @@ -0,0 +1,13 @@ +package net.iyouqu.bruceretrofit.util.java; + +/** + * Created by liq on 2017/2/25. + */ + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group08/406166841/406166841.md b/group08/406166841/406166841.md new file mode 100644 index 0000000000..aef5098754 --- /dev/null +++ b/group08/406166841/406166841.md @@ -0,0 +1 @@ +406166841 \ No newline at end of file diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/ArrayList.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/ArrayList.java" new file mode 100644 index 0000000000..4e31d64920 --- /dev/null +++ "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/ArrayList.java" @@ -0,0 +1,92 @@ +package com.coding.basic; + +public class ArrayList implements List { + // size不仅是ArrayList中实际存值得体现,直接add时,也是在elementData[size]处进行 + private int size = 0; + // 数组是连续且有序的 + private Object[] elementData; + + private void resize(int newSize) { + Object[] newArray = new Object[newSize]; + System.arraycopy(elementData, 0, newArray, 0, size); + elementData = newArray; + } + + public ArrayList() { + elementData = new Object[10]; + } + + // 添加指定元素至列表尾 + public void add(Object o) { + if (size == elementData.length) { + resize(size * 2); + } + elementData[size++] = o; + } + + // 将指定元素插入列表中的指定位置。移动当前位置的元素(如果有的话)和右边的后续元素(向索引添加一个元素) + public void add(int index, Object o) { + rangeCheck(index); + if (size == elementData.length / 4) { + resize(elementData.length / 2); + } + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + /* + * 获取指定位置元素 + * (non-Javadoc) + * @see com.coding.basic.List#get(int) + */ + public Object get(int index) { + rangeCheck(index); + return elementData[index]; + } + + /* + * 删除指定位置元素 + * (non-Javadoc) + * @see com.coding.basic.List#remove(int) + */ + public Object remove(int index) { + rangeCheck(index); + Object oldValue = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return oldValue; + } + + public int size() { + return this.size; + } + + public Iterator iterator() { + return new ArrayListIterator(); + } + + // 检测索引值,当前有size个元素,占了elementData[0]至elementData[size-1],add时,只能在已有[0,size-1]处插入,或者在列表尾size处add + // 所以index在[0,size之间] + private void rangeCheck(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + } + + class ArrayListIterator implements Iterator { + int i = 0; + + @Override + public boolean hasNext() { + return i < size; + } + + @Override + public Object next() { + return elementData[i++]; + } + + } + +} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/BinaryTreeNode.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/BinaryTreeNode.java" new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/BinaryTreeNode.java" @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Iterator.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Iterator.java" new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Iterator.java" @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/LinkedList.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/LinkedList.java" new file mode 100644 index 0000000000..b036d5ba91 --- /dev/null +++ "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/LinkedList.java" @@ -0,0 +1,143 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private int size = 0; + // 头结点 + private Node head; + // 尾结点 + private Node tail; + + private void rangeCheck(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + } + + public void add(Object o) { + Node node = new Node(o, null); + if (head == null) { + head = tail = node; + } + Node oldTail = tail; + tail = node; + oldTail.next = tail; + size++; + } + + public void add(int index, Object o) { + rangeCheck(index); + if (index == size) { + this.add(o); + } else { + // 保存index处节点 + Node x = head; + // 保存index-1处的节点 + Node y = null; + for (int i = 0; i < index; i++) { + y = x; + x = x.next; + } + Node node = new Node(o, x); + y.next = node; + size++; + } + } + + public Object get(int index) { + rangeCheck(index); + Node x = head; + for (int i = 0; i < index; i++) { + x = x.next; + } + return x.data; + } + + public Object remove(int index) { + rangeCheck(index); + Object removeData; + if (index == 0) { + removeData = removeFirst(); + } else if (index == size - 1) { + removeData = removeLast(); + } else { + Node x = head; + Node y = head; + for (int i = 0; i < index; i++) { + y = x; + x = x.next; + } + y.next = x.next; + size--; + removeData = x.data; + } + return removeData; + } + + public int size() { + return this.size; + } + + public void addFirst(Object o) { + Node oldHead = head; + head = new Node(o, oldHead); + size++; + } + + public void addLast(Object o) { + Node oldTail = tail; + tail = new Node(o, null); + oldTail.next = tail; + size++; + } + + public Object removeFirst() { + Node oldHead = head; + head = oldHead.next; + size--; + return oldHead.data; + } + + public Object removeLast() { + Node oldTail = tail; + Node temp = head; + for (int i = 0; i < size - 2; i++) { + temp = temp.next; + } + tail = temp; + size--; + return oldTail.data; + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + } + + private class LinkedListIterator implements Iterator { + Node x = head; + + @Override + public boolean hasNext() { + return x != null; + } + + @Override + public Object next() { + Object data = x.data; + x = x.next; + return data; + } + + } +} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/List.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/List.java" new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/List.java" @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Queue.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Queue.java" new file mode 100644 index 0000000000..5190e1b798 --- /dev/null +++ "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Queue.java" @@ -0,0 +1,25 @@ +package com.coding.basic; + +public class Queue { + private LinkedList linkedList; + + public Queue() { + linkedList = new LinkedList(); + } + + public void enQueue(Object o) { + linkedList.add(o); + } + + public Object deQueue() { + return linkedList.removeFirst(); + } + + public boolean isEmpty() { + return linkedList.size() == 0; + } + + public int size() { + return linkedList.size(); + } +} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Stack.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Stack.java" new file mode 100644 index 0000000000..a39871d1b4 --- /dev/null +++ "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Stack.java" @@ -0,0 +1,30 @@ +package com.coding.basic; + +public class Stack { + + private LinkedList linkedList; + + public Stack() { + linkedList = new LinkedList(); + } + + public void push(Object o) { + linkedList.add(o); + } + + public Object pop() { + return linkedList.removeLast(); + } + + public Object peek() { + return linkedList.get(linkedList.size()-1); + } + + public boolean isEmpty() { + return linkedList.size() == 0; + } + + public int size() { + return linkedList.size(); + } +} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Test.java" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Test.java" new file mode 100644 index 0000000000..b26a11be8a --- /dev/null +++ "b/group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Test.java" @@ -0,0 +1,15 @@ +package com.coding.basic; + +public class Test { + public static void main(String[] args) { + LinkedList linkedList = new LinkedList(); + for (int i = 0; i < 10; i++) { + linkedList.add(i); + } + for (int i = 0; i < 10; i++) { + linkedList.removeLast(); + } + linkedList.removeLast(); + } + +} diff --git "a/group08/529757467/2017-02-26\344\275\234\344\270\232/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.doc" "b/group08/529757467/2017-02-26\344\275\234\344\270\232/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.doc" new file mode 100644 index 0000000000000000000000000000000000000000..f518f0f97f1d7664b6cdd3d193be3b614da48f28 GIT binary patch literal 10240 zcmeI1dr(x@9mmhTyTF1gtS=;JbX9_A6fbJ9n*-r_-5Ela85SJF(hMlWPCMX`IQ7w%x>}jWKxp{hqtmEELQd z9U2Kg=5v4NeSYVj-#K?V=j@qL-A8|(dO`G&rNSnz8}TAGB3(h4NO1|FBEa}{!!XQ5 zArKsvyXXz{z*f#N=gnZ{;=GAZ=ghM!C$j* zi-$!M^fvKr%x3hG43Du!&AlKtp1Xn&Z^);3#8lzuq~rhE5%{xWL)1UfOp6g-@ub*{ zze?HnW3ZwQ7HyL$&7uL}re2Noj${Z`q2IDs+R;0A;8==jCahn99;&4cwek(znmr5A zzcv17`{$baD7=xD%CXk`j}-%3-a981Bfr)Dxn?uDh#@qCuYz-8t$*$Z+yl7&xvp=v z{+ZA9KL(5i<3KVP4^qHAAQemiobr3YBrqAc!4xnROap1)K9CNkgA6bO%mnv?SztEE z1ap7}vcOz056lM-fNZb;ECh?dVvqwK1WUkDunc&>a_|ty1uMYAfKK};$ODf7j=;@rwo0g+(x?HE+r5fRXHHbCKxnP?E zwc|ma2tIdh>yg)x^}KBr@cPUM zD#R}MYZm-=9@fDE_;N1R$Xu*}MKUxW=?}o(+3@r%gytfoLFa<`2rUE}Qgf02RD>-E zMkNFJ59dLB=kz--W=?P&?12Bwy86=!{#<@%ZoL?x>1|a?*9-RB<0NXkS=o6iQ zzC<6RZ@mfVk8cCM&%Xdnzvu?^wf6yiEd=Omp8)P>?2Nx@9O1s{i?`xCw3X6#4y|~k zuUTndq-hVu(i}U-LdgK^lY0onUxNqj<(|NFhUxPK@SH;U&o+2y4ZdpC@Y9E&8&I+a zJ5w!kDE*C}!jMnPZDyH?ugE@}<9q7oI2z zyanEqat_Sw&!2Wj@{R8hQ~&mPR=**`phuW8P}s^pCIh4CA`nZPvHqWNu$Eu2XoYQZ zXP6Y$R=s72|I>=xhJFk7aF(K#F1UFb3Rhrx)T82TXnq-I!XAE=`xgygtx9}>8s(R# z|1vjAO~mgXbRgFOe}~+xtd*CKz$q?9$O`n{48E-J+r@q@iKZQXFQX|JZ5gX?>S*iS z$#Vbi{-Ybq1kCs=(G?voHH6;4CG1NRhtPP2%1~6{w0^`4l_3p}W6RFi=~}&_(?Z z-h+WpWmwfl;=jLK{B~U=G2+>6LquxIy9#Z|wjJB??G*OevejXTb@ z%&D{5HCv!X&lk70oO|K;?h!i!fWRvUOz~ zAKQPqUFem*N*}H4sJN(~4XkW4?Q;6h2ZSD1(i5Ch*S&VJJ~{Z~@{#%?@2Ufys?W+k z+SA(NG|V=cBYc-C%u!C+Q~=9pq3~5zs@hX~v!8f+ea$AP@kn7$@Ox#hs=fLrEr-fm zTMn1>_?^c2z^ba3+au?tqe3gW+@mKYQti2kxjDU){#WY{^hI=f&H%gQh&YqZtg9H2kZIdA8=>ns;l? zIo~~z6LT#xay2sYpUB9^k&!Erkq;sx!{Nbs1N@aR5OK4_~ z2=TxUCtEJy1{&~yBJeoa3j81l2C8SZYiT#iewlW@?)7ko;`zW(d6#0IFJfv`QN8Ke zTJyZLGRQ@`sV+5G-}YcV&uka39URC935 z?oa$oEJf)iT!Ynw^>(D0SB=cI1X~a;aLlKb7OCB^S#h+b-~vH8Ra`HPbNpkbuj_P4 z7t2}Jnsv;WUD&KwEt3^l$|^a()1v%Ag;@cz>=1v zrMwZgu0P~24j$>^vLob{gc$5r%P3riOMxyM!ae#$^HYlq75+P3GG} z8PJM|5B2hFq)}9nAnVaO?mGA-7Mck?I-D+dNSHNGj0kbsURM;{xp7-@h-Eeo)$kyB JSnk3%@L$n3er) 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%0AmlmIu_Zu{GADqo&$T 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 T7+m=P6P=Mcm#V6(zZ(|-PfiJ% literal 0 HcmV?d00001 diff --git a/group08/619057560/2-26/code/com/coding/basic/ArrayList.java b/group08/619057560/2-26/code/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..70daee785d --- /dev/null +++ b/group08/619057560/2-26/code/com/coding/basic/ArrayList.java @@ -0,0 +1,80 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + if (size + 1 > elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length * 3 / 2 + 1); + } + elementData[size++] = o; + } + public void add(int index, Object o){ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + + if (size + 1 > elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length * 3 / 2 + 1); + } + + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + return elementData[index]; + } + + public Object remove(int index){ + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + Object old = elementData[index]; + size--; + System.arraycopy(elementData, index+1, elementData, index, size-index); + elementData[size] = null; + + return old; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new Itr(); + } + + private class Itr implements Iterator { + + int cursor = 0; + + @Override + public boolean hasNext() { + return (cursor < size); + } + + @Override + public Object next() { + if (cursor < 0 || cursor >= size) { + throw new NoSuchElementException(); + } + return elementData[cursor++]; + } + + } + +} diff --git a/group08/619057560/2-26/code/com/coding/basic/BinaryTreeNode.java b/group08/619057560/2-26/code/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..9db8eec800 --- /dev/null +++ b/group08/619057560/2-26/code/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,47 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + if (data == null || ((Integer)data).intValue() == ((Integer)o).intValue()) { + data = o; + return this; + } + else if (((Integer)o).intValue() < ((Integer)data).intValue()) { + if (left == null) { + left = new BinaryTreeNode(); + } + return left.insert(o); + } + else { + if (right == null) { + right = new BinaryTreeNode(); + } + return right.insert(o); + } + } + +} diff --git a/group08/619057560/2-26/code/com/coding/basic/Iterator.java b/group08/619057560/2-26/code/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group08/619057560/2-26/code/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group08/619057560/2-26/code/com/coding/basic/LinkedList.java b/group08/619057560/2-26/code/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..38a62b2f66 --- /dev/null +++ b/group08/619057560/2-26/code/com/coding/basic/LinkedList.java @@ -0,0 +1,137 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + Node pNewNode = new Node(); + pNewNode.data = o; + + Node pNode = head; + + if (head == null) { + head = pNewNode; + return; + } + + while (pNode.next != null) { + pNode = pNode.next; + } + + pNode.next = pNewNode; + } + + public void add(int index , Object o){ + if (index < 0 && index > size()) { + throw new IndexOutOfBoundsException(); + } + + Node pNewNode = new Node(); + pNewNode.data = o; + + if (index == 0) { + pNewNode.next = head; + head = pNewNode; + return; + } + + Node pNode = head; + while (--index > 0) { + pNode = pNode.next; + } + pNewNode.next = pNode.next; + pNode.next = pNewNode; + } + + public Object get(int index){ + if (index < 0 && index >= size()) { + throw new IndexOutOfBoundsException(); + } + + Node pNode = head; + while (index-- > 0) { + pNode = pNode.next; + } + + return pNode.data; + } + + public Object remove(int index){ + if (index < 0 && index >= size()) { + throw new IndexOutOfBoundsException(); + } + + Node pNode = head; + if (index == 0) { + head = head.next; + return pNode.data; + } + + while (--index > 0) { + pNode = pNode.next; + } + Node pTargetNode = pNode.next; + pNode.next = pTargetNode.next; + + return pTargetNode.data; + } + + public int size(){ + Node pNode = head; + int num = 0; + while (pNode != null) { + pNode = pNode.next; + num++; + } + return num; + } + + public void addFirst(Object o){ + add(0, o); + } + + public void addLast(Object o){ + add(o); + } + + public Object removeFirst(){ + if (head == null) { + throw new NoSuchElementException(); + } + return remove(0); + } + + public Object removeLast(){ + if (head == null) { + throw new NoSuchElementException(); + } + + Node pNode = head; + Node pPrevNode = null; + while (pNode.next != null) { + pPrevNode = pNode; + pNode = pNode.next; + } + if (pPrevNode != null) { + pPrevNode.next = pNode.next; + } + else { + head = null; + } + return pNode.data; + } + + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group08/619057560/2-26/code/com/coding/basic/List.java b/group08/619057560/2-26/code/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group08/619057560/2-26/code/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group08/619057560/2-26/code/com/coding/basic/Queue.java b/group08/619057560/2-26/code/com/coding/basic/Queue.java new file mode 100644 index 0000000000..1d240b6ec8 --- /dev/null +++ b/group08/619057560/2-26/code/com/coding/basic/Queue.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList queueList = new LinkedList(); + + public void enQueue(Object o){ + queueList.addFirst(o); + } + + public Object deQueue(){ + return queueList.removeLast(); + } + + public boolean isEmpty(){ + return queueList.size() == 0; + } + + public int size(){ + return queueList.size(); + } +} diff --git a/group08/619057560/2-26/code/com/coding/basic/Stack.java b/group08/619057560/2-26/code/com/coding/basic/Stack.java new file mode 100644 index 0000000000..03d5fa327c --- /dev/null +++ b/group08/619057560/2-26/code/com/coding/basic/Stack.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + return elementData.remove(elementData.size()-1); + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group08/619057560/2-26/code/com/coding/test/Main.java b/group08/619057560/2-26/code/com/coding/test/Main.java new file mode 100644 index 0000000000..c4b5b4b74d --- /dev/null +++ b/group08/619057560/2-26/code/com/coding/test/Main.java @@ -0,0 +1,103 @@ +package com.coding.test; + +import com.coding.basic.ArrayList; +import com.coding.basic.BinaryTreeNode; +import com.coding.basic.Iterator; +import com.coding.basic.LinkedList; +import com.coding.basic.Queue; +import com.coding.basic.Stack; + +public class Main { + + private static void printArrayList(ArrayList list) { + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + Iterator itr = list.iterator(); + while (itr.hasNext()) { + System.out.println(itr.next()); + } + } + + private static void printLinkedList(LinkedList list) { + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + private static void printBinaryTree(BinaryTreeNode node) { + if (node == null) + return; + + printBinaryTree(node.getLeft()); + if (node.getData() != null) + System.out.println(node.getData()); + printBinaryTree(node.getRight()); + } + + private static void testArrayList() { + ArrayList arrayList = new ArrayList(); + arrayList.add(new Integer(1)); + arrayList.add(new Integer(2)); + arrayList.add(new Integer(3)); + arrayList.remove(2); + arrayList.add(new Integer(4)); + arrayList.add(0,new Integer(5)); + printArrayList(arrayList); + } + + private static void testLinkedList() { + LinkedList linkedList = new LinkedList(); + linkedList.add(new Integer(1)); + linkedList.add(new Integer(2)); + linkedList.add(new Integer(3)); + linkedList.remove(2); + linkedList.add(new Integer(4)); + linkedList.add(0,new Integer(5)); + linkedList.removeFirst(); + printLinkedList(linkedList); + } + + private static void testStack() { + Stack stack = new Stack(); + stack.push(new Integer(1)); + stack.push(new Integer(2)); + stack.push(new Integer(3)); + System.out.println(stack.peek()); + System.out.println(stack.peek()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + stack.push(new Integer(4)); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + //System.out.println(stack.pop()); + } + + private static void testQueue() { + Queue queue = new Queue(); + queue.enQueue(new Integer(1)); + queue.enQueue(new Integer(2)); + queue.enQueue(new Integer(3)); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + //System.out.println(queue.deQueue()); + } + + private static void testBinaryTree() { + BinaryTreeNode root = new BinaryTreeNode(); + root.insert(new Integer(4)); + root.insert(new Integer(3)); + root.insert(new Integer(5)); + root.insert(new Integer(1)); + root.insert(new Integer(8)); + root.insert(new Integer(2)); + root.insert(new Integer(7)); + root.insert(new Integer(6)); + printBinaryTree(root); + } + + public static void main(String[] args) { + testBinaryTree(); + } +} diff --git a/group08/619057560/CHHSAlex.md b/group08/619057560/CHHSAlex.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group08/619057560/CHHSAlex.md @@ -0,0 +1 @@ + diff --git a/group08/648354678/README.md b/group08/648354678/README.md new file mode 100644 index 0000000000..20b57abd22 --- /dev/null +++ b/group08/648354678/README.md @@ -0,0 +1,4 @@ +# 测试上传文件到git +## 第一次上传以作学习 +## QQ:648354678 +### 希望跟大家共同学习进步 \ No newline at end of file diff --git a/group08/649859235/2-26/article.md b/group08/649859235/2-26/article.md new file mode 100644 index 0000000000..556350e58d --- /dev/null +++ b/group08/649859235/2-26/article.md @@ -0,0 +1,2 @@ +文章地址 +http://note.youdao.com/noteshare?id=a0345eff655b1cfc5877cc267452eed0&sub=FE5CD301B3C742269D04973B0DD2393C diff --git a/group08/649859235/2-26/com/vvv/base/ArrayList.java b/group08/649859235/2-26/com/vvv/base/ArrayList.java new file mode 100644 index 0000000000..e250afe294 --- /dev/null +++ b/group08/649859235/2-26/com/vvv/base/ArrayList.java @@ -0,0 +1,68 @@ +package com.vvv.base; + +public class ArrayList implements IList { + + private static final int DEFAULT_SIZE = 100; + + private int size; + private Object[] data = new Object[DEFAULT_SIZE]; + + @Override + public void add(Object o) { + if (size > data.length) { + increase(); + } + data[size] = o; + size++; + } + + @Override + public void add(int index, Object o) { + check(index); + + if (index > data.length - 1) { + increase(); + } + System.arraycopy(data, index, data, index + 1, size - index); + data[index] = o; + size++; + } + + private void check(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("index: " + index + ", size: " + + size); + } + + private void increase() { + Object[] newData = new Object[DEFAULT_SIZE * 2]; + System.arraycopy(data, 0, newData, 0, size); + data = newData; + } + + @Override + public Object get(int index) { + check(index); + return data[index]; + } + + @Override + public Object remove(int index) { + if (index > 0 && index < size) { + Object d = data[index]; + int diff = size - index - 1; + if (diff > 0) + System.arraycopy(data, index + 1, data, index, size - index - 1); + size--; + data[size] = null; + return d; + } + return null; + } + + @Override + public int size() { + return this.size; + } + +} diff --git a/group08/649859235/2-26/com/vvv/base/BinaryTreeNode.java b/group08/649859235/2-26/com/vvv/base/BinaryTreeNode.java new file mode 100644 index 0000000000..a5d5ee1d2a --- /dev/null +++ b/group08/649859235/2-26/com/vvv/base/BinaryTreeNode.java @@ -0,0 +1,37 @@ +package com.vvv.base; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + return null; + } + +} diff --git a/group08/649859235/2-26/com/vvv/base/IList.java b/group08/649859235/2-26/com/vvv/base/IList.java new file mode 100644 index 0000000000..3b449fab3f --- /dev/null +++ b/group08/649859235/2-26/com/vvv/base/IList.java @@ -0,0 +1,9 @@ +package com.vvv.base; + +public interface IList { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group08/649859235/2-26/com/vvv/base/LinkedList.java b/group08/649859235/2-26/com/vvv/base/LinkedList.java new file mode 100644 index 0000000000..fa03aba962 --- /dev/null +++ b/group08/649859235/2-26/com/vvv/base/LinkedList.java @@ -0,0 +1,117 @@ +package com.vvv.base; + +public class LinkedList implements IList { + private int size; + private Node head; + private Node tail; + + @Override + public void add(Object o) { + Node node = new Node(o); + if (head == null) { + head = node; + tail = node; + } else { + tail.next = node; + node.prev = tail; + tail = node; + } + size++; + } + + @Override + public void add(int index, Object o) { + check(index); + Node node = new Node(o); + Node temp = head; + for (int i = 0; i < index; i++) { + temp = temp.next; + } + if (temp.prev != null && temp.next != null) { + Node prevNode = temp.prev; + prevNode.next = node; + node.prev = prevNode; + node.next = temp; + temp.prev = node; + } else if (temp.prev == null) { + head = node; + temp.prev = node; + node.next = temp; + } else if (temp.next == null) { + temp.next = node; + node.prev = temp; + tail = node; + } + size++; + } + + @Override + public Object get(int index) { + check(index); + Node temp = head; + for (int i = 0; i < index; i++) { + temp = temp.next; + } + return temp.data; + } + + @Override + public Object remove(int index) { + check(index); + Node temp = head; + for (int i = 0; i < index; i++) { + temp = temp.next; + } + Object oldValue = temp.data; + if (temp.prev != null && temp.next != null) { + temp.prev.next = temp.next; + temp.next.prev = temp.prev; + temp = null; + } else if (temp.prev == null) { + head = temp.next; + temp.next.prev = null; + temp = null; + } else if (temp.next == null) { + tail = temp.prev; + temp.prev.next = null; + temp = null; + } + size--; + return oldValue; + } + + public boolean remove(Object obj) { + Node temp = head; + for (int i = 0; i < size; i++) { + if (obj.equals(temp.data)) { + remove(i); + return true; + } + temp = temp.next; + } + return false; + } + + private void check(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("index: " + index + ", size: " + + size); + } + + @Override + public int size() { + return size; + } + + @SuppressWarnings("hiding") + private static class Node { + Object data; + Node next; + Node prev; + + public Node(Object data) { + this.data = data; + } + } + +} diff --git a/group08/649859235/2-26/com/vvv/base/Queue.java b/group08/649859235/2-26/com/vvv/base/Queue.java new file mode 100644 index 0000000000..f97bd9d298 --- /dev/null +++ b/group08/649859235/2-26/com/vvv/base/Queue.java @@ -0,0 +1,73 @@ +package com.vvv.base; + +public class Queue { + + QueueNode head; + QueueNode tail; + private int size; + + public Queue() { + this.head = null; + this.tail = null; + } + + public void enQueue(Object o) { + if (head == null && tail == null) { + tail = new QueueNode(o); + head = tail; + } else { + QueueNode node = new QueueNode(o); + tail.next = node; + tail = tail.next; + } + size++; + } + + public Object deQueue() { + if (head == null) { + return null; + } + + if (head == tail && tail != null) { + QueueNode node = head; + tail = null; + head = null; + size--; + return node.data; + } + + Object obj = head.data; + head = head.next; + size--; + return obj; + } + + public boolean isEmpty() { + if(head==null && tail == null) + return true; + return false; + } + + public int size() { + return size; + } + +} + +class QueueNode { + Object data; + QueueNode next; + + public QueueNode() { + this(null, null); + } + + public QueueNode(Object data) { + this(data, null); + } + + public QueueNode(Object data, QueueNode next) { + this.data = data; + this.next = next; + } +} diff --git a/group08/649859235/2-26/com/vvv/base/Stack.java b/group08/649859235/2-26/com/vvv/base/Stack.java new file mode 100644 index 0000000000..5e3ed32e14 --- /dev/null +++ b/group08/649859235/2-26/com/vvv/base/Stack.java @@ -0,0 +1,30 @@ +package com.vvv.base; + +public class Stack { + private ArrayList data = new ArrayList(); + + public void push(Object o) { + data.add(o); + } + + public Object pop() { + return data.remove(data.size() - 1); + } + + public Object peek() { + if (data.size() > 0) { + return data.get(data.size() - 1); + } + return null; + } + + public boolean isEmpty() { + if (data.size() > 0) + return false; + return true; + } + + public int size() { + return data.size(); + } +} diff --git a/group08/649859235/README.md b/group08/649859235/README.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group08/649859235/README.md @@ -0,0 +1 @@ + diff --git a/group08/729770920/.gitignore b/group08/729770920/.gitignore new file mode 100644 index 0000000000..6b468b62a9 --- /dev/null +++ b/group08/729770920/.gitignore @@ -0,0 +1 @@ +*.class diff --git a/group08/729770920/2-26/resource/report.txt b/group08/729770920/2-26/resource/report.txt new file mode 100644 index 0000000000..f256165498 --- /dev/null +++ b/group08/729770920/2-26/resource/report.txt @@ -0,0 +1,5 @@ +CPU是计算机的大脑,由运算器和寄存器组成。可以储存指令和数据,并执行指令进行简单的计算。 +指令是CPU可以直接执行的命令。 +内存是所谓的RAM,读写速度较快。常用来作为CPU和硬盘之间数据交换的缓存。 +硬盘容量极大,但是读写速度比内存慢很多。用来存放程序的二进制码,音频,视频等等数据资源。 +程序运行时,数据由硬盘拷贝到内存,CPU再从内存里加载包含指令的数据,逐一执行。 \ No newline at end of file diff --git a/group08/729770920/2-26/src/com/coding/basic/ArrayList.java b/group08/729770920/2-26/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..ec9a1f07f8 --- /dev/null +++ b/group08/729770920/2-26/src/com/coding/basic/ArrayList.java @@ -0,0 +1,225 @@ +<<<<<<< HEAD +package com.coding.basic; + +public class ArrayList implements List { + + private int size; + + private E[] data; + + public void add(E e){ + add(size, e); + } + + public ArrayList() { + clear(); + } + + public ArrayList(int capacity) { + clear(); + ensureCapacity(capacity); + } + + public void add(int index, E e){ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(Integer.toString(index)); + } + if (data.length == size) { + ensureCapacity(size + size >> 1 + 1); + } + for (int i = size++; i > index; --i) { + data[i] = data[i - 1]; + } + data[index] = e; + } + + public E get(int index){ + return data[index]; + } + + public E remove(int index){ + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(Integer.toString(index)); + } + E copy = data[index]; + --size; + for (int i = index; i < size; ++i) { + data[i] = data[i + 1]; + } + return copy; + } + + public boolean contains(E e) { + for (int i = 0; i < size; ++i) { + if (data[i] == e) { + return true; + } + } + return false; + } + + public void clear() { + size = 0; + data = (E[]) new Object[0]; + } + + public int size(){ + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + public void ensureCapacity(int capacity) { + E[] newData = (E[]) new Object[capacity]; + for (int i = 0; i < size; ++i) { + newData[i] = data[i]; + } + data = newData; + } + + public void trimToSize() { + E[] newData = (E[]) new Object[size]; + for (int i = 0; i < size; ++i) { + newData[i] = data[i]; + } + data = newData; + } + + private class ArrayListIterator implements Iterator { + int current = 0; + + public boolean hasNext() { + return current < size; + } + + public E next() { + if (!hasNext()) { + throw new java.util.NoSuchElementException(); + } + return data[current++]; + } + + public void remove() { + ArrayList.this.remove(current); + } + } +} +======= +package com.coding.basic; + +public class ArrayList implements List { + + private int size; + + private E[] data; + + public void add(E e){ + add(size, e); + } + + public ArrayList() { + clear(); + } + + public ArrayList(int capacity) { + clear(); + ensureCapacity(capacity); + } + + public void add(int index, E e){ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(Integer.toString(index)); + } + if (data.length == size) { + ensureCapacity(size * 2 + 1); + } + for (int i = size++; i > index; --i) { + data[i] = data[i - 1]; + } + data[index] = e; + } + + public E get(int index){ + return data[index]; + } + + public E remove(int index){ + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(Integer.toString(index)); + } + E copy = data[index]; + --size; + for (int i = index; i < size; ++i) { + data[i] = data[i + 1]; + } + return copy; + } + + public boolean contains(E e) { + for (int i = 0; i < size; ++i) { + if (data[i] == e) { + return true; + } + } + return false; + } + + public void clear() { + size = 0; + data = (E[]) new Object[0]; + } + + public int size(){ + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + public void ensureCapacity(int capacity) { + E[] newData = (E[]) new Object[capacity]; + for (int i = 0; i < size; ++i) { + newData[i] = data[i]; + } + data = newData; + } + + public void trimToSize() { + E[] newData = (E[]) new Object[size]; + for (int i = 0; i < size; ++i) { + newData[i] = data[i]; + } + data = newData; + } + + private class ArrayListIterator implements Iterator { + int current = 0; + + public boolean hasNext() { + return current < size; + } + + public E next() { + if (!hasNext()) { + throw new java.util.NoSuchElementException(); + } + return data[current++]; + } + + public void remove() { + ArrayList.this.remove(current); + } + } +} +>>>>>>> master diff --git a/group08/729770920/2-26/src/com/coding/basic/BinaryTree.java b/group08/729770920/2-26/src/com/coding/basic/BinaryTree.java new file mode 100644 index 0000000000..0b41529787 --- /dev/null +++ b/group08/729770920/2-26/src/com/coding/basic/BinaryTree.java @@ -0,0 +1,105 @@ +package com.coding.basic; + +public class BinaryTree> { + BinaryTreeNode root = null; + + public BinaryTree() { + } + + public boolean isEmpty() { + return root == null; + } + + public void insert(E e) { + root = insert(root, e); + } + + private BinaryTreeNode insert(BinaryTreeNode node, E e) { + if (node == null) { + node = new BinaryTreeNode(e, null, null); + } + int compareResult = ((Comparable) e).compareTo(node.data); + if (compareResult < 0) { + node.left = insert(node.left, e); + } else if (compareResult > 0) { + node.right = insert(node.right, e); + } + return node; + } + + public void clear() { + root = null; + } + + public boolean contains(E e) { + return contains(root, e); + } + + private boolean contains(BinaryTreeNode node, E e) { + if (node == null) { + return false; + } + int compareResult = ((Comparable) e).compareTo(node.data); + if (compareResult < 0) { + return contains(node.left, e); + } else if (compareResult > 0) { + return contains(node.right, e); + } + // matching + return true; + } + + private BinaryTreeNode findMin(BinaryTreeNode node) { + if (node != null) { + while (node.left != null) { + node = node.right; + } + } + return node; + } + + private BinaryTreeNode findMax(BinaryTreeNode node) { + if (node != null) { + while (node.right != null) { + node = node.right; + } + } + return node; + } + + public void remove(E e) { + root = remove(root, e); + } + + private BinaryTreeNode remove(BinaryTreeNode node, E e) { + if (node == null) { + return node; + } + int compareResult = ((Comparable) e).compareTo(node.data); + if (compareResult < 0) { + node.left = remove(node.left, e); + } else if (compareResult > 0) { + node.right = remove(node.right, e); + } + // matching + if (node.left != null && node.right != null) { // two children + node.data = (E) findMax(node.right).data; + node.right = remove(node.right, node.data); + } else { // one child + node = (node.left != null) ? node.left : node.right; + } + return node; + } + + private class BinaryTreeNode { + E data; + BinaryTreeNode left; + BinaryTreeNode right; + + public BinaryTreeNode(E e, BinaryTreeNode l, BinaryTreeNode r) { + data = e; + left = l; + right = r; + } + } +} diff --git a/group08/729770920/2-26/src/com/coding/basic/Iterator.java b/group08/729770920/2-26/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..f432b11910 --- /dev/null +++ b/group08/729770920/2-26/src/com/coding/basic/Iterator.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface Iterator { + boolean hasNext(); + + E next(); + + void remove(); +} diff --git a/group08/729770920/2-26/src/com/coding/basic/LinkedList.java b/group08/729770920/2-26/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..6a09c84aae --- /dev/null +++ b/group08/729770920/2-26/src/com/coding/basic/LinkedList.java @@ -0,0 +1,164 @@ +package com.coding.basic; + +public class LinkedList implements List { + private int size = 0; + private Node head = new Node<>(); + private Node tail = new Node<>(); + + public LinkedList() { + head.next = tail; + tail.prev = head; + } + + public void add(E e) { + addLast(e); + } + + public void add(int index, E e) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(Integer.toString(index)); + } + Node cursor; + if (index < size/2) { + cursor = head; + for (int i = 0, num = index; i < num; ++i) { + cursor = cursor.next; + } + } else { + cursor = tail.prev; + for (int i = 0, num = size-index; i < num; ++i) { + cursor = cursor.prev; + } + } + cursor.next = cursor.next.prev = new Node(e, cursor, cursor.next); + ++size; + } + + public E get(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(Integer.toString(index)); + } + Node cursor; + if (index < size/2) { + cursor = head.next; + for (int i = 0; i < index; ++i) { + cursor = cursor.next; + } + } else { + cursor = tail.prev; + for (int i = 0, num = size-index-1; i < num; ++i) { + cursor = cursor.prev; + } + } + return cursor.data; + } + + public E remove(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(Integer.toString(index)); + } + Node cursor; + if (index < size/2) { + cursor = head.next; + for (int i = 0; i < index; ++i) { + cursor = cursor.next; + } + } else { + cursor = tail.prev; + for (int i = 0, num = size-index-1; i < num; ++i) { + cursor = cursor.prev; + } + } + cursor.prev.next = cursor.next; + cursor.next.prev = cursor.prev; + --size; + return cursor.data; + } + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public void addFirst(E e) { + add(0, e); + } + + public void addLast(E e) { + add(size, e); + } + + public E removeFirst() { + return remove(0); + } + + public E removeLast() { + return remove(size-1); + } + + public void clear() { + while (!isEmpty()) { + removeFirst(); + } + } + + public boolean contains(E e) { + Iterator it = this.iterator(); + while (it.hasNext()) { + if (it.next() == e) { + return true; + } + } + return false; + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private static class Node { + E data = null; + Node prev = null; + Node next = null; + + public Node() { + } + + public Node(E e, Node p, Node n) { + data = e; + prev = p; + next = n; + } + } + + private class LinkedListIterator implements Iterator { + Node currentNode = head.next; + + public boolean hasNext() { + return currentNode != tail; + } + + public E next() { + if (!hasNext()) { + throw new java.util.NoSuchElementException(); + } + E data = currentNode.data; + currentNode = currentNode.next; + return data; + } + + public void remove() { + if (!hasNext()) { + throw new java.util.NoSuchElementException(); + } + Node nextNode = currentNode.next; + currentNode.next.prev = currentNode.prev; + currentNode.prev.next = currentNode.next; + currentNode = nextNode; + --size; + } + } +} diff --git a/group08/729770920/2-26/src/com/coding/basic/List.java b/group08/729770920/2-26/src/com/coding/basic/List.java new file mode 100644 index 0000000000..de1390d243 --- /dev/null +++ b/group08/729770920/2-26/src/com/coding/basic/List.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public interface List { + void add(E e); + + void add(int index, E e); + + void clear(); + + E get(int index); + + E remove(int index); + + int size(); + + boolean contains(E e); + + Iterator iterator(); +} diff --git a/group08/729770920/2-26/src/com/coding/basic/Queue.java b/group08/729770920/2-26/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..c53fc8ed0a --- /dev/null +++ b/group08/729770920/2-26/src/com/coding/basic/Queue.java @@ -0,0 +1,21 @@ +package com.coding.basic; + +public class Queue { + private LinkedList data = new LinkedList<>(); + + public void enQueue(E e){ + data.addFirst(e); + } + + public Object deQueue() { + return data.removeLast(); + } + + public boolean isEmpty() { + return data.size() == 0; + } + + public int size(){ + return data.size(); + } +} diff --git a/group08/729770920/2-26/src/com/coding/basic/Stack.java b/group08/729770920/2-26/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..950b09e039 --- /dev/null +++ b/group08/729770920/2-26/src/com/coding/basic/Stack.java @@ -0,0 +1,25 @@ +package com.coding.basic; + +public class Stack { + private LinkedList data = new LinkedList<>(); + + public void push(E e) { + data.addFirst(e); + } + + public Object pop() { + return data.removeFirst(); + } + + public Object peek() { + return data.get(0); + } + + public boolean isEmpty() { + return data.size() == 0; + } + + public int size() { + return data.size(); + } +} diff --git a/group08/729770920/README.md b/group08/729770920/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group08/769638826/2-27/ArrayList.java b/group08/769638826/2-27/ArrayList.java new file mode 100644 index 0000000000..1e6ccfcfcb --- /dev/null +++ b/group08/769638826/2-27/ArrayList.java @@ -0,0 +1,111 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +/** + * Created by huitailang on 17/2/25. + * + * @author zhangkun + * @date 2017年02月25日13:23:30 + */ +public class ArrayList implements List { + private int size = 0; + private static final int DEFAULT_SIZE = 16; + private Object[] elementData = null; + private int index; + + public ArrayList() { + elementData = new Object[DEFAULT_SIZE]; + } + + public ArrayList(final int size) { + elementData = new Object[size]; + } + + public void add(Object o) { + //如果当前元素个数大于数组长度的2/3 + if (size() > elementData.length * 2 / 3) { + raiseArray(); + } + + elementData[index++] = o; + size++; + } + + public void add(int index, Object o) { + checkParam(index); + + //如果当前元素个数大于数组长度的2/3 + if (size() > elementData.length * 2 / 3) { + raiseArray(); + } + + elementData[index] = o; + size++; + } + + public Object get(int index) { + checkParam(index); + + return elementData[index]; + } + + public Object remove(int index) { + checkParam(index); + + Object o = elementData[index]; + elementData[index] = null; + size--; + return o; + } + + private void raiseArray() { + Object[] newElementData = Arrays.copyOf(elementData, size() * 2); + elementData = newElementData; + } + + private void checkParam(int index) { + if (index < 0 || index > elementData.length - 1) { + throw new IndexOutOfBoundsException(); + } + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new ListIterator(); + } + + private class ListIterator implements Iterator{ + int cursor; + + @Override + public boolean hasNext() { + return cursor != size; + } + + public void remove(){ + throw new UnsupportedOperationException(); + } + + @Override + public Object next() { + if(!hasNext()) { + throw new NoSuchElementException(); + } + + int i = cursor; + if (i >= size) + throw new NoSuchElementException(); + + Object[] elementData = ArrayList.this.elementData; + + cursor = i + 1; + + return elementData[i]; + } + } +} diff --git a/group08/769638826/2-27/ArrayListTest.java b/group08/769638826/2-27/ArrayListTest.java new file mode 100644 index 0000000000..199e3d14cb --- /dev/null +++ b/group08/769638826/2-27/ArrayListTest.java @@ -0,0 +1,74 @@ +package com.coding.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by huitailang on 17/2/25. + * test arraylist + */ +public class ArrayListTest { + ArrayList arrayList = null; + + @Before + public void setUp() { + arrayList = new ArrayList(); + } + + @Test + public void testArrayLength() { + int[] array = new int[10]; + Assert.assertEquals(10, array.length); + } + + @Test + public void testAddElement() { + arrayList.add(11); + Assert.assertEquals(11, arrayList.get(0)); + printElementSize(arrayList); + + for (int i = 0; i < 18; i++) { + + } + } + + @Test + public void testAriseArray() { + for (int i = 0; i < 18; i++) { + arrayList.add(i + 1); + } + + Assert.assertEquals(18, arrayList.size()); + + for (int i = 0; i < 18; i++) { + System.out.println(arrayList.get(i)); + } + } + + @Test + public void testRemoveElement() { + for (int i = 0; i < 18; i++) { + arrayList.add(i + 1); + } + + Assert.assertEquals(18, arrayList.size()); + + arrayList.remove(17); + + Assert.assertEquals(17, arrayList.size()); + + for (int i = 0; i < 18; i++) { + System.out.println(arrayList.get(i)); + } + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testInValidGet() { + arrayList.get(19); + } + + private void printElementSize(ArrayList arrayList) { + System.out.println("array size => " + arrayList.size()); + } +} diff --git a/group08/769638826/2-27/Iterator.java b/group08/769638826/2-27/Iterator.java new file mode 100644 index 0000000000..ce3da0d118 --- /dev/null +++ b/group08/769638826/2-27/Iterator.java @@ -0,0 +1,13 @@ +package com.coding.basic; + +/** + * Created by huitailang on 17/2/25. + * + * @author zhangkun + * @date 2017年02月25日16:25:42 + */ +public interface Iterator { + public boolean hasNext(); + + public Object next(); +} diff --git a/group08/769638826/2-27/LinkedList.java b/group08/769638826/2-27/LinkedList.java new file mode 100644 index 0000000000..981822c43e --- /dev/null +++ b/group08/769638826/2-27/LinkedList.java @@ -0,0 +1,190 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +/** + * Created by huitailang on 17/2/25. + * + * @author zhangkun + * @date 2017年02月25日13:57:58 + */ +public class LinkedList implements List { + private Node head; + private int size; + + public LinkedList() { + head = null; + size = 0; + } + + @Override + public void add(Object o) { + if (head == null) { + Node newNode = new Node(); + newNode.data = o; + head = newNode; + } + + Node oldhead = head; + head = new Node(); + head.data = o; + head.next = oldhead; + size++; + } + + @Override + public void add(int index, Object o) { + Node newNode = new Node(); + newNode.data = o; + + if (head == null) { + head = newNode; + } + + if (index < 1 || index > size + 1) { + throw new IllegalArgumentException("invalid index, it's should be 1 and" + size + 1); + } + + if (index == 1) { + newNode.next = head; + } else { + Node currentNode = head; + int count = 1; + while (count < index - 1) { + count++; + currentNode = currentNode.next; + } + newNode.next = currentNode.next; + currentNode.next = newNode; + } + } + + @Override + public Object get(int index) { + if (head == null) { + return null; + } + + if (index == 1) { + return head.next.data; + } else { + Node currentNode = head; + int count = 1; + while (count < index - 1) { + count++; + currentNode = currentNode.next; + } + + return currentNode.next.data; + } + } + + @Override + public Object remove(int index) { + Object result = null; + + if (index < 1 || index > size) { + throw new IllegalArgumentException("invalid index, it's should be 1 and " + size); + } + + if (index == 1) { + Node currentNode = head.next; + head = null; + return currentNode; + } else { + Node prevNode = head; + + int count = 1; + while (count < index - 1) { + prevNode = prevNode.next; + count++; + } + Node currentNode = prevNode.next; + prevNode.next = currentNode.next; + result = currentNode.data; + currentNode = null; + } + + return result; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object o) { + add(1, o); + } + + public void addLast(Object o) { + add(size + 1, o); + } + + public Object removeFirst() { + return remove(1); + } + + public Object removeLast() { + return remove(size); + } + + public Iterator iterator() { + return new ListIterator(); + } + + public void print() { + if (head == null) { + System.out.println("No elements in the list!"); + } + + Node currentNode = head; + while (currentNode != null) { + System.out.println(currentNode.data + "->"); + currentNode = currentNode.next; + } + + System.out.println(); + } + + public int length() { + int count = 0; + + Node currentNode = head; + while (currentNode != null) { + count++; + currentNode = currentNode.next; + } + + return count; + } + + private static class Node { + Object data; + Node next; + } + + private class ListIterator implements Iterator { + private Node current = head; + + @Override + public boolean hasNext() { + return current != null; + } + + public void remove() { + throw new UnsupportedOperationException(); + } + + @Override + public Object next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + + Object o = current.data; + current = current.next; + return o; + } + } +} diff --git a/group08/769638826/2-27/LinkedListTest.java b/group08/769638826/2-27/LinkedListTest.java new file mode 100644 index 0000000000..786e5d93a7 --- /dev/null +++ b/group08/769638826/2-27/LinkedListTest.java @@ -0,0 +1,10 @@ +package com.coding.basic; + +/** + * Created by huitailang on 17/2/25. + * @author zhangkun + * @date 2017年02月25日17:33:40 + */ +public class LinkedListTest { + +} diff --git a/group08/769638826/2-27/List.java b/group08/769638826/2-27/List.java new file mode 100644 index 0000000000..e9eba47da6 --- /dev/null +++ b/group08/769638826/2-27/List.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +/** + * Created by huitailang on 17/2/25. + * + * @author zhangkun + * @date 2017年02月25日13:54:33 + */ +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group08/769638826/2-27/Queue.java b/group08/769638826/2-27/Queue.java new file mode 100644 index 0000000000..abb7e57112 --- /dev/null +++ b/group08/769638826/2-27/Queue.java @@ -0,0 +1,26 @@ +package com.coding.basic; + +/** + * Created by huitailang on 17/2/25. + * @author zhangkun + * @date 2017年02月25日17:40:02 + */ +public class Queue { + private ArrayList elementData = new ArrayList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.get(size()); + } + + public boolean isEmpty(){ + return elementData.size() != 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group08/769638826/2-27/QueueTest.java b/group08/769638826/2-27/QueueTest.java new file mode 100644 index 0000000000..83ee1ff30a --- /dev/null +++ b/group08/769638826/2-27/QueueTest.java @@ -0,0 +1,10 @@ +package com.coding.basic; + +/** + * Created by huitailang on 17/2/25. + * @author zhangkun + * @date 2017年02月25日17:44:48 + */ +public class QueueTest { + +} diff --git a/group08/769638826/2-27/Stack.java b/group08/769638826/2-27/Stack.java new file mode 100644 index 0000000000..46f80bc25d --- /dev/null +++ b/group08/769638826/2-27/Stack.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +/** + * Created by huitailang on 17/2/25. + * @author zhangkun + * @date 2017年02月25日17:34:22 + */ +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + Object o = elementData.get(1); + elementData.remove(1); + return o; + } + + public Object peek(){ + return elementData.get(1); + } + + public boolean isEmpty(){ + return elementData.size() != 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group08/769638826/2-27/StackTest.java b/group08/769638826/2-27/StackTest.java new file mode 100644 index 0000000000..5380bbaa0c --- /dev/null +++ b/group08/769638826/2-27/StackTest.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +/** + * Created by huitailang on 17/2/25. + * @author zhangkun + * @date 2017年02月25日17:44:32 + */ +public class StackTest { +} diff --git a/group08/769638826/README.md b/group08/769638826/README.md new file mode 100644 index 0000000000..ff11754584 --- /dev/null +++ b/group08/769638826/README.md @@ -0,0 +1 @@ +###2017编程能力提高群 diff --git a/group08/782476895/20170225/ArrayList.java b/group08/782476895/20170225/ArrayList.java new file mode 100644 index 0000000000..7b94eebd36 --- /dev/null +++ b/group08/782476895/20170225/ArrayList.java @@ -0,0 +1,55 @@ +package com.sl.test20170221; + +import java.util.Arrays; + +public class ArrayList implements List{ + + private int size = 0; + + private Object[] elementData = new Object[100]; + + @Override + public void add(Object o) { + grow(elementData); + elementData[size] = o; + } + + @Override + public void add(int index, Object o) { + grow(elementData); + for(int i = size - 1;i >= index;i--){ + elementData[i+1] = elementData[i]; + } + elementData[index] = o; + } + + @Override + public Object get(int index) { + return elementData[index]; + } + + @Override + public Object remove(int index) { + size--; + for(int i = index;i < size;i++){ + elementData[i] = elementData[i+1]; + } + elementData[size] = null; + return elementData; + } + + @Override + public int size() { + + return size; + } + + private void grow(Object[] elementData){ + size++; + if(size >= elementData.length){ + int newSize = elementData.length + 100; + elementData = Arrays.copyOf(elementData, newSize); + } + } + +} diff --git a/group08/782476895/20170225/LinkedList.java b/group08/782476895/20170225/LinkedList.java new file mode 100644 index 0000000000..30ba21046f --- /dev/null +++ b/group08/782476895/20170225/LinkedList.java @@ -0,0 +1,127 @@ +package com.sl.test20170221; + +public class LinkedList implements List{ + private Node root; + int index; + + public void addNode(String name){ + if(root == null){ + root = new Node(name); + }else{ + root.add(name); + } + } + + + + + class Node{ + Object data; + Node next; + + + Node(Object data){ + this.data = data; + } + //添加节点 + public void add(Object data){ + if(this.next == null){ + this.next = new Node(data); + }else{ + this.next.add(data); + } + } + //删除节点 + public Object del(int i){ + if(this.next != null){ + index++; + if(i == index){ + this.next = this.next.next; + return this.next.data; + }else{ + this.next.del(i); + } + } + return null; + } + + + //遍历 + public void traversal(){ + if(this.next != null){ + index++; + this.next.traversal(); + } + } + //指定位置增加 + public void add(int i, Object o){ + if(this.next != null){ + if(i == index){ + Node node = new Node(data); + node.next = this.next.next; + this.next = node; + return ; + }else{ + this.next.add(i,o); + } + index++; + } + } + + //得到指定的节点 + public Object get(int i){ + if(this.next != null){ + + if(i == index){ + return this.data; + }else{ + this.next.get(i); + } + index++; + } + return null; + } + + } + + @Override + public void add(Object data) { + if(root == null){ + root = new Node(data); + }else{ + root.add(data); + } + } + + @Override + public void add(int index, Object o) { + if(root != null){ + root.add(index, o); + } + } + + @Override + public Object get(int index) { + if(root.next != null){ + return root.get(index); + } + return null; + } + + @Override + public Object remove(int index) { + if(root != null){ + return root.del(index); + } + return null; + } + + @Override + public int size() { + if(root != null){ + root.traversal(); + } + return index; + } + +} diff --git a/group08/782476895/20170225/List.java b/group08/782476895/20170225/List.java new file mode 100644 index 0000000000..08160598b8 --- /dev/null +++ b/group08/782476895/20170225/List.java @@ -0,0 +1,9 @@ +package com.sl.test20170221; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group08/782476895/20170225/Queue.java b/group08/782476895/20170225/Queue.java new file mode 100644 index 0000000000..3c4a3c8256 --- /dev/null +++ b/group08/782476895/20170225/Queue.java @@ -0,0 +1,65 @@ +package com.sl.test20170221; + +import com.sl.test20170221.LinkedList.Node; + +public class Queue { + + private Node first; + private int index; + + class Node{ + Object data; + Node next; + + + Node(Object data){ + this.data = data; + } + //添加节点 + public void add(Object data){ + if(this.next == null){ + this.next = new Node(data); + }else{ + this.next.add(data); + } + } + + //遍历 + public void traversal(){ + if(this.next != null){ + index++; + this.next.traversal(); + } + } + } + + public void enQueue(Object o){ + if(first != null){ + first.add(o); + } + } + + public Object deQueue(){ + if(first != null){ + Object obj = first.data; + first = first.next; + return obj; + } + return null; + } + + public boolean isEmpty(){ + if(first == null){ + return true; + }else{ + return false; + } + } + + public int size(){ + if(first != null){ + first.traversal(); + } + return index; + } +} diff --git a/group08/782476895/20170225/Stack.java b/group08/782476895/20170225/Stack.java new file mode 100644 index 0000000000..50739dc7f3 --- /dev/null +++ b/group08/782476895/20170225/Stack.java @@ -0,0 +1,31 @@ +package com.sl.test20170221; + +public class Stack { + private List elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + int size = elementData.size(); + Object obj = elementData.remove(size--); + return obj; + } + + public Object peek(){ + int size = elementData.size(); + return elementData.get(size - 1); + } + public boolean isEmpty(){ + int size = elementData.size(); + if(size == 0){ + return true; + }else{ + return false; + } + } + public int size(){ + return elementData.size(); + } +} diff --git "a/group08/782476895/20170225/\346\217\217\350\277\260CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" "b/group08/782476895/20170225/\346\217\217\350\277\260CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" new file mode 100644 index 0000000000000000000000000000000000000000..0449ce2f366f7c09c20bdcabf8f7fc9cd4ff6b7a GIT binary patch literal 6797 zcmbVR1yo#1lg0uBx4~V5LvR8^aCZiGf(Cad5Ii^u4#6dOg1ZHGw}Ie6C%A_l-uvIa zyqx|2-Lo~P?wOwMud2IlPu*KztH{G6;K3jxBg0rX>&U_UBB;>sM$YE8F6?ZN*Ybo; zIe1R2P>5e7$EAH8KqB9oo%)Pkjlx*Q!b6-dHBRBRpU+$5y~!s}V!MYQ?kQ-~!E{l3 z3XPsIh?yw~bL*hS%m)Rppk%Yj zTmCHF@JP^Mca6)Zz~33xTgvjjKwUBG`P{R@vsGSK?8unq=QD_d>m|cXV13ok8M_Wj zr|fy~PX+PrvX!FGVn0?Hw7{##BO&wu^t;)FE?pH421e!I1_u{9LQmYm-qqaR)kwq3 z(cHy=&C|}dHgU+livvsY(pPfR?n8>ZDhLoLNimf4hJb4zzb$4ilxUOka3zaiAJ zL?=K3ORLA3Hmu^^U84A7-2Ab1)_gtYYabUR~4lF6i zEgsdST^ifIja75_XUb=6^ODDGv}Ss?{xZ1+t1C4Xfa#%B0hg5P!9!K_?_?Q}=n9Sz z=ct#cG(KR>tMP+Lmnh$Fx+k4h#Z|nXdJF|s3WP{LmMjh9Z>1;lgmLS-43Lws*Cml6 zZ&`2zF^rHw?#!jF$ZpN!dzj z0F$JH@d45$q|=`VA+RCsv(+EbZwXH*YF-MvzN(pMik zkIO7!pP2cEOFjOYGg?ZCw?g&SE-Oy+NpKmlmq?A}ic9Pw4?k*`+{aF5qOw~zd#g7N74g+yKkR@gdaN@WgAU|&xJM0AD^qlq1rC$V@ULn`!8ddbTpG~*tw5| zf|nM0U1T5=(m83uDkImmez5?-Rg%86@#qLigIdBV^gvdzeZgn@NQY=S&bZT?p9{V zPDBo^8S12~*W7VNCOH%!dy9jBKP2l0ywoA+j#3%#IK@wh5*$9MAr;C-eW4`zI5}gr zTS7B9kX?ak_`1*T0OkcCe`t`(hq~lY^oG6sl=M24&akw*3@EI=#e_O)-O{r?k7ZbB z4Fcvdp&v*Y=F42f8JfILIo^XwkSzObpVLv5L%Um!x4F32Z~?0;EMSq|1>D@?dE!tO zRfxW?a!?|dNJrVF%uuWbi*cI5F@(ozTujk2DptYB$UiLB^hWd^^7^}x8kNa5wNLL= zP5TLHsjy%XK)=}9?Y8j~A93nB6`zJD-!&bdaDZpj zv>damNGwy~p0|gi6mfKtMDmynt6Dp3EeyawzS6kYdQ}ES3%omMd#3o5C9I0`ZF?1%^-DstmW|IlL1XH!82$7iTB)nGR{t z&d1%2Om@rDE1WFQOo_CCSt z*pA{WL=OoYt6Z9cuQ6?Uq|rDAul0@8%y8V z*XR2EY`1E^9y`B7ddwXK)}Q6>q0f^dr2mvVNTEsikKFO+8_us8NrQa9E&{PX<23EM!>cuM17kEN z3H8XzUM%9D3yl#70=d4Se;QnT$+AyWJlKo>6(&z+a-BtV>Vo)3vfL_nYj?Rv5w`18EC70NbA%qcI+qvyUTTHPz9YCs#@Mwvk%WbFsF&rm+K}yD;p#kwf|W@x45L z_?OQyu$-FPXqL>f&71|!@FGcNm&nIq0i{n&jFFBClGflhi@|7Oi* z^C9Ol-Gy0QXJ2wSaculICO=GceUuB-1PYvGL2M;L9Y^r_yvn#m>-ESSFfuQrVJEm~ zlFAY#-rRR*KY-uv61}j3EEQgFfjekAFj}BoeB1kB*w@)^AHJ$vAR( zGi%JTd)tHVy?XSf?SAu&$(TyV^Q^d@Q@Xd8^fGee$~_tWnzlu0Hr95#QucsNe=OSJ zs#8v3KBOy2ey(sVHS>x){IoZ8T0Vj$T=Phf$=aF(cFf~2PSTc0L`hFIy8&J;M&R4S z^$G?@FKii3-1Ugbg-a7{1cCHI-wz=cApXazj|42?c|ecT*xu~{>2_j0)`v94Y8j@3@^KJYzc?&$+{i zW4`jCDjYnspO4SfYUjWGY4@?L{^N}=gcYd}rO4Z8b0X!aV2I1YNPUM|$%FJ9vDJ5@ zdFpiB+=N(Hy7jtc-c!`?vS6Q|yV#dgyAi{$J-4$tT(J32q~%+urfroDPW}UC5k0}o zyNpC-UIWX{q$6}0_sB{vc=lWO^&^bYkpQEvVf{9#TL7I7ImxzN4{3DO^LNG0btA)@ zvyJKB;n6YOvL|vdxPjAw^kIVIXDUc(WP2}9n}Km8{AcP};XgRuG{w^NOL0rb*;>U= zCXbVfe##aIQh4ct5E!$KyiPcR9n2Vn%cX}G^1+w_CAT%R`GJ_K4;&yHw{g@C*Y9-c zapk;xf8R{%5#Yhr2VV6Vg8nq?X%C!!t~AAsYP!Xu_Z%OIrBF&iq-07a?z1ORZdkIx znN{%?Esya@R(S&!^OS9u2qZSHdhuLnbP)8GHM+p(Lom0RJwG~7jlEnBeVw0CnT8|Z z2?s@p8h47yU@{JocZO*GCOeBng+}HsBy?Usk=c%gm_H4yg;VQ_vh;>twq-D(X9jB; zSS?;?GAveej%jJ1e^iQQDkLuyYh&6vi))%uU`XN^_RWQwvam}$%X)AAp&>vYi+up8W^X~t^c;DKt^<`Xs-{4cOH&-7eKhn7 zI}iG~d%1?gd`v->X1xzx`3Q3yvFv&>z;cSK7*xal?@ls!l=e$TKx0j^9qKR2Ql)vOugfH$d(~ z8>zpB^NCw|ZZ}B?yi;m;2N2q>c1-oWA=QSf^{PU!aiKcJ5eawA;@q(oG8vunYa^yya9VK?pPQgZ4BJ%;>UJIIFlplc#!(JeyqcpPSh8C9cqvWn=0=BQ;xKS3JU^+l z{!j!r1+XM7WFF;L(8_R1so*C8@_lzs#Rxh#FlCZ4;M5Y`YaU17JfCBsU5lpQjF7Gj z4}ChB;ZFY9{Nex}^(4K)4b3u9vdpC_bHg>_E{m;(ht+J?HaV0?b=@n3oB>o#kz5%7AgDxlYyG z@C8NHzz%MyTk3!lZoBO>-xSm52llqG8x#H;V3}MCfg`J@u>uPYjU;q)EJb9jYn+y3 ztYICWSt+s-e>8Do71|wtDL+Q&1w|FrWtQW=bZgp* zns3uP2|wi2p)E9?lvUWx&@z?K3u-N(02e#Oc#qv&UK~9ghr|kAW{A+TAP!AyUWPR( zO$DlBspiFV9ke-u_RV|z50=5<*qOIvoVhMYv{J5n5y9KVY*1s%d=c20FBm!DzYi$iCcanw_Kj8Sks;iKKKoN$@NSb<6!A@M>3Gvz zF&}-Xrb>k1J?h`1AD#Va9S4viPsfxG^+NrpQ8H$FrkXxFrkZ3~4VieTivBr?e|7)q zlSwu3H)j$54`+7AIxMP@_Fwppzhrg2xWFE}-i-Fv^LyXS8@5OWs*@Yu`^nP9)mstW zi-Z~0eT3z)))=L%ikdW2y3FXkb~@s8iwh+4@6FpU!5b6%!J`gC;Z}>_!jxARSE(CB z?J$kM3zFy9BdtAe1IarQk=D9339%2Qt4$7JbJ*`&F!dI8w3OFZq=*yLpHBe9zpvG0 zHJT!mEzeSDq4i143ar+Vdz?+Z@(Ez1tO+p-;Q-(+cH!92Wh_Bh(o)7j!kjs!QKoQm z%2bH#WrQJ`+EEFK#DzqfHrEmW+$uHkp!d@-H0(SQvhwJv&T8E;*vve%#sx``jIRic zC9qP4HsJ|L#JQXKp~=t7rsLjxAjYXuV>XNnA@nMtlGBCuCK6*DLG8e4+Q@Xsp+8kq zgO6&N#-d~8krwb;HJxYFK-`TsC7-hNYc)QoR_MZc4}#>QyB;qnLm+w65~mrp#Oad=CM{MT+33=w zV6}};1)7h)mQFX=$g=QM=-MO@KX$UN3P1s3e|43BZ1ihslm6&};?nYaLGp@^%i8)k z_`e4IFBUdF(d9rr|6zWbsWw}8&%uV>cyRvitMP8~Mmo=k|J&x1j;O>3MC)qg{&vqj z(sSg1Ftu6aJkN5_@gD8UtZ8}NL;L7zY^@Vn-2gcyMyggCp3;qRGKo-A)I0i$cLegs zG)LAObs&1HnWGSeI~7zM)g48ZBf9HZ%3HGbo5F*lqd~>(uHnc`)4WlC*7$evBBp7N|XjoHT0amTwC6AC_B3Z0pT0 zpMUYy+mbYX*29DfxXSsc&-!;kV-LTuTSc>lQf$1x&PC_DGCeG)0z5OawQlXeU zQe_y{{>jeK!Oqcmo5bK3jTStO+knPU^6jK?duu>U5QdiLs>o~xNbN_@={m!TyU-202r3A8} z3{6~pipv7naiy%T;e!)z^~|go|El`!!fVy}k!BtiyWXy$5XA=p^v}Nt-dZmSn{6d-{kXQ&48s=KKY&s1+zqA6mCLt3Zo3T&e!ncCy5AlE(jJ>fu2&|UI_~EGSm_UwwjAHoKiNM z1cm0>w0j+rQf;b2PL%_Gj-Je+wD3{QVzj z`ri%wO58rO&3{V-^c3KC?)i80uWaQbx%;= size) return null; + return array[i]; + } + + public int size() { + return size; + } + + public void remove(int i) { + if (i < 0 || i >= size) return; + for (int j = i; j < size; j++) { + array[j] = array[j + 1]; + } + --size; + } + public boolean isEmpty() { + return size == 0; + } +} diff --git a/group08/875325254/2-26/LinkList.java b/group08/875325254/2-26/LinkList.java new file mode 100644 index 0000000000..a6b785ee79 --- /dev/null +++ b/group08/875325254/2-26/LinkList.java @@ -0,0 +1,73 @@ +/** + * Created by Great on 2017/2/24. + */ +public class LinkList { + private class Node{ + Node next; + int data; + } + private Node rear; + private Node top; + private int size = 0; + public void add(int e) { + if (rear == null) { + rear = new Node(); + top = rear; + }else { + rear.next = new Node(); + rear = rear.next; + } + rear.data = e; + ++size; + } + + public Integer getReciprocal(int count) { + if (top == null || count < 1) return null; + Node node = top; + int size = 0; + while( node.next != null) { + node = node.next; + size++; + } + if (size+1 < count) return null; + return get(size+1-count); + } + + public Integer get(int i) { + if (i < 0 || i >= size) return null; + return getNode(i).data; + } + + public void remove(int i) { + if (i < 0 || i >= size) return; + if (i == 0 ) { + top = top.next; + return; + } + if (i == size - 1) { + getNode(i - 1).next = null; + } + Node front = getNode(i - 1); + Node back = getNode(i + 1); + front.next = back; + --size; + } + + private Node getNode(int i) { + if (i < 0 || i >= size) return null; + Node node = top; + for (int j = 0; j < size; j++) { + if (j == i) return node; + node = node.next; + } + return null; + } + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } +} diff --git a/group08/875325254/2-26/Queue.java b/group08/875325254/2-26/Queue.java new file mode 100644 index 0000000000..6e3b80d7d2 --- /dev/null +++ b/group08/875325254/2-26/Queue.java @@ -0,0 +1,41 @@ +import java.util.Arrays; + +/** + * Created by Great on 2017/2/23. + */ +public class Queue { + private class Node{ + Node next; + int data; + } + private int size; + private Node front; + private Node rear; + public void add(int e) { + if (front == null) { + front = new Node(); + rear = front; + }else { + front.next = new Node(); + front = front.next; + } + front.data = e; + ++size; + } + + public Integer poll() { + if (rear == null) return null; + int data = rear.data; + rear = rear.next; + --size; + return data; + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group08/875325254/2-26/Stack.java b/group08/875325254/2-26/Stack.java new file mode 100644 index 0000000000..78b9884ccb --- /dev/null +++ b/group08/875325254/2-26/Stack.java @@ -0,0 +1,29 @@ +import java.util.Arrays; + +/** + * Created by Great on 2017/2/23. + */ +public class Stack { + private final int DEFAULT_SIZE = 20; + private int base; + private int top; + private int[] array = new int[DEFAULT_SIZE]; + public void push(Integer e) { + if (top == array.length){ + array = Arrays.copyOf(array, array.length + DEFAULT_SIZE); + } + array[top] = e; + ++top; + } + public Integer pop(){ + if (top == 0) return null; + top--; + return array[top]; + } + public int size() { + return top; + } + public boolean isEmpty(){ + return top == 0; + } +} diff --git a/group08/875325254/2-26/Test.java b/group08/875325254/2-26/Test.java new file mode 100644 index 0000000000..b397fd3e16 --- /dev/null +++ b/group08/875325254/2-26/Test.java @@ -0,0 +1,35 @@ +import java.util.List; + +/** + * Created by Great on 2017/2/23. + */ +public class Test { + public static void main(String[] args) { + ArrayList arrayList = new ArrayList(); + LinkList linkList = new LinkList(); + Queue queue = new Queue(); + Stack stack = new Stack(); + for (int i = 0; i < 10; i++) { + arrayList.add(i); + linkList.add(i); + queue.add(i); + stack.push(i); + } + System.out.println("ArrayList:"); + for (int i = 0; i < arrayList.size(); i++) { + System.out.println(arrayList.get(i)); + } + System.out.println("LinkList:"); + for (int i = 0; i < linkList.size(); i++) { + System.out.println(linkList.get(i)); + } + System.out.println("Queue:"); + while (!queue.isEmpty()) { + System.out.println(queue.poll()); + } + System.out.println("Stack:"); + while (!stack.isEmpty()) { + System.out.println(stack.pop()); + } + } +} diff --git a/group08/875325254/875325254.md b/group08/875325254/875325254.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group08/875325254/875325254.md @@ -0,0 +1 @@ + diff --git a/group08/group08.md b/group08/group08.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group08/group08.md @@ -0,0 +1 @@ + diff --git a/group09/1271620150/Work01/.gitignore b/group09/1271620150/Work01/.gitignore new file mode 100644 index 0000000000..1ed44d051c --- /dev/null +++ b/group09/1271620150/Work01/.gitignore @@ -0,0 +1,19 @@ +*.class +*.classpath +*.project + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +#ide config +.metadata +.recommenders +/bin/ diff --git a/group09/1271620150/Work01/src/com/coding/basic/ArrayList.java b/group09/1271620150/Work01/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..fd0bb1a7e5 --- /dev/null +++ b/group09/1271620150/Work01/src/com/coding/basic/ArrayList.java @@ -0,0 +1,100 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private Object[] elements; + + private int size; + + public ArrayList(int initialCapacity) { + super(); + if (initialCapacity < 0) + throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); + this.elements = new Object[initialCapacity]; + } + + public ArrayList() { + this(10); + } + + public void add(Object obj) { + ensureCapacity(size + 1); + elements[size++] = obj; + + } + + public void add(int index, Object obj) { + rangeCheck(index); + ensureCapacity(size + 1); + System.arraycopy(elements, index, elements, index + 1, size - index); + elements[index] = obj; + size++; + } + + public Object get(int index) { + rangeCheck(index); + return elements[index]; + } + + public Object remove(int index) { + rangeCheck(index); + Object toRemove = elements[index]; + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elements, index + 1, elements, index, numMoved); + elements[--size] = null; + return toRemove; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new ArrayListIterator(); + } + + private void ensureCapacity(int minCapacity) { + int oldCapacity = elements.length; + if (minCapacity > oldCapacity) { + int newCapacity = oldCapacity * 2; + if (newCapacity < minCapacity) + newCapacity = minCapacity; + elements = Arrays.copyOf(elements, newCapacity); + } + } + + private void rangeCheck(int index) { + if (index >= size) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + private String outOfBoundsMsg(int index) { + return "Index: " + index + ", Size: " + this.size; + } + + private class ArrayListIterator implements Iterator{ + + private int pos = 0; + + public boolean hasNext() { + return pos != size; + } + + public Object next() { + int i = pos; + if (i >= size) + throw new NoSuchElementException(); + Object[] elements = ArrayList.this.elements; + if (i >= elements.length) + throw new ConcurrentModificationException(); + pos = i + 1; + return (Object) elements[i]; + } + } + +} \ No newline at end of file diff --git a/group09/1271620150/Work01/src/com/coding/basic/Iterator.java b/group09/1271620150/Work01/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..7c02cc6e51 --- /dev/null +++ b/group09/1271620150/Work01/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} \ No newline at end of file diff --git a/group09/1271620150/Work01/src/com/coding/basic/LinkedList.java b/group09/1271620150/Work01/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..5538fe9e78 --- /dev/null +++ b/group09/1271620150/Work01/src/com/coding/basic/LinkedList.java @@ -0,0 +1,277 @@ +package com.coding.basic; + +import java.util.Collection; +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node first; + private Node last; + private int size; + + public LinkedList() { + } + + public LinkedList(Collection c) { + this(); + addAll(size, c); + } + + private void addAll(int index, Collection c) { + checkPositionIndex(size); + + Object[] a = c.toArray(); + int numNew = a.length; + if (numNew == 0) + return; + + Node pred, succ; + if (index == size) { + succ = null; + pred = last; + } else { + succ = node(index); + pred = succ.prev; + } + + for (Object o : a) { + Node newNode = new Node(pred, o, null); + if (pred == null) + first = newNode; + else + pred.next = newNode; + pred = newNode; + } + + if (succ == null) { + last = pred; + } else { + pred.next = succ; + succ.prev = pred; + } + + size += numNew; + } + + public void add(Object o) { + linkLast(o); + } + + private void linkLast(Object o) { + Node l = last; + Node newNode = new Node(l, o, null); + last = newNode; + if (l == null) { + first = newNode; + } else { + l.next = newNode; + } + size++; + + } + + public void add(int index, Object o) { + checkPositionIndex(index); + if (index == size) { + linkLast(o); + } else { + Node l = node(index); + linkBefore(o, l); + } + + } + + public void linkBefore(Object o, Node succ) { + final Node pred = succ.prev; + final Node newNode = new Node(pred, o, succ); + succ.prev = newNode; + if (pred == null) + first = newNode; + else + pred.next = newNode; + size++; + } + + public Object get(int index) { + checkElementIndex(index); + return node(index).data; + } + + public Object remove(int index) { + checkElementIndex(index); + return unlink(node(index)); + } + + private Object unlink(Node node) { + final Object element = node.data; + final Node next = node.next; + final Node prev = node.prev; + + if (prev == null) { + first = next; + } else { + prev.next = next; + node.prev = null; + } + + if (next == null) { + last = prev; + } else { + next.prev = prev; + node.next = null; + } + + node.data = null; + size--; + return element; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + linkFirst(o); + } + + private void linkFirst(Object o) { + final Node f = first; + final Node newNode = new Node(null, o, f); + first = newNode; + if (f == null) + last = newNode; + else + f.prev = newNode; + size++; + } + + public void addLast(Object o) { + linkLast(o); + } + + public Object removeFirst() { + final Node f = first; + if (f == null) + throw new NoSuchElementException(); + return unlinkFirst(f); + } + + private Object unlinkFirst(Node f) { + final Object element = f.data; + final Node next = f.next; + f.data = null; + f.next = null; + first = next; + if (next == null) + last = null; + else + next.prev = null; + size--; + return element; + } + + public Object removeLast() { + final Node l = last; + if (l == null) + throw new NoSuchElementException(); + return unlinkLast(l); + } + + private Object unlinkLast(Node l) { + final Object element = l.data; + final Node prev = l.prev; + l.data = null; + l.prev = null; + last = prev; + if (prev == null) + first = null; + else + prev.next = null; + size--; + return element; + } + + public Iterator iterator(int index) { + return new LinkListIterator(index); + } + + private static class Node { + Object data; + Node next; + Node prev; + + Node(Node prev, Object obj, Node next) { + this.data = obj; + this.next = next; + this.prev = prev; + } + + } + + Node node(int index) { + // assert isElementIndex(index); + + if (index < (size >> 1)) { + Node x = first; + for (int i = 0; i < index; i++) + x = x.next; + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) + x = x.prev; + return x; + } + } + + private boolean isElementIndex(int index) { + return index >= 0 && index < size; + } + + private boolean isPositionIndex(int index) { + return index >= 0 && index <= size; + } + + private String outOfBoundsMsg(int index) { + return "Index: " + index + ", Size: " + size; + } + + private void checkElementIndex(int index) { + if (!isElementIndex(index)) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + private void checkPositionIndex(int index) { + if (!isPositionIndex(index)) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + private class LinkListIterator implements Iterator { + private Node lastReturned = null; + private Node next; + private int nextIndex; + + LinkListIterator(int index) { + next = (index == size) ? null : node(index); + nextIndex = index; + } + + @Override + public boolean hasNext() { + return nextIndex < size; + } + + @Override + public Object next() { + if (!hasNext()) + throw new NoSuchElementException(); + + lastReturned = next; + next = next.next; + nextIndex++; + return lastReturned.data; + } + + } + +} \ No newline at end of file diff --git a/group09/1271620150/Work01/src/com/coding/basic/List.java b/group09/1271620150/Work01/src/com/coding/basic/List.java new file mode 100644 index 0000000000..c86b745572 --- /dev/null +++ b/group09/1271620150/Work01/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group09/1271620150/Work01/src/com/coding/basic/Queue.java b/group09/1271620150/Work01/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..31fea0bf03 --- /dev/null +++ b/group09/1271620150/Work01/src/com/coding/basic/Queue.java @@ -0,0 +1,44 @@ +package com.coding.basic; + +public class Queue { + private static final int CAPACITY = 10; + private int size; + private int front; + private int tail; + private Object[] array; + + public Queue(){ + this.size = CAPACITY; + array = new Object[size]; + front = tail = 0; + } + + + public void enQueue(Object o) throws Exception{ + if (size() == size -1) + throw new Exception("Queue is full"); + array[tail] = o; + tail = (tail +1) % size; + } + + public Object deQueue() throws Exception{ + Object o; + if (isEmpty()) + throw new Exception("Queue is empty"); + o = array[front]; + front = (front + 1) % size; + return o; + } + + public boolean isEmpty(){ + return (front==tail); + } + + public int size(){ + if (isEmpty()) + return 0; + else + return (size + tail - front) % size; + } + +} diff --git a/group09/1271620150/Work01/src/com/coding/basic/Stack.java b/group09/1271620150/Work01/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..c1ac74c2cc --- /dev/null +++ b/group09/1271620150/Work01/src/com/coding/basic/Stack.java @@ -0,0 +1,45 @@ +package com.coding.basic; + +public class Stack { + private static final int CAPACITY = 10; + private int capacity; + private int top = -1; + Object[] array; + public Stack(){ + this.capacity = CAPACITY; + array = new Object[capacity]; + } + public void push(Object o) throws Exception{ + if(size()== CAPACITY){ + throw new Exception("Stack is full"); + } + array[++ top] = o; + } + + public Object pop() throws Exception{ + if(isEmpty()){ + throw new Exception("Stack is empty"); + } + return array[top --]; + } + + public Object peek() throws Exception{ + if(isEmpty()){ + throw new Exception("Stack is empty"); + } + return array[top]; + } + + public boolean isEmpty(){ + return (top < 0); + } + + public int size(){ + if (isEmpty()) + return 0; + else + return top + 1; + + } + +} \ No newline at end of file diff --git a/group09/277123057/Week01/ArrayList.java b/group09/277123057/Week01/ArrayList.java new file mode 100644 index 0000000000..5af3f5e6b0 --- /dev/null +++ b/group09/277123057/Week01/ArrayList.java @@ -0,0 +1,55 @@ +package Week01; +/* + * time:2017-2-20 21:51 created + * + */ +public class ArrayList implements List{ + + private int size = 0; + //ٵĿռֻ100 + private Object[] elementData = new Object[100]; + + //ĩλ + public void add(Object o){ + elementData[size++] = o; + } + + //ǰλԪأƶǰλڸλõԪؼкԪ + public void add(int index, Object o){ + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + return elementData[index]; + } + //ƳָԪ,ұԪ + public Object remove(int index){ + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementData, index+1, elementData, index, numMoved); + elementData[--size] = null; + return elementData[index]; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + private int pos = 0; + + public boolean hashNext() { + return pos < size(); + } + + public Object next() { + return elementData[pos++]; + } + } +} diff --git a/group09/277123057/Week01/BinaryTreeNode.java b/group09/277123057/Week01/BinaryTreeNode.java new file mode 100644 index 0000000000..787b5a1d76 --- /dev/null +++ b/group09/277123057/Week01/BinaryTreeNode.java @@ -0,0 +1,26 @@ +package Week01; +// +/* + *û + * */ +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData(){ + return data; + } + + public void setData(Object data){ + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left){ + this.left = left; + } +} diff --git a/group09/277123057/Week01/Iterator.java b/group09/277123057/Week01/Iterator.java new file mode 100644 index 0000000000..2be5cbc254 --- /dev/null +++ b/group09/277123057/Week01/Iterator.java @@ -0,0 +1,6 @@ +package Week01; +//time +public interface Iterator { + public boolean hashNext(); + public Object next(); +} diff --git a/group09/277123057/Week01/LinkedList.java b/group09/277123057/Week01/LinkedList.java new file mode 100644 index 0000000000..014fe8f149 --- /dev/null +++ b/group09/277123057/Week01/LinkedList.java @@ -0,0 +1,173 @@ +package Week01; + +import java.util.NoSuchElementException; + +/* + * time:2017-2-22 13:00 + * οhttp://blog.csdn.net/jianyuerensheng/article/details/51204598 + * http://www.jianshu.com/p/681802a00cdf + * jdk1.8Դ + * */ + +//õ˫jdk1.6linkedList˫ѭʵ +public class LinkedList implements List { + + private int size = 0; + private Node first; //ָͷ + private Node last; //ָβڵ + + //endԪأԼaddLast() + public void add(Object o){ + addLast(o); + } + + //index,δοͬͬѧ spike + public void add(int index, Object o){ + if (index < 0 || index > size) + throw new IllegalArgumentException(); + size++; + if (index == size){ + addLast(o); + }else{ + Node target = findIndex(index); + Node newNode = new Node(o, target,target.next); + if (last == target){ + last = newNode; + }else{ + //target.next = newNode;ҪҪ + target.next.prev = newNode;//е + } + } + size++; + } + + public Object get(int index){ + if ( index < 0 || index > size){ + throw new IllegalArgumentException(); + } + return findIndex(index).data; + } + //ɾindexָԪ + public Object remove(int index){ + if (index < 0 || index > size){ + throw new IllegalArgumentException(); + } + + Node target = findIndex(index); + if (target == first){ + first = first.next; + first.prev = null; + }else if(target == last){ + last = last.prev; + last.next = null; + }else{ + target.prev.next = target.next; + target.next.prev = target.prev; + } + return target.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + + Node f = first; + Node newNode = new Node(o,null,f); + first = newNode; + if (f == null) + last = newNode; //fΪnull˵ֻlastָ + else + f.prev = newNode; + size++; + } + + public void addLast(Object o){ + Node l = last; + Node newNode = new Node(o, l, null); + last = newNode; + if (l == null) + first = newNode; + else + l.next = newNode; + size++; + } + + + public Object removeFirst() { + if ( first == null) + throw new NoSuchElementException(); + Node f = first; + Object data = f.data; + Node next = f.next; + //ȥԪָΪnull + f.data = null; + f.next = null; + first = next; + if (next == null) + last = null; + else + next.prev = null; + size--; + return data; + } + + public Object removeLast(){ + if (last == null) + throw new NoSuchElementException(); + Node l = last; + Object data = l.data; + Node previous = l.prev; + l.data = null; + l.prev = null; + last = previous; + if (previous == null) + first = null; + else + previous.next = null; + size--; + return data; + } + + public Iterator iterator(){ + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + Node curNode = first; + public boolean hashNext() { + return curNode != null; + } + public Object next() { + if (!hashNext()) + throw new NoSuchElementException(); + Object data = curNode.data; + curNode = curNode.next; + return data; + } + } + private Node findIndex(int index) { + Node target = first; + int i = 0; + while(i < index){ + target = target.next; + i++; + } + return target; + } + + // + private static class Node{ + private Object data; + //ĬҲnull + private Node prev = null; //һԪؽڵ + private Node next = null;//һԪؽڵ + + public Node(Object data, Node pre, Node next){ + this.data = data; + this.prev = pre; + this.next = next; + } + } +} diff --git a/group09/277123057/Week01/List.java b/group09/277123057/Week01/List.java new file mode 100644 index 0000000000..733a02a0d6 --- /dev/null +++ b/group09/277123057/Week01/List.java @@ -0,0 +1,9 @@ +package Week01; +//time: +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group09/277123057/Week01/Queue.java b/group09/277123057/Week01/Queue.java new file mode 100644 index 0000000000..dd786574b8 --- /dev/null +++ b/group09/277123057/Week01/Queue.java @@ -0,0 +1,29 @@ +package Week01; +/* + * time:2017-2-25 13:46 created by Doen + * + * */ +public class Queue { + private LinkedList elementData = new LinkedList(); + // + + public void enQueue(Object o){ + elementData.add(o); + } + + // + public Object deQueue(){ + if (isEmpty()) + throw new UnsupportedOperationException(); + return elementData.remove(0); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } + +} diff --git a/group09/277123057/Week01/Stack.java b/group09/277123057/Week01/Stack.java new file mode 100644 index 0000000000..9a10468385 --- /dev/null +++ b/group09/277123057/Week01/Stack.java @@ -0,0 +1,30 @@ +package Week01; + +import java.util.NoSuchElementException; + +/* + * time:2017-2-25 13:19 created by Doen + * change + * */ +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (isEmpty()) + throw new NoSuchElementException(); + return elementData.remove(elementData.size()-1); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group09/277123057/Week01/Test.java b/group09/277123057/Week01/Test.java new file mode 100644 index 0000000000..5d4517d9af --- /dev/null +++ b/group09/277123057/Week01/Test.java @@ -0,0 +1,9 @@ +package Week01; +//time +public class Test { + public static void main(String[] args){ + ArrayList arraylist = new ArrayList(); + arraylist.add(1); + arraylist.add("A"); + } +} diff --git "a/group09/396077060/20170226/article/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200\347\237\245\350\257\206.txt" "b/group09/396077060/20170226/article/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200\347\237\245\350\257\206.txt" new file mode 100644 index 0000000000..67195ecf59 --- /dev/null +++ "b/group09/396077060/20170226/article/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200\347\237\245\350\257\206.txt" @@ -0,0 +1,9 @@ +现代计算机基本都是冯·诺依曼结构,而冯·诺依曼结构中,最核心的思想便是“存储程序思想”,即:把运算程序存在机器的存储器中。 + +在这种结构下,计算机被分成了五个部分:运算器、控制器、存储器、输入设备和输出设备。其中运算器和控制器构成了CPU的最重要部分。早期的冯·诺依曼结构型计算机是以运算器为核心的,譬如穿孔纸带机,运算核心通过从穿孔纸带中获取控制信息与运算信息完成指定的任务。在这种结构下,任何操作都要先与运算核心打交道。直到后来发明了内存,将大量的控制信息与运算信息存储到集成电路上,让计算机有了飞跃式的发展。内存拥有着大大超过于穿孔纸带的存储效率,于是,计算机的中心慢慢地从运算器转移到了存储器。在这种模式下,运算器、控制器、以至于输入输出设备,都是通过与内存交换信息得到很好的协作。 + +存储器的读写效率确实高,但是它也有着单位造价高和相对容量较小的缺点,虽然现在SSD已经也很便宜了,但是对于以前的工程师来说,这都是不可想象的。于是乎,经过伟大的科学家们与工程师们的探索,他们发现了计算机程序运行过程中的“局部性原理”。“局部性原理”包括时间局部性和空间局部性,时间局部性是指:一段被访问过的程序在不久的时间内很有可能会被再次访问,空间局部性是指:一段被访问过的程序的临近的程序很可能马上被访问到。在有的资料中还提到了顺序局部性,它的意思是指:大部分程序是顺序执行的。在“局部性原理”的指导下,存储分级结构便出现了。存储器被分为若干个级别,越靠近CPU计算速度越快但存储容量小、造价高,如寄存器、Cache,越远离CPU,从内存到硬盘,计算速度越慢,但容量大,造价也越低。采用这种结构,最终使工程师们在性能与造价上得到了很好的平衡。 + +再回到冯·诺依曼结构来,它的“把程序存储起来”到底是什么意思呢?好比我们照着菜谱学做菜,菜谱就是存储好的程序。我们要按照菜谱上的步骤,从选材、买菜、炒菜、出锅、上桌等一系列步骤来达到最终的目标。“存储程序”的思想就是要求把这些基本的步骤存到存储器中,然后当我们要实现某一运算的时候,就将实现这一运算所需要的操作调取出来。菜谱上的一条条步骤,就相当于计算机中的指令,程序指令指挥着计算机各个部件的运行。 + +一个计算机指令包含操作码和操作数两个部分,顾名思义,操作码指示的是计算机需要做的操作,操作数则标识了某一次操作需要用到的数据。由于指令长度有限,操作数的最大寻址范围又远小于内存的寻址范围,于是操作数的获取方式又分为很多种,包括立即数寻址、直接寻址、间接寻址、相对寻址、基址寻址、变址寻址等。一条指令的执行主要包括如下几个步骤:取指令、分析指令、执行指令,有的指令还包括内存写回。 diff --git a/group09/396077060/20170226/src/per/zyf/bds/ArrayList.java b/group09/396077060/20170226/src/per/zyf/bds/ArrayList.java new file mode 100644 index 0000000000..ac717ceb23 --- /dev/null +++ b/group09/396077060/20170226/src/per/zyf/bds/ArrayList.java @@ -0,0 +1,174 @@ +/** +* @Title: ArrayList.java +* @Description: ArrayList的实现 +* @author glorychou +* @date 2017年2月22日 下午10:41:58 +*/ +package per.zyf.bds; + +import java.util.Arrays; + +/** + * ArrayList的存储结构其实就是一维数组 + * 只不过在这个类中将对数组的一些操作(包括添加元素、删除元素等)封装了起来 + * @author glorychou + * + * @param + * @see per.zyf.bds.List + */ +public class ArrayList implements List { + // 默认数组大小 + private static final int DEFAULT_CAPACITY = 10; + + // 数组实际大小 + private int size; + + // 存储元素的数组 + protected Object[] elementData; + + // 一个用来记录初始状态的空数组实例 + private static final Object[] CAPACITY_EMPTY_ELEMENTDATA = {}; + + /*** + * 构造初始元素数组 + */ + public ArrayList() { + this.elementData = CAPACITY_EMPTY_ELEMENTDATA; + } + + /*** + * + * @Description: 在末尾添加元素 + * @param e 元素 + */ + @Override + public boolean add(E e) { + int minCapacity = size + 1; + + // 判断数组中是否有元素 + if (elementData == CAPACITY_EMPTY_ELEMENTDATA) { + minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); + } + + // 判断是否溢出 + if (minCapacity - elementData.length > 0) + grow(minCapacity); + + // 添加元素 + elementData[size++] = e; + + return true; + } + + /*** + * + * @Description: 在索引指定位置增加元素 + * @param index 索引 + * @param e 元素 + */ + @Override + public boolean add(int index, E e) { + int minCapacity = size + 1; + + // 索引位置不合法抛出异常 + rangeCheck(index); + + // 判断数组中是否有元素 + if (elementData == CAPACITY_EMPTY_ELEMENTDATA) { + minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); + } + + // 判断是否溢出 + if (minCapacity - elementData.length > 0) + grow(minCapacity); + + // 插入点后的元素后移 + System.arraycopy(elementData, index, elementData, index + 1, size - index); + + // 在索引处加入数据 + elementData[index] = e; + + return true; + } + + /*** + * + * @Description: 得到索引指定位置的元素 + * @param index 索引 + * @return E 索引指定的元素 + */ + @Override + @SuppressWarnings("unchecked") + public E get(int index) { + // 索引位置不合法抛出异常 + rangeCheck(index); + + return (E) elementData[index]; + } + + /*** + * + * @Description: 删除索引指定位置的元素 + * @param index 索引 + * @return void + */ + @Override + @SuppressWarnings("unchecked") + public E remove(int index) { + // 索引位置不合法抛出异常 + rangeCheck(index); + + E removeElement = (E) elementData[index]; + + // 将要移除元素后的元素前移 + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + // 数组大小减一,并清除多余元素 + elementData[--size] = null; + + return removeElement; + } + + /* + * @see per.zyf.bds.List#size() + */ + @Override + public int size() { + return size; + } + + + /* + * @see per.zyf.bds.List#isEmpty() + */ + @Override + public boolean isEmpty() { + if (elementData == CAPACITY_EMPTY_ELEMENTDATA) { + return true; + } + return false; + } + + /*** + * + * @Description: 溢出时增长空间 + * @param minCapacity 最小容量 + * @return void + */ + private void grow(int minCapacity) { + int oldCapacity = elementData.length; + // 容量增大一半 + int newCapacity = oldCapacity + (oldCapacity >> 1); + elementData = Arrays.copyOf(elementData, newCapacity); + } + + /*** + * + * @Description: 索引范围检查 + * @param index 索引 + * @return void + */ + private void rangeCheck(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } +} \ No newline at end of file diff --git a/group09/396077060/20170226/src/per/zyf/bds/BinaryTree.java b/group09/396077060/20170226/src/per/zyf/bds/BinaryTree.java new file mode 100644 index 0000000000..8cc10ba5dc --- /dev/null +++ b/group09/396077060/20170226/src/per/zyf/bds/BinaryTree.java @@ -0,0 +1,96 @@ +/** +* @Title: BinaryTree.java +* @Description: 二叉排序树的实现 +* @author glorychou +* @date 2017年2月25日 下午10:22:03 +*/ +package per.zyf.bds; + +/** + * @author glorychou + * + */ +public class BinaryTree> { + // 根节点 + private Node root; + // 树大小 + private int size; + + /** + * @Description: 在树中插入元素 + * @param e 节点数据 + * @return boolean 处理情况 + */ + public boolean add(E e) { + + // 创建新节点 + final Node newNode = new Node<>(null, e, null); + + // 按照二叉排序方式插入 + if (root != null) { + Node parentNode = null; + Node compareNode = root; + + while(compareNode != null) { + // 新节点大于比较节点则插入右子树中 + if(e.compareTo(compareNode.item) > 0) { + parentNode = compareNode; + compareNode = compareNode.rightChild; + + if(compareNode == null) + parentNode.rightChild = newNode; + } else {// 新节点小于或等于比较节点则插入左子树中 + parentNode = compareNode; + compareNode = compareNode.leftChild; + + if(compareNode == null) + parentNode.rightChild = newNode; + } + } + } else + root = newNode; + + size++; + return true; + } + + /** + * @Description: 中序遍历输出 + * @return void 返回类型 + */ + public void inorderPrint(Node e) { + if(e == null) return; + inorderPrint(e.leftChild); + System.out.print(e.item.toString() + " "); + inorderPrint(e.rightChild); + } + + /** + * @Description: 判断树是否为空 + * @return boolean 是否为空 + */ + public boolean isEmpty() { + return size > 0 ? false : true; + } + + /** + * @Description: 获取树的节点数 + * @return int 树节点数 + */ + public int size() { + return size; + } + + // 树节点 + private static class Node { + E item; + Node leftChild; + Node rightChild; + + Node(Node l, E e, Node r) { + leftChild = l; + item = e; + rightChild = r; + } + } +} diff --git a/group09/396077060/20170226/src/per/zyf/bds/LinkedList.java b/group09/396077060/20170226/src/per/zyf/bds/LinkedList.java new file mode 100644 index 0000000000..ed332444df --- /dev/null +++ b/group09/396077060/20170226/src/per/zyf/bds/LinkedList.java @@ -0,0 +1,252 @@ +/** +* @Title: LinkedList.java +* @Description: 双向链表的实现 +* @author glorychou +* @date 2017年2月24日 上午12:23:00 +*/ +package per.zyf.bds; + +/** + * LinkedList的存储结构其实就是链表 + * @author glorychou + * + * @param + * @see per.zyf.bds.List + */ +/** + * @author glorychou + * + * @param + */ +/** + * @author glorychou + * + * @param + */ +public class LinkedList implements List { + // 链表头 + private Node first; + + // 链表尾 + private Node last; + + // 链表大小 + private int size; + + /* + * @see per.zyf.bds.List#add(java.lang.Object) + */ + @Override + public boolean add(E e) { + linkLast(e); + return true; + } + + /* + * @see per.zyf.bds.List#add(int, java.lang.Object) + */ + @Override + public boolean add(int index, E e) { + // 判断索引是否在合理的位置 + rangeCheck(index); + + // 索引值为链表长度,则添加到链表末尾 + if (index == size) { + linkLast(e); + } else { + // 找到索引指定的节点,然后将新节点插入该节点后面 + final Node p = node(index); + final Node newNode = new Node<>(p, e, p.next); + p.next = newNode; + size++; + } + + return true; + } + + /* + * @see per.zyf.bds.List#get(int) + */ + @Override + public E get(int index) { + return node(index).item; + } + + + /* (non-Javadoc) + * @see per.zyf.bds.List#remove(int) + */ + @Override + public E remove(int index) { + rangeCheck(index); + + Node p = node(index); + E e = p.item; + + // 所需删除节点的前面有节点,则改变前一节点的下一跳 + if(p.prev != null) + p.prev.next = p.next; + // 所需删除节点的后面有节点,则改变后一节点的上一跳 + if(p.next != null) + p.next.prev = p.prev; + + // 清空数据 + p.prev = null; + p.item = null; + p.next = null; + + size--; + + return e; + } + + /** + * @Description: 在链表头部增加节点 + * @param e 新节点数据 + * @return void 返回类型 + */ + public void addFirst(E e) { + final Node newNode = new Node<>(null, e, first); + first.prev = newNode; + size++; + } + + /** + * @Description: 移除首节点 + * @return E 所删除节点的数据 + */ + public E removeFirst() { + if(first != null) { + final E e = first.item; + final Node n = first.next; + + if(n != null) + n.prev = null; + + // 清空数据,让GC来回收内存 + first.item = null; + first.next = null; + // 指定新的头节点 + first = n; + + size--; + return e; + } else + return null; + } + + /** + * @Description: 删除最后一个节点 + * @return 设定文件 + * @return E 所删除数据 + * @throws + */ + public E removeLast() { + if(last != null) { + final E e = last.item; + final Node p = last.prev; + + if(p != null) + p.next = null; + + // 清空数据,让GC来回收内存 + last.item = null; + last.prev = null; + // 指定新的尾节点 + last = p; + + size--; + return e; + } else + return null; + } + + /* (non-Javadoc) + * @see per.zyf.bds.List#size() + */ + @Override + public int size() { + return size; + } + + /* (non-Javadoc) + * @see per.zyf.bds.List#isEmpty() + */ + @Override + public boolean isEmpty() { + return true; + } + + /** + * @Description: 在链尾增加节点 + * @param e 新节点数据 + * @return void 返回类型 + */ + private void linkLast(E e) { + // 保存旧链尾节点 + final Node p = last; + + // 创建新节点,并将新节点设置为链尾节点 + final Node newNode = new Node<>(p, e, null); + last = newNode; + + // 若链表无节点,则将新节点设置为表头节点 + if (p == null) + first = newNode; + else // 若链表已经有节点,则将新节点设置为表尾节点 + p.next = newNode; + + // 表长度加一 + size++; + } + + /*** + * + * @Description: 索引范围检查 + * @param index 索引 + * @return void + */ + private void rangeCheck(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + + /** + * @Description: 获取索引位置的节点 + * @param index 索引 + * @return Node 指定的节点 + */ + private Node node(int index) { + // 判断索引是否在合理的位置 + rangeCheck(index); + + Node specifyNode; + + // 根据判断索引位置在链表的前半部还是后半部,选择不同的检索方式获取指定节点 + if(index < (size >> 1)) { + specifyNode = first; + for (int i = 0; i < index; i++) + specifyNode = specifyNode.next; + } else { + specifyNode = last; + for (int i = 0; i > index; i--) + specifyNode = specifyNode.prev; + } + + return specifyNode; + } + + // 链表节点 + private static class Node { + E item; + Node next; + Node prev; + + Node(Node prev, E e, Node next) { + this.prev = prev; + this.item = e; + this.next = next; + } + } + +} diff --git a/group09/396077060/20170226/src/per/zyf/bds/List.java b/group09/396077060/20170226/src/per/zyf/bds/List.java new file mode 100644 index 0000000000..4195d34521 --- /dev/null +++ b/group09/396077060/20170226/src/per/zyf/bds/List.java @@ -0,0 +1,55 @@ +/** +* @Title: List.java +* @Description: List接口的实现 +* @author glorychou +* @date 2017年2月24日 下午3:02:34 +*/ +package per.zyf.bds; + +/** + * @author glorychou + * + */ +public interface List { + /** + * @Description: 添加元素 + * @param e 所需增加元素 + * @return boolean 处理结果 + */ + boolean add(E e); + + /** + * @Description: 在索引指定位置增加元素 + * @param index 索引 + * @param e 所需增加元素 + * @return boolean 处理结果 + */ + boolean add(int index, E e); + + /** + * @Description: 获取指定元素 + * @param index 索引 + * @return E 返回元素 + */ + E get(int index); + + /** + * @Description: 删除指定元素 + * @param index 索引 + * @return E 返回被删除的元素 + */ + E remove(int index); + + /** + * @Description: 获取List容量 + * @return int List容量 + */ + int size(); + + /** + * @Description: 判断是否为空 + * @return boolean 是否为空 + */ + boolean isEmpty(); + +} diff --git a/group09/396077060/20170226/src/per/zyf/bds/Queue.java b/group09/396077060/20170226/src/per/zyf/bds/Queue.java new file mode 100644 index 0000000000..db8c54cadf --- /dev/null +++ b/group09/396077060/20170226/src/per/zyf/bds/Queue.java @@ -0,0 +1,59 @@ +/** +* @Title: Queue.java +* @Description: 队列的实现 +* @author glorychou +* @date 2017年2月24日 下午3:10:08 +*/ +package per.zyf.bds; + +/** + * @author glorychou + * + */ +public class Queue { + // 队列元素 + private LinkedList elementData; + + // 队列大小 + private int size; + + public Queue() { + elementData = new LinkedList<>(); + } + + /** + * @Description: 入队 + * @param e 入队数据 + * @return void 返回类型 + */ + public void enQueue(E e) { + elementData.add(e); + size = elementData.size(); + } + + /** + * @Description: 出队 + * @return E 出队的数据 + */ + public E deQueue() { + final E e = elementData.removeFirst(); + size = elementData.size(); + return e; + } + + /** + * @Description: 判断队列是否为空 + * @return boolean 是否为空 + */ + public boolean isEmpty() { + return size > 0 ? false : true; + } + + /** + * @Description: 获取队列大小 + * @return int 队列大小 + */ + public int size() { + return size; + } +} diff --git a/group09/396077060/20170226/src/per/zyf/bds/Stack.java b/group09/396077060/20170226/src/per/zyf/bds/Stack.java new file mode 100644 index 0000000000..b0f884b83d --- /dev/null +++ b/group09/396077060/20170226/src/per/zyf/bds/Stack.java @@ -0,0 +1,71 @@ +/** +* @Title: Stack.java +* @Description: 栈的实现 +* @author glorychou +* @date 2017年2月24日 下午3:05:29 +*/ +package per.zyf.bds; + +/** + * @author glorychou + * + */ +public class Stack { + // 栈元素 + private ArrayList elementData; + + // 栈大小 + private int size; + + /** + * 初始化栈 + */ + public Stack() { + elementData = new ArrayList<>(); + } + + /** + * @Description: 压栈 + * @param e 数据 + * @return void 返回类型 + */ + public void push(E e) { + elementData.add(e); + size = elementData.size(); + } + + /** + * @Description: 弹栈 + * @return E 所弹出的数据 + */ + public E pop() { + // 移除最后一项数据 + final E e = elementData.remove(elementData.size()); + size = elementData.size(); + return e; + } + + /** + * @Description: 获取栈顶元素 + * @return E 返回栈顶元素数据 + */ + public E peek() { + return elementData.get(size - 1); + } + + /** + * @Description: 判断栈是否为空 + * @return boolean 返回类型 + */ + public boolean isEmpty() { + return size > 0 ? false : true; + } + + /** + * @Description: 获取栈大小 + * @return int 栈大小 + */ + public int size() { + return size; + } +} diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/.gitignore b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/.gitignore new file mode 100644 index 0000000000..e10e727be5 --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/.gitignore @@ -0,0 +1 @@ +/.metadata/ diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.project b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.project new file mode 100644 index 0000000000..47cffea382 --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.project @@ -0,0 +1,17 @@ + + + collection-aggregator + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.settings/org.eclipse.m2e.core.prefs b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000..f897a7f1cb --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/pom.xml b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/pom.xml new file mode 100644 index 0000000000..a09edb357b --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/pom.xml @@ -0,0 +1,13 @@ + + 4.0.0 + com.eulerlcs.collection + collection-aggregator + 0.0.1-SNAPSHOT + pom + + + ../collection-parent + ../collection-lib + + \ No newline at end of file diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/src/site/.gitkeep b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/src/site/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.classpath b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.classpath new file mode 100644 index 0000000000..5131f04311 --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.classpath @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.gitignore b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.gitignore new file mode 100644 index 0000000000..b83d22266a --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.project b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.project new file mode 100644 index 0000000000..69766f62bc --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.project @@ -0,0 +1,23 @@ + + + collection-lib + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.jdt.core.prefs b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..714351aec1 --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.m2e.core.prefs b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000..f897a7f1cb --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/pom.xml b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/pom.xml new file mode 100644 index 0000000000..6d1654e23a --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/pom.xml @@ -0,0 +1,27 @@ + + 4.0.0 + + com.eulerlcs.collection + collection-parent + 0.0.1-SNAPSHOT + ../collection-parent/pom.xml + + collection-lib + + + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + + + junit + junit + + + \ No newline at end of file diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/java/com/eulerlcs/collection/ArrayList.java b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/java/com/eulerlcs/collection/ArrayList.java new file mode 100644 index 0000000000..219919719b --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/java/com/eulerlcs/collection/ArrayList.java @@ -0,0 +1,438 @@ +/** + * 90% or more copy from jdk + */ +package com.eulerlcs.collection; + +import java.util.Arrays; +import java.util.Collection; +import java.util.ConcurrentModificationException; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.RandomAccess; +import java.util.function.Consumer; + +public class ArrayList implements List, RandomAccess { + private static final int MAXQARRAYQSIZE = 1 << 10; + private transient Object[] elementData = new Object[0]; + private int size; + private transient int modCount = 0; + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean contains(Object o) { + if (o == null) { + for (Object obi : elementData) { + if (obi == null) { + return true; + } + } + } else { + for (Object obj : elementData) { + if (o.equals(obj)) { + return true; + } + } + } + return false; + } + + @Override + public boolean containsAll(Collection c) { + for (Object e : c) + if (!contains(e)) + return false; + return true; + } + + @Override + public Object[] toArray() { + return Arrays.copyOf(elementData, size, elementData.getClass()); + } + + @SuppressWarnings("unchecked") + @Override + public T[] toArray(T[] a) { + if (a.length < size) { + return (T[]) Arrays.copyOf(elementData, size, a.getClass()); + } else { + System.arraycopy(elementData, 0, a, 0, size); + if (a.length > size) + a[size] = null; + return a; + } + } + + @Override + public boolean add(E e) { + ensureExplicitCapacity(size + 1); // Increments modCount!! + elementData[size] = e; + size++; + return true; + } + + @Override + public void add(int index, E element) { + if (index >= size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size); + ensureExplicitCapacity(size + 1); // Increments modCount!! + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = element; + size++; + } + + @Override + public E remove(int index) { + if (index >= size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size); + + modCount++; + @SuppressWarnings("unchecked") + E oldValue = (E) elementData[index]; + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementData, index + 1, elementData, index, numMoved); + elementData[--size] = null;// clear to let GC do its work + + return oldValue; + } + + @Override + public boolean remove(Object o) { + int index = -1; + + if (o == null) { + for (int i = 0; i < size; i++) + if (elementData[i] == null) { + index = i; + break; + } + } else { + for (int i = 0; i < size; i++) + if (o.equals(elementData[i])) { + index = i; + break; + } + } + + if (index > 0) { + modCount++; + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementData, index + 1, elementData, index, numMoved); + elementData[--size] = null;// clear to let GC do its work + + return true; + } + + return false; + } + + @Override + public boolean removeAll(Collection c) { + boolean modified = false; + for (Object obj : c) { + modified |= remove(obj); + } + + return modified; + } + + @Override + public boolean addAll(Collection c) { + Object[] a = c.toArray(); + int numNew = a.length; + ensureExplicitCapacity(size + numNew);// Increments modCount + System.arraycopy(a, 0, elementData, size, numNew); + size += numNew; + return numNew != 0; + } + + @Override + public boolean addAll(int index, Collection c) { + if (index >= size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size); + + Object[] a = c.toArray(); + int numNew = a.length; + ensureExplicitCapacity(size + numNew);// Increments modCount + + int numMoved = size - index; + if (numMoved > 0) + System.arraycopy(elementData, index, elementData, index + numNew, numMoved); + + System.arraycopy(a, 0, elementData, index, numNew); + size += numNew; + return numNew != 0; + } + + @Override + public boolean retainAll(Collection c) { + final Object[] elementData = this.elementData; + int r = 0, w = 0; + boolean modified = false; + for (; r < size; r++) + if (c.contains(elementData[r])) + elementData[w++] = elementData[r]; + + if (w != size) { + // clear to let GC do its work + for (int i = w; i < size; i++) + elementData[i] = null; + modCount += size - w; + size = w; + modified = true; + } + + return modified; + } + + @Override + public void clear() { + modCount++; + for (int i = 0; i < size; i++) + elementData[i] = null; + + size = 0; + } + + @Override + public List subList(int fromIndex, int toIndex) { + throw new UnsupportedOperationException(); + } + + @SuppressWarnings("unchecked") + @Override + public E get(int index) { + if (index >= size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size); + + return (E) elementData[index]; + } + + @SuppressWarnings("unchecked") + @Override + public E set(int index, E element) { + if (index >= size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size); + + E oldValue = (E) elementData[index]; + elementData[index] = element; + return oldValue; + } + + @Override + public int indexOf(Object o) { + if (o == null) { + for (int i = 0; i < size; i++) + if (elementData[i] == null) + return i; + } else { + for (int i = 0; i < size; i++) + if (o.equals(elementData[i])) + return i; + } + + return -1; + } + + @Override + public int lastIndexOf(Object o) { + if (o == null) { + for (int i = size - 1; i >= 0; i--) + if (elementData[i] == null) + return i; + } else { + for (int i = size - 1; i >= 0; i--) + if (o.equals(elementData[i])) + return i; + } + + return -1; + } + + private void ensureExplicitCapacity(int minCapacity) { + modCount++; + + if (elementData.length > minCapacity) { + return; + } else if (minCapacity > MAXQARRAYQSIZE) { + throw new OutOfMemoryError(); + } + + int oldCapacity = elementData.length; + + int newCapacity = oldCapacity == 0 ? 10 : (oldCapacity + (oldCapacity >> 1)); + if (newCapacity > MAXQARRAYQSIZE) { + newCapacity = MAXQARRAYQSIZE; + } + + elementData = Arrays.copyOf(elementData, newCapacity); + } + + @Override + public Iterator iterator() { + return new Itr(); + } + + @Override + public ListIterator listIterator() { + return new ListItr(0); + } + + @Override + public ListIterator listIterator(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("Index: " + index); + return new ListItr(index); + } + + /** + * fully copy from jdk ArrayList.Itr + */ + private class Itr implements Iterator { + int cursor; // index of next element to return + int lastRet = -1; // index of last element returned; -1 if no such + int expectedModCount = modCount; + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + @SuppressWarnings("unchecked") + public E next() { + checkForComodification(); + int i = cursor; + if (i >= size) + throw new NoSuchElementException(); + Object[] elementData = ArrayList.this.elementData; + if (i >= elementData.length) + throw new ConcurrentModificationException(); + cursor = i + 1; + return (E) elementData[lastRet = i]; + } + + @Override + public void remove() { + if (lastRet < 0) + throw new IllegalStateException(); + checkForComodification(); + + try { + ArrayList.this.remove(lastRet); + cursor = lastRet; + lastRet = -1; + expectedModCount = modCount; + } catch (IndexOutOfBoundsException ex) { + throw new ConcurrentModificationException(); + } + } + + @Override + @SuppressWarnings("unchecked") + public void forEachRemaining(Consumer consumer) { + Objects.requireNonNull(consumer); + final int size = ArrayList.this.size; + int i = cursor; + if (i >= size) { + return; + } + final Object[] elementData = ArrayList.this.elementData; + if (i >= elementData.length) { + throw new ConcurrentModificationException(); + } + while (i != size && modCount == expectedModCount) { + consumer.accept((E) elementData[i++]); + } + // update once at end of iteration to reduce heap write traffic + cursor = i; + lastRet = i - 1; + checkForComodification(); + } + + final void checkForComodification() { + if (modCount != expectedModCount) + throw new ConcurrentModificationException(); + } + } + + /** + * fully copy from jdk ArrayList.ListItr + */ + private class ListItr extends Itr implements ListIterator { + ListItr(int index) { + super(); + cursor = index; + } + + @Override + public boolean hasPrevious() { + return cursor != 0; + } + + @Override + public int nextIndex() { + return cursor; + } + + @Override + public int previousIndex() { + return cursor - 1; + } + + @Override + @SuppressWarnings("unchecked") + public E previous() { + checkForComodification(); + int i = cursor - 1; + if (i < 0) + throw new NoSuchElementException(); + Object[] elementData = ArrayList.this.elementData; + if (i >= elementData.length) + throw new ConcurrentModificationException(); + cursor = i; + return (E) elementData[lastRet = i]; + } + + @Override + public void set(E e) { + if (lastRet < 0) + throw new IllegalStateException(); + checkForComodification(); + + try { + ArrayList.this.set(lastRet, e); + } catch (IndexOutOfBoundsException ex) { + throw new ConcurrentModificationException(); + } + } + + @Override + public void add(E e) { + checkForComodification(); + + try { + int i = cursor; + ArrayList.this.add(i, e); + cursor = i + 1; + lastRet = -1; + expectedModCount = modCount; + } catch (IndexOutOfBoundsException ex) { + throw new ConcurrentModificationException(); + } + } + } +} diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/resources/.gitkeep b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/resources/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/java/com/eulerlcs/collection/TestArrayList.java b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/java/com/eulerlcs/collection/TestArrayList.java new file mode 100644 index 0000000000..b66dd278e3 --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/java/com/eulerlcs/collection/TestArrayList.java @@ -0,0 +1,44 @@ +package com.eulerlcs.collection; + +import java.util.List; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +public class TestArrayList { + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test_foreach() { + List list = new ArrayList<>(); + list.add(1); + list.add(2); + list.add(3); + + int sum = 0; + for (Integer item : list) { + sum += item; + } + + Assert.assertEquals(sum, 6); + } +} diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/resources/.gitkeep b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/resources/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.project b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.project new file mode 100644 index 0000000000..3467a254de --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.project @@ -0,0 +1,17 @@ + + + collection-parent + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.settings/org.eclipse.m2e.core.prefs b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000..f897a7f1cb --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/pom.xml b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/pom.xml new file mode 100644 index 0000000000..6f05e517e2 --- /dev/null +++ b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/pom.xml @@ -0,0 +1,112 @@ + + 4.0.0 + com.eulerlcs.collection + collection-parent + 0.0.1-SNAPSHOT + pom + + + + 1.7.23 + 4.12 + 2.17 + 1.8 + 1.8 + + + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + + + junit + junit + ${junit.version} + test + + + + + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.1 + + + attach-source + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + true + 1.8 + protected + UTF-8 + UTF-8 + UTF-8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.19.1 + + true + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.17 + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + + \ No newline at end of file diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/src/site/.gitkeep b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/src/site/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group09/601862675/Week01/pom.xml b/group09/601862675/Week01/pom.xml new file mode 100644 index 0000000000..d457efbf95 --- /dev/null +++ b/group09/601862675/Week01/pom.xml @@ -0,0 +1,29 @@ + + + + coding2017 + me.sidzh + 1.0-SNAPSHOT + + 4.0.0 + + Week01 + + + junit + junit + 4.12 + test + + + com.github.stefanbirkner + system-rules + 1.16.0 + test + + + + + \ No newline at end of file diff --git a/group09/601862675/Week01/src/main/java/ArrayList.java b/group09/601862675/Week01/src/main/java/ArrayList.java new file mode 100644 index 0000000000..1923ba3592 --- /dev/null +++ b/group09/601862675/Week01/src/main/java/ArrayList.java @@ -0,0 +1,102 @@ +public class ArrayList implements List{ + + private Object[] elements; + + private static final int INITIAL_SIZE = 16; + + public static final int MAX_LIST_SIZE = 48; + + private int size = 0; + + private int capacity = 0; + + public ArrayList() { + elements = new Object[INITIAL_SIZE]; + capacity = INITIAL_SIZE; + } + + public void add(int index, Object obj) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + ensureSpace(); + if (index == size) { + add(obj); + } else { + System.arraycopy(elements, index, elements, index + 1, size - index); + elements[index] = obj; + size++; + } + } + + public void add(Object obj) { + ensureSpace(); + elements[size++] = obj; + } + + public int size() { + return size; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder("List: [ "); + for (int i = 0; i < size; ++ i) { + builder.append(elements[i]).append(" "); + } + builder.append("]"); + return builder.toString(); + } + + private void ensureSpace() { + if (size == capacity) { + if (size == MAX_LIST_SIZE) { + throw new IndexOutOfBoundsException(); + } + int newCapacity = capacity*2 > MAX_LIST_SIZE ? MAX_LIST_SIZE : capacity*2; + grow(newCapacity); + } + } + + private void grow(int newLength) { + Object[] newElements = new Object[newLength]; + System.arraycopy(elements, 0, newElements, 0, elements.length); + elements = newElements; + capacity = newLength; + } + + public Object get(int index) { + if (index < 0 || index >= size) { + throw new IllegalArgumentException(); + } + + return elements[index]; + } + + public Object remove(int index) { + if (index < 0 || index >= size) { + throw new IllegalArgumentException(); + } + Object toRemove = elements[index]; + System.arraycopy(elements, index + 1, elements, index, size - index -1); + --size; + return toRemove; + } + + public Iterator iterator() { + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + + private int pos = 0; + + public boolean hasNext() { + return pos < size(); + } + + public Object next() { + return elements[pos++]; + } + } +} diff --git a/group09/601862675/Week01/src/main/java/BinaryTree.java b/group09/601862675/Week01/src/main/java/BinaryTree.java new file mode 100644 index 0000000000..2aa7d4a43e --- /dev/null +++ b/group09/601862675/Week01/src/main/java/BinaryTree.java @@ -0,0 +1,29 @@ +public class BinaryTree { + + private BinaryTreeNode root; + + private static class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + } + + public BinaryTree getLeft() { + + + return null; + } + + public void setLeft() { + + } + + public BinaryTree getRight() { + + return null; + } + + public void setRight() { + + } +} diff --git a/group09/601862675/Week01/src/main/java/Iterator.java b/group09/601862675/Week01/src/main/java/Iterator.java new file mode 100644 index 0000000000..f4f8fa52cd --- /dev/null +++ b/group09/601862675/Week01/src/main/java/Iterator.java @@ -0,0 +1,7 @@ +/** + * Created by spike on 2/19/17. + */ +public interface Iterator { + boolean hasNext(); + Object next(); +} diff --git a/group09/601862675/Week01/src/main/java/LinkedList.java b/group09/601862675/Week01/src/main/java/LinkedList.java new file mode 100644 index 0000000000..dca3992000 --- /dev/null +++ b/group09/601862675/Week01/src/main/java/LinkedList.java @@ -0,0 +1,128 @@ +/** + * Created by spike on 2/19/17. + */ +public class LinkedList implements List { + + private LinkedListNode head; + private LinkedListNode tail; + private int size; + + private static class LinkedListNode { + private Object data; + private LinkedListNode prev; + private LinkedListNode next; + + private LinkedListNode(Object data, LinkedListNode prev, LinkedListNode next) { + this.data = data; + this.prev = prev; + this.next = next; + } + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder("List: [ "); + LinkedListNode idx = head; + while (idx != null) { + builder.append(idx.data); + builder.append(" "); + idx = idx.next; + } + + builder.append("]"); + return builder.toString(); + } + + public void add(int index, Object object) { + if (index < 0 || index > size) { + throw new IllegalArgumentException(); + } + if (index == size) { // insert after + add(object); + } else { // insert before + LinkedListNode target = findNodeByIndex(index); + LinkedListNode nd = new LinkedListNode(object, target.prev, target); + if (head == target) { + head = nd; + } else { + target.prev.next = nd; + } + } + ++size; + } + + public void add(Object object) { + if (head == null) { + LinkedListNode nd = new LinkedListNode(object, null, null); + head = tail = nd; + } else { + LinkedListNode nd = new LinkedListNode(object, tail, null); + tail.next = nd; + tail = nd; + } + ++size; + } + + public Object get(int index) { + if (index < 0 || index >= size) { + throw new IllegalArgumentException(); + } + LinkedListNode target = findNodeByIndex(index); + return target.data; + } + + public Object remove(int index) { + if (index < 0 || index >= size) { + throw new IllegalArgumentException(); + } + LinkedListNode target = findNodeByIndex(index); + if (target == head) { + if (head == tail) { + head = tail = null; + } else { + head = head.next; + head.prev = null; + } + } else if (target == tail) { + tail = tail.prev; + tail.next = null; + } else { + target.prev.next = target.next; + target.next.prev = target.prev; + } + target.prev = target.next = null; + --size; + return target.data; + } + + private LinkedListNode findNodeByIndex(int index) { + LinkedListNode target = head; + for (int i = 0; i != index; ++i) { + target = target.next; + } + return target; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + + LinkedListNode cursor = head; + + public boolean hasNext() { + return cursor != null; + } + + public Object next() { + Object toRet = cursor.data; + cursor = cursor.next; + return toRet; + } + } +} diff --git a/group09/601862675/Week01/src/main/java/List.java b/group09/601862675/Week01/src/main/java/List.java new file mode 100644 index 0000000000..2e5e4477f5 --- /dev/null +++ b/group09/601862675/Week01/src/main/java/List.java @@ -0,0 +1,7 @@ +public interface List { + void add(int index, Object object); + void add(Object object); + Object get(int i); + Object remove(int i); + int size(); +} diff --git a/group09/601862675/Week01/src/main/java/Queue.java b/group09/601862675/Week01/src/main/java/Queue.java new file mode 100644 index 0000000000..60f32933a3 --- /dev/null +++ b/group09/601862675/Week01/src/main/java/Queue.java @@ -0,0 +1,35 @@ +public class Queue { + + private LinkedList llist = new LinkedList(); + + public void enQueue(Object o){ + llist.add(o); + } + + public Object deQueue(){ + if (llist.size() == 0) { + throw new UnsupportedOperationException(); + } + return llist.remove(0); + } + + public boolean isEmpty(){ + return llist.size() == 0; + } + + public int size(){ + return llist.size(); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder("Queue: [ "); + Iterator iter = llist.iterator(); + while (iter.hasNext()) { + builder.append(iter.next()); + builder.append(" "); + } + builder.append("]"); + return builder.toString(); + } +} diff --git a/group09/601862675/Week01/src/main/java/Stack.java b/group09/601862675/Week01/src/main/java/Stack.java new file mode 100644 index 0000000000..0aa097357d --- /dev/null +++ b/group09/601862675/Week01/src/main/java/Stack.java @@ -0,0 +1,38 @@ +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (elementData.size() == 0) { + throw new UnsupportedOperationException(); + } + return elementData.remove(elementData.size()-1); + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder("Stack: [ "); + Iterator iter = elementData.iterator(); + while (iter.hasNext()) { + builder.append(iter.next()); + builder.append(" "); + } + builder.append("]"); + return builder.toString(); + } +} \ No newline at end of file diff --git a/group09/601862675/Week01/src/main/java/Watcher.java b/group09/601862675/Week01/src/main/java/Watcher.java new file mode 100644 index 0000000000..eddc2ee28a --- /dev/null +++ b/group09/601862675/Week01/src/main/java/Watcher.java @@ -0,0 +1,26 @@ +import java.nio.file.*; +import java.util.*; +import java.util.List; + +public class Watcher { + public static void main(String[] args) { + Path this_dir = Paths.get("."); + System.out.println("Now watching the current directory ..."); + + try { + WatchService watcher = this_dir.getFileSystem().newWatchService(); + this_dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE); + + WatchKey watckKey = watcher.take(); + + List> events = watckKey.pollEvents(); + for (WatchEvent event : events) { + System.out.println("Someone just created the file '" + event.context().toString() + "'."); + + } + + } catch (Exception e) { + System.out.println("Error: " + e.toString()); + } + } +} \ No newline at end of file diff --git a/group09/601862675/Week01/src/test/java/ArrayListTest.java b/group09/601862675/Week01/src/test/java/ArrayListTest.java new file mode 100644 index 0000000000..923c76ce1f --- /dev/null +++ b/group09/601862675/Week01/src/test/java/ArrayListTest.java @@ -0,0 +1,104 @@ +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.contrib.java.lang.system.SystemOutRule; + +public class ArrayListTest { + + @Rule + public final SystemOutRule log = new SystemOutRule().enableLog(); + + @Test + public void testAddWithIndex() { + log.clearLog(); + ArrayList list = initListWithSize(10); + list.add(3, 10); + System.out.print(list.toString()); + Assert.assertEquals("List: [ 0 1 2 10 3 4 5 6 7 8 9 ]", log.getLog()); + System.out.println(); + + log.clearLog(); + list.add(list.size(), 11); + System.out.print(list.toString()); + Assert.assertEquals("List: [ 0 1 2 10 3 4 5 6 7 8 9 11 ]", log.getLog()); + System.out.println(); + } + + @Test + public void testAdd() { + log.clearLog(); + ArrayList list = new ArrayList(); + list.add(10); + System.out.print(list.toString()); + Assert.assertEquals("List: [ 10 ]", log.getLog()); + System.out.println(); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testAddWithIndexOutOfBoundsException() { + ArrayList list = initListWithSize(ArrayList.MAX_LIST_SIZE); + Assert.assertEquals(48, list.size()); + list.add(1); + } + + @Test + public void testRemove() { + ArrayList list = initListWithSize(10); + + log.clearLog(); + Object removed = list.remove(0); + System.out.print(list); + Assert.assertEquals(0, removed); + Assert.assertEquals(9, list.size()); + Assert.assertEquals("List: [ 1 2 3 4 5 6 7 8 9 ]", log.getLog()); + System.out.println(); + + log.clearLog(); + removed = list.remove(list.size()-1); + System.out.print(list); + Assert.assertEquals(9, removed); + Assert.assertEquals(8, list.size()); + Assert.assertEquals("List: [ 1 2 3 4 5 6 7 8 ]", log.getLog()); + System.out.println(); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetWithIllegalArgumentException() { + ArrayList list = new ArrayList(); + list.add(1); + Assert.assertEquals(1, list.size()); + list.get(list.size()); + } + + @Test + public void testSize() { + ArrayList list = new ArrayList(); + list.add(10); + list.add(20); + list.add(30); + Assert.assertEquals(3, list.size()); + } + + @Test + public void testIterator() { + log.clearLog(); + ArrayList list = new ArrayList(); + for (int i = 0; i < 10; ++i) { + list.add(i); + } + Iterator iter = list.iterator(); + while (iter.hasNext()) { + System.out.print(iter.next()); + } + Assert.assertEquals("0123456789", log.getLog()); + System.out.println(); + } + + private ArrayList initListWithSize(int size) { + ArrayList list = new ArrayList(); + for (int i = 0; i < size; ++i) { + list.add(i); + } + return list; + } +} diff --git a/group09/601862675/Week01/src/test/java/LinkedListTest.java b/group09/601862675/Week01/src/test/java/LinkedListTest.java new file mode 100644 index 0000000000..d36f67101e --- /dev/null +++ b/group09/601862675/Week01/src/test/java/LinkedListTest.java @@ -0,0 +1,106 @@ +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.contrib.java.lang.system.SystemOutRule; + +public class LinkedListTest { + + @Rule + public final SystemOutRule log = new SystemOutRule().enableLog(); + + @Test + public void testAdd() { + log.clearLog(); + LinkedList list = initListWithSize(10); + System.out.print(list); + Assert.assertEquals("List: [ 0 1 2 3 4 5 6 7 8 9 ]", log.getLog()); + System.out.println(); + } + + @Test + public void testAddWithIndex() { + log.clearLog(); + LinkedList list = initListWithSize(10); + list.add(0, -1); + System.out.print(list); + Assert.assertEquals(11, list.size()); + Assert.assertEquals("List: [ -1 0 1 2 3 4 5 6 7 8 9 ]", log.getLog()); + System.out.println(); + + log.clearLog(); + list.add(list.size()-1, 10); + System.out.print(list); + Assert.assertEquals("List: [ -1 0 1 2 3 4 5 6 7 8 10 9 ]", log.getLog()); + System.out.println(); + + log.clearLog(); + list.add(list.size(), 11); + System.out.print(list); + Assert.assertEquals("List: [ -1 0 1 2 3 4 5 6 7 8 10 9 11 ]", log.getLog()); + System.out.println(); + } + + @Test + public void testRemove() { + log.clearLog(); + LinkedList list = initListWithSize(10); + list.remove(0); + System.out.print(list); + Assert.assertEquals(9, list.size()); + Assert.assertEquals("List: [ 1 2 3 4 5 6 7 8 9 ]", log.getLog()); + System.out.println(); + + log.clearLog(); + list.remove(list.size()-1); + System.out.print(list); + Assert.assertEquals(8, list.size()); + Assert.assertEquals("List: [ 1 2 3 4 5 6 7 8 ]", log.getLog()); + System.out.println(); + + log.clearLog(); + list.remove(list.size()-2); + System.out.print(list); + Assert.assertEquals(7, list.size()); + Assert.assertEquals("List: [ 1 2 3 4 5 6 8 ]", log.getLog()); + System.out.println(); + } + + @Test + public void testGet() { + log.clearLog(); + LinkedList list = initListWithSize(10); + for (int i = 0; i < list.size(); ++i) { + System.out.print(list.get(i)); + } + Assert.assertEquals("0123456789", log.getLog()); + System.out.println(); + } + + @Test + public void testSize() { + log.clearLog(); + LinkedList list = initListWithSize(10); + Assert.assertEquals(10, list.size()); + System.out.println(); + } + + @Test + public void testIterator() { + log.clearLog(); + LinkedList list = initListWithSize(10); + Iterator iter = list.iterator(); + while (iter.hasNext()) { + System.out.print(iter.next()); + } + Assert.assertEquals("0123456789", log.getLog()); + System.out.println(); + } + + private LinkedList initListWithSize(int size) { + LinkedList list = new LinkedList(); + for (int i = 0; i < size; ++i) { + list.add(i); + } + return list; + } +} diff --git a/group09/601862675/Week01/src/test/java/QueueTest.java b/group09/601862675/Week01/src/test/java/QueueTest.java new file mode 100644 index 0000000000..bd4e24a4e3 --- /dev/null +++ b/group09/601862675/Week01/src/test/java/QueueTest.java @@ -0,0 +1,44 @@ +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.contrib.java.lang.system.SystemOutRule; + +public class QueueTest { + @Rule + public final SystemOutRule log = new SystemOutRule().enableLog(); + + @Test + public void testEnqueue() { + log.clearLog(); + Queue queue = new Queue(); + queue.enQueue(10); + System.out.print(queue); + Assert.assertEquals("Queue: [ 10 ]", log.getLog()); + } + + @Test + public void testDequeue() { + log.clearLog(); + Queue queue = new Queue(); + queue.enQueue(10); + queue.deQueue(); + System.out.print(queue); + Assert.assertEquals("Queue: [ ]", log.getLog()); + } + + @Test + public void testIsEmpty() { + Queue queue = new Queue(); + queue.enQueue(10); + Assert.assertEquals(false, queue.isEmpty()); + queue.deQueue(); + Assert.assertEquals(true, queue.isEmpty()); + } + + @Test + public void testSize() { + Queue queue = new Queue(); + queue.enQueue(10); + Assert.assertEquals(1, queue.size()); + } +} diff --git a/group09/601862675/Week01/src/test/java/StackTest.java b/group09/601862675/Week01/src/test/java/StackTest.java new file mode 100644 index 0000000000..0afac4c0da --- /dev/null +++ b/group09/601862675/Week01/src/test/java/StackTest.java @@ -0,0 +1,61 @@ +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.contrib.java.lang.system.SystemOutRule; + +public class StackTest { + @Rule + public final SystemOutRule log = new SystemOutRule().enableLog(); + + @Test + public void testPush() { + log.clearLog(); + Stack stack = new Stack(); + stack.push("1"); + System.out.print(stack); + Assert.assertEquals(1, stack.size()); + Assert.assertEquals("Stack: [ 1 ]", log.getLog()); + } + + @Test + public void testPop() { + Stack stack = new Stack(); + stack.push(10); + Object o = stack.pop(); + Assert.assertEquals(10, o); + Assert.assertEquals(0, stack.size()); + } + + @Test(expected = UnsupportedOperationException.class) + public void testPopWithException() { + Stack stack = new Stack(); + stack.push(10); + stack.pop(); + stack.pop(); + } + + @Test + public void testPeek() { + Stack stack = new Stack(); + stack.push(10); + Object o = stack.peek(); + Assert.assertEquals(10, o); + Assert.assertEquals(1, stack.size()); + } + + @Test + public void testIsEmpty() { + Stack stack = new Stack(); + stack.push(10); + Assert.assertEquals(false, stack.isEmpty()); + stack.pop(); + Assert.assertEquals(true, stack.isEmpty()); + } + + @Test + public void testSize() { + Stack stack = new Stack(); + stack.push(1); + Assert.assertEquals(1, stack.size()); + } +} diff --git a/group09/601862675/pom.xml b/group09/601862675/pom.xml new file mode 100644 index 0000000000..90585b6284 --- /dev/null +++ b/group09/601862675/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + me.sidzh + coding2017 + pom + 1.0-SNAPSHOT + + Week01 + + + + \ No newline at end of file diff --git a/group09/715061147/.gitignore b/group09/715061147/.gitignore new file mode 100644 index 0000000000..920bb9729c --- /dev/null +++ b/group09/715061147/.gitignore @@ -0,0 +1,4 @@ +.metadata +.swp +RemoteSystemsTempFiles/ +target diff --git a/group09/715061147/mvnhomework1/.gitignore b/group09/715061147/mvnhomework1/.gitignore new file mode 100644 index 0000000000..a65ec10715 --- /dev/null +++ b/group09/715061147/mvnhomework1/.gitignore @@ -0,0 +1,4 @@ +.classpath +.settings +.project +target diff --git a/group09/715061147/mvnhomework1/pom.xml b/group09/715061147/mvnhomework1/pom.xml new file mode 100644 index 0000000000..b6702aac65 --- /dev/null +++ b/group09/715061147/mvnhomework1/pom.xml @@ -0,0 +1,29 @@ + + 4.0.0 + com.qsq.study + mvnhomework1 + 0.0.1-SNAPSHOT + MvnHomeWork1 + MvnHomeWork1 + + + + junit + junit + 4.12 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/group09/715061147/mvnhomework1/src/main/java/com/qsq/study/ArrayList.java b/group09/715061147/mvnhomework1/src/main/java/com/qsq/study/ArrayList.java new file mode 100644 index 0000000000..f2bdc27de9 --- /dev/null +++ b/group09/715061147/mvnhomework1/src/main/java/com/qsq/study/ArrayList.java @@ -0,0 +1,143 @@ +package com.qsq.study; + +import java.util.Arrays; + +public class ArrayList implements List { + + private static final int DEFAULT_CAPACITY = 16; + private static final Object[] EMPTY_ELEMENT_DATA = {}; + private Object[] elementData; + private int size = 0; + + /* + * һĬArrayList + */ + public ArrayList() { + this(DEFAULT_CAPACITY); + } + + /* + * һָʼArrayList + * + * @param initialCapacity ʼ + * + * @throws IllegalArgumentException ָʼΪʱ׳Ƿ쳣 + */ + public ArrayList(int initialCapacity) { + if (initialCapacity > 0) { + this.elementData = new Object[initialCapacity]; + } else if (initialCapacity == 0) { + this.elementData = EMPTY_ELEMENT_DATA; + } else { + throw new IllegalArgumentException("Illegal Capacity " + initialCapacity); + } + } + + @Override + public int size() { + return this.size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + /* + * elementData + * + * @param capacity µ + */ + private void grow(int capacity) { + if (capacity < elementData.length) { + return; + } + elementData = Arrays.copyOf(elementData, capacity); + } + + @Override + public boolean add(E e) { + if (size == elementData.length) { + grow(size * 2); + } + elementData[size++] = e; + return true; + } + + @Override + public E remove(int index) { + rangeCheck(index); + + // move elements after index forward by 1 + for (int i = index; i < size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + --size; + + // TODO: JDKʵ: 1.Ч 2.GC + // System.arraycopy(elementData, index + 1, elementData, index, size - + // index - 1); + // elementData[--size] = null; + + return null; + } + + @Override + public boolean remove(Object o) { + int index = indexOf(o); + + if (index < 0) { + return false; + } + + remove(index); + return true; + } + + @SuppressWarnings({ "unchecked" }) + private E elementData(int index) { + return (E) elementData[index]; + } + + private void rangeCheck(int index) { + // TODO: JDKԴδindex<0ΪΣ + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } + } + + @Override + public E get(int index) { + rangeCheck(index); + + return elementData(index); + } + + @Override + public E set(int index, E element) { + rangeCheck(index); + + E oldElement = elementData(index); + elementData[index] = element; + return oldElement; + } + + @Override + public int indexOf(Object o) { + if (o == null) { + for (int i = 0; i < size; i++) { + if (elementData[i] == null) { + return i; + } + } + } else { + for (int i = 0; i < size; i++) { + if (o.equals(elementData[i])) { + return i; + } + } + } + return -1; + } + +} diff --git a/group09/715061147/mvnhomework1/src/main/java/com/qsq/study/LinkedList.java b/group09/715061147/mvnhomework1/src/main/java/com/qsq/study/LinkedList.java new file mode 100644 index 0000000000..e1b3f0a686 --- /dev/null +++ b/group09/715061147/mvnhomework1/src/main/java/com/qsq/study/LinkedList.java @@ -0,0 +1,169 @@ +package com.qsq.study; + +public class LinkedList implements List{ + + private Node first; + private Node last; + private int size; + + private static class Node { + T item; + Node prev; + Node next; + + public Node(Node prev, T item, Node next) { + this.prev = prev; + this.item = item; + this.next = next; + } + } + + /* + * ޲캯 + */ + public LinkedList() { + first = null; + last = first; + size = 0; + } + + @Override + public int size() { + return this.size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + private void rangeCheck(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } + } + + @Override + public boolean add(E e) { + if (first == null) { + // Ϊ + first = new Node(null, e, null); + } else if (last == null) { + // βΪ + last = new Node(first, e, null); + first.next = last; + } else { + Node node = new Node(last, e, null); + last.next = node; + last = node; + } + ++size; + return true; + } + + @Override + public boolean remove(Object o) { + int index = indexOf(o); + if (index < 0 || index > size) { + return false; + } + + remove(index); + return true; + } + + @Override + public E remove(int index) { + rangeCheck(index); + + Node current = first; + while (index > 0) { + --index; + if (current == null) { + return null; + } + current = current.next; + } + + E oldItem = current.item; + + if (current.prev == null) { + // ɾͷ + first = current.next; + if (current.next != null) { + current.next.prev = null; + } + } else { + current.prev.next = current.next; + if (current.next != null) { + current.next.prev = current.prev; + } + } + --size; + + return oldItem; + } + + @Override + public E get(int index) { + rangeCheck(index); + + int i = 0; + Node current = first; + while (i < index) { + if (current == null) { + return null; + } + ++i; + current = current.next; + } + return current.item; + } + + @Override + public E set(int index, E element) { + rangeCheck(index); + + Node current = first; + while (index > 0) { + --index; + current = current.next; + } + E oldElement = current.item; + current.item = element; + + return oldElement; + } + + @Override + public int indexOf(Object o) { + if (first == null) { + return -1; + } + + Node current = first; + int index = 0; + if (o == null) { + while (current != null) { + if (current.item == null) { + return index; + } else { + current = current.next; + ++index; + } + } + } else { + while (current != null) { + if (o.equals(current.item)) { + return index; + } else { + current = current.next; + ++index; + } + } + } + + return -1; + } + +} diff --git a/group09/715061147/mvnhomework1/src/main/java/com/qsq/study/List.java b/group09/715061147/mvnhomework1/src/main/java/com/qsq/study/List.java new file mode 100644 index 0000000000..7b509a361e --- /dev/null +++ b/group09/715061147/mvnhomework1/src/main/java/com/qsq/study/List.java @@ -0,0 +1,12 @@ +package com.qsq.study; + +public interface List { + int size(); + boolean isEmpty(); + boolean add(E e); + boolean remove(Object o); + E remove(int index); + E get(int index); + E set(int index, E element); + int indexOf(Object o); +} diff --git a/group09/715061147/mvnhomework1/src/test/java/com/qsq/study/ArrayListTest.java b/group09/715061147/mvnhomework1/src/test/java/com/qsq/study/ArrayListTest.java new file mode 100644 index 0000000000..d1c6353f79 --- /dev/null +++ b/group09/715061147/mvnhomework1/src/test/java/com/qsq/study/ArrayListTest.java @@ -0,0 +1,70 @@ +package com.qsq.study; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class ArrayListTest { + + @Test + public void testIsEmpty() { + ArrayList list = new ArrayList<>(); + assertEquals(true, list.isEmpty()); + list.add(1); + assertEquals(false, list.isEmpty()); + } + + @Test + public void testSize() { + ArrayList list = new ArrayList<>(); + assertEquals(0, list.size()); + list.add(1); + assertEquals(1, list.size()); + list.add(2); + assertEquals(2, list.size()); + for (int i=3; i<=20; i++) { + list.add(i); + } + assertEquals(20, list.size()); + + } + @Test + public void testAdd() { + ArrayList list = new ArrayList<>(); + list.add(1); + assertEquals(1, list.size()); + } + + @Test + public void testRemove() { + ArrayList list = new ArrayList<>(); + list.add(1); + list.add(2); + list.add(3); + assertEquals(3, list.size()); + list.remove(1); + assertEquals(2, list.size()); + list.remove(1); + assertEquals(1, list.size()); + list.remove(0); + assertEquals(0, list.size()); + } + + @Test + public void testGet() { + ArrayList list = new ArrayList<>(); + list.add(1); + list.add(2); + assertEquals(1, (int)list.get(0)); + assertEquals(2, (int)list.get(1)); + } + + @Test + public void TestSet() { + ArrayList list = new ArrayList<>(); + list.add(1); + assertEquals(1, (int)list.get(0)); + list.set(0, 2); + assertEquals(2, (int)list.get(0)); + } +} diff --git a/group09/715061147/mvnhomework1/src/test/java/com/qsq/study/LinkedListTest.java b/group09/715061147/mvnhomework1/src/test/java/com/qsq/study/LinkedListTest.java new file mode 100644 index 0000000000..7b0bd3807a --- /dev/null +++ b/group09/715061147/mvnhomework1/src/test/java/com/qsq/study/LinkedListTest.java @@ -0,0 +1,70 @@ +package com.qsq.study; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class LinkedListTest { + + @Test + public void testIsEmpty() { + LinkedList list = new LinkedList<>(); + assertEquals(true, list.isEmpty()); + list.add(1); + assertEquals(false, list.isEmpty()); + } + + @Test + public void testSize() { + LinkedList list = new LinkedList<>(); + assertEquals(0, list.size()); + list.add(1); + assertEquals(1, list.size()); + list.add(2); + assertEquals(2, list.size()); + for (int i=3; i<=20; i++) { + list.add(i); + } + assertEquals(20, list.size()); + + } + @Test + public void testAdd() { + LinkedList list = new LinkedList<>(); + list.add(1); + assertEquals(1, list.size()); + } + + @Test + public void testRemove() { + LinkedList list = new LinkedList<>(); + list.add(1); + list.add(2); + list.add(3); + assertEquals(3, list.size()); + list.remove(1); + assertEquals(2, list.size()); + list.remove(1); + assertEquals(1, list.size()); + list.remove(0); + assertEquals(0, list.size()); + } + + @Test + public void testGet() { + LinkedList list = new LinkedList<>(); + list.add(1); + list.add(2); + assertEquals(1, (int)list.get(0)); + assertEquals(2, (int)list.get(1)); + } + + @Test + public void TestSet() { + LinkedList list = new LinkedList<>(); + list.add(1); + assertEquals(1, (int)list.get(0)); + list.set(0, 2); + assertEquals(2, (int)list.get(0)); + } +} diff --git a/group09/790466157/src/com/coding/basic/Iterator.java b/group09/790466157/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..7c02cc6e51 --- /dev/null +++ b/group09/790466157/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} \ No newline at end of file diff --git a/group09/790466157/src/com/coding/basic/List.java b/group09/790466157/src/com/coding/basic/List.java new file mode 100644 index 0000000000..c86b745572 --- /dev/null +++ b/group09/790466157/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group09/790466157/src/com/coding/basic/MyArrayList.java b/group09/790466157/src/com/coding/basic/MyArrayList.java new file mode 100644 index 0000000000..cf232c5b72 --- /dev/null +++ b/group09/790466157/src/com/coding/basic/MyArrayList.java @@ -0,0 +1,133 @@ +package com.coding.basic; +import java.util.Arrays; +import java.util.NoSuchElementException; + +import com.coding.basic.List; +import com.coding.basic.Iterator; + +public class MyArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + private final static int MAX_ARRAY_LENGTH = Integer.MAX_VALUE; + + private static final int DEFAULT_CAPACITY = 10; + + + //޳캯 + public MyArrayList(){ + this(DEFAULT_CAPACITY); + } + + public MyArrayList(int size){ + if (size < 0){ + throw new IllegalArgumentException("ĬϵĴС" + size); + } + else{ + elementData = new Object[size]; + } + } + + public void add(Object o){ + isCapacityEnough(size+1); + elementData[size++] = o; + } + + private void isCapacityEnough(int size){ + //жǷ񳬹ʼǷҪ + if (size > DEFAULT_CAPACITY){ + explicitCapacity(size); + } + if (size < 0){ + throw new OutOfMemoryError(); + } + } + + private void explicitCapacity(int capacity){ + int oldCapacity = elementData.length; + //= + /2 1.5Ʋ൱ڳ2 + int newLength = oldCapacity + (oldCapacity >> 1); + if (newLength - capacity < 0){ + newLength = capacity; + } + //жnewLengthij + //涨󳤶жҪҪݿռǷ󳤶 + //newLengthΪ MAX_VALUE Ϊ MAX_ARRAY_LENGTH + if (newLength > (MAX_ARRAY_LENGTH)){ + newLength = (capacity > MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH); + } + //copyof + elementData = Arrays.copyOf(elementData, newLength); + } + + public void add(int index, Object o){ + + checkRangeForAdd(index); + isCapacityEnough(size +1); + // elementDataдIndexλÿʼΪsize-indexԪأ + // ±Ϊindex+1λÿʼµelementDataС + // ǰλڸλõԪԼкԪһλá + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + //жǷԽ + private void checkRangeForAdd(int index){ + if (index < 0 || index > size){ + throw new IndexOutOfBoundsException("ָindexԽ"); + } + } + + // شбָλϵԪء + public Object get(int index){ + checkRange(index); + return elementData[index]; + } + + //жǷԽ + private void checkRange(int index){ + if (index >= size || index < 0){ + throw new IndexOutOfBoundsException("ָindexԽ"); + } + } + + public Object remove(int index){ + Object value = get(index); + int moveSize = size - index -1; + if (moveSize >0){ + System.arraycopy(elementData, index +1, elementData, index, size - index -1); + + } + elementData[--size] = null; + return value; + } + + public int size(){ + return size; + } + + // + public Iterator iterator(Object o){ + return new ArrayListIterator(); + } + + + private class ArrayListIterator implements Iterator{ + private int currentIndex=0; + + public boolean hasNext() { + return currentIndex < size(); + } + + public Object next() { + if (!hasNext()){ + throw new NoSuchElementException(); + } + return new Object[currentIndex + 1]; + } + } + +} \ No newline at end of file diff --git a/group09/790466157/src/com/coding/basic/MyLinkedList.java b/group09/790466157/src/com/coding/basic/MyLinkedList.java new file mode 100644 index 0000000000..4727db3a89 --- /dev/null +++ b/group09/790466157/src/com/coding/basic/MyLinkedList.java @@ -0,0 +1,159 @@ +package com.coding.basic; + +public class MyLinkedList { + + private int size; + + private Node first; + + private Node last; + + + public boolean add(E element) { + addAtLast(element); + return true; + } + + private void addAtLast(E element) { + Node l = last; + Node node = new Node(element, null, l); + last = node; + if (l == null) { + first = node; + } else { + l.next = node; + } + size++; + } + + public void add(int index, E element) { + checkRangeForAdd(index); + if (index == size) { + addAtLast(element); + } else { + Node l = node(index); + addBeforeNode(element, l); + } + } + + private void addBeforeNode(E element, Node specifiedNode) { + Node preNode = specifiedNode.prev; + Node newNode = new Node(element, specifiedNode, preNode); + if (preNode == null) { + first = newNode; + } else { + preNode.next = newNode; + } + specifiedNode.prev = newNode; + size++; + } + + + private Node node(int index) { + if (index < (size << 1)) { + Node cursor = first; + for (int i = 0; i < index; i++) { + cursor = cursor.next; + } + return cursor; + } else { + Node cursor = last; + for (int i = size - 1; i > index; i--) { + cursor = cursor.prev; + } + return cursor; + } + } + + private void checkRangeForAdd(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("ָindex"); + } + } + + public E get(int index) { + checkRange(index); + return node(index).item; + } + + private void checkRange(int index) { + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException("ָindex"); + } + } + + public int indexOf(Object element) { + Node cursor = first; + int count = 0; + while (cursor != null) { + if (element != null) { + if (element.equals(cursor.item)) { + return count; + } + }else{ + if (cursor.item == null) { + return count; + } + } + count ++; + cursor = cursor.next; + } + return -1; + } + + public E remove(int index) { + checkRange(index); + return deleteLink(index); + } + + public boolean remove(Object o) { + int index = indexOf(o); + if (index < 0){ + return false; + } + deleteLink(index); + return true; + } + + private E deleteLink(int index) { + Node l = node(index); + E item = l.item; + Node prevNode = l.prev; + Node nextNode = l.next; + + if (prevNode == null) { + first = nextNode; + }else{ + prevNode.next = nextNode; + l.next = null; + } + + if (nextNode == null) { + last = prevNode; + }else{ + nextNode.prev = prevNode; + l.prev = null; + } + size--; + l.item = null; + return item; + } + + + + public int size(){ + return size; + } + private static class Node { + E item; + Node next; + Node prev; + + public Node(E item, Node next, Node prev) { + this.item = item; + this.next = next; + this.prev = prev; + + } + } +} diff --git a/group09/790466157/src/com/coding/basic/Queue.java b/group09/790466157/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..80d0dc9835 --- /dev/null +++ b/group09/790466157/src/com/coding/basic/Queue.java @@ -0,0 +1,68 @@ +package com.coding.basic; +import java.util.Arrays; + +public class Queue { + private static final int CAPACITY = 10; + private static int capacity; + private static int front; + private static int tail; + private static Object[] array; + + public Queue(){ + this.capacity = CAPACITY; + array = new Object[capacity]; + front = tail = 0; + } + + public void enQueue(Object o) throws ExceptionQueueFull { + if (size() == capacity -1) + throw new ExceptionQueueFull("Queue is full"); + array[tail] = o; + tail = (tail +1) % capacity; + } + + public Object deQueue() throws ExceptionQueueEmpty{ + Object o; + if (isEmpty()) + throw new ExceptionQueueEmpty("Queue is empty"); + o = array[front]; + front = (front + 1) % capacity; + return o; + } + + public boolean isEmpty(){ + return (front == tail); + } + + public int size(){ + if (isEmpty()) + return 0; + else + return (capacity + tail - front) % capacity; + } + + public class ExceptionQueueEmpty extends Exception { + // Constructor + public ExceptionQueueEmpty() { + + } + + // Constructor with parameters + public ExceptionQueueEmpty(String mag) { + System.out.println(mag); + } + } + + public class ExceptionQueueFull extends Exception { + + // Constructor + public ExceptionQueueFull() { + + } + + // Constructor with parameters + public ExceptionQueueFull(String mag) { + System.out.println(mag); + } + } +} \ No newline at end of file diff --git a/group09/790466157/src/com/coding/basic/Stack.java b/group09/790466157/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..324cc5639e --- /dev/null +++ b/group09/790466157/src/com/coding/basic/Stack.java @@ -0,0 +1,73 @@ +package com.coding.basic; +import java.util.Arrays; +import com.coding.basic.MyArrayList; +public class Stack { + private MyArrayList elementData = new MyArrayList(); + private static final int CAPACITY = 10; + private static int capacity; + private static int top = -1; + Object[] array; + + public Stack(){ + this.capacity = CAPACITY; + array = new Object[capacity]; + } + public void push(Object o) throws ExceptionStackFull{ + if(size()== CAPACITY){ + throw new ExceptionStackFull("Stack is full"); + } + array[++ top] = o; + } + + public Object pop() throws ExceptionStackEmpty{ + if(isEmpty()){ + throw new ExceptionStackEmpty("Stack is empty"); + } + return array[top --]; + } + + public Object peek() throws ExceptionStackEmpty{ + if(isEmpty()){ + throw new ExceptionStackEmpty("Stack is empty"); + } + return array[top]; + } + + public boolean isEmpty(){ + return (top < 0); + } + + public int size(){ + if (isEmpty()) + return 0; + else + return top + 1; + + } + + public class ExceptionStackEmpty extends Exception { + + //Constructor + public ExceptionStackEmpty(){ + + } + + //Define myself exception construct with parameters + public ExceptionStackEmpty(String string){ + super(string); + } + } + + public class ExceptionStackFull extends Exception { + + //Constructor + public ExceptionStackFull(){ + + } + + //Define myself exception construct with parameters + public ExceptionStackFull(String string){ + super(string); + } + } +} \ No newline at end of file diff --git a/group09/790466157/test.txt b/group09/790466157/test.txt new file mode 100644 index 0000000000..3b18e512db --- /dev/null +++ b/group09/790466157/test.txt @@ -0,0 +1 @@ +hello world diff --git a/group09/85839593/assignment-0215-0226/pom.xml b/group09/85839593/assignment-0215-0226/pom.xml new file mode 100644 index 0000000000..9d40995970 --- /dev/null +++ b/group09/85839593/assignment-0215-0226/pom.xml @@ -0,0 +1,15 @@ + + + + assignment + assignment + 1.0-SNAPSHOT + + 4.0.0 + + assignment-0215-0226 + + + \ No newline at end of file diff --git a/group09/85839593/assignment-0215-0226/src/main/java/MyArrayList.java b/group09/85839593/assignment-0215-0226/src/main/java/MyArrayList.java new file mode 100644 index 0000000000..0fbd7771b4 --- /dev/null +++ b/group09/85839593/assignment-0215-0226/src/main/java/MyArrayList.java @@ -0,0 +1,84 @@ +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +/** + * Created with IntelliJ IDEA. + * User: guohairui + * Date: 17-2-22 + * Time: 上午12:06 + * To change this template use File | Settings | File Templates. + */ +public class MyArrayList { + public int size = 0; + private Object [] elementData = new Object[5]; + public void add(int index,Object obj){ + if(index>size() ||index<0) + throw new IndexOutOfBoundsException("哎呀我去,不够了."); + elementData[index]=obj; + size++; + } + public void insert(int index,Object obj){ + if(size>elementData.length-1){ + System.out.println("当前size:" + size + " 当前length:" + elementData.length+",再插不够了,需要扩容"); + Object [] tmpData = elementData; + elementData =new Object[size+5] ; + System.out.println("当前size:" + size + " 当前length扩了5后为:" + elementData.length); + System.arraycopy(tmpData,0,elementData,0,index); + elementData[index]=obj; + System.arraycopy(tmpData,index,elementData,index+1,tmpData.length-index); + }else { + if(elementData[index]==null){ + elementData[index]=obj; + }else { + System.out.println("当前size:" + size + " 当前length:" + elementData.length); + System.arraycopy(elementData,index,elementData,index+1,size-index); + elementData[index]=obj; + } + } + size++; + } + public void add(Object obj){ + if(size>=elementData.length){ + System.out.println("当前size:" + size + " 当前length:" + elementData.length); + Object [] tmpData = elementData; + elementData =new Object[size+5] ; + System.out.println("当前size:" + size + " 当前length扩了5后为:" + elementData.length); + System.arraycopy(tmpData,0,elementData,0,size); + elementData[size]=obj; + }else { + System.out.println("当前size:" + size + " 当前length:" + elementData.length); + elementData[size]=obj; + } + size++; + } + public Object get(int index) { + if(index>=size) + throw new IndexOutOfBoundsException("越了"); + return elementData[index]; + } + public Object remove(int index){ + Object delValue = elementData[index]; + int movesize = size-index-1; + System.out.print("size:"+size+" index:"+index+" ,size-index-1:"+movesize); + System.arraycopy(elementData,index+1,elementData,index,movesize); + System.out.print("删除后前移位,数组末位清空"); + elementData[--size]=null; + + return delValue; + } + public int size(){ + return size; + } + public String toString(){ + StringBuilder sb = new StringBuilder(); + sb.append('['); + for (int i=0;i=size) + throw new RuntimeException("超出范围了"); + Node node = head; + if(index<(size>>1)){//当偏向于前一半时从头找,否则从尾找 + for ( int i=0;i<=index;i++) { + node = node.next; + } + }else { + for (int i=size;i>index;i--){ + node=node.previous; + } + } + return node; + } + + private static class Node{ + Object data;//当前Entry + Node next;//下一个 + Node previous;//前一个 + public Node(Object data,Node next,Node previous){ + this.data=data; + this.next=next; + this.previous=previous; + } + } + public String toString(){ + StringBuilder sb = new StringBuilder(); + sb.append('['); + Node n =getNode(0) ; + for (int i=0;i>2); + } +} diff --git a/group09/85839593/assignment-0215-0226/src/test/java/MyLinkedListTest.java b/group09/85839593/assignment-0215-0226/src/test/java/MyLinkedListTest.java new file mode 100644 index 0000000000..f0db06e6f8 --- /dev/null +++ b/group09/85839593/assignment-0215-0226/src/test/java/MyLinkedListTest.java @@ -0,0 +1,70 @@ +import org.junit.*; +import org.junit.Test; + +/** + * Created with IntelliJ IDEA. + * User: guohairui + * Date: 17-2-26 + * Time: 下午6:12 + * To change this template use File | Settings | File Templates. + */ +public class MyLinkedListTest { + @org.junit.Test + public void testAdd() throws Exception { + MyLinkedList linkedList = new MyLinkedList(); + linkedList.add("abc1"); + linkedList.add("abc2"); + linkedList.add("abc3"); + linkedList.add("abc4"); + System.out.println(linkedList.get(1)); + System.out.println(linkedList); + linkedList.add("abc5"); + System.out.println(linkedList.get(3)); + System.out.println(linkedList.get(4)); + System.out.println(linkedList); + linkedList.add(2,"abcaddtmp"); + System.out.println(linkedList.get(3)); + System.out.println(linkedList.get(4)); + System.out.println(linkedList); + linkedList.remove(2); + System.out.println(linkedList.toString()); + linkedList.removeLast(); + System.out.println(linkedList.toString()); + linkedList.removeFirst(); + System.out.println(linkedList.toString()); + } + @Test + public void testGet() throws Exception { + + } + + @Test + public void testRemove() throws Exception { + + } + + @Test + public void testAddFirst() throws Exception { + + } + + @Test + public void testRemoveFirst() throws Exception { + + } + + @Test + public void testRemoveLast() throws Exception { + + } + + @Test + public void testSize() throws Exception { + + } + + @Test + public void testGetNode() throws Exception { + + } +} diff --git a/group09/85839593/assignment-0215-0226/src/test/java/MyQueueTest.java b/group09/85839593/assignment-0215-0226/src/test/java/MyQueueTest.java new file mode 100644 index 0000000000..d93a70ba81 --- /dev/null +++ b/group09/85839593/assignment-0215-0226/src/test/java/MyQueueTest.java @@ -0,0 +1,29 @@ +import org.junit.*; +import org.junit.Test; + +/** + * Created with IntelliJ IDEA. + * User: guohairui + * Date: 17-2-26 + * Time: 下午7:33 + * To change this template use File | Settings | File Templates. + */ +public class MyQueueTest { + @org.junit.Test + public void testEnQueue() throws Exception { + MyQueue myQueue=new MyQueue(); + myQueue.enQueue("abc1"); + myQueue.enQueue("abc2"); + myQueue.enQueue("abc3"); + System.out.println(myQueue); + myQueue.enQueue("abc4"); + System.out.println(myQueue); + myQueue.deQueue(); + System.out.println(myQueue); + } + + @Test + public void testDeQueue() throws Exception { + + } +} diff --git a/group09/85839593/assignment-0215-0226/src/test/java/MyStackTest.java b/group09/85839593/assignment-0215-0226/src/test/java/MyStackTest.java new file mode 100644 index 0000000000..b96d77dbbf --- /dev/null +++ b/group09/85839593/assignment-0215-0226/src/test/java/MyStackTest.java @@ -0,0 +1,36 @@ +import org.junit.*; +import org.junit.Test; + +/** + * Created with IntelliJ IDEA. + * User: guohairui + * Date: 17-2-26 + * Time: 下午7:20 + * To change this template use File | Settings | File Templates. + */ +public class MyStackTest { + @org.junit.Test + public void testPush() throws Exception { + MyStack myStack = new MyStack(); + myStack.push("abc1"); + myStack.push("abc2"); + myStack.push("abc3"); + System.out.println(myStack); + myStack.push("abc4"); + System.out.println(myStack); + System.out.println("myStack.peek:"+myStack.peek()); + myStack.pop(); + System.out.println("myStack.size"+myStack.size()); + System.out.println(myStack); + } + + @Test + public void testPop() throws Exception { + + } + + @Test + public void testPeek() throws Exception { + + } +} diff --git a/group09/85839593/pom.xml b/group09/85839593/pom.xml new file mode 100644 index 0000000000..627fff7a1f --- /dev/null +++ b/group09/85839593/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + assignment + assignment + pom + 1.0-SNAPSHOT + + assignment-0215-0226 + + + + \ No newline at end of file diff --git a/group09/group09.md b/group09/group09.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group09/group09.md @@ -0,0 +1 @@ + diff --git a/group10/1363044717/struts/homework/homework/pom.xml b/group10/1363044717/struts/homework/homework/pom.xml new file mode 100644 index 0000000000..54675f52ac --- /dev/null +++ b/group10/1363044717/struts/homework/homework/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + com + code + 1.0 + + + junit + junit + 4.12 + + + dom4j + dom4j + 1.1 + + + + \ No newline at end of file diff --git a/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/array/ArrayUtil.java b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..aee11e5122 --- /dev/null +++ b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/array/ArrayUtil.java @@ -0,0 +1,318 @@ +package com.code.coderising.array; + +import org.junit.Test; +import java.util.Arrays; + +/** + * Created by Mori on 2017/3/2. + */ +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int n = origin.length; + for (int i = 0, j = n >> 1; i < j; i++) { + int temp = origin[i]; + origin[i] = origin[n - i - 1]; + origin[n - i - 1] = temp; + } + } + + @Test + public void testReverseArray() { + int[] a = {7, 9, 30, 3}; + System.out.println("原数组:" + Arrays.toString(a)); + reverseArray(a); + System.out.println("reverseArray后:" + Arrays.toString(a)); + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray) { + Arrays.sort(oldArray); + int[] newArr = null; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArr = new int[oldArray.length - i]; + System.arraycopy(oldArray, i, newArr, 0, oldArray.length - i); + break; + } + } + return newArr; + } + + @Test + public void testRemoveZero() { + int[] a = {7, 9, 0, 30, 0, 0, 3}; + System.out.println("原数组:" + Arrays.toString(a)); + int[] newArr = removeZero(a); + System.out.println("removeZero后:" + Arrays.toString(newArr)); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int m = array1.length; + int n = array2.length; + int[] newArr = new int[m + n]; + int i = 0, j = 0, k = 0; + for (; i < m && j < n; ) { + if (array1[i] < array2[j]) { + newArr[k++] = array1[i++]; + } else { + newArr[k++] = array2[j++]; + } + + } + while (i < m) { + newArr[k++] = array1[i++]; + } + while (j < n) { + newArr[k++] = array2[j++]; + } + if (newArr.length < 1) + return null; + int slow = 1; + int count = 0; + for (int fast = 1; fast < newArr.length; fast++) { + if (newArr[fast] != newArr[slow - 1]) { + newArr[slow++] = newArr[fast]; + } else { + count++; + } + } + int[] arr = new int[newArr.length - count]; + System.arraycopy(newArr, 0, arr, 0, newArr.length - count); + return arr; + } + + @Test + public void testMerge() { + int[] a1 = {3, 5, 7, 8, 10, 10, 10, 10, 10}; + int[] a2 = {4, 5, 6, 7, 10, 12}; + int[] newArray = merge(a1, a2); + System.out.println("merge:" + Arrays.toString(newArray)); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + @Test + public void testGrow() { + int[] arr = {2, 3, 6}; + int[] newArray = grow(arr, 3); + System.out.println("grow:" + Arrays.toString(newArray)); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max == 1) { + return new int[0]; + } + int a = 1; + int b = 1; + int temp; + StringBuilder str = new StringBuilder("1,1,"); + while (a + b < max) { + temp = b; + b = a + b; + a = temp; + str.append(b + ","); + } + String[] arr = str.toString().split(","); + int[] newArray = new int[arr.length]; + for (int i = 0; i < arr.length; i++) { + newArray[i] = Integer.valueOf(arr[i]); + } + return newArray; + } + + @Test + public void testFibonacci() { + int[] newArray = fibonacci(500); + System.out.println("Fibonacci:" + Arrays.toString(newArray)); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max) { + StringBuilder str = new StringBuilder(); + for (int i = 2; i < max; i++) { + if (i < 4) { + str.append(i + ","); + continue; + } else if (i % 2 == 0) { + continue; + } else if (i < 9) { + str.append(i + ","); + continue; + } else if (i % 3 == 0) { + continue; + } else { + int f = 5; + boolean flag = true; + while (f <= i/f) { + if (i % f == 0) { + flag = false; + break; + } else if (i % (f + 2) == 0) { + flag = false; + break; + } + f += 6; + } + if (flag) { + str.append(i + ","); + continue; + } + } + } + String[] arr = str.toString().split(","); + int[] newArray = new int[arr.length]; + for (int i = 0; i < arr.length; i++) { + newArray[i] = Integer.valueOf(arr[i]); + } + return newArray; + } + + @Test + public void testGetPrimes() { + int[] newArray = getPrimes(5000); + System.out.println("getPrimes:" + Arrays.toString(newArray)); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + if(max<7){ + return new int[0]; + } + boolean flag = true; + StringBuilder str = new StringBuilder("6,"); + for (int i = 6; i < max; ) { + int sum = 1; + if (i % 3 == 1 && i % 9 == 1) { + //如果以8结尾,那么就肯定是以28结尾 + if(!flag){ + if(i%100!=28){ + i += 8; + flag = true; + continue; + } + } + for (int j = 2; j <= i / j; j++) { + if (i % j == 0) { + sum += j; + sum += i / j; + } + } + if (sum == i) { + str.append(i+","); + } + } + if (flag) { + i += 2; + flag = false; + } else { + i += 8; + flag = true; + } + } + String[] arr = str.toString().split(","); + int[] newArray = new int[arr.length]; + for (int i = 0; i < arr.length; i++) { + newArray[i] = Integer.valueOf(arr[i]); + } + return newArray; + } + + @Test + public void testGetPerfectNumbers() { + int[] newArray = getPerfectNumbers(33550337); + System.out.println("getPerfectNumbers:" + Arrays.toString(newArray)); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + if (array == null) + return "null"; + int n = array.length - 1; + if (n == -1) { + return ""; + } + StringBuilder b = new StringBuilder(); + for (int i = 0; ; i++) { + b.append(array[i]); + if (i == n) { + return b.toString(); + } + b.append(seperator); + } + } + + @Test + public void testJoin() { + int[] a1 = {3, 5, 7}; + System.out.println(join(a1, "-")); + } + +} diff --git a/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..cd1753941c --- /dev/null +++ b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.code.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/Struts.java b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..262b4bca59 --- /dev/null +++ b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/Struts.java @@ -0,0 +1,79 @@ +package com.code.coderising.litestruts; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + SAXReader reader = new SAXReader(); + View view=new View(); + try { + Document e = reader.read(ClassLoader.getSystemResource("struts.xml")); + //得到根节点 + Element struts = e.getRootElement(); + Iterator it = struts.elementIterator(); + while(it.hasNext()) {//action遍历 + Element action = (Element)it.next(); + // 找到 name=actionName 的action + List actionAtr = action.attributes(); + if(!actionAtr.get(0).getValue().equals(actionName)) + continue; + String className= actionAtr.get(1).getValue(); + //得到actionName 对应的class + Class classz=Class.forName(className); + Object o=classz.newInstance(); + Field field; + for(Map.Entry entry:parameters.entrySet()){ + field = classz.getDeclaredField(entry.getKey()); + field.setAccessible(true); + field.set(o, entry.getValue()); + } + Method m = classz.getMethod("execute"); + String resultString=(String)m.invoke(o); + Method m2 = classz.getMethod("getMessage"); + String message=(String)m2.invoke(o); + + Map map=new HashMap<>(); + + map.put("message",message); + view.setParameters(map); + it=action.elementIterator(); + //遍历 + while (it.hasNext()){ + Element result = (Element)it.next(); + String s= result.attribute(0).getValue(); + if(resultString.equals(s)){ + view.setJsp(result.getStringValue()); + return view; + } + } + } + } catch (DocumentException var9) { + var9.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..fe414cf1a7 --- /dev/null +++ b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.code.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/View.java b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/View.java new file mode 100644 index 0000000000..f55dae45fa --- /dev/null +++ b/group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.code.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group10/1363044717/struts/homework/homework/src/main/resources/struts.xml b/group10/1363044717/struts/homework/homework/src/main/resources/struts.xml new file mode 100644 index 0000000000..b9489dad6d --- /dev/null +++ b/group10/1363044717/struts/homework/homework/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group10/1363044717/struts/homework/pom.xml b/group10/1363044717/struts/homework/pom.xml new file mode 100644 index 0000000000..54675f52ac --- /dev/null +++ b/group10/1363044717/struts/homework/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + com + code + 1.0 + + + junit + junit + 4.12 + + + dom4j + dom4j + 1.1 + + + + \ No newline at end of file diff --git a/group10/1363044717/struts/homework/src/main/java/com/code/coderising/array/ArrayUtil.java b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..aee11e5122 --- /dev/null +++ b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/array/ArrayUtil.java @@ -0,0 +1,318 @@ +package com.code.coderising.array; + +import org.junit.Test; +import java.util.Arrays; + +/** + * Created by Mori on 2017/3/2. + */ +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int n = origin.length; + for (int i = 0, j = n >> 1; i < j; i++) { + int temp = origin[i]; + origin[i] = origin[n - i - 1]; + origin[n - i - 1] = temp; + } + } + + @Test + public void testReverseArray() { + int[] a = {7, 9, 30, 3}; + System.out.println("原数组:" + Arrays.toString(a)); + reverseArray(a); + System.out.println("reverseArray后:" + Arrays.toString(a)); + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray) { + Arrays.sort(oldArray); + int[] newArr = null; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArr = new int[oldArray.length - i]; + System.arraycopy(oldArray, i, newArr, 0, oldArray.length - i); + break; + } + } + return newArr; + } + + @Test + public void testRemoveZero() { + int[] a = {7, 9, 0, 30, 0, 0, 3}; + System.out.println("原数组:" + Arrays.toString(a)); + int[] newArr = removeZero(a); + System.out.println("removeZero后:" + Arrays.toString(newArr)); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int m = array1.length; + int n = array2.length; + int[] newArr = new int[m + n]; + int i = 0, j = 0, k = 0; + for (; i < m && j < n; ) { + if (array1[i] < array2[j]) { + newArr[k++] = array1[i++]; + } else { + newArr[k++] = array2[j++]; + } + + } + while (i < m) { + newArr[k++] = array1[i++]; + } + while (j < n) { + newArr[k++] = array2[j++]; + } + if (newArr.length < 1) + return null; + int slow = 1; + int count = 0; + for (int fast = 1; fast < newArr.length; fast++) { + if (newArr[fast] != newArr[slow - 1]) { + newArr[slow++] = newArr[fast]; + } else { + count++; + } + } + int[] arr = new int[newArr.length - count]; + System.arraycopy(newArr, 0, arr, 0, newArr.length - count); + return arr; + } + + @Test + public void testMerge() { + int[] a1 = {3, 5, 7, 8, 10, 10, 10, 10, 10}; + int[] a2 = {4, 5, 6, 7, 10, 12}; + int[] newArray = merge(a1, a2); + System.out.println("merge:" + Arrays.toString(newArray)); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + @Test + public void testGrow() { + int[] arr = {2, 3, 6}; + int[] newArray = grow(arr, 3); + System.out.println("grow:" + Arrays.toString(newArray)); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max == 1) { + return new int[0]; + } + int a = 1; + int b = 1; + int temp; + StringBuilder str = new StringBuilder("1,1,"); + while (a + b < max) { + temp = b; + b = a + b; + a = temp; + str.append(b + ","); + } + String[] arr = str.toString().split(","); + int[] newArray = new int[arr.length]; + for (int i = 0; i < arr.length; i++) { + newArray[i] = Integer.valueOf(arr[i]); + } + return newArray; + } + + @Test + public void testFibonacci() { + int[] newArray = fibonacci(500); + System.out.println("Fibonacci:" + Arrays.toString(newArray)); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max) { + StringBuilder str = new StringBuilder(); + for (int i = 2; i < max; i++) { + if (i < 4) { + str.append(i + ","); + continue; + } else if (i % 2 == 0) { + continue; + } else if (i < 9) { + str.append(i + ","); + continue; + } else if (i % 3 == 0) { + continue; + } else { + int f = 5; + boolean flag = true; + while (f <= i/f) { + if (i % f == 0) { + flag = false; + break; + } else if (i % (f + 2) == 0) { + flag = false; + break; + } + f += 6; + } + if (flag) { + str.append(i + ","); + continue; + } + } + } + String[] arr = str.toString().split(","); + int[] newArray = new int[arr.length]; + for (int i = 0; i < arr.length; i++) { + newArray[i] = Integer.valueOf(arr[i]); + } + return newArray; + } + + @Test + public void testGetPrimes() { + int[] newArray = getPrimes(5000); + System.out.println("getPrimes:" + Arrays.toString(newArray)); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + if(max<7){ + return new int[0]; + } + boolean flag = true; + StringBuilder str = new StringBuilder("6,"); + for (int i = 6; i < max; ) { + int sum = 1; + if (i % 3 == 1 && i % 9 == 1) { + //如果以8结尾,那么就肯定是以28结尾 + if(!flag){ + if(i%100!=28){ + i += 8; + flag = true; + continue; + } + } + for (int j = 2; j <= i / j; j++) { + if (i % j == 0) { + sum += j; + sum += i / j; + } + } + if (sum == i) { + str.append(i+","); + } + } + if (flag) { + i += 2; + flag = false; + } else { + i += 8; + flag = true; + } + } + String[] arr = str.toString().split(","); + int[] newArray = new int[arr.length]; + for (int i = 0; i < arr.length; i++) { + newArray[i] = Integer.valueOf(arr[i]); + } + return newArray; + } + + @Test + public void testGetPerfectNumbers() { + int[] newArray = getPerfectNumbers(33550337); + System.out.println("getPerfectNumbers:" + Arrays.toString(newArray)); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + if (array == null) + return "null"; + int n = array.length - 1; + if (n == -1) { + return ""; + } + StringBuilder b = new StringBuilder(); + for (int i = 0; ; i++) { + b.append(array[i]); + if (i == n) { + return b.toString(); + } + b.append(seperator); + } + } + + @Test + public void testJoin() { + int[] a1 = {3, 5, 7}; + System.out.println(join(a1, "-")); + } + +} diff --git a/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..cd1753941c --- /dev/null +++ b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.code.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/Struts.java b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..262b4bca59 --- /dev/null +++ b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/Struts.java @@ -0,0 +1,79 @@ +package com.code.coderising.litestruts; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + SAXReader reader = new SAXReader(); + View view=new View(); + try { + Document e = reader.read(ClassLoader.getSystemResource("struts.xml")); + //得到根节点 + Element struts = e.getRootElement(); + Iterator it = struts.elementIterator(); + while(it.hasNext()) {//action遍历 + Element action = (Element)it.next(); + // 找到 name=actionName 的action + List actionAtr = action.attributes(); + if(!actionAtr.get(0).getValue().equals(actionName)) + continue; + String className= actionAtr.get(1).getValue(); + //得到actionName 对应的class + Class classz=Class.forName(className); + Object o=classz.newInstance(); + Field field; + for(Map.Entry entry:parameters.entrySet()){ + field = classz.getDeclaredField(entry.getKey()); + field.setAccessible(true); + field.set(o, entry.getValue()); + } + Method m = classz.getMethod("execute"); + String resultString=(String)m.invoke(o); + Method m2 = classz.getMethod("getMessage"); + String message=(String)m2.invoke(o); + + Map map=new HashMap<>(); + + map.put("message",message); + view.setParameters(map); + it=action.elementIterator(); + //遍历 + while (it.hasNext()){ + Element result = (Element)it.next(); + String s= result.attribute(0).getValue(); + if(resultString.equals(s)){ + view.setJsp(result.getStringValue()); + return view; + } + } + } + } catch (DocumentException var9) { + var9.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..fe414cf1a7 --- /dev/null +++ b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.code.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/View.java b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/View.java new file mode 100644 index 0000000000..f55dae45fa --- /dev/null +++ b/group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.code.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group10/1363044717/struts/homework/src/main/resources/struts.xml b/group10/1363044717/struts/homework/src/main/resources/struts.xml new file mode 100644 index 0000000000..b9489dad6d --- /dev/null +++ b/group10/1363044717/struts/homework/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java" new file mode 100644 index 0000000000..73a0b0ae33 --- /dev/null +++ "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java" @@ -0,0 +1,116 @@ +package com.coding.basic; + +import java.lang.reflect.Array; +import java.util.Arrays; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData; + + //默认容量 + private static final int DEFAULT_CAPACITY = 10; + + public ArrayList(int capacity){ + if(capacity >= 0){ + elementData = new Object[capacity]; + }else { + throw new IllegalArgumentException("Illegal Capacity: " + + capacity); + } + + } + public ArrayList(){ + this(DEFAULT_CAPACITY); + } + + /** + * 保证集合容量 + * @param minCapacity + */ + private void ensureCapacity(int minCapacity){ + int oldCapacity = elementData.length; + if(minCapacity > oldCapacity){ + //扩容 + int newCapacity = oldCapacity + (oldCapacity >> 1) + 1; + if(minCapacity - newCapacity > 0){ + newCapacity = minCapacity; + } + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + private void checkIndexRange(int index) + { + if(index >= size || index < 0) + { + throw new IndexOutOfBoundsException("Index out of bounds, index : " + index); + } + } + public void add(E o){ + ensureCapacity(size+1); + elementData[size++] = o; + } + public void add(int index, E o){ + checkIndexRange(index);//检查下标 + ensureCapacity(size+1);//保证数组容量 + System.arraycopy(elementData,index,elementData,index + 1,size-index);//数组复制,把index后的元素全部向后移一位 + elementData[index] = o;//插入元素值 + size++;//元素size加一 + } + + @Override + public E get(int index) { + checkIndexRange(index);//检查下标 + return (E)elementData[index]; + } + + @Override + public E remove(int index) { + E e = this.get(index); + int numMoved = size - index - 1; + if(numMoved > 0) + { + System.arraycopy(elementData, index+1, elementData, index, numMoved);//数组复制,把index后的元素全部向前移一位 + } + elementData[--size] = null;//最后一位赋值为null,size-1 + return e; + } + + + public int size(){ + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + + private int endIndex = size - 1; + private int index = 0; + + public ArrayListIterator(){ + } + @Override + public boolean hasNext() { + return this.index < this.endIndex; + } + + @Override + public E next() { + if(!this.hasNext()) { + throw new NoSuchElementException();//没有元素了 + } else { + return (E)elementData[this.index++]; + } + } + } +} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/BinaryTreeNode.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/BinaryTreeNode.java" new file mode 100644 index 0000000000..a1653b6e9f --- /dev/null +++ "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/BinaryTreeNode.java" @@ -0,0 +1,68 @@ +package com.coding.basic; + + +public class BinaryTreeNode implements Comparable { + public BinaryTreeNode(Object data) { + this.data = data; + } + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + //左子节点的值永远比父节点的值小 + //右子节点的值永远比父节点的值大 + BinaryTreeNode node = new BinaryTreeNode(o); + insertNode(node); + return node; + } + private void insertNode(BinaryTreeNode node){ + insertNode(this,node); + } + private void insertNode(BinaryTreeNode parentNode, BinaryTreeNode node) { + if (parentNode.compareTo(node) <= 0) {//数字大于父节点 + if (parentNode.right == null) { + parentNode.right = node; + return; + } + insertNode(parentNode.right, node); + } else { + if (parentNode.left == null) { + parentNode.left = node; + return; + } + insertNode(parentNode.left, node); + } + } + + @Override + public int compareTo(BinaryTreeNode o) { + Integer i = (Integer) this.data; + return i.compareTo((Integer) o.data); + } +} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Iterator.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Iterator.java" new file mode 100644 index 0000000000..09e5b73661 --- /dev/null +++ "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Iterator.java" @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public E next(); +} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/JavaTest.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/JavaTest.java" new file mode 100644 index 0000000000..208fa8390d --- /dev/null +++ "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/JavaTest.java" @@ -0,0 +1,62 @@ +package com.coding.basic; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by Mori on 2017/2/21. + */ +public class JavaTest { + @Test + public void testBinaryTreeNode(){ + BinaryTreeNode node = new BinaryTreeNode(5); + node.insert(4);//左 + node.insert(7);//右 + node.insert(2);//左左 + node.insert(6);//右左 + node.insert(5);//右左左 + node.insert(6);//右左右 + System.out.println(node.getData()); + System.out.println(node.getLeft().getData()); + System.out.println(node.getRight().getData()); + System.out.println(node.getLeft().getLeft().getData()); + System.out.println(node.getRight().getLeft().getData()); + System.out.println(node.getRight().getLeft().getLeft().getData()); + System.out.println(node.getRight().getLeft().getRight().getData()); + } + @Test + public void testArrayList(){ + ArrayList list =new ArrayList<>(); + list.add(1); + list.add(2); + list.add(3); + list.add(5); + Assert.assertEquals((Object) list.get(2),3); + Assert.assertEquals((Object) list.remove(2),3); + Assert.assertEquals((Object) list.get(2),5); + Iterator listIterator = list.iterator(); + while (listIterator.hasNext()){ + System.out.println(listIterator.next()); + } + } + @Test + public void testLinkedList(){ + LinkedList linkedList = new LinkedList<>(); + linkedList.add(1); + linkedList.add(2); + linkedList.add(5); + linkedList.addFirst(10); + linkedList.add(1,6); + // linkedList.removeLast(); + //linkedList.removeFirst(); + Iterator linkedListIterator = linkedList.iterator(); + while (linkedListIterator.hasNext()){ + System.out.println(linkedListIterator.next()); + } + System.out.println("----"); + System.out.println(linkedList.remove(0)); + System.out.println(linkedList.remove(2)); + //System.out.println(linkedList.get(3)); + //System.out.println(linkedList.get(4)); + } +} \ No newline at end of file diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java" new file mode 100644 index 0000000000..9a1ae01119 --- /dev/null +++ "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java" @@ -0,0 +1,162 @@ +package com.coding.basic; + +import jdk.nashorn.internal.ir.ReturnNode; + +import java.lang.reflect.Array; +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head;//链表的头 + private Node tail;//链表的结尾 + private int size;//记录当前元素的size + + public void add(E e) { + Node node = new Node(e); + if (head == null) { + head = node; + } else { + tail.next = node; + } + tail = node; + tail.next = null; + size++; + } + + private void checkIndexRange(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + } + + public void add(int index, E e) { + checkIndexRange(index); + Node node = new Node(e); + Node temp = head; + Node temp2 = null; + for (int i = 0; i < index - 1; i++) { + temp = temp.next; + } + temp2 = temp.next; + temp.next = node; + node.next = temp2; + size++; + } + + @Override + public E get(int index) { + checkIndexRange(index); + Node temp = head; + + for (int i = 0; i < index; i++) { + temp = temp.next; + } + return (E) temp.data; + } + + @Override + public E remove(int index) { + checkIndexRange(index); + if (index == 0) { + E e = removeFirst(); + return e; + } + if (index == size - 1) { + E e = removeLast(); + return e; + } + Node temp = head; + for (int i = 0; i < index - 1; i++) { + temp = temp.next; + } + E e = (E) temp.next.data; + temp.next = temp.next.next; + size--; + return e; + } + + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + public void addFirst(E e) { + Node node = new Node(e); + node.next = head; + head = node; + size++; + } + + public void addLast(E e) { + this.add(e); + } + + public E removeFirst() { + E e = (E) head.data; + head = head.next; + size--; + return e; + } + + public E removeLast() { + Node temp = head; + for (int i = 0; i < size - 1; i++) { + temp = temp.next; + } + temp.next = null; + E e = (E) tail.data; + tail = temp; + size--; + return e; + } + + public Iterator iterator() { + return new LinkedListIterator(this); + } + + private static class Node { + E data; + Node next; + public Node(E e) { + this.data = e; + } + } + private class LinkedListIterator implements Iterator{ + + private Node head;//链表的头 + private Node tail;//链表的结尾 + private Node node;//当前遍历的node + private int index; + private int endIndex; + + public LinkedListIterator(LinkedList list){ + this.head=list.head; + this.tail=list.tail; + this.endIndex = list.size() - 1; + node=head; + } + @Override + public boolean hasNext() { + return this.index < this.endIndex; + } + + @Override + public E next() { + if(!this.hasNext()) { + throw new NoSuchElementException();//没有元素了 + } else { + if(index == 0){ + node = head; + }else { + node = node.next; + } + index++; + return (E)node.data; + } + } + } +} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/List.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/List.java" new file mode 100644 index 0000000000..899ba2bd3e --- /dev/null +++ "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/List.java" @@ -0,0 +1,10 @@ +package com.coding.basic; + +public interface List { + public void add(E o); + public void add(int index, E o); + public E get(int index); + public E remove(int index); + public int size(); + boolean isEmpty(); +} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Queue.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Queue.java" new file mode 100644 index 0000000000..a8d5741846 --- /dev/null +++ "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Queue.java" @@ -0,0 +1,30 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList elementData = new LinkedList(); + + /** + * 进队列 + * @param o + */ + public void enQueue(E o){ + elementData.addLast(o);//添加到队尾 + } + + /** + * 出队列 + * @return + */ + public E deQueue(){ + return elementData.removeFirst();//移除队首 + } + + public boolean isEmpty(){ + return elementData.isEmpty(); + } + + public int size(){ + return elementData.size(); + } +} diff --git "a/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Stack.java" "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Stack.java" new file mode 100644 index 0000000000..de407c8548 --- /dev/null +++ "b/group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Stack.java" @@ -0,0 +1,30 @@ +package com.coding.basic; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + public void push(E o){ + elementData.add(o); + } + + /** + * 移除栈顶并返回他 + * @return + */ + public E pop(){ + return elementData.remove(elementData.size()-1); + } + /** + * 得到栈顶元素 + * @return + */ + public E peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.isEmpty(); + } + public int size(){ + return elementData.size(); + } +} diff --git a/group10/205301442/src/com/coding/week1/ArrayList.java b/group10/205301442/src/com/coding/week1/ArrayList.java new file mode 100644 index 0000000000..db50f7ef46 --- /dev/null +++ b/group10/205301442/src/com/coding/week1/ArrayList.java @@ -0,0 +1,96 @@ +package com.coding.week1; + + + + +public class ArrayList implements List{ + private int size = 0; + + private Object[] elementData = {}; + + public void add(Object o){ + extendIndex(); + elementData[size] = o; + size++; + } + public void add(int index, Object o){ + + if(index>size){ + System.out.println("Exception in thread \""+Thread.currentThread()+"\" java.lang.IndexOutOfBoundsException:Index:"+index+",Size:"+size); + return; + } + int length = elementData.length; + if(size==elementData.length){ + length=elementData.length+1; + } + Object[] newElement = new Object[length]; + System.arraycopy(elementData, 0, newElement, 0, index); + System.arraycopy(elementData, index, newElement,index+1,size-index ); + newElement[index]=o; + elementData = newElement; + size++; + } + + public Object get(int index){ + boolean isRange=rangeCheck(index); + if(!isRange){ + return null; + } + return elementData[index]; + } + + public Object remove(int index){ + boolean isRange=rangeCheck(index); + if(!isRange){ + return null; + } + Object rmData = elementData[index]; + Object[] newElement = new Object[elementData.length]; + System.arraycopy(elementData, 0, newElement, 0, index);; + System.arraycopy(elementData, index+1, newElement,index,size-index-1 ); + elementData = newElement; + size--; + return rmData; + } + + public int size(){ + return size; + } + + public com.coding.week1.Iterator iterator(){ + return new Ito(); + } + public boolean rangeCheck(int index){ + + if(index>size-1||index<0){ + System.err.println("Exception in thread \""+Thread.currentThread()+"\" java.lang.IndexOutOfBoundsException:Index:"+index+",Size:"+size); + return false; + } + return true; + } + public void extendIndex(){ + Object[] newElement = new Object[elementData.length+1]; + System.arraycopy(elementData, 0, newElement, 0, size); + elementData = newElement; + + } + public class Ito implements com.coding.week1.Iterator{ + int cursor; + @Override + public boolean hasNext() { + if(cursor!=size){ + return true; + } + return false; + } + + @Override + public Object next() { + Object o=elementData[cursor]; + cursor++; + return o; + } + } + + +} diff --git a/group10/205301442/src/com/coding/week1/BinaryTreeNode.java b/group10/205301442/src/com/coding/week1/BinaryTreeNode.java new file mode 100644 index 0000000000..547e09d42f --- /dev/null +++ b/group10/205301442/src/com/coding/week1/BinaryTreeNode.java @@ -0,0 +1,53 @@ +package com.coding.week1; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + public BinaryTreeNode(Object data){ + this.data = data; + } + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + BinaryTreeNode newBTN = new BinaryTreeNode(o); + Integer insert = (Integer)o; + + BinaryTreeNode cursor = this; + while(true){ + if(insert.compareTo((Integer)cursor.data)==-1){ + if(cursor.left==null){ + cursor.left = newBTN; + break; + } + cursor = cursor.left; + }else if(insert.compareTo((Integer)cursor.data)==1){ + if(cursor.right==null){ + cursor.right = newBTN; + break; + } + cursor = cursor.right; + } + } + return newBTN; + } + +} diff --git a/group10/205301442/src/com/coding/week1/Iterator.java b/group10/205301442/src/com/coding/week1/Iterator.java new file mode 100644 index 0000000000..7f6f333443 --- /dev/null +++ b/group10/205301442/src/com/coding/week1/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.week1; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group10/205301442/src/com/coding/week1/LinkedList.java b/group10/205301442/src/com/coding/week1/LinkedList.java new file mode 100644 index 0000000000..2c14a0e9cb --- /dev/null +++ b/group10/205301442/src/com/coding/week1/LinkedList.java @@ -0,0 +1,162 @@ +package com.coding.week1; + +public class LinkedList implements List { + private int size; + private Node first; + private Node last; + public static class Node{ + Object data; + Node next; + Node prev; + public Node(Node prev,Object data,Node next){ + this.data = data; + this.next = next; + this.prev = prev; + } + } + + @Override + public void add(Object o) { + final Node l = last; + Node newNode = new Node(last,o,null); + last = newNode; + if(first==null){ + first = newNode; + }else{ + l.next = newNode; + } + size++; + + } + + @Override + public void add(int index, Object o) { + + if(index>size){ + System.out.println("Exception in thread \""+Thread.currentThread()+"\" java.lang.IndexOutOfBoundsException:Index:"+index+",Size:"+size); + return; + } + Node newNode = new Node(null,o,null); + Node nodePre = node(index-1); + Node oldNode = node(index); + if(nodePre!=null){ + nodePre.next =newNode; + newNode.prev = nodePre; + }else{ + first = newNode; + } + if(oldNode!=null){ + oldNode.prev = newNode; + newNode.next = oldNode; + }else{ + last = newNode; + } + size++; + } + + @Override + public Object get(int index) { + if(!rangeCheck(index)){ + return null; + } + + return node(index).data; + } + + @Override + public Object remove(int index) { + if(!rangeCheck(index)){ + return null; + } + Node prevNode = node(index-1); + Node nextNode = node(index+1); + Node rmNode = node(index); + if(prevNode!=null){ + prevNode.next = nextNode; + }else{ + first=nextNode; + } + if(nextNode!=null){ + nextNode.prev = prevNode; + }else{ + last = prevNode; + } + size--; + return rmNode.data; + } + + @Override + public int size() { + // TODO Auto-generated method stub + return size; + } + public Object head(){ + return first.data; + } + public Object last(){ + return last.data; + } + public void addFirst(Object o){ + add(0,o); + } + public void addLast(Object o){ + add(size,o); + } + public Object removeFirst(){ + Node f = first; + remove(0); + return f.data; + } + public Object removeLast(){ + Node l = last; + remove(size-1); + return l.data; + } + public Node node(int index){ + if(index<0){ + return null; + } + Node x =null; + if(index<(size<<1)){ + x = first; + for(int i=0;iindex;i--){ + x = x.prev; + } + } + return x; + } + public boolean rangeCheck(int index){ + + if(index>size-1||index<0){ + System.err.println("Exception in thread \""+Thread.currentThread()+"\" java.lang.IndexOutOfBoundsException:Index:"+index+",Size:"+size); + return false; + } + return true; + } + public Ito iterator(){ + return new Ito(); + } + public class Ito implements Iterator{ + int cursor; + @Override + public boolean hasNext() { + if(cursor!=size){ + return true; + } + return false; + } + + @Override + public Object next() { + Object o=node(cursor).data; + cursor++; + return o; + } + + } +} diff --git a/group10/205301442/src/com/coding/week1/List.java b/group10/205301442/src/com/coding/week1/List.java new file mode 100644 index 0000000000..e06b7c8ab9 --- /dev/null +++ b/group10/205301442/src/com/coding/week1/List.java @@ -0,0 +1,9 @@ +package com.coding.week1; + +public interface List { + public void add(Object o); + public void add(int index,Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group10/205301442/src/com/coding/week1/Queue.java b/group10/205301442/src/com/coding/week1/Queue.java new file mode 100644 index 0000000000..e3c4a44a42 --- /dev/null +++ b/group10/205301442/src/com/coding/week1/Queue.java @@ -0,0 +1,23 @@ +package com.coding.week1; + +public class Queue { + ArrayList list = new ArrayList(); + public void enQueue(Object o){ + list.add(o); + } + + public Object deQueue(){ + return list.remove(0); + } + + public boolean isEmpty(){ + if(list.size()==0){ + return true; + } + return false; + } + + public int size(){ + return list.size(); + } +} diff --git a/group10/205301442/src/com/coding/week1/Stack.java b/group10/205301442/src/com/coding/week1/Stack.java new file mode 100644 index 0000000000..307b3630df --- /dev/null +++ b/group10/205301442/src/com/coding/week1/Stack.java @@ -0,0 +1,28 @@ +package com.coding.week1; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + int top = elementData.size()-1; + return elementData.remove(top); + } + + public Object peek(){ + int top = elementData.size()-1; + return elementData.get(top); + } + public boolean isEmpty(){ + if(elementData.size()==0){ + return true; + } + return false; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group10/205301442/src/com/coding/week2/ArrayUtil.java b/group10/205301442/src/com/coding/week2/ArrayUtil.java new file mode 100644 index 0000000000..b11f5ee71d --- /dev/null +++ b/group10/205301442/src/com/coding/week2/ArrayUtil.java @@ -0,0 +1,199 @@ +package com.coding.week2; + +public class ArrayUtil { + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static int[] reverseArray(int[] origin){ + int j=origin.length-1; + for(int i=0;i=nums.length?nums.length:size; + + System.arraycopy(nums, 0, newNums, 0, length); + return newNums; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + //这里为什么是开平方根 + public static int[] getPrimes(int max){ + int i=2; + int[] nums = new int[max]; + int index=0; + while(i parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + File f1 = new File("config/struts.xml"); + + File f = new File(f1.getAbsolutePath()); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc=builder.parse(f); + Element root = doc.getDocumentElement(); + + Map> actions = new HashMap>(); + if (root.getNodeType() == Node.ELEMENT_NODE) { + NodeList actionList = root.getChildNodes(); + + for (int i = 0; i < actionList.getLength(); i++) { + Node n = actionList.item(i); + if (n.getNodeType() == Node.ELEMENT_NODE) { + NamedNodeMap nnmap = n.getAttributes(); + Map action = new HashMap(); + action.put(nnmap.item(0).getNodeValue(),nnmap.item(1).getNodeValue()); + NodeList result= n.getChildNodes(); + + for(int j = 0;j requestAction=null; + if(actionName!=null){ + requestAction=actions.get(actionName); + }else{ + System.err.println("没有actionName"); + } + + try { + if(requestAction!=null){ + Class c = Class.forName(requestAction.get(actionName)); + Object co = c.newInstance(); + if("login".equals(actionName)){ + String name = parameters.get("name"); + String password = parameters.get("password"); + Method m1=c.getMethod("setName", String.class); + Method m2=c.getMethod("setPassword", String.class); + Method m3 = c.getMethod("execute"); + m1.invoke(co, name); + m2.invoke(co, password); + String rest = (String)m3.invoke(co); + Method m4 = c.getMethod("getMessage"); + String message = (String)m4.invoke(co); + Map pras =new HashMap(); + pras.put("message", message); + View view = new View(); + view.setJsp(requestAction.get(rest)); + view.setParameters(pras); + return view; + } + }else{ + System.out.println("没有找到对应action"); + } + + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchMethodException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } catch (ParserConfigurationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SAXException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + +} diff --git a/group10/205301442/src/com/coding/week2/litestruts/StrutsTest.java b/group10/205301442/src/com/coding/week2/litestruts/StrutsTest.java new file mode 100644 index 0000000000..99e41bd0f4 --- /dev/null +++ b/group10/205301442/src/com/coding/week2/litestruts/StrutsTest.java @@ -0,0 +1,40 @@ +package com.coding.week2.litestruts; + +import static org.junit.Assert.*; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + System.out.println( view.getJsp()); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + System.out.println( view.getJsp()); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group10/205301442/src/com/coding/week2/litestruts/View.java b/group10/205301442/src/com/coding/week2/litestruts/View.java new file mode 100644 index 0000000000..bf7bd0d6c8 --- /dev/null +++ b/group10/205301442/src/com/coding/week2/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coding.week2.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group10/205301442/test/com/coding/week1/AllTests.java b/group10/205301442/test/com/coding/week1/AllTests.java new file mode 100644 index 0000000000..fb54214d4d --- /dev/null +++ b/group10/205301442/test/com/coding/week1/AllTests.java @@ -0,0 +1,11 @@ +package com.coding.week1; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ TestArrayList.class, TestLinkedList.class, TestQueue.class, TestStack.class,TestBiranyTreeNode.class }) +public class AllTests { + +} diff --git a/group10/205301442/test/com/coding/week1/TestArrayList.java b/group10/205301442/test/com/coding/week1/TestArrayList.java new file mode 100644 index 0000000000..0c7040d335 --- /dev/null +++ b/group10/205301442/test/com/coding/week1/TestArrayList.java @@ -0,0 +1,31 @@ +package com.coding.week1; + +import static org.junit.Assert.*; +import org.junit.Test; + +public class TestArrayList { + ArrayList arrayList =new ArrayList(); + + @Test + public void Test(){ + //add + arrayList.add("MM"); + arrayList.add(1,"YY"); + arrayList.add(2,"ZZ"); + //get + assertEquals((String)arrayList.get(0), "MM"); + assertEquals(arrayList.size(),3 ); + //remove + assertEquals(arrayList.remove(2), "ZZ"); + assertEquals(arrayList.size(),2 ); + //iterator + Iterator ito = arrayList.iterator(); + int i=0; + while(ito.hasNext()){ + assertEquals(ito.next(), arrayList.get(i)); + i++; + } + } + + +} diff --git a/group10/205301442/test/com/coding/week1/TestBiranyTreeNode.java b/group10/205301442/test/com/coding/week1/TestBiranyTreeNode.java new file mode 100644 index 0000000000..5968ebf562 --- /dev/null +++ b/group10/205301442/test/com/coding/week1/TestBiranyTreeNode.java @@ -0,0 +1,21 @@ +package com.coding.week1; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class TestBiranyTreeNode { + + @Test + public void test() { + BinaryTreeNode node = new BinaryTreeNode(5); + node.insert(2); + node.insert(7); + node.insert(1); + node.insert(6); + System.out.println(" "+node.getData()); + System.out.println(" "+node.getLeft().getData()+" "+node.getRight().getData()); + System.out.println(node.getLeft().getLeft().getData()+" null "+node.getRight().getLeft().getData()+" null"); + } + +} diff --git a/group10/205301442/test/com/coding/week1/TestLinkedList.java b/group10/205301442/test/com/coding/week1/TestLinkedList.java new file mode 100644 index 0000000000..db6524ac53 --- /dev/null +++ b/group10/205301442/test/com/coding/week1/TestLinkedList.java @@ -0,0 +1,42 @@ +package com.coding.week1; + +import static org.junit.Assert.*; + + +import org.junit.Test; + +public class TestLinkedList { + LinkedList linkedList = new LinkedList(); + + @Test + public void test() { + //add + linkedList.add("AA"); + linkedList.add(0,"BB"); + linkedList.add(1,"CC"); + linkedList.add(3,"DD"); + + assertEquals(linkedList.get(0), "BB"); + assertEquals(linkedList.get(1), "CC"); + assertEquals(linkedList.get(2), "AA"); + assertEquals(linkedList.last(), "DD"); + //add first last + linkedList.addFirst("EE"); + assertEquals(linkedList.get(0), "EE"); + linkedList.addLast("FF"); + assertEquals(linkedList.get(5), "FF"); + //remove + assertEquals(linkedList.remove(1), "BB"); + assertEquals(linkedList.removeFirst(), "EE"); + assertEquals(linkedList.removeLast(), "FF"); + //iterator + Iterator ito = linkedList.iterator(); + int i=0; + while(ito.hasNext()){ + assertEquals(linkedList.get(i), ito.next()); + i++; + } + assertEquals(i, linkedList.size()); + } + +} diff --git a/group10/205301442/test/com/coding/week1/TestQueue.java b/group10/205301442/test/com/coding/week1/TestQueue.java new file mode 100644 index 0000000000..525eaf5886 --- /dev/null +++ b/group10/205301442/test/com/coding/week1/TestQueue.java @@ -0,0 +1,17 @@ +package com.coding.week1; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class TestQueue { + + @Test + public void test() { + Queue queue = new Queue(); + queue.enQueue("MM"); + assertEquals(queue.deQueue(), "MM"); + assertEquals(queue.isEmpty(), true); + } + +} diff --git a/group10/205301442/test/com/coding/week1/TestStack.java b/group10/205301442/test/com/coding/week1/TestStack.java new file mode 100644 index 0000000000..ababf23df6 --- /dev/null +++ b/group10/205301442/test/com/coding/week1/TestStack.java @@ -0,0 +1,23 @@ +package com.coding.week1; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class TestStack { + + @Test + public void test() { + Stack stack = new Stack(); + stack.push("AA"); + stack.push("BB"); + stack.push("CC"); + stack.push("DD"); + assertEquals(stack.pop(), "DD"); + assertEquals(stack.pop(), "CC"); + assertEquals(stack.peek(), "BB"); + assertEquals(stack.size(), 2); + assertEquals(stack.isEmpty(),false); + } + +} diff --git "a/group10/205301442/\346\226\207\347\253\240\345\234\260\345\235\200.txt" "b/group10/205301442/\346\226\207\347\253\240\345\234\260\345\235\200.txt" new file mode 100644 index 0000000000..fab8d99a58 --- /dev/null +++ "b/group10/205301442/\346\226\207\347\253\240\345\234\260\345\235\200.txt" @@ -0,0 +1 @@ +first week http://blog.csdn.net/kellyfun/article/details/57504808 \ No newline at end of file diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.classpath" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.classpath" new file mode 100644 index 0000000000..fb565a588d --- /dev/null +++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.classpath" @@ -0,0 +1,6 @@ + + + + + + diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.project" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.project" new file mode 100644 index 0000000000..34d5612cf4 --- /dev/null +++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.project" @@ -0,0 +1,17 @@ + + + DataStructure_One + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.settings/org.eclipse.jdt.core.prefs" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.settings/org.eclipse.jdt.core.prefs" new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.settings/org.eclipse.jdt.core.prefs" @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/ArrayList.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/ArrayList.java" new file mode 100644 index 0000000000..1d3f5bf099 --- /dev/null +++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/ArrayList.java" @@ -0,0 +1,236 @@ +package list; + +import java.util.Arrays; +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + +public class ArrayList implements List{ + private int size ; + private Object [] elementData; + private static final Object [] EMPTY_ELEMENTDATA ={}; + private static final int DEFAULT_CAPACITY = 10; + private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + public ArrayList(){ + this.elementData = EMPTY_ELEMENTDATA; + } + public ArrayList(int limit){ + if(limit<0) + throw new IllegalArgumentException("Illegal Capacity: "+limit); + this.elementData = new Object[limit]; + } + /** + * 添加元素 + * @param o 元素 + * @return 是否成功添加 + */ + public boolean add(Object o){ + ensureCapacityInternal(size+1); + elementData[size++]=o; + return true; + } + /** + * 添加元素 + * @param index 添加位置 + * @param o 元素 + * @return 是否成功添加 + */ + public void add(int index, Object o) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); + } + ensureCapacityInternal(size + 1); + //将A数组的的a位置开始 复制至B数组的a+1位置进行覆盖--->等于将B数组a位置后面的所有元素向后移了一位。 + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + } + + /** + * 删除元素 + * @param o 元素 + * @return 是否成功删除 + */ + public boolean remove(Object o) { + if (o == null) { + for (int index = 0; index < size; index++) { + if (elementData[index] == null) { + fastRemove(index); + return true; + } + } + } else { + for (int i = 0; i < size; i++) { + if(elementData[i].equals(o)){ + fastRemove(i); + return true; + } + } + } + + return false; + } + /** + * 删除元素 + * @param index 需要删除的元素的位置 + * @return 被删除的元素 + */ + public Object remove(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + Object o =elementData[index]; + fastRemove(index); + return o; + } + + + + /** + * 查询元素 + * @param index 位置 + * @return 被查询的元素 + */ + public Object get(int index){ + if(index>=size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + return elementData[index]; + } + + + + + private void fastRemove(int index) { + //需要移动的个数 + int move = size-index-1; + System.arraycopy(elementData, index+1, elementData, index, move); + elementData[size]=null; + size--; + } + private void ensureCapacityInternal(int newLength) { + if (elementData == EMPTY_ELEMENTDATA) { + newLength = Math.max(DEFAULT_CAPACITY, newLength); + } + //如果长度超过了elementData分配的内存上限 则需要继续分配内存 + if(newLength-elementData.length>0){ + grow(newLength); + } + } + + private void grow(int newLength) { + int oldCapacity = elementData.length; + int newCapacity = (oldCapacity >> 1) + oldCapacity; + if (newCapacity - newLength < 0) { + newCapacity = newLength; + } + // int 上限:2147483648 + if (newCapacity > MAX_ARRAY_SIZE) { + newCapacity = newLength > MAX_ARRAY_SIZE ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; + } + // 扩容 + elementData = Arrays.copyOf(elementData, newLength); + } + + @Override + public void clear() { + for (int i = 0; i < size; i++) { + elementData[i]=null; + } + size=0; + } + + + @Override + public boolean contains(Object o) { + if (indexOf(o) >= 0) + return true; + return false; + } + + @Override + public int indexOf(Object o) { + if(o==null){ + for (int i = 0; i < size; i++) { + if(elementData[i]==null) + return i; + } + }else{ + for (int i = 0; i < size; i++) { + if(elementData[i].equals(o)) + return i; + } + } + return -1; + } + + @Override + public boolean isEmpty() { + return size==0; + } + + + @Override + public Object set(int index, Object o) { + if(index<0||index>=size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + Object oldO=elementData[index]; + elementData[index]=o; + return oldO; + } + @Override + public int size() { + + return size; + } + + @Override + public Iterator iterator() { + return new ArrayIterator(); + } + private class ArrayIterator implements Iterator{ + + int limit=ArrayList.this.size; + int cursor; + int lastRet = -1; + + @Override + public boolean hasNext() { + return cursor < limit; + } + + @Override + public Object next() { + int i = cursor; + if (cursor >= size) { + throw new NoSuchElementException(); + } + Object[] o = ArrayList.this.elementData; + if (cursor > o.length) + throw new ConcurrentModificationException(); + cursor = i + 1; + return o[lastRet = i]; + } + + @Override + public void remove() { + if (lastRet < 0) + throw new IllegalStateException(); + try { + ArrayList.this.remove(lastRet); + cursor = lastRet; + lastRet = -1; + limit--; + } catch (IndexOutOfBoundsException ex) { + throw new ConcurrentModificationException(); + } + } + + } + + + + + + + + +} diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/Iterator.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/Iterator.java" new file mode 100644 index 0000000000..142fc4bafe --- /dev/null +++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/Iterator.java" @@ -0,0 +1,20 @@ +package list; + +public interface Iterator { + /** + * 是否有第一个值 + * @return + */ + boolean hasNext(); + + /** + * 获取下一个值 + * @return + */ + Object next(); + + /** + * 删除 + */ + void remove(); +} diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/LinkedList.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/LinkedList.java" new file mode 100644 index 0000000000..c311e183c8 --- /dev/null +++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/LinkedList.java" @@ -0,0 +1,211 @@ +package list; + +public class LinkedList implements List { + + public Node getFirst() { + return first; + } + + public Node getLast() { + return last; + } + + private int size; + private Node first; + private Node last; + + @Override + public void add(int paramInt, Object paramE) { + checkPositionIndex(paramInt); + if (paramInt == size) { + linkLast(paramE); + } else { + linkBefore(paramE, node(paramInt)); + } + + } + + // 寻找到需要插入的那个node + Node node(int paramInt) { + if (paramInt < size >> 1) { + Node x = first; + for (int i = 0; i < paramInt; i++) { + x = x.next; + } + return x; + } else { + Node x = last; + for (int i = size - 1; i > paramInt; i--) { + x = x.prev; + } + return x; + } + } + + private void linkBefore(Object o, Node node) { + Node pred = node.prev; + Node newNode = new Node(pred, o, node); + node.prev = newNode; + if (pred == null) { + first = newNode; + } else { + pred.next = newNode; + } + + } + + private void checkPositionIndex(int paramInt) { + if (paramInt < 0 || paramInt > size) { + throw new IndexOutOfBoundsException("Index: " + paramInt + ", Size: " + size); + } + } + + @Override + public boolean add(Object paramE) { + linkLast(paramE); + return true; + } + + private void linkLast(Object paramE) { + Node l = last; + Node newNode = new Node(l, paramE, null); + last = newNode; + if (l == null) { + first = newNode; + } else { + l.next = newNode; + } + size++; + } + + @Override + public void clear() { + for (Node x = first; x != null;) { + Node next = x.next; + x.next = null; + x.prev = null; + x.item = null; + x = next; + } + first = last = null; + size = 0; + } + + @Override + public boolean contains(Object paramObject) { + return false; + } + + @Override + public Object get(int paramInt) { + checkPositionIndex(paramInt); + return node(paramInt).item; + } + + @Override + public int indexOf(Object paramObject) { + return 0; + } + + @Override + public boolean isEmpty() { + return size == 0 ? true : false; + } + + @Override + public Iterator iterator() { + return new LinkedIterator(); + } + + @Override + public Object remove(int paramInt) { + checkPositionIndex(paramInt); + return unlink(node(paramInt)); + } + + private Object unlink(Node node) { + Object item = node.item; + Node prev = node.prev; + Node next = node.next; + if (prev == null) { + first = next; + } else { + prev.next = next; + node.prev = null; + } + if (next == null) { + last = prev; + } else { + next.prev = prev; + node.next = null; + } + node.item = null; + size--; + + return item; + + } + + @Override + public boolean remove(Object paramObject) { + return false; + } + + @Override + public Object set(int paramInt, Object paramE) { + return null; + } + + @Override + public int size() { + return size; + } + + public static class Node { + public Object item; + public Node next; + public Node prev; + + public Node(Node prev, Object item, Node next) { + this.item = item; + this.next = next; + this.prev = prev; + } + + } + + private class LinkedIterator implements Iterator { + + int cursor = 0; + int lastRet = -1; + + @Override + public boolean hasNext() { + return cursor < size(); + } + + @Override + public Object next() { + int i = cursor; + Object node = get(i); + lastRet = i; + cursor = i + 1; + return node; + } + + @Override + public void remove() { + if (lastRet < 0) { + throw new IllegalStateException(); + } + LinkedList.this.remove(lastRet); + if (lastRet < cursor) { + cursor--; + } + lastRet = -1;// 防止对一个数据多次remove操作 + + } + + } + +} diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/List.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/List.java" new file mode 100644 index 0000000000..05b2c99294 --- /dev/null +++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/List.java" @@ -0,0 +1,32 @@ +package list; + + +public interface List{ + + public abstract void add(int paramInt, Object paramE); + + public abstract boolean add(Object paramE); + + public abstract void clear(); + + public abstract boolean contains(Object paramObject); + + public abstract boolean equals(Object paramObject); + + public abstract Object get(int paramInt); + + public abstract int indexOf(Object paramObject); + + public abstract boolean isEmpty(); + + public abstract Iterator iterator(); + + public abstract Object remove(int paramInt); + + public abstract boolean remove(Object paramObject); + + public abstract Object set(int paramInt, Object paramE); + + public abstract int size(); + +} diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/queue/ListQueue.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/queue/ListQueue.java" new file mode 100644 index 0000000000..80c52f2d53 --- /dev/null +++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/queue/ListQueue.java" @@ -0,0 +1,56 @@ +package queue; + +import list.LinkedList; + +public class ListQueue { + + LinkedList list; + + public ListQueue() { + list = new LinkedList(); + } + + public int size() { + return list.size(); + } + + public boolean isEmpty() { + return list.size() == 0 ? true : false; + } + + public boolean remove(Object o) { + return list.remove(o); + } + + public void clear() { + list.clear(); + } + + public boolean add(Object e) { + return list.add(e); + } + + public boolean offer(Object e) { + return false; + } + + public Object poll() { + if (list.size() == 0) { + return null; + }else{ + Object item = list.getFirst().item; + list.remove(0); + return item; + } + } + + + public Object peek() { + if (list.size() == 0) { + return null; + }else{ + return list.getFirst().item; + } + } + +} diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/stack/Stack.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/stack/Stack.java" new file mode 100644 index 0000000000..4bbffc1e0f --- /dev/null +++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/stack/Stack.java" @@ -0,0 +1,31 @@ +package stack; + +import java.util.NoSuchElementException; + +import list.ArrayList; +import list.List; + +public class Stack { + + List list ; + public Stack(){ + list = new ArrayList(); + } + + public void push(Object o) { + list.add(o); + } + public Object poll(){ + Object remove = list.remove(list.size()-1); + if(remove==null) + throw new NoSuchElementException(); + return remove; + } + + public Object peak(){ + if(list.size()==0) + throw new NoSuchElementException(); + return list.get(list.size()-1); + } + +} diff --git "a/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/tree/BinaryTree.java" "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/tree/BinaryTree.java" new file mode 100644 index 0000000000..420e131537 --- /dev/null +++ "b/group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/tree/BinaryTree.java" @@ -0,0 +1,74 @@ +package tree; + +public class BinaryTree { + private TreeNode parent; + + public BinaryTree(){ + parent = new TreeNode(null,null,null); + } + + public void insert(Object o ){ + TreeNode node = new TreeNode(null,o,null); + if(parent.item==null){ + parent= node; + return; + } + insertNode(parent,node); + } + + private void insertNode(TreeNode parentNode, TreeNode newNode) { + if(parentNode.compareTo(newNode)<= 0){ + if(parentNode.right==null){ + parentNode.right = newNode; + }else{ + insertNode(parentNode.right,newNode); + } + + }else{ + if(parentNode.left==null){ + parentNode.left=newNode; + }else{ + insertNode(parentNode.left, newNode); + } + } + } + + public void printTree(){ + printNode(this.parent); + } + + + + + private void printNode(TreeNode node) { + if (node == null) { + System.out.println("node :" + node.item); + printNode(node.left); + printNode(node.right); + } + + } + + + + + class TreeNode implements Comparable{ + Object item; + TreeNode left; + TreeNode right; + TreeNode(TreeNode left,Object item,TreeNode right){ + this.item=item; + this.left =left; + this.right=right; + } + + @Override + public int compareTo(TreeNode o) { + Integer parentItem = (Integer) this.item; + Integer oItem = (Integer) o.item; + + return parentItem.compareTo(oItem); + } + } + +} diff --git a/group10/3314793852/.classpath b/group10/3314793852/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group10/3314793852/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group10/3314793852/.gitignore b/group10/3314793852/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group10/3314793852/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group10/3314793852/.project b/group10/3314793852/.project new file mode 100644 index 0000000000..e09255853a --- /dev/null +++ b/group10/3314793852/.project @@ -0,0 +1,17 @@ + + + FirstWeek + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group10/3314793852/second/.classpath b/group10/3314793852/second/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group10/3314793852/second/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group10/3314793852/second/.gitignore b/group10/3314793852/second/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group10/3314793852/second/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group10/3314793852/second/.project b/group10/3314793852/second/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group10/3314793852/second/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group10/3314793852/second/.settings/org.eclipse.core.resources.prefs b/group10/3314793852/second/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..5855257b83 --- /dev/null +++ b/group10/3314793852/second/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/com/coderising/litestruts=UTF-8 +encoding//src/com/coderising/litestruts/Struts.java=UTF-8 +encoding/=UTF-8 diff --git a/group10/3314793852/second/.settings/org.eclipse.jdt.core.prefs b/group10/3314793852/second/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group10/3314793852/second/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group10/3314793852/second/src/com/coderising/array/ArrayUtil.java b/group10/3314793852/second/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..5742ea09f9 --- /dev/null +++ b/group10/3314793852/second/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,236 @@ + + package com.coderising.array; + + import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int size=origin.length-1; + int[] arr=new int[origin.length]; + for(int i=0;iarray1[j]&&array1[i]!=0&&array1[j]!=0){ + int temp; + temp=array1[i]; + array1[i]=array1[j]; + array1[j]=temp; + } + if(array1[i]==array1[j]&&array1[i]!=0&&array1[j]!=0){ + array1[j]=0; + } + } + } + + System.out.println(Arrays.toString(array1)); + + int[] array3=removeZero(array1); //除零操作。 + return array3; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArr=new int[oldArray.length+size]; + for(int i=0;i2){ + arr[0]=1; + arr[1]=1; + while(second aMap=new HashMap(); //一个用来存储。 + + private ArrayList> list=new ArrayList>();; //List集合用来保存Map集合。 + + private String currentTag; + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) + throws SAXException { + currentTag =qName; + + if("action".equals(currentTag)){ + key=attributes.getValue(0); //action的name属性。 + value=attributes.getValue(1); //action的class属性。 + + //在将属性成对的保存到一个Map集合中。 + aMap.put(key, value); + + //保存后将中间变量变为null. + key=null; + value=null; + } + + if("result".equals(currentTag)){ + key=attributes.getValue(0); //result的name属性。 + } + + } + + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + if("result".equals(currentTag)){ + String name=new String(ch,start,length); + value=name; + //将属性成对的保存到一个Map集合中。 + + aMap.put(key, value); + + //保存后将中间变量清空。 + key=null; + value=null; + currentTag=null; + } + + } + + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if("action".equals(qName)){ + + list.add(aMap); + + + aMap=new HashMap(); + + + } + + } + + //返回list集合。 + public ArrayList> getDate(){ + return list; + } + } diff --git a/group10/3314793852/second/src/com/coderising/litestruts/LoginAction.java b/group10/3314793852/second/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group10/3314793852/second/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group10/3314793852/second/src/com/coderising/litestruts/SAXGetInfo.java b/group10/3314793852/second/src/com/coderising/litestruts/SAXGetInfo.java new file mode 100644 index 0000000000..52dd35961d --- /dev/null +++ b/group10/3314793852/second/src/com/coderising/litestruts/SAXGetInfo.java @@ -0,0 +1,42 @@ + /* + *该类用于读取struts.xml文件中的数据,并把它存储到ActionType类的对象中去。 + */ + package com.coderising.litestruts; + + import java.io.File; + import java.io.FileInputStream; + import java.io.IOException; + import java.io.InputStream; + import java.util.ArrayList; + import java.util.HashMap; + + import javax.xml.parsers.ParserConfigurationException; + import javax.xml.parsers.SAXParser; + import javax.xml.parsers.SAXParserFactory; + + import org.xml.sax.InputSource; + import org.xml.sax.SAXException; + import org.xml.sax.XMLReader; + + + + public class SAXGetInfo { + + public ArrayList> getDate() throws SAXException, IOException, ParserConfigurationException{ + //创建解析工厂 + SAXParserFactory factory=SAXParserFactory.newInstance(); + + //创建解析器 + SAXParser parser=factory.newSAXParser(); + + //文件地址 + String fileName="E:/CODING2017/Code/coding2017/group10/3314793852/second/src/com/coderising/litestruts/struts.xml"; + //设置内容处理器 + DealWithInfo handler=new DealWithInfo(); + parser.parse(fileName, handler); + + ArrayList> list=handler.getDate(); + return list; //将保存在list集合中的配置信息返回。 + } + + } diff --git a/group10/3314793852/second/src/com/coderising/litestruts/Struts.java b/group10/3314793852/second/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..5312535300 --- /dev/null +++ b/group10/3314793852/second/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,165 @@ + + package com.coderising.litestruts; + + import java.io.IOException; + import java.util.ArrayList; + import java.util.HashMap; + import java.util.Iterator; + import java.util.Map; + + import javax.xml.parsers.ParserConfigurationException; + + import org.xml.sax.SAXException; + + import java.lang.reflect.InvocationTargetException; + import java.lang.reflect.Method; + + + + public class Struts { + + public static View runAction(String actionName, Map parameters) { + View view=new View(); + + String execute=null; //execute返回值。 + String placeOfJsp=null; //JSP地址。 + String classname=getClassName(actionName); + + Class classAction = null; + Object obj=null; + try { + classAction=Class.forName(classname); //根据类名反射实例化class类。 + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + //ClassAction类使用newInstance();方法调用LoginAction类的默认构造方法创建LoginAction类。 + try { + obj=classAction.newInstance(); //Object类型的对象。 + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + //调用对象的setter方法,设置用户名和密码,即把name和password的值设置到当前LoginAction的对象中。 + try { + setter(obj,"name",parameters.get("name"),String.class); + setter(obj,"password",parameters.get("password"),String.class); + } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) { + e.printStackTrace(); + } + + //调用对象的exectue方法。 + try{ + Method method=classAction.getMethod("execute"); + execute=(String) method.invoke(obj); + }catch(Exception e){ + e.printStackTrace(); + } + + //调用对象的所有getter方法,把值设置到view对象的parameters属性中。 + Map para=new HashMap(); + try{ + para.put("name", getter(obj,"name")); + para.put("password", getter(obj,"password")); + para.put("message", getter(obj,"message")); + }catch(Exception e){ + e.printStackTrace(); + } + view.setParameters(para); + + //根据execute返回值和配置,将JSP地址赋值给View对象的jsp成员中。 + placeOfJsp=getResultName(actionName,execute); + view.setJsp(placeOfJsp); + + //System.out.println(view.getJsp()+" "+view.getParameters()); + return view; + } + + + /* + * 第一个参数为操作对象,第二个参数为操作的数据的数据成员,第三个参数为set的值,第四个参数为参数的类型 + */ + private static void setter(Object obj, String att, Object value, Class type) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + //实例化一个set方法 + Method method=obj.getClass().getMethod("set"+initStr(att), type); + method.invoke(obj, value); + } + + /* + * getter方法 + */ + private static String getter(Object obj,String att) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ + Method method=obj.getClass().getMethod("get"+initStr(att)); + method.invoke(obj); + return (String) method.invoke(obj); + } + + /* + * 根据java的命名规则,数据成员的第一个单词都要小写,其他单词的首字母大写。 + * 所以把set和get方法后面的单词的首字母大写,如setName中的N + * 和getName中的N. + */ + private static String initStr(String old) { + String str=old.substring(0,1).toUpperCase()+old.substring(1); + //把首字母大写。 + return str; + } + + public static void main(String args[]){ + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + runAction(actionName,params); + } + + //查找action类,查找result时,必须要通过查找action才行。 + private static String getClassName(String actionName){ + String className=getData(actionName).get(actionName); + + return className; + } + + //查找result时,必须要通过查找action才行。 + private static String getResultName(String actionName,String result){ + String placeOfJsp=getData(actionName).get(result); + + return placeOfJsp; + } + + //从配置信息中获取数据,获取 + private static HashMap getData(String actionName) { + SAXGetInfo a=new SAXGetInfo(); + ArrayList> x; + HashMap y=null; + Object[] arr=new Object[10]; + int size=0; + + try { + x = a.getDate(); + Iterator it=x.iterator(); + while(it.hasNext()){ + arr[size]=(Object)it.next(); + size++; + + } + } catch (SAXException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } + if(actionName.equals("login")){ + y=(HashMap) arr[0]; + } + if(actionName.equals("logout")){ + y=(HashMap) arr[1]; + } + return y; + } + + } diff --git a/group10/3314793852/second/src/com/coderising/litestruts/StrutsTest.java b/group10/3314793852/second/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group10/3314793852/second/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group10/3314793852/second/src/com/coderising/litestruts/View.java b/group10/3314793852/second/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group10/3314793852/second/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group10/3314793852/second/src/com/coderising/litestruts/struts.out.xml b/group10/3314793852/second/src/com/coderising/litestruts/struts.out.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group10/3314793852/second/src/com/coderising/litestruts/struts.xml b/group10/3314793852/second/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group10/3314793852/second/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group10/3314793852/src/myList/MyArrayList.java b/group10/3314793852/src/myList/MyArrayList.java new file mode 100644 index 0000000000..7b5a883190 --- /dev/null +++ b/group10/3314793852/src/myList/MyArrayList.java @@ -0,0 +1,103 @@ +package myList; + +/* + * ArrayListĵײһ飬ͨ´ķ̬ + * ArrayListղݡ + */ + +public class MyArrayList { + private int theSize; //ǰС + private static final int DEFAULT_CAPACITY=10; //Ĭ + private Object[] theArr=new Object[10]; //ײ + + //ʼ + public MyArrayList(){ + clear(); + } + + // + public void clear(){ + theSize=0; + capacityBigger(DEFAULT_CAPACITY); + } + + //ȡС + public int size(){ + return theSize; + } + + //ȡײ + public Object[] getArr(){ + return theArr; + + } + //룬ֱӲ뵽β + public void add(Object a){ + add(theSize, a); + } + + //±ȡ + public Object get(int i){ + if(i<0||i>=theSize){ + throw new ArrayIndexOutOfBoundsException(); + } + return theArr[i]; + } + + //룬ָ±롣 + public void add(int i,Object a){ + + if(theSize==theArr.length){ //ʼΪ10ÿɹһʱsize+1,sizeĴСͬʱ󷽷̬ĴС + capacityBigger(size()); + } + for(int j=theSize-1;j>=i;j--){ + theArr[j+1]=theArr[j]; + } + theArr[i]=a; + + theSize++; + } + + //ɾ,±ɾݡ + public void remove(int i){ + + for(int j=i;j0){ + return contains(x,aNode.left); + } + else if(comparaResult<0){//ݴڵǰڵʱӦڵǰڵҺӽڵС + return contains(x,aNode.right); + } + else{ //ݵڵǰڵʱӦڵǰڵС + return true; + } + } + + //ݡ + public void insert(Object x){ + root=insert(x,root); + } + + public BinaryNode insert(Object x,BinaryNode aNode){ + + if(aNode==null){//ǰΪµݽڵ㣬ΪҶӽڵ㣬ҽڵΪnull. + return new BinaryNode(x,null,null); + } + + //͵ǰĽڵбȽϡ + Integer comparaResult=(Integer)aNode.element-(Integer)x; + + //СڵǰڵʱӦڵǰڵӽڵС + if(comparaResult>0){ + aNode.left= insert(x,aNode.left); + } + else if(comparaResult<0){//ݴڵǰڵʱӦڵǰڵҺӽڵС + aNode.right=insert(x,aNode.right); + } + else{ //ݵڵǰڵʱӦڵǰڵ,κβ + ; + } + return aNode; + } + + //ӡ + public void getData(){ + getData(root); + } + public void getData(BinaryNode root){ + if (root != null) { + // + this.getData(root.left); + + //Һ + this.getData(root.right); + //ڵ + this.print(root); + } + + } + + //ӡڵ㡣 + public void print(BinaryNode root){ + System.out.println( + (Integer)(root.element) + ); + } + } diff --git a/group10/3314793852/src/myList/MyIterator.java b/group10/3314793852/src/myList/MyIterator.java new file mode 100644 index 0000000000..8c97809af8 --- /dev/null +++ b/group10/3314793852/src/myList/MyIterator.java @@ -0,0 +1,40 @@ + + package myList; + + public class MyIterator { + + private Object aData; + private int i=0; + private int l=0; + MyLinkedList.Node node; + public MyIterator(Object aDate){ + this.aData=aDate; + } + + public boolean hasNext(){ + if(aData instanceof MyArrayList){//MyArrayListIterator + + Object[] arr=((MyArrayList) aData).getArr(); + int a=((MyArrayList)aData).size(); + return a>i; + } + else{//MyLinkedListIterator + node=((MyLinkedList)aData).getHeadNode();//ͷڵ + int a=((MyLinkedList)aData).size(); + return a>l; + } + + + } + public Object next(){ + if(aData instanceof MyArrayList){//MyArrayListIterator + + Object[] arr=((MyArrayList) aData).getArr(); + return arr[++i]; + } + else{//MyLinkedListIterator + l++; + return node.getDate(); + } + } + } diff --git a/group10/3314793852/src/myList/MyLinkedList.java b/group10/3314793852/src/myList/MyLinkedList.java new file mode 100644 index 0000000000..0bad8c8953 --- /dev/null +++ b/group10/3314793852/src/myList/MyLinkedList.java @@ -0,0 +1,122 @@ + package myList; + + /* + * õͷڵġ + */ + + public class MyLinkedList { + + private int theSize; //ĴС + private Node headNode; //ͷڵ + + //ڵࡣ + public static class Node{ + + private Object data; + private Node node; + + public Node(){ + + } + + public Node(Object data, Node node) { + this.data = data; + this.node = node; + } + public Object getDate(){ + return data; + } + + } + + //췽ʼʱһͷڵĿյ + public MyLinkedList(){ + clear(); + } + + //ͷڵ + public Node getHeadNode(){ + return headNode; + } + + // + public void clear(){ + headNode=new Node(null,null); //ͷʼdateָnodeȫΪnull. + theSize=0; //ĴС + } + + //ȡĴС + public int size(){ + return theSize; + } + + //ӽڵ㵽β + public void add(Object aData){ + add(theSize+1,aData); + } + + //ӽڵ㵽ָλá + public void add(int idx,Object aDate){ + + //һµĽڵ + Node newNode=new Node(); + newNode.data=aDate; + + //ҵָλõĽڵ㣬½ڵ嵽ָλýڵǰһλá + Node p,q; + p=headNode; + + for(int i=1;i(arr.length-1)){//tailѾβʱͷΪʱµ뵽ͷ + tail=0; + } + theSize++; + } + } + + //pop,С + public Object pop(){ + Object a=null; + if(theSize!=0){ //ΪգܽгеIJ + a=arr[head]; + arr[head]=null; + head++; + if(head>(arr.length-1)){ + head=0; + } + theSize--; + } + return a; + } + + //ӡС + public void print(){ + for(int i=0;i + + + + + + + diff --git a/group10/353261578/.gitignore b/group10/353261578/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group10/353261578/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group10/353261578/.project b/group10/353261578/.project new file mode 100644 index 0000000000..a8fa85d33a --- /dev/null +++ b/group10/353261578/.project @@ -0,0 +1,17 @@ + + + 353261578Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group10/353261578/src/com/sx/structures/BinaryNode.java b/group10/353261578/src/com/sx/structures/BinaryNode.java new file mode 100644 index 0000000000..d324a641d9 --- /dev/null +++ b/group10/353261578/src/com/sx/structures/BinaryNode.java @@ -0,0 +1,44 @@ +package com.sx.structures; + +public class BinaryNode implements Comparable{ + private Object data; + private BinaryNode left; + private BinaryNode right; + + public BinaryNode() { + } + public BinaryNode(Object o){ + data = o; + left = null; + right = null; + } + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryNode getLeft() { + return left; + } + public void setLeft(BinaryNode left) { + this.left = left; + } + public BinaryNode getRight() { + return right; + } + public void setRight(BinaryNode right) { + this.right = right; + } + @Override + public int compareTo(BinaryNode o) { + Integer to = (Integer)this.data; + Integer co = (Integer)o.data; + if(toco) + return 1; + return 0; + } +} diff --git a/group10/353261578/src/com/sx/structures/BinaryTree.java b/group10/353261578/src/com/sx/structures/BinaryTree.java new file mode 100644 index 0000000000..390aeab209 --- /dev/null +++ b/group10/353261578/src/com/sx/structures/BinaryTree.java @@ -0,0 +1,74 @@ +package com.sx.structures; + +public class BinaryTree { + + private BinaryNode root; + + public BinaryTree(Object o) { + root = new BinaryNode(o); + } + + public void insert(Object o) { + BinaryNode node = new BinaryNode(o); + insert(root, node); + } + + private void insert(BinaryNode root, BinaryNode node) { + if (node.compareTo(root) > 0) { + if (root.getRight() == null) { + root.setRight(node); + return; + } + insert(root.getRight(), node); + } else { + if (root.getLeft() == null) { + root.setLeft(node); + return; + } + insert(root.getLeft(), node); + } + + } + + public void preOrder(BinaryNode root){ + order(root); + if(root.getLeft()!=null) + preOrder(root.getLeft()); + if(root.getRight()!=null) + preOrder(root.getRight()); + } + + public void postOrder(BinaryNode root){ + if(root.getLeft()!=null) + postOrder(root.getLeft()); + if(root.getRight()!=null) + postOrder(root.getRight()); + order(root); + } + + public void inOrder(BinaryNode root){ + if(root.getLeft()!=null) + inOrder(root.getLeft()); + order(root); + if(root.getRight()!=null) + inOrder(root.getRight()); + } + + /** + * 未实现 + * @param root + * @param node + * @return + */ + private boolean remove(BinaryNode root, BinaryNode node){ + return false; + } + + public BinaryNode getRoot(){ + return root; + } + + private void order(BinaryNode root){ + System.out.print(root.getData()+" "); + } +} diff --git a/group10/353261578/src/com/sx/structures/Iterator.java b/group10/353261578/src/com/sx/structures/Iterator.java new file mode 100644 index 0000000000..16f2482a23 --- /dev/null +++ b/group10/353261578/src/com/sx/structures/Iterator.java @@ -0,0 +1,6 @@ +package com.sx.structures; + +public interface Iterator { + boolean hasNext(); + Object next(); +} diff --git a/group10/353261578/src/com/sx/structures/MyArrayList.java b/group10/353261578/src/com/sx/structures/MyArrayList.java new file mode 100644 index 0000000000..7f872a7d43 --- /dev/null +++ b/group10/353261578/src/com/sx/structures/MyArrayList.java @@ -0,0 +1,83 @@ +package com.sx.structures; + +public class MyArrayList implements MyList { + + private int size; + private int ex=10; + private int last=-1; + private Object [] arr; + + public MyArrayList() { + size = 10; + arr = new Object[size]; + } + + @Override + public void add(Object o) { + last++; + if(last==size){ + size += ex; + Object[] temp = new Object[size]; + System.arraycopy(arr, 0, temp, 0, arr.length); + arr = temp; + } + arr[last]=o; + } + + @Override + public void add(int index, Object o) { + add(o); + for(int i=arr.length-1;i>index;i--) + arr[i]=arr[i-1]; + arr[index]=o; + } + + @Override + public Object get(int index) { + return arr[index]; + } + + @Override + public Object remove(int index) { + Object element = arr[index]; + for(int i=index;ilist.size()) + return false; + return true; + } + + @Override + public Object next() { + if(hasNext()) + return list.get(p-1); + return -1; + } + + } + +} diff --git a/group10/353261578/src/com/sx/structures/MyLinkedList.java b/group10/353261578/src/com/sx/structures/MyLinkedList.java new file mode 100644 index 0000000000..2b3629c1fc --- /dev/null +++ b/group10/353261578/src/com/sx/structures/MyLinkedList.java @@ -0,0 +1,105 @@ +package com.sx.structures; + +public class MyLinkedList implements MyList{ + private Node head; + private int size = 0; + + public MyLinkedList() { + head = new Node(); + } + @Override + public void add(Object o) { + Node node = createNode(o); + Node pre = head; + while(pre.next!=null){ + pre = pre.next; + } + pre.next = node; + size++; + } + + @Override + public void add(int index, Object o) { + if(index < 0){ + System.out.println("����Խ��");return; + } + Node node = createNode(o); + Node pointer = head; + while(index>0){ + pointer = pointer.next; + index--; + } + node.next = pointer.next; + pointer.next = node; + size++; + } + + @Override + public Object get(int index) { + Node pointer = head; + while(index>=0){ + pointer = pointer.next; + index--; + } + return pointer.data; + } + + @Override + public Object remove(int index) { + Object data = null; + Node pre = head; + while(index>0){ + pre = pre.next; + index--; + } + data = pre.next.data; + pre.next = pre.next.next; + size--; + return data; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object o){ + add(0, o); + } + public void addLast(Object o){ +// Node node = createNode(o); +// Node p = head; +// while(p.next!=null) +// p = p.next; +// p.next = node; +// size++; + add(o); + } + public Object removeFirst(){ + return remove(0); + } + public Object removeLast(){ + Object data = null; + Node re = head; + Node pre = head; + while(re.next!=null){ + re = re.next; + pre = re; + } + data = re.data; + re=null; + pre.next = null; + size--; + return data; + } + private Node createNode(Object o){ + Node node = new Node(); + node.data=o; + return node; + } + private static class Node{ + Object data = null; + Node next = null; + } + +} diff --git a/group10/353261578/src/com/sx/structures/MyList.java b/group10/353261578/src/com/sx/structures/MyList.java new file mode 100644 index 0000000000..95e42afc33 --- /dev/null +++ b/group10/353261578/src/com/sx/structures/MyList.java @@ -0,0 +1,13 @@ +package com.sx.structures; + +public interface MyList { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group10/353261578/src/com/sx/structures/MyQueue.java b/group10/353261578/src/com/sx/structures/MyQueue.java new file mode 100644 index 0000000000..9d0bb83b31 --- /dev/null +++ b/group10/353261578/src/com/sx/structures/MyQueue.java @@ -0,0 +1,25 @@ +package com.sx.structures; + +public class MyQueue { + private MyLinkedList elements ; + public MyQueue() { + elements = new MyLinkedList(); + } + + public void enQueue(Object o){ + elements.add(o); + } + + public Object deQueue(){ + return elements.removeFirst(); + } + + public boolean isEmpty(){ + if(size()>0) + return false; + return true; + } + public int size(){ + return elements.size(); + } +} diff --git a/group10/353261578/src/com/sx/structures/MyStack.java b/group10/353261578/src/com/sx/structures/MyStack.java new file mode 100644 index 0000000000..3b83969b79 --- /dev/null +++ b/group10/353261578/src/com/sx/structures/MyStack.java @@ -0,0 +1,37 @@ +package com.sx.structures; + +public class MyStack { + private int pointer; + private MyArrayList element; + public MyStack() { + element = new MyArrayList(); + pointer = -1; + } + + public void push(Object o){ + pointer++; + element.add(pointer); + } + public Object pop(){ + if(pointer<0) + return -1; + Object p = element.get(pointer); + pointer--; + return p; + } + /** + *只返回栈顶元素 + * @return + */ + public Object peek(){ + if(pointer<0) + return -1; + return element.get(pointer); + } + public boolean isEmpty(){ + if(pointer<0) + return true; + return false; + } + +} diff --git a/group10/353261578/test/com/test/BinaryTreeTest.java b/group10/353261578/test/com/test/BinaryTreeTest.java new file mode 100644 index 0000000000..308bc92787 --- /dev/null +++ b/group10/353261578/test/com/test/BinaryTreeTest.java @@ -0,0 +1,31 @@ +package com.test; + + +import org.junit.Test; + +import com.sx.structures.BinaryTree; + +public class BinaryTreeTest { + + private BinaryTree bt; + + @Test + public void test() { + bt = new BinaryTree(55); + bt.insert(23); + bt.insert(44); + bt.insert(16); + bt.insert(78); + bt.insert(99); + //先序 + System.out.println("先序遍历:"); + bt.preOrder(bt.getRoot()); + //中序遍历 + System.out.println("\n中序遍历:"); + bt.inOrder(bt.getRoot()); + //后序 + System.out.println("\n后序遍历:"); + bt.postOrder(bt.getRoot()); + } + +} diff --git a/group10/353261578/test/com/test/MyArrayListTest.java b/group10/353261578/test/com/test/MyArrayListTest.java new file mode 100644 index 0000000000..106c294448 --- /dev/null +++ b/group10/353261578/test/com/test/MyArrayListTest.java @@ -0,0 +1,64 @@ +package com.test; + + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.sx.structures.MyArrayList; +import com.sx.structures.MyList; + +public class MyArrayListTest { + + private MyArrayList list ; + + @Test + public void testAddObject() { + for(int j=0;j<12;j++){ + list.add(j); + } + } + + @Test + public void testAddIntObject() { + list.add(5, 12); + list.add(10, 11); + } + + @Test + public void testGet() { + System.out.println(list.get(5)); + } + + @Test + public void testRemove() { + System.out.println("\nremoved 5:"+list.remove(5)+"."); + } + + @Test + public void testSize() { + System.out.println("\nlist.size:"+list.size()); + } + + @After + public void Print(){ + System.out.println("最终结果:List:"); + PrintList(list); + } + @Before + public void createlist(){ + list = new MyArrayList(); + for(int j=0;j<12;j++){ + list.add(j); + } + System.out.println("初始list:"); + PrintList(list); + } + + public static void PrintList(MyList list){ + for (int i = 0; i < list.size(); i++) { + System.out.print(list.get(i)+" "); + } + } + +} diff --git a/group10/353261578/test/com/test/MyLinkedListTest.java b/group10/353261578/test/com/test/MyLinkedListTest.java new file mode 100644 index 0000000000..353352e927 --- /dev/null +++ b/group10/353261578/test/com/test/MyLinkedListTest.java @@ -0,0 +1,83 @@ +package com.test; + + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.sx.structures.MyLinkedList; +import com.sx.structures.MyList; + +public class MyLinkedListTest { + + private MyLinkedList list; + + @Test + public void testAddObject() { + list.add(3); + } + + @Test + public void testAddIntObject() { + list.add(0,"t-0"); + list.add(1, "t-1"); + } + + @Test + public void testGet() { + System.out.println(list.get(1)); + } + + @Test + public void testRemove() { + list.remove(0); + } + + @Test + public void testSize() { + System.out.println(); + System.out.println(" list-size="+list.size()); + } + + @Test + public void testAddFirst() { + list.addFirst("t-1"); + } + + @Test + public void testAddLast() { + list.addLast("T-last"); + } + + @Test + public void testRemoveFirst() { + list.removeFirst(); + } + + @Test + public void testRemoveLast() { + list.removeLast(); + } + + @After + public void Print(){ + System.out.println("\n操作之后,List:"); + PrintList(list); + } + @Before + public void createlist(){ + list = new MyLinkedList(); + for(int j=0;j<11;j++){ + list.add(j); + } + System.out.println("初始list:"); + PrintList(list); + } + + public static void PrintList(MyList list){ + for (int i = 0; i < list.size(); i++) { + System.out.print(list.get(i)+" "); + } + } + +} diff --git a/group10/353261578/test/com/test/StaQueTest.java b/group10/353261578/test/com/test/StaQueTest.java new file mode 100644 index 0000000000..6d7f836c47 --- /dev/null +++ b/group10/353261578/test/com/test/StaQueTest.java @@ -0,0 +1,44 @@ +package com.test; + + +import org.junit.Test; + +import com.sx.structures.MyQueue; +import com.sx.structures.MyStack; + +public class StaQueTest { + private MyStack s; + private MyQueue queue; + + @Test + public void Stacktest() { + + s = new MyStack(); + + for(int i=0;i<10;i++){ + s.push(i); + } + System.out.println("\npop:"); + while(s.isEmpty()==false){ + System.out.println("-"+s.isEmpty()+":"+s.pop()); + } + + System.out.println("\n"+"-"+s.isEmpty()+":"+s.pop()); + + System.out.println("\npeek"); + for(int i=1;i<3;i++){ + System.out.print(s.peek()+" "); + } + } + + @Test + public void queueTest(){ + queue = new MyQueue(); + for(int i=0;i<10;i++) + queue.enQueue(i); + while(queue.size()>0) + System.out.print(queue.deQueue()+" "); + } + + +} diff --git a/group10/364298692/article.md b/group10/364298692/article.md new file mode 100644 index 0000000000..01af1f5151 --- /dev/null +++ b/group10/364298692/article.md @@ -0,0 +1,3 @@ +# ÿ +## week01 + diff --git a/group10/364298692/cs/.classpath b/group10/364298692/cs/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group10/364298692/cs/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group10/364298692/cs/.gitignore b/group10/364298692/cs/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group10/364298692/cs/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group10/364298692/cs/.project b/group10/364298692/cs/.project new file mode 100644 index 0000000000..8536996016 --- /dev/null +++ b/group10/364298692/cs/.project @@ -0,0 +1,17 @@ + + + cs + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group10/364298692/cs/.settings/org.eclipse.jdt.core.prefs b/group10/364298692/cs/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group10/364298692/cs/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group10/364298692/cs/src/com/coding/basic/ArrayList.java b/group10/364298692/cs/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..71761666aa --- /dev/null +++ b/group10/364298692/cs/src/com/coding/basic/ArrayList.java @@ -0,0 +1,75 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List{ + + private int size = 0; + + private Object[] elementData; + + public ArrayList(int initialCapacity){ + elementData = new Object[initialCapacity]; + } + + public ArrayList(){ + elementData = new Object[10]; + } + + public void ensureCapacity(int minCapacity){ + int oldCapacity = elementData.length; + if(minCapacity > oldCapacity){ + Object[] oldData = elementData; + int newCapacity = (oldCapacity * 3) / 2 + 1; + if(minCapacity > newCapacity){ + newCapacity = minCapacity; + } + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + public void add(Object o){ + ensureCapacity(size + 1); + elementData[size] = o; + size++; + } + public void add(int index, Object o){ + ensureCapacity(size + 1); + for(int i = size-1; i >= index; i--){ + elementData[i+1] = elementData[i]; + } + elementData[index] = o; + size++; + } + + public Object get(int index){ + if(index > size-1){ + return null; + }else{ + return elementData[index]; + } + } + + public Object remove(int index){ + if(index > size-1){ + return null; + }else{ + Object obj = elementData[index]; + for(int i=index; i o.hashCode()){ + this.right = node; + }else{ + this.left = node; + } + return this; + } + + + +} diff --git a/group10/364298692/cs/src/com/coding/basic/Iterator.java b/group10/364298692/cs/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group10/364298692/cs/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group10/364298692/cs/src/com/coding/basic/LinkedList.java b/group10/364298692/cs/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..976eb88fa3 --- /dev/null +++ b/group10/364298692/cs/src/com/coding/basic/LinkedList.java @@ -0,0 +1,92 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + private int size; + + public void add(Object o){ + addLast(o); + } + + public void add(int index , Object o){ + Node node = head; + for(int i = 0; i < index; i++){ + node = node.next; + } + Node newNode = new Node(); + newNode.data = o; + newNode.next = node.next; + node.next = newNode; + size++; + } + public Object get(int index){ + if(index > size-1){ + return null; + }else{ + Node node = head; + for(int i = 0; i < index; i++){ + node = node.next; + } + return node.data; + } + } + public Object remove(int index){ + if(index > size-1){ + return null; + }else if(index == 0){ + Object obj = head.data; + head = head.next; + size--; + return obj; + }else{ + Node node = head; + //ñɾڵǰһڵ + for(int i = 0; i < index-1; i++){ + node = node.next; + } + Object obj = node.next.data; + node.next = node.next.next; + size--; + return obj; + } + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node newHead = new Node(); + newHead.data = o; + newHead.next = head; + head = newHead; + size++; + } + public void addLast(Object o){ + Node node = head; + while(node.next != null){ + node = node.next; + } + Node newNode = new Node(); + newNode.data = o; + node.next = newNode; + size++; + } + public Object removeFirst(){ + return remove(0); + } + public Object removeLast(){ + return remove(size); + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + } +} diff --git a/group10/364298692/cs/src/com/coding/basic/List.java b/group10/364298692/cs/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group10/364298692/cs/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group10/364298692/cs/src/com/coding/basic/Queue.java b/group10/364298692/cs/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..1a96515399 --- /dev/null +++ b/group10/364298692/cs/src/com/coding/basic/Queue.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList linkedList; + + public void enQueue(Object o){ + linkedList.addLast(o); + } + + public Object deQueue(){ + Object obj = linkedList.removeFirst(); + return obj; + } + + public boolean isEmpty(){ + return linkedList.size() == 0; + } + + public int size(){ + return linkedList.size(); + } +} diff --git a/group10/364298692/cs/src/com/coding/basic/Stack.java b/group10/364298692/cs/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..7043ba9386 --- /dev/null +++ b/group10/364298692/cs/src/com/coding/basic/Stack.java @@ -0,0 +1,25 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(elementData.size(), o); + } + + public Object pop(){ + Object obj = elementData.remove(elementData.size()-1); + return obj; + } + + public Object peek(){ + Object obj = elementData.get(0); + return obj; + } + public boolean isEmpty(){ + return elementData.size()==0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group10/569420966/struct/pom.xml b/group10/569420966/struct/pom.xml new file mode 100644 index 0000000000..bc0c11f1c3 --- /dev/null +++ b/group10/569420966/struct/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.rishy + struct + 1.0-SNAPSHOT + + + junit + junit + 4.12 + test + + + + + \ No newline at end of file diff --git a/group10/569420966/struct/src/main/java/com/litestruts/LoginAction.java b/group10/569420966/struct/src/main/java/com/litestruts/LoginAction.java new file mode 100644 index 0000000000..b41e849acc --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} \ No newline at end of file diff --git a/group10/569420966/struct/src/main/java/com/litestruts/Struts.java b/group10/569420966/struct/src/main/java/com/litestruts/Struts.java new file mode 100644 index 0000000000..875b35d223 --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/litestruts/Struts.java @@ -0,0 +1,147 @@ +package com.litestruts; + +import com.myutil.JavaBeanUtil; +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.rmi.server.ExportException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class Struts { + + private static Map> xmlInfo = new HashMap<>(); + + public static View runAction(String actionName, Map parameters) { + + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + // 【0】 + getInfo(); + + + Map action = xmlInfo.get(actionName); + Class classForName; + View view = new View(); + try { + // 【1】 + Object aObj = Class.forName(action.get("class")).newInstance(); + classForName = aObj.getClass(); + Method[] methods = classForName.getMethods(); + for (Method method : methods) { + for (String key : parameters.keySet()) { + if (JavaBeanUtil.getSetMethodName(key).equals(method.getName())) { + Method declaredMethod = classForName.getDeclaredMethod(method.getName(), method.getParameterTypes()); + declaredMethod.invoke(aObj, parameters.get(key)); + } + } + } + // 【2】 + Map resultMap = new HashMap<>(); + Method execute = classForName.getDeclaredMethod("execute"); + String invoke = (String) execute.invoke(aObj); + // 【3】 + Field[] fields = classForName.getDeclaredFields(); + for (Field field : fields) { + for (Method method : methods) { + if (JavaBeanUtil.getGetMethodName(field.getName()).equals(method.getName())) { + Method declaredMethod = classForName.getDeclaredMethod(method.getName()); + String invoke1 = (String)declaredMethod.invoke(aObj); + resultMap.put(field.getName(), invoke1); + } + } + } + view.setParameters(resultMap); + // 【4】 + view.setJsp(action.get(invoke)); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return view; + } + + private static void getInfo() { + try { + File file = new File("D:\\Own\\Code\\Java\\coding2017\\group10\\569420966\\struct\\src\\main\\resources\\struts.xml"); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(file); + NodeList nl = doc.getElementsByTagName("struts"); + + if (nl.getLength() > 0) { + NodeList actions = doc.getElementsByTagName("action"); + if (actions.getLength() > 0) { + Map actionInfo; + for (int i = 0; i < actions.getLength(); i++) { + actionInfo = new HashMap<>(); + NamedNodeMap attributes = actions.item(i).getAttributes(); + for (int j = 0; j < attributes.getLength(); j++) { + attributes.item(j).getNodeName(); + actionInfo.put(attributes.item(j).getNodeName(), attributes.item(j).getNodeValue()); + } + NodeList childNodes = actions.item(i).getChildNodes(); + for (int j = 0; j < childNodes.getLength(); j++) { + if (childNodes.item(j).getNodeType() == 1) { // 元素节点 + NodeList childNodes1 = childNodes.item(j).getChildNodes(); + NamedNodeMap attributes1 = childNodes.item(j).getAttributes(); + NodeList childNodes2 = childNodes.item(j).getChildNodes(); + actionInfo.put(attributes1.item(0).getNodeValue(), childNodes2.item(0).getNodeValue()); + } + } + if (actionInfo.get("name") != null) { + xmlInfo.put(actionInfo.get("name"), actionInfo); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + getInfo(); + } + +} \ No newline at end of file diff --git a/group10/569420966/struct/src/main/java/com/litestruts/View.java b/group10/569420966/struct/src/main/java/com/litestruts/View.java new file mode 100644 index 0000000000..5567568114 --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/litestruts/View.java @@ -0,0 +1,23 @@ +package com.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group10/569420966/struct/src/main/java/com/myutil/ArrayList.java b/group10/569420966/struct/src/main/java/com/myutil/ArrayList.java new file mode 100644 index 0000000000..19f0fdc26f --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/myutil/ArrayList.java @@ -0,0 +1,162 @@ +package com.myutil; + + +import java.text.MessageFormat; +import java.util.NoSuchElementException; + +/** + * 数组列表 + */ +public class ArrayList implements List { + private Object[] elementData; + private int size = 0; + private static final int DEFAULT_SIZE = 10; + + /** + * 判断边界 + *

+ *

+     *      若 index < 0 或者 index > size 则抛出非法参数异常
+     * 
+ * + * @param index 当前索引 + */ + private void judgeRange(int index) { + if (index < 0) { + throw new IllegalArgumentException( + MessageFormat.format("Index is must be great or equal then 0. index:{0}", index)); + } + if (index >= this.size) { + throw new IllegalArgumentException( + MessageFormat.format("Index is must be less then size(). index:{0}", index)); + } + if (this.size == Integer.MAX_VALUE) { + throw new IllegalArgumentException("Array already can not Expansion."); + } + } + + /** + * 扩充数组容量 + *

+ *

+     *     若 size >= elementData.length 则对数组进行扩容
+     *     扩容至原(elementData.length+1) * 2
+     * 
+ */ + private void capacityExpansion() { + if (this.size >= elementData.length) { + Object[] tmpData = new Object[(elementData.length + 1) * 2]; + System.arraycopy(elementData, 0, tmpData, 0, elementData.length); + elementData = tmpData; + } + } + + public ArrayList() { + elementData = new Object[DEFAULT_SIZE]; + } + + public ArrayList(int capacity) { + if (capacity < 0) { + throw new IllegalArgumentException( + MessageFormat.format("Capacity is must be great or equal 0. capacity:{0}", capacity)); + } + this.elementData = new Object[capacity]; + } + + public void add(T element) { + capacityExpansion(); + elementData[this.size] = element; + this.size++; + } + + public void add(T element, int index) { + judgeRange(index); + capacityExpansion(); + if (this.size - index > 0) { + System.arraycopy(elementData, index, elementData, index + 1, this.size - index); + } + elementData[index] = element; + this.size++; + } + + public T remove(int index) { + judgeRange(index); + T tmpObject = (T) elementData[index]; + if (this.size - index > 0) { + System.arraycopy(elementData, index + 1, elementData, index, this.size - index - 1); + } + this.size--; + return tmpObject; + } + + public T get(int index) { + judgeRange(index); + return (T) elementData[index]; + } + + public int size() { + return this.size; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < this.size; i++) { + sb.append((T) elementData[i]); + if (i < this.size - 1) { + sb.append(","); + } + } + sb.append("]"); + + return sb.toString(); + } + + /** + * 获取迭代器 + * + * @return 迭代器 + */ + public Iterator iterator() { + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + int position = 0; + int lastRet = -1; + + public boolean hasNext() { + return position < ArrayList.this.size(); + } + + public T next() { + if (position >= size) { + throw new NoSuchElementException(); + } + int i = position; + T element = ArrayList.this.get(position++); + lastRet = i; + return element; + } + + public T remove() { + if (lastRet < 0) { + throw new IllegalStateException(); + } + T removeElement = ArrayList.this.remove(lastRet); + position = lastRet; + lastRet = -1; + return removeElement; + } + } + + public static void main(String[] args) { + ArrayList ids = new ArrayList<>(); + for (int i = 0; i < 11; i++) { + ids.add(i); + } + Iterator iterator = ids.iterator(); + System.out.println(ids); + } +} diff --git a/group10/569420966/struct/src/main/java/com/myutil/ArrayUtil.java b/group10/569420966/struct/src/main/java/com/myutil/ArrayUtil.java new file mode 100644 index 0000000000..bf7e794488 --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/myutil/ArrayUtil.java @@ -0,0 +1,257 @@ +package com.myutil; + +import java.util.Arrays; + +/** + * 数组工具类 + */ +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin 源数组 + */ + public static void reverseArray(int[] origin) { + if (origin == null) { + return; + } + int originLen = origin.length; + int[] copyArray = new int[originLen]; + System.arraycopy(origin, 0, copyArray, 0, originLen); + for (int i = 0; i < originLen; i++) { + origin[i] = copyArray[originLen - 1 - i]; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray 老数组 + * @return 去除零后的数组 + */ + + public static int[] removeZero(int[] oldArray) { + if (oldArray == null) { + return null; + } + int size = 0; + for (int i : oldArray) { + size += i == 0 ? 0 : 1; + } + int[] newArray = new int[size]; + int newIndex = 0; + for (int old : oldArray) { + if (old != 0) { + newArray[newIndex++] = old; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 第一个数组 + * @param array2 第二个数组 + * @return 合并后的数组 + */ + + public static int[] merge(int[] array1, int[] array2) { + if (array1 == null || array2 == null) { + return null; + } + int len1 = array1.length; + int len2 = array2.length; + int[] newArray = new int[len1 + len2]; + int size = 0; + int i = 0; + int j = 0; + int k = 0; + while (i < len1 && j < len2) { + if (array1[i] < array2[j]) { + if (k == 0 || newArray[k] != array2[i]) { + newArray[k++] = array1[i++]; + size++; + } else { + i++; + } + } else if (array1[i] > array2[j]) { + if (k == 0 || newArray[k] != array2[j]) { + newArray[k++] = array2[j++]; + size++; + } else { + j++; + } + } else { + if (k == 0 || newArray[k] != array2[i]) { + newArray[k++] = array2[j]; + i++; + j++; + size++; + } else { + i++; + j++; + } + } + } + while (i < len1) { + if (k == 0 || newArray[k] != array1[i]) { + newArray[k++] = array1[i++]; + size++; + } else { + i++; + } + } + while (j < len2) { + if (k == 0 || newArray[k] != array2[j]) { + newArray[k++] = array2[j++]; + size++; + } else { + j++; + } + } + int[] resizeArray = new int[size]; + System.arraycopy(newArray, 0, resizeArray, 0, size); + return resizeArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray 老数组 + * @param size 需扩容大小 + * @return 扩容后数组 + */ + public int[] grow(int[] oldArray, int size) { + if (oldArray == null || size <= 0) { + return oldArray; + } + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max 最大值 + * @return 小于最大值的fibonacci数列的数组 + */ + public static int[] fibonacci(int max) { + ArrayList fibonacciList = new ArrayList<>(); + int a1 = 1; + int a2 = 1; + int t; + if (a1 < max) { + fibonacciList.add(a1); + } + while (a2 < max) { + fibonacciList.add(a2); + t = a2; + a2 = a1 + a2; + a1 = t; + } + int[] fibonacciArray = new int[fibonacciList.size()]; + for (int i = 0; i < fibonacciList.size(); i++) { + fibonacciArray[i] = fibonacciList.get(i); + } + return fibonacciArray; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max 最大值 + * @return 小于最大值的所有素数 + */ + public static int[] getPrimes(int max) { + ArrayList primeList = new ArrayList<>(); + for (int i = 2; i < max; i++) { + if (isPrime(i)) { + primeList.add(i); + } + } + int[] primeArray = new int[primeList.size()]; + for (int i = 0; i < primeList.size(); i++) { + primeArray[i] = primeList.get(i); + } + return primeArray; + } + + private static boolean isPrime(int num) { + for (int i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) { + return false; + } + } + + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max 最大值 + * @return 小于最大值的所有完数 + */ + public static int[] getPerfectNumbers(int max) { + ArrayList perfectList = new ArrayList<>(); + for (int i = 2; i < max; i++) { + if (isPrefectNumber(i)) { + perfectList.add(i); + } + } + int[] perfectArray = new int[perfectList.size()]; + for (int i = 0; i < perfectList.size(); i++) { + perfectArray[i] = perfectList.get(i); + } + return perfectArray; + } + + private static boolean isPrefectNumber(int num) { + int sum = 0; + for (int i = 1; i < num; i++) { + if (num % i == 0) { + sum += i; + } + } + return num == sum; + } + + /** + * 用separator 把数组 array给连接起来 + * 例如array= [3,8,9], separator = "-" + * 则返回值为"3-8-9" + * + * @param array 数组 + * @param separator 分隔符 + * @return 用分隔符连接的数字字符串 + */ + public static String join(int[] array, String separator) { + if (array == null || separator == null) { + return ""; + } + StringBuilder sb = new StringBuilder(); + for (int i : array) { + sb.append(i).append(separator); + } + return sb.length() > 0 ? sb.substring(0, sb.length() - 1) : ""; + } + + public static void main(String[] args) { + System.out.println(Arrays.toString(getPerfectNumbers(1000))); + } +} \ No newline at end of file diff --git a/group10/569420966/struct/src/main/java/com/myutil/BinaryTreeNode.java b/group10/569420966/struct/src/main/java/com/myutil/BinaryTreeNode.java new file mode 100644 index 0000000000..0e862a199d --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/myutil/BinaryTreeNode.java @@ -0,0 +1,167 @@ +package com.myutil; + +import java.util.Random; + +/** + * 二叉树 + */ +public class BinaryTreeNode> { + private T element; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public T getElement() { + return element; + } + + public void setElement(T element) { + this.element = element; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + /** + * 将元素插入二叉树 + * + * @param element 元素 + * @return 插入后的节点 + */ + public BinaryTreeNode insert(T element) { + if (element == null) { + throw new IllegalArgumentException("Element must be not null."); + } + + BinaryTreeNode currentNode = null; + if (this.element == null) { + currentNode = this; + currentNode.element = element; + } else { + currentNode = compareToElement(element, this); + } + + return currentNode; + } + + private BinaryTreeNode compareToElement(T element, BinaryTreeNode curr) { + if (element.compareTo(curr.element) == -1) { + if (curr.left == null) { + BinaryTreeNode node = new BinaryTreeNode<>(); + node.element = element; + curr.left = node; + return node; + } else { + return compareToElement(element, curr.left); + } + } else { + if (curr.right == null) { + BinaryTreeNode node = new BinaryTreeNode<>(); + node.element = element; + curr.right = node; + return node; + } else { + return compareToElement(element, curr.right); + } + } + } + + /** + * 先序遍历 + * + * @return 按先序遍历顺序展示节点值 + */ + public String preOrderTraversal() { + return concatPreOrder(this); + } + + private String concatPreOrder(BinaryTreeNode node) { + StringBuilder ret = new StringBuilder(); + if (node.left != null) { + ret.append(concatPreOrder(node.left)); + } + + ret.append(node.element).append(" "); + + if (node.right != null) { + ret.append(concatPreOrder(node.right)); + } + + return ret.toString(); + } + + /** + * 中序遍历 + * + * @return 按中序遍历顺序展示节点值 + */ + public String inOrderTraversal() { + return concatInOrder(this); + } + + private String concatInOrder(BinaryTreeNode node) { + StringBuilder ret = new StringBuilder(); + + ret.append(node.element).append(" "); + + if (node.left != null) { + ret.append(concatInOrder(node.left)); + } + + if (node.right != null) { + ret.append(concatInOrder(node.right)); + } + + return ret.toString(); + } + + /** + * 后序遍历 + * + * @return 按后序遍历顺序展示节点值 + */ + public String postOrderTraversal() { + return concatPostOrder(this); + } + + private String concatPostOrder(BinaryTreeNode node) { + StringBuilder ret = new StringBuilder(); + + if (node.right != null) { + ret.append(concatPostOrder(node.right)); + } + + ret.append(node.element).append(" "); + + if (node.left != null) { + ret.append(concatPostOrder(node.left)); + } + + return ret.toString(); + } + + public static void main(String[] args) { + BinaryTreeNode binaryTree = new BinaryTreeNode<>(); + Random random = new Random(); + for (int i = 0; i < 5; i++) { + binaryTree.insert(random.nextInt(100)); + } + + + System.out.println(binaryTree.preOrderTraversal()); + System.out.println(binaryTree.inOrderTraversal()); + System.out.println(binaryTree.postOrderTraversal()); + } +} diff --git a/group10/569420966/struct/src/main/java/com/myutil/Iterator.java b/group10/569420966/struct/src/main/java/com/myutil/Iterator.java new file mode 100644 index 0000000000..412a1ef0aa --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/myutil/Iterator.java @@ -0,0 +1,28 @@ +package com.myutil; + +/** + * 迭代器 + */ +public interface Iterator { + + /** + * 是否有下一个元素 + * + * @return true-有 false-无 + */ + boolean hasNext(); + + /** + * 获取下一个元素 + * + * @return 下一个元素 + */ + T next(); + + /** + * 删除当前迭代的元素 + * + * @return 被删除的元素 + */ + T remove(); +} diff --git a/group10/569420966/struct/src/main/java/com/myutil/JavaBeanUtil.java b/group10/569420966/struct/src/main/java/com/myutil/JavaBeanUtil.java new file mode 100644 index 0000000000..614ca57bfb --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/myutil/JavaBeanUtil.java @@ -0,0 +1,35 @@ +package com.myutil; + +import java.util.regex.Pattern; + +/** + * javaBean工具 + */ +public class JavaBeanUtil { + public static String getGetMethodName(String attributeName) { + if ((Character.isLowerCase(attributeName.charAt(0)) && Character.isUpperCase(attributeName.charAt(1))) + || (Character.isUpperCase(attributeName.charAt(0)))) { + return "get" + attributeName; + } else if (attributeName.indexOf("is") == 0 && Character.isUpperCase(attributeName.charAt(1))) { + return attributeName; + } else { + char[] chars = attributeName.toCharArray(); + chars[0] -= 32; + return "get" + String.valueOf(chars); + } + } + + public static String getSetMethodName(String attributeName) { + if ((Character.isLowerCase(attributeName.charAt(0)) && Character.isUpperCase(attributeName.charAt(1))) + || (Character.isUpperCase(attributeName.charAt(0)))) { + return "set" + attributeName; + } else if (attributeName.indexOf("is") == 0 && Character.isUpperCase(attributeName.charAt(2))) { + return "set" + attributeName.replace("is", ""); + } else { + char[] chars = attributeName.toCharArray(); + chars[0] -= 32; + return "set" + String.valueOf(chars); + } + } + +} diff --git a/group10/569420966/struct/src/main/java/com/myutil/LinkedList.java b/group10/569420966/struct/src/main/java/com/myutil/LinkedList.java new file mode 100644 index 0000000000..dcbce429ec --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/myutil/LinkedList.java @@ -0,0 +1,207 @@ +package com.myutil; + +import java.text.MessageFormat; +import java.util.NoSuchElementException; + +/** + * 链表列表 + */ +public class LinkedList implements List { + private Node header = new Node(); + private int size = 0; + + private Node lastNode() { + return findNode(this.size); + } + + private Node findNode(int index) { + int current = 0; + Node targetNode = header; + while (current < index) { + targetNode = targetNode.next; + current++; + } + return targetNode; + } + + /** + * 判断边界 + *

+ *

+     *      若 index < 0 或者 index > size 则抛出非法参数异常
+     * 
+ * + * @param index 当前索引 + */ + private void judgeRange(int index) { + if (index < 0) { + throw new IllegalArgumentException( + MessageFormat.format("Index is must be great or equal then 0. index:{0}", index)); + } + if (index >= this.size) { + throw new IllegalArgumentException( + MessageFormat.format("Index is must be less then size(). index:{0}", index)); + } + if (this.size == Integer.MAX_VALUE) { + throw new IllegalArgumentException("Array already can not Expansion."); + } + } + + public LinkedList() { + + } + + @Override + public void add(T element) { + Node lastNode = lastNode(); + Node addNode = new Node(); + addNode.element = element; + lastNode.next = addNode; + this.size++; + } + + @Override + public void add(T element, int index) { + judgeRange(index); + Node targetNode = findNode(index); + Node addNode = new Node(); + addNode.element = element; + addNode.next = targetNode.next; + targetNode.next = addNode; + this.size++; + } + + @Override + public T remove(int index) { + judgeRange(index); + Node targetNode = findNode(index); + Node removeNode = targetNode.next; + targetNode.next = targetNode.next.next; + T element = (T) removeNode.element; + this.size--; + return element; + } + + @Override + public T get(int index) { + judgeRange(index); + return (T) findNode(index).next.element; + } + + @Override + public int size() { + return this.size; + } + + /** + * 添加一个元素到最开始的位置 + * + * @param element 元素 + */ + public void addFirst(T element) { + add(element, 0); + } + + /** + * 添加一个元素到最后 + * + * @param element 元素 + */ + public void addLast(T element) { + add(element, this.size - 1); + } + + /** + * 删除第一个元素 + * + * @return 第一个元素 + */ + public T removeFirst() { + if (this.size == 0) { + throw new ArrayIndexOutOfBoundsException("This list is empty, don't to remove."); + } + + return remove(0); + } + + /** + * 删除最后一个元素 + * + * @return 最后一个元素 + */ + public T removeLast() { + if (this.size == 0) { + throw new ArrayIndexOutOfBoundsException("This list is empty, don't to remove."); + } + return remove(this.size - 1); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + Node indexNode = header.next; + while (indexNode != null) { + sb.append((T) indexNode.element); + if (indexNode.next != null) { + sb.append(","); + } + indexNode = indexNode.next; + } + sb.append("]"); + + return sb.toString(); + } + + /** + * 获取迭代器 + * + * @return 迭代器 + */ + public Iterator iterator() { + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + int position = 0; + int lastRet = -1; + + public boolean hasNext() { + return position < LinkedList.this.size(); + } + + public T next() { + if (position >= size) { + throw new NoSuchElementException(); + } + int i = position; + T element = LinkedList.this.get(position++); + lastRet = i; + return element; + } + + public T remove() { + if (lastRet < 0) { + throw new IllegalStateException(); + } + T removeElement = LinkedList.this.remove(lastRet); + position = lastRet; + lastRet = -1; + return removeElement; + } + } + + private static class Node { + T element; + Node next; + } + + public static void main(String[] args) { + LinkedList ids = new LinkedList<>(); + for (int i = 0; i < 11; i++) { + ids.add(i); + } + Iterator iterator = ids.iterator(); + System.out.println(ids); + } +} diff --git a/group10/569420966/struct/src/main/java/com/myutil/List.java b/group10/569420966/struct/src/main/java/com/myutil/List.java new file mode 100644 index 0000000000..8dced86dc7 --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/myutil/List.java @@ -0,0 +1,52 @@ +package com.myutil; + +/** + * 列表基本操作 + */ +public interface List { + /** + * 添加一个元素到列表 + * + * @param element 元素 + */ + void add(T element); + + /** + * 添加一个元素至指定位置 + * + *
+     *     指定位置范围: index >= 0 && index < size
+     *     否则回抛出非法参数异常
+     * 
+ * + * @param element 元素 + * @param index 指定位置 + */ + void add(T element, int index); + + /** + * 删除指定位置元素 + * + *
+     *     指定位置范围: index >= 0 && index < size
+     *     否则回抛出非法参数异常
+     * 
+ * + * @param index 指定位置 + * @return 删除的元素的引用 + */ + T remove(int index); + + /** + * 获取指定位置元素 + * @param index 指定位置 + * @return 指定位置的元素 + */ + T get(int index); + + /** + * 获取当前列表的大小 + * @return 当前列表的大小 + */ + int size(); +} diff --git a/group10/569420966/struct/src/main/java/com/myutil/Queue.java b/group10/569420966/struct/src/main/java/com/myutil/Queue.java new file mode 100644 index 0000000000..9097caa7f4 --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/myutil/Queue.java @@ -0,0 +1,44 @@ +package com.myutil; + +/** + * 队列 + */ +public class Queue { + private LinkedList elementList = new LinkedList<>(); + + /** + * 进入队列 + * + * @param element 进入队列的元素 + */ + public void enQueue(T element) { + elementList.add(element); + } + + /** + * 出队列 + * + * @return 出队列的元素 + */ + public T deQueue() { + return elementList.removeFirst(); + } + + /** + * 队列是否为空 + * + * @return true-是 false-否 + */ + public boolean isEmpty() { + return elementList.size() == 0; + } + + /** + * 获取队列的大小 + * + * @return 队列的大小 + */ + public int size() { + return elementList.size(); + } +} diff --git a/group10/569420966/struct/src/main/java/com/myutil/Stack.java b/group10/569420966/struct/src/main/java/com/myutil/Stack.java new file mode 100644 index 0000000000..d78ae2b39a --- /dev/null +++ b/group10/569420966/struct/src/main/java/com/myutil/Stack.java @@ -0,0 +1,61 @@ +package com.myutil; + +/** + * 栈 + */ +public class Stack { + private ArrayList elementList = new ArrayList<>(); + + /** + * 入栈 + * + * @param element 入栈的元素 + */ + public void push(T element) { + elementList.add(element); + } + + /** + * 出栈 + * + * @return 出栈的元素 + */ + public T pop() { + if (elementList.size() == 0) { + throw new ArrayIndexOutOfBoundsException("Stack is empty, don't to pop()."); + } + T element = elementList.get(elementList.size() - 1); + elementList.remove(elementList.size() - 1); + return element; + } + + /** + * 获取栈顶元素 + * + * @return 栈顶元素 + */ + public T peek() { + if (elementList.size() == 0) { + throw new ArrayIndexOutOfBoundsException("Stack is empty, don't to peek()."); + } + return elementList.get(elementList.size() - 1); + } + + /** + * 是否为空栈 + * + * @return true-是 false-否 + */ + public boolean isEmpty() { + return elementList.size() == 0; + } + + /** + * 获取当前栈大小 + * + * @return 当前栈大小 + */ + public int size() { + return elementList.size(); + } +} diff --git a/group10/569420966/struct/src/main/resources/struts.xml b/group10/569420966/struct/src/main/resources/struts.xml new file mode 100644 index 0000000000..cdf0277794 --- /dev/null +++ b/group10/569420966/struct/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group10/569420966/struct/src/test/java/com/litestruts/test/StrutsTest.java b/group10/569420966/struct/src/test/java/com/litestruts/test/StrutsTest.java new file mode 100644 index 0000000000..4a03024cfc --- /dev/null +++ b/group10/569420966/struct/src/test/java/com/litestruts/test/StrutsTest.java @@ -0,0 +1,45 @@ +package com.litestruts.test; + +import java.util.HashMap; +import java.util.Map; + +import com.litestruts.Struts; +import com.litestruts.View; +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git a/group10/584709796/worka/.classpath b/group10/584709796/worka/.classpath new file mode 100644 index 0000000000..061bcc1d40 --- /dev/null +++ b/group10/584709796/worka/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group10/584709796/worka/.gitignore b/group10/584709796/worka/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group10/584709796/worka/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group10/584709796/worka/.project b/group10/584709796/worka/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group10/584709796/worka/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group10/584709796/worka/.settings/org.eclipse.jdt.core.prefs b/group10/584709796/worka/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group10/584709796/worka/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group10/584709796/worka/src/com/coding/basic/ArrayList.java b/group10/584709796/worka/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..e8a9dd68a3 --- /dev/null +++ b/group10/584709796/worka/src/com/coding/basic/ArrayList.java @@ -0,0 +1,75 @@ +//刚开始学JAVA,现在学到JAVA基础类库耐力,迭代器还没学 + +package com.coding.basic; + +public class ArrayList implements List { + + private int size =0; + + private Object[] elementData = new Object[100]; + + public int getSize() {//得到数组大小 + return size; + } + public void setSize(int size) {//设置数组的长度 + this.size = size; + } + + public void ExtendArray(int size){ //插入元素时,数组长度加1,确保数组不越界 + this.size=size+1; + } + + public void add(Object o){//在末尾添加元素 + int length=getSize(); + elementData[length] = o; + ExtendArray(length); + } + + public void add(int index, Object o){ + int length=getSize(); + + for(int k=length-1;k>=index-1;k--){//元素后移 + elementData[k+1]=elementData[k]; + } + elementData[index-1]=o; + ExtendArray(length);//插一个元素,扩充一次 + } + + public Object get(int index){//获取元素 + int length=getSize(); + if(index+1>length||index<0){ + System.out.println("方法 get(int index)的index不在数组索引的范围内"); + } + return (Object)elementData[index]; + } + + public Object remove(int index){//移除元素 + int length=getSize(); + if(index+1>length||index<0){ + System.out.println("方法 remove(int index)的index不在数组索引的范围内"); + } + Object ss=(Object)elementData[index]; + + for(int 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 Kb~v2w6aNc`P(%{| literal 0 HcmV?d00001 diff --git a/group10/595128841/Readme.txt b/group10/595128841/Readme.txt new file mode 100644 index 0000000000..a5206d5b31 --- /dev/null +++ b/group10/595128841/Readme.txt @@ -0,0 +1 @@ +第一次文章地址:http://www.jianshu.com/p/089ac95363d4 如何自己实现一个简单的ArrayList \ No newline at end of file diff --git a/group10/595128841/src/org/le/b/ArrayUtil.java b/group10/595128841/src/org/le/b/ArrayUtil.java new file mode 100644 index 0000000000..a2c7886a44 --- /dev/null +++ b/group10/595128841/src/org/le/b/ArrayUtil.java @@ -0,0 +1,197 @@ +/** + * + */ +package org.le.b; + +import java.util.Arrays; + +/** + * @author yue + * @time 2017年2月28日 + */ +public class ArrayUtil { + + /** + * @param args + */ + public static void main(String[] args) { + //int[] origin = {7, 9 , 30, 3}; + //int[] n = reverseArray(origin); +// int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; +// int[] n = removeZero(oldArr); +// int[] a1 = {3, 5, 7,8,9,12}; +// int[] a2 = {4, 5, 6,7,8,12,14,5}; +// int[] n =merge(a1, a2); +// int[] n = grow(a1,5); + int[] n = fibonacci(100); + System.out.println(Arrays.toString(n)); + } + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static int[] reverseArray(int[] origin){ + int[] newArry = new int[origin.length]; + int i= 0,j = origin.length; + while(j > 0){ + newArry[i++] = origin[--j]; + } + return newArry; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray){ + int[] tempArray = new int[oldArray.length]; + int j = 0; + for(int i = 0; i < oldArray.length;i++){ + if(oldArray[i] > 0){ + tempArray[j++] = oldArray[i]; + } + } + int[] newArray = new int[j]; + System.arraycopy(tempArray, 0, newArray, 0, j); + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + int len = array1.length; + int[] newArray = new int[array1.length+array2.length]; + System.arraycopy(array1, 0, newArray, 0, array1.length); + for(int i = 0; i < array2.length; i++){ + boolean flag = true; + for(int j = 0; j < array1.length; j++){ + if(array2[i] == array1[j]){ + flag = false; + } + } + if(flag){ + newArray[len++] = array2[i]; + } + } + int[] aa = new int[len]; + System.arraycopy(newArray, 0, aa, 0, len); + for(int i = 0; i < aa.length; i++){ + for(int j = i+1; j < aa.length; j++){ + if(aa[i] > aa[j]){ + int temp = aa[i]; + aa[i] = aa[j]; + aa[j] = temp; + } + } + } + return aa; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int [] oldArray, int size){ + int[] aa = new int[oldArray.length+size]; + System.arraycopy(oldArray, 0, aa, 0, oldArray.length); + return aa; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * Fn = F(n-1)+F(n-2)(n >= 2) + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + if(max <2){ + return new int[0]; + } + int[] temp = new int[8]; + int count = 0; + for(int i = 1;i < max;i ++){ + int len = createFibo(i); + if(len > max) + break; + temp = growInt(temp,count); + temp[count++] = len; + } + int[] res = new int[count]; + System.arraycopy(temp, 0, res, 0, count); + return res; + } + + private static int[] growInt(int[] temp,int count){ + int[] n = temp; + if(count >= temp.length){ + n = new int[temp.length + (temp.length >> 1)]; + System.arraycopy(temp, 0, n, 0, temp.length); + } + return n; + } + + private static int createFibo(int n){ + if(n <= 2){ + return 1; + } + return createFibo(n-1)+createFibo(n-2); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder str = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + str.append(seperator).append(array[i]); + } + return str.substring(1).toString(); + } + +} diff --git a/group10/595128841/src/org/le/b/LoginAction.java b/group10/595128841/src/org/le/b/LoginAction.java new file mode 100644 index 0000000000..81b090e0c2 --- /dev/null +++ b/group10/595128841/src/org/le/b/LoginAction.java @@ -0,0 +1,35 @@ +package org.le.b; + +public class LoginAction { + + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group10/595128841/src/org/le/b/Struts.java b/group10/595128841/src/org/le/b/Struts.java new file mode 100644 index 0000000000..010357b492 --- /dev/null +++ b/group10/595128841/src/org/le/b/Struts.java @@ -0,0 +1,155 @@ +package org.le.b; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentFactory; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + private static Map actionMap; + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + if(actionMap == null){ + actionMap = strutsXmlSax("struts2.xml"); + } + ActionBean actionBean = actionMap.get(actionName); + return processAction(actionBean,parameters); + } + + + private static View processAction(ActionBean actionBean, Map parameters) { + String clazzStr = actionBean.getClazz(); + Map result = actionBean.getResults(); + try { + Class clazz= Class.forName(clazzStr); + Object obj = clazz.newInstance(); + for(String key : parameters.keySet()){ + String name = "set"+(key.charAt(0)+"").toUpperCase()+key.substring(1); + Method method = clazz.getMethod(name, String.class); + method.invoke(obj, parameters.get(key)); + } + Method execute = clazz.getMethod("execute"); + String resultStr = (String)execute.invoke(obj); + String resultJsp = result.get(resultStr); + Map pramMap = new HashMap<>(); + Method meg = clazz.getMethod("getMessage"); + String resultMsg = (String)meg.invoke(obj); + pramMap.put("message", resultMsg); + return new View(resultJsp,pramMap); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } + return null; + } + + + public static Map strutsXmlSax(String path){ + DocumentFactory documentFactory = DocumentFactory.getInstance(); + SAXReader saxReader = new SAXReader(documentFactory); + Document doc = null; + try { + doc = saxReader.read(path); + } catch (DocumentException e) { + e.printStackTrace(); + } + Element rootElement = doc.getRootElement(); + Element pack = rootElement.element("package"); + List actions = pack.elements("action"); + Map actionMap = new HashMap<>(); + for(Element action : actions){ + Attribute name = action.attribute("name"); + Attribute clazz = action.attribute("class"); + List results = action.elements("result"); + Map resMap = new HashMap<>(); + for(Element result : results){ + String key = "success"; + String value = result.getTextTrim(); + Attribute rname = result.attribute("name"); + if(rname != null){ + key = rname.getValue(); + } + resMap.put(key, value); + } + actionMap.put(name.getValue(), new ActionBean(name.getValue(),clazz.getValue(),resMap)); + } + return actionMap; + } + + public static class ActionBean{ + private String name; + private String clazz; + private Map results; + + public ActionBean(String name, String clazz, Map results) { + this.name = name; + this.clazz = clazz; + this.results = results; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClazz() { + return clazz; + } + + public void setClazz(String clazz) { + this.clazz = clazz; + } + + public Map getResults() { + return results; + } + + public void setResults(Map results) { + this.results = results; + } + + } + +} diff --git a/group10/595128841/src/org/le/b/StrutsTest.java b/group10/595128841/src/org/le/b/StrutsTest.java new file mode 100644 index 0000000000..2f1d55a9df --- /dev/null +++ b/group10/595128841/src/org/le/b/StrutsTest.java @@ -0,0 +1,38 @@ +package org.le.b; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group10/595128841/src/org/le/b/View.java b/group10/595128841/src/org/le/b/View.java new file mode 100644 index 0000000000..c47f35f81f --- /dev/null +++ b/group10/595128841/src/org/le/b/View.java @@ -0,0 +1,28 @@ +package org.le.b; + +import java.util.Map; + +public class View { + + private String jsp; + private Map parameters; + + public View(String resultJsp, Map pramMap) { + this.jsp = resultJsp; + this.parameters = pramMap; + } + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group10/595128841/src/org/le/list/ArrayList.java b/group10/595128841/src/org/le/list/ArrayList.java new file mode 100644 index 0000000000..f9efb980e2 --- /dev/null +++ b/group10/595128841/src/org/le/list/ArrayList.java @@ -0,0 +1,144 @@ +/** + * + */ +package org.le; + +/** + * @author yue + * @time 2017年2月19日 + */ +public class ArrayList implements List { + + private Object[] elementData; + + private int size; + + public ArrayList(int initCapcity){ + if(initCapcity < 0){ + throw new IllegalArgumentException("initCapcity 必须大于0"); + } + elementData = new Object[initCapcity]; + } + + public ArrayList(){ + elementData = new Object[10]; + } + + @Override + public void add(Object obj) { + grow(size + 1); + elementData[size++] = obj; + } + + @Override + public void add(int index, Object obj) { + rangeCheckForAdd(index); + grow(size + 1); + System.arraycopy(elementData, index, elementData, index+1, size - index); + elementData[index] = obj; + size ++; + } + + @Override + public void remove(Object obj) { + if(obj == null){ + for (int i = 0; i < size; i++) { + if(elementData[i] == null){ + fastRemove(i); + } + } + }else{ + for (int i = 0; i < size; i++) { + if(obj.equals(elementData[i])){ + fastRemove(i); + } + } + } + } + + @Override + public E remove(int index) { + rangeCheck(index); + int movedNum = size - index - 1; + E oldElement = elementData(index); + System.arraycopy(elementData, index+1, elementData, index, movedNum); + elementData[--size] = null; + return oldElement; + } + + @Override + public E get(int index) { + rangeCheck(index); + return elementData(index); + } + + @Override + public E set(int index, E obj) { + rangeCheck(index); + E oldElement = elementData(index); + elementData[index] = obj; + return oldElement; + } + + @Override + public int indexOf(E obj) { + if(obj == null){ + for (int i = 0; i < size; i++) { + if(elementData[i] == null){ + return i; + } + } + }else{ + for (int i = 0; i < size; i++) { + if(obj.equals(elementData[i])){ + return i; + } + } + } + return -1; + } + + /** + * 数组扩容 + * @param minCapacity + */ + private void grow(int minCapacity) { + if(minCapacity <= elementData.length){ + return; + } + int oldCapacity = elementData.length; + int newCapacity = minCapacity + (oldCapacity >> 1); + if(newCapacity < minCapacity){ + newCapacity = minCapacity; + } + if(minCapacity > Integer.MAX_VALUE){ + newCapacity = Integer.MAX_VALUE; + } + Object[] newArray = new Object[newCapacity]; + System.arraycopy(elementData, 0, newArray, 0, newCapacity); + elementData = newArray; + } + + @SuppressWarnings("unchecked") + private E elementData(int index){ + return (E) elementData[index]; + } + + private void fastRemove(int i) { + int numMoved = size - i -1; + if(numMoved > 0){ + System.arraycopy(elementData, i+1, elementData, i, numMoved); + } + elementData[-- size] = null; + } + + private void rangeCheck(int index){ + if(index >= size || index <0) + throw new IndexOutOfBoundsException("index:"+index+",size:"+size); + } + + private void rangeCheckForAdd(int index){ + if(index > size || index <0) + throw new IndexOutOfBoundsException("index:"+index+",size:"+size); + } +} diff --git a/group10/595128841/src/org/le/list/LinkedList.java b/group10/595128841/src/org/le/list/LinkedList.java new file mode 100644 index 0000000000..e2c400a11f --- /dev/null +++ b/group10/595128841/src/org/le/list/LinkedList.java @@ -0,0 +1,299 @@ +/** + * + */ +package org.le; + +import java.util.NoSuchElementException; + +/** + * @author yue + * @time 2017年2月19日 + */ +public class LinkedList implements List { + + private int size = 0; + + private Node first; + + private Node last; + + private static class Node{ + E item; + Node prev; + Node next; + Node(Node prev,E item, Node next) { + super(); + this.item = item; + this.prev = prev; + this.next = next; + } + } + + public LinkedList(){ + + } + + /** + * 头部插入 + */ + private void linkFirst(E e){ + final Node f = first; + final Node newNode = new Node(null,e,f); + first = newNode; + if(f == null) + last = newNode; + else + f.prev = newNode; + size ++; + } + + /** + * 尾部插入 + */ + private void linkLast(E e){ + final Node l = last; + final Node newNode = new Node<>(l,e,null); + last = newNode; + if(last == null) + first = newNode; + else + l.next = newNode; + size ++; + } + + /** + * 某个不为null元素之前插入 + */ + private void linkBefore(E e,Node succ){ + final Node pred = succ.prev; + final Node newNode = new Node<>(pred,e,succ); + succ.prev = newNode; + if(pred == null) + first = newNode; + else + pred.next = newNode; + size ++; + } + + /** + * 删除头部元素 + */ + private E unlinkFirst(Node f){ + final E element = f.item; + final Node next = f.next; + f.item = null; + f.next = null; + first = next; + if(next == null) + last = null; + else + next.prev = null; + size -- ; + return element; + } + /** + * 删除尾部元素 + * @param l + * @return + */ + private E unlinkLast(Node l){ + final E element = l.item; + final Node prev = l.prev; + l.item = null; + l.prev = null; + last = prev; + if(prev == null) + first = null; + else + prev.next = null; + size -- ; + return element; + } + + /** + * 删除指定节点 + * @param e + * @return + */ + private E unlink(Node e){ + final Node prev = e.prev; + final E element = e.item; + final Node next = e.next; + + if(prev == null){ + first = next; + }else{ + prev.next = next; + e.prev = null; + } + + if(next == null){ + last = prev; + }else{ + next.prev = prev; + e.next = null; + } + e.item = null; + size -- ; + return element; + } + + /** + * 该方法默认在尾部添加 + */ + @Override + public void add(E e) { + linkLast(e); + } + + /** + * + */ + @Override + public void add(int index, E e) { + checkPositionIndex(index); + if(index == size){ + linkLast(e); + }else{ + linkBefore(e, node(index)); + } + } + + private Node node(int index) { + //小于容量一半 + if(index < (size >> 1)){ + Node x = first; + for(int i = 0; i < index; i++){ + x = x.next; + } + return x; + }else{ + Node x = last; + for(int i = size - 1; i > index; i --){ + x = x.prev; + } + return x; + } + } + + private void checkPositionIndex(int index){ + if(index <0 || index > size){ + throw new IndexOutOfBoundsException("索引越界:index:"+index+",size:"+size); + } + } + + private void checkElementIndex(int index){ + if(index <0 || index >= size){ + throw new IndexOutOfBoundsException("索引越界:index:"+index+",size:"+size); + } + } + + /** + * + */ + @Override + public void remove(E obj) { + if(obj == null){ + for(Node x = first;x != null; x = x.next){ + if(x.item == null){ + unlink(x); + } + } + }else{ + for(Node x = first;x != null;x = x.next){ + if(obj.equals(x.item)){ + unlink(x); + } + } + } + } + + /** + * + */ + @Override + public E remove(int index) { + checkElementIndex(index); + return unlink(node(index)); + } + + /** + * + */ + @Override + public E get(int index) { + checkElementIndex(index); + return node(index).item; + } + + /** + * + */ + @Override + public E set(int index, E obj) { + checkElementIndex(index); + Node x = node(index); + E oldVal = x.item; + x.item = obj; + return oldVal; + } + + /** + * + */ + @Override + public int indexOf(E obj) { + int index = 0; + if(obj == null){ + for(Node x = first;x != null;x = x.next){ + if(x.item == null) + return index; + index ++; + } + }else{ + for(Node x = first; x != null; x = x.next){ + if(obj.equals(x.item)) + return index; + index ++; + } + } + return -1; + } + /** + * 弹出栈顶的元素,不删除元素 + * @param e + * @return + */ + public E peek(){ + final Node e = first; + return e == null ? null : e.item; + } + + /** + * 弹出栈顶元素,删除元素 + * @return + */ + public E poll(){ + final Node e = first; + return (e == null) ? null : unlinkFirst(e); + } + /** + * 入栈,栈顶 + * @param e + */ + public void push(E e){ + linkFirst(e); + } + + /** + * 出栈,删除并返回栈顶元素 + * @return + */ + public E pop(){ + final Node f = first; + if(f == null) + throw new NoSuchElementException(); + return unlinkFirst(f); + } + +} diff --git a/group10/595128841/src/org/le/list/List.java b/group10/595128841/src/org/le/list/List.java new file mode 100644 index 0000000000..ca5c9215a9 --- /dev/null +++ b/group10/595128841/src/org/le/list/List.java @@ -0,0 +1,19 @@ +package org.le; + +public interface List { + + void add(E obj); + + void add(int index,E obj); + + void remove(E obj); + + E remove(int index); + + E get(int index); + + E set(int index,E obj); + + int indexOf(E obj); + +} diff --git a/group10/630505243/.classpath b/group10/630505243/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group10/630505243/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group10/630505243/.gitignore b/group10/630505243/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group10/630505243/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group10/630505243/.project b/group10/630505243/.project new file mode 100644 index 0000000000..9462374c56 --- /dev/null +++ b/group10/630505243/.project @@ -0,0 +1,17 @@ + + + 630505243Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group10/630505243/src/com/coderising/array/ArrayUtil.java b/group10/630505243/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..5ea66efde7 --- /dev/null +++ b/group10/630505243/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,238 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static int[] reverseArray(int[] origin){ + int arrLength = origin.length; + int[] newArray = new int[arrLength]; + //判断数组不为空 + if (arrLength > 0) { + for (int i = 0; i < arrLength; i++) { + newArray[i] = origin[arrLength-1-i]; + } + } + return newArray; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray){ + int position = 0; + int zeroCount = 0; + int[] rtnArr = null; + int[] newArray = new int[oldArray.length]; + if(oldArray.length>0){ + for(int i=0;i0){ + rtnArr =new int[oldArray.length-zeroCount]; + System.arraycopy(newArray, 0, rtnArr, 0, rtnArr.length); + } + return rtnArr; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + //去重 + int repeatCount=0; + int len = array1.length-array2.length>0?array2.length:array1.length; + for(int i=0;i1) + return fibonacciImpl(a-1)+fibonacciImpl(a-2); + return -1; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public static int[] getPrimes(int max){ + int[] primes = new int[max]; + int arrCount = 0; + for(int i=1;i0){ + for(int i=0;i parameters) { + View view = new View(); + //读取配置文件 + try { + File f = new File("src/com/coderising/litestruts/struts.xml"); + DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); + Document doc = docBuilder.parse(f); + + NodeList actionList = doc.getElementsByTagName("action"); + for(int i=0;i> set = parameters.entrySet(); + Map viewparam = new HashMap(); + for(Map.Entry entry:set){ + String key = entry.getKey(); + String value = entry.getValue(); + Method method = clazz.getMethod("set"+key.substring(0,1).toUpperCase()+key.substring(1,key.length()), String.class); + method.invoke(nobj, value); + //viewparam.put(key, value); + } + Method m = clazz.getMethod("execute", null); + String rtnStr = (String) m.invoke(nobj, null); + NodeList resultList = actionElement.getChildNodes(); + for(int j=0;j 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return view; + } + +} diff --git a/group10/630505243/src/com/coderising/litestruts/StrutsTest.java b/group10/630505243/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group10/630505243/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group10/630505243/src/com/coderising/litestruts/View.java b/group10/630505243/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group10/630505243/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group10/630505243/src/com/coderising/litestruts/struts.xml b/group10/630505243/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..9df1bf4c7c --- /dev/null +++ b/group10/630505243/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group10/630505243/src/com/coding/basic/ArrayList.java b/group10/630505243/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..4092ab585a --- /dev/null +++ b/group10/630505243/src/com/coding/basic/ArrayList.java @@ -0,0 +1,112 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + if(o!=null){ + elementData[size] = o; + if(size<100-1){ + size++; + }else{ + Object[] temp = new Object[(size+1)+100]; + System.arraycopy(elementData, 0, temp, 0, size); + elementData = temp; + size++; + } + } + + } + public void add(int index, Object o){ + if(index=index;i--){ + if(i==index){ + temps[index] = tmp; + }else{ + temps[i]=temps[i-1]; + } + } + elementData = temps; + + }else if(index>=size-1){ + elementData[size] = o; + } + }else{ + //Ԫλôұ߽ + Object[] temp = new Object[(size+1)+100]; + System.arraycopy(elementData, 0, temp, 0, size); + elementData = temp; + elementData[index] = o; + } + size++; + } + + public Object get(int index){ + if(index<=elementData.length){ + return elementData[index]; + }else{ + return null; + } + } + + public Object remove(int index){ + Object rtnObj = null; + if(index<=size){ + if(index>{ + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode root; + private LinkedList tree = new LinkedList(); + + public Object getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(T o){ + BinaryTreeNode currNode = null; + if(root==null){ + currNode = new BinaryTreeNode(); + currNode.data = o; + this.root = currNode; + tree.addFirst(currNode); + }else{ + currNode = findTheParentPosition(root,o); + if(o.compareTo(currNode.data)>0){ + BinaryTreeNode tNode = new BinaryTreeNode(); + tNode.data = o; + tree.add(tNode); + }else{ + BinaryTreeNode tNode = new BinaryTreeNode(); + tNode.data = o; + currNode.left = tNode; + tree.add(tNode); + } + } + return currNode; + } + + private BinaryTreeNode findTheParentPosition(BinaryTreeNode node ,T o){ + if(o.compareTo(node.data) >0){ + if(node.getRight()!=null) + return findTheParentPosition(node.getRight(),o); + else + return node; + }else{ + if(node.getLeft()!=null) + return findTheParentPosition(node.getLeft(),o); + else + return node; + } + } + + public void printTree(){ + if(this.tree!=null){ + Iterator i = tree.iterator(); + while(i.hasNext()){ + System.out.println(i.next()); + } + } + } + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("[Node data:"+this.data+"]"); + return sb.toString(); + } + + + +} diff --git a/group10/630505243/src/com/coding/basic/BinaryTreeNodeTest.java b/group10/630505243/src/com/coding/basic/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..4a829f7742 --- /dev/null +++ b/group10/630505243/src/com/coding/basic/BinaryTreeNodeTest.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class BinaryTreeNodeTest { + BinaryTreeNode root = new BinaryTreeNode(); + @Before + public void setUp() throws Exception { + } + + @Test + public void testInsert() { + root.insert(5); + root.insert(3); + root.insert(8); + + root.printTree(); + } + +} diff --git a/group10/630505243/src/com/coding/basic/Iterator.java b/group10/630505243/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group10/630505243/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group10/630505243/src/com/coding/basic/LinkedList.java b/group10/630505243/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..ee97b36ff8 --- /dev/null +++ b/group10/630505243/src/com/coding/basic/LinkedList.java @@ -0,0 +1,166 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head;//ͷڵ + private Node last;//βڵ + private int size=0;// + + public void add(Object o){ + if(last==null){ + head = new Node(o, null); + last = head; + }else{ + Node nod = last; + nod.next = new Node(o,null); + last = nod.next; + } + size++; + } + public void add(int index , Object o){ + if(last==null){ + head = new Node(o,null); + last = head; + }else{ + //ҵindexǰһڵ + Node preNode = getNextNode(head, index-1); + //indexԭнڵ + Node node = getNextNode(preNode,index); + //indexǰڵ֮󣬷ԭindexڵ֮ǰ + preNode.next = new Node(o,node); + } + this.size++; + + } + + public Object get(int index){ + return getNextNode(head,index); + } + public Object remove(int index){ + //ȡɾǰһڵ + Node preNode = getNextNode(head,index-1); + Node node = getNextNode(head,index); + if(node.next!=null){ + preNode.next = getNextNode(head,index+1); + }else{ + preNode.next = null; + } + this.size--; + return node; + } + + /** + * ݹѰһڵ + * @param node սڵ + * @param index սڵľ + * @return + */ + private Node getNextNode(Node node,int index){ + if(index==0){ + return node; + } + Node rtnNode = null; + if(node.next==null){ + return rtnNode;//һڵһڵΪ + }else{ + return getNextNode(node.next,index-1); + } + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + Node node = new Node(o,head); + this.head = node; + this.last = head; + this.size++; + } + public void addLast(Object o){ + Node newLast = new Node(o, null); + Node node = last; + node.next = newLast; + last = newLast; + this.size++; + } + public Object removeFirst(){ + if(head==null){ + return null; + }else{ + if(head.next==null){ + head.data = null; + size--; + return head; + }else{ + Node node = head; + head = node.next; + size--; + return node; + } + } + } + public Object removeLast(){ + if(last==null){ + return null; + }else{ + //ȡԭڶڵ + Node preLast = getNextNode(head, size-2); + Node orgLast = last; + preLast.next = null; + last = preLast; + size--; + return orgLast; + } + } + + public Iterator iterator(){ + LinkedIterator linkIterator = new LinkedIterator(this); + return linkIterator; + } + + + private static class Node{ + Object data; + Node next; + public Node(Object o,Node next){ + this.data = o; + this.next = next; + } + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("["); + sb.append("data = "+this.data); + if(next!=null){ + sb.append(" ; next = "+this.next.data+" \n"); + }else{ + sb.append(" ; next = null"); + } + sb.append("]"); + return sb.toString(); + } + } + class LinkedIterator implements Iterator{ + private LinkedList list; + private int position=0; + public LinkedIterator(LinkedList list){ + this.list = list; + } + + @Override + public boolean hasNext() { + if(list.get(position)!=null){ + this.position++; + return true; + }else + return false; + } + + @Override + public Object next() { + return list.get(position-1); + } + + } +} diff --git a/group10/630505243/src/com/coding/basic/LinkedListTest.java b/group10/630505243/src/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..97eae0763e --- /dev/null +++ b/group10/630505243/src/com/coding/basic/LinkedListTest.java @@ -0,0 +1,103 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class LinkedListTest { + + LinkedList lkLst = null; + @Before + public void setUp() throws Exception { + lkLst = new LinkedList(); + lkLst.add("ABC"); + lkLst.add("CDE"); + lkLst.add("EFG"); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddObject() { + lkLst.add("HIJ"); + System.out.println(lkLst.get(3)); + fail("Not yet implemented"); + } + + @Test + public void testAddIntObject() { + lkLst.add(1,"OPQ"); + System.out.println(lkLst.get(1)); + fail("Not yet implemented"); + } + + @Test + public void testGet() { + fail("Not yet implemented"); + } + + @Test + public void testRemove() { + System.out.println(lkLst.size()); + System.out.println(lkLst.remove(2)); + System.out.println(lkLst.size()); + fail("Not yet implemented"); + } + + @Test + public void testSize() { + System.out.println(lkLst.size()); + lkLst.add("HIJ"); + lkLst.add("JKL"); + lkLst.add("LMN"); + System.out.println(lkLst.size()); + fail("Not yet implemented"); + } + + @Test + public void testAddFirst() { + lkLst.addFirst("000"); + System.out.println(lkLst.get(0)); + fail("Not yet implemented"); + } + + @Test + public void testAddLast() { + System.out.println(lkLst.size()); + lkLst.addLast("XYZ"); + System.out.println(lkLst.size()); + System.out.println(lkLst.get(lkLst.size()-1)); + fail("Not yet implemented"); + } + + @Test + public void testRemoveFirst() { + System.out.println(lkLst.get(0)); + System.out.println(lkLst.size()); + lkLst.removeFirst(); + System.out.println(lkLst.get(0)); + System.out.println(lkLst.size()); + fail("Not yet implemented"); + } + + @Test + public void testRemoveLast() { + System.out.println("ԭlast Node :"+lkLst.get(lkLst.size()-1)); + System.out.println("ɾ Node :"+lkLst.removeLast()); + System.out.println("µ Last Node"+lkLst.get(lkLst.size()-1)); + fail("Not yet implemented"); + } + + @Test + public void testIterator() { + Iterator i = lkLst.iterator(); + while(i.hasNext()){ + System.out.println(i.next()); + } + } + +} diff --git a/group10/630505243/src/com/coding/basic/List.java b/group10/630505243/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group10/630505243/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group10/630505243/src/com/coding/basic/Queue.java b/group10/630505243/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..b514b7e087 --- /dev/null +++ b/group10/630505243/src/com/coding/basic/Queue.java @@ -0,0 +1,46 @@ +package com.coding.basic; + +public class Queue { + private int size = 0; + private Object[] datas; + private int capacity = 10; + public void enQueue(Object o){ + if(datas==null){ + datas = new Object[capacity]; + } + if(this.size>=datas.length){ + Object[] newDatas = new Object[capacity+10]; + System.arraycopy(datas,0,newDatas,0,datas.length); + datas = newDatas; + } + datas[size] = o; + size++; + } + + public Object deQueue(){ + Object o = null; + if(datas!=null && datas.length>0){ + o = datas[0]; + }else{ + System.out.println("Ϊ"); + } + for(int i=0;i0){ + return false; + }else{ + return true; + } + } + + public int size(){ + return this.size; + } +} diff --git a/group10/630505243/src/com/coding/basic/QueueTest.java b/group10/630505243/src/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..163a6b4db0 --- /dev/null +++ b/group10/630505243/src/com/coding/basic/QueueTest.java @@ -0,0 +1,46 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class QueueTest { + Queue queue = null; + String str1 = "First"; + String str2 = "Second"; + String str3 = "Third"; + String str4 = "Forth"; + @Before + public void setUp() throws Exception { + queue = new Queue(); + } + + @Test + public void testEnQueue() { + queue.enQueue(str1); + queue.enQueue(str2); + queue.enQueue(str3); + queue.enQueue(str4); + assertEquals(queue.size(),4); + assertFalse(queue.isEmpty()); + } + + @Test + public void testDeQueue() { + queue.enQueue(str1); + queue.enQueue(str2); + queue.enQueue(str3); + queue.enQueue(str4); + assertEquals(str1,(String) queue.deQueue()); + assertEquals(queue.size(),3); + assertEquals(str2,(String) queue.deQueue()); + assertEquals(queue.size(),2); + assertEquals(str3,(String) queue.deQueue()); + assertEquals(queue.size(),1); + assertEquals(str4,(String) queue.deQueue()); + assertEquals(queue.size(),0); + assertFalse(queue.isEmpty()); + } + +} diff --git a/group10/630505243/src/com/coding/basic/Stack.java b/group10/630505243/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..5f153c7292 --- /dev/null +++ b/group10/630505243/src/com/coding/basic/Stack.java @@ -0,0 +1,58 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size = 0; + + /** + * ѹջ + * @param o + */ + public void push(Object o){ + elementData.add(size,o); + size++; + } + + /** + * ƳջĶ󣬲Ϊ˺ֵظö + * @return + */ + public Object pop(){ + if(this.elementData.size()>0){ + Object o = elementData.get(size-1); + elementData.remove(size); + size--; + return o; + }else{ + return null; + } + } + + /** + * 鿴ջĶ󣬵ӶջƳ + * @return + */ + public Object peek(){ + if(size>0){ + return elementData.get(size-1); + }else{ + return null; + } + } + + /** + * ԶջǷΪ + * @return + */ + public boolean isEmpty(){ + return size>0?false:true; + } + + /** + * ȡջС + * @return + */ + public int size(){ + return this.size; + } +} diff --git a/group10/630505243/src/com/coding/basic/StackTest.java b/group10/630505243/src/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..7c90feca25 --- /dev/null +++ b/group10/630505243/src/com/coding/basic/StackTest.java @@ -0,0 +1,62 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class StackTest { + + Stack s = null; + String a = "A"; + String b = "B"; + String c = "C"; + @Before + public void setUp() throws Exception { + s = new Stack(); + s.push(a); + //System.out.println(s.peek()); + s.push(b); + //System.out.println(s.peek()); + s.push(c); + //System.out.println(s.peek()); + } + + @Test + public void testPush() { + String d = "D"; + String e = "E"; + s.push(d); + System.out.println(s.peek()); + s.push(e); + System.out.println(s.peek()); + assertEquals(s.size(), 5); + } + + @Test + public void testPop() { + int len = s.size(); + for(int i=0;isize()){ + throw new IndexOutOfBoundsException(); + } + if (index == size) { + add(o); + } else { + Node node = head; + for (int i = 0; i < index-1; i++) { + node = node.next; + } + Node newNode = new Node(o, node); + node.next = newNode; + newNode.next = node; + size++; + } + } + public Object get(int index){ + if(index<0||index>size()){ + throw new IndexOutOfBoundsException(); + } + Node node=head; + for(int i=0;isize()){ + throw new IndexOutOfBoundsException(); + } + return null; + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + Node newNode = new Node(o,null); + newNode.next=head.next; + } + public void addLast(Object o){ + add(o); + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } +} diff --git a/group10/706097141/learning/src/com/hmily/learning/List.java b/group10/706097141/learning/src/com/hmily/learning/List.java new file mode 100644 index 0000000000..02ef056bd3 --- /dev/null +++ b/group10/706097141/learning/src/com/hmily/learning/List.java @@ -0,0 +1,8 @@ +package com.hmily.learning; +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group10/706097141/learning/src/com/hmily/learning/MyArrayList.java b/group10/706097141/learning/src/com/hmily/learning/MyArrayList.java new file mode 100644 index 0000000000..46e1c564af --- /dev/null +++ b/group10/706097141/learning/src/com/hmily/learning/MyArrayList.java @@ -0,0 +1,91 @@ +package com.hmily.learning; + +public class MyArrayList implements List,Iterator{ + + private int size = 0; + + private Object[] elementData = new Object[100]; + + /** + * Ԫ + */ + public void add(Object o){ + if(size==elementData.length){ + Object[] newElementData = new Object[elementData.length+1]; + for(int i=0;iindex;i--){ + elementData[i]=elementData[i-1]; + } + elementData[index]=o; + size++; + } + /** + * ȡԪ + */ + public Object get(int index){ + if(index>=size()||index<0){ + throw new ArrayIndexOutOfBoundsException(); + } + return elementData[index]; + } + /** + * ƳԪ + */ + public Object remove(int index){ + if(index<0||index>size()){ + throw new ArrayIndexOutOfBoundsException(); + } + Object o=elementData[index]; + for(int i=index;i + + + + + + + + diff --git a/group10/875867419/.gitignore b/group10/875867419/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group10/875867419/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group10/875867419/.project b/group10/875867419/.project new file mode 100644 index 0000000000..64a356de63 --- /dev/null +++ b/group10/875867419/.project @@ -0,0 +1,17 @@ + + + coding2017 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group10/875867419/src/com/work/week01/MyArrayList.java b/group10/875867419/src/com/work/week01/MyArrayList.java new file mode 100644 index 0000000000..cbd64ec9c9 --- /dev/null +++ b/group10/875867419/src/com/work/week01/MyArrayList.java @@ -0,0 +1,203 @@ +package com.work.week01; + +import java.io.Serializable; +import java.util.Arrays; + +/** + * ʵListӿڣķʽʵԼArrayList + * @author denghuaijun + * + * @param + */ +public class MyArrayList implements MyList,Serializable { + + private static final long serialVersionUID = 4145346362382387995L; + + /** + * ĬϴС + */ + private static final int DEFAULT_CAPACITY = 10; + + /** + * ĬϿ + */ + private static final Object[] EMPTY_ELEMENTDATA = {}; + + transient Object[] elementData; + + /** + * С + */ + private int size; + + public MyArrayList(){ + this.elementData = EMPTY_ELEMENTDATA; + } + + public MyArrayList(int capacity){ + if(capacity > 0){ + this.elementData = new Object[capacity]; + }else if(capacity == 0){ + this.elementData = EMPTY_ELEMENTDATA; + }else{ + throw new IllegalArgumentException("Ƿ"); + } + } + + private void ensureCapacity(int minCapacity){ + if(this.elementData == EMPTY_ELEMENTDATA){ + minCapacity = Math.max(minCapacity, DEFAULT_CAPACITY); + } + if(minCapacity > elementData.length){//λô鳤 + grow(minCapacity); + } + } + + private void grow(int minCapacity){ + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + (oldCapacity >> 1); + if(newCapacity < minCapacity){ + newCapacity = minCapacity; + } + elementData = Arrays.copyOf(elementData, newCapacity); + } + + @Override + public boolean add(E element) { + ensureCapacity(size + 1); + elementData[size++] = element; + return true; + } + + @Override + public void add(int index, E element) { + //ȷindexǷԽ + checkAddRange(index); + //ȷ鳤Ƿ㹻 + ensureCapacity(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = element; + size++; + } + + private void checkAddRange(int index){ + if(index < 0 || index > size){//index == size Ԫ + throw new IndexOutOfBoundsException("Խ"); + } + } + + @SuppressWarnings("unchecked") + @Override + public E get(int index) { + checkRange(index); + return (E) elementData[index]; + } + + private void checkRange(int index){ + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException("Խ"); + } + } + + @SuppressWarnings("unchecked") + @Override + public E remove(int index) { + checkRange(index); + E element = (E) elementData[index]; + int numMoved = size - index - 1; + if(numMoved > 0){ + System.arraycopy(elementData, index + 1, elementData, index, numMoved); + } + elementData[size--] = null; + return element; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + public int indexOf(Object o) { + if(o == null){ + for(int i=0;i=0;i--){ + if(elementData[i] == null){ + return i; + } + } + }else{ + for(int i=size-1;i>=0;i--){ + if(o.equals(elementData[i])){ + return i; + } + } + } + return -1; + } + + @Override + public MyIterator iterator() { + return new MyIter(); + } + + private class MyIter implements MyIterator{ + + int flag = -1; + + public MyIter(){ + flag = size; //鳤 + } + + @Override + public boolean hasNext() { + return flag > 0; + } + + @SuppressWarnings("unchecked") + @Override + public E next() { + if(!hasNext()){ + throw new IndexOutOfBoundsException("ֵ鷶Χ"); + } + return (E) elementData[size-(flag--)]; + } + + } + public static void main(String[] args) { + MyArrayList array = new MyArrayList(); + array.add("1"); + array.add("2"); + array.add("3"); + array.add("4"); + array.remove(2); + array.add(2, "1"); + System.out.println("size="+array.size()); + System.out.println("indexOf(3)="+array.indexOf("3")); + System.out.println("lastIndexOf(1)="+array.lastIndexOf("1")); + MyIterator itr = array.iterator(); + while(itr.hasNext()){ + System.out.println(itr.next()); + } + } +} diff --git a/group10/875867419/src/com/work/week01/MyBinaryTree.java b/group10/875867419/src/com/work/week01/MyBinaryTree.java new file mode 100644 index 0000000000..50fae26840 --- /dev/null +++ b/group10/875867419/src/com/work/week01/MyBinaryTree.java @@ -0,0 +1,82 @@ +package com.work.week01; + +public class MyBinaryTree { + + private MyBinaryTreeNode parent; + + public MyBinaryTree(){ + this.parent = new MyBinaryTreeNode(null, null, null); + } + + public void insertNode(E element){ + MyBinaryTreeNode node = new MyBinaryTreeNode(element, null, null); + if(parent.element == null){ + parent = node; + return; + } + insertNode(parent, node); + } + + private void insertNode(MyBinaryTreeNode parentNode, MyBinaryTreeNode newNode){ + if(parentNode.compareTo(newNode) <= 0){// + if(parentNode.right == null){ + parentNode.right = newNode; + }else{ + insertNode(parentNode.right, newNode); + } + }else{ + if(parentNode.left == null){ + parentNode.left = newNode; + }else{ + insertNode(parentNode.left, newNode); + } + } + } + + private void printNode(MyBinaryTreeNode node, int count){ + if(node.left != null){ + printNode(node.left, count++); + } + if(node.right != null){ + printNode(node.right, count++); + } + for(int i=0;i implements Comparable> { + + private T element; + private MyBinaryTreeNode left; + private MyBinaryTreeNode right; + + public MyBinaryTreeNode(T element, MyBinaryTreeNode left, MyBinaryTreeNode right){ + this.element = element; + this.left = left; + this.right = right; + } + + @Override + public int compareTo(MyBinaryTreeNode o) { + Integer src = (Integer) this.element; + Integer dest = (Integer) o.element; + return src.compareTo(dest); + } + } + + public static void main(String[] args) { + MyBinaryTree tree = new MyBinaryTree(); + tree.insertNode(5); + tree.insertNode(7); + tree.insertNode(3); + tree.insertNode(9); + tree.insertNode(4); + tree.printTree(); + } +} diff --git a/group10/875867419/src/com/work/week01/MyIterator.java b/group10/875867419/src/com/work/week01/MyIterator.java new file mode 100644 index 0000000000..18b5222297 --- /dev/null +++ b/group10/875867419/src/com/work/week01/MyIterator.java @@ -0,0 +1,6 @@ +package com.work.week01; + +public interface MyIterator { + boolean hasNext(); + E next(); +} diff --git a/group10/875867419/src/com/work/week01/MyLinkedList.java b/group10/875867419/src/com/work/week01/MyLinkedList.java new file mode 100644 index 0000000000..0c252d8713 --- /dev/null +++ b/group10/875867419/src/com/work/week01/MyLinkedList.java @@ -0,0 +1,169 @@ +package com.work.week01; + +import java.io.Serializable; + + +public class MyLinkedList implements MyList, Serializable{ + + private static final long serialVersionUID = 8700137302944494769L; + + transient int size = 0; + + transient MyNode head; + transient MyNode last; + + public MyLinkedList(){ + head = new MyNode(null, null); + last = new MyNode(null, null); + } + + @Override + public boolean add(E element) { + if(head.element == null){ + head = new MyNode(element, null); + last = head; + }else{ + MyNode node = new MyNode(element, null); + last.next = node; + last = node; + } + size++; + return true; + } + + @Override + public void add(int index, E element) { + if(index < 0 || index -size > 0){ + throw new IndexOutOfBoundsException(""); + } + if(index == 0){ + MyNode node = new MyNode(element, null); + node.next = head; + head = node; + }else{ + MyNode leftNode = getIndexNode(index-1); + MyNode node = new MyNode(element, null); + node.next = leftNode.next; + leftNode.next = node; + } + size++; + } + + private MyNode getIndexNode(int index){ + MyNode node = head; + for(int i=0; i= 0){ + throw new IndexOutOfBoundsException(""); + } + MyNode node = getIndexNode(index); + return node.element; + } + + @Override + public E remove(int index) { + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException(""); + } + if(index == 0){//Ƴͷ + MyNode node = head; + head = head.next; + node.next = null; + size--; + return node.element; + }else{ + MyNode leftNode = getIndexNode(index-1); + MyNode node = leftNode.next; //ƳĽڵ + leftNode.next = node.next; + node.next = null; + size--; + return node.element; + } + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + public void addFirst(E element){ + add(0, element); + } + + public void addLast(E element){ + add(size, element); + } + + public void removeFirst(){ + remove(0); + } + + public void removeLast(){ + remove(size-1); + } + + private static class MyNode{ + E element; + MyNode next; + + MyNode(E element, MyNode next) { + this.element = element; + this.next = next; + } + + } + + @Override + public MyIterator iterator() { + return new MyIter(); + } + + private class MyIter implements MyIterator{ + + int flag = 0; + + public MyIter(){ + flag = size; + } + + @Override + public boolean hasNext() { + return flag > 0; + } + + @Override + public E next() { + if(!hasNext()){ + throw new IndexOutOfBoundsException("ֵΧ"); + } + return get(size-(flag--)); + } + } + + public static void main(String[] args) { + MyLinkedList link = new MyLinkedList(); + link.add("1"); + link.add("2"); + link.add("3"); + link.add("4"); + link.add(3, "1"); + link.removeFirst(); + System.out.println("size="+link.size()); + MyIterator itr = link.iterator(); + while(itr.hasNext()){ + System.out.println(itr.next()); + } + link.remove(4); + } +} diff --git a/group10/875867419/src/com/work/week01/MyList.java b/group10/875867419/src/com/work/week01/MyList.java new file mode 100644 index 0000000000..e3dd9f02b5 --- /dev/null +++ b/group10/875867419/src/com/work/week01/MyList.java @@ -0,0 +1,11 @@ +package com.work.week01; + +public interface MyList{ + boolean add(E element); + void add(int index, E element); + E get(int index); + E remove(int index); + int size(); + boolean isEmpty(); + MyIterator iterator(); +} diff --git a/group10/875867419/src/com/work/week01/MyQueue.java b/group10/875867419/src/com/work/week01/MyQueue.java new file mode 100644 index 0000000000..6466e011df --- /dev/null +++ b/group10/875867419/src/com/work/week01/MyQueue.java @@ -0,0 +1,38 @@ +package com.work.week01; + +public class MyQueue { + private MyArrayList elementData; + + public MyQueue(){ + elementData = new MyArrayList(); + } + + public void enQueue(E element){// + elementData.add(element); + } + + public E deQuene(){// Ƚȳ + return elementData.remove(0); + } + + public int size(){ + return elementData.size(); + } + + public boolean isEmpty(){ + return elementData.isEmpty(); + } + + public static void main(String[] args) { + MyQueue queue = new MyQueue(); + queue.enQueue("1"); + queue.enQueue("2"); + queue.enQueue("3"); + queue.enQueue("4"); + queue.enQueue("5"); + System.out.println("size="+queue.size()); + while(!queue.isEmpty()){ + System.out.println(queue.deQuene()); + } + } +} diff --git a/group10/875867419/src/com/work/week01/MyStack.java b/group10/875867419/src/com/work/week01/MyStack.java new file mode 100644 index 0000000000..2db514217b --- /dev/null +++ b/group10/875867419/src/com/work/week01/MyStack.java @@ -0,0 +1,43 @@ +package com.work.week01; + +public class MyStack { + private MyArrayList elementData; + + public MyStack(){ + elementData = new MyArrayList<>(); + } + + public void push(E element){ + elementData.add(element); + } + + public E pop(){ //ƳջԪ ȳ + return elementData.remove(elementData.size() - 1); + } + + public E peek(){ //ȡջԪ + return elementData.get(elementData.size() - 1); + } + + public int size(){ + return elementData.size(); + } + + public boolean isEmpty(){ + return elementData.isEmpty(); + } + + public static void main(String[] args) { + MyStack stack = new MyStack(); + stack.push("1"); + stack.push("2"); + stack.push("3"); + stack.push("4"); + stack.push("5"); + System.out.println("size="+stack.size()); + System.out.println("peekջԪ="+stack.peek()); + while(!stack.isEmpty()){ + System.out.println("popջԪ"+stack.pop()); + } + } +} diff --git "a/group10/875867419/src/com/work/week01/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" "b/group10/875867419/src/com/work/week01/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" new file mode 100644 index 0000000000..5c63425fba --- /dev/null +++ "b/group10/875867419/src/com/work/week01/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" @@ -0,0 +1 @@ +ҵַhttps://my.oschina.net/u/3080511/blog/846172 \ No newline at end of file diff --git a/group10/875867419/src/com/work/week02/ArrayUtil.java b/group10/875867419/src/com/work/week02/ArrayUtil.java new file mode 100644 index 0000000000..9bff4d3750 --- /dev/null +++ b/group10/875867419/src/com/work/week02/ArrayUtil.java @@ -0,0 +1,198 @@ +package com.work.week02; + +/** + * ڶݽṹҵ + * @author denghuaijun + * + */ +public class ArrayUtil { + + /** + * һa , Ըֵû + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static int[] reverseArray(int[] origin){ + int[] dest = new int[origin.length]; + for(int i=0;i array2[j]){ + dest[k++] = array2[j++]; + continue; + } + } + //ֻʣarray1ʱ + while(i < array1.length){ + dest[k++] = array1[i++]; + } + //ֻʣarray2ʱ + while(j < array2.length){ + dest[k++] = array2[j++]; + } + return removeZero(dest); + } + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ + * oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int [] oldArray, int size){ + int newLength = oldArray.length + size; + int[] newArray = new int[newLength]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ + * 磬 max = 15 , 򷵻صӦΪ [11235813] + * max = 1, 򷵻ؿ [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + int[] dest = null; + if(max == 1){ + return dest; + } + dest = new int[max+3]; + dest[0] = dest[1] = 1; + for(int i=2; i parameters){ + View view = new View(); + try{ + StrutsXmlDao dao = loadXmlByDom4j(actionName); + view = reflectCreateObj(dao, parameters); + }catch(Exception e) { + e.printStackTrace(); + } + return view; + } + + /** + * 读取xml文件 + * @throws DocumentException + */ + @SuppressWarnings("unchecked") + private static StrutsXmlDao loadXmlByDom4j(String actionName) throws DocumentException{ + StrutsXmlDao dao = new StrutsXmlDao(); + SAXReader reader = new SAXReader(); //创建SAXReader对象 + Document doc = reader.read(new File("src/com/work/week02/struts.xml")); //创建Document对象 + Element root = doc.getRootElement(); //获取根节点 + + List list = root.elements(); + for (Element element : list) { + if(element.attributeValue("name").equals(actionName)){ + dao.setActionName(element.attributeValue("name")); + dao.setActionClass(element.attributeValue("class")); + List branchs = element.elements(); + List> actionResult = new ArrayList>(); + for (Element branch : branchs) { + Map map = new HashMap(); + map.put(branch.attributeValue("name"), branch.getTextTrim()); + actionResult.add(map); + } + dao.setActionResult(actionResult); + } + + } + + return dao; + } + + /** + * 通过反射创建指定对象 + * @throws ClassNotFoundException + * @throws IllegalAccessException + * @throws InstantiationException + * @throws SecurityException + * @throws NoSuchMethodException + * @throws InvocationTargetException + * @throws IllegalArgumentException + */ + private static View reflectCreateObj(StrutsXmlDao dao, Map parameters) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{ + View view = new View(); + Class clazz = Class.forName(dao.getActionClass()); + //实例化对象 + Object obj = clazz.newInstance(); + //调用set方法设置参数 + Set keys = parameters.keySet(); + for (String key : keys) { + String value = parameters.get(key); + Method setMethod = clazz.getDeclaredMethod("set"+key.substring(0, 1).toUpperCase()+key.substring(1), new Class[]{String.class}); + setMethod.invoke(obj, value); + } + + //调用execute()方法执行 + Method execute = clazz.getMethod("execute"); + Object reuslt = execute.invoke(obj); //execute()方法返回值 + List> actionResult = dao.getActionResult(); + //获取返回值对应的跳转jsp + for (Map map : actionResult) { + if(map.containsKey(reuslt)){ + view.setJsp(map.get(reuslt).toString()); + } + } + + Map params = new HashMap(); + //调用get方法将参数存入view中 + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + String name = field.getName(); + Method getMethod = clazz.getDeclaredMethod("get"+name.substring(0, 1).toUpperCase()+name.substring(1)); + String value = getMethod.invoke(obj).toString(); + params.put(name, value); + } + view.setParameters(params); + + return view; + } +} diff --git a/group10/875867419/src/com/work/week02/StrutsTest.java b/group10/875867419/src/com/work/week02/StrutsTest.java new file mode 100644 index 0000000000..547c32d52f --- /dev/null +++ b/group10/875867419/src/com/work/week02/StrutsTest.java @@ -0,0 +1,40 @@ +package com.work.week02; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //ԤIJһ + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group10/875867419/src/com/work/week02/StrutsXmlDao.java b/group10/875867419/src/com/work/week02/StrutsXmlDao.java new file mode 100644 index 0000000000..d6bb0102dc --- /dev/null +++ b/group10/875867419/src/com/work/week02/StrutsXmlDao.java @@ -0,0 +1,49 @@ +package com.work.week02; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public class StrutsXmlDao implements Serializable { + + private static final long serialVersionUID = -3117497421210403602L; + + private String actionName; + private String actionClass; + private List> actionResult; + + public StrutsXmlDao(){ + super(); + } + + public String getActionName() { + return actionName; + } + + public void setActionName(String actionName) { + this.actionName = actionName; + } + + public String getActionClass() { + return actionClass; + } + + public void setActionClass(String actionClass) { + this.actionClass = actionClass; + } + + public List> getActionResult() { + return actionResult; + } + + public void setActionResult(List> actionResult) { + this.actionResult = actionResult; + } + + @Override + public String toString() { + return "StrutsXmlDao [actionName=" + actionName + ", actionClass=" + actionClass + ", actionResult=" + + actionResult + "]"; + } + +} diff --git a/group10/875867419/src/com/work/week02/View.java b/group10/875867419/src/com/work/week02/View.java new file mode 100644 index 0000000000..011e38f0fe --- /dev/null +++ b/group10/875867419/src/com/work/week02/View.java @@ -0,0 +1,30 @@ +package com.work.week02; + + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } + @Override + public String toString() { + return "View [jsp=" + jsp + ", parameters=" + parameters + "]"; + } + +} diff --git a/group10/875867419/src/com/work/week02/struts.xml b/group10/875867419/src/com/work/week02/struts.xml new file mode 100644 index 0000000000..c7f2a32073 --- /dev/null +++ b/group10/875867419/src/com/work/week02/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git "a/group10/875867419/src/com/work/week02/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" "b/group10/875867419/src/com/work/week02/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" new file mode 100644 index 0000000000..d1dace46cf --- /dev/null +++ "b/group10/875867419/src/com/work/week02/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" @@ -0,0 +1 @@ +ܲҵӵַhttps://my.oschina.net/u/3080511/blog/851907 \ No newline at end of file diff --git a/group10/904627477/.classpath b/group10/904627477/.classpath new file mode 100644 index 0000000000..7e505633a9 --- /dev/null +++ b/group10/904627477/.classpath @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/group10/904627477/.gitignore b/group10/904627477/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group10/904627477/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group10/904627477/.project b/group10/904627477/.project new file mode 100644 index 0000000000..48dadabda5 --- /dev/null +++ b/group10/904627477/.project @@ -0,0 +1,23 @@ + + + testGit + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/group10/904627477/.settings/org.eclipse.jdt.core.prefs b/group10/904627477/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..ec4300d5d0 --- /dev/null +++ b/group10/904627477/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group10/904627477/.settings/org.eclipse.m2e.core.prefs b/group10/904627477/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000..f897a7f1cb --- /dev/null +++ b/group10/904627477/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/group10/904627477/pom.xml b/group10/904627477/pom.xml new file mode 100644 index 0000000000..7c3681d8d4 --- /dev/null +++ b/group10/904627477/pom.xml @@ -0,0 +1,40 @@ + + 4.0.0 + testGit + testGit + 0.0.1-SNAPSHOT + + + + + + + dom4j + dom4j + 1.6.1 + + + + + + src + + + src + + **/*.java + + + + + + maven-compiler-plugin + 3.1 + + 1.7 + 1.7 + + + + + \ No newline at end of file diff --git a/group10/904627477/src/com/coding/ArrayList.java b/group10/904627477/src/com/coding/ArrayList.java new file mode 100644 index 0000000000..c37d1b7bc4 --- /dev/null +++ b/group10/904627477/src/com/coding/ArrayList.java @@ -0,0 +1,107 @@ +package com.coding; + +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + private void addLength(){ + int len = elementData.length; + Object[] temp = new Object[len+50]; + for(int i=0;isize()){ + throw new IndexOutOfBoundsException(); + } + if(size==elementData.length){ + addLength(); + } + for(int i=size;i>index;i--){ + elementData[i] = elementData[i-1]; + } + elementData[index] = o; + size++; + } + + public Object get(int index){ + if(index<0||index>=size()){ + throw new IndexOutOfBoundsException(); + } + return elementData[index]; + } + + public Object remove(int index){ + if(index<0||index>=size()){ + throw new IndexOutOfBoundsException(); + } + Object temp = elementData[index]; + for (int i = index; i < size-1; i++) { + elementData[i] = elementData[i+1]; + } + elementData[size-1] = null; + size--; + return temp; + } + + public int size(){ + return this.size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + + private Object[] array; + private int index; + + public ArrayListIterator(){ + array = new Object[size]; + index = 0; + for (int i = 0; i < size; i++) { + array[i] = elementData[i]; + } + } + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + if(index>=0&&index=array.length){ + throw new NoSuchElementException(); + } + Object temp = array[index]; + index ++; + return temp; + } + + } + + +} diff --git a/group10/904627477/src/com/coding/BinaryTreeNode.java b/group10/904627477/src/com/coding/BinaryTreeNode.java new file mode 100644 index 0000000000..66a43d937d --- /dev/null +++ b/group10/904627477/src/com/coding/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group10/904627477/src/com/coding/Iterator.java b/group10/904627477/src/com/coding/Iterator.java new file mode 100644 index 0000000000..7533c97158 --- /dev/null +++ b/group10/904627477/src/com/coding/Iterator.java @@ -0,0 +1,7 @@ +package com.coding; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group10/904627477/src/com/coding/LinkedList.java b/group10/904627477/src/com/coding/LinkedList.java new file mode 100644 index 0000000000..2db03a03d5 --- /dev/null +++ b/group10/904627477/src/com/coding/LinkedList.java @@ -0,0 +1,175 @@ +package com.coding; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + addLast(o); + } + + public void add(int index , Object o){ + Node node = new Node(); + node.data = o; + if(index==0){ + addFirst(o); + return ; + } + Node before = getNode(index-1); + Node next = before.next; + before.next = node; + node.next = next; + } + + private Node getLastNode(){ + Node temp = head; + if(head!=null){ + while(true){ + if(temp.next!=null){ + temp = temp.next; + }else{ + break; + } + } + }else{ + throw new NoSuchElementException(); + } + return temp; + } + + private Node getNode(int index){ + if(index<0){ + throw new IndexOutOfBoundsException(); + } + int i = 0; + Node temp = head; + while(true){ + if(temp==null){ + throw new IndexOutOfBoundsException(); + } + if(i==index){ + break; + }else{ + i++; + temp = temp.next; + } + } + return temp; + } + + public Object get(int index){ + Node node = getNode(index); + return node.data; + } + + public Object remove(int index){ + if(index==0){ + removeFirst(); + } + Node before = getNode(index-1); + Node temp = getNode(index); + before.next = temp.next; + return temp.data; + } + + public int size(){ + int size = 0; + Node temp = head; + while(true){ + if(temp==null){ + break; + }else{ + size++; + temp = temp.next; + } + } + return size; + } + + public void addFirst(Object o){ + Node node = new Node(); + node.data = o; + node.next = head; + head = node; + } + + public void addLast(Object o){ + Node node = new Node(); + node.data = o; + if(head==null){ + head = node; + return; + } + Node last = getLastNode(); + last.next = node; + } + public Object removeFirst(){ + if(head == null){ + throw new NoSuchElementException(); + } + Object obj = head.data; + head = head.next; + return obj; + } + public Object removeLast(){ + if(head == null){ + throw new NoSuchElementException(); + } + if(head.next == null){ + return removeFirst(); + } + Node before = head; + Node temp = head.next; + while(true){ + if(temp.next==null){ + break; + }else{ + before = temp; + temp = temp.next; + } + } + before.next = null; + return temp.data; + } + + public Iterator iterator(){ + return new LinkedIterator(); + } + + + private static class Node{ + Object data; + Node next; + } + + private class LinkedIterator implements Iterator{ + + private Node node; + + public LinkedIterator(){ + node = head; + } + + @Override + public boolean hasNext() { + if(node!=null){ + return true; + } + return false; + } + + @Override + public Object next() { + if(node==null){ + throw new NoSuchElementException(); + }else{ + Object obj = node.data; + node = node.next; + return obj; + } + } + + } +} diff --git a/group10/904627477/src/com/coding/List.java b/group10/904627477/src/com/coding/List.java new file mode 100644 index 0000000000..d39f4eea4c --- /dev/null +++ b/group10/904627477/src/com/coding/List.java @@ -0,0 +1,9 @@ +package com.coding; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group10/904627477/src/com/coding/Queue.java b/group10/904627477/src/com/coding/Queue.java new file mode 100644 index 0000000000..2ab71b6240 --- /dev/null +++ b/group10/904627477/src/com/coding/Queue.java @@ -0,0 +1,28 @@ +package com.coding; + +public class Queue { + + private ArrayList elementData = new ArrayList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + if(elementData.size()==0){ + return null; + } + return elementData.remove(0); + } + + public boolean isEmpty(){ + if(elementData.size()==0){ + return true; + } + return false; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group10/904627477/src/com/coding/Stack.java b/group10/904627477/src/com/coding/Stack.java new file mode 100644 index 0000000000..b4eed83777 --- /dev/null +++ b/group10/904627477/src/com/coding/Stack.java @@ -0,0 +1,36 @@ +package com.coding; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if(elementData.size()==0){ + throw new EmptyStackException(); + } + Object obj = elementData.remove(size()-1); + return obj; + } + + public Object peek(){ + if(elementData.size()==0){ + throw new EmptyStackException(); + } + Object obj = elementData.get(size()-1); + return obj; + } + public boolean isEmpty(){ + if(elementData.size()==0){ + return true; + } + return false; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group10/904627477/src/com/coding/array/ArrayUtil.java b/group10/904627477/src/com/coding/array/ArrayUtil.java new file mode 100644 index 0000000000..8a46673ffa --- /dev/null +++ b/group10/904627477/src/com/coding/array/ArrayUtil.java @@ -0,0 +1,215 @@ +package com.coding.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int len = origin.length; + for (int i = 0; i < len/2 ; i++) { + int temp = origin[len-1-i]; + origin[len-1-i] = origin[i]; + origin[i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int[] tempArr = new int[oldArray.length]; + int size = 0; + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i]!=0){ + tempArr[size] = oldArray[i]; + size++; + } + } + int[] newArr = new int[size]; + System.arraycopy(tempArr, 0, newArr, 0, size); + return newArr; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int[] arr3 = new int[array1.length+array2.length]; + int len1 = array1.length; + int len2 = array2.length; + int i=0,j=0,k=0; + while(true){ + if(iarray2[j]){ + arr3[k++]=array2[j++]; + }else{ + arr3[k++] = array1[i++]; + j++; + } + }else if(i>=len1&&j=len2){ + arr3[k++]=array1[i++]; + }else{ + break; + } + } + int[] newArr = new int[k]; + System.arraycopy(arr3, 0, newArr, 0, k); + return newArr; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + if(size<0){ + throw new IllegalArgumentException(); + } + int[] newArr = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArr[i] = oldArray[i]; + } + return newArr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if(max<1){ + throw new IllegalArgumentException(); + } + int[] arr = new int[0]; + int temp = 1; + for (int i = 0; max > temp; i++) { + arr = grow(arr, 1); + arr[arr.length-1] = temp; + temp = getFibonacci(i+1); + } + return arr; + } + + public int getFibonacci(int n){ + if(n==0||n==1){ + return 1; + }else{ + return getFibonacci(n-1)+getFibonacci(n-2); + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + //对大于1的自然数n,如果用2到 开根号n 之间的所有整数去除,均无法整除,则n为质数 + public int[] getPrimes(int max){ + int[] arr = new int[0]; + if(max<2){ + return arr; + } + for(int i=2;i1; + } + for(int i=2;i<=Math.sqrt(n);i++){ + if(n%i==0){ + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int[] arr = new int[0]; + if(max<1){ + return arr; + } + for (int i = 0; i < max; i++) { + if(isPerfectNumber(i)){ + arr = grow(arr, 1); + arr[arr.length-1] = i; + } + } + return arr; + } + + public boolean isPerfectNumber(int n){ + if(n<=1){ + return false; + } + int result = 1; + for (int i = 2; i <= Math.sqrt(n); i++) { + if(n%i==0){ + result = result + i + n/i; + } + } + if(result==n){ + return true; + }else{ + return false; + } + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + String result = ""; + for (int i = 0; i < array.length; i++) { + result = result + array[i] + seperator; + } + int index = result.lastIndexOf(seperator); + return result.substring(0, index); + } + + +} diff --git a/group10/904627477/src/com/coding/litestruts/LoginAction.java b/group10/904627477/src/com/coding/litestruts/LoginAction.java new file mode 100644 index 0000000000..39354518df --- /dev/null +++ b/group10/904627477/src/com/coding/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coding.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group10/904627477/src/com/coding/litestruts/ReflectUtil.java b/group10/904627477/src/com/coding/litestruts/ReflectUtil.java new file mode 100644 index 0000000000..9b7aaa27c2 --- /dev/null +++ b/group10/904627477/src/com/coding/litestruts/ReflectUtil.java @@ -0,0 +1,145 @@ +package com.coding.litestruts; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.regex.Pattern; + +public class ReflectUtil { + + + public static Object exectue(Object o,String methodName){ + Object result = null; + try { + Method m = o.getClass().getMethod(methodName); + result = m.invoke(o); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return result; + } + + public static Object getObject(String className, Map parameters){ + Object action = null; + try { + action = Class.forName(className).newInstance(); + if(parameters==null){ + return action; + } + Iterator ite = parameters.keySet().iterator(); + while(ite.hasNext()){ + String name = ite.next(); + String value = parameters.get(name); + setAttribute(action, name, value); + } + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return action; + } + + /** + * + * @param o + * @param name + * @param value + */ + public static void setAttribute(Object o,String name,String value){ + try { + Class c = o.getClass(); + String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); + Class attType = c.getDeclaredField(name).getType(); + Method m = c.getMethod(methodName, attType); + m.invoke(o, typeCase(value, attType)); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + public static Map getAttributes(Object o){ + Map param = new HashMap(); + Class c = o.getClass(); + Field[] attrs = c.getDeclaredFields(); + for (Field att : attrs) { + String name = att.getName(); + String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1); + Object reslut = exectue(o, methodName); + if(reslut!=null){ + param.put(name, reslut); + } + } + return param; + } + + /** + * 将Sting类型数据转换成指定类型数据,暂支持简单和常见类型 + * @param oldValue 需要转换的数据值 + * @param type 目标类型 + * @return 返回转换后的数据 + */ + public static Object typeCase(String oldValue,Class type){ + Object value = null; + String typeName = type.getName(); + if("int".equals(typeName)){ + value = Integer.parseInt(oldValue); + }else if("float".equals(typeName)){ + value = Float.parseFloat(oldValue); + }else if("boolean".equals(typeName)){ + value = Boolean.parseBoolean(oldValue); + }else if("long".equals(typeName)){ + value = Long.parseLong(oldValue); + }else if("byte".equals(typeName)){ + value = Byte.parseByte(oldValue); + }else if("double".equals(typeName)){ + value = Double.parseDouble(oldValue); + }else if("short".equals(typeName)){ + value = Short.parseShort(oldValue); + }else if("char".equals(typeName)){ + value = oldValue.charAt(0); + }else if("java.util.Date".equals(typeName)){ + try { + if(Pattern.matches("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{3}", oldValue)){ + value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").parse(oldValue); + }else if(Pattern.matches("[0-9]{4}-[0-9]{2}-[0-9]{2}", oldValue)){ + value = new SimpleDateFormat("yyyy-MM-dd").parse(oldValue); + }else{ + value = null; + } + } catch (ParseException e) { + e.printStackTrace(); + } + }else if("java.lang.String".equals(typeName)){ + value = oldValue; + }else{ + throw new ClassCastException(); + } + return value; + } +} diff --git a/group10/904627477/src/com/coding/litestruts/Struts.java b/group10/904627477/src/com/coding/litestruts/Struts.java new file mode 100644 index 0000000000..211b5cafab --- /dev/null +++ b/group10/904627477/src/com/coding/litestruts/Struts.java @@ -0,0 +1,106 @@ +package com.coding.litestruts; + +import java.util.List; +import java.util.Map; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + + +public class Struts { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + public static View runAction(String actionName, Map parameters) { + if(actionName==null){ + return null; + } + View view = new View(); + String path = getStrutsXMLPath(); + Element actionEle = getActionElement(path, actionName); + if(actionEle==null){ + return null; + } + String className = actionEle.attributeValue("class"); + Object action = ReflectUtil.getObject(className, parameters); + if(action==null){ + return null; + } + String methodName = actionEle.attributeValue("method"); + methodName = methodName==null?"execute":methodName; + Object reslut = ReflectUtil.exectue(action, methodName); + String jsp = getElementJsp(actionEle, reslut!=null?reslut.toString():null); + view.setJsp(jsp); + view.setParameters(ReflectUtil.getAttributes(action)); + return view; + } + + private static String getStrutsXMLPath(){ + String path = Struts.class.getResource("").getPath()+"struts.xml"; + path = path.substring(1); + return path; + } + + @SuppressWarnings("unchecked") + public static Element getActionElement(String path,String actionName){ + if(path==null||actionName==null){ + return null; + } + Element actionEle = null; + try { + SAXReader read = new SAXReader(); + Document doc = read.read(path); + Element root = doc.getRootElement(); + List actions = root.elements("action"); + for (Element element : actions) { + String name = element.attributeValue("name"); + if(actionName.equals(name)){ + actionEle = element; + break; + } + } + } catch (SecurityException e) { + e.printStackTrace(); + } catch (DocumentException e) { + e.printStackTrace(); + } + return actionEle; + } + + @SuppressWarnings("unchecked") + public static String getElementJsp(Element actionEle, String reslut) { + String jsp = null; + if(reslut!=null){ + List results = actionEle.elements("result"); + for (Element reslutEle : results) { + String resName = reslutEle.attributeValue("name"); + resName = resName==null?"success":resName; + if(reslut.equals(resName)){ + jsp = reslutEle.getText().trim(); + } + } + } + return jsp; + } + +} diff --git a/group10/904627477/src/com/coding/litestruts/StrutsTest.java b/group10/904627477/src/com/coding/litestruts/StrutsTest.java new file mode 100644 index 0000000000..e3a5a79185 --- /dev/null +++ b/group10/904627477/src/com/coding/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coding.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group10/904627477/src/com/coding/litestruts/View.java b/group10/904627477/src/com/coding/litestruts/View.java new file mode 100644 index 0000000000..4e8f89b02b --- /dev/null +++ b/group10/904627477/src/com/coding/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coding.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group10/904627477/src/com/coding/litestruts/struts.xml b/group10/904627477/src/com/coding/litestruts/struts.xml new file mode 100644 index 0000000000..f160e540f8 --- /dev/null +++ b/group10/904627477/src/com/coding/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group10/904627477/src/com/coding/test/ArrayListTest.java b/group10/904627477/src/com/coding/test/ArrayListTest.java new file mode 100644 index 0000000000..94c8aef0be --- /dev/null +++ b/group10/904627477/src/com/coding/test/ArrayListTest.java @@ -0,0 +1,71 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coding.ArrayList; +import com.coding.Iterator; + +public class ArrayListTest { + + private static ArrayList list = new ArrayList(); + + @Before + public void setUp() throws Exception { + list = new ArrayList(); + list.add("1111"); + list.add("2222"); + list.add("3333"); + } + + @After + public void tearDown() throws Exception { + list = null; + } + + @Test + public void testAddObject() { + list.add("4444"); + assertEquals("4444", list.get(3)); + assertEquals(4, list.size()); + } + + @Test + public void testAddIntObject() { + list.add(1, "4444"); + assertEquals("4444", list.get(1)); + assertEquals(4, list.size()); + assertEquals("2222", list.get(2)); + } + + @Test + public void testGet() { + assertEquals("1111", list.get(0)); + } + + @Test + public void testRemove() { + Object sss = list.remove(1); + assertEquals(2, list.size()); + assertEquals("2222", sss); + } + + @Test + public void testSize() { + assertEquals(3, list.size()); + } + + @Test + public void testIterator() { + Iterator it = list.iterator(); + assertEquals(true, it.hasNext()); + assertEquals("1111", it.next()); + assertEquals("2222", it.next()); + assertEquals("3333", it.next()); + assertEquals(false, it.hasNext()); + } + +} diff --git a/group10/904627477/src/com/coding/test/ArrayUtilTest.java b/group10/904627477/src/com/coding/test/ArrayUtilTest.java new file mode 100644 index 0000000000..d3b8fc3aa7 --- /dev/null +++ b/group10/904627477/src/com/coding/test/ArrayUtilTest.java @@ -0,0 +1,128 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coding.array.ArrayUtil; + +public class ArrayUtilTest { + + private ArrayUtil arrayUtil; + + @Before + public void setUp() throws Exception { + this.arrayUtil = new ArrayUtil(); + } + + @After + public void tearDown() throws Exception { + this.arrayUtil = null; + } + + @Test + public void testReverseArray() { + int[] origin1 = {7, 9 , 30, 3}; + int[] origin2 = {7, 9, 30, 3, 4}; + this.arrayUtil.reverseArray(origin1); + assertEquals(3, origin1[0]); + assertEquals(30, origin1[1]); + assertEquals(9, origin1[2]); + assertEquals(7, origin1[3]); + this.arrayUtil.reverseArray(origin2); + assertEquals(4, origin2[0]); + assertEquals(3, origin2[1]); + assertEquals(30, origin2[2]); + assertEquals(9, origin2[3]); + assertEquals(7, origin2[4]); + } + + @Test + public void testRemoveZero() { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] newArr = this.arrayUtil.removeZero(oldArr); + assertEquals(12, newArr.length); + assertEquals(6, newArr[4]); + int oldArr1[]={0,0,0,0}; + int[] newArr1 = this.arrayUtil.removeZero(oldArr1); + assertEquals(0, newArr1.length); + } + + @Test + public void testMerge() { + int[] a1 = {3, 5, 7,8}; + int[] a2 = {4, 5, 6,7}; + //[3,4,5,6,7,8] + int[] a3 = this.arrayUtil.merge(a1, a2); + assertEquals(6, a3.length); + assertEquals(3, a3[0]); + assertEquals(8, a3[5]); + int[] arr1 = {3, 5, 7}; + int[] arr2 = {9,12,15,19}; + int[] arr3 = this.arrayUtil.merge(arr1, arr2); + int[] arr4 = this.arrayUtil.merge(arr2, arr1); + assertEquals(7, arr3.length); + assertEquals(3, arr3[0]); + assertEquals(19, arr3[6]); + //assertEquals(arr3, arr4); + assertEquals(7, arr4.length); + assertEquals(3, arr4[0]); + assertEquals(19, arr4[6]); + int[] a = {}; + int[] arr = this.arrayUtil.merge(a, a1); + assertEquals(4, arr.length); + assertEquals(3, arr[0]); + assertEquals(8, arr[3]); + } + + @Test + public void testGrow() { + int[] a1 = {2,3,6}; + int[] a2 = this.arrayUtil.grow(a1, 3); + assertEquals(6, a2.length); + assertEquals(3, a1[1]); + assertEquals(0, a2[3]); + int[] a3 = this.arrayUtil.grow(a1, 0); + assertEquals(3, a3.length); + int[] a4 = this.arrayUtil.grow(new int[0], 3); + assertEquals(3, a4.length); + } + + @Test + public void testFibonacci() { + int[] arr = this.arrayUtil.fibonacci(15); + assertEquals(7, arr.length); + assertEquals(13, arr[6]); + int[] arr1 = this.arrayUtil.fibonacci(1); + assertEquals(0, arr1.length); + } + + @Test + public void testGetPrimes() { + int[] arr = this.arrayUtil.getPrimes(23); + assertEquals(8, arr.length); + assertEquals(true, arr[arr.length-1]<23); + int[] arr1 = this.arrayUtil.getPrimes(2); + assertEquals(0, arr1.length); + } + + @Test + public void testGetPerfectNumbers() { + //6 28 496 8128 33550336 + int[] arr = this.arrayUtil.getPerfectNumbers(10000); + assertEquals(4, arr.length); + assertEquals(8128, arr[3]); + } + + @Test + public void testJoin() { + int[] array= {3,8,9}; + String str = this.arrayUtil.join(array, "-"); + assertEquals("3-8-9", str); + String str1 = this.arrayUtil.join(array, "9"); + assertEquals("39899", str1); + } + +} diff --git a/group10/904627477/src/com/coding/test/LinkedListTest.java b/group10/904627477/src/com/coding/test/LinkedListTest.java new file mode 100644 index 0000000000..5241d83a92 --- /dev/null +++ b/group10/904627477/src/com/coding/test/LinkedListTest.java @@ -0,0 +1,118 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coding.Iterator; +import com.coding.LinkedList; + +public class LinkedListTest { + + private static LinkedList link; + + @Before + public void setUp() throws Exception { + link = new LinkedList(); + link.add("111"); + link.add("222"); + link.add("333"); + } + + @After + public void tearDown() throws Exception { + link = null; + } + + @Test + public void testAddObject() { + link.add("444"); + assertEquals(4, link.size()); + assertEquals("444", link.get(3)); + link = new LinkedList(); + link.add("000"); + assertEquals(1, link.size()); + assertEquals("000", link.get(0)); + } + + @Test + public void testAddIntObject() { + link.add(2,"444"); + assertEquals(4, link.size()); + assertEquals("444", link.get(2)); + assertEquals("333", link.get(3)); + assertEquals("222", link.get(1)); + link = new LinkedList(); + link.add(0,"000"); + assertEquals(1, link.size()); + assertEquals("000", link.get(0)); + } + + @Test + public void testGet() { + assertEquals("222", link.get(1)); + } + + @Test + public void testRemove() { + Object obj = link.remove(1); + assertEquals("222", obj); + assertEquals("333", link.get(1)); + assertEquals(2, link.size()); + } + + @Test + public void testSize() { + assertEquals(3, link.size()); + } + + @Test + public void testAddFirst() { + link.addFirst("000"); + assertEquals(4, link.size()); + assertEquals("000", link.get(0)); + link = new LinkedList(); + link.addFirst("000"); + assertEquals(1, link.size()); + assertEquals("000", link.get(0)); + } + + @Test + public void testAddLast() { + link.addLast("444"); + assertEquals(4, link.size()); + assertEquals("444", link.get(3)); + link = new LinkedList(); + link.addLast("444"); + assertEquals(1, link.size()); + assertEquals("444", link.get(0)); + } + + @Test + public void testRemoveFirst() { + Object obj = link.removeFirst(); + assertEquals("111", obj); + assertEquals(2, link.size()); + assertEquals("222", link.get(0)); + } + + @Test + public void testRemoveLast() { + Object obj = link.removeLast(); + assertEquals(2, link.size()); + assertEquals("333", obj); + } + + @Test + public void testIterator() { + Iterator it = link.iterator(); + assertEquals(true, it.hasNext()); + assertEquals("111", it.next()); + assertEquals("222", it.next()); + assertEquals("333", it.next()); + assertEquals(false, it.hasNext()); + } + +} diff --git a/group10/904627477/src/com/coding/test/QueueTest.java b/group10/904627477/src/com/coding/test/QueueTest.java new file mode 100644 index 0000000000..afc63839a1 --- /dev/null +++ b/group10/904627477/src/com/coding/test/QueueTest.java @@ -0,0 +1,53 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coding.Queue; + +public class QueueTest { + + private static Queue queue; + + @Before + public void setUp() throws Exception { + queue = new Queue(); + queue.enQueue("111"); + queue.enQueue("222"); + queue.enQueue("333"); + } + + @After + public void tearDown() throws Exception { + queue = null; + } + + @Test + public void testEnQueue() { + queue.enQueue("444"); + assertEquals(4, queue.size()); + } + + @Test + public void testDeQueue() { + Object obj = queue.deQueue(); + assertEquals(2, queue.size()); + assertEquals("111",obj); + } + + @Test + public void testIsEmpty() { + assertEquals(false, queue.isEmpty()); + queue = new Queue(); + assertEquals(true, queue.isEmpty()); + } + + @Test + public void testSize() { + assertEquals(3, queue.size()); + } + +} diff --git a/group10/904627477/src/com/coding/test/StackTest.java b/group10/904627477/src/com/coding/test/StackTest.java new file mode 100644 index 0000000000..645278b93d --- /dev/null +++ b/group10/904627477/src/com/coding/test/StackTest.java @@ -0,0 +1,61 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coding.Stack; + +public class StackTest { + + private static Stack stack; + + @Before + public void setUp() throws Exception { + stack = new Stack(); + stack.push("111"); + stack.push("222"); + stack.push("333"); + } + + @After + public void tearDown() throws Exception { + stack = null; + } + + @Test + public void testPush() { + stack.push("444"); + assertEquals(4, stack.size()); + assertEquals("444", stack.pop()); + } + + @Test + public void testPop() { + Object obj = stack.pop(); + assertEquals("333", obj); + assertEquals(2, stack.size()); + } + + @Test + public void testPeek() { + Object obj = stack.peek(); + assertEquals("333", obj); + assertEquals(3, stack.size()); + } + + @Test + public void testIsEmpty() { + assertEquals(false, stack.isEmpty()); + stack = new Stack(); + assertEquals(true, stack.isEmpty()); + } + + @Test + public void testSize() { + assertEquals(3,stack.size()); + } + +} diff --git a/group10/904627477/src/com/coding/test/Test.java b/group10/904627477/src/com/coding/test/Test.java new file mode 100644 index 0000000000..e2df68e649 --- /dev/null +++ b/group10/904627477/src/com/coding/test/Test.java @@ -0,0 +1,29 @@ +package com.coding.test; + + + + + +public class Test { + + public static void main(String[] args) { + /*int[] origin = {7, 9 , 30, 3}; + ArrayUtil au = new ArrayUtil(); + au.reverseArray(origin); + for (int i : origin) { + System.out.println(i); + } + */ +/* int a = 5; + System.out.println(5/2); + int[] a1 = new int[0]; + System.out.println(a1.length); + System.out.println(Math.sqrt(2));*/ +// int[] a2 = new ArrayUtil().getPerfectNumbers(100); +// for (int i = 0; i < a2.length; i++) { +// System.out.println(a2[i]); +// } + System.out.println(Test.class.getResource("").getPath()); + } + +} diff --git a/group10/group10.md b/group10/group10.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group10/group10.md @@ -0,0 +1 @@ + diff --git a/group11/1059156023/Array/.classpath b/group11/1059156023/Array/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group11/1059156023/Array/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group11/1059156023/Array/.gitignore b/group11/1059156023/Array/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group11/1059156023/Array/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group11/1059156023/Array/.project b/group11/1059156023/Array/.project new file mode 100644 index 0000000000..1b5c14fe3f --- /dev/null +++ b/group11/1059156023/Array/.project @@ -0,0 +1,17 @@ + + + Array + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group11/1059156023/Array/src/com/coding/basic/ArrayUtil.java b/group11/1059156023/Array/src/com/coding/basic/ArrayUtil.java new file mode 100644 index 0000000000..2b47957623 --- /dev/null +++ b/group11/1059156023/Array/src/com/coding/basic/ArrayUtil.java @@ -0,0 +1,158 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.HashSet; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + for (int i = 0; i < origin.length/2; i++) {//前后交换元素 + int temp = origin[i]; + origin[i] = origin[origin.length-i-1]; + origin[origin.length-i-1]= temp; + } + System.out.println(Arrays.toString(origin));//输出数组 + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int[] arr = new int[oldArray.length]; + int count = 0; + for(int i=0;i set1 = new HashSet(Arrays.asList(array1));//以array1建立集合 + HashSet set2 = new HashSet(Arrays.asList(array2)); + set1.addAll(set2);//求并集 + Integer[] arr = set1.toArray(new Integer[set1.size()]);//获取并集后的数组 + Arrays.sort(arr);//数组排序 + for(int i=0;i + + + + + diff --git a/group11/1059156023/dataStructure/.gitignore b/group11/1059156023/dataStructure/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group11/1059156023/dataStructure/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group11/1059156023/dataStructure/.project b/group11/1059156023/dataStructure/.project new file mode 100644 index 0000000000..35bb23a0fc --- /dev/null +++ b/group11/1059156023/dataStructure/.project @@ -0,0 +1,17 @@ + + + dataStructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group11/1059156023/dataStructure/src/com/coding/basic/ArrayList.java b/group11/1059156023/dataStructure/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..c853dcaea3 --- /dev/null +++ b/group11/1059156023/dataStructure/src/com/coding/basic/ArrayList.java @@ -0,0 +1,71 @@ +package com.coding.basic; + +import java.util.List; + +public class ArrayList implements List{ + private int size; + + //设置一个默认容量,当调用默认构造函数实例化数组后,需要扩容时可用 + private static final int DEFAULT_CAPACITY=10; + + //Integer.MAX_VALUE:2147483647,MAX_ARRAY_SIZE:2147483639 + private static final int MAX_ARRAY_SIZE=Integer.MAX_VALUE-8; + + private Object[] elementData; + + //定义一个默认为空的数组,供默认构造函数使用 + private static final Object[] EMPTY_ELEMENTDATA={}; + + //定义默认构造函数,实例化为空数组 + public ArrayList(){ + this.elementData=EMPTY_ELEMENTDATA; + } + + //定义一个有参的构造函数 + public ArrayList(int initialCapacity){ + if(initialCapacity<0) + throw new IllegalArgumentException("Illegal Capacity:"+initialCapacity); + this.elementData = new Object[initialCapacity]; + } + + //定义add(Object o)方法,默认在数组末尾添加 + public boolean add(Object o){ + //要添加一个数,所以用ensureCapacityInternal()判断size+1个的数,数组是否放得下 + ensureCapacityInternal(size+1); + elementData[size++]=o; + return true; + } + + private void ensureCapacityInternal(int minCapacity) { + if(elementData == EMPTY_ELEMENTDATA) + minCapacity = DEFAULT_CAPACITY; + + //如果需要扩容,则调用grow() + if(minCapacity-elementData.length>0) + grow(minCapacity); + } + + private void grow(int minCapacity) { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity+(oldCapacity>>1); + + //原始长度是0时,即原来是空数组时 + if(newCapacity-minCapacity<0) + newCapacity = minCapacity; + + //如果新的容量超过了数组最大容量,就调用hugeCapacity()把能给的最大容量给它 + if(newCapacity-MAX_ARRAY_SIZE>0) + newCapacity = hugeCapacity(minCapacity); + + + } + + private static int hugeCapacity(int minCapacity) { + if (minCapacity<0) { + throw new OutOfMemoryError(); //抛出内存溢出异常 + } + //如果minCapacity比MAX_ARRAY_SIZE大,则返回int类型所能表示的最大值,否则返回MAX_ARRAY_SIZE + return (minCapacity>MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; + } + +} diff --git a/group11/1059156023/struts/.classpath b/group11/1059156023/struts/.classpath new file mode 100644 index 0000000000..400cc1471c --- /dev/null +++ b/group11/1059156023/struts/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group11/1059156023/struts/.gitignore b/group11/1059156023/struts/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group11/1059156023/struts/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group11/1059156023/struts/.project b/group11/1059156023/struts/.project new file mode 100644 index 0000000000..2c00c2049a --- /dev/null +++ b/group11/1059156023/struts/.project @@ -0,0 +1,17 @@ + + + struts + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group11/1059156023/struts/src/com/coding/basic/LoginAction.java b/group11/1059156023/struts/src/com/coding/basic/LoginAction.java new file mode 100644 index 0000000000..23683995f2 --- /dev/null +++ b/group11/1059156023/struts/src/com/coding/basic/LoginAction.java @@ -0,0 +1,39 @@ +package com.coding.basic; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group11/1059156023/struts/src/com/coding/basic/Struts.java b/group11/1059156023/struts/src/com/coding/basic/Struts.java new file mode 100644 index 0000000000..a0d26a207b --- /dev/null +++ b/group11/1059156023/struts/src/com/coding/basic/Struts.java @@ -0,0 +1,59 @@ +package com.coding.basic; + +import java.io.File; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.junit.experimental.theories.Theories; + +import com.sun.corba.se.impl.orbutil.graph.Node; +import com.sun.org.apache.bcel.internal.classfile.Attribute; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) throws DocumentException { + //创建SAXReader对象 + SAXReader reader = new SAXReader(); + //读取文件 转换成Document + Document document = reader.read(new File("src/com/coding/basic/struts.xml")); + //获取根节点元素对象 + Element root = document.getRootElement(); + //遍历根节点 + listNodes(root); + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + + public static void listNodes(Element node) { + String name; + List list = node.attributes(); + + } + +} diff --git a/group11/1059156023/struts/src/com/coding/basic/StrutsTest.java b/group11/1059156023/struts/src/com/coding/basic/StrutsTest.java new file mode 100644 index 0000000000..5bac52805d --- /dev/null +++ b/group11/1059156023/struts/src/com/coding/basic/StrutsTest.java @@ -0,0 +1,51 @@ +package com.coding.basic; + +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.DocumentException; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class StrutsTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testLoginActionSuccess() throws DocumentException { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws DocumentException { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group11/1059156023/struts/src/com/coding/basic/View.java b/group11/1059156023/struts/src/com/coding/basic/View.java new file mode 100644 index 0000000000..9e479018c8 --- /dev/null +++ b/group11/1059156023/struts/src/com/coding/basic/View.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group11/1059156023/struts/src/com/coding/basic/struts.xml b/group11/1059156023/struts/src/com/coding/basic/struts.xml new file mode 100644 index 0000000000..b3b576c15f --- /dev/null +++ b/group11/1059156023/struts/src/com/coding/basic/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group11/1178243325/DataStructure/build.gradle b/group11/1178243325/DataStructure/build.gradle new file mode 100644 index 0000000000..9c6bc859e6 --- /dev/null +++ b/group11/1178243325/DataStructure/build.gradle @@ -0,0 +1,20 @@ + +apply plugin: 'java' +apply plugin: 'eclipse' + +jar { + from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }} + manifest { + attributes 'Main-Class' : 'com.Main' + } +} + +repositories { + mavenCentral() +} + +dependencies { + compile 'junit:junit:4.12' + compile 'dom4j:dom4j:1.6.1' +} + diff --git a/group11/1178243325/DataStructure/readme.md b/group11/1178243325/DataStructure/readme.md new file mode 100644 index 0000000000..29ad9d5c06 --- /dev/null +++ b/group11/1178243325/DataStructure/readme.md @@ -0,0 +1 @@ +实现基本的数据结构ArrayList,LinkList,Stack,Queue,Tree,Iterator diff --git a/group11/1178243325/DataStructure/src/main/java/com/Main.java b/group11/1178243325/DataStructure/src/main/java/com/Main.java new file mode 100644 index 0000000000..f5e5a36ebd --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/Main.java @@ -0,0 +1,56 @@ +package com; + +import java.util.*; +import com.coderising.litestruts.*; +import com.coderising.array.*; +public class Main { + public static void main(String[] args) { + int[] array = {1, 2, 3, 4, 5}; + System.out.print("reverseArray测试:"); + ArrayUtil.reverseArray(array); + for (int i : array) + System.out.print(i + " "); + System.out.print("\nremoveZero测试:"); + + int[] oldArray = {1, 3, 4, 5, 0, 0, 8 , 0, 9}; + oldArray = ArrayUtil.removeZero(oldArray); + for (int i : oldArray) { + System.out.print(i + " "); + } + + System.out.print("\nmerge测试:"); + int[] a1 = {3, 5,8}; + int[] a2 = {4, 5, 6,7}; + int[] arrays = ArrayUtil.merge(a1, a2); + for (int i : arrays) + System.out.print(i + " "); + + System.out.print("\ngrow测试:"); + + int[] growArray = ArrayUtil.grow(a1, 5); + for (int i : growArray) + System.out.print(i + " "); + + System.out.print("\nfibonacci测试"); + int[] fArray = ArrayUtil.fibonacci(1); + System.out.print(fArray); + System.out.println(); + fArray = ArrayUtil.fibonacci(15); + for (int i : fArray) + System.out.print(i + " "); + System.out.print("\ngetPrimes测试:"); + int[] primesArray = ArrayUtil.getPrimes(23); + for (int i : primesArray) + System.out.print(i + " "); + System.out.print("\ngetPerfectNumbers测试:"); + int[] pArray = ArrayUtil.getPerfectNumbers(100); + for (int i : pArray) + System.out.print(i + " "); + System.out.print("\njoin测试:"); + int[] jArray = new int[]{2, 3, 8}; + System.out.print(ArrayUtil.join(jArray, "-")); + Map map = new HashMap<>(); + Struts.runAction("login", map); + + } +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/array/ArrayUtil.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..75130e53c1 --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/array/ArrayUtil.java @@ -0,0 +1,229 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static void reverseArray(int[] origin){ + if (origin == null) { + return; + } + + int length = origin.length; + int[] temp = new int[length]; + for (int i = 0; i < length; i++) + temp[i] = origin[i]; + for (int i = length - 1, j = 0; i >= 0 && j < length; i--, j++) + origin[j] = temp[i]; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray){ + if (oldArray == null) { + return null; + } + + int zeroCount = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) + zeroCount++; + } + int[] newArray = new int[oldArray.length-zeroCount]; + for (int i = 0, j = 0; i < oldArray.length && j < newArray.length; i++) { + if (oldArray[i] != 0) { + newArray[j] = oldArray[i]; + j++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + if (array1 == null && array2 == null) + return null; + int index1 = 0, index2 = 0; + int[] array3 = new int[array1.length + array2.length]; + int index = 0; + while (index1 != array1.length && index2 != array2.length) { + if (array1[index1] < array2[index2]) { + array3[index++] = array1[index1++]; + } else if (array1[index1] > array2[index2]) { + array3[index++] = array2[index2++]; + } else if (array1[index1] == array2[index2]){ + array3[index++] = array1[index1++]; + index2++; + } + } + + if (index1 == array1.length && index2 != array2.length) { + for (int i = index2; i < array2.length; i++) + array3[index++] = array2[i]; + } else if (index2 == array2.length && index1 != array1.length) { + for (int i = index1; i < array1.length; i++) { + array3[index++] = array1[i]; + } + } + + int[] newArray = new int[index]; + for (int i = 0; i < newArray.length; i++) + newArray[i] = array3[i]; + return newArray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int [] oldArray, int size){ + if (size <= 0) + return null; + int[] newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + if (max < 1) + return null; + if (max == 1) + return null; + int[] array = new int[max]; + int i = 0; + int value = fibonaccis(i+1); + while ( value < max) { + array[i++] = value; + value = fibonaccis(i+1); + } + int[] newArray = new int[i]; + for (int j = 0; j < newArray.length; j++) { + newArray[j] = array[j]; + } + return newArray; + } + + private static int fibonaccis(int n) { + if (n <=0) + return 0; + if (n == 1 || n ==2 ) + return 1; + return fibonaccis(n-1)+fibonaccis(n-2); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public static int[] getPrimes(int max){ + if (max <= 1) { + return null; + } + int[] array = new int[max]; + int index = 0; + for (int i = 2; i < max; i++) { + if (i == 2 || i == 3 || i == 5 || i == 7) + array[index++] = i; + if (i%2 !=0 && i%3 != 0 && i%5 != 0 && i%7 != 0) + array[index++] = i; + } + int[] newArray = new int[index]; + for (int i = 0; i < newArray.length; i++) { + newArray[i] = array[i]; + } + + return newArray; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max){ + if (max <= 0) + return null; + int[] array = new int[max]; + int index = 0; + for (int i = 1; i < max; i++) { + if (isPerfectNumber(i)) + array[index++] = i; + } + + int[] newArray = new int[index]; + for (int i = 0; i < newArray.length; i++) + newArray[i] = array[i]; + + return newArray; + } + + private static boolean isPerfectNumber(int n) { + int sum = 0; + int i = 1; + while (i < n) { + if (n%i == 0) + sum += i; + i++; + } + if (sum == n) + return true; + return false; + } + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator){ + if (array == null) + return null; + StringBuilder str = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + if (i == array.length-1) + str.append(array[i]); + else + str.append(array[i] + seperator); + } + return str.toString(); + } + + +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/.Struts.java.swp b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/.Struts.java.swp new file mode 100644 index 0000000000000000000000000000000000000000..1f45a5f25e9bf8dcf03addb1f9a3a0a4c6fe0a2f GIT binary patch literal 12288 zcmeHN-)|H}93MFDF=6Z>+URINc933 z+R}=_wrHyrG^inRZ8c&`TX<3b27eI~>Fym52A@oP($DP7^{!2+z7l4W&+gvN_t$*B z-|tMCPFMZDwsyMRXd<{a5mM8((7EAtyl*4KcfGX3_`urN|CM`F2qq7jhs~sw>$dqV z?esL%r?w}1yjQpr?m`;LaD#>R$i$rnv#?qObFvB0yFzGo$~X4)yMXJZpy+J}W? zCe3UgqRdZn4dxr%$=YG7QN_T$!$83HKeJ;aX>3T<^GQFcZ=suOI_{nMtC=bW6a$I@ z#eiZ!F`yVw3@8Q^1BAKj$XnpyKFLL^e6CyZlt0x&F`yVw3@8Q^1BwB~fMP%~pcqgL zCu#1&`UHzarN>W;Wy2*agffTPLRnoi!azRF@QUyHO)5S1Alv%X&u_@ znU3Yn>?Jhk8n|qzZkyFUNb#2Yct#P6E1)C zV@pfJFZ*udpzn5g8S#A|)F{`bJE?;^|1F$rIL?OyepE4KRg@i5+ z{uxKJ8NH607LV{1c(0?L?FShqT!=6XH(&`pYx}<0V?$cL36XZwZ4vJ3sCc$gp(exH zW%>tJ5#o{Z$;(isP3R=Vms-TyE?gRE=Wy<~v(1A|=q|$M za(b;G7OFfU|E1ujRSc>SV&2Nb3Ha$CVRRiRQmW1hSA;j6t_t{HRLb?rh(E z$J&qWFz*etDH=S!wkC;u;|(7TUkm%Dc%Oxnv!&?^#j%rUvGDS_sPN6=%;lT;;}B{x zXmoxy8Y=kWOf5PLV-Te+qTpKTt+$7Y3x&GHxr^bM0a-B+C|w^8$0x%4{O$QcN{bf? zVPPzM@6zH-esSg!9L1mEVf9Gjri<$d^htrKuCe;V-y;G%x@M z;n~4(dLqhy9xi+m^}Q=R$VR1gbn)8h@U!Fe*iz3wOQ~M`U@lx3fpj?VvEBp;uZ~7dXWg8~C_lJvWK5^W@a+8=REZ%Lx8`L60p9~< gnXfW}7_cX~*vPTZQ7e}<_<4JASl*}{mTxBi0@A~$y#N3J literal 0 HcmV?d00001 diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/LoginAction.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/Struts.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..4aa33bc3c2 --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/Struts.java @@ -0,0 +1,62 @@ +package com.coderising.litestruts; + +import java.util.Map; +import java.util.HashMap; +import java.lang.reflect.Method; +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml*/ + /* + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + try { + String targetClassName = XmlUtil.parseXML("struts.xml", actionName); + Class targetClass = Class.forName(targetClassName); + + Method setName = targetClass.getMethod("setName", String.class); + Method setPassword = targetClass.getMethod("setPassword", String.class); + Object object = targetClass.newInstance(); + + setName.invoke(object, parameters.get("name")); + setPassword.invoke(object, parameters.get("password")); + + Method execute = targetClass.getMethod("execute"); + String result = (String)execute.invoke(object); + + Method getMessage = targetClass.getMethod("getMessage"); + String message = (String)getMessage.invoke(object); + + Map params = new HashMap(); + params.put("message", message); + String jspUrl = XmlUtil.getJspUrl("struts.xml", actionName, result); + View view = new View(); + view.setJsp(jspUrl); + view.setParameters(params); + return view; + + } catch (Exception e) { + e.printStackTrace(); + } + + + return null; + } + +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/StrutsTest.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/View.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/XmlUtil.java b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/XmlUtil.java new file mode 100644 index 0000000000..d200452cc8 --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/XmlUtil.java @@ -0,0 +1,59 @@ +package com.coderising.litestruts; + +import java.io.*; +import java.util.*; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.dom4j.io.XMLWriter; +public class XmlUtil { + + public static String parseXML(String filePath, String actionName) { + try { + File file = new File(filePath); + SAXReader reader = new SAXReader(); + Document doc = reader.read(file); + Element root = doc.getRootElement(); + for (Iterator iter = root.elementIterator("action"); iter.hasNext();) { + Element element = (Element)iter.next(); + Attribute nameAttr = element.attribute("name"); + if (nameAttr.getValue().equals(actionName)) { + Attribute classAttr = element.attribute("class"); + return classAttr.getValue(); + } + } + } catch (Exception e) { + e.printStackTrace(); + System.out.println("parse error"); + } + return null; + } + + public static String getJspUrl(String filePath, String actionName, String resultName) { + try { + File file = new File(filePath); + SAXReader reader = new SAXReader(); + Document doc = reader.read(file); + Element root = doc.getRootElement(); + for (Iterator iter = root.elementIterator("action"); iter.hasNext();) { + Element element = (Element)iter.next(); + Attribute nameAttr = element.attribute("name"); + if (nameAttr.getValue().equals(actionName)) { + for (Iterator ite = element.elementIterator("result"); ite.hasNext();) { + Element ele = (Element)ite.next(); + Attribute resultAttr = ele.attribute("name"); + if (resultAttr.getValue().equals(resultName)) { + return ele.getText(); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/struts.xml b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..463407f22f --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/ArrayList.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..9ab5fe8f8a --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/ArrayList.java @@ -0,0 +1,97 @@ +package com.coding.basic; + +import com.coding.basic.exception.*; +public class ArrayList implements List { + + private int size; + private Object[] elementData; + + public ArrayList () { + size = 0; + elementData = new Object[100]; + } + + public void add(Object o){ + add(size(), o); + } + + public void add(int index, Object o){ + if (size() == elementData.length) + ensureCapacity( size() * 2 + 1); + if (index > size() || index < 0) { //index == size时相当于在尾后插入 + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + for (int i = size; i > index; i--) { + elementData[i] = elementData[i-1]; + } + elementData[index] = o; + size++; + + } + + private void ensureCapacity(int newCapacity) { + if (newCapacity < size()) + return; + Object[] old = elementData; + elementData = new Object[newCapacity]; + for (int i = 0; i < size(); i++) { + elementData[i] = old[i]; + } + } + + public Object get(int index){ + if (index >= size() || index < 0) { //获取时,index==size()越界 + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + return elementData[index]; + } + + private String outOfBoundsMsg(int index) { + return "Index:" + index + ", Size:" + size; + } + + public Object remove(int index){ + if (index >= size() || index < 0) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + Object old = elementData[index]; + for (int i = index; i < size(); i++) { + elementData[i] = elementData[i+1]; + } + size--; + return old; + } + + /*获取表内容量*/ + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + public class ArrayListIterator implements Iterator { + private final int ONLY_CAPACITY = size; + private int index; + public ArrayListIterator() { + index = 0; + } + + @Override + public boolean hasNext() { + if (ONLY_CAPACITY != size) + throw new ConcurrentModificationException("此对象没有进行修改同步"); + return index != size; + } + + @Override + public Object next() { + if (ONLY_CAPACITY != size) + throw new ConcurrentModificationException("此对象没有进行修改同步"); + if (index >= ONLY_CAPACITY) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + return elementData[index++]; + } + } +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..23c96579ee --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,33 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Iterator.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e7cbd474ec --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/LinkedList.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..931e1a3e8e --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/LinkedList.java @@ -0,0 +1,135 @@ +package com.coding.basic; + +import com.coding.basic.exception.*; +public class LinkedList implements List { + + private Node head; + private int size; + public LinkedList() { + head = new Node(null, null); + size = 0; + } + + public void add(Object o){ + add(size, o); + } + + public void add(int index , Object o){ + if (index > size || index < 0) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + Node frontNode = getNode(index-1); + Node newNode = new Node(o, frontNode.next); + frontNode.next = newNode; + size++; + + } + + private Node getNode(int index) { + Node node = head; + int i = 0; + while(node.next != null && i <= index) { + node = node.next; + i++; + } + return node; + } + + public Object get(int index){ + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + Node node = getNode(index); + return node.data; + } + + public Object remove(int index){ + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + Node frontNode = getNode(index-1); + Node oldNode = getNode(index); + frontNode.next = oldNode.next; + size--; + return oldNode.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + //就是这么硬! + add(0, o); + } + + public void addLast(Object o){ + add(size, o); + } + + public Object removeFirst(){ + return remove(0); + } + + public Object removeLast(){ + return remove(size-1); + } + + public Iterator iterator(){ + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + int index; + final int capacity = size; + LinkedListIterator() { + index = 0; + } + @Override + public boolean hasNext() { + if (capacity != size) + throw new ConcurrentModificationException("此对象没有修改同步"); + return index < capacity; + } + + @Override + public Object next() { + if (capacity != size) + throw new ConcurrentModificationException("此对象没有修改同步"); + if (index >= capacity) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + return get(index++); + } + } + + private String outOfBoundsMsg(int index) { + return "index:" + index + ", size:" + size; + } + + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + void setData(Object data) { + this.data = data; + } + + Object getData() { + return data; + } + + void setNext(Node next) { + this.next = next; + } + + Object getNext() { + return next; + } + } +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/List.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Queue.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Queue.java new file mode 100644 index 0000000000..eac63a6ee6 --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Queue.java @@ -0,0 +1,30 @@ +package com.coding.basic; +import com.coding.basic.exception.*; +public class Queue { + + private LinkedList elementData; + + public Queue() { + elementData = new LinkedList(); + } + + public void enQueue(Object o){ + elementData.addLast(o); + } + + public Object deQueue(){ + if (isEmpty()) { + throw new EmptyQueueException("队空"); + } + Object result = elementData.removeFirst(); + return result; + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Stack.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Stack.java new file mode 100644 index 0000000000..efd45398bf --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/Stack.java @@ -0,0 +1,38 @@ +package com.coding.basic; + +import com.coding.basic.exception.*; +public class Stack { + + private ArrayList elementData; + public Stack() { + elementData = new ArrayList(); + } + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (isEmpty()) { + throw new EmptyStackException("栈空"); + } + Object result = elementData.get(size()-1); + elementData.remove(size()-1); + return result; + } + + public Object peek(){ + if (isEmpty()) { + throw new EmptyStackException("栈空"); + } + return elementData.get(0); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/ConcurrentModificationException.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/ConcurrentModificationException.java new file mode 100644 index 0000000000..f1c5c79721 --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/ConcurrentModificationException.java @@ -0,0 +1,9 @@ +package com.coding.basic.exception; + +public class ConcurrentModificationException extends RuntimeException { + public ConcurrentModificationException() {} + public ConcurrentModificationException(String msg) { + super(msg); + } +} + diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyQueueException.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyQueueException.java new file mode 100644 index 0000000000..2ee7aa4ee7 --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyQueueException.java @@ -0,0 +1,8 @@ +package com.coding.basic.exception; + +public class EmptyQueueException extends RuntimeException { + public EmptyQueueException() {} + public EmptyQueueException(String msg) { + super(msg); + } +} diff --git a/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyStackException.java b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyStackException.java new file mode 100644 index 0000000000..2a5ae4055d --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyStackException.java @@ -0,0 +1,8 @@ +package com.coding.basic.exception; + +public class EmptyStackException extends RuntimeException { + public EmptyStackException() {} + public EmptyStackException(String msg) { + super(msg); + } +} diff --git a/group11/1178243325/DataStructure/src/main/resources/struts.xml b/group11/1178243325/DataStructure/src/main/resources/struts.xml new file mode 100644 index 0000000000..463407f22f --- /dev/null +++ b/group11/1178243325/DataStructure/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + diff --git a/group11/1178243325/DataStructure/struts.xml b/group11/1178243325/DataStructure/struts.xml new file mode 100644 index 0000000000..171848ecd1 --- /dev/null +++ b/group11/1178243325/DataStructure/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + diff --git a/group11/1310368322/GitHub/.gitignore b/group11/1310368322/GitHub/.gitignore new file mode 100644 index 0000000000..5e56e040ec --- /dev/null +++ b/group11/1310368322/GitHub/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/group11/1310368322/GitHub/src/ArrayList.java b/group11/1310368322/GitHub/src/ArrayList.java new file mode 100644 index 0000000000..68b42b1c03 --- /dev/null +++ b/group11/1310368322/GitHub/src/ArrayList.java @@ -0,0 +1,79 @@ +package Day_2017_2_20_DateStructure; + +public class ArrayList { + + + private int size = 0; + + private Object[] elementData = new Object[10]; + + private Exception Exception; + + public void add(Object o){ + if(size>elementData.length){ + elementData = ArrayList.grow(elementData, 10); + } + for(int i = 0; i < elementData.length; i++){ + if(null == elementData[i]){ + elementData[i] = o; + break; + } + } + size++; + } + public void add(int index, Object o){ + if(size>elementData.length){ + elementData = ArrayList.grow(elementData, 10); + } + if(index<0){ + System.out.println("λ"); + } + int k = -1; + for(int i = index; i < elementData.length; i++){ + if(null==elementData[i]){ + k = i-1; + break; + } + } + for(int i = k; i >= index;i--){ + elementData[i+1] = elementData[i]; + } + elementData[index] = o; + size++; + } + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + while(true){ + elementData[index] = elementData[index+++1]; + if(elementData[index]==null){ + break; + } + } + size--; + return null; + } + public int size(){ + return -1; + } + public void getElementData(){ + for(int i = 0; i < elementData.length; i++){ + System.out.println(elementData[i]); + + } + } + public static Object[] grow(Object[] elementData2, int size){ + Object []target = new Object[elementData2.length+size]; + System.arraycopy(elementData2, 0, target, 0, elementData2.length); + return target; + } + + public static void main(String[] args) { + ArrayList a = new ArrayList(); + a.add("a"); + a.getElementData(); + System.out.println(a.size); + } +} diff --git a/group11/1310368322/GitHub/src/testGitHub.java b/group11/1310368322/GitHub/src/testGitHub.java new file mode 100644 index 0000000000..af74e99b53 --- /dev/null +++ b/group11/1310368322/GitHub/src/testGitHub.java @@ -0,0 +1,7 @@ + +public class testGitHub { + private void mian() { + System.out.print("Hello GitHub"); + } + +} diff --git a/group11/171535320/ArrayUtil.java b/group11/171535320/ArrayUtil.java new file mode 100644 index 0000000000..6b6cb818d0 --- /dev/null +++ b/group11/171535320/ArrayUtil.java @@ -0,0 +1,211 @@ +import sun.security.util.Length; + +import java.util.ArrayList; +import java.util.InputMismatchException; +import java.util.List; + +/** + * Created by dengdechao on 2017/2/27. + */ +public class ArrayUtil { + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + + public static void reverseArray(int[] origin){ + if(origin == null) { + return ; + } + int i = 0; + int j = origin.length - 1; + while(i != j) { + int temp = origin[i]; + origin[i] = origin[j]; + origin[j] = temp; + i++; + j--; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray){ + if(oldArray == null) { + return null; + } + int i = 0; + int j = oldArray.length - 1; + + while(i != j) { + if(oldArray[i] != 0) { + i++; + continue; + } + if(oldArray[j] == 0) { + j--; + continue; + } + int temp = oldArray[i]; + oldArray[i] = oldArray[j]; + oldArray[j] = temp; + } + int[] array = new int[i]; + for(int n = 0; n < i; ++n) { + array[n] = oldArray[n]; + } + return array; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + int[] result = new int[array1.length + array2.length]; + int len1 = 0; + int len2 = 0; + int i = 0; + while(len1 != array1.length || len2 != array2.length) { + if(len1 < array1.length && len2 < array2.length) { + if(array1[len1] < array2[len2]) { + result[i++] = array1[len1++]; + } else if(array1[len1] > array2[len2]) { + result[i++] = array2[len2++]; + } else { + result[i++] = array1[len1]; + len1++; + len2++; + } + } else if(len1 < array1.length){ + result[i++] = array1[len1++]; + } else { + result[i++] = array2[len2++]; + } + + } + int[] last = new int[i]; + System.arraycopy(result,0,last,0,i); + return last; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int len = oldArray.length + size; + int[] result = new int[len]; + for(int i = 0; i < oldArray.length; ++i) { + result[i] = oldArray[i]; + } + return result; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + List list = new ArrayList(); + + for(int i = 2; i <= max; ++i) { + int temp = 2; + while(temp < i) { + if(i % temp == 0) { + break; + } + ++temp; + } + if(i == temp) { + list.add(i); + } + } + + int[] result = new int[list.size()]; + + for(int i = 0; i < list.size(); ++i) { + result[i] = list.get(i); + } + return result; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + List list = new ArrayList(); + + for(int j = 0; j < max; ++j) { + int temp = 0; + for(int i = 0; i < j / 2 + 1; ++i) { + if(j % i == 0) { + temp += i; + } + } + if(temp == j) { + list.add(j); + } + } + + int[] result = new int[list.size()]; + + for(int i = 0; i < list.size(); ++i) { + result[i] = list.get(i); + } + return result; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder str = new StringBuilder(); + for(int i = 0; i < array.length; ++i) { + str.append(array[i]); + if(i + 1 < array.length) { + str.append(seperator); + } + } + String s = str.toString(); + return s; + } +} diff --git a/group11/171535320/DataStruct/ArrayList.java b/group11/171535320/DataStruct/ArrayList.java new file mode 100644 index 0000000000..4340deecf4 --- /dev/null +++ b/group11/171535320/DataStruct/ArrayList.java @@ -0,0 +1,64 @@ +package DataStruct; + +import java.util.Arrays; +import java.util.Objects; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + private void ensureCapacity(int minCapacity) { + if(minCapacity > elementData.length) { + Object[] temp = elementData; + int newCapacity = elementData.length * 3 / 2 + 1; + Object[] newArray = new Object[newCapacity]; + System.arraycopy(temp, 0, newArray, 0, elementData.length); + elementData = newArray; + } + } + + public void add(Object o){ + + + ensureCapacity(size + 1); + elementData[size++] = o; + } + + public void add(int index, Object o){ + ensureCapacity(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + if(index >= size || index < 0) { + return null; + } + return elementData[index]; + } + + public Object remove(int index){ + if(index < 0 || index >= size) { + return null; + } + Object obj = elementData[index]; + + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + + elementData[--size] = null; + + return obj; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group11/171535320/DataStruct/BinaryTreeNode.java b/group11/171535320/DataStruct/BinaryTreeNode.java new file mode 100644 index 0000000000..e0cc417a43 --- /dev/null +++ b/group11/171535320/DataStruct/BinaryTreeNode.java @@ -0,0 +1,45 @@ +package DataStruct; + +public class BinaryTreeNode { + + private Node root = null; + + public void insert(int value) { + if(root == null) { + root = new Node(value); + root.leftNode = null; + root.rightNode = null; + } else { + Node current = root; + Node old = root; + while(true) { + if(value < current.value) { + if(current.leftNode == null) { + current.leftNode = new Node(value); + break; + } + old = current; + current = current.leftNode; + } else { + if(current.rightNode == null) { + current.rightNode = new Node(value); + break; + } + old = current; + current = current.rightNode; + } + } + } + } + +} + +class Node { + int value; + Node leftNode; + Node rightNode; + + public Node(int value) { + this.value = value; + } +} diff --git a/group11/171535320/DataStruct/Iterator.java b/group11/171535320/DataStruct/Iterator.java new file mode 100644 index 0000000000..012d28806a --- /dev/null +++ b/group11/171535320/DataStruct/Iterator.java @@ -0,0 +1,12 @@ +package DataStruct; + +/** + * Created by dengdechao on 2017/2/27. + */ + + public interface Iterator { + public boolean hasNext(); + public Object next(); + + } + diff --git a/group11/171535320/DataStruct/LinkedList.java b/group11/171535320/DataStruct/LinkedList.java new file mode 100644 index 0000000000..24a99466ca --- /dev/null +++ b/group11/171535320/DataStruct/LinkedList.java @@ -0,0 +1,154 @@ +package DataStruct; + +import DataStruct.List; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + if(head == null) { + head = new Node(); + head.data = o; + } else { + Node temp = head; + while(temp.next != null) { + temp = temp.next; + } + temp.next = new Node(); + temp.next.data = o; + } + } + + public void add(int index , Object o){ + if(index > size()) { + return ; + } + if(index == 0) { + Node newNode = new Node(); + newNode.data = o; + newNode.next = head; + head = newNode; + } else { + int temp = 0; + Node newNode = new Node(); + newNode.data = o; + Node tempNode = head; + while(temp != index - 1) { + tempNode = tempNode.next; + ++temp; + } + Node tempNode2 = tempNode.next; + tempNode.next = newNode; + newNode.next = tempNode2; + } + } + + public Object get(int index){ + if(index > size() || size() == 0) { + return null; + } + Node temp = head; + for(int i = 0; i < index; ++i) { + temp = temp.next; + } + + return temp.data; + } + + + public Object remove(int index){ + if(size() == 0) { + return null; + } + if(size() == 1) { + Object obj = head.data; + head = null; + return obj; + } + if(index == 0) { + Node temp = head; + head = head.next; + temp.next = null; + } else if(index > size()) { + return null; + } else { + int t = 0; + Node temp = head; + while(t != index - 1) { + temp = temp.next; + ++t; + } + Node result = temp.next; + temp.next = temp.next.next; + return result.data; + } + return null; + } + + public int size(){ + int len = 0; + Node temp = head; + while(temp != null) { + temp = temp.next; + ++len; + } + return len; + } + + public void addFirst(Object o){ + Node temp = new Node(); + temp.data = o; + temp.next = head; + head = temp; + } + public void addLast(Object o){ + Node newNode = new Node(); + newNode.data = o; + + if(size() == 0) { + head = newNode; + } + Node temp = head; + while(temp.next != null) { + temp = temp.next; + } + temp.next = newNode; + } + public Object removeFirst(){ + if(size() == 0) { + return null; + } + Node temp = head; + head = head.next; + return temp.data; + } + public Object removeLast(){ + if(size() == 0) { + return null; + } + if(size() == 1) { + Node temp = head.next; + head = head.next; + return temp.data; + } + Node temp1 = head; + Node temp2 = head.next; + while(temp2.next != null) { + temp1 = temp1.next; + temp2 = temp2.next; + } + temp1.next = null; + return temp2.data; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group11/171535320/DataStruct/List.java b/group11/171535320/DataStruct/List.java new file mode 100644 index 0000000000..125407436c --- /dev/null +++ b/group11/171535320/DataStruct/List.java @@ -0,0 +1,9 @@ +package DataStruct; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group11/171535320/stackANDqueue/Queue.java b/group11/171535320/stackANDqueue/Queue.java new file mode 100644 index 0000000000..cbd885e73c --- /dev/null +++ b/group11/171535320/stackANDqueue/Queue.java @@ -0,0 +1,34 @@ +package stackANDqueue; + +import java.util.LinkedList; +import java.util.List; + +/** + * Created by dengdechao on 2017/2/22. + */ +public class Queue { + + private LinkedList queue = new LinkedList(); + + public void enQueue(Object o){ + queue.add(o); + } + + public Object deQueue(){ + if(queue.isEmpty()) { + return null; + } + return queue.removeFirst(); + } + + public boolean isEmpty(){ + if(queue.isEmpty()) { + return true; + } + return false; + } + + public int size(){ + return queue.size(); + } +} diff --git a/group11/171535320/stackANDqueue/Stack.java b/group11/171535320/stackANDqueue/Stack.java new file mode 100644 index 0000000000..17ca9d6298 --- /dev/null +++ b/group11/171535320/stackANDqueue/Stack.java @@ -0,0 +1,52 @@ +package stackANDqueue; + +import java.util.ArrayList; + +/** + * Created by dengdechao on 2017/2/22. + */ +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if(elementData.size() == 0) { + return null; + } + Object obj = null; + for(int i = 0; i < elementData.size(); ++i) { + obj = elementData.get(i); + } + int j = 0; + while(j < elementData.size()) { + ++j; + } + elementData.set(j - 1, null); + return obj; + } + + public Object peek(){ + if(elementData.size() == 0) { + return null; + } + Object obj = null; + for(int i = 0; i < elementData.size(); ++i) { + obj = elementData.get(i); + } + + return obj; + } + public boolean isEmpty(){ + if(elementData.size() == 0) { + return true; + } + + return false; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group11/252308879/dataStructure/.gitignore b/group11/252308879/dataStructure/.gitignore new file mode 100644 index 0000000000..c7175f9b40 --- /dev/null +++ b/group11/252308879/dataStructure/.gitignore @@ -0,0 +1,10 @@ +dataStructure/.classpath +dataStructure/.project +dataStructure/.settings/ + +.project +.settings/ +target/ +# 忽略IntelliJ IDEA配置文件 +*.iml +*.idea/ diff --git a/group11/252308879/dataStructure/pom.xml b/group11/252308879/dataStructure/pom.xml new file mode 100644 index 0000000000..0bf21adba4 --- /dev/null +++ b/group11/252308879/dataStructure/pom.xml @@ -0,0 +1,35 @@ + + 4.0.0 + + org.apn.coding2017 + dataStructure + 1.0.0-SNAPSHOT + jar + + dataStructure + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 4.12 + test + + + junit + junit + RELEASE + + + dom4j + dom4j + 1.6.1 + + + diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java new file mode 100644 index 0000000000..82d7073a0f --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java @@ -0,0 +1,282 @@ +package org.pan.coding2017.array; + +import java.util.Arrays; + +/** + * Created by QiPan on 2017/2/27. + */ +public class ArrayUtil { + + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static void reverseArray(int[] origin) { + + // 如果是null, 或者长度小于等于1, 直接返回 + if (origin == null || origin.length <= 1) { + return; + } + for (int i = 0; i < origin.length / 2; i++) { + int tmp = origin[i]; + origin[i] = origin[origin.length - 1 - i]; + origin[origin.length - 1 - i] = tmp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + + if (oldArray == null) { + return oldArray; + } + int[] newArray = null; + int count = 0; //统计被移出的数组的个数 + for (int i = 0; i < oldArray.length; i++) { + int num = oldArray[i]; + if (num == 0) { + count++; + System.arraycopy(oldArray, i + 1, oldArray, i, oldArray.length - i - 1); + i--; + } + } + if (count == 0) { + newArray = oldArray; + } else { + newArray = new int[oldArray.length - count]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length - count); + } + return newArray; + } + + /** + * 不用JavaAPI来做 + * + * @param oldArray + * @return + */ + public static int[] removeZero_2(int[] oldArray) { + + if (oldArray == null) { + return oldArray; + } + int count = 0; + for (int num : oldArray) { + if (num == 0) { + count++; + } + } + int[] newArray = new int[oldArray.length - count]; + for (int i = 0, j = 0; i < oldArray.length; i++, j++) { + int num = oldArray[i]; + if (num == 0) { + j--; + } else { + newArray[j] = num; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + public static int[] merge(int[] array1, int[] array2) { + //先初始化一个array3,但不是最后返回的数组 + int[] array3 = new int[array1.length + array2.length]; + int i = 0, j = 0; + int array3Size = 0; // 统计实际上合并数组后的大小 + while (i < array1.length && j < array2.length) { + if (array1[i] < array2[j]) {// 如果array1中元素小,则插入到array3中 + array3[array3Size++] = array1[i]; + ++i; + } else if (array1[i] > array2[j]) {//如果array2中元素小,则插入到array3中 + array3[array3Size++] = array2[j]; + ++j; + } else {//否则随便插入一个,但是计数要同时加1 + array3[array3Size++] = array1[i]; + ++i; + ++j; + } + } + + if (i == array1.length) { //如果array1中全部循环完毕了,那么需要去处理array2中剩余的元素 + for (int n = j; n < array2.length; n++) { + array3[array3Size++] = array2[n]; + } + } else if (j == array2.length) {// 如果array2中全部循环完毕,那么需要去处理array1中剩余的元素 + for (int n = i; n < array1.length; n++) { + array3[array3Size++] = array1[n]; + } + } + int[] returnResultArray = new int[array3Size]; + System.arraycopy(array3, 0, returnResultArray, 0, + array3Size); + return returnResultArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + if (oldArray == null) { + oldArray = new int[size]; + } + oldArray = Arrays.copyOf(oldArray, oldArray.length + size); + return oldArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max <= 1) { + return new int[0]; + } + int[] arrays = new int[max / 2]; + int firstNum = 1; //第一个数字 + int secondNum = 1; // 第二个数字 + int arraySize = 0; + arrays[arraySize++] = 1; // 初始化第一位 + while (secondNum < max) { + arrays[arraySize++] = secondNum; + int tmpNum = secondNum; // 保存第二个数,得会需要付给第一个数 + secondNum = firstNum + secondNum; // 为前两个数之和 + firstNum = tmpNum; // 第一个数,后移 + } + return Arrays.copyOf(arrays, arraySize); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + int[] returnResultArray = new int[max + 1]; + int arraySize = 0; + for (int i = 2; i < max; i++) { + if (isPrime(i)) { + returnResultArray[arraySize++] = i; + } + + } + if (arraySize == returnResultArray.length) { + return returnResultArray; + } + return Arrays.copyOf(returnResultArray, arraySize); + } + + private static boolean isPrime(final int number) { + if (number < 2) { + return false; + } + // 因为不可能将一个数除与所有小于它的数字,只要检查到N的平方根就好了。 + // 但直接开根号还有个精度的问题。这个可能会产生误差。 索性将判断条件写成 i*i<=number + for (int i = 2; i * i <= number; i++) { + if (number % i == 0) {//查看所有小于number平方根的数,能够被整除 + return false; + } + } + // 如果一个都没有,那么就是素数 + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + int[] array = new int[max]; + int arraySize = 0; + for (int n = 0; n < max; n++) { + int fac,// 被除的因子 + sum,// 用来统计因子之和 + num;// 除数的因子,中间变量 + for (sum = 1, num = n, fac = 2; fac < num; fac++) { + + if (n % fac == 0) {// 如果余数为0,那么说明有因子 + sum += fac; // 统计因子和 + num = n / fac; // num=等于除数的最大因子 + if (num == fac) // 如果最大和最小相等跳出循环 + break; + sum += num; // 再统计因子 + } + } + + if (sum == n) { //因子和与整数相等,那么就是一个完美数 + if (n != 1) { + System.out.println(n + "是一个完全数,其因子为:"); + } + for (fac = 1; fac < n; fac++) { + if (n % fac == 0) {// 列出所有的因子 + System.out.print(fac + " "); + } + } + System.out.println(); + array[arraySize++] = n; // 放到数组中 + } + } + return Arrays.copyOf(array, arraySize); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public static String join(int[] array, String seperator) { + if (array == null) { + return null; + } + StringBuilder str = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + if (i == array.length - 1) { + str.append(array[i]); + continue; + } + str.append(array[i]).append(seperator); + } + return str.toString(); + } + +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java new file mode 100644 index 0000000000..73dd4b7a5f --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java @@ -0,0 +1,212 @@ +package org.pan.coding2017.basic; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +/** + * Created by QiPan on 2017/2/23. + */ +public class ArrayList implements List { + + private int size; + + // 设置默认容量 不可变 + private static final int DEFAULT_CAPACITY = 10; + + private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + private Object[] elementData; + + // 定义一个默认的空的数组,引用不可变 + private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; + + public ArrayList(int initialCapacity) { + if (initialCapacity > 0) { + this.elementData = new Object[initialCapacity]; + } else if (initialCapacity == 0) { + this.elementData = new Object[]{}; + } else { + throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); + } + } + + public ArrayList() { // 如果调用默认构造函数,设置容器为空的默认数组 + this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; + } + + + public boolean add(Object o) { + ensureCapacityInternal(size + 1); + elementData[size++] = o; + return true; + } + + @Override + public boolean add(int index, Object o) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + ensureCapacityInternal(size + 1); + // 从插入位置开发,所有的数据需要往后移动 + System.arraycopy(elementData, index, elementData, index + 1, + size - index); + elementData[index] = o; + size++; + return true; + } + + public Object set(int index, Object element) { + checkIndexOutOf(index); + Object oldEle = elementData[index]; + elementData[index] = element; + return oldEle; + } + + public Object get(int index) { + checkIndexOutOf(index); + return elementData[index]; + } + + public Object remove(int index) { + checkIndexOutOf(index); + Object oldValue = elementData[index]; + + // 计算需要移动的位数 + int needMoveNum = size - index - 1; + + if (needMoveNum > 0) { + /* + * src:源数组; + * srcPos:源数组要复制的起始位置; + * dest:目的数组; + * destPos:目的数组放置的起始位置; + * length:复制的长度。 + */ + System.arraycopy(elementData, index + 1, elementData, index, needMoveNum); + } + // 避免对象游离,是的gcc能工作回收 + elementData[--size] = null; + return oldValue; + } + + public int size() { + return this.size; + } + + public boolean isEmpty() { + return this.size == 0; + } + + public Iterator iterator() { + return new Itr(); + } + + + private String outOfBoundsMsg(int index) { + return "Index: " + index + ", Size: " + size; + } + + /** + * 检查数组越界 + * + * @param index + */ + private void checkIndexOutOf(int index) { + if (index >= size) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + } + + private void ensureCapacityInternal(int minCapacity) { + // 如果是容器是默认的空的数组 + if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { + // 取得为与默认容量相比的较大值 + minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); + } + // 调用确保有能力放下那么多元素 + ensureExplicitCapacity(minCapacity); + } + + private void ensureExplicitCapacity(int minCapacity) { + // 防止容量溢出。所需的最小容器大于数组长度 + if (minCapacity - elementData.length > 0) { + grow(minCapacity); + } + } + + /** + * 扩充容量 + * + * @param minCapacity + */ + private void grow(int minCapacity) { + int oldCapacity = elementData.length; + // 得到一个新的容量大小,为 oldCapacity 的1.5倍 + int newCapacity = oldCapacity + (oldCapacity >> 1); + // 如果扩容后的大小比,最小容量(DEFAULT_CAPACITY: 10)小 + if (newCapacity - minCapacity < 0) { + newCapacity = minCapacity; + } else if (newCapacity - MAX_ARRAY_SIZE > 0) { // 扩容后比最大的还大,考虑溢出 + // + newCapacity = hugeCapacity(minCapacity); + } + + elementData = Arrays.copyOf(elementData, newCapacity); + } + + /** + * 这个很少用到这个判断,毕竟基本不会使用那么大容量存储 + * + * @param minCapacity + * @return + */ + private static int hugeCapacity(int minCapacity) { + if (minCapacity < 0) { + throw new OutOfMemoryError(); + } + return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; + } + + private class Itr implements Iterator { + + /** + * 当前游标 + */ + int cursor; + int lastRet = -1; // 是否是返回最后一个结果 + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + int i = cursor; + // 游标已经超过数组的大小 + if (i >= size) { + throw new NoSuchElementException(); + } + Object[] elementData = ArrayList.this.elementData; + + // 指向下一个元素 + cursor = i + 1; + Object elementDatum = elementData[i]; + lastRet = i; + return elementDatum; + } + + @Override + public void remove() { + if (lastRet < 0) { + throw new IllegalStateException(); + } + // 实际上这个时候的 lastRet,为 next方法时候的 i = cursor + ArrayList.this.remove(lastRet); + cursor = lastRet; + lastRet = -1; + } + } + + +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..80f7f78751 --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java @@ -0,0 +1,76 @@ +package org.pan.coding2017.basic; + +/** + * Created by QiPan on 2017/2/23. + */ +public class BinaryTreeNode, Value> { + + private Node root; + + private class Node { + private Key key; + private Value value; + private Node left, right; //指向子树的链接 + private int N; // 以该节点为根的子树节点总数 + public Node(Key key, Value value, int N) { + this.key = key; + this.value = value; + this.N = N; + } + } + + public int size() { + return size(root); + } + + private int size(Node x) { + if (x == null) return 0; + else return x.N; + } + + public Value get(Key key){ + return get(root, key); + } + + private Value get(Node x, Key key) { + // 如果根节点也是Null 那么返回null + if (x == null){ + return null; + } + // 拿需要查询的key 与 根节点的 key 比较 + int cmp = key.compareTo(x.key); + if (cmp < 0){ // 如果小于0 那么去左子树上查询,并且递归调用 + return get(x.left, key); + }else if (cmp > 0){// 如果大于0 那么去右子树上查询,并且递归调用 + return get(x.right, key); + }else { + return x.value; + } + } + + public void push(Key key, Value value){ + // 查询key, 找到则更新它的值,否则就创建 + root = put(root, key, value); + } + + private Node put(Node x, Key key, Value value) { + // 如果key 存在于以 x 为根节点的子树中 则更新它的值 + // 否则将以key 和 value 为键值对的新节点插入到该子树中 + + if (x == null){ + return new Node(key, value, 1); + } + int cmp = key.compareTo(x.key); + if (cmp < 0 ){ + x.left = put(x.left, key, value); + }else if (cmp > 0){ + x.right = put(x.right, key, value); + }else { // 存在更新值 + x.value = value; + } + // 重新统计节点总数 + x.N = size(x.left) + size(x.right) + 1; + return x; + } + +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..3d1849f1a0 --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java @@ -0,0 +1,12 @@ +package org.pan.coding2017.basic; + +/** + * Created by QiPan on 2017/2/23. + */ +public interface Iterator { + boolean hasNext(); + + Object next(); + + void remove(); +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java new file mode 100644 index 0000000000..015ac3d59d --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java @@ -0,0 +1,121 @@ +package org.pan.coding2017.basic; + +/** + * Created by QiPan on 2017/2/23. + */ +public class LinkedList { + + private Node head; + private int size; + public LinkedList() { + head = new Node(null, null); + size = 0; + } + + public void add(Object o){ + add(size, o); + } + + public void add(int index , Object o){ + if (index > size || index < 0) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + Node frontNode = getNode(index-1); + Node newNode = new Node(o, frontNode.next); + frontNode.next = newNode; + size++; + + } + + private Node getNode(int index) { + Node node = head; + int i = 0; + while(node.next != null && i <= index) { + node = node.next; + i++; + } + return node; + } + + public Object get(int index){ + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + Node node = getNode(index); + return node.data; + } + + public Object remove(int index){ + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + Node frontNode = getNode(index-1); + Node oldNode = getNode(index); + frontNode.next = oldNode.next; + size--; + return oldNode.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + add(0, o); + } + + public void addLast(Object o){ + add(size, o); + } + + public Object removeFirst(){ + return remove(0); + } + + public Object removeLast(){ + return remove(size-1); + } + + public Iterator iterator(){ + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + int index; + final int capacity = size; + LinkedListIterator() { + index = 0; + } + @Override + public boolean hasNext() { + return index < capacity; + } + + @Override + public Object next() { + return get(index++); + } + + @Override + public void remove() { + + } + } + + private String outOfBoundsMsg(int index) { + return "index:" + index + ", size:" + size; + } + + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java new file mode 100644 index 0000000000..daa8253313 --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java @@ -0,0 +1,24 @@ +package org.pan.coding2017.basic; + + +/** + * Created by QiPan on 2017/2/23. + */ +public interface List { + + boolean add(Object o); + + boolean add(int index, Object o); + + Object set(int index, Object element); + + Object get(int index); + + Object remove(int index); + + int size(); + + boolean isEmpty(); + + Iterator iterator(); +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java new file mode 100644 index 0000000000..af478b4288 --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java @@ -0,0 +1,50 @@ +package org.pan.coding2017.basic; + +/** + * Created by QiPan on 2017/2/23. + * 队列,链表实现版本 + */ +public class Queue { + + private Node first; + private Node last; + private int N; + + private class Node { + E item; + Node next; + } + + public void enQueue(E e) { + // 向表尾添加元素 + Node oldLast = last; + last = new Node(); + last.item = e; + last.next = null; + if (isEmpty()){// 如果是往空的队列里面添加东西。那么首尾链表都是指向第一个元素 + first = last; + }else { + + oldLast.next = last; + } + N++; + } + + public E deQueue() { + E item = first.item; + first = first.next; + if (isEmpty()){ + last = null; + } + N--; + return item; + } + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return N; + } +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java new file mode 100644 index 0000000000..918db8f70d --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java @@ -0,0 +1,51 @@ +package org.pan.coding2017.basic; + +/** + * Created by QiPan on 2017/2/23. + */ +public class Stack { + + private E[] elements; + // 记录元素当前位置 + private int N; + + public Stack(int cap) { + elements = (E[]) new Object[cap]; + } + + public boolean isEmpty() { + return N == 0; + } + + public int size() { + return N; + } + + public void push(E e) { + // 如果 N 和数组的长度已经相同,就进行扩容 + if (N == elements.length) { + resize(2 * elements.length); + } + elements[N++] = e; + } + + public E pop() { + E element = elements[--N]; + elements[N] = null;// 避免对象游离 + // 如果元素值剩下容量的1/4,那么就把数组容量变成现在的一半 + if (N > 0 && N == elements.length / 4) { + resize(elements.length / 2); + } + return element; + } + + private void resize(int max) { + E[] elementTmps = (E[]) new Object[max]; + for (int i = 0; i < N; i++) { + elementTmps[i] = elements[i]; + } + // 指向扩容的数组 + elements = elementTmps; + } + +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java new file mode 100644 index 0000000000..2a056b8bbf --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java @@ -0,0 +1,47 @@ +package org.pan.coding2017.basic; + +/** + * Created by Pan on 2017/2/25. + * 栈(链表实现): 下压栈。操作栈顶元素 + */ +public class Stack2 { + + private Node first; + private int N; + + private class Node { + E item; + Node next; + } + + public boolean isEmpty(){ + return first == null; + } + + public int size(){ + return N; + } + + /** + * 向栈顶添加元素 + * @param element + */ + public void push (E element){ + Node oldFirst = first; + first = new Node(); + first.item = element; + first.next = oldFirst; + N++; + } + + /** + * 弹出栈顶元素 + * @return + */ + public E pop(){ + E item = first.item; + first = first.next; + N--; + return item; + } +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/LoginAction.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/LoginAction.java new file mode 100644 index 0000000000..f38cbcb084 --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/LoginAction.java @@ -0,0 +1,39 @@ +package org.pan.coding2017.parsingXML; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/Struts.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/Struts.java new file mode 100644 index 0000000000..90c5443c23 --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/Struts.java @@ -0,0 +1,110 @@ +package org.pan.coding2017.parsingXML; + +import org.pan.coding2017.utils.JaxpDomUtil; +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + try { + Document document = JaxpDomUtil.getDocument(); + NodeList actionNodeList = document.getElementsByTagName("action"); + for (int i = 0; i < actionNodeList.getLength(); i++) { + NamedNodeMap attributes = actionNodeList.item(i).getAttributes(); + String methodName = attributes.getNamedItem("name").getTextContent(); + if (!actionName.equals(methodName)) { + continue; + } + // 获取全类名对象,反射创建对象 + String className = attributes.getNamedItem("class").getTextContent(); + Class actionClass = Class.forName(className); + + // 获取反射的方法名称, 因为是public修饰所以用的是getMethod,获取私有方法需要用 getDeclaredMethod + Method setName = actionClass.getMethod("setName", String.class); + Method setPassword = actionClass.getMethod("setPassword", String.class); + // 创建对象 + Object actionObject = actionClass.newInstance(); + + // 调用反射的setter方法,给参数赋值 + setName.invoke(actionObject, parameters.get("name")); + setPassword.invoke(actionObject, parameters.get("password")); + + // 获取execute方法 + Method execute = actionClass.getMethod("execute"); + // 返回结果 + String result = (String) execute.invoke(actionObject); + + // 获取getMessage方法 + Method getMessage = actionClass.getMethod("getMessage"); + String message = (String) getMessage.invoke(actionObject); + // 创建一个Map 用来放置在 View中 + Map params = new HashMap(); + params.put("message", message); + + // 获取返回的JSP路径,这个需要比较result节点的name属性 + //获取action的子节点 + NodeList resultNodes = actionNodeList.item(i).getChildNodes(); + String viewUrl = ""; + for (int n = 0; n < resultNodes.getLength(); n++) { + Node item = resultNodes.item(n); + NamedNodeMap resultAttributes = item.getAttributes(); + if (resultAttributes == null) { + continue; + } + String name = resultAttributes.getNamedItem("name").getTextContent(); + if (result.equals(name)) { + viewUrl = item.getTextContent(); + break; + } + } + View view = new View(); + view.setJsp(viewUrl); + view.setParameters(params); + return view; + } + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return null; + + } + +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/StrutsTest.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/StrutsTest.java new file mode 100644 index 0000000000..ccdacc514c --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/StrutsTest.java @@ -0,0 +1,43 @@ +package org.pan.coding2017.parsingXML; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/View.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/View.java new file mode 100644 index 0000000000..3271ab4ed1 --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/View.java @@ -0,0 +1,23 @@ +package org.pan.coding2017.parsingXML; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/Dom4JUtil.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/Dom4JUtil.java new file mode 100644 index 0000000000..f1679f6bef --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/Dom4JUtil.java @@ -0,0 +1,41 @@ +package org.pan.coding2017.utils; + +import java.io.FileWriter; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.SAXReader; +import org.dom4j.io.XMLWriter; + +public class Dom4JUtil { + + public static Document getDocument(String xmlPath) { + + try { + //创建解析器 + SAXReader saxReader = new SAXReader(); + //得到Documment + Document document = saxReader.read(xmlPath); + return document; + } catch (DocumentException e) { + e.printStackTrace(); + } + + return null; + } + + public static void xmlWrite(Document document,String xmlPath){ + + try { + OutputFormat format = OutputFormat.createPrettyPrint(); + XMLWriter xmlWriter = new XMLWriter(new FileWriter(xmlPath),format); + xmlWriter.write(document); + xmlWriter.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + + } + +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpDomUtil.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpDomUtil.java new file mode 100644 index 0000000000..d8fe537e35 --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpDomUtil.java @@ -0,0 +1,152 @@ +package org.pan.coding2017.utils; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class JaxpDomUtil { + public static final String XMLPATH = JaxpDomUtil.class.getClassLoader().getResource("struts.xml").getPath(); + + /** + * 通过 解析器 获取到 Document + * @return + */ + public static Document getDocument() { + try { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory + .newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory + .newDocumentBuilder(); + Document document = documentBuilder.parse(XMLPATH); + return document; + } catch (Exception e) { + e.printStackTrace(); + + } + return null; + } + + /** + * 回写 XML 方法 + * @param document + */ + public static void tranFormMethod(Document document) { + try { + TransformerFactory transformerFactory = TransformerFactory + .newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + transformer.transform(new DOMSource(document), new StreamResult( + XMLPATH)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 递归调用 获取所有的元素 并打印元素名称 + * @param node + */ + private static void listElement(Node node) { + // 判断是元素类型时才打印 + if (node.getNodeType() == Node.ELEMENT_NODE) { + System.out.println(node.getNodeName()); + } + + // 获得一层子节点 + NodeList nodelist = node.getChildNodes(); + for (int i = 0; i < nodelist.getLength(); i++) { + // 得到每一个子节点 + Node nodeChild = nodelist.item(i); + + // 递归调用 + listElement(nodeChild); + } + + } + + /** + * 获取所有的 元素名称 + */ + public static void getListElement() { + + Document document = JaxpDomUtil.getDocument(); + listElement(document); + } + + /** + * 删除nan节点 + */ + public static void delSex() { + + Document document = JaxpDomUtil.getDocument(); + + // 获取元素 + Node nodeSex = document.getElementsByTagName("sex").item(0); + + // 得到父节点 + Node parent = nodeSex.getParentNode(); + + // 通过父节点删除 + parent.removeChild(nodeSex); + + // 回写XML + JaxpDomUtil.tranFormMethod(document); + + } + + /** + * 修改 sex 标签的 内容为nv + */ + public static void modifySex() { + Document document = JaxpDomUtil.getDocument(); + Node nodeSex = document.getElementsByTagName("sex").item(0); + nodeSex.setTextContent("nv"); + JaxpDomUtil.tranFormMethod(document); + + } + + /** + * 为第一个p1 增加 nv + */ + public static void addSex(){ + Document document = JaxpDomUtil.getDocument(); + Node p1Node = document.getElementsByTagName("p1").item(0); + + //通过 Document 创建 Element + Element sexElement = document.createElement("sex"); + sexElement.setTextContent("nv"); + p1Node.appendChild(sexElement); + JaxpDomUtil.tranFormMethod(document); + + } + + /** + * 查询xml中第一个name元素的值 + */ + public static void selectSin(){ + Document document = JaxpDomUtil.getDocument(); + Node nameNode = document.getElementsByTagName("name").item(0); + String name = nameNode.getTextContent(); + System.out.println(name); + } + + /** + * 查询所有name元素的值 + */ + public static void selectAll(){ + Document document = JaxpDomUtil.getDocument(); + NodeList nodeList = document.getElementsByTagName("name"); + for (int i = 0; i < nodeList.getLength(); i++) { + System.out.println(nodeList.item(i).getTextContent()); + } + } + +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpSAXPUtil.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpSAXPUtil.java new file mode 100644 index 0000000000..8756c8ab95 --- /dev/null +++ b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpSAXPUtil.java @@ -0,0 +1,89 @@ +package org.pan.coding2017.utils; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +public class JaxpSAXPUtil { + public static void main(String[] args) { + /* + * 1、创建解析器工厂 + * 2、创建解析器 + * 3、执行 parse 方法 + * + * 4、自己创建一个类、继承DefaultHandler + * 5、重写类里面的三个方法 + */ + + try { + SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); + SAXParser saxParser = saxParserFactory.newSAXParser(); + saxParser.parse("src/p1.xml",new MyDeafultHandler2() ); + } catch (Exception e) { + e.printStackTrace(); + } + + + } + +} + +class MyDeafultHandler1 extends DefaultHandler{ + + @Override + public void startElement(String uri, String localName, String qName, + Attributes attributes) throws SAXException { + System.out.println("<"+qName+">"); + } + + @Override + public void characters(char[] ch, int start, int length) + throws SAXException { + System.out.println(new String(ch,start,length)); + } + + @Override + public void endElement(String uri, String localName, String qName) + throws SAXException { + System.out.println("<"+qName+"/>"); + } + +} + +//实现获取所有的name元素的值 +class MyDeafultHandler2 extends DefaultHandler{ + + boolean flag = false; + int index = 1; + + @Override + public void startElement(String uri, String localName, String qName, + Attributes attributes) throws SAXException { + //判断qName 是否为 name 元素 + if("name".equals(qName) && index == 2){ + flag = true; + } + } + + @Override + public void characters(char[] ch, int start, int length) + throws SAXException { + if(flag == true){ + System.out.println(new String(ch, start, length)); + } + } + + @Override + public void endElement(String uri, String localName, String qName) + throws SAXException { + if("name".equals(qName)){ + flag = false; + index++ ; + } + } + + +} diff --git a/group11/252308879/dataStructure/src/main/resources/struts.xml b/group11/252308879/dataStructure/src/main/resources/struts.xml new file mode 100644 index 0000000000..35830922ba --- /dev/null +++ b/group11/252308879/dataStructure/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java new file mode 100644 index 0000000000..281a5bf07b --- /dev/null +++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java @@ -0,0 +1,31 @@ +package org.pan.coding2017; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by QiPan on 2017/2/23. + */ +public class TestJavaUtilArrayList { + + + @Test + public void testAdd() { + List arrayList = new ArrayList(5); + arrayList.add(new Object()); + System.out.println("sssssssssssss"); + } + + @Test + public void testRightShift() { + int x = 5; + + x = x << 1; + x = x >> 1; + System.out.println(x); + } + +} diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java new file mode 100644 index 0000000000..29ab6bf6dc --- /dev/null +++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java @@ -0,0 +1,89 @@ +package org.pan.coding2017.array; + +import org.junit.Test; + +import java.util.Arrays; + +/** + * Created by QiPan on 2017/2/27. + */ +public class ArrayUtilTest { + + @Test + public void removeZero() throws Exception { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + System.out.println("removeZero 移除0之前: "+ Arrays.toString(oldArr)); + int[] newArrays = ArrayUtil.removeZero(oldArr); + System.out.println("removeZero 移除0之后: "+ Arrays.toString(newArrays)); + } + + @Test + public void removeZero_2() throws Exception { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + System.out.println("removeZero_2 移除0之前: "+ Arrays.toString(oldArr)); + int[] newArrays = ArrayUtil.removeZero_2(oldArr); + System.out.println("removeZero_2 移除0之后: "+ Arrays.toString(newArrays)); + } + + @Test + public void reverseArray() throws Exception { + int[] array = new int[]{7, 9 , 30, 3}; + int[] array2 = new int[] {7, 9, 30, 3, 4}; + System.out.println("置换前: " + Arrays.toString(array)); + ArrayUtil.reverseArray(array); + System.out.println("置换后: "+ Arrays.toString(array)); + System.out.println("置换前: " + Arrays.toString(array2)); + ArrayUtil.reverseArray(array2); + System.out.println("置换后: "+ Arrays.toString(array2)); + } + + @Test + public void merge() throws Exception { + int[] a1 = {3, 5, 7,8}, a2 = {4, 5, 6,7}; + //则 a3 为[3,4,5,6,7,8] + int[] merge = ArrayUtil.merge(a1, a2); + System.out.println(Arrays.toString(merge)); + } + + @Test + public void grow() throws Exception { + int[] oldArray = {2,3,6} ; + int size = 3; + System.out.println("grow 之前:"+ Arrays.toString(oldArray)); + int[] newArrays = ArrayUtil.grow(oldArray, size); + System.out.println("grow 之后:"+ Arrays.toString(newArrays)); + + } + + @Test + public void fibonacci() throws Exception { + //max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + int[] fibonacci = ArrayUtil.fibonacci(988); + System.out.println(Arrays.toString(fibonacci)); + } + + @Test + public void getPrimes() throws Exception { + //例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + int[] primes = ArrayUtil.getPrimes(23); + System.out.println(Arrays.toString(primes)); + } + + @Test + public void getPerfectNumbers() throws Exception { + int[] primes = ArrayUtil.getPerfectNumbers(10000); + System.out.println(Arrays.toString(primes)); + } + + @Test + public void join() throws Exception { + int [] array= {3,8,9}; + String seperator = "-"; + String result = ArrayUtil.join(array, seperator); + System.out.println(result); + } + + + + +} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java new file mode 100644 index 0000000000..f93876522a --- /dev/null +++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java @@ -0,0 +1,74 @@ +package org.pan.coding2017.basic; + +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Pan on 2017/2/26. + */ +public class ArrayListTest { + + ArrayList arrayList; + + @Before + public void before(){ + arrayList = new ArrayList(); + arrayList.add(1); + arrayList.add(2); + arrayList.add(3); + } + + @Test + public void add() throws Exception { + ArrayList arrayList = new ArrayList(); + arrayList.add(3); + System.out.println(arrayList); + } + + @Test + public void set() throws Exception { + arrayList.add(3); + arrayList.set(0, 4); + System.out.println(arrayList); + } + + @Test + public void get() throws Exception { + arrayList.add(1); + arrayList.add(2); + arrayList.add(3); + Object o = arrayList.get(1); + System.out.println(o); + } + + @Test + public void remove() throws Exception { + arrayList.add(1); + arrayList.add(2); + arrayList.add(3); + arrayList.remove(1); + System.out.println(arrayList); + } + + @Test + public void size() throws Exception { + System.out.println(arrayList.size()); + } + + @Test + public void isEmpty() throws Exception { + System.out.println(arrayList.isEmpty()); + } + + @Test + public void iterator() throws Exception { + Iterator iterator = arrayList.iterator(); + while (iterator.hasNext()){ + Object next = iterator.next(); + System.out.println(next); + iterator.remove(); + } + System.out.println(arrayList.isEmpty()); + } + +} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..4c3c01cd73 --- /dev/null +++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java @@ -0,0 +1,38 @@ +package org.pan.coding2017.basic; + +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Pan on 2017/2/26. + */ +public class BinaryTreeNodeTest { + + BinaryTreeNode binaryTreeNode; + + @Before + public void setUp() throws Exception { + binaryTreeNode = new BinaryTreeNode(); + binaryTreeNode.push(1, "A"); + binaryTreeNode.push(2, "B"); + binaryTreeNode.push(3, "C"); + binaryTreeNode.push(4, "D"); + } + + @Test + public void size() throws Exception { + System.out.println(binaryTreeNode.size()); + } + + @Test + public void get() throws Exception { + System.out.println(binaryTreeNode.get(3)); + } + + @Test + public void push() throws Exception { + binaryTreeNode.push(5, "E"); + System.out.println(binaryTreeNode); + } + +} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java new file mode 100644 index 0000000000..d10e2a1d48 --- /dev/null +++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java @@ -0,0 +1,80 @@ +package org.pan.coding2017.basic; + +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Pan on 2017/2/26. + */ +public class LinkedListTest { + + LinkedList linkedList; + + @Before + public void setUp() throws Exception { + linkedList = new LinkedList(); + linkedList.add(0); + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + } + + @Test + public void add() throws Exception { + linkedList.add(0); + System.out.println(linkedList); + } + + @Test + public void get() throws Exception { + Object o = linkedList.get(1); + System.out.println(o); + } + + @Test + public void remove() throws Exception { + linkedList.remove(1); + System.out.println(linkedList); + } + + @Test + public void size() throws Exception { + System.out.println(linkedList.size()); + } + + @Test + public void addFirst() throws Exception { + linkedList.addFirst(4); + System.out.println(linkedList); + } + + @Test + public void addLast() throws Exception { + linkedList.addLast(5); + System.out.println(linkedList); + } + + @Test + public void removeFirst() throws Exception { + linkedList.removeFirst(); + System.out.println(linkedList); + } + + @Test + public void removeLast() throws Exception { + linkedList.removeLast(); + System.out.println(linkedList); + } + + @Test + public void iterator() throws Exception { + Iterator iterator = linkedList.iterator(); + while (iterator.hasNext()){ + Object next = iterator.next(); + System.out.println(next); + iterator.remove(); + } + System.out.println(linkedList); + } + +} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java new file mode 100644 index 0000000000..c720e7d95e --- /dev/null +++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java @@ -0,0 +1,44 @@ +package org.pan.coding2017.basic; + +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Pan on 2017/2/26. + */ +public class QueueTest { + + Queue queue; + + @Before + public void setUp() throws Exception { + queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + + } + + @Test + public void enQueue() throws Exception { + queue.enQueue(1); + System.out.println(queue); + } + + @Test + public void deQueue() throws Exception { + queue.deQueue(); + System.out.println(queue); + } + + @Test + public void isEmpty() throws Exception { + System.out.println(queue.isEmpty()); + } + + @Test + public void size() throws Exception { + System.out.println(queue.size()); + } + +} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java new file mode 100644 index 0000000000..df85b797d4 --- /dev/null +++ b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java @@ -0,0 +1,45 @@ +package org.pan.coding2017.basic; + +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Pan on 2017/2/26. + */ +public class StackTest { + + Stack stack; + + @Before + public void setUp() throws Exception { + stack = new Stack(3); + stack.push(1); + stack.push(2); + stack.push(3); + } + + @Test + public void isEmpty() throws Exception { + System.out.println(stack.isEmpty()); + } + + @Test + public void size() throws Exception { + System.out.println(stack.size()); + } + + @Test + public void push() throws Exception { + stack.push(1); + stack.push(2); + stack.push(3); + System.out.println(stack); + } + + @Test + public void pop() throws Exception { + stack.pop(); + System.out.println(stack); + } + +} \ No newline at end of file diff --git a/group11/283091182/src/com/coderising/array/ArrayUtil.java b/group11/283091182/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..f322af39d3 --- /dev/null +++ b/group11/283091182/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,303 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if(origin==null||origin.length==0){ + throw new RuntimeException("invalid array argument!"); + } + if(origin.length>1){ + int temp; + for(int i=0;iarray2[pos2]){ + array3[pos3]=array2[pos2]; + pos2++; + pos3++; + }else if(array1[pos1]3){ + result[pos]=2; + pos++; + } + if(max>4){ + result[pos]=3; + pos++; + } + for(int i=4;i0){ + sb.append(seperator); + } + sb.append(i); + } + return sb.toString(); + } + + private void printArray(String msg,int[] array){ + System.out.print(msg); + for(int i=0;i resultMap= new HashMap(); + public static final String CONST_ACTION = "action"; + public static final String CONST_NAME = "name"; + public static final String CONST_CLASS = "class"; + public static final String CONST_RESULT = "result"; + + private String actionName; + private String actionClass; + + public Action(){}; + + public Action(String actionName,String actionClass){ + this.actionName = actionName; + this.actionClass = actionClass; + } + + public void setActionResultJsp(String result,String dispatcherJsp){ + this.resultMap.put(result, dispatcherJsp); + } + + public String getActionResultJsp(String result){ + return this.resultMap.get(result); + } + + + public String getActionName() { + return actionName; + } + + public void setActionName(String actionName) { + this.actionName = actionName; + } + + public String getActionClass() { + return actionClass; + } + + public void setActionClass(String actionClass) { + this.actionClass = actionClass; + } + + /** + * @param args + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + + @Override + public String toString(){ + StringBuilder sb = new StringBuilder(); + sb.append(CONST_ACTION).append(":").append(this.actionName).append(","); + sb.append(CONST_CLASS).append(":").append(this.actionClass).append(","); + sb.append("ResultMap").append(":").append(this.resultMap.toString()); + return sb.toString(); + } +} diff --git a/group11/283091182/src/com/coderising/litestruts/LoginAction.java b/group11/283091182/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group11/283091182/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group11/283091182/src/com/coderising/litestruts/Struts.java b/group11/283091182/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..546b4de975 --- /dev/null +++ b/group11/283091182/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,229 @@ +package com.coderising.litestruts; + +import java.beans.BeanInfo; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + * + */ + + //0. Load Structs.xml and return a map + Map actionMap = loadActionMap(); + + //1.Find and initialize action instance to actionName provided + Action action = actionMap.get(actionName); + Object instance = initializeActionInstance(action.getActionClass(),parameters); + + //2.invoke the execute method and get the result + String result = executeAction(instance); + + //3.Extract info for view + View view = new View(); + view.setParameters(extractInfo(instance)); + + //4.set dispatcher jsp according to execution result + view.setJsp(action.getActionResultJsp(result)); + + return view; + } + + private static Map loadActionMap() { + try { + + InputStream is = Struts.class.getResourceAsStream("struts.xml"); + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(is); + Element struct = document.getDocumentElement(); + + return getActions(struct); + + } catch (IOException e) { + throw new RuntimeException("Error Reading Configuration XML",e); + } catch (ParserConfigurationException e) { + throw new RuntimeException("Error Parsing Configuration XML",e); + } catch (SAXException e) { + throw new RuntimeException("Error Parsing Configuration XML",e); + } + } + + /** + * Parse the XML and construct ActionName:Action map + * + * @param Element struct, root of the struct xml + * @return Map + */ + private static Map getActions(Element struct) { + + Map map = new HashMap(); + + NodeList nl = struct.getElementsByTagName(Action.CONST_ACTION); + + for (int i = 0; i < nl.getLength(); i++) + { + Node actionNode = nl.item(i); + // Get action name and corresponding action class from property + String actionClass = getAttribute(actionNode,Action.CONST_CLASS); + String actionName = getAttribute(actionNode,Action.CONST_NAME); + + Action action = new Action(actionName, actionClass); + + // get results under action + NodeList childNodes = actionNode.getChildNodes(); + + for (int j = 0; j < childNodes.getLength(); j++) + { + Node result = childNodes.item(j); + //Only accept if Node Type is element and Node name is "result" + if ((result.getNodeType() == result.ELEMENT_NODE) + && (result.getNodeName() == Action.CONST_RESULT)) + { + String resultName = getAttribute(result,Action.CONST_NAME); + String dispatcherJsp = result.getTextContent(); + action.setActionResultJsp(resultName, dispatcherJsp); + } + } + map.put(action.getActionName(), action); + } + System.out.println(map); + return map; + } + /** + * Get property from given node + * @param node + * @param key + * @return attribute as String + */ + private static String getAttribute(Node node,String key){ + NamedNodeMap map = node.getAttributes(); + Node attriNode = map.getNamedItem(key); + if(attriNode!=null && attriNode.getNodeType()==Node.ATTRIBUTE_NODE){ + return attriNode.getNodeValue(); + } + return null; + } + + /** + * Initialize instance from given class name and parameters map + * @param actionClass + * @param parameters + * @return instance of specified class + */ + private static Object initializeActionInstance(String actionClass,Map parameters){ + try { + Class clazz= Class.forName(actionClass); + //Instantiate by calling constructor + Constructor constructor = clazz.getConstructor(); + + constructor.setAccessible(true); + Object instance = constructor.newInstance(new Object[]{}); + + //Check class propertes with instrospector + BeanInfo beanInfo = Introspector.getBeanInfo(clazz); + PropertyDescriptor[] props = beanInfo.getPropertyDescriptors(); + + for(PropertyDescriptor prop:props){ + String propName = prop.getName(); + Method propSetter = prop.getWriteMethod(); + //If there is a setter for the property and also there is a value in parameter map + //then invoke the setter method to set the values + if(propSetter!=null && parameters.containsKey(propName)) + { + propSetter.invoke(instance, parameters.get(propName)); + } + } + + return instance; + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error initializing instance: ClassName="+actionClass,e); + } + } + + + /** + * Invoke the "execute" method from the action instance + * @param Action instance + * @return execute result as String + */ + private static String executeAction(Object instance){ + Class clazz = instance.getClass(); + try { + //exepct no argument for execute method + Method execute = clazz.getMethod("execute", new Class[0]); + return (String)execute.invoke(instance, new Object[0]); + } catch (Exception e) { + throw new RuntimeException("Error executing action,class name="+clazz.getCanonicalName()); + } + } + + + /** + * Extracting Bean info by calling the getting method in the Action instance + * @param instance + * @return map + */ + private static Map extractInfo(Object instance){ + Map map = new HashMap(); + Class clazz = instance.getClass(); + try{ + Method[] methods = clazz.getMethods(); + for(Method method:methods) + { + String methodName = method.getName(); + if(methodName.startsWith("get")&&method.getParameterTypes().length==0) + { + Object methodReturn = method.invoke(instance, new Object[0]); + //construct the properties name by getter method name,first character toLower case + String propName = methodName.replaceFirst("get", ""); + char[] propNameCharArr = propName.toCharArray(); + propNameCharArr[0]=Character.toLowerCase(propNameCharArr[0]); + + map.put(String.valueOf(propNameCharArr), methodReturn); + } + } + + }catch(Exception e){ + throw new RuntimeException("Error extracting info from Action Insance,class="+clazz.getCanonicalName(),e); + } + return map; + } + +} diff --git a/group11/283091182/src/com/coderising/litestruts/StrutsTest.java b/group11/283091182/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group11/283091182/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group11/283091182/src/com/coderising/litestruts/View.java b/group11/283091182/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group11/283091182/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group11/283091182/src/com/coderising/litestruts/struts.xml b/group11/283091182/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group11/283091182/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group11/283091182/src/com/coding/basic/ArrayList.java b/group11/283091182/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..b91e761236 --- /dev/null +++ b/group11/283091182/src/com/coding/basic/ArrayList.java @@ -0,0 +1,113 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private static final int GROW_BY_SIZE = 10; + + private Object[] elementData = new Object[GROW_BY_SIZE]; + + public void add(Object o){ + if(size == elementData.length){ + grow(); + } + elementData[size]=o; + size++; + } + public void add(int index, Object o){ + validate(index); + if(size == elementData.length){ + grow(); + } + for(int i=size;i>index+1;i--){ + elementData[i]=elementData[i-1]; + } + elementData[index]=o; + size++; + } + + public Object get(int index){ + validate(index); + return elementData[index]; + } + + public Object remove(int index){ + validate(index); + Object result = elementData[index]; + for(int i =index;i=size)throw new IndexOutOfBoundsException("Invalid Index:"+pos); + Object result = elementData[pos]; + pos++; + return result; + } + + + } + + private void grow(){ + elementData = Arrays.copyOf(elementData, elementData.length+GROW_BY_SIZE); + } + private void validate(int index){ + if(index<0||index>=size)throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + @Override + public String toString(){ + StringBuilder sb = new StringBuilder("["); + for(int i=0;i1)sb.append(","); + sb.append(elementData[i]); + } + sb.append("]size=").append(this.size()); + return sb.toString(); + } + + public static void main(String[] args){ + ArrayList l = new ArrayList(); + for(int i=0;i<12;i++){ + l.add(i+""); + } + System.out.println(l); + l.add("aaa"); + System.out.println("After adding aaa:"+l); + l.add(2,"bbb"); + System.out.println("After adding bbb:"+l); + System.out.println(l.get(2)); + System.out.println("After getting:"+l); + System.out.println(l.remove(2)); + System.out.println("After removing:"+l); + Iterator it = l.iterator(); + while(it.hasNext()){ + System.out.println(it.next()); + } + } + +} diff --git a/group11/283091182/src/com/coding/basic/ArrayListTest.java b/group11/283091182/src/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..0f325c3c25 --- /dev/null +++ b/group11/283091182/src/com/coding/basic/ArrayListTest.java @@ -0,0 +1,142 @@ +/** + * + */ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +/** + * @author Administrator + * + */ +public class ArrayListTest { + + private ArrayList al; + /** + * @throws java.lang.Exception + */ + @BeforeClass + public static void setUpBeforeClass() throws Exception { + } + + /** + * @throws java.lang.Exception + */ + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + System.out.println("SetUp"); + al= new ArrayList(); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + System.out.println("TearDown"); + al = null; + } + + /** + * Test method for {@link com.coding.basic.ArrayList#add(java.lang.Object)}. + */ + @Test + public final void testAddObject() { + al.add("aaa"); + al.add("bbb"); + al.add("ccc"); + assertEquals("aaa",al.get(0)); + assertEquals("bbb",al.get(1)); + assertEquals("ccc",al.get(2)); + assertEquals(3,al.size()); + } + + /** + * Test method for {@link com.coding.basic.ArrayList#add(int, java.lang.Object)}. + */ + @Test + public final void testAddIntObject() { + al.add("aaa"); + al.add(0,"bbb"); + al.add(1,"ccc"); + assertEquals("bbb",al.get(0)); + assertEquals("ccc",al.get(1)); + assertEquals("aaa",al.get(2)); + assertEquals(3,al.size()); + } + /** + * Test method for {@link com.coding.basic.ArrayList#add(int, java.lang.Object)}. + */ + @Test(expected=IndexOutOfBoundsException.class) + public final void testAddIntObjectWithException1() { + al.add(-1, "aaa"); + } + /** + * Test method for {@link com.coding.basic.ArrayList#add(int, java.lang.Object)}. + */ + @Test(expected=IndexOutOfBoundsException.class) + public final void testAddIntObjectWithException2() { + al.add("aaa"); + al.add(1,"bbb"); + } + + /** + * Test method for {@link com.coding.basic.ArrayList#get(int)}. + */ + @Test + public final void testGet() { + fail("Not yet implemented"); // TODO + } + /** + * Test method for {@link com.coding.basic.ArrayList#get(int)}. + */ + @Test + public final void testGetWithException1() { + fail("Not yet implemented"); // TODO + } + /** + * Test method for {@link com.coding.basic.ArrayList#get(int)}. + */ + @Test + public final void testGetWithException2() { + fail("Not yet implemented"); // TODO + } + + /** + * Test method for {@link com.coding.basic.ArrayList#remove(int)}. + */ + @Test + public final void testRemove() { + fail("Not yet implemented"); // TODO + } + + /** + * Test method for {@link com.coding.basic.ArrayList#size()}. + */ + @Test + public final void testSize() { + fail("Not yet implemented"); // TODO + } + + /** + * Test method for {@link com.coding.basic.ArrayList#iterator()}. + */ + @Test + public final void testIterator() { + fail("Not yet implemented"); // TODO + } + +} diff --git a/group11/283091182/src/com/coding/basic/BinaryTreeNode.java b/group11/283091182/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..3ff526a20a --- /dev/null +++ b/group11/283091182/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,89 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + public BinaryTreeNode(Object o,BinaryTreeNode leftChild,BinaryTreeNode rightChild){ + this.data = o; + this.left = leftChild; + this.right = rightChild; + } + public BinaryTreeNode insert(Object o){ + if(!(o instanceof Comparable)){ + throw new RuntimeException("Incompareable Oject:"+o); + } + System.out.println("CurrentNode Value="+data); + if(((Comparable)o).compareTo(data)>0){ + System.out.print(o+" is greater than "+data+",insert to right;"); + if(this.right==null){ + System.out.println("Creating new rightChild;"); + this.right = new BinaryTreeNode(o,null,null); + }else{ + System.out.println("rightChild exists,Conitnue to insert to rightChild"); + this.right.insert(o); + } + } + if(((Comparable)o).compareTo(data)<0){ + System.out.print(o+" is less than "+data+",insert to left;"); + if(this.left==null){ + System.out.println("Creating new leftChild;"); + this.left = new BinaryTreeNode(o,null,null); + }else{ + System.out.println("leftChild exists,Conitnue to insert to leftChild"); + this.left.insert(o); + } + } + return this; + } + + public static void main(String[] args){ + Integer one = new Integer(1); + Integer two = new Integer(2); + System.out.println(one.compareTo(two)); + System.out.println(two.compareTo(one)); + System.out.println(one.compareTo(one)); + BinaryTreeNode btn = new BinaryTreeNode(new Integer(5),null,null); + btn.insert(new Integer(2)); + btn.insert(new Integer(7)); + btn.insert(new Integer(1)); + btn.insert(new Integer(6)); + inOrderTraversal(btn); + btn.insert(new Integer(4)); + btn.insert(new Integer(8)); + inOrderTraversal(btn); + } + //in-order traversal to print all nodes in sorted order + private static void inOrderTraversal(BinaryTreeNode btn){ + if(btn!=null){ + if(btn.left!=null){ + inOrderTraversal(btn.left); + } + System.out.println(btn.data); + if(btn.right!=null){ + inOrderTraversal(btn.right); + } + } + } + +} diff --git a/group11/283091182/src/com/coding/basic/Iterator.java b/group11/283091182/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group11/283091182/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group11/283091182/src/com/coding/basic/LinkedList.java b/group11/283091182/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..cf40edd7c2 --- /dev/null +++ b/group11/283091182/src/com/coding/basic/LinkedList.java @@ -0,0 +1,178 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head = null; + private int size = 0; + + public void add(Object o){ + if(head==null){ + head = new Node(o); + }else{ + Node temp = head; + while(temp.hasNext()){ + temp = temp.next; + } + temp.next = new Node(o); + } + size++; + + } + public void add(int index , Object o){ + validate(index); + if(index==0){ + Node newNode = new Node(o,head); + head = newNode; + }else{ + Node temp = head; + for(int i=0;i=size)throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + private static class Node{ + Object data; + Node next; + public boolean hasNext(){ + return (this.next!=null); + } + public Node(Object data,Node next){ + this.data = data; + this.next = next; + } + public Node(Object data){ + this.data = data; + this.next = null; + } + } + @Override + public String toString(){ + StringBuilder sb = new StringBuilder("["); + Node temp = head; + while(temp!=null){ + if(sb.length()>1)sb.append(","); + sb.append(temp.data); + temp = temp.next; + } + sb.append("]size=").append(this.size()); + return sb.toString(); + } + public static void main(String[] args){ + LinkedList l = new LinkedList(); + for(int i=0;i<12;i++){ + l.add(i+""); + } + System.out.println(l); + l.add("aaa"); + System.out.println("After adding aaa:"+l); + l.add(2,"bbb"); + System.out.println("After adding bbb:"+l); + System.out.println(l.get(2)); + System.out.println("After getting:"+l); + System.out.println(l.remove(2)); + System.out.println("After removing:"+l); + l.addFirst("first"); + System.out.println("After add First:"+l); + l.addLast("last"); + System.out.println("After add Last:"+l); + System.out.println(l.removeFirst()); + System.out.println("After remove First:"+l); + System.out.println(l.removeLast()); + System.out.println("After remove Last:"+l); + Iterator it = l.iterator(); + while(it.hasNext()){ + System.out.println(it.next()); + } + //it.next(); + } +} diff --git a/group11/283091182/src/com/coding/basic/List.java b/group11/283091182/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group11/283091182/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group11/283091182/src/com/coding/basic/Queue.java b/group11/283091182/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..679a979e8d --- /dev/null +++ b/group11/283091182/src/com/coding/basic/Queue.java @@ -0,0 +1,42 @@ +package com.coding.basic; + +public class Queue { + private LinkedList list = new LinkedList(); + + public void enQueue(Object o){ + list.add(o); + } + + public Object deQueue(){ + if(list.size()==0)throw new RuntimeException("Queue is empty."); + return list.removeFirst(); + } + + public boolean isEmpty(){ + return (list.size()==0); + } + + public int size(){ + return list.size(); + } + + @Override + public String toString(){ + return this.list.toString(); + } + + public static void main(String[] args){ + Queue q = new Queue(); + q.enQueue("aaa"); + q.enQueue("bbb"); + System.out.println(q); + System.out.println(q.isEmpty()); + System.out.println(q.size()); + q.deQueue(); + q.deQueue(); + System.out.println(q); + System.out.println(q.isEmpty()); + System.out.println(q.size()); + //q.deQueue(); + } +} diff --git a/group11/283091182/src/com/coding/basic/Stack.java b/group11/283091182/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..48e17ed67d --- /dev/null +++ b/group11/283091182/src/com/coding/basic/Stack.java @@ -0,0 +1,48 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if(elementData.size()==0)throw new RuntimeException("Stack is empty."); + return elementData.remove(elementData.size()-1); + } + + public Object peek(){ + if(elementData.size()==0)throw new RuntimeException("Stack is empty."); + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return (elementData.size()==0); + } + public int size(){ + return elementData.size(); + } + + @Override + public String toString(){ + return elementData.toString(); + } + + public static void main(String[] args){ + Stack s = new Stack(); + s.push("aaa"); + s.push("bbb"); + s.push("ccc"); + System.out.println(s); + System.out.println(s.isEmpty()); + System.out.println(s.size()); + System.out.println(s.peek()); + System.out.println(s.pop()); + System.out.println(s.pop()); + System.out.println(s.pop()); + System.out.println(s); + System.out.println(s.isEmpty()); + System.out.println(s.size()); + //System.out.println(s.pop()); + } +} diff --git a/group11/395443277/.gitignore b/group11/395443277/.gitignore new file mode 100644 index 0000000000..e02fdb6730 --- /dev/null +++ b/group11/395443277/.gitignore @@ -0,0 +1,111 @@ + + +.metadata + +bin/ + +tmp/ + +*.tmp + +*.bak + +*.swp + +*~.nib + +local.properties + +.settings/ + +.loadpath + +.recommenders + + + +# Eclipse Core + +.project + + + +# External tool builders + +.externalToolBuilders/ + + + +# Locally stored "Eclipse launch configurations" + +*.launch + + + +# PyDev specific (Python IDE for Eclipse) + +*.pydevproject + + + +# CDT-specific (C/C++ Development Tooling) + +.cproject + + + +# JDT-specific (Eclipse Java Development Tools) + +.classpath + + + +# Java annotation processor (APT) + +.factorypath + + + +# PDT-specific (PHP Development Tools) + +.buildpath + + + +# sbteclipse plugin + +.target + + + +# Tern plugin + +.tern-project + + + +# TeXlipse plugin + +.texlipse + + + +# STS (Spring Tool Suite) + +.springBeans + + + +# Code Recommenders + +.recommenders/ + + + +# Scala IDE specific (Scala & Java development for Eclipse) + +.cache-main + +.scala_dependencies + +.worksheet \ No newline at end of file diff --git a/group11/395443277/src/com/coderising/array/ArrayUtil.java b/group11/395443277/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..d73df85b05 --- /dev/null +++ b/group11/395443277/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,254 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int first = 0; + int last = origin.length - 1; + + while (first < last) { + int temp; + temp = origin[first]; + origin[first] = origin[last]; + origin[last] = temp; + + first++; + last--; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + // count how many zeros + int zeroCount = 0; + int len= oldArray.length; + + if (len==0) { + return new int[]{}; + } + + for (int i=0; i parameters) { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + * + */ + + // create a new DocumentBuilderFactory + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + + try { + // use the factory to create a documentbuilder + DocumentBuilder builder = factory.newDocumentBuilder(); + InputStream istream = Struts.class.getResourceAsStream("struts.xml"); + Document doc = builder.parse(istream); + + // find jsp page based on the result from execute result + Element element = doc.getDocumentElement(); + NodeList actionNodeList = element.getElementsByTagName("action"); + + for (int i = 0; i < actionNodeList.getLength(); i++) { + NamedNodeMap actionNodeAttr = actionNodeList.item(i).getAttributes(); + + if (actionNodeAttr.getNamedItem("name").getTextContent().equals(actionName)) { + String className = actionNodeAttr.getNamedItem("class").getTextContent(); + + Class cls = Class.forName(className); + Object obj = cls.newInstance(); + + // set name and password + Method setName = cls.getDeclaredMethod("setName", String.class); + Method setPassword = cls.getDeclaredMethod("setPassword", String.class); + setName.invoke(obj, parameters.get("name")); + setPassword.invoke(obj, parameters.get("password")); + + // execute + Method execute = cls.getDeclaredMethod("execute"); + String executeResult = (String) execute.invoke(obj); + + // get message and jsp + Method getMessage = cls.getDeclaredMethod("getMessage"); + String msg = (String) getMessage.invoke(obj); + Map params = new HashMap(); + params.put("message",msg); + + // check result nodes + NodeList resultNodes = actionNodeList.item(i).getChildNodes(); + + String jsp = ""; + for (int j=0; j viewCls = Class.forName("com.coderising.litestruts.View"); + View viewObj = (View) viewCls.newInstance(); + Method setParameters = viewCls.getDeclaredMethod("setParameters", Map.class); + setParameters.invoke(viewObj, params); + Method setJsp = viewCls.getDeclaredMethod("setJsp", String.class); + setJsp.invoke(viewObj, jsp); + + return viewObj; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + +} diff --git a/group11/395443277/src/com/coderising/litestruts/StrutsTest.java b/group11/395443277/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group11/395443277/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group11/395443277/src/com/coderising/litestruts/View.java b/group11/395443277/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group11/395443277/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group11/395443277/src/com/coderising/litestruts/struts.xml b/group11/395443277/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..7f8d558286 --- /dev/null +++ b/group11/395443277/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group11/395443277/src/com/coding/basic/ArrayList.java b/group11/395443277/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..93a2781f3b --- /dev/null +++ b/group11/395443277/src/com/coding/basic/ArrayList.java @@ -0,0 +1,82 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[4]; + + public void add(Object o){ + if (size == elementData.length) { + // double size + doubleSize(); + } + + elementData[size] = o; + size++; + } + + private void doubleSize() { + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + + public void add(int index, Object o){ + // check size + if (size == elementData.length) { + doubleSize(); + } + + //shift and add element + System.arraycopy(elementData, index, elementData, index+1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + if (size == 0) { + return null; + } + + // remove element and shift + Object target = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, size - index - 1); + + // reset last element + elementData[size-1] = null; + size--; + return target; + } + + public int size(){ + return size; + } + + public Iterator iterator (){ + return new SeqIterator(); + } + + private class SeqIterator implements Iterator { + int i = 0; + + @Override + public boolean hasNext() { + return i < size; + } + + @Override + public Object next() { + if (!hasNext()) { + return null; + } + return elementData[i++]; + } + + } + +} diff --git a/group11/395443277/src/com/coding/basic/ArrayListTest.java b/group11/395443277/src/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..75bae320f4 --- /dev/null +++ b/group11/395443277/src/com/coding/basic/ArrayListTest.java @@ -0,0 +1,84 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class ArrayListTest { + + @Test + public void testAddObject() { + ArrayList list = new ArrayList(); + list.add(5); + assertEquals(5, list.get(0)); + + list.add(4); + list.add(3); + list.add(2); + list.add(1); + assertEquals(1, list.get(4)); + + // size equals to 5 + assertEquals(5, list.size()); + } + + @Test + public void testAddIntObject() { + ArrayList list = new ArrayList(); + list.add(5); + list.add(4); + list.add(3); + list.add(2); + list.add(1); + + // change position 2 element + list.add(2, 10); + + // pos 2 has 10 + assertEquals(10, list.get(2)); + + // last element is 1 + assertEquals(1, list.get(5)); + + // size is 6 + assertEquals(6, list.size()); + } + + @Test + public void testRemove() { + ArrayList list = new ArrayList(); + list.add(5); + list.add(4); + list.add(3); + list.add(2); + list.add(1); + + Object removed = list.remove(2); + assertEquals(removed, 3); + + assertEquals(2, list.get(2)); + assertEquals(4, list.size()); + assertEquals(null, list.get(4)); + + list.add(6); + assertEquals(6, list.get(4)); + } + + @Test + public void testIterator() { + ArrayList list = new ArrayList(); + list.add(5); + list.add(4); + list.add(3); + list.add(2); + list.add(1); + + Iterator it = list.iterator(); + if(it.hasNext()) { + assertEquals(5, it.next()); + assertEquals(4, it.next()); + } + + } + +} diff --git a/group11/395443277/src/com/coding/basic/BinaryTreeNode.java b/group11/395443277/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..907fc23275 --- /dev/null +++ b/group11/395443277/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,75 @@ +package com.coding.basic; + +public class BinaryTreeNode implements Comparable{ + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + if (this.compareTo(o)==0) { + return null; + } else { + // current value less than inserted value + // go right + if (this.compareTo(o)<0) { + if (this.right == null) { + BinaryTreeNode nd = new BinaryTreeNode(); + nd.setData(o); + this.setRight(nd); + } else { + this.getRight().insert(o); + } + } + // greater than + // go left + else if(this.compareTo(o)>0) { + if (this.left == null) { + BinaryTreeNode nd = new BinaryTreeNode(); + nd.setData(o); + this.setLeft(nd); + } else { + this.getLeft().insert(o); + } + } + } + + return null; + } + + /** + * oversimplified implementation: only allows int and string + */ + @Override + public int compareTo(Object nd) throws ClassCastException{ + if (!(nd instanceof Object)) { + throw new ClassCastException("An object expected."); + } + + if (nd instanceof String) { + return ((String)this.data).compareTo((String) nd); + } else { + return ((int) this.data) -((int) nd); + } + } + +} diff --git a/group11/395443277/src/com/coding/basic/BinaryTreeNodeTest.java b/group11/395443277/src/com/coding/basic/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..1c5c637ccd --- /dev/null +++ b/group11/395443277/src/com/coding/basic/BinaryTreeNodeTest.java @@ -0,0 +1,40 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class BinaryTreeNodeTest { + + @Test + public void testInsert() { + BinaryTreeNode root = new BinaryTreeNode(); + root.setData(3); + + root.insert(2); + BinaryTreeNode left = root.getLeft(); + assertEquals(2,left.getData()); + + root.insert(5); + BinaryTreeNode right = root.getRight(); + assertEquals(5, right.getData()); + + root.insert(7); + BinaryTreeNode rr = right.getRight(); + assertEquals(7, rr.getData()); + } + + @Test + public void testCompareTo() { + BinaryTreeNode n1 = new BinaryTreeNode(); + n1.setData("abc"); + + assertEquals(true, n1.compareTo("cde")<0); + + BinaryTreeNode n3 = new BinaryTreeNode(); + n3.setData(1); + + assertEquals(true, n3.compareTo(2)<0); + } + +} diff --git a/group11/395443277/src/com/coding/basic/Iterator.java b/group11/395443277/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group11/395443277/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group11/395443277/src/com/coding/basic/LinkedList.java b/group11/395443277/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..fb9fbd81ca --- /dev/null +++ b/group11/395443277/src/com/coding/basic/LinkedList.java @@ -0,0 +1,156 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + private Node head; + + public void add(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + + if (head == null) { + head = newNode; + } else { + Node curr = head; + while(curr.next != null) { + curr = curr.next; + } + curr.next = newNode; + } + } + public void add(int index , Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + + if (head == null) { + head = newNode; + } else { + Node curr = head; + Node prev = curr; + while(index >0 && curr.next != null) { + prev = curr; + curr = curr.next; + index--; + } + + prev.next = newNode; + newNode.next = curr; + } + } + public Object get(int index){ + Node curr = head; + while(index > 0) { + curr = curr.next; + index--; + } + return curr.data; + } + public Object remove(int index){ + if (index ==0) { + return this.removeFirst(); + } + + Node curr = head; + Node prev = curr; + while(index >0 && curr.next != null) { + prev = curr; + curr = curr.next; + index--; + } + + Object target = curr.data; + prev.next = curr.next; + curr.next = null; + + return target; + } + public int size(){ + int size = 0; + Node curr = head; + while(curr != null) { + size++; + curr = curr.next; + } + return size; + } + public void addFirst(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + + if (head == null) { + head = newNode; + } else { + newNode.next = head.next; + head.next = newNode; + } + } + public void addLast(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + + Node curr = head; + if (head == null) { + head = newNode; + } else { + while(curr.next != null) { + curr = curr.next; + } + curr.next = newNode; + } + } + public Object removeFirst(){ + if (head == null) { + return null; + } + + Object target = head.data; + head = head.next; + return target; + } + public Object removeLast(){ + if (head == null) { + return null; + } + Node curr = head; + Node prev = curr; + while(curr.next != null) { + prev = curr; + curr = curr.next; + } + Object target = curr.data; + prev.next = null; + return target; + } + public Iterator iterator(){ + return new SeqIterator(); + } + + private class SeqIterator implements Iterator { + Node curr = head; + + @Override + public boolean hasNext() { + return curr != null; + } + + @Override + public Object next() { + if (!hasNext()) throw new NoSuchElementException(); + Object target = curr.data; + curr = curr.next; + return target; + } + + } + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group11/395443277/src/com/coding/basic/LinkedListTest.java b/group11/395443277/src/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..af5aa2d3a2 --- /dev/null +++ b/group11/395443277/src/com/coding/basic/LinkedListTest.java @@ -0,0 +1,127 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class LinkedListTest { + + @Test + public void testAddObject() { + LinkedList list = new LinkedList(); + list.add(5); + assertEquals(1, list.size()); + assertEquals(5, list.get(0)); + + list.add(4); + list.add(3); + list.add(2); + assertEquals(4, list.size()); + assertEquals(4, list.get(1)); + assertEquals(3, list.get(2)); + assertEquals(2, list.get(3)); + } + + @Test + public void testAddIntObject() { + LinkedList list = new LinkedList(); + list.add(0, 5); + assertEquals(1, list.size()); + assertEquals(5, list.get(0)); + + list.add(4); + list.add(3); + list.add(2); + + list.add(1, 1); + assertEquals(1, list.get(1)); + } + + @Test + public void testRemove() { + LinkedList list = new LinkedList(); + assertEquals(null, list.remove(0)); + list.add(4); + assertEquals(4, list.remove(0)); + + list.add(5); + list.add(-1); + list.add(16); + list.add(2); + list.add(7); + assertEquals(16, list.remove(2)); + assertEquals(4, list.size()); + assertEquals(2, list.get(2)); + } + + @Test + public void testAddFirst() { + LinkedList list = new LinkedList(); + list.addFirst(5); + assertEquals(1, list.size()); + assertEquals(5, list.get(0)); + + list.addFirst(4); + list.addFirst(3); + list.addFirst(2); + assertEquals(4, list.size()); + assertEquals(2, list.get(1)); + assertEquals(3, list.get(2)); + assertEquals(4, list.get(3)); + } + + @Test + public void testAddLast() { + LinkedList list = new LinkedList(); + list.addLast(5); + assertEquals(1, list.size()); + assertEquals(5, list.get(0)); + + list.addLast(4); + list.addLast(3); + list.addLast(2); + assertEquals(4, list.size()); + assertEquals(4, list.get(1)); + assertEquals(3, list.get(2)); + assertEquals(2, list.get(3)); + } + + @Test + public void testRemoveFirst() { + LinkedList list = new LinkedList(); + assertEquals(null, list.removeFirst()); + + list.add(4); + list.add(3); + list.add(2); + assertEquals(4, list.removeFirst()); + assertEquals(3, list.removeFirst()); + assertEquals(2, list.removeFirst()); + } + + @Test + public void testRemoveLast() { + LinkedList list = new LinkedList(); + assertEquals(null, list.removeLast()); + + list.add(4); + list.add(3); + list.add(2); + assertEquals(2, list.removeLast()); + assertEquals(3, list.removeLast()); + } + + @Test + public void testIterator() { + LinkedList list = new LinkedList(); + list.add(4); + list.add(3); + list.add(2); + + Iterator it = list.iterator(); + + assertEquals(4, it.next()); + assertEquals(3, it.next()); + assertEquals(2, it.next()); + } +} diff --git a/group11/395443277/src/com/coding/basic/List.java b/group11/395443277/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group11/395443277/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group11/395443277/src/com/coding/basic/Queue.java b/group11/395443277/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..f12e73d46d --- /dev/null +++ b/group11/395443277/src/com/coding/basic/Queue.java @@ -0,0 +1,21 @@ +package com.coding.basic; + +public class Queue { + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + return elementData.size()==0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group11/395443277/src/com/coding/basic/QueueTest.java b/group11/395443277/src/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..bd1ec0487a --- /dev/null +++ b/group11/395443277/src/com/coding/basic/QueueTest.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class QueueTest { + + @Test + public void testEnQueue() { + Queue q = new Queue(); + assertEquals(0, q.size()); + + q.enQueue(1); + q.enQueue(2); + q.enQueue(3); + } + + @Test + public void testDeQueue() { + Queue q = new Queue(); + q.enQueue(1); + q.enQueue(2); + q.enQueue(3); + assertEquals(1, q.deQueue()); + assertEquals(2, q.deQueue()); + } + +} diff --git a/group11/395443277/src/com/coding/basic/Stack.java b/group11/395443277/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..28b9e8a203 --- /dev/null +++ b/group11/395443277/src/com/coding/basic/Stack.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + return elementData.remove(elementData.size()-1); + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size()==0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group11/395443277/src/com/coding/basic/StackTest.java b/group11/395443277/src/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..7b3c4d2cf6 --- /dev/null +++ b/group11/395443277/src/com/coding/basic/StackTest.java @@ -0,0 +1,45 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class StackTest { + + @Test + public void testPush() { + Stack st = new Stack(); + st.push(1); + assertEquals(1, st.peek()); + + st.push(2); + st.push(3); + st.push(4); + assertEquals(4, st.peek()); + } + + @Test + public void testPop() { + Stack st = new Stack(); + assertEquals(null, st.pop()); + + st.push(1); + assertEquals(1, st.pop()); + + st.push(2); + st.push(3); + st.push(4); + assertEquals(4, st.pop()); + } + + @Test + public void testIsEmpty() { + Stack st = new Stack(); + assertEquals(true, st.isEmpty()); + + st.push(1); + assertEquals(false, st.isEmpty()); + } + + +} diff --git a/group11/542194147/myDataStructure/.classpath b/group11/542194147/myDataStructure/.classpath new file mode 100644 index 0000000000..ddd63c6d08 --- /dev/null +++ b/group11/542194147/myDataStructure/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group11/542194147/myDataStructure/.gitignore b/group11/542194147/myDataStructure/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group11/542194147/myDataStructure/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group11/542194147/myDataStructure/.project b/group11/542194147/myDataStructure/.project new file mode 100644 index 0000000000..56bfc21f79 --- /dev/null +++ b/group11/542194147/myDataStructure/.project @@ -0,0 +1,17 @@ + + + myDataStructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtil.java b/group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..7512dac816 --- /dev/null +++ b/group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,208 @@ +package com.coderising.array; + +import java.util.Arrays; + +/** + * Array集合工具类 + * @author 小摩托 + * + */ +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public int[] reverseArray(int[] origin){ + if(origin.length==0){ + throw new RuntimeException("数组为空"); + } + int[]exchange=new int[origin.length]; + for(int i=origin.length-1;i>=0;i--){ + exchange[origin.length-1-i]=origin[i]; + } + return exchange; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int exchange[]={}; + for(int i=0;i parameters) { + + /* + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + View view=new View(); + try { + SAXReader sr=new SAXReader(); + Document document= sr.read(new File("src/com/coderising/litestruts/struts.xml")); + Element root=document.getRootElement(); + List actions=root.elements("action"); + for(Iterator it=actions.iterator();it.hasNext();){ + Element action =it.next(); + if(action.attribute("name").getText().equals(actionName)){ + LoginAction loginAction=(LoginAction)Class.forName( + action.attribute("class").getText()).newInstance(); + loginAction.setName(parameters.get("name")); + loginAction.setPassword(parameters.get("password")); + String loginMsg=loginAction.execute(); + if(loginMsg.equals("success")){ + Listresults=action.elements("result"); + for(it=results.iterator();it.hasNext();){ + Element result=it.next(); + if(result.attribute("name").getText().equals("success")){ + createView(view, loginAction, result); + } + } + } + if(loginMsg.equals("fail")){ + Listresults=action.elements("result"); + for(it=results.iterator();it.hasNext();){ + Element result=it.next(); + if(result.attribute("name").getText().equals("fail")){ + createView(view, loginAction, result); + } + } + } + if(loginMsg.equals("error")){ + Listresults=action.elements("result"); + for(it=results.iterator();it.hasNext();){ + Element result=it.next(); + if(result.attribute("name").getText().equals("error")){ + createView(view, loginAction, result); + } + } + } + } + } + } catch (Exception e) { + System.out.println("have exception:"+e); + e.printStackTrace(); + } + return view; + } + + private static void createView(View view, LoginAction loginAction, Element result) { + Map msgMap=new HashMap(); + msgMap.put("message", loginAction.getMessage()); + view.setParameters(msgMap); + view.setJsp(result.getText()); + } + +} diff --git a/group11/542194147/myDataStructure/src/com/coderising/litestruts/StrutsTest.java b/group11/542194147/myDataStructure/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..7fa9e9a4e5 --- /dev/null +++ b/group11/542194147/myDataStructure/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,40 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group11/542194147/myDataStructure/src/com/coderising/litestruts/View.java b/group11/542194147/myDataStructure/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..610ce0d092 --- /dev/null +++ b/group11/542194147/myDataStructure/src/com/coderising/litestruts/View.java @@ -0,0 +1,24 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group11/542194147/myDataStructure/src/com/coderising/litestruts/struts.xml b/group11/542194147/myDataStructure/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group11/542194147/myDataStructure/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group11/542194147/myDataStructure/src/com/coding/basic/MyArrayList.java b/group11/542194147/myDataStructure/src/com/coding/basic/MyArrayList.java new file mode 100644 index 0000000000..fbede89fa1 --- /dev/null +++ b/group11/542194147/myDataStructure/src/com/coding/basic/MyArrayList.java @@ -0,0 +1,133 @@ +package com.coding.basic; + +import java.util.Iterator; + +public class MyArrayList implements MyList { + + /** + * 数组默认大小 + */ + private static final int DEFAULT_SIZE = 10; + /** + * 储存元素的数组 + */ + private Object[] elementData =null; + /** + * 数组大小指针; + */ + private int capacity; + /** + * 当前游标 + */ + private int current; + + public MyArrayList(int size){ + if(size<0){ + throw new RuntimeException("大小不能小于0"); + }else{ + this.elementData= new Object[size]; + this.current=0; + this.capacity=size; + } + } + + public MyArrayList(){ + this(DEFAULT_SIZE); + } + + @Override + public void add(Object o) { + isOverSize();//判断数组容量是否满足,不满足增加空间 + this.elementData[current]=o; + this.current++; + } + + @Override + public void add(int index, Object o) { + isOverSize();//判断数组容量是否满足,不满足增加空间 + isOutOfBoundIndex(index);//判断数组下标是否越界 + System.arraycopy(elementData, index, elementData, index+1, this.elementData.length-index); + this.current++; + } + + @Override + public Object get(int index) { + isOutOfBoundIndex(index);//判断数组下标是否越界 + return this.elementData[index]; + } + + @Override + public Object remove(int index) { + isOutOfBoundIndex(index);//判断数组下标是否越界 + Object o=this.elementData[index]; + if(this.elementData.length>index+1){ + System.arraycopy(elementData, index+1, elementData, index,this.elementData.length-index-1); + } + this.elementData[this.elementData.length-1]=null; + return o; + } + + public Iterator iterator(){ + return new MyArrayListIterator(); + } + + @Override + public int size() { + return this.elementData.length; + } + + /** + * 判断数组容量是否满足,不满足增加空间 + */ + private void isOverSize() { + if(this.current==this.capacity){ + this.capacity+=MyArrayList.DEFAULT_SIZE; + } + Object[]newElementData=new Object[this.capacity]; + for(int i=0;ithis.capacity||index<0){ + throw new RuntimeException("数组下标越界"); + } + } + + /** + * MyArrayList的迭代器 + * @author 小摩托 + * + */ + private class MyArrayListIterator implements Iterator{ + + private int current=0; + + @Override + public boolean hasNext() { + return currentsize||index<0){//检查下标是否越界 + throw new RuntimeException("下标越界"); + } + if(index==this.size){ + addLast(o);//插到队尾 + }else{ + Node l= node(index); + addBeforeNode(o,l);//插到指定下标节点之前 + } + } + + @Override + public Object get(int index) { + if (index >= size || index < 0) { + throw new RuntimeException("下标越界"); + } + return node(index).data; + } + + @Override + public Object remove(int index) { + if (index >= size || index < 0) { + throw new RuntimeException("下标越界"); + } + Node l=node(index); + Node prevNode=l.prev; + Node nextNode=l.next; + if(prevNode==null){ + head=nextNode; + }else{ + prevNode.next=nextNode; + + } + if(nextNode==null){ + last=prevNode; + }else{ + nextNode.prev=prevNode; + } + l.prev =null; + l.next=null; + l.data=null; + return l.data; + } + + @Override + public int size() { + return size; + } + + /** + * 获取对应节点的下标 + * @param element + * @return + */ + public int indexOf(Object element) { + Node current = head; + int count = 0; + while (current != null) { + if (element != null) { + if (element.equals(current.data)) { + return count; + } + }else{ + if (current.data == null) { + return count; + } + } + count ++; + current = current.next; + } + return -1; + } + + /** + * 添加到对应下标的节点之前 + * @param o + * @param theNode + */ + public void addBeforeNode(Object o,Node theNode){ + Node prevNode=theNode.prev; + Node newNode= new Node(o,theNode,prevNode); + theNode.prev=newNode; + if(null==prevNode){ + this.head=newNode; + }else{ + prevNode.next=newNode; + } + size++; + } + + /** + * 默认添加到队尾 + * @param o + */ + public void addLast(Object o){ + Node l=this.last; + Node node= new Node(o,null,l); + if(null!=l){ + l.next=node; + }else{ + this.head=node; + } + size++; + } + + /** + * 查找对应下标的节点并返回 + * @param index + * @return + */ + private Node node(int index){ + if(index<(this.size>>1)){ + Node current=head; + for(int i=0;iindex;i--){ + current=current.prev; + } + return current; + } + } + + public Iterator iterator(){ + return new MyLinkedListIterator(); + } + + private class MyLinkedListIterator implements Iterator{ + private Node current=head; + + @Override + public boolean hasNext() { + + return current!=last; + } + + @Override + public Object next() { + if(hasNext()==false){ + throw new RuntimeException("不存在对应元素"); + } + Object o=current.data; + current=current.next; + return o; + } + + @Override + public void remove() { + int index=MyLinkedList.this.indexOf(current); + MyLinkedList.this.remove(index); + } + + } + /** + * 双向链表 + * @author 小摩托 + * + */ + private static class Node{ + Object data; + Node next; + Node prev; + public Node(Object d,Node n,Node p){ + this.data=d; + this.next=n; + this.prev=p; + } + } + +} diff --git a/group11/542194147/myDataStructure/src/com/coding/basic/MyList.java b/group11/542194147/myDataStructure/src/com/coding/basic/MyList.java new file mode 100644 index 0000000000..73f331beec --- /dev/null +++ b/group11/542194147/myDataStructure/src/com/coding/basic/MyList.java @@ -0,0 +1,34 @@ +package com.coding.basic; + +public interface MyList { + + /** + * 向集合中添加元素 + * @param o 任意类型元素 + */ + public void add(Object o); + /** + * 向集合中添加元素 + * @param index 指定位置下标 + * @param o 任意类型元素 + */ + public void add(int index, Object o); + /** + * 获取对应下标的元素 + * @param index 下标 + * @return 对应下标的元素 + */ + public Object get(int index); + /** + * 移除对应下标的元素 + * @param index 下标 + * @return + */ + public Object remove(int index); + /** + * 获取集合的大小 + * @return 大小数值 + */ + public int size(); + +} diff --git a/group11/542194147/myDataStructure/src/com/coding/basic/MyQueue.java b/group11/542194147/myDataStructure/src/com/coding/basic/MyQueue.java new file mode 100644 index 0000000000..c7fba907d4 --- /dev/null +++ b/group11/542194147/myDataStructure/src/com/coding/basic/MyQueue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class MyQueue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group11/542194147/myDataStructure/src/com/coding/basic/MyStack.java b/group11/542194147/myDataStructure/src/com/coding/basic/MyStack.java new file mode 100644 index 0000000000..705b3ec7e0 --- /dev/null +++ b/group11/542194147/myDataStructure/src/com/coding/basic/MyStack.java @@ -0,0 +1,25 @@ +package com.coding.basic; + +import java.util.ArrayList; + +public class MyStack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group11/635189253/dataStructure/.classpath b/group11/635189253/dataStructure/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group11/635189253/dataStructure/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group11/635189253/dataStructure/.gitignore b/group11/635189253/dataStructure/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group11/635189253/dataStructure/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group11/635189253/dataStructure/.project b/group11/635189253/dataStructure/.project new file mode 100644 index 0000000000..35bb23a0fc --- /dev/null +++ b/group11/635189253/dataStructure/.project @@ -0,0 +1,17 @@ + + + dataStructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group11/635189253/dataStructure/src/com/coding/basic/ArrayList.java b/group11/635189253/dataStructure/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..033cb6b5f5 --- /dev/null +++ b/group11/635189253/dataStructure/src/com/coding/basic/ArrayList.java @@ -0,0 +1,74 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public boolean add(Object o){ + add(size(), o); + size++; + return true; + } + public boolean add(int index, Object o){ + if (index >= 0 && index < elementData.length) { + for (int i = size(); i > index; i--) { + elementData[i] = elementData[i-1]; + } + elementData[index] = o; + } + size++; + return true; + } + + public Object get(int index){ + if (index >= 0 && index < size()) { + return elementData[index]; + } +// return null; + throw new ArrayIndexOutOfBoundsException(); + } + + public Object remove(int index){ + Object removedItem = elementData[index]; + if (index > size()) { + throw new ArrayIndexOutOfBoundsException(); + } + for (int i = index; i < size() - 1; i++) { + elementData[i] = elementData[i+1]; + } + size--; + return removedItem; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + + private int current = 0; + + public boolean hasNext() { + return current < size(); + } + + public Object next() { +/* if (elementData[current+1] != null) { + return elementData[current+1]; + } else { + return null; + }*/ + if (!hasNext()) { + throw new java.util.NoSuchElementException(); + } + return elementData[current++]; + } + } + +} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/BinaryTreeNode.java b/group11/635189253/dataStructure/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group11/635189253/dataStructure/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/Iterator.java b/group11/635189253/dataStructure/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e7cbd474ec --- /dev/null +++ b/group11/635189253/dataStructure/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/LinkedList.java b/group11/635189253/dataStructure/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..26818d8741 --- /dev/null +++ b/group11/635189253/dataStructure/src/com/coding/basic/LinkedList.java @@ -0,0 +1,191 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private int size; + private int modCount = 0; + private Node beginMarker; + private Node endMarker; + + private static class Node{ + public Node( Object d, Node p, Node n) { + data = d; + prev = p; + next = n; + } + public Object data; + public Node prev; + public Node next; + } + + public LinkedList () { + doClear(); + } + + public void clear() { + doClear(); + } + + private void doClear() { + beginMarker = new Node(null, null, null); + endMarker = new Node(null, beginMarker, null); + beginMarker.next = endMarker; + + size = 0; + modCount++; + } + + public boolean add(Object o){ + add(size(), o); + return true; + } + public boolean add(int index , Object o){ + /*if (index < 0 && index > size()) { + throw new IndexOutOfBoundsException(); + }*/ + addBefore( getNode( index, 0, size()), o); + return true; + } + + public void addFirst(Object o){ + add(0, o); + } + + public void addLast(Object o){ + add(size(), o); + } + + public Object removeFirst(){ + return remove(0); + } + + public Object removeLast(){ + return remove(size()); + } + + public Object get(int index){ + return getNode(index).data; + } + public Object remove(int index){ + return remove(getNode(index)); + } + + public int size(){ + return size; + } + + public boolean isEmpty() { + return size() == 0; + } + + private void addBefore( Node p, Object o ) { + Node newNode = new Node(o, p.prev, p ); + newNode.prev.next = newNode; + p.prev = newNode; +// p.prev = p.prev.next = new Node(o, p.prev, p); + size++; + modCount++; + } + + private Node getNode(int idx) { + return getNode(idx, 0, size() - 1); + } + + private Node getNode(int idx, int lower, int upper) { + Node p; + if (idx < lower || idx > upper) { + throw new IndexOutOfBoundsException(); + } + + if (idx < size() / 2) { + p = beginMarker.next; + for (int i = 0; i < idx; i++) { + p = p.next; + } + } else { + p = endMarker.prev; + for (int i = size(); i > idx; i--) { + p = p.prev; + } + } + return p; + } + + private Object remove( Node p ) { + p.prev.next = p.next; + p.next.prev = p.prev; + modCount++; + size--; + + return p.data; + } + + + public java.util.Iterator iterator() { + return new LinkListIterator(); + } + + private class LinkListIterator implements java.util.Iterator { + + private Node current = beginMarker.next; + private int expectedModCount = modCount; + private boolean okToRemove = false; + + @Override + public boolean hasNext() { + return current != endMarker; + } + + @Override + public Object next() { + if ( modCount != expectedModCount ) { + throw new java.util.ConcurrentModificationException(); + } + if (!hasNext()) { + throw new java.util.NoSuchElementException(); + } + Object nextItem = current.next; + current = current.next; + okToRemove = true; + return nextItem; + } + + public void remove() { + if ( modCount != expectedModCount ) { + throw new java.util.ConcurrentModificationException(); + } + if ( !okToRemove ) { + throw new IllegalStateException(); + } + LinkedList.this.remove(current.prev); + expectedModCount++; + okToRemove = false; + + } + } +} + +class TestLinkLedList { + + public static void main(String[] args) { + LinkedList lst = new LinkedList(); + for (int i = 0; i < 10; i++) { + lst.add(i); + } + for (int i = 20; i < 30; i++) { + lst.add(0, i); + } + + lst.remove(0); + lst.remove(lst.size()-1); + + System.out.println(lst); + + java.util.Iterator itr = lst.iterator(); + while (itr.hasNext()) { + itr.next(); + itr.remove(); + System.out.println(lst); + } + } +} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/List.java b/group11/635189253/dataStructure/src/com/coding/basic/List.java new file mode 100644 index 0000000000..66beb2b1c6 --- /dev/null +++ b/group11/635189253/dataStructure/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public boolean add(Object o); + public boolean add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/Queue.java b/group11/635189253/dataStructure/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..46890b2b03 --- /dev/null +++ b/group11/635189253/dataStructure/src/com/coding/basic/Queue.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList elementData; + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group11/635189253/dataStructure/src/com/coding/basic/Stack.java b/group11/635189253/dataStructure/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group11/635189253/dataStructure/src/com/coding/basic/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170225/ArrayList.java b/group11/729245768/DataStructure/src/main/coding_170225/ArrayList.java new file mode 100644 index 0000000000..d0a81044c6 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170225/ArrayList.java @@ -0,0 +1,86 @@ +import java.util.Arrays; + +/** + * Created by peter on 2017/2/22. + */ +public class ArrayList { + private Object[] elements = new Object[10]; + private int position = 0; + //添加元素 + public void add(Object o){ + //首先判断当前数组是否已满 + if(position==elements.length){ + ensureCapacity();//如果到达则扩展数组长度 + } + elements[position++] = o; + } + //在index位置添加元素 + public void add(int index,Object o){ + if(index<0||index>position){ + System.out.println("invalid index"); + throw new ArrayIndexOutOfBoundsException(); + } + if(position==elements.length){ + //如果此时数组已满 + ensureCapacity(); + } + for(int i=position-1;i>=index;i--){ + elements[i+1] = elements[i];//元素向后移动一位 + } + elements[index] = o; + position++;//数组元素个数加一 + } + + //获取index位置的元素 + public Object get(int index){ + if(index<0||index>position-1){ + System.out.println("不合法的index"); + throw new ArrayIndexOutOfBoundsException(); + } + return elements[index]; + } + + //删除index位置的元素 + public Object remove(int index){ + if(index<0||index>position-1){ + System.out.println("不合法的index"); + throw new ArrayIndexOutOfBoundsException(); + } + position--; + return elements[position+1]; + } + public int size(){ + return position; + } + //返回一个迭代器 + public Iterator getIterator(){ + return new ArrayListIterator(this); + } + //扩展数组大小,在原来基础上扩展一倍 + public void ensureCapacity(){ + elements = Arrays.copyOf(elements,elements.length); + } + private class ArrayListIterator implements Iterator{ + private ArrayList list; + int position=-1; + public ArrayListIterator(ArrayList list){ + this.list=list; + } + @Override + public boolean hasNext() { + if(++position=binaryTreeNode.getData()){ + //插入到左孩子 + parent.setLeft(binaryTreeNode); + }else{ + //插入到右孩子 + parent.setRight(binaryTreeNode); + } + } + //输出二叉树每个节点 + public void printBinaryTreeNode(BinaryTreeNode root){ + if(root==null){ + return; + } + if(root.getLeft()!=null){ + printBinaryTreeNode(root.getLeft()); + } + System.out.println(root.getData()); + if(root.getRight()!=null){ + printBinaryTreeNode(root.getRight()); + } + } + //获取根节点 + public BinaryTreeNode getRoot(){ + return root; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170225/BinaryTreeNode.java b/group11/729245768/DataStructure/src/main/coding_170225/BinaryTreeNode.java new file mode 100644 index 0000000000..0cea0f59c7 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170225/BinaryTreeNode.java @@ -0,0 +1,40 @@ + +/** + * Created by peter on 2017/2/23. + */ +public class BinaryTreeNode{ + private int data; + private BinaryTreeNode left=null; + private BinaryTreeNode right=null; + public BinaryTreeNode(){ + + } + + public BinaryTreeNode(int data){ + this.data=data; + } + + public int getData() { + return data; + } + + public void setData(int data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170225/Iterator.java b/group11/729245768/DataStructure/src/main/coding_170225/Iterator.java new file mode 100644 index 0000000000..a833ba0acd --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170225/Iterator.java @@ -0,0 +1,9 @@ + +/** + * Created by peter on 2017/2/23. + */ +public interface Iterator { + public boolean hasNext(); + public Object next(); + public Object remove(); +} diff --git a/group11/729245768/DataStructure/src/main/coding_170225/LinkedList.java b/group11/729245768/DataStructure/src/main/coding_170225/LinkedList.java new file mode 100644 index 0000000000..b02e7101b1 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170225/LinkedList.java @@ -0,0 +1,113 @@ + +/** + * Created by peter on 2017/2/22. + */ +public class LinkedList { + private Node head,tail; + private int size=0; + public void add(Object o){ + Node node = new Node(); + node.data = o; + node.next=null; + if(size==0){ + head=node; + tail=node; + }else{ + tail.next = node; + tail = tail.next; + } + size++; + } + public void add(int index,Object o){ + if(index<0||index>size){ + System.out.println("插入下标越界"); + throw new ArrayIndexOutOfBoundsException(); + } + //如果插入的位置是第一个 + if(index==0){ + Node node =new Node(); + node.data = o; + node.next = head; + head = node; + }else { + int i =0;//记录走过的节点 + Node p = head;//移动节点 + while (isize-1){ + System.out.println("访问下标越界"); + throw new ArrayIndexOutOfBoundsException(); + } + Node node =head; + int i=0; + while (isize-1){ + System.out.println("out of array"); + throw new ArrayIndexOutOfBoundsException(); + } + Object data=null;//用来存储返回值 + if(index==0){ + //删除的是第一个节点 + data = head.data; + head=head.next; + size--; + return data; + }else{ + Node p1=head,p2=null;//p1表示移动节点,p2是上一个节点 + int i =0;//表示移动的距离 + while (i list = new ArrayList<>(); + for(int i=6;i<=max;i++){ + if(isPerfectNumbers(i)){ + list.add(i); + } + } + int[] array = new int[list.size()]; + for(int i=0;i list = new ArrayList<>(); + int end =(int) Math.sqrt(element);// + for(int i=2;i<=end;){ + if(element%i==0){ + list.add(i); + element=element/i; + }else{ + i++; + } + } + int sum =1; + for(Integer i:list){ + sum+=i; + } + if(element==sum){ + return true; + }else{ + return false; + } + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder sb = new StringBuilder(); + for(int i=0;i parameters) throws DocumentException { + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + View view = new View(); + SAXReader saxReader = new SAXReader(); + Document document = saxReader.read(new File("DataStructure/src/main/coding_170302/struts.xml")); + Element root = document.getRootElement();//获取根元素 + List listOfAction = root.elements("action");//获取action子元素 + int i=0; + for(;i> inputs = parameters.entrySet(); + //执行setName和setPassword + for(Map.Entry input:inputs){ + String key = input.getKey(); + String value = input.getValue(); + String methodName = "set"+Character.toUpperCase(key.charAt(0))+key.substring(1); + Method method = c.getDeclaredMethod(methodName,String.class); + method.invoke(o,value); + } + //执行execute方法,并返回message + Method execute = c.getDeclaredMethod("execute"); + String returnMessage = (String)execute.invoke(o); + + Method[] methods = c.getDeclaredMethods(); + //获取所有getter方法,并且将值放到view的parameters中 + Map paraMap = new HashMap<>(); + for(int j=0;j 配置,以及execute的返回值, 确定哪一个jsp, + // 放到View对象的jsp字段中。 + List resultOfElements = action.elements("result"); + for(int k=0;k + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170225/ArrayListTest.java b/group11/729245768/DataStructure/tests/main/coding_170225/ArrayListTest.java new file mode 100644 index 0000000000..bde9c7a637 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170225/ArrayListTest.java @@ -0,0 +1,39 @@ +package main.coding_170225; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by peter on 2017/2/25. + */ +public class ArrayListTest extends TestCase { + @Test + public void add() throws Exception { + } + + @Test + public void add1() throws Exception { + + } + + @Test + public void get() throws Exception { + + } + + @Test + public void remove() throws Exception { + + } + + @Test + public void testSize() throws Exception { + ArrayList arrayList = new ArrayList(); + arrayList.add(12); + arrayList.add(15); + arrayList.add(17); + Assert.assertEquals(3,arrayList.size()); + } + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170225/BinaryTreeTest.java b/group11/729245768/DataStructure/tests/main/coding_170225/BinaryTreeTest.java new file mode 100644 index 0000000000..1492323570 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170225/BinaryTreeTest.java @@ -0,0 +1,37 @@ +package main.coding_170225; + +import junit.framework.TestCase; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by peter on 2017/2/25. + */ +public class BinaryTreeTest extends TestCase { + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testInsert() throws Exception { + + } + + @Test + public void testPrintBinaryTreeNode() throws Exception { + + } + + @Test + public void testGetRoot() throws Exception { + + } + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170302/ArrayUtilTest.java b/group11/729245768/DataStructure/tests/main/coding_170302/ArrayUtilTest.java new file mode 100644 index 0000000000..4d5cc38728 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170302/ArrayUtilTest.java @@ -0,0 +1,78 @@ +package main.coding_170302; + +import junit.framework.TestCase; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by peter on 2017/3/2. + */ +public class ArrayUtilTest extends TestCase { + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testReverseArray() throws Exception { + int[] array1 = {1,2,3,4,5,6,7}; + int[] array2 = {7,6,5,4,3,2,1}; + ArrayUtil util = new ArrayUtil(); + util.reverseArray(array1); + Assert.assertArrayEquals(array1,array2); + } + + @Test + public void testRemoveZero() throws Exception { + int[] array1 = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] arry2 = {1,3,4,5,6,6,5,4,7,6,7,5}; + Assert.assertArrayEquals(new ArrayUtil().removeZero(array1),arry2); +} + + @Test + public void testMerge() throws Exception { + int[] array1 = {3,5,7,8}; + int[] array2 = {4,5,6,7}; + int[] array = {3,4,5,6,7,8}; + Assert.assertArrayEquals(array,new ArrayUtil().merge(array1,array2)); + } + + @Test + public void testGrow() throws Exception { + int[] array1 ={2,3,6}; + int[] array2 = {2,3,6,0,0,0}; + Assert.assertArrayEquals(array2,new ArrayUtil().grow(array1,3)); + } + + @Test + public void testFibonacci() throws Exception { + int[] array1 = {1,1,2,3,5,8,13}; + Assert.assertArrayEquals(array1,new ArrayUtil().fibonacci(15)); + } + + @Test + public void testGetPrimes() throws Exception { + int[] array1 = {2,3,5,7,11,13,17,19}; + Assert.assertArrayEquals(array1,new ArrayUtil().getPrimes(23)); + } + + @Test + public void testGetPerfectNumbers() throws Exception { + int[] array1 = {6}; + Assert.assertArrayEquals(array1,new ArrayUtil().getPerfectNumbers(10)); + } + + @Test + public void testJoin() throws Exception { + int[] array1 = {3,8,9}; + Assert.assertEquals("3-8-9",new ArrayUtil().join(array1,"-")); + } + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170302/StrutsTest.java b/group11/729245768/DataStructure/tests/main/coding_170302/StrutsTest.java new file mode 100644 index 0000000000..309bdfc9ba --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170302/StrutsTest.java @@ -0,0 +1,42 @@ +package main.coding_170302; + +import junit.framework.TestCase; +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by peter on 2017/3/3. + */ +public class StrutsTest extends TestCase { + @Test + public void testLoginActionSuccess() throws DocumentException { + String actionName = "login"; + + Map params = new HashMap<>(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + @Test + public void testLoginActionFailed() throws DocumentException { + String actionName = "login"; + Map params = new HashMap<>(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} \ No newline at end of file diff --git a/group11/996108220/.classpath b/group11/996108220/.classpath new file mode 100644 index 0000000000..38ac5e9632 --- /dev/null +++ b/group11/996108220/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group11/996108220/.gitignore b/group11/996108220/.gitignore new file mode 100644 index 0000000000..5e56e040ec --- /dev/null +++ b/group11/996108220/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/group11/996108220/.project b/group11/996108220/.project new file mode 100644 index 0000000000..4a9996c48b --- /dev/null +++ b/group11/996108220/.project @@ -0,0 +1,17 @@ + + + 996108220Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group11/996108220/src/com/coderising/array/ArrayUtil.java b/group11/996108220/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..dd8633fb05 --- /dev/null +++ b/group11/996108220/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,194 @@ +package com.coderising.array; + +import com.coding.basic.ArrayList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int mid=origin.length%2==1?origin.length/2:origin.length/2-1; + for (int i = 0; i <= mid; i++) { + int vlaue=origin[i]; + origin[i]=origin[origin.length-1-i]; + origin[origin.length-1-i]=vlaue; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + ArrayList list=new ArrayList(); + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i]!=0) { + list.add(oldArray[i]); + } + } + int[] array=new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i]=(int) list.get(i); + } + + return array; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int[] array=new int[array1.length+array2.length]; + int ptr1=0;int ptr2=0;int index=0; + while (ptr1!=array1.length&&ptr2!=array2.length) { + array[index++]=array1[ptr1]>array2[ptr2]?array2[ptr2++]:array1[ptr1++]; + } + if (ptr1==array1.length) { + for (int i = ptr2; i < array2.length; i++)array[index++]=array2[i]; + } + else { + for (int i = ptr1; i < array1.length; i++)array[index++]=array1[i]; + } + return array; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int [] array=new int[oldArray.length+size]; + for (int i = 0; i < oldArray.length; i++) { + array[i]=oldArray[i]; + } + return array; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + + if (max==1) { + return null; + } + else if (max==2) { + return new int[]{1,1}; + } + else { + ArrayList list=new ArrayList(); + list.add(1); + list.add(1); + int next=2; + while (next messageToresult=null; + public String getActionName() { + return actionName; + } + public void setActionName(String actionName) { + this.actionName = actionName; + } + public String getClazzName() { + return clazzName; + } + public void setClazzName(String clazzName) { + this.clazzName = clazzName; + } + public HashMap getMessageToresult() { + return messageToresult; + } + public void setMessageToresult(HashMap messageToresult) { + this.messageToresult = messageToresult; + } + public ActionConfig(String actionName, String clazzName, + HashMap messageToresult) { + super(); + this.actionName = actionName; + this.clazzName = clazzName; + this.messageToresult = messageToresult; + } + + +} diff --git a/group11/996108220/src/com/coderising/litestruts/LoginAction.java b/group11/996108220/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..546a95bc43 --- /dev/null +++ b/group11/996108220/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,40 @@ +package com.coderising.litestruts; + + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction implements Action{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group11/996108220/src/com/coderising/litestruts/LogoutAction.java b/group11/996108220/src/com/coderising/litestruts/LogoutAction.java new file mode 100644 index 0000000000..4c522953e4 --- /dev/null +++ b/group11/996108220/src/com/coderising/litestruts/LogoutAction.java @@ -0,0 +1,35 @@ +package com.coderising.litestruts; + +public class LogoutAction implements Action{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "logout successful"; + return "success"; + } + this.message = "logout failed,please try again"; + return "error"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} + diff --git a/group11/996108220/src/com/coderising/litestruts/Struts.java b/group11/996108220/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..69dac49d84 --- /dev/null +++ b/group11/996108220/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,167 @@ +package com.coderising.litestruts; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import com.coderising.litestruts.Action; + + + +/* + +0. 读取配置文件struts.xml + +1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) +据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 +("name"="test" , "password"="1234") , +那就应该调用 setName和setPassword方法 + +2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + +3. 通过反射找到对象的所有getter方法(例如 getMessage), +通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , +放到View对象的parameters + +4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, +放到View对象的jsp字段中。 + +*/ + +public class Struts { + //strut.xml文件所在的路径 + public static final String dir="/mycoding2017/group11/996108220/src/com/coderising/litestruts/struts.xml"; + + /** + * 用户提供action动作,以及用户名和密码,对应返回view视图 + * @param actionName 登入登出 + * @param parameters 用户名密码 + */ + public static View runAction(String actionName, Map parameters) throws Exception { + ActionConfig actionConfig=getActionConfig(actionName); + Action action=createAction(actionConfig.getClazzName(),parameters); + String message=getActionMessage(action); + View view=updaView(getALL(action), actionConfig, message); + return view; + } + + /** + * 步骤0:读取配置文件,将文件中的action生成ActionDao + * @param actionName传入action的名字 + */ + private static ActionConfig getActionConfig(String name) throws Exception { + // 生成一个Dom解析器 + DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + // 解析XML文件 + Document document = builder.parse(dir); + NodeList actions = document.getElementsByTagName("action"); + int j = 0;String actionName="";String clazzName=""; + for (; j < actions.getLength(); j++) { + actionName= actions.item(j).getAttributes().getNamedItem("name").getNodeValue(); + if (actionName.equals(name)) { + clazzName=actions.item(j).getAttributes().getNamedItem("class").getNodeValue(); + break; + } + } + if (actions.item(0).getNodeType() == Node.ELEMENT_NODE) { + + Element action =(Element) actions.item(j); + NodeList results =action.getElementsByTagName("result"); + HashMap map=new HashMap(); + for (int i = 0; i < results.getLength(); i++) { + String nameString=results.item(i).getAttributes().getNamedItem("name").getNodeValue(); + String pageString=results.item(i).getTextContent(); + map.put(nameString, pageString); + } + return new ActionConfig(actionName, clazzName, map); + } + return null; + } + /** + * 步骤1:反射创建action的对象,将name和password赋值 + * @param clazzName + * @return + */ + private static Action createAction(String clazzName,Map parameters) throws Exception { + Class clazz=Class.forName(clazzName); + Object action = clazz.newInstance() ; + Method nameSetter = action.getClass().getMethod("setName", String.class); + nameSetter .invoke(action, parameters.get("name")); + Method passwordSetter = action.getClass().getMethod("setPassword", String.class); + passwordSetter.invoke(action, parameters.get("password")); + return (Action) action; + } + /** + * 步骤2:反射运行execute方法,获得message + * @param action + * @return message + */ + private static String getActionMessage (Action action) throws Exception { + + return (String) action.getClass().getMethod("execute").invoke(action); + + } + /** + * 步骤3:将action中get方法与get到的值的映射关系记录到view里的Parameters表中 + * @param action + * @return view + */ + private static View getALL(Action action) throws Exception { + HashMap map=new HashMap<>(); + Method nameGetter = action.getClass().getMethod("getName"); + map.put("name", (String) nameGetter.invoke(action)); + Method passwordGetter = action.getClass().getMethod("getPassword"); + map.put("password", (String) passwordGetter.invoke(action)); + Method MessageGetter = action.getClass().getMethod("getMessage"); + map.put("message", (String) MessageGetter.invoke(action)); + View view=new View(); + view.setParameters(map); + return view; + } + /** + * 步骤4:将execute获得的message查找Struts配置文件将对应的页面记录到view中 + * @param view + * @param actionConfig + * @param message + * @return + */ + private static View updaView(View view,ActionConfig actionConfig,String message) { + return view.setJsp(actionConfig.getMessageToresult().get(message)); + } +// public static void main(String[] args) { +// DocumentBuilder builder; +// try { +// builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); +// Document doc = builder.parse(dir); +// NodeList beans = doc.getElementsByTagName("action"); +// for (int j = 0; j < beans.getLength(); j++) { +// System.out.println(beans.item(j).getAttributes().getNamedItem("name").getNodeValue()); +// System.out.println(beans.item(j).getAttributes().getNamedItem("class").getNodeValue()); +// } +// if (beans.item(0).getNodeType() == Node.ELEMENT_NODE) { +// +// Element action =(Element) beans.item(0); +// NodeList results =action.getElementsByTagName("result"); +// HashMap map=new HashMap(); +// System.out.println(results.getLength()); +// for (int i = 0; i < results.getLength(); i++) { +// System.out.println(results.item(i).getAttributes().getNamedItem("name").getNodeValue()); +// System.out.println(results.item(i).getTextContent()); +// } +// } +// +//// NamedNodeMap name = beans.item(0).getAttributes(); +// +// } catch (Exception e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } + + +// } + +} diff --git a/group11/996108220/src/com/coderising/litestruts/StrutsTest.java b/group11/996108220/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..40664a22e6 --- /dev/null +++ b/group11/996108220/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,63 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws Exception { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + @Test + public void testLogoutActionSuccess() throws Exception { + + String actionName = "logout"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/welcome.jsp", view.getJsp()); + Assert.assertEquals("logout successful", view.getParameters().get("message")); + } + + @Test + public void testLogoutActionFailed() throws Exception { + String actionName = "logout"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/error.jsp", view.getJsp()); + Assert.assertEquals("logout failed,please try again", view.getParameters().get("message")); + } +} diff --git a/group11/996108220/src/com/coderising/litestruts/View.java b/group11/996108220/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group11/996108220/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group11/996108220/src/com/coderising/litestruts/struts.xml b/group11/996108220/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group11/996108220/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group11/996108220/src/com/coding/basic/ArrayList.java b/group11/996108220/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..549814a3ff --- /dev/null +++ b/group11/996108220/src/com/coding/basic/ArrayList.java @@ -0,0 +1,132 @@ +package com.coding.basic; + + +public class ArrayList implements List { + + private int size = 0; + private Object[] elementData = new Object[100]; + /** + * 在队尾添加元素 + */ + public void add(Object o){ + if(size+1>elementData.length)this.grow(elementData); + else elementData[size++]=o; + } + /** + * 在index处添加元素,index+1到size-1元素向后移动 + */ + public void add(int index, Object o){ + if(index<0||index>size){ + System.out.println("数组越界"+index); + return; + } + if(size+1>elementData.length)this.grow(elementData); + else { + for(int i=size;i>=index+1;) + { + elementData[i]=elementData[--i]; + } + size++; + elementData[index]=o; + } + + } + /** + * 获得index处的元素elementData[index] + */ + public Object get(int index){ + //TODO越界抛出异常 + if(index<0||index>size){ + System.out.println("数组越界"+index); + return null; + } + else{ + return elementData[index]; + } + } + /** + * 移除index处的元素,将index+1到size-1的元素向前移动 + */ + public Object remove(int index){ + //TODO越界抛出异常 + if(index<0||index>=size){ + System.out.println("数组越界"+index); + return null; + } + else{ + Object value=elementData[index]; + for(int i=index;i= size) + System.out.println("超过size");; + Object[] elementData = ArrayList.this.elementData; + if (i >= elementData.length) + System.out.println("超过length"); + cursor = i + 1; + return elementData[i]; + } + + } + public Object[] toArray() { + Object[] array= new Object[size]; + for (int i = 0; i < elementData.length; i++) { + array[i]=elementData[i]; + } + return array; + } + public void grow(Object[] elementData2){ + int[] elementData=new int[elementData2.length+elementData2.length/2]; + System.arraycopy(elementData2,0,elementData,0,elementData2.length); + } + /** + * 测试方法 + * @param args + */ + public static void main(String args[]){ + ArrayList list=new ArrayList(); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + //list.add(2,0); + //list.remove(list.size-1); + System.out.println(list.size()); + Iterator itr=list.iterator(); + while (itr.hasNext()) { + System.out.println(itr.next()); + + } + } + +} + diff --git a/group11/996108220/src/com/coding/basic/BinaryTree.java b/group11/996108220/src/com/coding/basic/BinaryTree.java new file mode 100644 index 0000000000..4d2b4755fc --- /dev/null +++ b/group11/996108220/src/com/coding/basic/BinaryTree.java @@ -0,0 +1,129 @@ +package com.coding.basic; + +import com.sun.corba.se.impl.orbutil.graph.Node; + +public class BinaryTree { + + private BinaryTreeNode root=null; + private int size=0; + /** + * 插入节点,保持二叉树的性质 + * @param o + */ + public void insert(T o){ + if (size==0) { + root=new BinaryTreeNode(o); + } + else{ + insert(o,root); + } + size++; + } + + private void insert(T o, BinaryTreeNode ptr) { + if ((ptr.right==null&&(ptr.data.compareTo(o)<=0))){ + ptr.right=new BinaryTreeNode(o); + } + else if (ptr.left==null&&(ptr.data.compareTo(o)>0)) { + ptr.left=new BinaryTreeNode(o); + + } + else if (ptr.left!=null&&(ptr.data.compareTo(o)>0)) { + insert(o, ptr.left); + } + else { + insert(o, ptr.right); + } + } + private static class BinaryTreeNode { + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode(T o) { + this.data=o; + this.left=null; + this.right=null; + } + private BinaryTreeNode() { + + } + } + /** + * 前序遍历 + */ + public void preOrder(BinaryTreeNode Node) + { + if (Node != null) + { + System.out.print(Node.data + " "); + preOrder(Node.left); + preOrder(Node.right); + } + } + + /** + * 中序遍历 + */ + public void midOrder(BinaryTreeNode Node) + { + if (Node != null) + { + midOrder(Node.left); + System.out.print(Node.data + " "); + midOrder(Node.right); + } + } + + /** + * 后序遍历 + */ + public void posOrder(BinaryTreeNode Node) + { + if (Node != null) + { + posOrder(Node.left); + posOrder(Node.right); + System.out.print(Node.data + " "); + } + } + /** + * @param key查找元素 + * @param node + * @return 返回date的node引用 + */ + public BinaryTreeNode searchNode(T key,BinaryTreeNode node) { + if (node!=null) { + if (node.data.compareTo(key)==0) { + return node; + } + else if (node.data.compareTo(key)>0) { + return searchNode(key,node.left); + } + else { + return searchNode(key,node.right); + } + } + else{ + return null; + } + } + + public static void main(String[] args) { + BinaryTree tree=new BinaryTree(); + tree.insert(5); + tree.insert(3); + tree.insert(1); + tree.insert(6); + tree.insert(5); + tree.insert(2); + tree.preOrder(tree.root); + System.out.println(); + tree.posOrder(tree.root); + System.out.println(); + tree.midOrder(tree.root); + System.out.println(tree.searchNode(1, tree.root).data); + + + } + +} diff --git a/group11/996108220/src/com/coding/basic/Iterator.java b/group11/996108220/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group11/996108220/src/com/coding/basic/LinkedList.java b/group11/996108220/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..7b9336b43f --- /dev/null +++ b/group11/996108220/src/com/coding/basic/LinkedList.java @@ -0,0 +1,176 @@ +package com.coding.basic; +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + private int size=0; +/** + * 增加节点 + */ + public void add(Object o){ + if(size==0){ + head=new Node(); + head.data=o; + head.next=null; + size++; + } + else{ + addLast(o); + } + + } +/** + * 在index(0~size)处添加元素 + */ + public void add(int index , Object o){ + + if(index<0||index>size){ + System.out.println("index超出范围"+index); + return; + } + if(index==0)addFirst( o); + else if(index==size)addLast(o); + else{ + Node ptr=head; + for(int i=1;i=size)return null; + else{ + Node ptr=head; + for(int i=0;i=size)return null; + else if(index==0)return removeFirst(); + else if(index==size-1)return removeLast(); + else{ + Node ptr=head; + for(int i=1;isize){ + throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); + } + grow(); + if(indexsize){ + throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); + } + return elementData[index]; + } + + public Object remove(int index){ + + Object o = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, size-(index+1)); + size --; + return o; + } + + public int size(){ + return size; + } + + /** + * 扩容,扩容因子为10 + */ + private void grow(){ + + if(size>=elementData.length){//长度不够需要扩容 + newElementData = new Object[size+GENE]; + System.arraycopy(elementData, 0, newElementData, 0, elementData.length); + elementData = newElementData; + } + } + + + public Iterator iterator(){ + + return new Itr(); + } + + private class Itr implements Iterator{ + + int cursor; + @Override + public boolean hasNext() { + return cursor != ArrayList.this.size; + } + + @Override + public Object next() { + + int i = this.cursor; + if (i >= ArrayList.this.size){ + throw new NoSuchElementException(); + } + this.cursor = (i + 1); + return ArrayList.this.elementData[i]; + } + + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java new file mode 100644 index 0000000000..3449517197 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java @@ -0,0 +1,64 @@ +package com.coding.basic; + +public class BinaryTree { + + //根节点 + private BinaryTreeNode root; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public > BinaryTreeNode insert(T o){ + + BinaryTreeNode treeNode = new BinaryTreeNode(); + treeNode.setData(o); + if(root == null){ + root = treeNode; + }else{ + BinaryTreeNode currentNode = root; + BinaryTreeNode parent; + while(true){ + parent = currentNode; + if(((Comparable)currentNode.getData()).compareTo(o)>0){//向左放 + currentNode = currentNode.getLeft(); + if(currentNode == null){ + parent.setLeft(treeNode); + treeNode.setParent(parent); + break; + } + }else{//向右放 + currentNode = currentNode.getRight(); + if(currentNode == null){ + parent.setRight(treeNode); + treeNode.setParent(parent); + break; + } + } + } + } + return treeNode; + } + + /** + * 先序遍历 + * @param node + * @return + */ + public List traversalBefore(BinaryTreeNode node){ + //所有数据集合 + List datas = new ArrayList(); + return traversal(node,datas); + } + private List traversal(BinaryTreeNode node,List datas){ + + if(node !=null){ + datas.add(node.getData()); + traversal(node.getLeft(),datas); + traversal(node.getRight(),datas); + } + return datas; + } + + public BinaryTreeNode getRoot() { + return root; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..a8e6b66edd --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,37 @@ +package com.coding.basic; +public class BinaryTreeNode { + + private Object data; + //父节点 + private BinaryTreeNode parent; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode getParent() { + return parent; + } + public void setParent(BinaryTreeNode parent) { + this.parent = parent; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java b/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..c854120212 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java b/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..460298ff56 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java @@ -0,0 +1,137 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + + private int size = 0; + + public void add(Object o){ + + Node addNode = new Node(); + addNode.data = o; + if(size==0){ + head = addNode; + }else{ + //获取最后一个节点 + Node lastNode = getPointNode(size-1); + lastNode.next = addNode; + } + size++; + } + public void add(int index , Object o){ + + Node addNode = new Node(); + addNode.data = o; + if(index == 0){ + addFirst(o); + return; + } + if(index == size){ + Node lastNode = getPointNode(size-1); + lastNode.next = addNode; + }else{ + Node pointNode = getPointNode(index); + Node prePointNode = getPointNode(index-1); + prePointNode.next = addNode; + addNode.next = pointNode; + } + size ++; + } + public Object get(int index){ + + Node node = getPointNode(index); + return node.data; + } + + public Object remove(int index){ + + Node pointNode = getPointNode(index); + Node nextPointNode = getPointNode(index+1); + if(index ==0){ + head = nextPointNode; + }else{ + Node prePointNode = getPointNode(index-1); + prePointNode.next = nextPointNode; + } + size --; + return pointNode.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + + Node secondNode = head; + head = new Node(); + head.data = o; + if(size>0){ + head.next = secondNode; + } + size ++; + } + + public void addLast(Object o){ + add(o); + } + + public Object removeFirst(){ + + return remove(0); + } + + public Object removeLast(){ + + return remove(size-1); + } + public Iterator iterator(){ + return new Itr(); + } + + private class Itr implements Iterator{ + + int cursor; + @Override + public boolean hasNext() { + return cursor != LinkedList.this.size; + } + + @Override + public Object next() { + + int i = this.cursor; + if (i >= LinkedList.this.size){ + throw new NoSuchElementException(); + } + this.cursor = (i + 1); + return LinkedList.this.get(i); + } + + } + + /** + * 获取指定的节点 + * @return + */ + private Node getPointNode(int index){ + + if(index>size){ + throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size+""); + } + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node; + } + + private static class Node{ + Object data; + Node next; + + } +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/List.java b/group12/2258659044/zj-2017/src/com/coding/basic/List.java new file mode 100644 index 0000000000..a5a3688eb6 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/List.java @@ -0,0 +1,10 @@ +package com.coding.basic; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java b/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..e29ff65ddf --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java @@ -0,0 +1,26 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList element = new LinkedList(); + + public void enQueue(Object o){ + + element.add(o); + } + + public Object deQueue(){ + + return element.removeFirst(); + } + + public boolean isEmpty(){ + + return element.size()==0; + } + + public int size(){ + + return element.size(); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java b/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..03709097e5 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + + elementData.add(o); + } + + public Object pop(){ + + return elementData.remove(size()-1); + } + + public Object peek(){ + + return elementData.get(size()-1); + } + public boolean isEmpty(){ + + return size()==0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/ArrayListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..badcb2968f --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/ArrayListTest.java @@ -0,0 +1,109 @@ +package test.com.coding.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.ArrayList; +import com.coding.basic.Iterator; + +public class ArrayListTest { + + ArrayList ls ; + @Before + public void setup() { + ls = new ArrayList(); + } + + /** + * 测试一个参数的add方法 + * ArrayList当数据超过10时进行第一次扩容 + */ + @Test + public void add(){ + + ls.add(3); + ls.add("a"); + for (int i = 0; i < 10; i++) { + ls.add(i); + } + Assert.assertEquals(ls.size(), 12); + Assert.assertEquals(ls.get(1), "a"); + } + + /** + * 两个参数的add方法 + */ + @Test//(expected = IndexOutOfBoundsException.class) + public void add4ToPramter(){ + + ls.add(0, 0); + ls.add(1,1); + ls.add(2, 2); + ls.add(3,3); + for (int i = 0; i < 10; i++) { + ls.add(3,i); + } + Assert.assertEquals(ls.size(), 14); + Assert.assertEquals(ls.get(3), 9); + Assert.assertEquals(ls.get(13), 3); + //打开下面操作抛出异常 + //ls.add(15, "a"); + } + + /** + * get(i) + */ + @Test//(expected = IndexOutOfBoundsException.class) + public void get(){ + + for (int i = 0; i < 10; i++) { + ls.add(i); + } + + Assert.assertEquals(ls.get(9), 9); + //打开下面操作抛出异常 + //ls.get(12); + } + + @Test + public void remove(){ + + for (int i = 0; i < 10; i++) { + ls.add(i); + } + Assert.assertEquals(ls.remove(5),5); + Assert.assertEquals(ls.size(),9); + Assert.assertEquals(ls.remove(8),9); + Assert.assertEquals(ls.size(),8); + } + + @Test + public void size(){ + + Assert.assertEquals(ls.size(),0); + ls.add("a"); + Assert.assertEquals(ls.size(),1); + ls.add(0,0); + Assert.assertEquals(ls.size(),2); + ls.remove(0); + Assert.assertEquals(ls.size(),1); + + } + + @Test//(expected = NoSuchElementException.class) + public void iterator(){ + + for (int i = 0; i < 10; i++) { + ls.add(i); + } + Iterator it = ls.iterator(); + Assert.assertEquals(it.hasNext(),true); + for (int i = 0; i < 10; i++) { + it.next(); + } + Assert.assertEquals(it.hasNext(),false); + //打开下面操作抛出异常 + //it.next(); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java new file mode 100644 index 0000000000..1357cf17cf --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java @@ -0,0 +1,58 @@ +package test.com.coding.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.BinaryTree; +import com.coding.basic.BinaryTreeNode; +import com.coding.basic.List; + +public class BinaryTreeTest { + + BinaryTree tree ; + + @Before + public void setup() { + + tree = new BinaryTree(); + Assert.assertEquals(tree.getRoot(), null); + tree.insert(5); + tree.insert(2); + tree.insert(7); + tree.insert(1); + tree.insert(6); + } + @Test + public void insert(){ + + BinaryTreeNode node = tree.insert(4); + Assert.assertEquals(node.getParent().getData(), 2); + Assert.assertEquals(node.getParent().getLeft().getData(), 1); + + BinaryTreeNode node2 = tree.insert(8); + Assert.assertEquals(node2.getParent().getData(), 7); + Assert.assertEquals(node2.getParent().getLeft().getData(), 6); + } + + @Test + public void traversal(){ + + insert(); + //以根节点为起点先序遍历 + List treeList = tree.traversalBefore(tree.getRoot()); + //expected value + int[] exValue = {5,2,1,4,7,6,8}; + for (int i = 0; i < exValue.length; i++) { + Assert.assertEquals(treeList.get(i),exValue[i]); + } + + //以数据2位起点先序遍历 + List treeList2 = tree.traversalBefore(tree.getRoot().getLeft()); + //expected value + int[] exValue2 = {2,1,4}; + for (int i = 0; i < exValue2.length; i++) { + Assert.assertEquals(treeList2.get(i),exValue2[i]); + } + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..3a5ff822ad --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java @@ -0,0 +1,109 @@ +package test.com.coding.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.Iterator; +import com.coding.basic.LinkedList; + +public class LinkedListTest { + + LinkedList ls ; + @Before + public void setup() { + ls = new LinkedList(); + } + + /** + * 测试一个参数的add方法 + * ArrayList当数据超过10时进行第一次扩容 + */ + @Test + public void add(){ + + ls.add(3); + ls.add("a"); + for (int i = 0; i < 10; i++) { + ls.add(i); + } + Assert.assertEquals(ls.size(), 12); + Assert.assertEquals(ls.get(1), "a"); + } + + /** + * 两个参数的add方法 + */ + @Test//(expected = IndexOutOfBoundsException.class) + public void add4ToPramter(){ + + ls.add(0, 0); + ls.add(1,1); + ls.add(2, 2); + ls.add(3,3); + for (int i = 0; i < 10; i++) { + ls.add(3,i); + } + Assert.assertEquals(ls.size(), 14); + Assert.assertEquals(ls.get(3), 9); + Assert.assertEquals(ls.get(13), 3); + //打开下面操作抛出异常 + //ls.add(15, "a"); + } + + /** + * get(i) + */ + @Test//(expected = IndexOutOfBoundsException.class) + public void get(){ + + for (int i = 0; i < 10; i++) { + ls.add(i); + } + + Assert.assertEquals(ls.get(9), 9); + //打开下面操作抛出异常 + //ls.get(12); + } + + @Test + public void remove(){ + + for (int i = 0; i < 10; i++) { + ls.add(i); + } + Assert.assertEquals(ls.remove(5),5); + Assert.assertEquals(ls.size(),9); + Assert.assertEquals(ls.remove(8),9); + Assert.assertEquals(ls.size(),8); + } + + @Test + public void size(){ + + Assert.assertEquals(ls.size(),0); + ls.add("a"); + Assert.assertEquals(ls.size(),1); + ls.add(0,0); + Assert.assertEquals(ls.size(),2); + ls.remove(0); + Assert.assertEquals(ls.size(),1); + + } + + @Test//(expected = NoSuchElementException.class) + public void iterator(){ + + for (int i = 0; i < 10; i++) { + ls.add(i); + } + Iterator it = ls.iterator(); + Assert.assertEquals(it.hasNext(),true); + for (int i = 0; i < 10; i++) { + it.next(); + } + Assert.assertEquals(it.hasNext(),false); + //打开下面操作抛出异常 + //it.next(); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..75af57b371 --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java @@ -0,0 +1,64 @@ +package test.com.coding.basic; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.Queue; + +public class QueueTest { + + Queue qe ; + + @Before + public void setup() { + qe = new Queue(); + for (int i = 0; i < 10; i++) { + qe.enQueue(i); + } + } + + @Test + public void enQueue(){ + + Assert.assertEquals(qe.size(), 10); + qe.enQueue("abcd"); + Assert.assertEquals(qe.size(), 11); + } + + @Test//(expected = IndexOutOfBoundsException.class) + public void deQueue(){ + + Assert.assertEquals(qe.size(), 10); + for (int i = 0; i < 10; i++) { + Assert.assertEquals(qe.deQueue(), i); + } + Assert.assertEquals(qe.size(), 0); + //打开下列语句与期望异常测试 + //qe.deQueue(); + } + + public void isEmpty(){ + + Assert.assertEquals(qe.isEmpty(),false); + for (int i = 0; i < 10; i++) { + qe.deQueue(); + } + Assert.assertEquals(qe.isEmpty(),true); + Queue qe1 = new Queue(); + Assert.assertEquals(qe1.isEmpty(), true); + } + + public void size(){ + + Assert.assertEquals(qe.size(),10); + qe.enQueue("lk"); + qe.enQueue('h'); + Assert.assertEquals(qe.size(),12); + for (int i = 0; i < 12; i++) { + qe.deQueue(); + } + Assert.assertEquals(qe.size(),0); + Queue qe1 = new Queue(); + Assert.assertEquals(qe1.size(), 0); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..5d9fcd0f16 --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java @@ -0,0 +1,76 @@ +package test.com.coding.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.Stack; + +public class StackTest { + + Stack st ; + + @Before + public void setup() { + st = new Stack(); + for (int i = 0; i < 10; i++) { + st.push(i); + } + } + + @Test + public void push(){ + + Assert.assertEquals(st.size(), 10); + st.push(10); + st.push('a'); + Assert.assertEquals(st.size(), 12); + } + + @Test//(expected = IndexOutOfBoundsException.class) + public void pop(){ + + Assert.assertEquals(st.size(), 10); + for (int i = 9; i >= 0; i--) { + Assert.assertEquals(st.pop(), i); + } + //打开下列语句抛出期望异常 + //st.pop(); + } + + @Test + public void peek(){ + + Assert.assertEquals(st.size(), 10); + Assert.assertEquals(st.peek(), 9); + Assert.assertEquals(st.size(), 10); + } + + @Test + public void isEmpty(){ + + Assert.assertEquals(st.isEmpty(), false); + for (int i = 0; i < 10; i++) { + st.pop(); + } + Assert.assertEquals(st.isEmpty(), true); + Stack st1 = new Stack(); + Assert.assertEquals(st1.isEmpty(), true); + } + + public void size(){ + + Assert.assertEquals(st.size(),10); + st.push("lk"); + st.push('h'); + Assert.assertEquals(st.size(),12); + for (int i = 0; i < 12; i++) { + st.pop(); + } + Assert.assertEquals(st.size(),0); + st.peek(); + Assert.assertEquals(st.size(),0); + Stack st1 = new Stack(); + Assert.assertEquals(st1.size(), 0); + } +} diff --git a/group12/247565311/week1/ArrayList.java b/group12/247565311/week1/ArrayList.java new file mode 100644 index 0000000000..c2643af683 --- /dev/null +++ b/group12/247565311/week1/ArrayList.java @@ -0,0 +1,249 @@ +package week1; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + + +public class ArrayList implements List { + private int size=0,offset=10; + private Object[] data = null; + public ArrayList(){ + data = new Object[offset]; + } + public ArrayList(int arg0){ + if(arg0<0) arg0=0; + size = arg0; + data = new Object[size]; + } + @Override + public boolean add(E arg0) { + if(arg0 == null) return false; + size += 1; + int leng = data.length; + if(size>leng){ + Object[] newdata = new Object[size + offset]; + for(int i=0;isize || 0leng){ + Object[] newdata = new Object[size + offset]; + for(int i=0;i arg0) { + if (arg0 == null) return false; + int leng = data.length,newobjnum = arg0.size(),lastsize=size; + size += newobjnum; + if(size>leng){ + Object[] newdata = new Object[size + offset]; + for(int i=0;i arg1) { + int newobjnum = arg1.size(),lastsize = size; + if(arg1 == null || arg0>size+1 || 0>arg0 || newobjnum==0) return false; + size += newobjnum; + int leng = data.length; + if(size>leng){ + Object[] newdata = new Object[size + offset]; + for(int i=0;i arg0) { + for(Object o:arg0){ + if(!this.contains(o)) return false; + } + return true; + } + + @Override + public E get(int arg0) { + if(arg0 >-1 && arg0-1;i--){ + if(this.data[i].equals(arg0)) return i; + } + return -1; + } + + @Override + public Iterator iterator() { + + return null; + } + + @Override + public ListIterator listIterator() { + + return null; + } + + @Override + public ListIterator listIterator(int arg0) { + + return null; + } + + @Override + public boolean remove(Object arg0) { + for(int i=0;ithis.size-1) return null; + E res = (E)data[arg0]; + for(int i=arg0;i arg0) { + int toberemovednums = arg0.size(); + if(!this.containsAll(arg0)) return false; + int index=0; + for(int i=0;i arg0) { + // what does this mean? + return false; + } + + @Override + public E set(int arg0, E arg1) { + if(arg0<0||arg0>this.size-1) return null; + this.data[arg0] = arg1; + return arg1; + } + + @Override + public int size() { + return this.size; + } + + @Override + public List subList(int arg0, int arg1) { + if(arg0>=arg1 || arg0<0 || arg1>this.size-1) return null; + List res = new ArrayList(); + for(int i=arg0;i T[] toArray(T[] arg0) { + T[] res = (T[])(new Object[this.size]); + for(int i=0;i { + private LinkedList data = new LinkedList(); + private int size = 0; + + + public Deque(){ + + } + public Deque(int arg0){ + data = new LinkedList(arg0); + } + public boolean push(E arg0){ + data.add(data.size(),arg0); + size += 1; + return true; + } + public E pop(){ + size -= 1; + E res = data.get(0); + data.remove(0); + return res; + } + public E peek(){ + return data.get(0); + } + public int size(){ + return this.size; + } + public boolean isEmpty(){ + return this.size==0; + } + +} diff --git a/group12/247565311/week1/Link.java b/group12/247565311/week1/Link.java new file mode 100644 index 0000000000..e2910e53d3 --- /dev/null +++ b/group12/247565311/week1/Link.java @@ -0,0 +1,5 @@ +package week1; + +public class Link { + +} diff --git a/group12/247565311/week1/LinkedList.java b/group12/247565311/week1/LinkedList.java new file mode 100644 index 0000000000..c3f0ca2eb8 --- /dev/null +++ b/group12/247565311/week1/LinkedList.java @@ -0,0 +1,266 @@ +package week1; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +public class LinkedList implements List,Cloneable { + private Node head = null; + private Node tail = null; + private int size = 0; + + public LinkedList(){ + head = new Node(null); + tail = new Node(null); + head.next = tail; + tail.ahead = head; + size = 0; + } + public LinkedList(int arg0){ + head = new Node(null); + tail = new Node(null); + head.next = tail; + tail.ahead = head; + size = 0; + } + public Object clone(){ + LinkedList clone = null; + try { + clone = (LinkedList)(super.clone()); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + clone.head = new Node(null); + clone.tail = new Node(null); + clone.size = 0; + for(Node x = head.next;x!=null;x = x.next){ + clone.add(x.val); + } + return clone; + } + @Override + public boolean add(Object val) { + Node n = new Node(val); + n.next = tail; + n.ahead = tail.ahead; + tail.ahead.next = n; + tail.ahead = n; + size += 1; + return true; + } + + @Override + public void add(int arg0, E arg1) { + if(arg0<0 || arg0>size) arg0=0; + Node n=new Node(arg1),p=head; + for(int i=0;i arg0) { + for(E o:arg0){ + this.add(o); + } + return true; + } + + @Override + public boolean addAll(int arg0, Collection arg1) { + for(E e:arg1){ + this.add(arg0,e); + arg0+=1; + } + return true; + } + + @Override + public void clear() { + head = new Node(null); + tail = new Node(null); + head.next = tail; + tail.ahead = head; + size = 0; + } + + @Override + public boolean contains(Object arg0) { + boolean flag = arg0==null; + Node n = head; + for(int i=0;i arg0) { + for(Object e:arg0){ + if(!this.contains(e)) return false; + } + return true; + } + + @Override + public E get(int arg0) { + E res = null; + if(arg0>-1 && arg0 < size){ + Node n = head; + for(int i=0;i iterator() { + + return null; + } + + @Override + public int lastIndexOf(Object arg0) { + boolean flag = arg0==null; + Node n = tail; + for(int i=size-1;i>-1;i--){ + n = n.ahead; + if(flag){ + if(n.val == null) return i; + }else{ + if(arg0.equals(n.val)) return i; + } + } + return -1; + } + + @Override + public ListIterator listIterator() { + + return null; + } + + @Override + public ListIterator listIterator(int arg0) { + + return null; + } + + @Override + public boolean remove(Object arg0) { + Node n = head; + int index = this.indexOf(arg0); + if(index == -1) return false; + for(int i=0;isize-1) return null; + for(int i=0;i arg0) { + for(Object o:arg0){ + if(!this.remove(o)) return false; + } + return true; + } + + @Override + public boolean retainAll(Collection arg0) { + // ? + return false; + } + + @Override + public E set(int arg0, E arg1) { + if(arg0<0 || arg0>size-1) return null; + Node n=head; + for(int i=0;i subList(int arg0, int arg1) { + + return null; + } + + @Override + public Object[] toArray() { + Object[]res = new Object[size]; + Node n = head; + for(int i=0;i T[] toArray(T[] arg0) { + + return null; + } + private static class Node{ + Object val = null; + Node next = null,ahead=null; + public Node(Object arg0){val = arg0;} + } +} diff --git a/group12/247565311/week1/Stack.java b/group12/247565311/week1/Stack.java new file mode 100644 index 0000000000..5672274d81 --- /dev/null +++ b/group12/247565311/week1/Stack.java @@ -0,0 +1,39 @@ +package week1; + +import java.util.List; + +public class Stack { + private List data = new ArrayList(); + private int size = 0; + + public Stack(){ + + } + + public Stack(int arg0){ + if(arg0 < 0) arg0 = 0; + size = arg0; + data = new ArrayList(size); + + } + public boolean isEmpty(){ + return size==0; + } + public boolean push(E arg0){ + size += 1; + data.add(arg0); + return true; + } + public E pop(){ + if(this.isEmpty()) return null; + size -= 1; + E res = data.get(size); + data.remove(size); + return res; + } + public E peek(){ + if(this.isEmpty()) return null; + E res = data.get(size-1); + return res; + } +} diff --git a/group12/251822722/ArrayList.java b/group12/251822722/ArrayList.java new file mode 100644 index 0000000000..77b8052cc7 --- /dev/null +++ b/group12/251822722/ArrayList.java @@ -0,0 +1,87 @@ +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private int index =0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + elementData[size] = o; + size = size+1; + + } + + public void add(int index, Object o) { + + Object[] elementDataNew =null; + if(size= size || index < 0){ + throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size); + } + } + + + private class ArrayListIterator implements Iterator{ + + private int lastIndex = 0; + + @Override + public boolean hasNext() { + return lastIndex < size; + } + + @Override + public Object next() { + return elementData[lastIndex++]; + } + } +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/BinaryTreeNode.java b/group12/377401843/learning_1/src/com/guodong/datastructure/BinaryTreeNode.java new file mode 100644 index 0000000000..2ced039d20 --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/BinaryTreeNode.java @@ -0,0 +1,58 @@ +package com.guodong.datastructure; + +public class BinaryTreeNode { + + private int data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(int data) { + this.data = data; + } + + public int getData() { + return data; + } + + public void setData(int data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(int o) { + + if (o < data) { + if (left != null) { + left.insert(o); + } else { + left = new BinaryTreeNode(o); + return left; + } + } else { + if (right != null) { + right.insert(o); + } else { + right = new BinaryTreeNode(o); + return right; + } + } + + return null; + } + +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/Iterator.java b/group12/377401843/learning_1/src/com/guodong/datastructure/Iterator.java new file mode 100644 index 0000000000..8d486220b0 --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/Iterator.java @@ -0,0 +1,7 @@ +package com.guodong.datastructure; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/LinkedList.java b/group12/377401843/learning_1/src/com/guodong/datastructure/LinkedList.java new file mode 100644 index 0000000000..976129cc84 --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/LinkedList.java @@ -0,0 +1,285 @@ +package com.guodong.datastructure; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private int size; + + private Node head; + + private Node last; + + /** + * 向 链表尾端插入元素 + * + * @Method add + * @param o + * @see com.guodong.datastructure.List#add(java.lang.Object) + */ + public void add(Object o) { + linkLast(o); + } + + /** + * 向链表指定位置插入元素 + * + * @Method add + * @param index + * @param o + * @see com.guodong.datastructure.List#add(int, java.lang.Object) + */ + public void add(int index, Object o) { + checkIndexForAdd(index); + + if (index == size) { + linkLast(o); + } else { + Node prevNode = getNodeByIndex(index - 1); // 取到当前下标的前一个节点 + Node currentNode = getNodeByIndex(index); // 取到当前下标节点 + Node newNode = new Node(o, currentNode); // 创建新节点,新节点的下一个节点为当前下标节点 + + if (prevNode == null) { // 如果前一个节点为空,说明从头部插入 + head = newNode; + } else { + prevNode.next = newNode; + } + size++; + } + } + + /** + * 根据下标获取链表中元素 + * + * @Method get + * @param index + * @return + * @see com.guodong.datastructure.List#get(int) + */ + public Object get(int index) { + checkIndexForGet(index); + return getNodeByIndex(index).data; + } + + public Object getLast() { + return last.data; + } + + /** + * 根据下标移除链表元素 + * + * @Method remove + * @param index + * @return + * @see com.guodong.datastructure.List#remove(int) + */ + public Object remove(int index) { + checkIndexForGet(index); + + Node prevNode = getNodeByIndex(index - 1); // 获取当前index前一个元素 + Node currentNode = null; + if (prevNode == null) { + currentNode = getNodeByIndex(index); // 如果前一个为空,则把下一个元素赋值给链表头 + head = currentNode.next; + } else { + currentNode = prevNode.next; // 如果不为空,则把前一个节点跟后一个节点链接 + prevNode.next = currentNode.next; + } + Node nextNode = currentNode.next; + + if (nextNode == null) { // 如果后一个节点为空,则把链尾赋值为前一个节点 + last = prevNode; + } else { + currentNode.next = null; // 如果后一个节点不为空,不做任何处理,只打断当前节点的链接 + } + Object data = currentNode.data; + currentNode.data = null; // 清空当前节点的值,等待垃圾回收 + + size--; + + return data; + } + + /** + * 返回List长度 + */ + public int size() { + return size; + } + + /** + * 向列表头部添加元素 + * + * @param o + */ + public void addFirst(Object o) { + Node n = head; + Node newNode = new Node(o, n); + + head = newNode; + if (n == null) { + last = newNode; + } + size++; + } + + /** + * 向列表尾部添加元素 + * + * @param o + */ + public void addLast(Object o) { + linkLast(o); + } + + /** + * 移除链表第一个元素 + * + * @return + */ + public Object removeFirst() { + Node n = head; + if (n == null) { + throw new NoSuchElementException(); + } + Object data = n.data; + Node nextNode = n.next; + + n.data = null; + n.next = null; + + head = nextNode; + if (nextNode == null) { + last = null; + } + + size--; + return data; + } + + public Object removeLast() { + Node n = last; + if (n == null) { + throw new NoSuchElementException(); + } + Object data = n.data; + Node prevNode = getNodeByIndex(size - 2); + n.data = null; + if (prevNode == null) { + head = null; + } else { + prevNode.next = null; + } + last = prevNode; + + size--; + return data; + } + + /** + * 根据下标获取对应的节点 + * + * @MethodName getNodeByIndex + * @author zhaogd + * @date 2017年2月23日 下午3:32:48 + * @param index + * @return + */ + private Node getNodeByIndex(int index) { + if (index < 0) { + return null; + } + Node n = head; + for (int i = 0; i < index; i++) { + n = n.next; + } + return n; + } + + /** + * 在链表尾端插入节点 + * + * @MethodName linkLast + * @author zhaogd + * @date 2017年2月23日 下午3:14:28 + * @param o + */ + private void linkLast(Object o) { + Node n = last; // 取出原尾端数据 + Node newNode = new Node(o, null); // 创建新节点 + last = newNode; // 把新节点放入链表尾端 + // 如果原尾端为空,说明链表为空,把新节点也放入链表头部 + // 如果不为空,把原尾端节点指向新节点 + if (n == null) { + head = newNode; + } else { + n.next = newNode; + } + + size++; + } + + /** + * 检查下标是否合法 + * + * @MethodName checkIndexForAdd + * @author zhaogd + * @date 2017年2月23日 下午3:05:07 + * @param index + */ + private void checkIndexForAdd(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size); + } + } + + /** + * 检查下标是否合法 + * + * @MethodName checkIndexForGet + * @author zhaogd + * @date 2017年2月23日 下午4:21:35 + * @param index + */ + private void checkIndexForGet(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size); + } + } + + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + private Node current; + + private int index; + + @Override + public boolean hasNext() { + return index < size; + } + + @Override + public Object next() { + if (current == null) { + current = getNodeByIndex(index); + } + Object data = current.data; + current = current.next; + index++; + return data; + } + } +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/List.java b/group12/377401843/learning_1/src/com/guodong/datastructure/List.java new file mode 100644 index 0000000000..1a6f12da52 --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/List.java @@ -0,0 +1,14 @@ +package com.guodong.datastructure; + +public interface List { + + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/Queue.java b/group12/377401843/learning_1/src/com/guodong/datastructure/Queue.java new file mode 100644 index 0000000000..6dc85d8ec0 --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/Queue.java @@ -0,0 +1,21 @@ +package com.guodong.datastructure; + +public class Queue { + private LinkedList element = new LinkedList(); + + public void enQueue(Object o) { + element.addLast(o); + } + + public Object deQueue() { + return element.removeFirst(); + } + + public boolean isEmpty() { + return element.size() == 0; + } + + public int size() { + return element.size(); + } +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/Stack.java b/group12/377401843/learning_1/src/com/guodong/datastructure/Stack.java new file mode 100644 index 0000000000..c2b5049e73 --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/Stack.java @@ -0,0 +1,25 @@ +package com.guodong.datastructure; + +public class Stack { + private LinkedList elementData = new LinkedList(); + + public void push(Object o) { + elementData.addLast(o); + } + + public Object pop() { + return elementData.removeLast(); + } + + public Object peek() { + return elementData.getLast(); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/test/ArrayListTest.java b/group12/377401843/learning_1/src/com/guodong/datastructure/test/ArrayListTest.java new file mode 100644 index 0000000000..f38f58614d --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/test/ArrayListTest.java @@ -0,0 +1,135 @@ +package com.guodong.datastructure.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.guodong.datastructure.ArrayList; +import com.guodong.datastructure.Iterator; + +public class ArrayListTest { + + ArrayList arrayList; + + @Before + public void setUp() throws Exception { + arrayList = new ArrayList(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddObject() { + // 测试新增 + arrayList.add(0); + assertEquals(0, arrayList.get(0)); + assertEquals(1, arrayList.size()); + + // 测试扩充 + for (int i = 1; i < 101; i++) { + arrayList.add(i); + } + assertEquals(101, arrayList.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForAdd1() { + // 测试新增下标异常时,是否可以正确抛出异常 + arrayList.add(-1, 2); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForAdd2() { + // 测试新增下标异常时,是否可以正确抛出异常 + arrayList.add(1, 3); + } + + @Test + public void testAddIntObject() { + // 测试下标新增 + arrayList.add(0, 1); + arrayList.add(1, 2); + arrayList.add(2, 3); + arrayList.add(3, 4); + assertEquals(4, arrayList.size()); + + // 测试中间插入 + arrayList.add(2, 5); + assertEquals(5, arrayList.size()); // 测试插入之后长度 + assertEquals(5, arrayList.get(2)); + assertEquals(4, arrayList.get(4)); // 测试插入之后原来数据是否后移 + assertEquals(3, arrayList.get(3)); // 测试插入之后原来数据是否后移 + + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForGet1() { + // 测试Get时,下标异常,是否可以正确抛出异常 + arrayList.get(-1); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForGet2() { + // 测试Get时,下标异常,是否可以正确抛出异常 + arrayList.get(0); + } + + @Test + public void testGet() { + arrayList.add(1); + arrayList.add(2); + arrayList.add(3); + assertEquals(1, arrayList.get(0)); + assertEquals(2, arrayList.get(1)); + assertEquals(3, arrayList.get(2)); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForRemove1() { + arrayList.remove(-1); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForRemove2() { + arrayList.remove(0); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForRemove3() { + arrayList.remove(1); + } + + @Test + public void testRemove() { + arrayList.add(1); + arrayList.remove(0); + assertEquals(0, arrayList.size()); + + arrayList.add(1); + arrayList.add(2); + arrayList.remove(0); + assertEquals(1, arrayList.size()); + assertEquals(2, arrayList.get(0)); + } + + @Test + public void testSize() { + arrayList.add(1); + assertEquals(1, arrayList.size()); + } + + @Test + public void testIterator() { + Iterator iterator = arrayList.iterator(); + assertFalse(iterator.hasNext()); + + arrayList.add(1); + assertTrue(iterator.hasNext()); + assertEquals(1, iterator.next()); + assertFalse(iterator.hasNext()); + } +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/test/BinaryTreeNodeTest.java b/group12/377401843/learning_1/src/com/guodong/datastructure/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..537cd5961f --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/test/BinaryTreeNodeTest.java @@ -0,0 +1,37 @@ +package com.guodong.datastructure.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.guodong.datastructure.BinaryTreeNode; + +public class BinaryTreeNodeTest { + + private BinaryTreeNode binaryTreeNode; + + @Before + public void setUp() throws Exception { + binaryTreeNode = new BinaryTreeNode(50); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testInsert() { + binaryTreeNode.insert(20); + binaryTreeNode.insert(30); + binaryTreeNode.insert(60); + binaryTreeNode.insert(80); + + assertEquals(20, binaryTreeNode.getLeft().getData()); + assertEquals(30, binaryTreeNode.getLeft().getRight().getData()); + assertEquals(60, binaryTreeNode.getRight().getData()); + assertEquals(80, binaryTreeNode.getRight().getRight().getData()); + } + +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/test/LinkedListTest.java b/group12/377401843/learning_1/src/com/guodong/datastructure/test/LinkedListTest.java new file mode 100644 index 0000000000..52d42b5aa7 --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/test/LinkedListTest.java @@ -0,0 +1,143 @@ +package com.guodong.datastructure.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.guodong.datastructure.Iterator; +import com.guodong.datastructure.LinkedList; + +public class LinkedListTest { + + private LinkedList linkedList; + + @Before + public void setUp() throws Exception { + linkedList = new LinkedList(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddObject() { + linkedList.add(1); + assertEquals(1, linkedList.size()); + assertEquals(1, linkedList.get(0)); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForAdd1() { + linkedList.add(-1, 1); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForAdd2() { + linkedList.add(1, 1); + } + + @Test + public void testAddIntObject() { + linkedList.add(0, 1); + linkedList.add(1, 2); + assertEquals(1, linkedList.get(0)); + + linkedList.add(1,3); + assertEquals(2, linkedList.get(2)); + assertEquals(3, linkedList.get(1)); + assertEquals(3, linkedList.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForGet1() { + linkedList.get(-1); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForGet2() { + linkedList.get(0); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testExceptionForGet3() { + linkedList.get(1); + } + + @Test + public void testGet() { + linkedList.add(0, 1); + linkedList.add(1, 2); + assertEquals(2, linkedList.get(1)); + } + + @Test + public void testGetLast() { + linkedList.add(1); + assertEquals(1, linkedList.getLast()); + + linkedList.add(2); + assertEquals(2, linkedList.getLast()); + } + + @Test + public void testRemove() { + linkedList.add(1); + assertEquals(1, linkedList.remove(0)); + assertEquals(0, linkedList.size()); + } + + @Test + public void testSize() { + linkedList.add(1); + linkedList.add(1); + linkedList.add(1); + assertEquals(3, linkedList.size()); + } + + @Test + public void testAddFirst() { + linkedList.addFirst(1); + assertEquals(1, linkedList.get(0)); + + linkedList.addFirst(2); + linkedList.addFirst(3); + assertEquals(3, linkedList.get(0)); + assertEquals(1, linkedList.getLast()); + } + + @Test + public void testAddLast() { + linkedList.addLast(1); + assertEquals(1, linkedList.getLast()); + assertEquals(1, linkedList.get(0)); + } + + @Test + public void testRemoveFirst() { + linkedList.addFirst(1); + assertEquals(1, linkedList.removeFirst()); + assertEquals(0, linkedList.size()); + } + + @Test + public void testRemoveLast() { + linkedList.addLast(2); + assertEquals(2, linkedList.removeLast()); + assertEquals(0, linkedList.size()); + } + + @Test + public void testIterator() { + Iterator iterator = linkedList.iterator(); + assertFalse(iterator.hasNext()); + + linkedList.add(1); + assertTrue(iterator.hasNext()); + assertEquals(1, iterator.next()); + assertFalse(iterator.hasNext()); + } + +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/test/QueueTest.java b/group12/377401843/learning_1/src/com/guodong/datastructure/test/QueueTest.java new file mode 100644 index 0000000000..1773b5027c --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/test/QueueTest.java @@ -0,0 +1,62 @@ +package com.guodong.datastructure.test; + +import static org.junit.Assert.*; + +import java.util.NoSuchElementException; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.guodong.datastructure.Queue; + +public class QueueTest { + + private Queue queue; + + @Before + public void setUp() throws Exception { + queue = new Queue(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEnQueue() { + queue.enQueue(1); + assertFalse(queue.isEmpty()); + } + + @Test(expected = NoSuchElementException.class) + public void testDeQueueExecption() { + queue.deQueue(); + } + + @Test + public void testDeQueue() { + queue.enQueue(1); + assertEquals(1, queue.deQueue()); + assertTrue(queue.isEmpty()); + } + + @Test + public void testIsEmpty() { + queue.enQueue(1); + assertFalse(queue.isEmpty()); + + queue.deQueue(); + assertTrue(queue.isEmpty()); + } + + @Test + public void testSize() { + queue.enQueue(1); + queue.enQueue(1); + queue.enQueue(1); + + assertEquals(3, queue.size()); + } + +} diff --git a/group12/377401843/learning_1/src/com/guodong/datastructure/test/StackTest.java b/group12/377401843/learning_1/src/com/guodong/datastructure/test/StackTest.java new file mode 100644 index 0000000000..74ac8e7cc7 --- /dev/null +++ b/group12/377401843/learning_1/src/com/guodong/datastructure/test/StackTest.java @@ -0,0 +1,46 @@ +package com.guodong.datastructure.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.guodong.datastructure.Stack; + +public class StackTest { + + private Stack stack; + + @Before + public void setUp() throws Exception { + stack = new Stack(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPush() { + stack.push(11); + assertEquals(11, stack.pop()); + assertTrue(stack.isEmpty()); + } + + @Test + public void testPop() { + stack.push(11); + assertEquals(11, stack.pop()); + assertTrue(stack.isEmpty()); + } + + @Test + public void testPeek() { + stack.push(11); + assertEquals(11, stack.peek()); + assertFalse(stack.isEmpty()); + assertEquals(1, stack.size()); + } + +} diff --git a/group12/382266293/.classpath b/group12/382266293/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group12/382266293/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group12/382266293/.gitignore b/group12/382266293/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group12/382266293/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group12/382266293/.project b/group12/382266293/.project new file mode 100644 index 0000000000..1282023911 --- /dev/null +++ b/group12/382266293/.project @@ -0,0 +1,17 @@ + + + 382266293Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group12/382266293/src/Collection/AbstractList.java b/group12/382266293/src/Collection/AbstractList.java new file mode 100644 index 0000000000..a81e76b587 --- /dev/null +++ b/group12/382266293/src/Collection/AbstractList.java @@ -0,0 +1,43 @@ +package Collection; + +public abstract class AbstractList implements List { + + protected static final String PREFIX = "["; + protected static final String SUFFIX = "]"; + protected static final String SEPERATOR = ", "; + protected static final int MAX_SIZE = Integer.MAX_VALUE/3; + + protected void checkIndex(int i) { + if( i < 0 || i > Math.min(size(), MAX_SIZE)) + throw new IndexOutOfBoundsException("Size :" + size()+", Index: " + i); + } + + public boolean isEmpty() { + return size() == 0; + } + + + public int indexOf(E e) { + for (int i = 0; i < size()-1; i++) { + if (get(i).equals(e)) + return i; + } + return -1; + } + + protected abstract Iterator iterator(); + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(PREFIX); + for (int i = 0; i < size(); i++) { + sb.append(get(i)); + if (i < size()-1) + sb.append(SEPERATOR); + } + sb.append(SUFFIX); + return sb.toString(); + } + +} diff --git a/group12/382266293/src/Collection/Concrete/ArrayList.java b/group12/382266293/src/Collection/Concrete/ArrayList.java new file mode 100644 index 0000000000..3db5ab47e6 --- /dev/null +++ b/group12/382266293/src/Collection/Concrete/ArrayList.java @@ -0,0 +1,148 @@ +package Collection.Concrete; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +import Collection.AbstractList; +import Collection.Iterator; + +public class ArrayList extends AbstractList { + + private E[] elements; + private int size; + private static final int INITIAL_SIZE = 16; + + + public ArrayList() { + elements = (E[]) new Object[INITIAL_SIZE]; + size = 0; + } + + @Override + public void add(E e) { + checkCapacity(); + elements[size++] = e; + } + + private void checkCapacity() { + if (size >= MAX_SIZE) + throw new IndexOutOfBoundsException("Reached max size"); + + if (elements.length - size < INITIAL_SIZE) + grow(); + } + + synchronized private void grow() { + + int newCapacity = size * 2; + newCapacity = (newCapacity < 0 || newCapacity - MAX_SIZE > 0) ? MAX_SIZE : newCapacity; + E[] target = (E[]) new Object[newCapacity]; + System.arraycopy(elements, 0, target, 0, size); + elements = target; + + } + + public void add(int index, E e) { + checkCapacity(); + if (index == size) { + add(e); + return; + } + checkIndex(index); + synchronized (this) { + System.arraycopy(elements, index, elements, index+1, size-index+1); + elements[index] = e; + size++; + } + } + + @Override + public E get(int index) { + checkIndex(index); + return elements[index]; + } + + + public E getLast() { + return get(size-1); + } + + public void addLast(E e) { + add(e); + } + + public E removeLast() { + return elements[--size]; + } + + public E remove(int index) { + checkIndex(index); + E result = elements[index]; + synchronized (this) { + System.arraycopy(elements, index+1, elements, index, size-index-1); + elements[--size] = null; + } + return result; + } + + @Override + public int size() { + return size; + } + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Arrays.hashCode(elements); + result = prime * result + size; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ArrayList other = (ArrayList) obj; + if (!Arrays.equals(elements, other.elements)) + return false; + if (size != other.size) + return false; + return true; + } + + public Iterator iterator(){ + return new ArrayListIterator(this); + } + + private class ArrayListIterator implements Iterator { + + private ArrayList myArrayList; + private int pos; + + public ArrayListIterator(ArrayList arrayList) { + myArrayList = arrayList; + pos = 0; + } + + @Override + public boolean hasNext() { + return pos < size; + } + + @Override + public E next() { + if (hasNext()) + return (E) elements[pos++]; + throw new NoSuchElementException(); + } + } + + + +} diff --git a/group12/382266293/src/Collection/Concrete/BinaryTreeNode.java b/group12/382266293/src/Collection/Concrete/BinaryTreeNode.java new file mode 100644 index 0000000000..34a9d4253e --- /dev/null +++ b/group12/382266293/src/Collection/Concrete/BinaryTreeNode.java @@ -0,0 +1,126 @@ +package Collection.Concrete; + +public class BinaryTreeNode> { + + private E data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private int size; + private ArrayList myList; + + + + public BinaryTreeNode() { + this.data = null; + this.left = null; + this.right = null; + } + + public BinaryTreeNode(E data) { + this.data = data; + this.left = null; + this.right = null; + } + + public boolean isEmpty() { + return data == null; + } + + public int size() { + return size; + } + + public BinaryTreeNode insert(E o) { + BinaryTreeNode res; + if (isEmpty()) { + data = o; + size++; + return this; + } else { + BinaryTreeNode p = this; + res = new BinaryTreeNode(o); + while (true) { + if (res.getData().compareTo(p.getData()) < 0) { + if (p.left == null) { + p.setLeft(res); + break; + } + p = p.left; + } else if (res.getData().compareTo(p.getData()) > 0) { + if (p.right == null) { + p.setRight(res); + break; + } + p = p.right; + } else { + return null; + } + } + size++; + } + return res; + } + + + + public ArrayList preOrderTraversal(BinaryTreeNode node) { + + if (node != null) { + preOrderTraversal(node.left); + myList.add(node.data); + preOrderTraversal(node.right); + } + return myList; + } + + @Override + public String toString() { + myList = new ArrayList(); + return preOrderTraversal(this).toString(); + } + + public E getData() { + return data; + } + public void setData(E data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((data == null) ? 0 : data.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + BinaryTreeNode other = (BinaryTreeNode) obj; + if (data == null) { + if (other.data != null) + return false; + } else if (!data.equals(other.data)) + return false; + return true; + } + +} \ No newline at end of file diff --git a/group12/382266293/src/Collection/Concrete/LinkedList.java b/group12/382266293/src/Collection/Concrete/LinkedList.java new file mode 100644 index 0000000000..66dbd9d8d0 --- /dev/null +++ b/group12/382266293/src/Collection/Concrete/LinkedList.java @@ -0,0 +1,196 @@ +package Collection.Concrete; + +import java.util.NoSuchElementException; +import Collection.AbstractList; +import Collection.Iterator; + + +public class LinkedList extends AbstractList { + + private Node head; + private int size; + + public LinkedList() { + this.head = new Node(null); + this.size = 0; + } + + @Override + public void add(E e) { + addLast(e); + } + + + @Override + public E get(int index) { + checkIndex(index); + return getNode(index).data; + } + + public E getFirst() { + return get(0); + } + + public E getLast() { + return get(size-1); + } + + + public void add(int index, E e) { + if (index == size) { + addLast(e); + return; + } + + if (index == 0) { + addFirst(e); + return; + } + + checkIndex(index); + Node pNode = new Node(e); + Node p = getNode(index); + synchronized (this) { + getNode(index-1).next = pNode; + pNode.next = p; + size++; + } + } + + public void addFirst(E e){ + checkCapacity(); + Node pNode = new Node(e); + Node oldHead = head; + head = pNode; + pNode.next = oldHead; + size++; + return; + } + + public void addLast(E e){ + if (size == 0) { + addFirst(e); + return; + } + + checkCapacity(); + Node res = new Node(e); + setLastNode(res); + size++; + return; + } + + public E removeFirst(){ + return remove(0); + } + public E removeLast(){ + return remove(size-1); + } + + public E remove(int index) { + checkIndex(index); + Node pNode = getNode(index); + if (index == 0) { + head = head.next; + } else if (index == size-1 ) { + getNode(index-1).next = null; + } else { + getNode(index-1).next = getNode(index+1); + } + size--; + return pNode.data; + } + + @Override + public int size() { + return size; + } + + public Iterator iterator(){ + return new LinkedListIterator(this); + } + + private void checkCapacity() { + if (size > MAX_SIZE) + throw new IndexOutOfBoundsException("Reached max capacity: "+ MAX_SIZE); + } + + private Node getNode(int index) { + if (size == 0) + return head; + + Node pNode = head; + for ( int i = 0; i < index ; i++) { + pNode = pNode.next; + } + return pNode; + } + + private void setLastNode(Node res) { + getNode(size-1).next = res; + } + + private static class Node { + E data; + Node next; + + public Node(E data) { + this.data = data; + this.next = null; + } + + @Override + public String toString() { + return data.toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((data == null) ? 0 : data.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Node other = (Node) obj; + if (data == null) { + if (other.data != null) + return false; + } else if (!data.equals(other.data)) + return false; + return true; + } + } + + @SuppressWarnings("hiding") + private class LinkedListIterator implements Iterator { + + private LinkedList myLinkedList; + private int pos; + + public LinkedListIterator(LinkedList linkedList) { + myLinkedList = linkedList; + pos = 0; + } + + @Override + public boolean hasNext() { + return pos < size; + } + + @Override + public E next() { + if (hasNext()) + return (E) get(pos++); + throw new NoSuchElementException(); + } + } +} diff --git a/group12/382266293/src/Collection/Concrete/Queue.java b/group12/382266293/src/Collection/Concrete/Queue.java new file mode 100644 index 0000000000..300fb633af --- /dev/null +++ b/group12/382266293/src/Collection/Concrete/Queue.java @@ -0,0 +1,84 @@ +package Collection.Concrete; +import java.util.NoSuchElementException; + +import Collection.AbstractList; +import Collection.Iterator; + +public class Queue extends AbstractList { + + private LinkedList myList; + + public Queue() { + this.myList = new LinkedList(); + } + + public void enQueue(E e){ + myList.addLast(e); + } + + public E deQueue(){ + if (0 == size()) + return null; + return myList.removeFirst(); + } + + @Override + public void add(E e) { + enQueue(e); + } + + @Override + public E get(int index) { + if (0 == size()) + return null; + return myList.get(index); + } + + public E element() { + if (0 == size()) + return null; + return myList.getFirst(); + } + + + @Override + public int size() { + return myList.size(); + } + + @Override + protected Iterator iterator() { + return myList.iterator(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((myList == null) ? 0 : myList.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Queue other = (Queue) obj; + if (myList == null) { + if (other.myList != null) + return false; + } else if (!myList.equals(other.myList)) + return false; + return true; + } + + + + + + +} diff --git a/group12/382266293/src/Collection/Concrete/Stack.java b/group12/382266293/src/Collection/Concrete/Stack.java new file mode 100644 index 0000000000..17ec4364fa --- /dev/null +++ b/group12/382266293/src/Collection/Concrete/Stack.java @@ -0,0 +1,106 @@ +package Collection.Concrete; + +import java.util.EmptyStackException; +import java.util.NoSuchElementException; + +import Collection.AbstractList; +import Collection.Iterator; + +public class Stack extends AbstractList { + + private ArrayList myList; + + public Stack() { + this.myList = new ArrayList(); + } + + public void push(E e){ + myList.addLast(e); + } + + public E pop(){ + checkEmpty(); + return myList.removeLast(); + } + + private void checkEmpty() { + if (0 == size()) + throw new EmptyStackException(); + } + + public E peek(){ + checkEmpty(); + return myList.getLast(); + } + + public int size(){ + return myList.size(); + } + + @Override + public void add(E e) { + push(e); + } + + @Override + public E get(int index) { + checkEmpty(); + return myList.get(size() - index - 1); + } + + @Override + protected Iterator iterator() { + return new StackIterator(myList); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((myList == null) ? 0 : myList.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Stack other = (Stack) obj; + if (myList == null) { + if (other.myList != null) + return false; + } else if (!myList.equals(other.myList)) + return false; + return true; + } + + private class StackIterator implements Iterator { + + private ArrayList myArrayList; + private int pos; + + public StackIterator(ArrayList myList) { + myArrayList = myList; + pos = 0; + } + + @Override + public boolean hasNext() { + return pos < size(); + } + + @Override + public E next() { + if (hasNext()) + return (E) get(pos); + throw new NoSuchElementException(); + } + } + + + +} diff --git a/group12/382266293/src/Collection/Iterator.java b/group12/382266293/src/Collection/Iterator.java new file mode 100644 index 0000000000..d51656a3a8 --- /dev/null +++ b/group12/382266293/src/Collection/Iterator.java @@ -0,0 +1,7 @@ +package Collection; + +public interface Iterator { + + public boolean hasNext(); + public E next(); +} diff --git a/group12/382266293/src/Collection/List.java b/group12/382266293/src/Collection/List.java new file mode 100644 index 0000000000..7ddb685cac --- /dev/null +++ b/group12/382266293/src/Collection/List.java @@ -0,0 +1,16 @@ +package Collection; + +public interface List { + + public void add(E e); + + public int size(); + + public E get(int index); + + public boolean isEmpty(); + + public int indexOf(E e); + + +} diff --git a/group12/382266293/src/TestCollection/AllTests.java b/group12/382266293/src/TestCollection/AllTests.java new file mode 100644 index 0000000000..cd4eeadb58 --- /dev/null +++ b/group12/382266293/src/TestCollection/AllTests.java @@ -0,0 +1,11 @@ +package TestCollection; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ ArrayListTest.class, BinaryTreeNodeTest.class, LinkedListTest.class, QueueTest.class, StackTest.class }) +public class AllTests { + +} diff --git a/group12/382266293/src/TestCollection/ArrayListTest.java b/group12/382266293/src/TestCollection/ArrayListTest.java new file mode 100644 index 0000000000..f29580616f --- /dev/null +++ b/group12/382266293/src/TestCollection/ArrayListTest.java @@ -0,0 +1,173 @@ +package TestCollection; + +import static util.Print.*; +import static util.TestUtil.*; +import java.util.Date; +import java.util.NoSuchElementException; +import java.util.Random; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + + +import Collection.Iterator; +import Collection.List; +import Collection.Concrete.ArrayList; +import junit.framework.TestCase; + +public class ArrayListTest extends TestCase { + + + private ArrayList myAL; + private static Random rnd = new Random(); + + @Before + public void setUp() throws Exception { + + myAL = new ArrayList(); + assertEquals(true,myAL.isEmpty()); + + } + + @After + public void tearDown() throws Exception { + myAL = null; + } + + @Test + public void testRawTypeArrayList() { + + List rawList = new ArrayList(); + assertEquals(rawList.size(), 0); + rawList.add(new Date()); + assertEquals(1, rawList.size()); + } + + @Test + public void testEmpty() { + + assertEquals(true,myAL.isEmpty()); + + myAL.add(5); + assertEquals(false,myAL.isEmpty()); + + int num = getRandomNumber(); + addIntWithNatureOrder(myAL, num); + assertEquals(false,myAL.isEmpty()); + + } + + @Test + public void testAddIntAutoBoxing() { + + myAL.add(5); + myAL.add(5); + myAL.add(5); + myAL.add(1,10); + int c = myAL.get(1); + assertEquals(10,c); + + assertEquals(4,myAL.size()); + myAL.add(4,15); + int a = myAL.get(0); + Integer b = myAL.get(1); + c = myAL.get(2); + int d = myAL.get(3); + int e = myAL.get(4); + assertEquals(5,a); + assertEquals(new Integer(10),b); + assertEquals(5,c); + assertEquals(5,d); + assertEquals(15,e); + } + + @Test + public void testGet() { + + int[] result = addRandomInt(myAL, getRandomNumber()); + + int actual,expected; + + for (int i = 0; i < result.length; i++) { + actual = myAL.get(i); + expected = result[i]; + assertEquals(expected, actual); + } + + } + + @Test + public void testRemove() { + + addIntWithNatureOrder(myAL, 100); + + testRemoveAndGetFromTail(myAL); + try { + myAL.remove(10); + fail("no exception thrown"); + } catch (Exception e) { + assertEquals(IndexOutOfBoundsException.class, e.getClass()); + } + + } + + @Test + public void testSize() { + + assertEquals(0,myAL.size()); + int num = getRandomNumber(); + addIntWithNatureOrder(myAL, num); + assertEquals(num,myAL.size()); + } + + + + @Test + public void testGrow() { + + int actualSize = 12345; + + addIntWithNatureOrder(myAL, actualSize); + + assertEquals(actualSize,myAL.size()); + } + + + @Test + public void testIterator() { + + addIntWithNatureOrder(myAL,100); + + Iterator it = myAL.iterator(); + + for(int i = 0; it.hasNext(); i++){ + int actual = it.next(); + assertEquals(i,actual); + } + + try { + it.next(); + } catch (NoSuchElementException ex) { + assertEquals(ex.getClass(),NoSuchElementException.class); + } + } + + @Test + public void testIndexOf() { + + int num = 200; + addIntWithNatureOrder(myAL,num); + + int expected,actual; + for (int i = 0; i < num-1; i++) { + expected = i; + actual = myAL.indexOf(i); + assertEquals(expected, actual); + } + + assertEquals(-1, myAL.indexOf(-1*getRandomNumber())); + + } + +} diff --git a/group12/382266293/src/TestCollection/BinaryTreeNodeTest.java b/group12/382266293/src/TestCollection/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..275ef59484 --- /dev/null +++ b/group12/382266293/src/TestCollection/BinaryTreeNodeTest.java @@ -0,0 +1,54 @@ +package TestCollection; + +import static util.Print.*; +import java.util.Random; +import java.util.Set; +import java.util.TreeSet; +import static util.TestUtil.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import Collection.Concrete.BinaryTreeNode; +import junit.framework.TestCase; + +public class BinaryTreeNodeTest extends TestCase { + + private BinaryTreeNode myTree; + + @Before + public void setUp() throws Exception { + myTree = new BinaryTreeNode(); + assertEquals(0, myTree.size()); + } + + @After + public void tearDown() throws Exception { + myTree = null; + } + + @Test + public void testInsert() { + Set expected = new TreeSet(); + int size = getRandomNumber(); + int j = 0 ; + while (expected.size() != size) { + j = getRandomNumber(); + expected.add(j); + myTree.insert(j); + } + + assertEquals(size,myTree.size()); + assertEquals(expected.toString(),myTree.toString()); + } + + public void testSize() { + + for (int i = 0; i < getRandomNumber(); i++) { + myTree.insert(18); + myTree.insert(-19); + myTree.insert(1); + assertEquals(3,myTree.size()); + } + } +} \ No newline at end of file diff --git a/group12/382266293/src/TestCollection/LinkedListTest.java b/group12/382266293/src/TestCollection/LinkedListTest.java new file mode 100644 index 0000000000..8b9fad15eb --- /dev/null +++ b/group12/382266293/src/TestCollection/LinkedListTest.java @@ -0,0 +1,212 @@ +package TestCollection; + +import static util.Print.*; +import static util.TestUtil.*; +import java.util.Date; +import java.util.NoSuchElementException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import Collection.Iterator; +import Collection.List; +import Collection.Concrete.LinkedList; +import junit.framework.TestCase; + + +public class LinkedListTest extends TestCase { + + LinkedList myLL; + + @Before + public void setUp() throws Exception { + myLL = new LinkedList(); + assertEquals(0,myLL.size()); + } + + @After + public void tearDown() throws Exception { + myLL = null; + } + + @Test + public void testLinkedList() { + List rawList = new LinkedList(); + assertEquals(rawList.size(), 0); + rawList.add(new Date()); + assertEquals(1, rawList.size()); + + } + + @Test + public void testAddE() { + myLL.add("s"); + assertEquals(1,myLL.size()); + assertEquals(false,myLL.isEmpty()); + } + + @Test + public void testAddStringE() { + String a; + + addString(myLL,30); + println(myLL.get(0)); + +// for (int i = 0 ; i < 29; i++) { +// a = "" + i; +// assertEquals(myLL.get(i),a); +// } + } + + @Test + public void testAddIndex() { + String a; + for (int i = 0 ; i < 30; i++) { + a = "" + i; + myLL.add(a); + } + + String ss = "ss"; + myLL.add(3,ss); + assertEquals(myLL.get(3), ss); + assertEquals(myLL.get(2), "2"); + assertEquals(myLL.get(4), "3"); + + } + + public void testAddFirst() { + String a; + for (int i = 0 ; i < 20; i++) { + a = "" + i; + myLL.add(a); + } + + String ss = "bba"; + myLL.addFirst(ss); + assertEquals(ss,myLL.get(0)); + assertEquals(21, myLL.size()); + + ; + for (int i = 1 ; i < myLL.size(); i++) { + a = (i-1) + ""; + assertEquals(a, myLL.get(i)); + } + } + + public void testAddLast() { + String a; + for (int i = 0 ; i < 25; i++) { + a = "" + i; + myLL.add(a); + } + + String ss = "25"; + myLL.addLast(ss); + int size = myLL.size(); + assertEquals(26, size); + + for (int i = 0 ; i < size; i++) { + a = i + ""; + assertEquals(a, myLL.get(i)); + } + } + + @Test + public void testRemoveFirst() { + + String a = ""; + String result = ""; + for(int i = 0; i < 10; i++) { + myLL.add(i+""); + } + + myLL.removeFirst(); + assertEquals(9, myLL.size()); + + for(int i = 0; i < myLL.size(); i++) { + a = i+1 + ""; + assertEquals(a, myLL.get(i)); + } + + int size = myLL.size(); + for(int i = 0; i < size; i++) { + a = i+1 +""; + result = myLL.removeFirst(); + assertEquals(a, result); + } + + assertEquals(0, myLL.size()); + } + + @Test + public void testRemoveLast() { + + String a = ""; + String result = ""; + for(int i = 0; i < 10; i++) { + myLL.add(i+""); + } + + myLL.removeLast(); + assertEquals(9, myLL.size()); + + for(int i = 0; i < myLL.size(); i++) { + a = i + ""; + assertEquals(a, myLL.get(i)); + } + + int size = myLL.size(); + for(int i = 0; i < size; i++) { + a = myLL.size()-1 +""; + result = myLL.removeLast(); + assertEquals(a, result); + } + + assertEquals(0, myLL.size()); + + } + + + @Test + public void testRemove() { + + String res = ""; + String a = ""; + for(int i = 0; i < 10; i++) { + myLL.add(i+""); + } + + for(int i = myLL.size()-1; i >= 0; i--) { + a = myLL.get(i); + res = myLL.remove(i); + assertEquals(i, myLL.size()); + assertEquals(a,res); + } + } + + @Test + public void testSize() { + assertEquals(0,myLL.size()); + } + + @Test + public void testIterator() { + for(int i = 0; i<10; i++) { + myLL.add(i+""); + } + Iterator it = myLL.iterator(); + + for(int i = 0; it.hasNext(); i++){ + String res = it.next(); + assertEquals(i+"",res); + } + + try { + it.next(); + } catch (NoSuchElementException ex) { + assertEquals(ex.getClass(),NoSuchElementException.class); + } + } + + +} diff --git a/group12/382266293/src/TestCollection/QueueTest.java b/group12/382266293/src/TestCollection/QueueTest.java new file mode 100644 index 0000000000..01a9aa31f2 --- /dev/null +++ b/group12/382266293/src/TestCollection/QueueTest.java @@ -0,0 +1,98 @@ +package TestCollection; + +import static util.Print.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import static util.TestUtil.*; +import Collection.Concrete.Queue; +import junit.framework.TestCase; + +public class QueueTest extends TestCase { + + private Queue myQueue; + + @Before + public void setUp() throws Exception { + myQueue= new Queue(); + } + + @After + public void tearDown() throws Exception { + myQueue = null; + } + + @Test + public void testIsEmpty() { + assertEquals(true, myQueue.isEmpty()); + myQueue.enQueue(getRandomNumber()); + assertEquals(false, myQueue.isEmpty()); + } + + @Test + public void testEnQueue() { + + enQueueIntWithNatureOrder(myQueue, getRandomNumber()); + + } + + @Test + public void testDeQueue() { + enQueueIntWithNatureOrder(myQueue, getRandomNumber()); + int size = myQueue.size(); + for (int i = 0; i < size ; i++) { + assertEquals(size-i, myQueue.size()); + int expect = i; + int actual = myQueue.deQueue(); + assertEquals(expect, actual); + } + + assertEquals(null, myQueue.deQueue()); + assertEquals(null, myQueue.element()); + assertEquals(null, myQueue.get(0)); + + } + + @Test + public void testelement() { + + int expected = 0; + int element1 = 0; + int repeated = 0; + + for (int i = 0; i < 10; i++) { + myQueue.enQueue(i); + expected = i; + + element1 = myQueue.element(); + assertEquals(expected, element1); + + for (int j = 0; j < i; j++) { + repeated = myQueue.element(); + assertEquals(expected, repeated); + } + myQueue.deQueue(); + } + + } + + @Test + public void testSize() { + for (int i = 0; i < 10000; i++) { + assertEquals(i, myQueue.size()); + myQueue.enQueue(i); + } + } + + @Test + public void testAdd() { + for (int i = 0; i < 10; i++) { + myQueue.add(i); + Integer actual = new Integer(myQueue.get(i)); + Integer expected = new Integer(i); + assertEquals(expected, actual); + } + } + + +} diff --git a/group12/382266293/src/TestCollection/StackTest.java b/group12/382266293/src/TestCollection/StackTest.java new file mode 100644 index 0000000000..3784a9b972 --- /dev/null +++ b/group12/382266293/src/TestCollection/StackTest.java @@ -0,0 +1,129 @@ +package TestCollection; + +import static util.Print.*; + +import java.util.EmptyStackException; +import static util.TestUtil.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import Collection.Concrete.Stack; +import junit.framework.TestCase; + +public class StackTest extends TestCase { + + Stack myStack; + + @Before + public void setUp() throws Exception { + myStack= new Stack(); + } + + @After + public void tearDown() throws Exception { + myStack = null; + } + + @Test + public void testIsEmpty() { + assertEquals(true, myStack.isEmpty()); + myStack.push(getRandomNumber()); + assertEquals(false, myStack.isEmpty()); + } + + @Test + public void testPush() { + for (int i = 0; i < 10; i++) { + assertEquals(i, myStack.size()); + myStack.push(i); + } + } + + @Test + public void testPop() { + testPush(); + int size = myStack.size(); + for (int i = size; i > 0; i--) { + assertEquals(i, myStack.size()); + int expect = i-1; + assertEquals(i, myStack.size()); + int actual = myStack.pop(); + assertEquals(expect, actual); + } + + try { + myStack.pop(); + fail("no exception throw"); + } catch (Exception e) { + assertEquals(EmptyStackException.class, e.getClass()); + } + } + + @Test + public void testPeek() { + + int expected = 0; + int peek1 = 0; + int repeated = 0; + + for (int i = 0; i < 10; i++) { + myStack.push(i); + expected = i; + + peek1 = myStack.peek(); + assertEquals(expected, peek1); + + for (int j = 0; j < i; j++) { + repeated = myStack.peek(); + assertEquals(expected, repeated); + } + } + + } + + + public void testGet() { + + try { + myStack.get(getRandomNumber()); + fail("no exception throw"); + } catch (Exception e) { + assertEquals(EmptyStackException.class, e.getClass()); + } + + } + + @Test + public void testSize() { + for (int i = 0; i < 10000; i++) { + assertEquals(i, myStack.size()); + myStack.push(i); + } + } + + @Test + public void testAdd() { + myStack.push(5); + myStack.push(10); + myStack.push(15); + println(myStack.get(0)); + println(myStack.get(1)); + println(myStack.get(2)); + + } + + @Test + public void testPopPushAndPeek() { + for (int i = 0; i < 10; i++) { + int expected = i; + myStack.push(i); + int a = 0; + myStack.push(a); + myStack.pop(); + int actual = myStack.peek(); + assertEquals(expected, actual); + } + } + +} diff --git a/group12/382266293/src/test.java b/group12/382266293/src/test.java new file mode 100644 index 0000000000..e4e7fead2d --- /dev/null +++ b/group12/382266293/src/test.java @@ -0,0 +1,15 @@ +import java.util.ArrayList; +import java.util.Queue; +import java.util.Stack; +import java.util.concurrent.PriorityBlockingQueue; +import static util.Print.*; + +public class test { + + public static void main(String[] args) { + Queue queue = new PriorityBlockingQueue(); + println(queue.poll()); + + } + +} diff --git a/group12/382266293/src/util/Print.java b/group12/382266293/src/util/Print.java new file mode 100644 index 0000000000..b2ae48552b --- /dev/null +++ b/group12/382266293/src/util/Print.java @@ -0,0 +1,14 @@ +package util; + + +public class Print { + + public static void print(Object o){ + System.out.print(o); + } + + public static void println(Object o){ + System.out.println(o); + } + +} diff --git a/group12/382266293/src/util/TestUtil.java b/group12/382266293/src/util/TestUtil.java new file mode 100644 index 0000000000..2dfeeade7f --- /dev/null +++ b/group12/382266293/src/util/TestUtil.java @@ -0,0 +1,78 @@ +package util; + +import java.util.Random; + +import Collection.List; +import Collection.Concrete.ArrayList; +import Collection.Concrete.LinkedList; +import Collection.Concrete.Queue; +import junit.framework.TestCase; + + +public class TestUtil extends TestCase { + + private static Random random = new Random(); + private static final int RANDOM_BOUND = 2<<15; + private static final int RANDOM_SIZE = 500; + + + public static int getRandomNumber() { + return random.nextInt(RANDOM_SIZE); + } + + public static void addIntWithNatureOrder(List myList, int numbers) { + + for (int acutal = 0; acutal < numbers ; acutal++) { + myList.add(acutal); + } + } + + public static int[] addRandomInt(List myList, int numbers) { + + int actual = 0; + int[] result = new int[numbers]; + for (int i = 0; i < numbers ; i++) { + actual = random.nextInt(RANDOM_BOUND); + result[i] = actual; + myList.add(actual); + } + return result; + } + + public static void addString(List myList, int num) { + + String actual; + for (int index = 0; index < num ; index++) { + actual = index + ""; + myList.add(actual); + } + } + + public static void testRemoveAndGetFromTail(ArrayList myList) { + E get; + E remove; + for(int i = myList.size()-1; i >= 0; i--) { + get = myList.get(i); + remove = myList.remove(i); + assertEquals(get,remove); + } + } + + public static void testRemoveAndGetFromTail(LinkedList myList) { + E get; + E remove; + for(int i = myList.size()-1; i >= 0; i--) { + get = myList.get(i); + remove = myList.remove(i); + assertEquals(get,remove); + } + } + + public static void enQueueIntWithNatureOrder(Queue myQueue, int numbers) { + + for (int acutal = 0; acutal < numbers ; acutal++) { + myQueue.enQueue(acutal); + } + } + +} diff --git a/group12/441908378/ArrayList.java b/group12/441908378/ArrayList.java new file mode 100644 index 0000000000..74f49a39d1 --- /dev/null +++ b/group12/441908378/ArrayList.java @@ -0,0 +1,50 @@ +import java.util.Arrays; + +public class ArrayList { + +private int size = 0; + +private Object[] elementData = new Object[100]; + +public void enlargeCapacity(int minCapacity){ + int oldCapacity=elementData.length; + if(oldCapacityb){ + return left; + }else{ + return right; + } + } + + +} diff --git a/group12/441908378/LinkedList.java b/group12/441908378/LinkedList.java new file mode 100644 index 0000000000..456160f154 --- /dev/null +++ b/group12/441908378/LinkedList.java @@ -0,0 +1,121 @@ +public class LinkedList { + +private Node head; + +private static class Node{ + Object data; + Node next; +} + +public boolean hasNext(Node a){ + if(a.next!=null){ + return true; + } + return false; +} + +public Node getIndex(int index){ + Node a=head.next; + for(int i=0;i elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + } + /** + * + * 验证 + * + * @MethodName validate 下标 + * @author msh + * @date 2017年2月21日 下午3:54:21 + * @param index + */ + private void validate(int index) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } +} diff --git a/group12/446031103/src/com/coding/basic/BinaryTreeNode.java b/group12/446031103/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..ed26d946bb --- /dev/null +++ b/group12/446031103/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,44 @@ +package com.coding.basic; + + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode( Object data,BinaryTreeNode left,BinaryTreeNode right){ + this.data = data; + this.left = left; + this.right = right; + } + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(BinaryTreeNode tree,Object o){ + if(null== tree){ + tree = new BinaryTreeNode(o, null, null); + } + if(Integer.valueOf(o.toString())>Integer.valueOf(tree.data.toString())){ + tree.right =insert(tree.right,o); + }else{ + tree.left = insert(tree.left,o); + } + return tree; + } + +} diff --git a/group12/446031103/src/com/coding/basic/Iterator.java b/group12/446031103/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group12/446031103/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group12/446031103/src/com/coding/basic/LinkedList.java b/group12/446031103/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..de508694a0 --- /dev/null +++ b/group12/446031103/src/com/coding/basic/LinkedList.java @@ -0,0 +1,225 @@ +package com.coding.basic; + +/** + * + * LinkedList集合-链 + * + * @ClassName LinkedList + * @author msh + * @date 2017年2月21日 下午4:08:01 + */ +public class LinkedList implements List { + //链头 + private Node head; + //集合大小 + private int size=0; + /** + * + * 向链中添加元素 + * + * @Method add 添加 + * @param o 元素 + * @see com.coding.basic.List#add(java.lang.Object) + */ + public void add(Object o){ + Node newNode = new Node(o, null); + if (null == head) { + head = newNode; + } else { + Node lastNode = null; + for (int i = 0; i < size; i++) { + lastNode = (Node) get(i); + } + lastNode.next = newNode; + } + size++; + } + /** + * + * 向链中添加元素 + * + * @Method add 增加 + * @param index 下标 + * @param o 元素 + * @see com.coding.basic.List#add(int, java.lang.Object) + */ + public void add(int index , Object o){ + validate(index); + Node newNode = null; + Node perNode = null; + Node nextNode = null; + // 当为最后插入时 + if (index == size - 1) { + newNode = new Node(o, null); + for (int i = 0; i < index; i++) { + Node tempNode = (Node) get(i); + perNode = tempNode.next; + } + perNode.next = newNode; + } else if (0 == index) { + nextNode = head.next; + newNode = new Node(o, nextNode); + head = newNode; + } else { + for (int i = 0; i < index; i++) { + Node tempNode = (Node) get(i); + perNode = tempNode.next; + } + nextNode = perNode.next.next; + newNode = new Node(o, nextNode); + perNode.next = newNode; + } + size++; + } + /** + * + * 取得元素 + * + * @Method get 取得 + * @param index 下标 + * @return + * @see com.coding.basic.List#get(int) + */ + public Object get(int index){ + validate(index); + Node tempNode = head; + for (int i = 0; i <= index; i++) { + tempNode = tempNode.next; + } + return tempNode; + } + /** + * + * 删除元素 + * + * @Method remove 删除 + * @param index 下标 + * @return + * @see com.coding.basic.List#remove(int) + */ + public Object remove(int index){ + Node removeNode = (Node) get(index); + validate(index); + if (index == size - 1) { + Node tempNode = head; + for (int i = 0; i < index; i++) { + tempNode = tempNode.next; + } + tempNode.next = null; + } else if (index == 0) { + Node tempNode = head.next; + head.next = null; + head = tempNode; + } else { + } + size--; + return removeNode; + } + /** + * + * 取得集合大小 + * + * @Method size 集合大小 + * @return 集合大小 + * @see com.coding.basic.List#size() + */ + public int size(){ + return size; + } + /** + * + * 想链头中插入元素 + * + * @MethodName addFirst + * @author msh + * @date 2017年2月21日 下午4:10:56 + * @param o + */ + public void addFirst(Object o){ + Node newNode = new Node(o, head); + head = newNode; + } + /** + * + * 向链后加入元素 + * + * @MethodName addLast + * @author msh + * @date 2017年2月21日 下午4:11:43 + * @param o + */ + public void addLast(Object o){ + add(o); + } + /** + * + * 删除链头 + * + * @MethodName removeFirst + * @author msh + * @date 2017年2月21日 下午4:12:14 + * @return + */ + public Object removeFirst(){ + if(null==head) + throw new IndexOutOfBoundsException("Size: " + size); + Node orgHead = head; + Node tempNode = head.next; + head.next = null; + head = tempNode; + return orgHead; + } + /** + * + * 删除链尾 + * + * @MethodName removeLast + * @author zhaogd + * @date 2017年2月21日 下午4:12:44 + * @return + */ + public Object removeLast(){ + if(null==head) + throw new IndexOutOfBoundsException("Size: " + size); + Node lastNode = (Node) get(size); + Node tempNode = head; + for (int i = 0; i < (size - 1); i++) { + tempNode = tempNode.next; + } + tempNode.next = null; + return lastNode; + } + public Iterator iterator(){ + return null; + } + + /** + * + * 验证 + * + * @MethodName validate 下标 + * @author msh + * @date 2017年2月21日 下午3:54:21 + * @param index + */ + private void validate(int index) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + /** + * + * 链中元素 + * + * @ClassName Node + * @author zhaogd + * @date 2017年2月21日 下午4:13:10 + */ + private static class Node{ + Object data; + Node next; + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } +} diff --git a/group12/446031103/src/com/coding/basic/List.java b/group12/446031103/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group12/446031103/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group12/446031103/src/com/coding/basic/Queue.java b/group12/446031103/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..3844d9dd24 --- /dev/null +++ b/group12/446031103/src/com/coding/basic/Queue.java @@ -0,0 +1,68 @@ +package com.coding.basic; + +/** + * + * 队列-先进先出 + * + * @ClassName Queue + * @author msh + * @date 2017年2月21日 下午9:29:03 + */ +public class Queue { + private LinkedList elementData = new LinkedList(); + /** + * + * 入队列 + * + * @MethodName enQueue + * @author msh + * @date 2017年2月21日 下午9:45:15 + * @param o + */ + public void enQueue(Object o){ + elementData.add(o); + } + /** + * + * 离开队列 + * + * @MethodName deQueue + * @author msh + * @date 2017年2月21日 下午9:56:06 + * @return + */ + public Object deQueue(){ + if(isEmpty()) + throw new IndexOutOfBoundsException("size:"+size()); + Object o=elementData.get(0); + elementData.removeFirst(); + return o; + } + /** + * + * 是否为空 + * + * @MethodName isEmpty + * @author msh + * @date 2017年2月21日 下午9:57:14 + * @return + */ + public boolean isEmpty(){ + boolean temp = false; + if(0==elementData.size()) + temp= true; + return temp; + } + /** + * + * 队列中元素 + * + * @MethodName size + * @author msh + * @date 2017年2月21日 下午9:57:28 + * @return + */ + public int size(){ + return elementData.size(); + } +} diff --git a/group12/446031103/src/com/coding/basic/Stack.java b/group12/446031103/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..4d1c58b671 --- /dev/null +++ b/group12/446031103/src/com/coding/basic/Stack.java @@ -0,0 +1,81 @@ +package com.coding.basic; + +/** + * + * 栈-先进后出 + * + * @ClassName Stack + * @author msh + * @date 2017年2月21日 下午9:05:39 + */ +public class Stack { + + private ArrayList elementData = new ArrayList(); + /** + * + * 向栈中加入元素 + * + * @MethodName push + * @author msh + * @date 2017年2月21日 下午9:12:03 + * @param o + */ + public void push(Object o){ + elementData.add(o); + } + /** + * + * 从栈中取出元素 + * + * @MethodName pop + * @author msh + * @date 2017年2月21日 下午9:12:51 + * @return + */ + public Object pop(){ + Object o= peek(); + elementData.remove(size()-1); + return o; + } + /** + * + * 取出栈顶元素 + * + * @MethodName peek + * @author msh + * @date 2017年2月21日 下午9:13:08 + * @return + */ + public Object peek(){ + Object o=elementData.get(size()-1); + return o; + } + /** + * + * 判断栈中是否有元素 + * + * @MethodName isEmpty + * @author msh + * @date 2017年2月21日 下午9:14:26 + * @return + */ + public boolean isEmpty(){ + boolean temp = false; + if(0==size()) + temp = true; + return temp; + } + /** + * + * 栈中有多少元素 + * + * @MethodName size + * @author msh + * @date 2017年2月21日 下午9:16:42 + * @return + */ + public int size(){ + return elementData.size(); + } + +} diff --git a/group12/495473393/Coding/.gitignore b/group12/495473393/Coding/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group12/495473393/Coding/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group12/495473393/Coding/src/Base/ArrayList.java b/group12/495473393/Coding/src/Base/ArrayList.java new file mode 100644 index 0000000000..0b99f87873 --- /dev/null +++ b/group12/495473393/Coding/src/Base/ArrayList.java @@ -0,0 +1,32 @@ +package Base; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group12/495473393/Coding/src/Base/BinaryTreeNode.java b/group12/495473393/Coding/src/Base/BinaryTreeNode.java new file mode 100644 index 0000000000..875abe8c80 --- /dev/null +++ b/group12/495473393/Coding/src/Base/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package Base; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group12/495473393/Coding/src/Base/Iterator.java b/group12/495473393/Coding/src/Base/Iterator.java new file mode 100644 index 0000000000..19b65c3637 --- /dev/null +++ b/group12/495473393/Coding/src/Base/Iterator.java @@ -0,0 +1,7 @@ +package Base; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group12/495473393/Coding/src/Base/LinkedList.java b/group12/495473393/Coding/src/Base/LinkedList.java new file mode 100644 index 0000000000..0d4ce20167 --- /dev/null +++ b/group12/495473393/Coding/src/Base/LinkedList.java @@ -0,0 +1,46 @@ +package Base; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group12/495473393/Coding/src/Base/List.java b/group12/495473393/Coding/src/Base/List.java new file mode 100644 index 0000000000..6c910af600 --- /dev/null +++ b/group12/495473393/Coding/src/Base/List.java @@ -0,0 +1,9 @@ +package Base; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group12/495473393/Coding/src/Base/Queue.java b/group12/495473393/Coding/src/Base/Queue.java new file mode 100644 index 0000000000..9c2948d7e3 --- /dev/null +++ b/group12/495473393/Coding/src/Base/Queue.java @@ -0,0 +1,19 @@ +package Base; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group12/495473393/Coding/src/Base/Stack.java b/group12/495473393/Coding/src/Base/Stack.java new file mode 100644 index 0000000000..8f59343d4b --- /dev/null +++ b/group12/495473393/Coding/src/Base/Stack.java @@ -0,0 +1,22 @@ +package Base; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group12/563253496/datastructure/.classpath b/group12/563253496/datastructure/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group12/563253496/datastructure/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group12/563253496/datastructure/.gitignore b/group12/563253496/datastructure/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group12/563253496/datastructure/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group12/563253496/datastructure/.project b/group12/563253496/datastructure/.project new file mode 100644 index 0000000000..4ae7fd9359 --- /dev/null +++ b/group12/563253496/datastructure/.project @@ -0,0 +1,17 @@ + + + datastructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group12/563253496/datastructure/src/Collection/ArrayList.java b/group12/563253496/datastructure/src/Collection/ArrayList.java new file mode 100644 index 0000000000..597a9b1a3a --- /dev/null +++ b/group12/563253496/datastructure/src/Collection/ArrayList.java @@ -0,0 +1,173 @@ +package Collection; + +import com.coding.basic.List; + +import java.util.NoSuchElementException; + +import com.coding.basic.Iterator; + +public class ArrayList implements List { + + private int size; + private Object[] elementData; + + public ArrayList() { + size = 0; + elementData = new Object[10]; + } + + public ArrayList(Object o) { + size = 0; + elementData = new Object[10]; + this.add(o); + } + + public ArrayList(int initialCapacity) { + size = 0; + elementData = new Object[initialCapacity]; + } + + @Override + public void add(Object o) { + if (size <= elementData.length - 1) { + elementData[size] = o; + size++; + } else { + this.extendCapacity(); + elementData[size] = o; + size++; + + } + } + + @Override + public void add(int index, Object o) { + if (index < 0) { + throw new IndexOutOfBoundsException(); + } + if (index > elementData.length - 1) { + while (index > elementData.length - 1) { + this.extendCapacity(); + } + elementData[index] = o; + size = index + 1; + return; + } + + if (index >= size) { + size = index + 1; + elementData[index] = o; + return; + } + if (index >= 0 && index < size) { + this.moveRearward(index); + elementData[index] = o; + size++; + return; + } + } + + @Override + public Object get(int index) { + checkCapacity(index); + if (index < size) { + return elementData[index]; + } + return null; + } + + @Override + public Object remove(int index) { + checkCapacity(index); + + if (index == size - 1) { + size--; + return elementData[size - 1]; + } + if (index < size - 1) { + Object tmp = elementData[index]; + for (int i = index; i < size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + size--; + return tmp; + } + return null; + } + + private void checkCapacity(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + } + + private void extendCapacity() { + Object[] elements = new Object[elementData.length + 10]; + for (int i = 0; i < size; i++) { + elements[i] = elementData[i]; + } + elementData = elements; + + } + + @Override + public int size() { + return size; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < size; i++) { + sb.append(elementData[i]); + sb.append(","); + } + sb.deleteCharAt(sb.length() - 1); + sb.append("]"); + return sb.toString(); + } + + private void moveRearward(int index) { + size++; + + if (size >= elementData.length - 1) + this.extendCapacity(); + + for (int i = size - 1; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + } + + public Iterator iterator() { + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + + private int pos; + + public ArrayListIterator() { + + pos = 0; + } + + @Override + public boolean hasNext() { + if (pos < size) { + return true; + } + return false; + } + + @Override + public Object next() { + if (hasNext()) { + return elementData[pos++]; + } else + throw new NoSuchElementException(); + + } + + } + +} diff --git a/group12/563253496/datastructure/src/Collection/LinkedList.java b/group12/563253496/datastructure/src/Collection/LinkedList.java new file mode 100644 index 0000000000..94aefb188e --- /dev/null +++ b/group12/563253496/datastructure/src/Collection/LinkedList.java @@ -0,0 +1,227 @@ +package Collection; + +import com.coding.basic.List; +import com.coding.basic.Iterator; + +public class LinkedList implements List { + + public Node head; + public int size; + + public LinkedList() { + head = new Node(); + size = 0; + } + + public LinkedList(Object o) { + head = new Node(o); + size = 1; + } + + public void add(Object o) { + if (size == 0) { + addfirst(o); + return; + } + addlast(o); + } + + public void add(int index, Object o) { + this.checkCapacity(index); + if (index == 0) { + addfirst(o); + return; + } + if (index == size) { + addlast(o); + return; + } + addmid(index, o); + } + + public void checkCapacity(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException(); + } + } + + public void addfirst(Object o) { + Node tmp = new Node(head); + head.data = o; + head.next = tmp; + size++; + } + + public void addlast(Object o) { + Node tmp = new Node(head); + //Node last = new Node(o); + //last.data=o; + for (int i = 0; i < size-1; i++) { + tmp = tmp.next; + } + + tmp.next = new Node(o); + size++; + + } + + public void addmid(int index, Object o) { + Node tmp = new Node(head); + Node add = new Node(o); + for (int i = 0; i < index - 1; i++) { + tmp = tmp.next; + } + add.next = tmp.next; + tmp.next = add; + size++; + } + + public Object get(int index) { + checkCapacity(index); + Node tmp = new Node(head); + if (index == 0) { + return head; + } + for (int i = 0; i < index - 1; i++) { + tmp = tmp.next; + } + return tmp.next; + } + + public Object remove(int index) { + checkCapacity(index); + Node tmp = new Node(head); + if (index == 0) { + return removeFirst(); + } + for (int i = 0; i < index - 1; i++) { + tmp = tmp.next; + } + Node result = new Node(tmp.next); + tmp.next = result.next; + return result; + } + + public int size() { + return this.size; + } + + public Object removeFirst() { + Node tmp = new Node(head); + head = head.next; + return tmp; + } + + public Object removeLast() { + if (size == 0) { + return null; + } + if (size == 1) { + Node tmp = new Node(head); + head = null; + return tmp; + } + Node tmp = new Node(head); + for (int i = 0; i < size - 2; i++) { + tmp = tmp.next; + } + Node result = new Node(tmp.next); + tmp.next = result.next; + return result; + } + + public String toString(){ + StringBuilder sb= new StringBuilder(); + sb.append("["); + Node tmp=new Node(head); + for(int i=0;ielementData.size()){ + throw new IndexOutOfBoundsException(); + } + } + public Object pop(){ + checkCapacity(); + Object o = elementData.remove(size-1); + size--; + return o; + } + + public Object peek() { + checkCapacity(); + Object o = elementData.get(size-1); + return o; + } + + public boolean isEmpty() { + if(size!=0){ + return true; + } + return false; + } + + public String toString(){ + return super.toString(); + } + + public int size() { + return size; + } +} diff --git a/group12/563253496/datastructure/src/Collection/TestArrayList.java b/group12/563253496/datastructure/src/Collection/TestArrayList.java new file mode 100644 index 0000000000..eef55fae6b --- /dev/null +++ b/group12/563253496/datastructure/src/Collection/TestArrayList.java @@ -0,0 +1,33 @@ +package Collection; + +import java.lang.reflect.Array; + +/** + * Created by bdl19 on 2017/2/23. + */ +public class TestArrayList { + /*public static void main(String[] args){ + /* + ArrayList al= new ArrayList("test1"); + System.out.println(al); + al.add("test2"); + System.out.println(al); + al.add(1,2); + System.out.println(al); + System.out.println(al.get(2)); + System.out.println(al.get(1)); + System.out.println(al.get(0)); + // System.out.println(al.get(3)); + System.out.println(al.size()); + System.out.println(al.remove(2)); + System.out.println(al); + + ArrayList al =new ArrayList(); + al.add(3,2); + al.add(0,0); + System.out.println(al.size()); + System.out.println(al); + + } + **/ +} diff --git a/group12/563253496/datastructure/src/Collection/TestStack.java b/group12/563253496/datastructure/src/Collection/TestStack.java new file mode 100644 index 0000000000..4702e49079 --- /dev/null +++ b/group12/563253496/datastructure/src/Collection/TestStack.java @@ -0,0 +1,15 @@ +package Collection; + +/** + * Created by bdl19 on 2017/2/25. + */ +public class TestStack { + public static void main(String[] args) { + Stack s=new Stack(); + s.push("a"); + s.push("b"); + System.out.println(s.pop()); + System.out.println(s.pop()); + + } +} diff --git a/group12/563253496/datastructure/src/com/coding/basic/ArrayList.java b/group12/563253496/datastructure/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..1f185736f9 --- /dev/null +++ b/group12/563253496/datastructure/src/com/coding/basic/ArrayList.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group12/563253496/datastructure/src/com/coding/basic/BinaryTreeNode.java b/group12/563253496/datastructure/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group12/563253496/datastructure/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group12/563253496/datastructure/src/com/coding/basic/Iterator.java b/group12/563253496/datastructure/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group12/563253496/datastructure/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group12/563253496/datastructure/src/com/coding/basic/LinkedList.java b/group12/563253496/datastructure/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..e2c4e5e795 --- /dev/null +++ b/group12/563253496/datastructure/src/com/coding/basic/LinkedList.java @@ -0,0 +1,46 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group12/563253496/datastructure/src/com/coding/basic/List.java b/group12/563253496/datastructure/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group12/563253496/datastructure/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group12/563253496/datastructure/src/com/coding/basic/Queue.java b/group12/563253496/datastructure/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group12/563253496/datastructure/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group12/563253496/datastructure/src/com/coding/basic/Stack.java b/group12/563253496/datastructure/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group12/563253496/datastructure/src/com/coding/basic/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group12/group12.md b/group12/group12.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group12/group12.md @@ -0,0 +1 @@ + diff --git a/group13/1274639949/lesson01/src/com/hans/ArrayList.java b/group13/1274639949/lesson01/src/com/hans/ArrayList.java new file mode 100644 index 0000000000..3eeede5ce3 --- /dev/null +++ b/group13/1274639949/lesson01/src/com/hans/ArrayList.java @@ -0,0 +1,128 @@ +package com.hans; + +import java.util.Arrays; + +import javax.management.RuntimeErrorException; + +public class ArrayList implements List { + + private int size = 0;//ArrayListѾ洢ԪظҲһԪص±ꡣ + + private Object[] elementData = null; + + public ArrayList() { + elementData = new Object[3]; + } + + public ArrayList(int capacity){ + elementData = new Object[capacity]; + } + +// private static final final default + + /** + * oӵArrayListһԪصĺ + * @param o ӵԪ + */ + public void add(Object o){ + checkSize(); +// add(size++, o); + elementData[size++] = o; + } + + /** + * oӵָindexλ + * indexӦ index >= 0 && index <= size() Ϊ true + * @param index ӵλ + * @param o ӵԪ + */ + public void add(int index, Object o){ + if(index > size || index < 0){ + //sizeԪص±꣬indexsizeҲԡ + throw new ArrayIndexOutOfBoundsException("Index:" + index); + } + checkSize(); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + /** + * ȡindexλôԪ + * indexӦ index >= 0 && index < size() Ϊ true + */ + public Object get(int index){ + checkIndex(index); + return elementData[index]; + } + + /** + * ɾindexλôԪ + * indexӦ index >= 0 && index < size() Ϊ true + * @return ɾԪ + */ + public Object remove(int index){ + checkIndex(index); + Object obj = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return obj; + } + + /** + * ȡǰArrayListѾ洢Ԫصĸ + */ + public int size(){ + return this.size; + } + + /** + * ȡǰArrayListĵ + * @return ǰArrayListĵ + */ + public Iterator iterator(){ + return new Iterator(){ + private int count = 0; + + @Override + public boolean hasNext() { + return size > count; + } + + @Override + public Object next() { + if(count == size){ + throw new RuntimeErrorException(null, "ûиԪأ"); + } + return get(count++); + } + + @Override + public void remove() { + ArrayList.this.remove(count - 1); + } + + }; + } + + /** + * getremove±ǷԽ + * @param index ± + */ + private void checkIndex(int index){ + if(index >= size || index < 0){ + //sizeԪص±꣬index±ϻûд洢ݣ޷getremove + throw new ArrayIndexOutOfBoundsException("Index:" + index); + } + } + + /** + * ArrayListǷҪ + * ArrayListҪʱݣÿݽʹ20 + */ + private void checkSize(){ + if(size < elementData.length) return; + elementData = Arrays.copyOf(elementData, elementData.length + 20/*(int)(elementData.length * 1.2)*/); + } + +} diff --git a/group13/1274639949/lesson01/src/com/hans/BinaryTree.java b/group13/1274639949/lesson01/src/com/hans/BinaryTree.java new file mode 100644 index 0000000000..a4bf39dd3a --- /dev/null +++ b/group13/1274639949/lesson01/src/com/hans/BinaryTree.java @@ -0,0 +1,10 @@ +package com.hans; + +public class BinaryTree { + BinaryTreeNode root = new BinaryTreeNode(); + + public boolean add(Object obj){ + + return true; + } +} diff --git a/group13/1274639949/lesson01/src/com/hans/BinaryTreeNode.java b/group13/1274639949/lesson01/src/com/hans/BinaryTreeNode.java new file mode 100644 index 0000000000..683868be1d --- /dev/null +++ b/group13/1274639949/lesson01/src/com/hans/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.hans; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group13/1274639949/lesson01/src/com/hans/Iterator.java b/group13/1274639949/lesson01/src/com/hans/Iterator.java new file mode 100644 index 0000000000..4ec870ed01 --- /dev/null +++ b/group13/1274639949/lesson01/src/com/hans/Iterator.java @@ -0,0 +1,8 @@ +package com.hans; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + public void remove(); +} + diff --git a/group13/1274639949/lesson01/src/com/hans/LinkedList.java b/group13/1274639949/lesson01/src/com/hans/LinkedList.java new file mode 100644 index 0000000000..8e2d421501 --- /dev/null +++ b/group13/1274639949/lesson01/src/com/hans/LinkedList.java @@ -0,0 +1,148 @@ +package com.hans; + +public class LinkedList implements List { + + private int size; + + private Node head; + + public LinkedList() { + head = new Node(); +// head.data = head; + } + + /** + * һԪ + */ + public void add(Object o){ + Node tail = getTail(); + + Node node = new Node(); + node.data = o; + + tail.next = node; + size++; + return; + } + + /** + * ָλüһԪ + * @param index ָλãӦ index > 0 && index <= size() Ϊ true + */ + public void add(int index , Object o){ + if(index < 0 || index > size) + throw new IndexOutOfBoundsException("Index:" + index); + + Node pos = head; + for(int i = 0; i < index; i++){ + //ҪindexλһԪأֻҪȡ index - 1 λõԪؼ + pos = pos.next; + } + Node node = new Node(); + node.data = o; + node.next = pos.next; + pos.next = node; + size++; + return; + } + + /** + * ȡָλôԪ + * @param index ҪȡԪصλãӦ index > 0 && index < size() Ϊ true + */ + public Object get(int index){ + checkIndex(index); + Node pos = head; + for(int i = 0; i <= index; i++){ + //Ϊ <= ,ΪҪȡindexλ + pos = pos.next; + } + return pos.data; + } + + /** + * ƳָλôԪ + * @param index ҪƳԪصλãӦ index > 0 && index < size() Ϊ true + */ + public Object remove(int index){ + checkIndex(index); + Node pos = head; + for(int i = 0; i < index; i++){ + pos = pos.next; + } + Node temp = pos.next; + pos.next = temp.next; + size--; + return temp.data; + } + + /** + * ȡ洢Ԫصĸ + */ + public int size(){ + return this.size; + } + + /** + * ڵһԪصǰһԪ + * @param o + */ + public void addFirst(Object o){ + add(0, o); + } + + /** + * һԪصĺһԪ + * @param o + */ + public void addLast(Object o){ + add(o); + } + + /** + * ƳһԪ + * @return ƳԪ + */ + public Object removeFirst(){ + return remove(0); + } + + /** + * ƳһԪ + * @return ƳԪ + */ + public Object removeLast(){ + return remove(size - 1); + } + + public Iterator iterator(){ + return null; + } + + + private static final class Node{ + Object data; + Node next; + } + + /** + * ȡһڵ + * @return + */ + private Node getTail(){ + Node tail = head; + while(tail.next != null){ + tail = tail.next; + } + return tail; + } + /** + * getremoveԪǷЧ + * @param index + */ + private void checkIndex(int index) { + if(index < 0 || index >= size) + throw new IndexOutOfBoundsException("Index:" + index); + } +} + diff --git a/group13/1274639949/lesson01/src/com/hans/List.java b/group13/1274639949/lesson01/src/com/hans/List.java new file mode 100644 index 0000000000..f8ffaa8f5e --- /dev/null +++ b/group13/1274639949/lesson01/src/com/hans/List.java @@ -0,0 +1,10 @@ +package com.hans; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + public Iterator iterator(); +} diff --git a/group13/1274639949/lesson01/src/com/hans/Queue.java b/group13/1274639949/lesson01/src/com/hans/Queue.java new file mode 100644 index 0000000000..2c696cca10 --- /dev/null +++ b/group13/1274639949/lesson01/src/com/hans/Queue.java @@ -0,0 +1,22 @@ +package com.hans; + +public class Queue { + + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group13/1274639949/lesson01/src/com/hans/Stack.java b/group13/1274639949/lesson01/src/com/hans/Stack.java new file mode 100644 index 0000000000..d370221f1a --- /dev/null +++ b/group13/1274639949/lesson01/src/com/hans/Stack.java @@ -0,0 +1,30 @@ +package com.hans; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if(elementData.size() <= 0){ + return null; + } + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + if(elementData.size() <= 0){ + return null; + } + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} + diff --git "a/group13/1274639949/\346\214\207\344\273\244\346\274\253\346\270\270\350\256\260.md" "b/group13/1274639949/\346\214\207\344\273\244\346\274\253\346\270\270\350\256\260.md" new file mode 100644 index 0000000000..a89412cc01 --- /dev/null +++ "b/group13/1274639949/\346\214\207\344\273\244\346\274\253\346\270\270\350\256\260.md" @@ -0,0 +1 @@ +如今计算机已经深入走进我们生活的方方面面,购物、娱乐、餐饮······,可以说我们无时无刻不在利用计算机给我们的 diff --git a/group13/1641296572/lesson1/.gitignore b/group13/1641296572/lesson1/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group13/1641296572/lesson1/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group13/1641296572/lesson1/src/com/coding/basic/ArrayList.java b/group13/1641296572/lesson1/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..c9d4661987 --- /dev/null +++ b/group13/1641296572/lesson1/src/com/coding/basic/ArrayList.java @@ -0,0 +1,107 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class ArrayList implements List +{ + + private int size = 0; + + private Object[] elementData = new Object[3]; + + public void add(Object o) + { + if (elementData.length == size) + { + expand(); + } + elementData[size++] = o; + } + + private void expand() + { + Object[] newDatas = new Object[size * 3 / 2 + 1]; + System.arraycopy(elementData, 0, newDatas, 0, size); + elementData = newDatas; + System.out.println("expand: from :" + size + " to " + size * 2); + + } + + public void add(int index, Object o) + { + if (index > size || index < 0) + { + throw new IndexOutOfBoundsException("index=" + index + " , size=" + size); + } + if (elementData.length == size) + { + expand(); + } + + Object[] tmps = new Object[size - index]; + System.arraycopy(elementData, index, tmps, 0, size - index); + elementData[index] = o; + System.arraycopy(tmps, 0, elementData, index + 1, size - index); + + size++; + } + + public Object get(int index) + { + if (index >= size || index < 0) + { + throw new IndexOutOfBoundsException("index=" + index + " , size=" + size); + } + + return elementData[index]; + } + + public Object remove(int index) + { + if (index >= size || index < 0) + { + throw new IndexOutOfBoundsException("index=" + index + " , size=" + size); + } + Object rt = elementData[index]; + + Object[] tmps = new Object[size - index - 1]; + System.arraycopy(elementData, index + 1, tmps, 0, size - index - 1); + System.arraycopy(tmps, 0, elementData, index, size - index - 1); + elementData[--size] = null; + + return rt; + } + + public int size() + { + return size; + } + + public Iterator iterator() + { + return new Iterator(){ + int pos =0; + @Override + public boolean hasNext() + { + if(pos < size) + { + return true; + } + return false; + } + + @Override + public Object next() + { + if(pos < size) + { + throw new NoSuchElementException(); + } + return elementData[pos++]; + }}; + } + +} + + diff --git a/group13/1641296572/lesson1/src/com/coding/basic/BinarySortTree.java b/group13/1641296572/lesson1/src/com/coding/basic/BinarySortTree.java new file mode 100644 index 0000000000..1aa36825c4 --- /dev/null +++ b/group13/1641296572/lesson1/src/com/coding/basic/BinarySortTree.java @@ -0,0 +1,66 @@ +package com.coding.basic; + +public class BinarySortTree +{ + BinaryTreeNode root = null; + int size =0; + + public void insert(Object o) + { + BinaryTreeNode node = new BinaryTreeNode(); + node.setData(o); + node.setLeft(null); + node.setRight(null); + + if(null == root) + { + root = node; + size++; + } + + BinaryTreeNode p = root; + BinaryTreeNode pre = p; + while(p!= null) + { + if(objectCompare(o, p.getData())<0) + { + pre = p; + p=p.getLeft(); + } + else + { + pre = p; + p=p.getRight(); + } + } + + if(objectCompare(o, pre.getData())<0) + { + pre.setLeft(node); + } + else + { + pre.setRight(node); + } + + size++; + } + + private int objectCompare(Object o1, Object o2) + { +// return o.toString().compareTo(o2.toString()); + return (Integer) o1 - (Integer)o2; + } + + public void print(BinaryTreeNode r) + { + if(r==null) + { + return; + } + System.out.print(r.getData() + "->"); + print(r.getLeft()); + print(r.getRight()); + } + +} diff --git a/group13/1641296572/lesson1/src/com/coding/basic/BinaryTreeNode.java b/group13/1641296572/lesson1/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d0ba079f40 --- /dev/null +++ b/group13/1641296572/lesson1/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,41 @@ +package com.coding.basic; + +public class BinaryTreeNode +{ + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() + { + return data; + } + + public void setData(Object data) + { + this.data = data; + } + + public BinaryTreeNode getLeft() + { + return left; + } + + public void setLeft(BinaryTreeNode left) + { + this.left = left; + } + + public BinaryTreeNode getRight() + { + return right; + } + + public void setRight(BinaryTreeNode right) + { + this.right = right; + } + + +} \ No newline at end of file diff --git a/group13/1641296572/lesson1/src/com/coding/basic/Iterator.java b/group13/1641296572/lesson1/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..4175d7d2dd --- /dev/null +++ b/group13/1641296572/lesson1/src/com/coding/basic/Iterator.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface Iterator +{ + public boolean hasNext(); + + public Object next(); + +} \ No newline at end of file diff --git a/group13/1641296572/lesson1/src/com/coding/basic/LinkedList.java b/group13/1641296572/lesson1/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..9bd71ed325 --- /dev/null +++ b/group13/1641296572/lesson1/src/com/coding/basic/LinkedList.java @@ -0,0 +1,220 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List +{ + + private Node head; + private int size = 0; + + public void add(Object o) + { + if (0 == size) + { + head = new Node(); + head.data = o; + head.next = null; + } else + { + Node pNode = head; + while (pNode.next != null) + { + pNode = pNode.next; + } + Node node = new Node(); + node.data = o; + pNode.next = node; + node.next = null; + } + size++; + } + + public void add(int index, Object o) + { + if (index < 0 || index > size) + { + throw new IndexOutOfBoundsException(); + } + Node node = new Node(); + node.data = o; + + if (index != 0) + { + Node nowNode = head; + Node preNode = head; + for (int i = 0; i < index; i++) + { + preNode = nowNode; + nowNode = nowNode.next; + } + preNode.next = node; + node.next = nowNode; + } else + { + node.next = head; + head = node; + + } + size++; + } + + public Object get(int index) + { + if (index < 0 || index >= size) + { + throw new IndexOutOfBoundsException(); + } + Node node = head; + for (int i = 0; i < index; i++) + { + node = node.next; + } + return node.data; + } + + public Object remove(int index) + { + if (index < 0 || index >= size) + { + throw new IndexOutOfBoundsException(); + } + Object rt = null; + if (index == 0) + { + rt = head.data; + Node node = head; + head = head.next; + node.next = null; + node.data = null; + } else + { + Node preNode = head; + Node nowNode = head; + for (int i = 0; i < index; i++) + { + preNode = nowNode; + nowNode = nowNode.next; + } + rt = nowNode.data; + preNode.next = nowNode.next; + nowNode.next = null; + nowNode.data = null; + } + size--; + return rt; + } + + public int size() + { + return size; + } + + public void addFirst(Object o) + { + Node node = new Node(); + node.data = o; + node.next = head; + head = node; + + size++; + } + + public void addLast(Object o) + { + Node node = new Node(); + node.data = o; + node.next = null; + + Node nowNode = head; + + if (size == 0) + { + head = node; + size++; + return; + } + + while (nowNode != null && nowNode.next != null) + { + nowNode = nowNode.next; + } + + nowNode.next = node; + size++; + } + + public Object removeFirst() + { + if (size == 0) + { + throw new NoSuchElementException(); + } + Node node = head; + head = head.next; + Object rt = node.data; + node.next = null; + node.data = null; + size--; + return rt; + } + + public Object removeLast() + { + if (size == 0) + { + throw new NoSuchElementException(); + } + + Node nowNode = head; + Node preNode = head; + while (nowNode.next != null) + { + preNode = nowNode; + nowNode = nowNode.next; + } + + preNode.next = null; + Object rt = nowNode.data; + nowNode.data = null; + size--; + return rt; + } + + public Iterator iterator() + { + return new Iterator() + { + Node node = head; + + @Override + public boolean hasNext() + { + if (null != node) + { + return true; + } + return false; + } + + @Override + public Object next() + { + if (null == node) + { + throw new NoSuchElementException(); + } + Object o = node.data; + node = node.next; + return o; + } + }; + } + + private static class Node + { + Object data; + Node next; + + } +} \ No newline at end of file diff --git a/group13/1641296572/lesson1/src/com/coding/basic/List.java b/group13/1641296572/lesson1/src/com/coding/basic/List.java new file mode 100644 index 0000000000..cf5d612814 --- /dev/null +++ b/group13/1641296572/lesson1/src/com/coding/basic/List.java @@ -0,0 +1,14 @@ +package com.coding.basic; + +public interface List +{ + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} \ No newline at end of file diff --git a/group13/1641296572/lesson1/src/com/coding/basic/Queue.java b/group13/1641296572/lesson1/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..695c953324 --- /dev/null +++ b/group13/1641296572/lesson1/src/com/coding/basic/Queue.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Queue +{ + private LinkedList list = new LinkedList(); + + public void enQueue(Object o) + { + list.add(o); + } + + public Object deQueue() + { + Object rt = list.removeFirst(); + return rt; + } + + public boolean isEmpty() + { + return 0==list.size(); + } + + public int size() + { + return list.size(); + } + +} \ No newline at end of file diff --git a/group13/1641296572/lesson1/src/com/coding/basic/Stack.java b/group13/1641296572/lesson1/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..424263f0b7 --- /dev/null +++ b/group13/1641296572/lesson1/src/com/coding/basic/Stack.java @@ -0,0 +1,66 @@ +package com.coding.basic; + +import java.util.EmptyStackException; + +public class Stack +{ + private ArrayList elementData = new ArrayList(); + + public void push(Object o) + { + elementData.add(elementData.size(), o); + } + + public Object pop() + { + int size = elementData.size(); + if(size==0) + { + throw new EmptyStackException(); + } + + Object rt = elementData.get(size-1); + elementData.remove(size-1); + return rt; + } + + public Object peek() + { + if(elementData.size()==0) + { + throw new EmptyStackException(); + } + + return elementData.get(elementData.size()-1); + } + + public boolean isEmpty() + { + return 0==elementData.size(); + } + + public int size() + { + return elementData.size(); + } + + public static void main(String []args) + { + Stack st = new Stack(); + System.out.println("is Empty:"+ st.isEmpty()); + for(int i=0;i<10;i++) + { + st.push("s="+ i); + } + + System.out.println("is Empty:"+ st.isEmpty()); + System.out.println(st.peek()); + for(int i=0;i<10;i++) + { + System.out.println("pop->" + st.pop()); + } + System.out.println("is Empty:"+ st.isEmpty()); + } + + +} \ No newline at end of file diff --git a/group13/2729382520/L1/src/io/github/vxzh/ArrayList.java b/group13/2729382520/L1/src/io/github/vxzh/ArrayList.java new file mode 100644 index 0000000000..39feef2cbd --- /dev/null +++ b/group13/2729382520/L1/src/io/github/vxzh/ArrayList.java @@ -0,0 +1,135 @@ +package io.github.vxzh; + +/** + * Created by vxzh on 22/02/2017. + */ +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData; + + public ArrayList() { + this.elementData = new Object[10]; + } + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public boolean add(Object o) { + int minCapacity = size + 1; + if (minCapacity - elementData.length > 0) + grow(minCapacity); + elementData[size++] = o; + return true; + } + + public boolean add(int index, Object o) { + if (index >= size || index < 0) + throw new RuntimeException("IndexOutOfBoundsException"); + int minCapacity = size + 1; + if (minCapacity - elementData.length > 0) + grow(minCapacity); + elementData[index] = o; + size++; + return true; + } + + public boolean remove(Object o) { + if (o == null) { + for (int index = 0; index < size; index++) + if (elementData[index] == null) { + int moved = size - index - 1; + if (moved > 0) + copy(elementData, index + 1, elementData, index, moved); + elementData[--size] = null; + return true; + } + } else { + for (int index = 0; index < size; index++) + if (o.equals(elementData[index])) { + int moved = size - index - 1; + if (moved > 0) + copy(elementData, index + 1, elementData, index, moved); + elementData[--size] = null; + return true; + } + } + return false; + } + + public boolean remove(int index) { + if (index >= size || index < 0) + throw new RuntimeException("IndexOutOfBoundsException"); + int moved = size - index - 1; + if (moved > 0) + copy(elementData, index + 1, elementData, index, moved); + elementData[--size] = null; + return true; + } + + public Object get(int index) { + if (index >= size || index < 0) + throw new RuntimeException("IndexOutOfBoundsException"); + return elementData[index]; + } + + private void grow(int minCapacity) { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + (oldCapacity >> 1); + if (newCapacity - minCapacity < 0) + newCapacity = minCapacity; + elementData = copy(elementData, newCapacity); + + } + + public Object[] copy(Object[] src, int newCapacity) { + Object[] arr = new Object[newCapacity]; + for (int i = 0; i < src.length; i++) { + arr[i] = elementData[i]; + } + return arr; + } + + public void copy(Object[] src, int srcPost, Object[] dest, int destPost, int length) { + for (int i = 0; i < length; i++) { + dest[destPost + i] = src[srcPost + i]; + } + } + + public Iterator iterator() { + return new ListIterator(this); + } + + public class ListIterator implements Iterator { + + private List list; + private int endIndex = 0; + private int index = 0; + + public ListIterator(ArrayList list) { + this.list = list; + this.endIndex = list.size(); + } + + @Override + public boolean hasNext() { + return this.index < this.endIndex; + } + + @Override + public Object next() { + if (!this.hasNext()) { + throw new RuntimeException("EmptyElementException"); + } else { + return list.get(index++); + } + } + } +} + diff --git a/group13/2729382520/L1/src/io/github/vxzh/BinaryTree.java b/group13/2729382520/L1/src/io/github/vxzh/BinaryTree.java new file mode 100644 index 0000000000..9b6a9d7031 --- /dev/null +++ b/group13/2729382520/L1/src/io/github/vxzh/BinaryTree.java @@ -0,0 +1,68 @@ +package io.github.vxzh; + +/** + * Created by vxzh on 26/02/2017. + */ +public class BinaryTree { + + private TreeNode root; + + public boolean isEmpty() { + return root == null; + } + + //节点个数 + public int size() { + return size(root); + } + + private int size(TreeNode subTree) { + if (subTree == null) { + return 0; + } else { + return 1 + size(subTree.leftChild) + + size(subTree.rightChild); + } + } + + public void insert(int o) { + TreeNode newNode = new TreeNode(o, null, null); + if (root == null) + root = newNode; + else { + TreeNode current = root; + while (true) { + if (o < current.data) { + current = current.leftChild; + if (current == null) { + current.leftChild = newNode; + return; + } + } else { + current = current.rightChild; + if (current == null) { + current.rightChild = newNode; + return; + } + } + } + + } + + } + + private class TreeNode { + private int data; + private TreeNode leftChild; + private TreeNode rightChild; + + public TreeNode() { + } + + public TreeNode(int o, TreeNode l, TreeNode r) { + this.data = o; + this.leftChild = l; + this.rightChild = r; + } + } +} diff --git a/group13/2729382520/L1/src/io/github/vxzh/Iterator.java b/group13/2729382520/L1/src/io/github/vxzh/Iterator.java new file mode 100644 index 0000000000..9db09eb9d4 --- /dev/null +++ b/group13/2729382520/L1/src/io/github/vxzh/Iterator.java @@ -0,0 +1,9 @@ +package io.github.vxzh; + +public interface Iterator { + + boolean hasNext(); + + Object next(); + +} \ No newline at end of file diff --git a/group13/2729382520/L1/src/io/github/vxzh/LinkQueue.java b/group13/2729382520/L1/src/io/github/vxzh/LinkQueue.java new file mode 100644 index 0000000000..9f065c1879 --- /dev/null +++ b/group13/2729382520/L1/src/io/github/vxzh/LinkQueue.java @@ -0,0 +1,57 @@ +package io.github.vxzh; + +/** + * Created by vxzh on 24/02/2017. + */ +public class LinkQueue implements Queue { + + private int size = 0; + + private Node front; + private Node rear; + + /** + * 入队 + */ + public void enQueue(Object o) { + Node node = rear; + Node newNode = new Node(o, null); + rear = newNode; + if (node == null) + front = newNode; + else + node.next = newNode; + size++; + } + + /** + * 出队 + */ + public Object deQueue() { + if (isEmpty()) + throw new RuntimeException("EmptyQueueException"); + Node node = front; + front = node.next; + size--; + return node.data; + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + private static class Node { + Object data; + Node next; + + Node(Object element, Node next) { + this.data = element; + this.next = next; + } + + } +} diff --git a/group13/2729382520/L1/src/io/github/vxzh/LinkedList.java b/group13/2729382520/L1/src/io/github/vxzh/LinkedList.java new file mode 100644 index 0000000000..e599bf15e7 --- /dev/null +++ b/group13/2729382520/L1/src/io/github/vxzh/LinkedList.java @@ -0,0 +1,138 @@ +package io.github.vxzh; + +/** + * Created by vxzh on 23/02/2017. + */ +public class LinkedList implements List { + + private int size = 0; + + private Node head; + private Node tail; + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + private void linkLast(Object o) { + Node node = tail; + Node newNode = new Node(tail, o, null); + tail = newNode; + if (node == null) + head = newNode; + else + node.next = newNode; + size++; + } + + private void linkBefore(Object o, Node node) { + Node prev = node.prev; + Node newNode = new Node(prev, o, node); + node.prev = newNode; + if (prev == null) + head = newNode; + else + prev.next = newNode; + size++; + } + + public boolean add(Object o) { + linkLast(o); + return true; + } + + public boolean add(int index, Object o) { + if (index > size || index < 0) + throw new RuntimeException("IndexOutOfBoundsException"); + if (index == size) + linkLast(o); + else + linkBefore(o, node(index)); + return true; + } + + public boolean remove(Object o) { + if (o == null) { + return false; + } else { + for (Node x = head; x != null; x = x.next) { + if (o.equals(x.data)) { + unlink(x); + return true; + } + } + } + return false; + } + + public boolean remove(int index) { + if (index >= size || index < 0) + throw new RuntimeException("IndexOutOfBoundsException"); + unlink(node(index)); + return true; + } + + public Object get(int index) { + if (index >= size || index < 0) + throw new RuntimeException("IndexOutOfBoundsException"); + return node(index).data; + } + + private void unlink(Node x) { + Node prev = x.prev; + Node next = x.next; + + if (prev == null) { + head = next; + } else { + prev.next = next; + x.prev = null; + } + + if (next == null) { + tail = prev; + } else { + next.prev = prev; + x.next = null; + } + + x.data = null; + size--; + } + + private Node node(int index) { + if (index < (size >> 1)) { + Node x = head; + for (int i = 0; i < index; i++) + x = x.next; + return x; + } else { + Node x = tail; + for (int i = size - 1; i > index; i--) + x = x.prev; + return x; + } + } + + + private static class Node { + Object data; + Node prev; + Node next; + + Node(Node prev, Object element, Node next) { + this.data = element; + this.next = next; + this.prev = prev; + } + + } + +} + + + diff --git a/group13/2729382520/L1/src/io/github/vxzh/List.java b/group13/2729382520/L1/src/io/github/vxzh/List.java new file mode 100644 index 0000000000..6e52bd58f6 --- /dev/null +++ b/group13/2729382520/L1/src/io/github/vxzh/List.java @@ -0,0 +1,22 @@ +package io.github.vxzh; + +/** + * Created by vxzh on 22/02/2017. + */ +public interface List { + + int size(); + + boolean isEmpty(); + + boolean add(Object o); + + boolean add(int index, Object o); + + boolean remove(Object o); + + boolean remove(int index); + + Object get(int index); + +} diff --git a/group13/2729382520/L1/src/io/github/vxzh/Queue.java b/group13/2729382520/L1/src/io/github/vxzh/Queue.java new file mode 100644 index 0000000000..258229c17b --- /dev/null +++ b/group13/2729382520/L1/src/io/github/vxzh/Queue.java @@ -0,0 +1,15 @@ +package io.github.vxzh; + +/** + * Created by xuxiaoqing on 26/02/2017. + */ +public interface Queue { + + void enQueue(Object o); + + Object deQueue(); + + boolean isEmpty(); + + int size(); +} diff --git a/group13/2729382520/L1/src/io/github/vxzh/Stack.java b/group13/2729382520/L1/src/io/github/vxzh/Stack.java new file mode 100644 index 0000000000..de7c8ede4d --- /dev/null +++ b/group13/2729382520/L1/src/io/github/vxzh/Stack.java @@ -0,0 +1,41 @@ +package io.github.vxzh; + +/** + * Created by vxzh on 24/02/2017. + */ +public class Stack { + + private ArrayList elementData; + + public Stack() { + this.elementData = new ArrayList(); + } + + public int size() { + return elementData.size(); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + Object obj; + int len = elementData.size(); + obj = peek(); + elementData.remove(len - 1); + return obj; + } + + public Object peek() { + int len = elementData.size(); + if (len == 0) + throw new RuntimeException("EmptyStackException"); + return elementData.get(len - 1); + } + +} diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties b/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties new file mode 100644 index 0000000000..e23811b654 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties @@ -0,0 +1 @@ +#Sun Feb 19 10:59:39 CST 2017 diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties.lock b/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties.lock new file mode 100644 index 0000000000000000000000000000000000000000..c5daff8bbec344017cdb453956635f3aa0038d0a GIT binary patch literal 17 UcmZSHXF7Gt@}tQS3=kj)05&@WSO5S3 literal 0 HcmV?d00001 diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/fileHashes.bin b/group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..6512ad40b8a3b6d8c16d01b544d025381b05eddd GIT binary patch literal 18697 zcmeI%y-UMD9LDjp2udR+gN4#g;#3eRxag)(K@iNMhz{C+z@hk3UqOo?Qfvij3yz|T z3hLyd(4|NbJBZM&P6|a`oWvLOLUNSQ(M`Swm;3RAhj5=Y5h47>kF!K=`D!B*0tg_0 z00IagfB*srAb%kfI|Dc%d`(7W`cAUJd@~_jan`n<=I(fg!BfI9n$AvHGj+0VpeL5PNl5p!|D{zCJ;JiFYD!e#YjsCTTRa-7_s zeptD3H%j^X#$!-VuRZ5(x2xW>ySJk5ZiuJ)MqGOhRhlxXa$csuAOhHue;6Z|6C-BP5LV%uo*QvR#>}}zqvVuDLW>_;o1I*HR9&szX-?l0IWu1<4a-;z+oo&9 zlOmB$#{0BXD&8;hx}*1$9ox-0u5Hi^JwIxAy;pRHg|=c9uGXqEyD#6EybyWV?fk7= znq$=AIduEX>)DwzexgTemF3Zgt<&y6wHH+l0`uwYfSs+kBEupF7l;u0AM! z8h=SNY@eh#NEMUC*`JQkShh)EPQfUXP^Vvkt1J7XwTbnq`CHBK(|12#MJ3c>xn<;b uS&+rqLR+Cca%l4kT=gQ~k2H4HZ-1za-Pf*vQ{`6qBHN5maakc5De8XB;X!RTO*BO_gAOvjJM50G`@YP~>t;c8 z2#U1SOTQ617)4gpvBX1vK!=K;=$sV=(jkvEZ|}ai9waYP#P@}F-(h|}^OY^X+-`WTp9*IUtR^ppKr$=<&b3 z31-=XDwYa`pItt)keDmK(emcS*ZixRL!t2f_PW<6cUI0sZnE#gAGV#>0hhfEnHhVK znGPSIR>n0Gw&f18oRVgBG`4?k=IY$Nk&k2JpC4Q|Ejz_?X|LK$3)^*KakKhBJhnGl zTN|q}Q&iE2RKm5CE12%#MVg;q)#=T`_6w^;0u7D*epMIF8~ThFR&|Nx_O_TfUc#*% zPjQXT`&`BCT(`(heXPoBFL~(~k zDw#LuSwSKz$-t@(sxsc7;C^l*xxOG5Bw^tV+JoVORDT+->-uoJ|&Z$)t?irl=x#UcGE-qOY+M@Ol!GJJ^r9iU+K YT<9oj6^EqdxIS;Sr=kD4u zwv_r3e}y}MJAgZYJAgZYJAgZYJAgZYJAgZYJAgZYJAgZYJAgZYJAgZYJAgZYJMe$S z0UM+cE>MiHEEDMkZv=s$z>T~}JLGeTSLX7lAo#Pj3;h1zP+G>;lu8j1z;^{eet4~j zr;cH%7T`|bAx|vbC+^tkbpUYvKFE(;y_u*x=X@A&6B`PDxTPXEyCocO+jz*65B?#0 z=ARNpz&)8EPYHh4G4A@L8gRoO6#iXtFfC8C6OBI!`O)Xo`YoqoH32tW3Hgb-j4Q7H zH1`4SomyEo!H}gO}70d z;HEDiFHXqWT;C-53~-kk$SCJhqR}E$|9E3D zh&SI3<4flHURgO8-v!+LGUR1Ua*i1~dkp}$SVZA||Jt2wuSNa0mZ9+0Hq|5b!l5AE z)&la%*G$t|LQ_`&H+u^CjhhpdcfTz;3b<(nZ--jMbxnx@?&1J>BXa{sznon^;I20z zZwha6D9QM)gmNp$o7p79Iak{X1HMax!ar`$O#Ql{3~<{@$Xlf(mY)f~y&H|^g#7Nd z7&BRgxD|j~vQqdT-Kqa3H2i^bh=1J^zsGtZcc>X~i?i?#T?)4@-f((UigGQ;d#=53 zjqnIkL-(^A@`tM?+|1mfE(5L~3i&^5oBhk2y3znQ=%H}`3l&v!7mWdT-U#{Q)5Hrg z38LQtH=2gL_f5z^Wn$Gd;0{|MANb~zG?bIy2)H9V~#^8?$QU%`E|UZi4*Xc*c(4ON#FRw;O|elDCwzG9vXg;ARFCE-7#{s>^#5 z;6@%4F4La4WtRXy;JYY3e~x$~(|j`IZ@~4>!T8VdH*8O5+=&L<;W35RN}Hvw$d?A( zb~WT*vhG}P`^)url)r-fE6WUjzy?hYz%5lMyz01?<}?06z)fyJ{!?kV|I9r{^t^EF zhMXmi_0OC*(+wcre1O6;-yhA;eOLgv=RL?-=VINGR~0@2+ViS0XKGn zoMUF`uZTtV-_ZDrkaH$KS5lwQC=`Xh?^Y)uU&7R0eoE`J3W#?zq3~T2(SCm>q4!P4e8>f(?yEiem{JbnjgLXT z)NoIF>An1WfLke2c&XxxeaiOeclXu}kc&9SI^Am6;eqB|4!Ky5QiN~g;03@P)gWIZ zxT^X@c_AknA4}nO2VzR{mZA3@1Il$~ZHk=FE8Zh9Al~FHjF)`d6TdQuc?57fBgm!n z*{mKPOOr+S{|xdC6TKqZmabO;caefzMru&7E2S5`{_HA%T+Z=#Ll+Z`MIhcG7;^c0 zrdPGX2WQZ{2Ow8y3FvoC&_?gGHp!4HvepPFk1(@?c+2~cD=qKu-BYic4!B1jg+Ki# zLFb_31HhfyA>Sl4yQ*JP>MP)`YarjeFYkZ=(+ys9|ED2Wapx75QB5-k+&qlJOIMb; z*!4C5?!gPW+6n8QGTe8005^-F@bdNJQxQe-fLpaeuH|r>i>oYsC*Te|kZ0H0gXny~(I0Zh-!3N=`Wl@D@$OF`cikntNWWHa7I4oW zkh^o%v8eh>q1RzkGsrz2S4af!yPpB#?MflvMLfLnWPjLpz&$AQ1g{e^)q@6}UVu9( z!+0NCS>47~y%IF4R=WEnwg8&#GDty+rPi9Rh*pJOR z$oH`+E8H(HK+j(*PsqcBxt884GhGYf&G{jZjGOhpdek!laKn3$N2RS33E?n|1l)K% zg8FRe3pxCkK;Vf28vGe|0Cxa)0Cxa)0Cxa)0Cxa) z0Cxa)0Cxa)0Cxa)0Cxa)0Cxa)0Cxa)0Cxa)0Cxa)0Cxa)0Cxa)0Cxa)0Cxa);Qy}! z%E<24Babzt2j8EPTY5YnZ|;0>>}Ipa-$}^IPNJipNS`n{C&wew%3?WMMgNngy@7Q` zr^IWwaB+LZoF*%zd#A_>rb=$Cg3D(-$9U3sC}vJUDfZ1hWK|B)(faG_da{DBJOrz- zY&c%W?-%~8cH|&2ggd^6qzLupuL26DLs&)jtj0^8u@9BM37ZUkC!9ydk0=Bt(Up=+ zq?Lknbv*dxy+?apw?ofP@lu@||5}h0v5W0N4pu#^LMkw3NJW)fyQy$V%nV02vRaqu z81jiL7btj1tBvS#EdS8hJzTc`Q&{Ap;gq8*C&-GDv_hcZMCzhf$gWKgnB3Iu$FreM z+{b6fc9Oz@d5<4Z5J)SR=yH6M@R_QbEg5l>{BFo^(~(S4xLW9p0tN9nR#778DZx_f zxN6bfy!#>A7O8YO2C<5<{^zMxBerTMQ}y)3^pc!N3j1GmAO%5(wEmfHREcfAS!dgQ z)8%%jw5>noZa`94cQ4(GN}REZs;`qgE*ZqW)@0_njpD_~T5FQx;wY*>a?5IXXJD?i|V<5b4S9o9*CE$tNj7<6fidLW!i`Nzm0H zU*j+0zSZIvXZ}aYl(`Sc%5542atzQbqE@k{YbQs3=nAW3kqwDM_NhfR-Xd0eslh)cz$6OB5vpWSf!V>2B@wloE*{qjaI>; zgjFyT3|9THuG!f0@X(a8)LP`1QS);UhOvtJkmzuAmJ;qGO?$4$rwP{6DF(2L;1n~( zs;L9!-Cz1zOH|TN(JGiWVil4Tl0PK=9IvidkB(ldng^~|lp~RqfxDttJ{M(fbL1!v z3~F_c-KtKTgZ(i!2QTMGzWqOU4)}<&zH$$g?xj^QI@*J}ZZhp`8u!c3Vj~np2P5b8 ze6N_FVRKBn4Nk7p^z06?3#we+?~N*+zeXaFjf-@?(;bOIUEy3g+fKED}L_&$l3+kv5hf+FBBDdU}YF|C4&^z%qM zMe4Uu;Y+hzW8(o2%Om)&2ZB*e6(W(y#+`sX(J8DyH45Gs{`_9lIbrvQ)i(wUQ z2?YJDm*rD~OIL?#8W59cN5yplt1$iAk)`cX^k~$oM{{7c5?$piu~@~;n#MgQD>7Z~ zuN^ItW^Lyo=MWLTi$o$DD`~YmT^&&+-tTAimoAob@Qh1;b!{hY9qfi!#g|DZp-oqZ z&xH>?U;8e!1KH>NW0!-$S(`aKZ7bN6Bi3B{+V+6GkUy=0DHEH+{7a|wCC?3AS%<98 zcXzM)o2;PBUfD@2!|Cc+m3zbG%j%cM1FP3?O{rSg($>M@hE+6{-K&Yon*1VM)ql%N z^s6uJs5s`Z3W5597fp#Bi4wBPacS=7C218*Pq7M{t@{)+WSvW;rP_X2a_`rr9Tn*` zr>|q2UCGyh-KAwFJ-f$t_xl$>v6zn(ik!7qkte#!)08*VYrWf6{QkZ8+5zPZ^6Zs5 zBV#9Bh3FKL>a0x#8-3%N0;X77lOH^$9TkfTR#9B5a)>h`@kY(NKg#=G*s;@A&R&64 zuyr%f=y%q4s)i8C4>mlOqE!&jVikCggZDV3qvU^Qj}txk`wVi-A{(PwAEO>;o??ML zPV`W(HaP`hp*;>&vCtles#s``Gf%O=9%r6H0;z}Y>cgnVp(+;I<4_d~?Qy7zh4wg9 z#X@_Wd5Q)0I8?<#dmO4_p*;>&!KlY!bdRDc7~P{7bw%@zc0ufW&ZsM*Di+!mQ56gA zil~Z(c16_68TAJLeSWn~-$~0jDZy0FYr=Vqg&X<(GSP8gkRdv=WIu-W>c7tb81+%n z!xz!ci%}o--{-rG=84h6ov;oD^F&7Tl6eXS^AbjLYN~?KoSIQTNL4WE2aVaUq)M<% zg()@infHD1Y$3fLR0X4XBBR+7Rl#Vs#Hi0@q*LHPlzf&?*@9IALe*cRUe)UNELukUA|_kNiIbG&uyYIUe#qJ-Y75 zxz(SVo&0jEC4y-c9OYQWo$<$$BZVEC_BO;;`M*!)EH~-_9b5#sH0kF?@Z0XsCO=s5vox;b-3+ha(uZ)ZX5k+|uq6~9@qW;G{9rjS2}qmGKvyj^GPMMCK8FDWTL^(Fnhhme{5{2YwB)L217 z(dtXzp8D+T>G6=}qkBJ?ke-MBxboUk5#sE%eup%nzvF`>A&WK#Q#Mu+V{Eav<@&+q zOumOo@;Teq&?y*v1~8J6KW@)7c3e{3<>aM-Y2jN#^eVbM5}QNjn(X2cktAJq zwZ@6!fh(tJ6*`}=ioHp<@eBmu$+*y<;-aA%5u*(kmlgQ50N>%=f zApV(Ejgj{k@b~$!NaXVk_8u6|58fDqjf)>lCdadu44>Kj%IX>T=Vw+Y$LI7imN_bV&jhEEfJZbr%Z-WaX8tR9M73^vizl28p8iQ&ywR?K04a+-z#;Iyb$^)yD2%oz4?fU+_}o$ z_;~VA>-hY7lNWB=xegnLrVJ;?51#v>blTdq9Q^ZNyd=l}+;V68@HG|p6XQ3@@uMGX z8z0a%pcMXd_BD9XU@t8z1kKLXMyL@|f{dRo%b%xabNwe%@5xcl3fvZ}6Yr z^FBF#xwmgX$k9DWP6_#g@%uYBU5mT05uaD$3lqrk2Xn=rzur+H5c|A%Y%)3i@cH@y!(Ue! zg^k1Mqsj5-mro232e;AVKVKS2j=%J4_h!bqv-R+wQ}wlVd~$A|tNGLMoRm1j`dnWA z_sQ1M&6nQAJ}*jIKz{ypnXk|Eue$a<{O31cM2^30b>URrip|74%x+DNi#ueMJ=HY- z1^)S*7vy+ZbDhse98BJh|NPZA$Z@}EyFzYvtd@<9!}F(-0JEhEL}*B zS1=vSnLn=L6@2_V>-wr#A+S-~vI|#W0)BVFKaKWxLtlP6lo zpKkcMeAAUX@$o?w$?^JrZJRIO7I_XE7dNs#ulm0ajvv{y>2Un>N!E4OKgK? zrzbz(?OwcJ4&bz)tra#)|tH5)*q8mBn=RceK?pXD*kMQ{he^-GVAJF7t zt;$`hjl_RW^^@fIpaoOl>_ykq*tqEL_sMbn);LS{iSN$fpMMiajwi$>w%R>ia}ygE zPs=686W7J1e^YkWm-y$Kk08gBaz>Y5GV}(L14sY7vF7hnC$Aqm%^dYDHVl3Iiu`=q z%iMa6_rxGMY2**2?njQN@7bE#{LCyoFAfdtO^%!E^_rIz`#XM)LsP7NGk=&lB5-+B zKK^t55s{y_JQ+M%)V<48Y+Q7-3pt)KVbmXeTaG2xMQRo6_(R{S*LyFI#XtYE_4oa} zag~q%Te0UdHV${U?kAtiYc#IBCAI_8jfooJ!HR$_0GmZGqnbw{BeCFi`iIY0_55dQOZbFWe zetH={v(Ul#76;?U@!t*n7kB`80C)g+ z0C)g+0C)g+0C)g+0C)g+0C)g+0C)g+0C)g+0C)g+0C)g+0C)g+0C)g+0C)g+0C)g+ z0C)g+0C)g+0C)g+;D5~n2zeh$LSCq7jYcFsFP0{zrs$+;h9tEnF+(azFsZf4I;jTv zUpliiB~_b|tTP8Iq1kS17_YGF^yPuMd}n$@LnYLK&}9#fLNhaWM9eB}3FE*nd*c zN5?g%LXI5!e)Asn;_>-D7r8aplwq_Okl!A+R~Ztj(1eESLsj9baG6#auT|;8LN$7Q zm_nfn57+3la-~WY5>MJo{A;?w`4@B3j61r_Y4FEKe&w|z<{}bBA}9^)r^WldvVW&rvmNN?blNV{j~GIVjs1d(8~ z1@_NerF&S=sp@-@zM8R9Z>{SH8_o#C)OH4=+LRe*(&;`))iP|JqHMOa_5F5BA3ki* z@T@Xx0&F-b5SwER#w49K#$dM4ef)t@nLTXiC$GPo_3f}946S6a;ey-l{D=Z(_L^!jzr$wzvqI))`^yV!rQQ*3fGp_Dz6tQ_;08;3c*{-L2}jr@KhiQ(TXo*U zX5UG-Hpudy1|bDAWoM(+tfP_FQ1m5+ZhOdecu+=!$z*JXE>j3KLo^OGqa5-=#4bfJ zBtpmhL99-@TJRXFBZZm1i0^%sP}y5tO$P_DI=We75jwG1L(o4weYfl^SXTvLtn)n{9AOst!pbNLLU8jDn zW5$2=NeAt{{#Sj2hktnWX5bx9KNTiDtF^epp@TpIwR zHKe}L_M=bhZ%jOuGW~1&Wi)8`-}iU?M)5C8okI=hA44&ZM@anh4vP zH~cE#fhsStLbDwW^!oN6!|7g(kDY|=UbV|f+zzJ;HE@TM1Q@x)Nx}==z2+!qu{(@l z*rKv4kSMJjB9GvA0DVCLd_-&Xt2G2``3TqOUx|flZ~`Ck8vARl@fw`ON5JOj>q!*V zyoZNF(YX;)`YpW2uIW1}B@X@jk4vK=Q~7bn;Y&f3kzC_aE=hyRd%b(~M!|E=>IHgL`o1e($@ouplcl*ZVfcI>tz0 zA=u|E=*sl!{+wz_)R`dIe8`&*5i>#>o5@}emnP1;`>FWq^q>|4X0JH={282iSO{j? zY%U+JYyRG)n&YENN9?}0^z7=naOOTC*hxR|(#CI*UfTI4YQ66F)JiYiOc8wU3@eOu!_B-WD`k!^V zWv2bHV}h0Zp|1ua;rn3Fxd)9}Y4S{cQa8Szue%R%w)47S9c>X1=2bg7)Nf|H@Cgkn zM%0w-PqLu+Lb)dnuyP8>i?$%wmG$UL3~`q2wd-MmkE2OVNkbSrU2t}eIn$^i zSt~e^$6yRb5u9L@{$jSMQ_{?mc!Lr4Pv7y$ye@G!$1ZG9H+jK?iN08J;tvN7uk;B3 z%DJX)ID?4+P;SFp!C^=Ml-r?!Ih#p@ADNdg8m?PXfO4OEH|ma>X~=oCf8WeAgEPC9 zFreH`-k;r#pUf#^*+kaCk3-wGPumFzMU4XZS5XQmN+q%P^B`Ew*?rgPZ{*MdsWrH# zevzG~;X_;atSbL)Zt`mBlqx%6HD}k5VjCH4F_EO79f#&N9X#dYu79pf8`W__K}A^2 zS$JPuGf5LO>-bKMoG|S1(Tt5g&CSn8!)nfMN^Y9SoWP`=v9AWUy|`!VktzKve)_KN z`NOc9vulW(c3R;LB8m-I+Rwaq-h~b?#I@%y&dXW|t2u+S+_aF2w5gQ?i=ykiiQ680 z{KOZJVj4FTd;fXUtfVcSpnE}Y0w>+wwzI|X;Z?(btO2Vz%iV8YR;gyVjD`@SS7Xh>ZBJ(1|~OARNHb!Rt;9~;_43Xwv7}W`HDHE zUNz~-!I6@f=7ZAGuX^7)3>74nbxc>I{6edwPMQ|`-u`_oX(+7T?PcHLzye`j%|S~N zeVbI@mlEDoH2YFysQ1mo!6U-Fx}Vj*R(tuxWq0mGO$n+vE(ccs?V+qc4vd&|=F|+6 zhKOjy@W2vQ`tp+H9TzHfhGZBG7AgK;l|(L=s&q1?JU%{DuGPyTWT6piUA!V*ua8&B zw~%g1V7{v{;4`*J9D$FzXyXG&fnP9AG%y5K&v z&?!-!qCsYkMM}O2)}$gOHgbtls#2&GAzF=6A&*cgBJ^lwlPpvw3zh4`hgG^5v@4N}|6BIhOkO~s$X0nScAbxHEj?J`Q zRp?f-Yb#K+4SH8d)fekYx^T^Bem4%8bbR#v_1r4wPAx85t*~Kv(kVqg;-E3SikUFFsa7Un>toX!J`x#>e;A2pkR>Q7>_+bi)=$MBlW0HX)I%avk)9oS_D{&?kV#z6@!=(nW_`+VQKuYa@ z0B@uTIIv>0!WkU+hE4M(z#FY<7;ZZg;Em1|L>w<`2HsdF+i*AQpQD>L4Gizo`ss#Q z0B;0%BfuMrD6B-nj7-qb!+0awcoc1xxm^rh;_4dWpx&8Y29Mxe7)cF9#JC}<9YW=g z(D(|&;Rpl=4Mrh&kSBo^_SccuQ=}KLClL%sUrScVBym=N!a7^+xtRQ&i7UDFQi(oY zBA&hQ-;Gj(Y8#S%ew(d}Zc<|ejC9KsiN~OzBg&0LfydDh#E(oB3w%V+I2?SO#I&4% zy}t_By2rO~y@D~B7Z!KeeKir|MQ(Dyixe<~imh|Z(PHm78lAI*qY)0O8)Veo4xA2D z?MQ|%k4hOp)sCT_=r(BQ^t8mbAWF%P4z2)IJGwWBqsJy^2~_RemW{OIUJ8A{j&|aJ zWG7sKsvRq4VuCwZ=w=rx!*V}#&jM9DGOEXb2wGIn3OQpPS8RGSPvE3b6R6rT_7|XP zM@sk>k|Ut!VV$em36sbHVs$UX>Zqz+EA-_BRXcukQm{jnc0NG-=%lc}mOPdqesoeC zeLaZ+nK`S{ad1m<0S%%;ay((qF4*HoI>WiAa50xS3a(;H+rgP7N!t$2rn$$J2E6dIIqrPcb2MMBSh7%5mX7N+Hutx#o4tAiPktvmpM5w9by=CaTfgeVY8uO zvsY!Ea9T7BWcQrSB02<3Y|(6@G(Yi?*Y_ip068Kp$?ho|3%yjS{851fc(bCmYx0C|5Q9DV3e>#bj8pRIX(-kE|!&GgH-`0EfT*xlEA}nRg?RZ?us_=)6TUwZ!4R@v0Za;I}Q2cNq z-1$qRp7ZL?iu+fj?fUip=UX3fC%afoE3J`YAWhSTEe8d0CJo ztDI@&xuR4D{Us1vX^y3bd~7)@h~GA=uBmXed0gz zZO60vTE4di8=IWwPT$(?gO$FfY_3t9$<(-Qo-5ZW&NP3DVI{Roky>{4#KJ4Iaoj$= z$QNKd%w(L7py-j&bRLMT0g*MDUX;K^*2Mjh^0WS8pJ!aD3_0D-PzFjcvOqGDEoQtx zF&^t_4{@jc;@0;|Q!^}S85UgszppeRTGsz*mlG{}jhemaKn!=HIqum;_zO2~n<2a) z@B84>TMlLYY7$i*4|zIai(f??Jvf@yKi^r4I{0RW@9}@3>#W2y)eJ)h zwjVO%prmx}#S7jSSwrKz!bR3f1tJ~j10lbAyetgz_JmQi5XCjvz)uM%>w8hE4f5Tb zb%k^~;q81k$q@lHT@2C_E$E6vxtYX$3Dk6fnl6LcLZ1?BHBH#SFW67)Uv_3Mb|s~o z`v0n?OCghoNfS(|8EJCHoOJVkMFHe;a9uhK%(=*EbACucaR ztKUgslf4Q z_WVwIfY@vC2pvBiY`TefI)&zfee~J}cCnntSVkRBM9(<8YPj=&Q!R-)6XbEKwNn>iHrQ!@ zb!pvg}UR(jE|oyW_PT(Xc>UzpjsPW&)QUd`ywrrobMru*l@a3TF5 zHcTzm&D6Y4-G>iOc8wU3@eO(x^ULKTzemldKsptcO)m%ClC@IumWdsytZGc07Xg5E zc_=5{O8~GAh`gX%a)|@hf;Wn`tFkj^_u_D-q{ z2~}u9L-nDma8MsqMOgKH-Brjzkt>993oDj4W?9XeflpHC!D!f;3InU@!4`7V_a@LU@SI z5^q9CAZ7`kxgs|KJcCc{0a|&4S`#0t)2brkBQ&aTg(6%d(}ie@v4dXZ)?B_Czeo#f zVTtBU3Q0jbo&?ZwWXFM?AZe2==t~TpV|mFl75v1LCwh`~Nwp*!j8b!^QA17!H+mKA zyR&i@(&bERC}I(!L;o>WxTu^YIQxUESEItWL$Z&S?H6{sT$7j~!S1Y*L`zCC>|Z8s z%*HpL*1S;X>#pe=;wJos0u0b|^sqsh65i|uhI(I&<(?-Q1wlRSdG$#W5|?HlGoIOzOuDpG6HzNjR1A`Uklo)9yUfHPlb2Xw z@WJc5o?Y5LY1hB^=R{`DnF?Lu>R~tyPl{?bg$L4X@A$T0q9~yM9lmbn@w}~q6Q(YNRcFxvjJu92m-}+pcB0$&Ikf-8fo27DI3|v zUl3<~E!?z`Iq)SQhj5@%vAZkoy5(aGh*E&zkxaz!O8vYBLCGJ@e} zBPsOCYnIXTr#4bTK#|ofwRfB_7!AZTwI>}^?#Zof*|(NWx;bU4o7Z?(4mGNxovmC5 z>Y~g}CG{9}Q9y?Yq;Em`w#21x5xgY>0KK-FP*MiaJFx!cA@|x(uC+3?;hK)^SG5!@ z+J{28#~o#G*zz10;QOv<@Hon|v!Ep~DD%}WdyfVLupJ$zTI#X_aEyYlUm* z=CU_>pu-gGNX*5~wnNMWCMtrumqNsXTKMM94^9}HoASta--KhQU;}byl#&A-CStv? zyD7kG&UC4Z3?AXguyvh~@D|Wva+kGjt<54HcEHkp=DqVSba)}IJ%4dt)%t zA2zj#Q%e>WMb~)~w>|jyi7y_-G;SycI!w&Ec6&e_S>ZtDeVn50pj-r$i+C2RW#EnM z>>kizO3g572)tGd4`g#51Wv?ca|K*5cSr`n8%rYI=tPIfg{PisN{|4yu)!GYiaZx` zD}mBdbVh{3hTcuwPp1_Q`w35niH$i5K!*tpvOK86L}8aehe?yc#k^<6$acU2L<0)w zFj+6xbP#G!_fPgLc(iKn{5IXEzy7@7U#1RIWs^vRyz1WJin`$vj)tv2AAXxE5Em=n zn<~&Qbi6lJpnW%)KHwe9w_^j2>>-wvpr(X;L(LA|M&w@!fA%`Rvg*fKTVu~2YOvzu8dv~l5oxUL_LJDA zNzc0l8>%13zgOX-N5fvj2F@x%iuaHau{=hSAoA|a=w1&3pkezLrGy>%D_Tf~GM3Gw zm+5AI?H}U`rcHhPy3bc`{?pi+Ga^T)!v;@_FXK27!Wm^GVe}vg6QS0{E8_L~c$G{Zp$k)o z$doFzN~e=avGh%_N+OrztvN0qt9kjCknHZuq1YYM0;ZqwDRJ5y?0C_|Y(}CwMT5*7 zi%RHaZWLbMvCLLQ+~MCehm6IrNC7An_=$q^|OL0MJA9CYK;<#o3}jCTR!DI@4TVH5b(U1|yrxOX@S9bK z3G_E8em)7{>J(YTPF8`SAQll<2RcloQjq8OEG)CiARgQ0s-e%8105zzj7JP{)@{UT zOz5z8j9|rhT19H^eXP5`B&}0{|Dj{ee1u(|!`5L6+c9Y8s{hn!->yv_UuN!uaadUn zslx4t|Li_(M(`4>JZp@Tx~P(+!?Yowb<0jFai@%of?o$5Sny>@ z(qS6iqchy@RH=qp-;WwO>ggqQ3DRLwMVJ2ZaP9r$*UX$eykXDP?+pZ9D2 zEb!>Kkw49;1C1(aI!u|3#;j~Hw#=2-9}Gu+{JiyYVdyYP+IE}0f7!&r!-9^j`=x#9 z0%7Yg{X1!myjjG=9|yNxm6oIVtp~ax`V??Pq{A{jF4WID=+6VEzvGHD!-`p*HqpRy z64oRtUf0WR%mb%;N{ht>+pw$-ZWp^Fk5}z-(uxO8f8&j3$xvXyJ$5z!`sAETy(4B% z?$DuLhw=U3q!-??49CTBqrTpsFk|7tgsBq4#Qja@4337Ao_ohATIZOY{~lBrkOiID zHvxVf++b-BuQ>|Obl{GXA88q?tvc^vv+tx^8)W%UgOiX8YS|Se`O2oa71Tu)rl4Fn zpM=VbG3uhWYTM+8G`#%n{fjrdmNo4CNr-h(QIC6kS2O16m#sTQKTNv(y0-U~j-2ua z)STTgSqB~yhIGupaLN}@dr#-f4o?8+FaaGVP#0Aa>!MH{rtRoU3|-;{?PCh=$01NP zH=_H8iVbIxhc60iIpUd-Maih$BrlGw)4^SrNv8*gV>9h$aMiMp{pK zCk2CUQ!-i4lU?5i!TtaC;7tRYFlgjXOl}As#2G`Skl&0hDFnfq$2|U)%-cvwDj0;& z>y$S;VxXZZ(GjDFJ;F*Hiw5yDl!j~tWtWIVzOB#~RQ48Ev(!Q2({}l5Ia`k|ekHmt zAvobF&%Y^iJ4oWAGc~%w*O%7$W2w3}WX+=Wc(gXIs zn3{dOx8dOpIMdT4Vi&As#%s7+HQ6a6BD(aiHEMf)nF{55oq;nwUD4!%p%nOp#lN_v zIm6RO=45^U@vBRcfZxK_2EdufX6hSlKZ3UYsvylkQ-?!ckKsV5N9{Wf1A}mfgEWIv ze}OauTVt&dca_jI0}`#3yAQ;2Q&WIgF48^}sjolE3w~8NN<@WmMEwd7%Vls@9R$eC zw1{JLixq?rK4yb(d@C3@w$~c+U@;S6E*p&#&g`Y)d&1P1(yJ#2`aH@|?Dp?==9y+M z%(H@lW6v_R08sZ*8D^Abus%98Uw=nd|t1f$}Lz%{3CZHo$0|-jYDn|GyFSJKR>Obp%>uu%|-d z;W7>~P=^$Q3cm4!J0X>)y;=UFbV9i`oem)qxcj*Z1d1HjvkfH={)hwXvaY~y+C7W? zv6pdumqtE z8=`SI-lt$vp(!+oGo?DGXPV=y0d@E~y&-a@>glGLR?v@bB|G^9sNkpvL`*6;t*r$@ z1qX^KIw>BPqD#WAxDcav^`g%8COsK(=8HD3SNLs8+xTC}P(JBV!?j=5aSMTwKT z*nMNr87W3<5X7h=3Pwvt{`OURftCz;g_R6>m6Qw#fRhXffbB~i#P~F2Q<8;XBZVj8 zHnJJXP)Q;rLnVZd43!i*GP;raMq(*Z7j|SoOQvO&okF;P=n~2X?wtAyK;A`kSIMR& z`&AK%{Hj2e_$VTyZ*CAT(Hi|5u^KX7qBZunlGz2wuCyoz4{oR={4`R-b zcr8fvAjiEJS&%YA=QiGR($N4j4F)0W~9($)tj%<|I_jtz!Yuj$R z)*bS6R~{E0G=+{4Mm9E%I3E^XJ~DSfiJR%>5Npi1HnGls)%Nj78fT;cJG?dJuwnPIT~~z24jsT?hyvPYWQ_I_kfcTwxuskwi4;y5pm(ZCJ-S)k zG52obycwlL^M|M3hrFjH_Wz8Q?B87^^6xIL#V;)xJ?HqQC1Yo+2Kick+5?cZWa4Y_ zI|skCWZG9#7Z30EnZqJih-Y%A9bXX23sg`=&{Z<)_)d+SFzoTsjEz3c&Cf@BJdQ4W zFT{g=YiLCn8nCpVdGEXn9bSlQ&tIIEwU9d*F9!#ltA^sYCc;W~t3#d?t?jHoauKi} zyt78l9>1Ho>eE;!y*LG9q%(O^h~2-+?NFkavy*n!Bc>?3Ppn`T5+0WkR@NM}B+<7? z^?fPfO+~XWMTUAjOXTX*q#Wv)Bny?GUh+^0Yr)KO5sKrZlr|BZw73?Gxy)h-lIhFt z%+7Odhhy(D%?<2rFdM9jp1s;wQO)y~wGmf20ZNYR8vlXRyMp_)3YdziQ*4l9Tg`!hHu``JvjIAfd^Nql< zUzs-o)Vb6JoGmAXp2?-=CR6>C?Zxak&PdHJ>c_E*Ub#z$JFOFOY@~HgQ8w;04IkRV zXI1%cbCXv~r&QU=U9jw?jWkEnvsvucN8H^#if^a0dpkcBOpYHpbGnnkXY8wiZ7=TG zdSpufil4r#d;TzYSKlIglgvL8`$omGPy9!|?RZvS%lFn`W0TX6r<(pTj}3bcq)$JP zOtoZ~$l@UEQ8|?Cq82bY+nj1V`5iz~DB!i!z&@!%vnXdI}ecrP1)<=(!_ap zKNVk{9@JvM>=kF9KZ7$li>`}fCN1E>Nt7S1YyRG)n&YENN9?}0^z7=naOOU5Qcy{E z(s}u5%rh8Q)+%QT$GsEhdIIjI(gr20Wl&I?^Y0mFGMf)h+MYnSHCm zrp^(f#*@UyxGAc6rDeapyeB>vG_*6&cmf(vcUI1la;yZ6uM1wW(m1kS17_Y zGF^yPuMd}n$@LnYLK$DgZhbFV?cZE5cSr`%cq)O()G8a0V)#V#B`)LX+7f(ipm4ig zxtP=pOIn6S5^pfV{(Yqp(X#$eyPRm*Yt-yT2Vx-3TCY2Z-U_jeA!Sp&QLrc>uVu^1 zjr)g>2pO=^e%+d#M6D(i+h+VD_%v0Gik&8i1foxhYSw+hf=D#MLg zoHsaX-8X6F4b2mj>;L?z%4z7F;CyVogiC ztp1O6(7HXni=0cr)*%F|Ig=D}&jP8{XO8oXu$nW7q1Z;!@^?E9&22h(%Eev(T$whi zOysKg-YjXb3cI=nz$*W5U=?;r zlJ}Lp0jvUG75kW!DZ^+nAgyO{P)ZpRs?dan{%>;B8L<&YPQz9?mGxHh7X{1f^T`{Z+l z57-SUO}eyHlf^7WQ7`ftVL>OEl*SAsDSCv`0&8yJ%z}-JPkwrF%itb0wluxjKjW9aa5}nF z>LUvWE1(KQ=<0!xpLbeU!UldtVle*^)l9H~UzHfzcax6|X-&_sOpF~HNP49~C}klO z+>7m_us^$?2{x3x{*|zyWHqpa4JE3BB`lcPOQlzc*~>0!f(<3Hhb3%44vkWB!`-ZZ zj&9mCFuYIeryFK*SA5Po>Ri1bQRkgw=o1uBS>sWRO3dp1T_iFYD4;U9RM_WQasw1l zA&e#@Tt+4P$cRWv2i-vdl_v_QO4!vnetY)m9s`?{p7;BmHw(Y`d};}}8duM+6}2#} zdXuQJv0v4kTCu>pSK~P!`iM_F@l`jPzUXk!hVG+;c{P4H+qZ0H^1<74#)fqMEHYxG zm#@ZEKNE>6o3K}1FG#lf@OvF60t4ha%I|fY7LXv{&F^)b_TA*+!~1pIjt$o9cnQ++ z%;Rr^EAQ(Xpw_kk+{<9^YVxt5%a5g@-TI$NxTR8K8W-V=Fuwfq=N|+!iY$!Qezp#NbqMTFeKAC)TyeT*n zPZo}qu}*ZTVFPDG*kbw;FKr~CP8*hzV9aDNDcC~kd?#V-%}k<(+Ti`Dk1VUT=6uOh zldY5q3*amwjivT?(pt7uCT!r0S?czZA+2RB8n!^LkPKxk8@BW;Y~YMTUTlv#lkye9 zmX1GpI<{Hw^02Te*_V1e|7mQ^8IhyYVS}f8Y2%R{yCPN3F068)#1mAcLa{rh1x!EV zbCE?YDyH)QbrPp_RUSh^GEx^j3M!6EntXHBK?wT@ZiT#5=nE=!-J{$w@=8FkUyx$A z+kAc>){+WVa|W$CO_tkX_#nS8KjnpXzMF(Id8#*aXn~Z95aZAyW8%hg?Us0*YTbIX zEVxG7o?YjU;j6;Xv7Oein{MWD{il8N{@(S^#}lL8zCHi#DOinC_}U_iNc;=(ZZ!Jh ztKS--JV9Sm5SpwJO)8YQ#S?wNv2*QD0vkDJ&MwzQU8w|()9xIwk#Xjy$keejZJ17V zW^EeqtnSU}#%=Ze9))-BjivAw_Wo%=8lKEU_xz^Ft3LV?`*N1f&TlLc4n(f=HZoP^J%AhL-mY^%98nU%+ zM_*#-66?0%wn%`}`!=C4q)AOlLo|rukag50)sl=bb+N%?a-pF8?< z#;rVAsdezXc;zeavNf(hp8v43c7|$XDcSz|x@T2{$<`<}ukrOO<^`<|HI0HAteKmP zZ}6V0VYnbWnmB#+mt!v9opA2kI)AjpmdE?(@<8f*;40_~Ds|aI`y{*Y0)qQ{N;QoA zRru9m5NFU3YwNQ2b>z((f;EqMawvlUNa&FyaVDl*gx}e2{DoK1>>U-H*LX@nJ!97T zwKJgCNpQNSlqsA&6v9B(d52rbUL#bU4|;~c@1ZXq7YW4c8iBmBL?AD&5bngrJhMO` zp{);7wcl1O8FNW>zwM2Ve~!Pu*?NWmu3u8|LNlk~BpHv6E z*6^4rr(yT{0bD=UcIhf%%IaGZdjwoRR=smkw-GW@C4wR*Ly`0{;QAr@BgOPA6>d`d zf{nr$&jqfu3B^7geGDu5+ z>t`qawr-dtA0bD;qxy$XjNV*nq{kV$qNRI-ppR0Q%;QGm>DxFLzkB<+PYxS}S zS!je>7q5ud>*G~2d4w)Z9U@bz)GD1$CdF7}!77Pdj?0Z*K34PcFCp38mjkY!CKYMp zDVHdvDur4RqSYuB@(7h8LXS2Vk%h`+p>lng9BDm*^c~U5=L>dQpGy_`EeBPZ64=MI%qG743gGD^d36s;3L*Z=P~)y0FPpJ$+_w3(D5RdCRXHO{twc z4a@A2kLSI zn^TQ)snh5IMeiXXa+8?hestz8G6h6#Y-3iMZj7AFX@JBxdCziprm@*{q-R0mn=42Z z&mMuqcY-4c^lxW;=gDT8zjDUR+^Iw8ZxM)5t+1RX0Jiw+sTYTs7oVQE*uMAqw;T#WOQ96E6fLE_B=avX}Kqm+2cGD zLGv!i?Ai47F5cOST=GC>kE;|kBS`_;SGYYhu@r?MqCPTNViTKyl2%aC>aYD{T*0)d zk6-us>I`UK;X0)RUsUv?9JH^H>oq!sGG3>O4=0QE%oc63A)a2dH!0|&Avyb;SJiGyCdb)v}3)Wh1H8ewg?%k+6YNjFQ)&6}m z&kWA&3TJw{o2?6mQV0;u(wyPxBXhF8|M=A9lk( zgsnmb?dEEsIwd1GR-$8|3n%o0|NVJU?_o!)yjWIc@7LEL&f1~6X&v>59IN_4oNXg+ z8fl&Il#T4dEQqsp>86b|N7AoI>^cUXy5BgSjx;-+2qSvkOy-VE7LCQe8rb&Yo~=iw z^so5oySnEOLvOi?M2h^>V>1~{`-)|s_>X+s@vOd<@2$bcCa0lSUbBoo{Zfx^7I)0O zn>cSqDbf7l>G!?38^&f@mofP`9}GJ8piwJLo~cjj#`p7e_n};`?bWfF)WRUmt9Ep# z-^_O56B<;Es43Z>WI>4)<(?q@CMta*5|s)>Uy$EDuAZ}lV3esWOmN;1kd?DWaz*)G zJpMOu*0iap-%Up0$nVeD%6HcWJP1cDIm*?fEuJM(>NaBGhVZ#}Ln9AJUvEY!fd5W^x&er$aEq(Z~LBq4ktO+pBio(PKvvb>`_6NGX?6z@y zE2BHM*Sg!%&9$Ld3TF0F_e5eQ#FSn=Ind`(hGMsWw=>T)dtt*_!OmVPE)8non>#-^ zVQg;7Bj0@!j-7%H$nB<-+);s5k;4wx`Alkl8W=i`G_4abkQQj}I5fBE;3*e({c~m7 zsE!i~D#B`hIvBcOCVA}J@RxX!GIMMqbGsz%WCz2r+EdL|m@$ZBJEJW+liHGMA}tJ9 z+Rwaq-h~b?#I@%y&dXW|t4qRl7xwz|rj8o=(h0g3^d@l9-EBKt3?E)K{Kp!wx`f<$ zVfB8lc5XNKOUj|-)MUd%uzHu*ZFIuu@w#=fh*lHnyO^#<`Grz5V-G(ok3} zD2&a9!Q*xF7)XJQ7`@t4J<{-Po2~ym@H}gxyO4c$R_TZ5yO9D(M59)!l}8{Fz@a)V zq5>SDQH3iM;TlvRSg#M4g@I(b(JUbvs}c>gL7608CRwQ`0;^PgBNA1(jK0KG`Mp#- z4r#1GEV=oyqeIBkc^0mMFYbECx`b0WcB#|dkUNdhVp?f^@bnOjeS6_9eN#+pogL4D zF_NC9W2+HCd8|{3Yxabz%c$^BQ7{XMky&I%J&>o<>P2@bg_5x4)1VSmCD9&}&uZR(ZIj0P z-}ERyGK#yjsoTdEUMs*|*1mX#NMkb@n`z|TnbEx-1VF>~FG>kJ@>eu>>F{FP=}iAg zK<;D&d5>PEo9V230YoH)li3AuCb?Y3B7no5wAD6#N^H}l=iP!0)eq#~tMJjIVXx6N zdWCzbDU>vm+p%7;;XubB2|$6}2=JW6Apix|N}aV~#4~%&?nvIpsGVIi0Sat3qq2Mm zP%hON?GOkUM`GR2>R+q9eB!b@ccP{QRUDTC0~8pPOyL;1G9*-?2@TbUs=`&_GOaRR ztI~&sYV`Urh2sBrNli5|f&#<6kXJ1F68q+Jb#=8HD429x!BsyN7go=rArezffZZ=>CpX+73c$6x}9qewblq?FQBC> zrLJn&lkupX$wm|bvw~8>$AFezq`qa2-HTn?`CV-oqvx|LhM2&w`oL0eD01-XMr)8*}pcgJ0o=4afP{WpP-`$K5PV?7M#Z^kOQ-L z@9?VrTNk{)qi^q#^Q#OTzd(Q%Q=lSdaq#U{TZbK+)9C#}&GfsElde8SpA>ZJVuD8s!M>NAONZ}49TuAR;>pc2>`PzWW5hu zG9yaTP5@K`pqeAXK#`9QlI(4T{Q+~{+RevpXHrR8c6Bje&O4{31E4xQ+!4$V^i$+g zl}@IV$H#}twR%~EEHpx`i&wjc^91&1A!Ty(z z)x7*mNOt$-Q0$Ir0n^X;Tx4C$izz+>fNC75uC@f>|M`qUUK!|1TpDnDEhKi#z-I^6 zzdYn#`^mLdrZ!yDvHhx+fZOX9w|8e~5AEPHrFQlU?A&Un=KM_oaeG-{X3+Nmy9UZv zi>_O`Enk^%v6p}>Wr3I>zfT;bxf*ve^3L~nBb1h{!e$|F)%=>ev+v0R%f}6>@UH2Q zM{} zZQm3Bd^94q|I#_Fm6Klk--WKQ4rtFLRf=jhE3tyxer;`Z)hYG-HqJQp`O13l|6Gfw zTvkzSw*n*>@{gO|W_$AH7MnICm5N>8^I+w1K?0pE)DDH49bYyy=lwc=z}a=@=*Ii5 zUkY6pf$n?Ymg2Kp zG6b1OaZh(w*>vIGhqd~DWq7==oDt&e8d6lJkVTRZcTtqPCfGlS@eQ?L$-(zN+IJ|v z?)gdQJ}?A{&?u^GyB0vo+ZAG}6+D%bkUro{yGvE20xYLuazMnzm6RCZOgjQo3t!d% ziUv@$RBu2I+hB!6jswcXe^FQ&K+%+Jnv2+ZqB=!`V4xN$`6gJCYSJNs?MkUip;m-w zHA;m%LZyh%qe|_vP?;=Lt`CzVI_`*wyIv-jsb$Q6iU{>6ad`i9??nCbmstnHM2(Is zE8$Rd0EB=*HI^Y%w#n#AT<#7pu_?K;SdiZog1pm}4dRS^=QP%&|Efdb|?ZRe}4 z{6C&mMbQV%s=p^%vT+CT7WFZZzOZS~jQP#BBO7;OLB+Jx4q`%>%x=iWomfyYO{OAN z4B#QmWf#8lbp3O(E{M6nL;(qF7vJc2=fh{ShX38T{tC&Po>K%fb19gZu#{c)&a>{Z z!^JMOow-yAExQ>TMzEf1$v{p&5|}fmW|%aHmJ<2}VtC+HuFk4LNi2}hb>6-U*(MQY z_-#JF5APHT*ytoO!ESX6*yw79a+xeKZoo#j?pNe7W3OC0HWRSX)kxmJl%b*R@XkC2 z*yt`zES#%qjbEJg!zmH6DV#M%DfEoDdp%)AEY3SM2$eg}Zi4|57KLs!QtHA&MW`TQ z0TLF~yw6St2@8<0z?80~ZgVN@9)^HB4-yu%J}<&dSkzdJa_6@puiwy@xHM-S$Q-PR zqN&bPP#jJf*}eYo_7O84JgbqDzeQW?zXYfRh~)48O4Mn_%?*#vRjq4o6%CE&4)^B7 z#n!tGh9u)|{&D!nAI`th%JAR$j>b1(Kepx$_vXZ8HZ$|tgMQUiYc4Dqdj5LD`{qO6 zKo_`TW^!V#ElNws=`Z~w?2EFWf4yn@{ckqp-{@1CI~tvvm``RUr}6-P1Z{Vrq^^OYg5Cg@9ChBM}!T|c65IYXg} zEVgkf)FcFP|5lNjdmroWFG=fE;D6{?Gav4#lkPgofiRP2`-s>+K*y>^b`~$Dx>G6- ze$na3&LiO_(T35xPBr%M7FiUNsk=6|rDNuP^53Buk?KV!uk<|L>TF%bQSOp$Ez;x64< zY@ad@bugb+M+Y5EvY8b(txG?%zNiu=%q}LmhUhHuCS-P)B}u84WTa;}{ue@E(k3h9<>Q?iEZE?^A}rXzS=Pnr9z=%BC?d|{7z(Nd=?PxXH#^>NR(sR0(RBa3 zd!=5kR}P4*uzX+>*l<=L<}&X)Xaa+Z&es(z-A5+*SwguQ06bi>w3bZFoWmk~Fya#OPJP^Zre$PU*R0HDq zEF{W9kh6f_vyfJnf_yi>XCdvo$tqmL2JhdnT=ttPC0JdN7RlPj(PoAvdgoqVpukt;B0y_;%1QG0SO+P>=;P!;0d0Z z7m)-{<>6>ka`XinlarW_`vt5{k5&{qEPB0*kQ$S3GlUo9eII;!%b~1aO`^)kb z_N$U%GUHBz9&r0b7W%Di*|(NWx;bU)ot3ksnp6+c+zYw=dOzopYDv_Ykff^ja~_x_ zNY2t)<4G>)=+9o~S62NvYisP;Lk(7(Tq6XkJ!!1%_LJDANzc0l8>%13zgOX-N5fvj zh9h22Cy~}N(yWnpXGZsW5C9F^zbGZ_$Y0SyGL*4w9=%LA`)mIgS1@hrto%Fz5ss0lL1PPT(U66{*Qu`XJU+_8@-1dniS<|^I8f=*T6ll0Y$ zoqB6sN5HYRQCX*o;!wW=j&(+g&S)`9(Rz3f;s?m?F9eP?zh|LCDuy6{2{ykGkTFv; z+&KarK4mJ-AY%+b#^lz)%ov08G9Y6DGA7z89*{9PW4qbn!GMej$e02sS;K=E2Ci;P z#`J#FhvC(Ni26u`-->~drzS{86*tdJx)!9PxQg;fkAifRtGFD6Zh&-@T&tHw$U;Fn zN@(e*T9c4;ly4gHNRfNqlM!dWX!Cl7-=?&U{{dn&XT<0Q z<5ab3f4ky}`uBsMjNZJbTnQmY|Fd)Q_OthP1no@QKmuv$N;@9`*iyZ4*U>+kaHQS2BpvPed)typ(6(`B8b}`RhNze#ROI zWB?ujnHl#`^$kfxr6uin&wbFooBVAN8~D8i+pz)g09=8L96FBGj5iL6W`NdOampJU zdzykfQ7@AS3D8;#cQvu#*tJwNKu{Kd)*7wrq}we`i&7kcoCW{uT5J5Cg$^^sf|jyi7y_-G;S#7TO-%uc1o9! zqN%k39suA0m{aOilb#$LDT!%5C@uY}5Neq4tt%FYGP#=DBB2$>>mTp{GBlP9lTI3s z;o{C5My6J6ViUjv06YLtmg=6)9=@nRSt@A#BSot`9raBD%5bf10XoieH#^AlgI%C7pzG&>4N1FrDTZO1pA-vov2^_GV5TN zsL^p{B^-hS%5c1~?`WJz1a#t84TtvKfDtaW;|)SD-kJ@Kqw#)$GMqbXEyqq~vbE@* z2Fh?i84mUbjBwu0B#@3uLWFuVkn$@6 jKpD=}y%H$H$)zftOev3#4+Y9_Qb~eItxXo5GTi?GdjZlU literal 0 HcmV?d00001 diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.bin b/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.bin new file mode 100644 index 0000000000000000000000000000000000000000..18c54c8bd5c5e7e1c1f1b4694fe91fa49a80a476 GIT binary patch literal 87738 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%0AX%&y9*mbNH% z!PejFhx*p@`udNgNf)QB09ypM2y7A9A{71B+F1pwJDI4~f-M4DRIn`ql_e?&>1Zv; zcUooXG6OGI$8rp*55Sc^@v3z(`@OsP|My|cOjHF_rADg|QpS%^xn7F(dG)Z%-eYND z6OHm4{OwO(t~&W@_m2VdX&oJ;)pJP!*1u}ea?OhQwO3Veo*JvBdr~Y~8I(oUN6TJp zR4G2QTFq5rwN0Urt3_ebK;%JH(iqqkO+ zTXMc#TxA1nt~iOYXpU+mG`bg68r3HnTj)u z-KU6^!YAV*-+d?suV{%~l&E0(`xYG!FF-1MgRjEpWwI zuofu3fy;55RGYAtI3X-s17RU>#eplXU{{6GD-OPgW)){qR(^lQpZH`jjKH2}RlltS$?M0!yF3!Wx=OlRa z@90x^-mpEt>fQy)3o1pGG<+Bw^qnyj9g?DR39HTSny?qrvZG64` zTKM~Ww^9^NYYNmBsI68{G9-tjPeipaJX$LZs8E;!``h{Uc8PkupgKq&qSkN}BS-1{ z8iR_8AUX6uI=|u{|5_eGvhlqrZgb$cv{@TB_&F0qqJD%M!WvYV{A&v;Od59`P+{I4 z-{1Il@UNH?M}P_wRG5S;nkY4#)EKBlz09r((-yTYGdnGKa+Tw4Y*E|rexJ6x6|dQB zrnY6<22Xo0ecera)b?ORxjx>SoY5B4wwrr%>ca(9mO4sp{aTQ2gZ_Q-Qct>CjZ4pnla%No44gkvGT zztn4s)CwE0bm0KncH+&ZbYa`JnRn>D?Za%5-Mf=2kN);czgA|lyZ1}~hwl5gbg)Nu zFX`8}xj3z|uLap%|Dxf((KBP593{IIl046El8=~P6tcS`%a9jxq+6+JA4ROYSdJU_ zE|6W2E-2#-ia?#xprvS(@{b+34)}E)6KsHg7yP>=N`gHg%O0}qv8GWC{@ru4BW9$5 ze-{ZuG?YcnA@gh$vg{r9?}A#_BshvhlQ?rnhdCe~$wrh&G!aAt zwFPR6v_(kE4%8N?EuY9{*J)vw+9DOhQ7mcr9c^duW>eBIio4xpZJ$wfY)KmChLp}4 zXYg)gmNZOm*f(|3t!)|hBn|sxS}&RYsrtEvq(Oak%Y&NV#BOy|((pv~qVD&1M&=ep z(lEbD;|1gBfv)}Z(b|T-dG|olAkptS7Tkww46Ix<-9?m^g02^Iy`dMewww1OM=9@h-`KsGi{1+^3gzwAbXTWk*)z^Qi(FOrkL??O z0?G@Nmtt8R?G05L;=u1)%2ek0tx07A$_tbiC@)Z6pu9vSa{;rW`+aRuUPxT~n@Ji# z#S1E4Q1LokIs;U^c)isSi-r9P(25H6)g)_?LiGk*1Ie^dG*oXWVBK1%xeL`B-m>Zq GSN{h!Sm#Ip literal 0 HcmV?d00001 diff --git a/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.lock b/group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.lock new file mode 100644 index 0000000000000000000000000000000000000000..bed9c81dee6f2e0b2acb22f5a8c52ad9ed16301d GIT binary patch literal 17 VcmZP${wP}a{;OLy0~l~v0RT6n1hN1C literal 0 HcmV?d00001 diff --git a/group13/2931408816/lesson1/data-structure/build.gradle b/group13/2931408816/lesson1/data-structure/build.gradle new file mode 100644 index 0000000000..0049406393 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/build.gradle @@ -0,0 +1,28 @@ +group 'cn.net.pikachu' +version '1.0-SNAPSHOT' + +buildscript { + ext.kotlin_version = '1.0.6' + + repositories { + mavenCentral() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +apply plugin: 'java' +apply plugin: 'kotlin' + +sourceCompatibility = 1.8 + +repositories { + mavenCentral() +} + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + testCompile group: 'junit', name: 'junit', version: '4.11' + +} diff --git a/group13/2931408816/lesson1/data-structure/gradle/wrapper/gradle-wrapper.properties b/group13/2931408816/lesson1/data-structure/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..84514df01f --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Feb 19 11:20:26 CST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/group13/2931408816/lesson1/data-structure/gradlew b/group13/2931408816/lesson1/data-structure/gradlew new file mode 100644 index 0000000000..9aa616c273 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/gradlew @@ -0,0 +1,169 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/group13/2931408816/lesson1/data-structure/gradlew.bat b/group13/2931408816/lesson1/data-structure/gradlew.bat new file mode 100644 index 0000000000..f9553162f1 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/group13/2931408816/lesson1/data-structure/settings.gradle b/group13/2931408816/lesson1/data-structure/settings.gradle new file mode 100644 index 0000000000..941deed614 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'data-structure' + diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/ArrayList.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/ArrayList.java new file mode 100644 index 0000000000..8cc192feeb --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/ArrayList.java @@ -0,0 +1,97 @@ +package cn.net.pikachu.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + private class Itr implements Iterator { + private int curIndex = 0; + + @Override + public boolean hasNext() { + return curIndex < size; + } + + @Override + public Object next() { + return elementData[curIndex++]; + } + } + + public void add(Object o) { + if (size == elementData.length) { + grow(); + } + elementData[size++] = o; + } + + private void grow() { + if (elementData.length < 2048) { + Arrays.copyOf(elementData, elementData.length * 2); + } else { + Arrays.copyOf(elementData, elementData.length + 1024); + } + } + + public void add(int index, Object o) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException(String.valueOf(index)); + } else if (index == size) { + add(o); + } else { + if (size == elementData.length) { + grow(); + } + for (int i = size; i >= index; i--) { + elementData[i + 1] = elementData[i]; + } + elementData[index] = o; + } + size++; + + } + + public Object get(int index) { + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + return elementData[index]; + } + + public Object remove(int index) { + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + Object o = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index); + size--; + return o; + } + + public int size() { + return size; + } + + // 迭代器留在后面写 + public Iterator iterator() { + return new Itr(); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("["); + for (int i = 0; i < size - 1; i++) { + builder.append(elementData[i]).append(","); + } + if (size > 0) { + builder.append(elementData[size - 1]); + } + builder.append("]"); + return builder.toString(); + } +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/BinaryTreeNode.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..0c4d545e8a --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/BinaryTreeNode.java @@ -0,0 +1,60 @@ +package cn.net.pikachu.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + if (!(o instanceof Comparable)){ + throw new ClassCastException(o.toString()); + } + // 根据节点大小放置元素 小的在左边 大的在右边 + Comparable c = (Comparable) o; + if (data==null){ + data=o; + return this; + }else if (c.compareTo(o)>0){ + if (left==null){ + left=new BinaryTreeNode(); + } + return left.insert(o); + }else { + if (right==null){ + right=new BinaryTreeNode(); + } + return right.insert(o); + } + } + public void inOrderTraversal(Visit visit,BinaryTreeNode node){ + if (node.left!=null) + inOrderTraversal(visit,node.left); + if (node!=null) + visit.visit(node.data); + if (node.right!=null) + inOrderTraversal(visit,node.right); + } + public static interface Visit{ + public void visit(Object o); + } +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Iterator.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Iterator.java new file mode 100644 index 0000000000..05e8486430 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Iterator.java @@ -0,0 +1,7 @@ +package cn.net.pikachu.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/LinkedList.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/LinkedList.java new file mode 100644 index 0000000000..2c29d0f085 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/LinkedList.java @@ -0,0 +1,161 @@ +package cn.net.pikachu.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + private int curSize = 0; + + private class Itr implements Iterator { + Node curNode = head; + + @Override + public boolean hasNext() { + return curNode != null; + } + + @Override + public Object next() { + Node node = curNode; + curNode = curNode.next; + return node.data; + } + } + + public void add(Object o) { + if (head == null) { + head = new Node(o, null); + } else { + Node node = head; + while (node.next != null) { + node = node.next; + } + node.next = new Node(o, null); + } + curSize++; + } + + public void add(int index, Object o) { + // 这里可以等于 + if (index < 0 || index > curSize) { + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + if (index == 0) { + addFirst(o); + } else { + + Node node = head; + for (int i = 1; i < index; i++) { + node = node.next; + } + node.next = new Node(o, node.next); + curSize++; + } + + } + + public Object get(int index) { + if (index < 0 || index >= curSize) { + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node.data; + } + + public Object remove(int index) { + if (index < 0 || index >= curSize) { + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + if (index == 0) { + return removeFirst(); + } + + Node node = head; + for (int i = 1; i < index; i++) { + node = node.next; + } + Node t = node.next; + node.next=t.next; + curSize--; + return t.data; + } + + public int size() { + return curSize; + } + + public void addFirst(Object o) { + Node node = new Node(o, head); + head = node; + curSize++; + } + + public void addLast(Object o) { + add(o); + } + + public Object removeFirst() { + if (head == null) { + throw new NoSuchElementException(); + } + Node node = head; + head = head.next; + curSize--; + return node.data; + } + + public Object removeLast() { + if (head == null) { + throw new NoSuchElementException(); + } + Node node; + if (head.next == null) { + node = head; + head = null; + } else { + node = head; + while (node.next.next != null) { + node = node.next; + } + Node t = node.next; + node.next = null; + node = t; + } + curSize--; + return node.data; + } + + // 后面再实现 + public Iterator iterator() { + return new Itr(); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("["); + Node node = head; + while (node != null) { + builder.append(node.data).append(","); + node = node.next; + } + if (curSize>0) + builder.deleteCharAt(builder.length() - 1); + builder.append("]"); + return builder.toString(); + } + + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/List.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/List.java new file mode 100644 index 0000000000..4272bde587 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/List.java @@ -0,0 +1,9 @@ +package cn.net.pikachu.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Main.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Main.java new file mode 100644 index 0000000000..89eda11fbe --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Main.java @@ -0,0 +1,17 @@ +package cn.net.pikachu.basic; + +/** + * Created by pikachu on 17-2-21. + */ +public class Main { + public static void main(String[] args) { + LinkedList list = new LinkedList(); + for (int i = 0; i < 3; i++) { + list.add(i); + } + Iterator iterator = list.iterator(); + while (iterator.hasNext()){ + System.out.println(iterator.next()); + } + } +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Queue.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Queue.java new file mode 100644 index 0000000000..7e033d0885 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Queue.java @@ -0,0 +1,30 @@ +package cn.net.pikachu.basic; + +import java.util.NoSuchElementException; + +public class Queue { + private LinkedList list = new LinkedList(); + public void enQueue(Object o){ + list.addLast(o); + } + + public Object deQueue(){ + if (isEmpty()){ + throw new NoSuchElementException(); + } + return list.removeFirst(); + } + + public boolean isEmpty(){ + return list.size()==0; + } + + public int size(){ + return list.size(); + } + + @Override + public String toString() { + return list.toString(); + } +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Stack.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Stack.java new file mode 100644 index 0000000000..492d782b26 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Stack.java @@ -0,0 +1,33 @@ +package cn.net.pikachu.basic; + +import java.util.NoSuchElementException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (isEmpty()){ + throw new NoSuchElementException(); + } + return elementData.remove(elementData.size()-1); + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size()==0; + } + public int size(){ + return elementData.size(); + } + + @Override + public String toString() { + return elementData.toString(); + } +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyArrayList.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyArrayList.java new file mode 100644 index 0000000000..ea3998b7c4 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyArrayList.java @@ -0,0 +1,212 @@ +package cn.net.pikachu.other; + +import java.util.AbstractList; +import java.util.Objects; + +/** + * Created by pikachu on 17-2-19. + */ +public class MyArrayList extends AbstractList{ + // 当前能容纳的最大元素个数 + private int maxSize = 8; + // 当前数组已经有了的元素个数 + private int curSize = 0; + // 存放元素的数组 + private Object[] arr= new Object[curSize]; + /** + * {@inheritDoc} + * + * @param index + * @throws IndexOutOfBoundsException {@inheritDoc} + */ + @SuppressWarnings("unchecked") + public E get(int index) { + if (index<0 || index > curSize) { + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + return (E) arr[index]; + } + + public int size() { + return curSize; + } + + /** + * Appends the specified element to the end of this list (optional + * operation). + *

+ *

Lists that support this operation may place limitations on what + * elements may be added to this list. In particular, some + * lists will refuse to add null elements, and others will impose + * restrictions on the type of elements that may be added. List + * classes should clearly specify in their documentation any restrictions + * on what elements may be added. + *

+ *

This implementation calls {@code add(size(), e)}. + *

+ *

Note that this implementation throws an + * {@code UnsupportedOperationException} unless + * {@link #add(int, Object) add(int, E)} is overridden. + * + * @param e element to be appended to this list + * @return {@code true} + * @throws UnsupportedOperationException if the {@code add} operation + * is not supported by this list + * @throws ClassCastException if the class of the specified element + * prevents it from being added to this list + * @throws NullPointerException if the specified element is null and this + * list does not permit null elements + * @throws IllegalArgumentException if some property of this element + * prevents it from being added to this list + */ + @Override + public boolean add(E e) { + if (curSize>=maxSize){ + int t = maxSize; + int limit = 1024; + if(maxSizeset operation + * is not supported by this list + * @throws ClassCastException if the class of the specified element + * prevents it from being added to this list + * @throws NullPointerException if the specified element is null and + * this list does not permit null elements + * @throws IllegalArgumentException if some property of the specified + * element prevents it from being added to this list + * @throws IndexOutOfBoundsException if the index is out of range + * (index < 0 || index >= size()) + */ + @Override + @SuppressWarnings("unchecked") + public E set(int index, E element) { + if (index>curSize){ + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + E t = (E) arr[index]; + arr[index]=element; + return t; + } + + /** + * {@inheritDoc} + *

+ *

This implementation always throws an + * {@code UnsupportedOperationException}. + * + * @param index + * @throws UnsupportedOperationException {@inheritDoc} + * @throws IndexOutOfBoundsException {@inheritDoc} + */ + @Override + @SuppressWarnings("unchecked") + public E remove(int index) { + if (index>curSize){ + throw new IndexOutOfBoundsException(String.valueOf(index)); + } + E t = (E) arr[index]; + if (index + *

This implementation calls {@code removeRange(0, size())}. + *

+ *

Note that this implementation throws an + * {@code UnsupportedOperationException} unless {@code remove(int + * index)} or {@code removeRange(int fromIndex, int toIndex)} is + * overridden. + * + * @throws UnsupportedOperationException if the {@code clear} operation + * is not supported by this list + */ + @Override + public void clear() { + // 父类使用了迭代器 +// super.clear(); + curSize=0; + } + + /** + * {@inheritDoc} + *

+ *

This implementation first gets a list iterator (with + * {@code listIterator()}). Then, it iterates over the list until the + * specified element is found or the end of the list is reached. + * + * @param o + * @throws ClassCastException {@inheritDoc} + * @throws NullPointerException {@inheritDoc} + */ + @Override + public int indexOf(Object o) { + // 父类使用了迭代器 +// return super.indexOf(o); + for (int i = 0; i < curSize; i++) { + if (Objects.equals(o,arr[i])){ + return i; + } + } + return -1; + } + + /** + * {@inheritDoc} + *

+ *

This implementation returns size() == 0. + */ + @Override + public boolean isEmpty() { +// return super.isEmpty(); + return curSize==0; + } + + /** + * {@inheritDoc} + *

+ *

This implementation first gets a list iterator that points to the end + * of the list (with {@code listIterator(size())}). Then, it iterates + * backwards over the list until the specified element is found, or the + * beginning of the list is reached. + * + * @param o + * @throws ClassCastException {@inheritDoc} + * @throws NullPointerException {@inheritDoc} + */ + @Override + public int lastIndexOf(Object o) { + // 父类使用了迭代器 +// return super.lastIndexOf(o); + for (int i = curSize-1; i >=0; i--) { + if (Objects.equals(o,arr[i])){ + return i; + } + } + return -1; + } +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyLinkedList.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyLinkedList.java new file mode 100644 index 0000000000..9fd8341981 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyLinkedList.java @@ -0,0 +1,449 @@ +package cn.net.pikachu.other; + +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +/** + * Created by pikachu on 17-2-19. + */ +public class MyLinkedList extends AbstractSequentialList implements Deque { + private Node head = new Node(); + private Node tail = head; + private int curSize = 0; + /** + * Returns a list iterator over the elements in this list (in proper + * sequence). + * + * @param index index of first element to be returned from the list + * iterator (by a call to the next method) + * @return a list iterator over the elements in this list (in proper + * sequence) + * @throws IndexOutOfBoundsException {@inheritDoc} + */ + @Override + public ListIterator listIterator(int index) { + // TODO + throw new UnsupportedOperationException(); + } + + /** + * Inserts the specified element at the front of this deque if it is + * possible to do so immediately without violating capacity restrictions, + * throwing an {@code IllegalStateException} if no space is currently + * available. When using a capacity-restricted deque, it is generally + * preferable to use method {@link #offerFirst}. + * + * @param e the element to add + * @throws IllegalStateException if the element cannot be added at this + * time due to capacity restrictions + * @throws ClassCastException if the class of the specified element + * prevents it from being added to this deque + * @throws NullPointerException if the specified element is null and this + * deque does not permit null elements + * @throws IllegalArgumentException if some property of the specified + * element prevents it from being added to this deque + */ + @Override + public void addFirst(E e) { + head.next= new Node(e,head.next,head); + curSize++; + } + + /** + * Inserts the specified element at the end of this deque if it is + * possible to do so immediately without violating capacity restrictions, + * throwing an {@code IllegalStateException} if no space is currently + * available. When using a capacity-restricted deque, it is generally + * preferable to use method {@link #offerLast}. + *

+ *

This method is equivalent to {@link #add}. + * + * @param e the element to add + * @throws IllegalStateException if the element cannot be added at this + * time due to capacity restrictions + * @throws ClassCastException if the class of the specified element + * prevents it from being added to this deque + * @throws NullPointerException if the specified element is null and this + * deque does not permit null elements + * @throws IllegalArgumentException if some property of the specified + * element prevents it from being added to this deque + */ + @Override + public void addLast(E e) { + Node t = new Node(e,null,tail); + tail.next=t; + tail=t; + curSize++; + } + + /** + * Inserts the specified element at the front of this deque unless it would + * violate capacity restrictions. When using a capacity-restricted deque, + * this method is generally preferable to the {@link #addFirst} method, + * which can fail to insert an element only by throwing an exception. + * + * @param e the element to add + * @return {@code true} if the element was added to this deque, else + * {@code false} + * @throws ClassCastException if the class of the specified element + * prevents it from being added to this deque + * @throws NullPointerException if the specified element is null and this + * deque does not permit null elements + * @throws IllegalArgumentException if some property of the specified + * element prevents it from being added to this deque + */ + @Override + public boolean offerFirst(E e) { + throw new UnsupportedOperationException(); + } + + /** + * Inserts the specified element at the end of this deque unless it would + * violate capacity restrictions. When using a capacity-restricted deque, + * this method is generally preferable to the {@link #addLast} method, + * which can fail to insert an element only by throwing an exception. + * + * @param e the element to add + * @return {@code true} if the element was added to this deque, else + * {@code false} + * @throws ClassCastException if the class of the specified element + * prevents it from being added to this deque + * @throws NullPointerException if the specified element is null and this + * deque does not permit null elements + * @throws IllegalArgumentException if some property of the specified + * element prevents it from being added to this deque + */ + @Override + public boolean offerLast(E e) { + throw new UnsupportedOperationException(); + } + + /** + * Retrieves and removes the first element of this deque. This method + * differs from {@link #pollFirst pollFirst} only in that it throws an + * exception if this deque is empty. + * + * @return the head of this deque + * @throws NoSuchElementException if this deque is empty + */ + @Override + public E removeFirst() { + if (curSize==0){ + throw new NoSuchElementException(); + } + E e = head.e; + head=head.next; + curSize--; + return e; + } + + /** + * Retrieves and removes the last element of this deque. This method + * differs from {@link #pollLast pollLast} only in that it throws an + * exception if this deque is empty. + * + * @return the tail of this deque + * @throws NoSuchElementException if this deque is empty + */ + @Override + public E removeLast() { + if (curSize==0){ + throw new NoSuchElementException(); + } + // 怎么去去掉最后一个呢? + Node t=head; + while (t.next!=tail){ + t=t.next; + } + tail=t; + curSize--; + return t.next.e; + } + + /** + * Retrieves and removes the first element of this deque, + * or returns {@code null} if this deque is empty. + * + * @return the head of this deque, or {@code null} if this deque is empty + */ + @Override + public E pollFirst() { + throw new UnsupportedOperationException(); + } + + /** + * Retrieves and removes the last element of this deque, + * or returns {@code null} if this deque is empty. + * + * @return the tail of this deque, or {@code null} if this deque is empty + */ + @Override + public E pollLast() { + throw new UnsupportedOperationException(); + } + + /** + * Retrieves, but does not remove, the first element of this deque. + *

+ * This method differs from {@link #peekFirst peekFirst} only in that it + * throws an exception if this deque is empty. + * + * @return the head of this deque + * @throws NoSuchElementException if this deque is empty + */ + @Override + public E getFirst() { + return head.e; + } + + /** + * Retrieves, but does not remove, the last element of this deque. + * This method differs from {@link #peekLast peekLast} only in that it + * throws an exception if this deque is empty. + * + * @return the tail of this deque + * @throws NoSuchElementException if this deque is empty + */ + @Override + public E getLast() { + return tail.e; + } + + /** + * Retrieves, but does not remove, the first element of this deque, + * or returns {@code null} if this deque is empty. + * + * @return the head of this deque, or {@code null} if this deque is empty + */ + @Override + public E peekFirst() { + throw new UnsupportedOperationException(); + } + + /** + * Retrieves, but does not remove, the last element of this deque, + * or returns {@code null} if this deque is empty. + * + * @return the tail of this deque, or {@code null} if this deque is empty + */ + @Override + public E peekLast() { + throw new UnsupportedOperationException(); + } + + /** + * Removes the first occurrence of the specified element from this deque. + * If the deque does not contain the element, it is unchanged. + * More formally, removes the first element {@code e} such that + * (o==null ? e==null : o.equals(e)) + * (if such an element exists). + * Returns {@code true} if this deque contained the specified element + * (or equivalently, if this deque changed as a result of the call). + * + * @param o element to be removed from this deque, if present + * @return {@code true} if an element was removed as a result of this call + * @throws ClassCastException if the class of the specified element + * is incompatible with this deque + * (optional) + * @throws NullPointerException if the specified element is null and this + * deque does not permit null elements + * (optional) + */ + @Override + public boolean removeFirstOccurrence(Object o) { + Node t = head; + while (t.next!=null){ + if (Objects.equals(t.next.e,o)){ + t.next=t.next.next; + return true; + } + } + return false; + } + + /** + * Removes the last occurrence of the specified element from this deque. + * If the deque does not contain the element, it is unchanged. + * More formally, removes the last element {@code e} such that + * (o==null ? e==null : o.equals(e)) + * (if such an element exists). + * Returns {@code true} if this deque contained the specified element + * (or equivalently, if this deque changed as a result of the call). + * + * @param o element to be removed from this deque, if present + * @return {@code true} if an element was removed as a result of this call + * @throws ClassCastException if the class of the specified element + * is incompatible with this deque + * (optional) + * @throws NullPointerException if the specified element is null and this + * deque does not permit null elements + * (optional) + */ + @Override + public boolean removeLastOccurrence(Object o) { + return false; + } + + /** + * Inserts the specified element into the queue represented by this deque + * (in other words, at the tail of this deque) if it is possible to do so + * immediately without violating capacity restrictions, returning + * {@code true} upon success and {@code false} if no space is currently + * available. When using a capacity-restricted deque, this method is + * generally preferable to the {@link #add} method, which can fail to + * insert an element only by throwing an exception. + *

+ *

This method is equivalent to {@link #offerLast}. + * + * @param e the element to add + * @return {@code true} if the element was added to this deque, else + * {@code false} + * @throws ClassCastException if the class of the specified element + * prevents it from being added to this deque + * @throws NullPointerException if the specified element is null and this + * deque does not permit null elements + * @throws IllegalArgumentException if some property of the specified + * element prevents it from being added to this deque + */ + @Override + public boolean offer(E e) { + return false; + } + + /** + * Retrieves and removes the head of the queue represented by this deque + * (in other words, the first element of this deque). + * This method differs from {@link #poll poll} only in that it throws an + * exception if this deque is empty. + *

+ *

This method is equivalent to {@link #removeFirst()}. + * + * @return the head of the queue represented by this deque + * @throws NoSuchElementException if this deque is empty + */ + @Override + public E remove() { + return null; + } + + /** + * Retrieves and removes the head of the queue represented by this deque + * (in other words, the first element of this deque), or returns + * {@code null} if this deque is empty. + *

+ *

This method is equivalent to {@link #pollFirst()}. + * + * @return the first element of this deque, or {@code null} if + * this deque is empty + */ + @Override + public E poll() { + return null; + } + + /** + * Retrieves, but does not remove, the head of the queue represented by + * this deque (in other words, the first element of this deque). + * This method differs from {@link #peek peek} only in that it throws an + * exception if this deque is empty. + *

+ *

This method is equivalent to {@link #getFirst()}. + * + * @return the head of the queue represented by this deque + * @throws NoSuchElementException if this deque is empty + */ + @Override + public E element() { + return null; + } + + /** + * Retrieves, but does not remove, the head of the queue represented by + * this deque (in other words, the first element of this deque), or + * returns {@code null} if this deque is empty. + *

+ *

This method is equivalent to {@link #peekFirst()}. + * + * @return the head of the queue represented by this deque, or + * {@code null} if this deque is empty + */ + @Override + public E peek() { + return null; + } + + /** + * Pushes an element onto the stack represented by this deque (in other + * words, at the head of this deque) if it is possible to do so + * immediately without violating capacity restrictions, throwing an + * {@code IllegalStateException} if no space is currently available. + *

+ *

This method is equivalent to {@link #addFirst}. + * + * @param e the element to push + * @throws IllegalStateException if the element cannot be added at this + * time due to capacity restrictions + * @throws ClassCastException if the class of the specified element + * prevents it from being added to this deque + * @throws NullPointerException if the specified element is null and this + * deque does not permit null elements + * @throws IllegalArgumentException if some property of the specified + * element prevents it from being added to this deque + */ + @Override + public void push(E e) { + + } + + /** + * Pops an element from the stack represented by this deque. In other + * words, removes and returns the first element of this deque. + *

+ *

This method is equivalent to {@link #removeFirst()}. + * + * @return the element at the front of this deque (which is the top + * of the stack represented by this deque) + * @throws NoSuchElementException if this deque is empty + */ + @Override + public E pop() { + return null; + } + + @Override + public int size() { + return 0; + } + + /** + * Returns an iterator over the elements in this deque in reverse + * sequential order. The elements will be returned in order from + * last (tail) to first (head). + * + * @return an iterator over the elements in this deque in reverse + * sequence + */ + @NotNull + @Override + public Iterator descendingIterator() { + return null; + } +} +class Node{ + public E e; + public Node next; + public Node prev; + public Node() { + } + + public Node(E e) { + this.e = e; + } + + public Node(E e, Node next, Node prev) { + this.e = e; + this.next = next; + this.prev = prev; + } +} \ No newline at end of file diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyQueue.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyQueue.java new file mode 100644 index 0000000000..0179d5ef63 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyQueue.java @@ -0,0 +1,7 @@ +package cn.net.pikachu.other; + +/** + * Created by pikachu on 17-2-19. + */ +public class MyQueue { +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyStack.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyStack.java new file mode 100644 index 0000000000..714c43e2a3 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyStack.java @@ -0,0 +1,7 @@ +package cn.net.pikachu.other; + +/** + * Created by pikachu on 17-2-19. + */ +public class MyStack { +} diff --git a/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyTree.java b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyTree.java new file mode 100644 index 0000000000..42e226aa5f --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyTree.java @@ -0,0 +1,7 @@ +package cn.net.pikachu.other; + +/** + * Created by pikachu on 17-2-19. + */ +public class MyTree { +} diff --git a/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/ArrayListTest.java b/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/ArrayListTest.java new file mode 100644 index 0000000000..8519eee121 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/ArrayListTest.java @@ -0,0 +1,92 @@ +package cn.net.pikachu.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by pikachu on 17-2-20. + */ +public class ArrayListTest { + ArrayList list; + @Before + public void before(){ + list=new ArrayList(); + } + @Test + public void testAdd(){ + list.add(1); + Assert.assertEquals("[1]",list.toString()); + Assert.assertEquals(1,list.size()); + list.add(0,0); + Assert.assertEquals("[0,1]",list.toString()); + Assert.assertEquals(2,list.size()); + list.add(1,2); + Assert.assertEquals("[0,2,1]",list.toString()); + Assert.assertEquals(3,list.size()); + + } + @Test(expected = IndexOutOfBoundsException.class) + public void testRemove(){ + list.add(1); + list.remove(0); + Assert.assertEquals("[]",list.toString()); + Assert.assertEquals(0,list.size()); + list.add(2); + list.add(3); + list.add(4); + Object o =list.remove(1); + Assert.assertEquals(3,o); + Assert.assertEquals("[2,4]",list.toString()); + Assert.assertEquals(2,list.size()); + list.remove(4); + } + @Test(expected = IndexOutOfBoundsException.class) + public void testGet(){ + list.add(1); + list.add(2); + list.add(3); + list.add(4); + Assert.assertEquals(1,list.get(0)); + Assert.assertEquals(4,list.get(3)); + Assert.assertEquals(4,list.size()); + list.get(4); + } + @Test + public void testSize(){ + Assert.assertEquals(0,list.size()); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + Assert.assertEquals(4,list.size()); + } + @Test + public void testIterator(){ + list.add(1); + list.add(2); + list.add(3); + list.add(4); + Iterator iterator = list.iterator(); + StringBuilder builder = new StringBuilder(); + builder.append("["); + while (iterator.hasNext()){ + builder.append(iterator.next()).append(","); + } + builder.deleteCharAt(builder.length()-1); + builder.append("]"); + Assert.assertEquals(builder.toString(),list.toString()); + } + /* + // 抛出异常的测试 + @Test(expected = IndexOutOfBoundsException.class) + public void testRemoveWithException(){ + list.remove(2); + } + // 超时测试 + @Test(timeout = 2000) + public void test(){ + while (true); + } + */ +} diff --git a/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/BinaryTreeNodeTest.java b/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..fcf666412f --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/BinaryTreeNodeTest.java @@ -0,0 +1,56 @@ +package cn.net.pikachu.basic; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** +* BinaryTreeNode Tester. +* +* @author pikachu +* @since

二月 25, 2017
+* @version 1.0 +*/ +public class BinaryTreeNodeTest { + + BinaryTreeNode tree; + @Before + public void before() throws Exception { + tree = new BinaryTreeNode(); + } + + @After + public void after() throws Exception { + + } + + /** + * + * Method: insert(Object o) + * + */ + @Test + public void testInsert() { + for (int i = 0; i < 4; i++) { + tree.insert(i); + } + final StringBuilder builder = new StringBuilder(); + BinaryTreeNode.Visit visit = new BinaryTreeNode.Visit() { + @Override + public void visit(Object o) { + builder.append(o).append(","); + } + }; + builder.append("["); + tree.inOrderTraversal(visit,tree); + if (builder.length()>2){ + builder.deleteCharAt(builder.length()-1); + } + builder.append("]"); + Assert.assertEquals("[0,1,2,3]",builder.toString()); + + } + + +} diff --git a/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/LinkedListTest.java b/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/LinkedListTest.java new file mode 100644 index 0000000000..361007228a --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/LinkedListTest.java @@ -0,0 +1,116 @@ +package cn.net.pikachu.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by pikachu on 17-2-25. + */ +public class LinkedListTest { + + LinkedList list; + @Before + public void before(){ + list = new LinkedList(); + } + @Test + public void testAdd(){ + list.add(1); + Assert.assertEquals("[1]",list.toString()); + Assert.assertEquals(1,list.size()); + list.add(0,0); + Assert.assertEquals("[0,1]",list.toString()); + Assert.assertEquals(2,list.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testRemove(){ + list.add(1); + list.remove(0); + Assert.assertEquals("[]",list.toString()); + Assert.assertEquals(0,list.size()); + list.add(2); + list.add(3); + list.add(4); + Object o =list.remove(1); + Assert.assertEquals(3,o); + Assert.assertEquals("[2,4]",list.toString()); + Assert.assertEquals(2,list.size()); + list.remove(4); + } + @Test(expected = IndexOutOfBoundsException.class) + public void testGet(){ + list.add(1); + list.add(2); + list.add(3); + list.add(4); + Assert.assertEquals(1,list.get(0)); + Assert.assertEquals(4,list.get(3)); + Assert.assertEquals(4,list.size()); + list.get(4); + } + @Test + public void testAddFirst(){ + list.add(1); + list.add(2); + list.add(3); + list.addFirst(0); + Assert.assertEquals(4,list.size()); + Assert.assertEquals(0,list.get(0)); + Assert.assertEquals("[0,1,2,3]",list.toString()); + } + @Test + public void testAddLast(){ + list.add(1); + list.add(2); + list.add(3); + list.addLast(4); + Assert.assertEquals(4,list.size()); + Assert.assertEquals(4,list.get(3)); + Assert.assertEquals("[1,2,3,4]",list.toString()); + } + @Test + public void testRemoveFirst(){ + list.add(1); + list.add(2); + list.add(3); + list.removeFirst(); + Assert.assertEquals(2,list.size()); + Assert.assertEquals("[2,3]",list.toString()); + } + @Test + public void testRemoveLast(){ + list.add(1); + list.add(2); + list.add(3); + list.removeLast(); + Assert.assertEquals(2,list.size()); + Assert.assertEquals("[1,2]",list.toString()); + } + @Test + public void testSize(){ + Assert.assertEquals(0,list.size()); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + Assert.assertEquals(4,list.size()); + } + @Test + public void testIterator(){ + list.add(1); + list.add(2); + list.add(3); + list.add(4); + Iterator iterator = list.iterator(); + StringBuilder builder = new StringBuilder(); + builder.append("["); + while (iterator.hasNext()){ + builder.append(iterator.next()).append(","); + } + builder.deleteCharAt(builder.length()-1); + builder.append("]"); + Assert.assertEquals(builder.toString(),list.toString()); + } +} diff --git a/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/QueueTest.java b/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/QueueTest.java new file mode 100644 index 0000000000..ef115315d8 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/QueueTest.java @@ -0,0 +1,57 @@ +package cn.net.pikachu.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.NoSuchElementException; + +/** + * Created by pikachu on 17-2-25. + */ +public class QueueTest { + Queue queue; + @Before + public void before(){ + queue = new Queue(); + } + @Test + public void testEnQueue(){ + for (int i = 0; i < 4; i++) { + queue.enQueue(i); + } + Assert.assertEquals("[0,1,2,3]",queue.toString()); + Assert.assertEquals(4,queue.size()); + } + @Test(expected= NoSuchElementException.class) + public void testDeQueue(){ + for (int i = 0; i < 4; i++) { + queue.enQueue(i); + } + for (int i=0;i<4;i++) { + Assert.assertEquals(i,queue.deQueue()); + } + queue.deQueue(); + + } + @Test + public void testIsEmpty(){ + Assert.assertEquals(true,queue.isEmpty()); + queue.enQueue(1); + Assert.assertEquals(false,queue.isEmpty()); + queue.deQueue(); + Assert.assertEquals(true,queue.isEmpty()); + } + @Test + public void testSize(){ + for (int i = 0; i < 4; i++) { + Assert.assertEquals(i,queue.size()); + queue.enQueue(i); + } + for (int i = 4; i > 0; i--) { + Assert.assertEquals(i,queue.size()); + queue.deQueue(); + } + Assert.assertEquals(0,queue.size()); + } +} diff --git a/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/StackTest.java b/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/StackTest.java new file mode 100644 index 0000000000..deea464a23 --- /dev/null +++ b/group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/StackTest.java @@ -0,0 +1,105 @@ +package cn.net.pikachu.basic; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import java.util.*; + +/** +* Stack Tester. +* +* @author pikachu +* @since
二月 25, 2017
+* @version 1.0 +*/ +public class StackTest { + + Stack stack; + @Before + public void before() throws Exception { + stack = new Stack(); + } + + @After + public void after() throws Exception { + + } + + /** + * + * Method: push(Object o) + * + */ + @Test + public void testPush() { + Assert.assertEquals("[]",stack.toString()); + for (int i = 0; i < 4; i++) { + stack.push(i); + } + Assert.assertEquals("[0,1,2,3]",stack.toString()); + } + + /** + * + * Method: pop() + * + */ + @Test + public void testPop() { + for (int i = 0; i < 4; i++) { + stack.push(i); + } + for (int i = 3; i >= 0; i--) { + Assert.assertEquals(i,stack.pop()); + } + } + + /** + * + * Method: peek() + * + */ + @Test + public void testPeek() { + for (int i = 0; i < 4; i++) { + stack.push(i); + Assert.assertEquals(i,stack.peek()); + } + } + + /** + * + * Method: isEmpty() + * + */ + @Test + public void testIsEmpty() { + Assert.assertEquals(true,stack.isEmpty()); + for (int i = 0; i < 4; i++) { + stack.push(i); + } + Assert.assertEquals(false,stack.isEmpty()); + for (int i = 0; i < 4; i++) { + stack.pop(); + } + Assert.assertEquals(true,stack.isEmpty()); + } + + /** + * + * Method: size() + * + */ + @Test + public void testSize() { + for (int i = 0; i < 4; i++) { + Assert.assertEquals(i,stack.size()); + stack.push(i); + } + Assert.assertEquals(4,stack.size()); + } + + +} diff --git a/group13/413007522/.gitignore b/group13/413007522/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group13/413007522/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group13/413007522/lesson01/.gitignore b/group13/413007522/lesson01/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group13/413007522/lesson01/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group13/413007522/lesson01/pom.xml b/group13/413007522/lesson01/pom.xml new file mode 100644 index 0000000000..b90f06b534 --- /dev/null +++ b/group13/413007522/lesson01/pom.xml @@ -0,0 +1,7 @@ + + 4.0.0 + cn.xl + lesson01_code + 0.0.1-SNAPSHOT + lesson01_code + \ No newline at end of file diff --git a/group13/413007522/lesson01/src/main/java/cn/xl/MyArrayList.java b/group13/413007522/lesson01/src/main/java/cn/xl/MyArrayList.java new file mode 100644 index 0000000000..80464455e4 --- /dev/null +++ b/group13/413007522/lesson01/src/main/java/cn/xl/MyArrayList.java @@ -0,0 +1,238 @@ +package cn.xl; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; + + +/** + * 1. ArrayList һУ൱ڶ̬顣JavaԱ̬ܶӣ + * 2. ӵӡɾ޸ġȹܡ + * @author XIAOLONG + * + * @param + */ + +public class MyArrayList implements MyList { + + + private int size = 0; + + private final int initialCapacity = 3; + + private Object[] elementData = new Object[100]; + + private static final Object[] EMPTY_ELEMENTDATA = {}; + + private int modCount = 0; + + /** + * һĬϳʼΪ3Ŀб + * + */ + public MyArrayList() { + elementData = new Object[initialCapacity]; + } + + /** + * һָʼĿб + * @param initialCapacity + */ + public MyArrayList(int initialCapacity) { + + if (initialCapacity < 0){ + throw new IllegalArgumentException("Illegal initialCapacity: "+ initialCapacity); + }else if(initialCapacity == 0){ + elementData = EMPTY_ELEMENTDATA; + }else{ + elementData = new Object[this.initialCapacity]; + } + } + + /** + * + * һָcollectionԪصбЩԪذոcollectionĵǵ˳ + * MySubClassMyClassࡣ + * Collection myCollection; + * Collection mySubCollection; + * ArrayList myList = new ArrayList(myCollection); + * ҲԣArrayList myList = new ArrayList(mySubCollection); + * MyClassMyClassCollectionԹArrayList + * @param c + */ + public MyArrayList(Collection c) { + elementData = c.toArray(); + if((size = elementData.length) != 0){ + //c.toArray might (incorrectly) not return Object[] (see 6260652) + //ٷbugתͲȫ + //Object[]Arrays.copyOfתΪObject[] + if (elementData.getClass() != Object[].class) + elementData = Arrays.copyOf(elementData, size, Object[].class); + }else{ + elementData = EMPTY_ELEMENTDATA; + } + } + + + /** + * ָԪбָλϵԪ + * @param index + * @param element + * @return Object(ǰλڸλϵľԪ) + */ + public Object set(int index, Object element) { + if (index >= size()) + throw new RuntimeException("The Index: "+index+" is out of band."); + + Object oldValue = elementData[index]; + elementData[index] = element; + return oldValue; + } + + /** + * Ԫбβ + * @param e + */ + public void add(Object e) { + if (e == null) { + throw new RuntimeException("The value should not be null."); + } + if (size() >= initialCapacity) { + ensureCapacity(size() + 1); + } + elementData [size] = e; + size++; + } + + /** + * Ԫӵбָλ + * @param index + * @param element + */ + public void add(int index, Object o) { + if (index >= size || index < 0) + throw new RuntimeException("The Index: "+index+" is out of band."); + // 鳤Ȳ㣬ݡ + ensureCapacity(size+1); + // elementDataдIndexλÿʼΪsize-indexԪأ + // ±Ϊindex+1λÿʼµelementDataС + // ǰλڸλõԪԼкԪһλá + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + + /** + * شбָλϵԪ + * @param index + * @return + */ + public Object get(int index) { + if (index >= size) { + throw new RuntimeException("The index:" + index + " is out of band."); + } + return elementData [index]; + } + + /** + * ɾָλԪ + * @param ɾԪλã0ʼ + * @return Object(ɾָλϵľԪ) + */ + public Object remove(int index) { + if (index >= size) { + throw new RuntimeException("The index:" + index + " is out of band."); + } + modCount++; + Object oldElement = elementData[index]; + //˴ȻҲSystem.arraycopy ʵ + for (int i = index; i < size - 1; i++) { + elementData [i] = elementData [i + 1]; + } + elementData [size - 1] = null; + size--; + return oldElement; + } + + /** + * ݣÿռΪ 50%+1 + * @param ǰСֵ + */ + private void ensureCapacity(int minCapacity) { + modCount++; + int oldCapacity = elementData.length; + if (minCapacity > oldCapacity) { + //λ㣬൱ڳ2Щ int newCapacity = (oldCapacity * 3)/2 + 1; + int newCapacity = oldCapacity + (oldCapacity >> 1); + if (newCapacity < minCapacity) + newCapacity = minCapacity; + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + /** + * ListеԪظ. + * @return ListеԪظ + */ + public int size() { + return size; + } + + /** + * ListԪеһ + * @return ListԪеĵ + */ + public Iterator iterator() { + return new Itr(); + } + + private class Itr implements Iterator { + int cursor; // һԪصλ + int lastRet = -1; // һԪصλ + int expectedModCount = modCount; + + public boolean hasNext() { + return cursor != size; + } + + public Object next() { + + if (modCount != expectedModCount){ + throw new RuntimeException("This list is being modified."); + + } + + int i = cursor; + if (i >= size){ + throw new RuntimeException("No such element."); + } + Object[] elementData = MyArrayList.this.elementData; + if (i >= elementData.length){ + throw new RuntimeException("This list is being modified."); + } + + cursor = i + 1; + return elementData[lastRet = i]; + } + + public void remove() { + if (lastRet < 0) + throw new IllegalStateException(); + + if (modCount != expectedModCount){ + throw new RuntimeException("This list is being modified."); + + } + + try { + MyArrayList.this.remove(lastRet); + cursor = lastRet; + lastRet = -1; + expectedModCount = modCount; + } catch (IndexOutOfBoundsException ex) { + throw new RuntimeException("This list is being modified."); + } + } + } + +} diff --git a/group13/413007522/lesson01/src/main/java/cn/xl/MyLinkedList.java b/group13/413007522/lesson01/src/main/java/cn/xl/MyLinkedList.java new file mode 100644 index 0000000000..ee4c4e461e --- /dev/null +++ b/group13/413007522/lesson01/src/main/java/cn/xl/MyLinkedList.java @@ -0,0 +1,218 @@ +package cn.xl; + +import java.util.Iterator; + +/** + * + * @author XIAOLONG + * @param + * + */ +public class MyLinkedList implements MyList { + + private int size = 0; + + private Node first; + + private Node last; + + + /** + * һ޲ι캯һList + * + */ + public MyLinkedList(){ + + } + + + + /** + * Ԫбβ + * @param Object(ӵԪ) + */ + public void add(Object o) { + + addLast(o); + } + + + /** + * бָλԪ,ǾԪ + * @param index λãObject Ԫ + */ + public void add(int index, Object o) { + + if(!(index >= 0 && index <= size())){ + throw new RuntimeException("The index"+index+"is out of band."); + } + + Node x = node(index); + x.data = o; + + } + + /** + * ȡָλõԪdata + * @param index ҪȡԪλ + */ + public Object get(int index) { + + if(!(index >= 0 && index <= size())){ + throw new RuntimeException("The index"+index+"is out of band."); + } + + return node(index).data; + } + + + /** + * ɾָλԪ + * @param index ɾбԪλ + */ + public Object remove(int index) { + + if(!(index >= 0 && index <= size())){ + throw new RuntimeException("The index"+index+"is out of band."); + } + + final Node node = node(index); + final Object o = node.data; + if(first.equals(node)){ + removeFirst(); + }else if(last.equals(node)){ + removeLast(); + }else{ + final Node prev = node.prev; + final Node next = node.next; + + prev.next = next; + next.prev = prev; + node.prev = null; + node.next = null; + } + node.data = null; + size --; + return o; + } + + + /** + * ȡбǰsize + */ + public int size() { + return size; + } + + /** + * ͷԪ,ͷԪΪգøԪͬʱΪβԪ + * @param Object ӵͷԪأ + */ + public void addFirst(Object o){ + + final Node f = first; + final Node newNode = new Node(null,o,f); + if(f == null){ + last = newNode; + }else{ + f.prev = newNode; + } + size ++; + } + + /** + * βԪأβԪΪգͬʱøԪΪͷԪ + * @param Object(ӵβԪ) + */ + public void addLast(Object o){ + + final Node l = last; + final Node newNode = new Node(l,o,null); + if(l == null){ + first = newNode; + }else{ + l.next = newNode; + } + size ++; + } + + /** + * ƳһԪأƳԺбΪ first = next = null + * @return ƳԪ + */ + public Object removeFirst(){ + + final Node f = first; + final Object o = f.data; + final Node next = f.next ; + f.next = null; + f.data = null; + first = next; + if(next == null){ + last = next; + }else{ + next.prev = null; + } + size --; + return o; + } + + /** + * ƳһԪ + * @return ƳԪ + */ + public Object removeLast(){ + + final Node l = last; + final Object o = l.data; + final Node prev = l.prev; + l.data = null; + l.prev = null; + last = prev; + if(prev == null){ + last = null; + }else{ + prev.next = null; + } + size --; + return o; + } + public Iterator iterator(){ + return null; + } + + /** + * Nodeڲ + * + */ + private static class Node{ + Object data; + Node next; + Node prev; + + Node(Node prev,Object o,Node next){ + this.data = o; + this.next = next; + this.prev = prev; + } + } + + /** + * һȡ±λnodeķ + * ǰ±Сlistȵһ䣬ͷʼ βʼ + * @param index Ԫصλ + */ + private Node node(int index){ + if (index < (size >> 1)) { + Node x = first; + for (int i = 0; i < index; i++) + x = x.next; + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) + x = x.prev; + return x; + } + } +} diff --git a/group13/413007522/lesson01/src/main/java/cn/xl/MyList.java b/group13/413007522/lesson01/src/main/java/cn/xl/MyList.java new file mode 100644 index 0000000000..f9769ba33a --- /dev/null +++ b/group13/413007522/lesson01/src/main/java/cn/xl/MyList.java @@ -0,0 +1,9 @@ +package cn.xl; + +public interface MyList { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group13/413007522/lesson01/src/main/java/cn/xl/MyQueue.java b/group13/413007522/lesson01/src/main/java/cn/xl/MyQueue.java new file mode 100644 index 0000000000..cd61cfd8c8 --- /dev/null +++ b/group13/413007522/lesson01/src/main/java/cn/xl/MyQueue.java @@ -0,0 +1,110 @@ +package cn.xl; + +/** + * Queue一个先进先出(first in first out,FIFO)得队列 + * 所谓的队列,也是一个含有至少两个基本操作的抽象数据类型:插入新的元素;删除最久时间插入的元素。 + * 遵循FIFO(First in,first out,先进先出)的原则。 + * MyQueue采用环形数组实现 + * @author XIAOLONG + * + */ +public class MyQueue { + + private int size,head,tail; + + private Object[] elementData; + + private final int initialCapacity = 4; + + public MyQueue(){ + + head = tail = -1; + elementData = new Object[initialCapacity]; + + } + + /** + * 向队列中添加元素 + * @param o + */ + public void enQueue(Object o){ + + ensureCapacity(); + + if( head == -1) { + tail = head = 0; + } + size ++; + elementData[tail] = o; + tail ++; + + + } + + /** + * 删除栈顶元素,并返回旧栈顶元素 + * @return 旧栈顶元素 + */ + public Object deQueue(){ + Object element = elementData[head]; + if(head == tail){ + head = tail = -1; + }else if(head == elementData.length-1){ + head = 0; + }else{ + head ++; + } + size --; + return element; + } + + /** + * 判断队列是否为空 + * @return + */ + public boolean isEmpty(){ + return head == -1; + } + + /** + * 返回自身长度 + * @return + */ + public int size(){ + return size; + } + + /** + * 判断队列是否已满 + * @return + */ + public boolean isFull() { + return (head == 0 && tail == elementData.length); + } + + /** + * 扩展容量,如果队列有效数据已经占满空间则增加2,否则覆盖无效数据,重新分配数据空间 + * @param 当前队列所需最小容量size + */ + private void ensureCapacity(){ + + if(isFull()){ + Object [] oldData = elementData; + elementData = new Object[elementData.length + 2]; + System.arraycopy(oldData, head,elementData , 0, oldData.length); + }else if(head > 0){ + Object [] oldData = elementData; + System.arraycopy(oldData, head,elementData , 0, oldData.length-head); + tail = tail - head ; + head = 0; + } + } + + + + public static void main(String[] args) + { + + + } +} diff --git a/group13/413007522/lesson01/src/main/java/cn/xl/MyStack.java b/group13/413007522/lesson01/src/main/java/cn/xl/MyStack.java new file mode 100644 index 0000000000..ac78828f5c --- /dev/null +++ b/group13/413007522/lesson01/src/main/java/cn/xl/MyStack.java @@ -0,0 +1,124 @@ +package cn.xl; + +import java.util.Arrays; +import java.util.EmptyStackException; + +/** + * Stackһȳlast in first outLIFOĶջ + * VectorĻչ5 + * @author XIAOLONG + * + */ +public class MyStack { + + private int elementCount; + + private Object[] elementData; + + /** + * ޲ι췽һջ + * + */ + public MyStack(){ + + } + + + /** + * Ԫջ + * @param item + * @return ջԪ + */ + public synchronized Object push(Object item){ + + ensureCapacity(elementCount+1); + elementData[elementCount] = item; + elementCount ++; + return item; + } + + /** + * ջԪƳظԪ + * @return ջԪ + */ + public synchronized Object pop(){ + Object obj; + + obj = peek(); + elementCount --; + elementData[elementCount] = null; + + return obj; + } + + /** + * 鿴ջԪ + * + * @return ջԪ + * @throws ջΪ ׳ EmptyStackException쳣 . + */ + public synchronized Object peek(){ + int len = elementCount; + + if(len == 0) + throw new EmptyStackException(); + + return elementData[len - 1]; + + } + + /** + * ջǷΪ + * + * @return True or false + */ + public boolean isEmpty(){ + + return elementCount == 0; + } + + /** + * ѯռջǷijԪ + * @param ѯԪ + * @return ԪشڷԪλãջԪλΪ1 + * Ԫջظ򷵻ؾջԪλã + * Ԫջвڣ򷵻 -1 + */ + public synchronized int search(Object o){ + + if(o == null){ + for(int i = elementCount -1;i >= 0; i--){ + if(elementData[i] == null){ + return elementCount - i; + } + } + }else{ + for(int i = elementCount -1;i >= 0; i-- ){ + if(o.equals(elementData[i])){ + return elementCount - i; + } + } + } + + return -1; + } + + /** + * չһ + * @param ǰջСsize + */ + private void ensureCapacity(int minCapacity){ + int oldCapacity = elementData.length; + if(minCapacity > oldCapacity){ + int newCapacity = oldCapacity << 1; + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + public static void main(String[] args){ + + + + } + +} diff --git a/group13/453070251/lessones01/BinaryTreeNode.java b/group13/453070251/lessones01/BinaryTreeNode.java new file mode 100644 index 0000000000..f5d8c5dacd --- /dev/null +++ b/group13/453070251/lessones01/BinaryTreeNode.java @@ -0,0 +1,23 @@ +public class BinaryTreeNode{ + public BinaryTreeNode left; + public BinaryTreeNode right; + public int value; + public BinaryTreeNode(int arg_value){ + value = arg_value; + } + public void add(int arg_value){ + if(arg_valuevalue){ + if(right == null){ + right = new BinaryTreeNode(arg_value); + }else{ + right.add(arg_value); + } + } + } +} \ No newline at end of file diff --git a/group13/453070251/lessones01/LinkedList.java b/group13/453070251/lessones01/LinkedList.java new file mode 100644 index 0000000000..c1cefc463f --- /dev/null +++ b/group13/453070251/lessones01/LinkedList.java @@ -0,0 +1,116 @@ +public class LinkedList{ + public static void main(String[] args){ + LinkedList arr = new LinkedList(); + arr.add("0"); + System.out.println(arr.get(0)); + + System.out.println(arr.get(1)); + arr.add("1"); + System.out.println(arr.get(1)); + + + System.out.println(arr.get(3)); + arr.add("3",3); + System.out.println(arr.get(3)); + arr.add("before 2",2); + System.out.println(arr.get(2)); + System.out.println(arr.get(4)); + arr.set(4,"4"); + System.out.println(arr.get(4)); + arr.set(8,"8"); + System.out.println(arr.get(8)); + + } + protected Node first; + protected Node lastest; + private int size; + public LinkedList(){ + lastest = first = new Node(null); + size = 0; + } + public T get(int arg_num){ + //throw Error if arg_num<0,unfinished + return _get(arg_num); + } + public void set(int arg_num,T arg_value){ + //throw Error if arg_num<0,unfinished + _set(arg_num,arg_value); + } + public T remove(int arg_num){ + //throw Error if arg_num<0,unfinished + return _remove(arg_num).value; + } + public void add(T arg_value,int arg_num){ + //throw Error if arg_num<0,unfinished + _add(arg_value,arg_num); + } + public void add(T arg_value){ + _add(arg_value,size); + } + public int size(){ + return size; + } + protected Node _remove(int arg_num){ + if(arg_num node = _getNode(arg_num); + node.remove(); + size--; + if(arg_num == size){ + lastest = node.left; + }else if(arg_num == 0 && size != 0){ + first = node.right; + } + return node; + }else{ + return null; + } + } + protected Node _getNode(int arg_num){ + Node node = first; + for(int num = 0;num=size){return null;} + return _getNode(arg_num).value; + } + protected void _set(int arg_num,T arg_value){ + if(arg_num>=size){ + _add(arg_value,arg_num); + }else{ + _getNode(arg_num).value = arg_value; + } + } + protected void _add(T arg_value,int arg_num){ + if(arg_num > size){ + Node n = new Node(null); + lastest.setRight(n); + for(int num=size+1;num(null)); + n = n.right; + } + n.setRight(new Node(arg_value)); + lastest = n.right; + size = arg_num+1; + }else if(arg_num == size){ + if(size == 0){ + lastest.value = arg_value; + }else{ + lastest.setRight(new Node(arg_value)); + lastest = lastest.right; + } + size++; + }else if(arg_num == 0){ + first.setLeft(new Node(arg_value)); + first = first.left; + size++; + }else{ + Node node = _getNode(arg_num); + node.addLeft(new Node(arg_value)); + size++; + } + + } +} \ No newline at end of file diff --git a/group13/453070251/lessones01/LinkedListWithFloat.java b/group13/453070251/lessones01/LinkedListWithFloat.java new file mode 100644 index 0000000000..803faa43d3 --- /dev/null +++ b/group13/453070251/lessones01/LinkedListWithFloat.java @@ -0,0 +1,86 @@ +public class LinkedListWithFloat extends LinkedList{ + public static void main(String[] args){ + LinkedListWithFloat arr = new LinkedListWithFloat(); + arr.add("0"); + System.out.println(arr.get(0)); + arr.add("1"); + System.out.println(arr.get(1)); + + System.out.println(arr.get(3)); + arr.add("3",3); + System.out.println(arr.get(3)); + arr.add("before 2",2); + System.out.println(arr.get(2)); + System.out.println(arr.get(4)); + arr.set(4,"4"); + System.out.println(arr.get(4)); + arr.set(8,"8"); + System.out.println(arr.get(8)); + System.out.println(arr.remove(8)); + System.out.println(arr.get(8)); + System.out.println(arr.remove(2)); + System.out.println(arr.get(2)); + System.out.println(arr.remove(0)); + System.out.println(arr.get(0)); + System.out.println(arr.size()); + } + + private Node floatNode; + private int floatNum; + public LinkedListWithFloat(){ + super(); + floatNode = first; + floatNum = 0; + } + protected Node _getNode(int arg_num){ + int position = arg_num - floatNum; + if(position == 0){return floatNode;} + //arg_num = (int leftPosition = arg_num); + int rightPosition = size() - 1 - arg_num; + boolean floatNear = position * position <= arg_num * rightPosition; + if(floatNear){ + if(position>0){ + return findFloatRight(arg_num); + }else/*if(position<0)*/{ + return findFloatLeft(arg_num); + } + }else if(position<0){ + floatNode = first; + floatNum = 0; + return findFloatRight(arg_num); + }else/*if(position>0)*/{ + floatNode = lastest; + floatNum = rightPosition + arg_num;//size()-1 + return findFloatLeft(arg_num); + } + } + protected void _add(T arg_value,int arg_num){ + super._add(arg_value,arg_num); + if(arg_num <= floatNum){floatNum++;} + } + protected Node _remove(int arg_num){ + Node temp = super._remove(arg_num); + if(temp == null){return temp;} + if(temp.right != null){ + floatNode = temp.right; + }else{ + floatNode = lastest; + floatNum = size()-1; + } + return temp; + } + private Node findFloatLeft(int arg_num){ + for(;floatNum>arg_num;){ + floatNode = floatNode.left; + floatNum--; + } + return floatNode; + } + private Node findFloatRight(int arg_num){ + for(;floatNum{ + public Node left; + public Node right; + public T value; + public Node(T arg_value){ + value = arg_value; + } + public void setLeft(Node arg_another){ + _connect(arg_another,this); + } + public void setRight(Node arg_another){ + _connect(this,arg_another); + } + public void addLeft(Node arg_another){ + _connect(left,arg_another,this); + } + public void addRight(Node arg_another){ + _connect(this,arg_another,right); + } + public Node remove(){ + _connect(left,right); + return this; + } + private void _connect(Node arg_left,Node arg_right){ + if(arg_left != null){arg_left.right = arg_right;} + if(arg_right != null){arg_right.left = arg_left;} + } + private void _connect(Node arg_left,Node node,Node arg_right){ + _connect(arg_left,node); + _connect(node,arg_right); + } +} \ No newline at end of file diff --git a/group13/453070251/lessones01/Queue.java b/group13/453070251/lessones01/Queue.java new file mode 100644 index 0000000000..6e54c1add2 --- /dev/null +++ b/group13/453070251/lessones01/Queue.java @@ -0,0 +1,40 @@ +public class Queue{ + Node first; + Node lastest; + private int size; + public Queue(){ + first = lastest = new Node(null); + size = 0; + } + public int size(){ + return size; + } + public Queue push_back(T arg_value){ + if(size == 0){ + first.value = arg_value; + }else{ + lastest.setRight(new Node(arg_value)); + lastest = lastest.right; + } + size++; + return this; + } + public T pop_front(){ + if(size > 0){size--;}; + if(size == 0){ + T temp; + temp = first.value; + first.value = null; + return temp; + }else{ + first = first.right; + return first.left.remove().value; + } + } + public T front(){ + return first.value; + } + public T back(){ + return lastest.value; + } +} \ No newline at end of file diff --git a/group13/453070251/lessones01/Stack.java b/group13/453070251/lessones01/Stack.java new file mode 100644 index 0000000000..a87cb59268 --- /dev/null +++ b/group13/453070251/lessones01/Stack.java @@ -0,0 +1,40 @@ +public class Stack{ + Node first; + Node lastest; + private int size; + public Stack(){ + first = lastest = new Node(null); + size = 0; + } + public int size(){ + return size; + } + public Stack push(T arg_value){ + if(size == 0){ + lastest.value = arg_value; + }else{ + lastest.setRight(new Node(arg_value)); + lastest = lastest.right; + } + size++; + return this; + } + public T pop(){ + if(size > 0){size--;}; + if(size == 0){ + T temp; + temp = lastest.value; + lastest.value = null; + return temp; + }else{ + lastest = lastest.left; + return lastest.right.remove().value; + } + } + public T peek(){ + return lastest.value; + } + public boolean empty(){ + return size == 0; + } +} \ No newline at end of file diff --git a/group13/568334413/0226/src/Main.java b/group13/568334413/0226/src/Main.java new file mode 100644 index 0000000000..3d3750475a --- /dev/null +++ b/group13/568334413/0226/src/Main.java @@ -0,0 +1,123 @@ +import com.coding.basic.Iterator; +import com.coding.basic.LinkedList; +import com.coding.basic.Queue; + +import java.util.ArrayList; +import java.util.Stack; + +public class Main { + + public static void main(String[] args) { + System.out.println("Hello World!"); + + com.coding.basic.TreeSet treeSet = new com.coding.basic.TreeSet(); + treeSet.add(1); + treeSet.add(2); + treeSet.add(3); + treeSet.add(4); + System.out.println("treeSet = " + treeSet.size); + + + } + + public static void testQueueIterator() { + Queue queue = new Queue(); + queue.enQueue("0"); + queue.enQueue("1"); + queue.enQueue("2"); + queue.enQueue("3"); + queue.enQueue("4"); + while (queue.iterator.hasNext()) { + System.out.println("next === " + queue.iterator.next()); + } + + } + + public static void testLinkedListIterator() { + com.coding.basic.LinkedList arrayList = new com.coding.basic.LinkedList(); + arrayList.add("0"); + arrayList.add("1"); + arrayList.add("2"); + arrayList.add("3"); + arrayList.add("4"); + arrayList.add("5"); + Iterator iterator = arrayList.iterator(); + while (iterator.hasNext()) { + System.out.println("next === " + iterator.next()); + } + } + + + public static void testArrayListIterator() { + com.coding.basic.ArrayList arrayList = new com.coding.basic.ArrayList(); + arrayList.add("0"); + arrayList.add("1"); + arrayList.add("2"); + arrayList.add("3"); + arrayList.add("4"); + arrayList.add("5"); + Iterator iterator = arrayList.iterator(); + while (iterator.hasNext()) { + System.out.println("next === " + iterator.next()); + System.out.println("next =2== " + iterator.next()); + } + } + + public static void linkedList() { + Stack stack = new Stack(); + stack.push("1"); + stack.push("2"); + stack.push("3"); + stack.push("4"); + String a = stack.peek(); + System.out.println("a = " + a); + +// LinkedList linkedList = new LinkedList(); +// linkedList.add("0"); +// linkedList.add("1"); +// linkedList.add("2"); +// linkedList.add("3"); +// linkedList.get(1); +// linkedList.size(); + LinkedList linkedList = new LinkedList(); + linkedList.add("0"); + linkedList.add("1"); + linkedList.add(1, "2"); + linkedList.toString(); + } + + public static void arrayList() { + ArrayList arrayList = new ArrayList(); + arrayList.add("1"); + arrayList.add(null); + arrayList.add(null); + arrayList.add(null); + arrayList.add(null); + arrayList.add("2"); + arrayList.remove(1); + +// arrayList.add(7, "100"); + + System.out.println("arrayList = " + arrayList.size()); + java.util.List list = new ArrayList(); + + com.coding.basic.ArrayList myList = new com.coding.basic.ArrayList(); + myList.add("0"); + myList.add("1"); + myList.add("2"); + myList.add("3"); + myList.add("4"); + myList.add("5"); + myList.add("6"); + myList.add("7"); + myList.add(8, "8"); + System.out.println("myList = " + myList.get(9)); + + System.out.println("myList = " + myList.toString()); + myList.remove(1); +// System.out.println("myList = " + myList.size()); + + System.out.println("myList = " + myList.toString()); + + } +} diff --git a/group13/568334413/0226/src/com/coding/basic/ArrayList.java b/group13/568334413/0226/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..9592af4050 --- /dev/null +++ b/group13/568334413/0226/src/com/coding/basic/ArrayList.java @@ -0,0 +1,113 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[5]; + + public void add(Object o) { + dilatation(); + size = size + 1; + elementData[size - 1] = o; + } + + + public void add(int index, Object o) { + //是否超出目前大小+1; + //是否需要先扩容 + //移动数组 + checkRange(index); + + dilatation(); + //手动移动素组 + for (int i = size; i >= index; i--) { + Object o1 = elementData[i]; + elementData[i + 1] = elementData[i]; + } + elementData[index] = o; + size = size + 1; + + } + + private String outOfBoundsMsg(int index) { + return "Index: " + index + ", Size: " + size; + } + + + public Object get(int index) { + checkRange(index); + return elementData[index]; + } + + public Object remove(int index) { + checkRange(index); + + Object object = elementData[index]; + + //native 方法,未知细节 + System.arraycopy(elementData, index + 1, elementData, index, size - index); + size = size - 1; + elementData[size] = null; + return object; + } + + @Override + public int size() { + return this.size; + } + + public void checkRange(int index) { + if (index >= size) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + } + + public void dilatation() { + if (elementData.length == size + 1) { + Object[] tempElementData = elementData; + elementData = new Object[elementData.length * 2]; + for (int i = 0; i < tempElementData.length; i++) { + elementData[i] = tempElementData[i]; + } + } + } + + @Override + public String toString() { + StringBuilder value = new StringBuilder(); + for (int i = 0; i < size; i++) { + Object object = elementData[i]; + value.append(object.toString() + ","); + } + return value.toString(); + } + + Iterator mIterator = new MIterator(); + + public Iterator iterator() { + return mIterator; + } + + class MIterator implements Iterator { + int index = 0; + + @Override + public boolean hasNext() { + if (index < size) { + + return true; + } + index = 0; + return false; + } + + @Override + public Object next() { + Object object = elementData[index]; + index++; + return object; + } + + } +} diff --git a/group13/568334413/0226/src/com/coding/basic/BinaryTreeNode.java b/group13/568334413/0226/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..e1f8840552 --- /dev/null +++ b/group13/568334413/0226/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,37 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Integer getData() { + return data; + } + + public void setData(Integer data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + return null; + } + +} diff --git a/group13/568334413/0226/src/com/coding/basic/Iterator.java b/group13/568334413/0226/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..96adcd6d3a --- /dev/null +++ b/group13/568334413/0226/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + + public Object next(); + +} diff --git a/group13/568334413/0226/src/com/coding/basic/LinkedList.java b/group13/568334413/0226/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..d3ff3fd907 --- /dev/null +++ b/group13/568334413/0226/src/com/coding/basic/LinkedList.java @@ -0,0 +1,170 @@ +package com.coding.basic; + +public class LinkedList implements List { + private int size = 0; + private Node headNode; + private Node lastNode; + + public LinkedList() { + headNode = new Node(); + lastNode = new Node(); + headNode.next = lastNode; + lastNode.prev = headNode; + } + + public void add(Object o) { + Node node = new Node(); + node.data = o; + if (size == 0) { + headNode.next = node; + lastNode.prev = node; + node.next = lastNode; + node.prev = headNode; + + } else { + Node tempLastNode = lastNode.prev; + tempLastNode.next = node; + + node.next = lastNode; + node.prev = tempLastNode; + lastNode.prev = node; + } + size = size + 1; + + } + + public void add(int index, Object o) { + checkRange(index); + Node preNode = null; + Node nextNode = null; + for (int i = 0; i <= index; i++) { + preNode = headNode.next; + } + nextNode = preNode.next; + Node newNode = new Node(); + newNode.data = o; + + preNode.next = newNode; + nextNode.prev = newNode; + + newNode.next = nextNode; + newNode.prev = preNode; + } + + private String outOfBoundsMsg(int index) { + return "Index: " + index + ", Size: " + size; + } + + public void checkRange(int index) { + if (index > size) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + } + + public Object get(int index) { + checkRange(index); + Node node = null; + for (int i = 0; i <= index; i++) { + node = headNode.next; + } + return node; + } + + public Object remove(int index) { + return null; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node oldFirstnode = headNode.next; + Node node = new Node(); + node.data = o; + headNode.next = node; + node.next = oldFirstnode; + node.prev = headNode; + oldFirstnode.prev = node; + } + + public void addLast(Object o) { + Node oldLastNode = lastNode.prev; + + Node node = new Node(); + node.data = o; + node.prev = oldLastNode; + node.next = lastNode; + + oldLastNode.next = node; + lastNode.prev = node; + + } + + public Object removeFirst() { + Node firstNode = headNode.next; + Node newFirstNode = firstNode.next; + newFirstNode.prev = headNode; + headNode.next = newFirstNode; + return firstNode; + } + + public Object removeLast() { + Node lastOldNode = lastNode.prev; + lastNode.prev = lastOldNode.prev; + lastOldNode.prev.next = lastNode; + + return lastOldNode; + } + + Iterator iterator = new MIterator(); + + public Iterator iterator() { + return iterator; + } + + @Override + public String toString() { + return super.toString(); + + } + + private static class Node { + Object data; + Node next; + Node prev; + } + + class MIterator implements Iterator { + Node node; + + @Override + public boolean hasNext() { + if (node == null) { + node = headNode.next; + } + if (!node.equals(lastNode)) { + System.out.println("ture"); + + return true; + } + node = null; + return false; + } + + @Override + public Object next() { + if (node.equals(headNode)) { + node = headNode.next; + return node; + } + Node tempNode = node; + node = node.next; + if (node == null) { + throw new IndexOutOfBoundsException("out of "); + } + return tempNode.data; + } + + } +} diff --git a/group13/568334413/0226/src/com/coding/basic/List.java b/group13/568334413/0226/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group13/568334413/0226/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group13/568334413/0226/src/com/coding/basic/Queue.java b/group13/568334413/0226/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..3113e1b91a --- /dev/null +++ b/group13/568334413/0226/src/com/coding/basic/Queue.java @@ -0,0 +1,27 @@ +package com.coding.basic; + +public class Queue { + LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o) { + linkedList.addLast(o); + } + + public Object deQueue() { + Object o = linkedList.removeLast(); + return o; + } + + public boolean isEmpty() { + if (linkedList.size() == 0) { + return true; + } + return false; + } + + public int size() { + return linkedList.size(); + } + + public Iterator iterator = linkedList.iterator(); +} diff --git a/group13/568334413/0226/src/com/coding/basic/Stack.java b/group13/568334413/0226/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..d53ba4b075 --- /dev/null +++ b/group13/568334413/0226/src/com/coding/basic/Stack.java @@ -0,0 +1,34 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + Object object = elementData.get(elementData.size() - 1); + elementData.remove(elementData.size() - 1); + return object; + } + + public Object peek() { + Object object = elementData.get(elementData.size() - 1); + return object; + } + + public boolean isEmpty() { + if (elementData.size() > 0) { + return false; + } + return true; + + } + + public int size() { + return elementData.size(); + } + + Iterator iterator = elementData.iterator(); +} diff --git a/group13/568334413/0226/src/com/coding/basic/TreeSet.java b/group13/568334413/0226/src/com/coding/basic/TreeSet.java new file mode 100644 index 0000000000..47334ba54f --- /dev/null +++ b/group13/568334413/0226/src/com/coding/basic/TreeSet.java @@ -0,0 +1,40 @@ +package com.coding.basic; + +/** + * Created by laibin on 2017/2/25. + */ +public class TreeSet { + BinaryTreeNode root = null; + public int size = 0; + + public void add(Integer integer) { + + BinaryTreeNode binaryTreeNode = new BinaryTreeNode(); + binaryTreeNode.setData(integer); + if (root == null) { + root = binaryTreeNode; + size++; + return; + } + insert(root, binaryTreeNode); + } + + void insert(BinaryTreeNode node, BinaryTreeNode tempNode) { + if (tempNode.getData() < node.getData()) { + if (node.getLeft() == null) { + node.setLeft(tempNode); + size++; + return; + } + insert(node.getLeft(), tempNode); + } else if (tempNode.getData() > node.getData()) { + if (node.getRight() == null) { + node.setRight(tempNode); + size++; + return; + } + insert(node.getRight(), tempNode); + } + } + +} diff --git a/group13/6023757/lesson2/mytest/.settings/org.eclipse.jdt.core.prefs b/group13/6023757/lesson2/mytest/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group13/6023757/lesson2/mytest/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group13/6023757/lesson2/mytest/src/mytest/ArrayList.java b/group13/6023757/lesson2/mytest/src/mytest/ArrayList.java new file mode 100644 index 0000000000..99f2c43a6d --- /dev/null +++ b/group13/6023757/lesson2/mytest/src/mytest/ArrayList.java @@ -0,0 +1,86 @@ +package mytest; + +import java.util.Arrays; + +public class ArrayList { + private int size = 0; + private Object[] elementData; + + public ArrayList(){ + elementData = new Object[10]; + } + + public ArrayList(int InitSize){ + elementData = new Object[InitSize]; + } + public void add(Object o){ + if(this.size == this.elementData.length){ + this.enlarge(); + + } + this.elementData[size] = o; + this.size++; + } + + public void add(int index, Object o){ + if(this.size == this.elementData.length){ + this.enlarge(); + } + if(index >= this.size){ + throw new IndexOutOfBoundsException("Index: "+index+" is out of band"); + } + else{ + Object[] newArray = new Object[this.elementData.length]; + System.arraycopy(this.elementData, 0, newArray, 0, index); + newArray[index] = o; + System.arraycopy(this.elementData, index, newArray, index + 1, this.size - index); + this.elementData = newArray; + this.size++; + } + } + + public Object get(int index){ + if(index > -1 && index < this.size()){ + return elementData[index]; + } + else{ + return null; + } + } + + public void remove(int index){ + if(index >= this.size){ + System.out.println("Index is out of scope"); + return; + } + + if(index == this.size - 1){ + this.elementData[index] = null; + } + else if(index == 0){ + Object[] newArray = new Object[this.elementData.length]; + System.arraycopy(this.elementData, 1, newArray, 0, this.size -1); + this.elementData = newArray; + } + else{ + Object[] newArray = new Object[this.elementData.length]; + System.arraycopy(this.elementData, 0, newArray, 0, index-1); + System.arraycopy(this.elementData, index, newArray, index-1, this.size - index); + this.elementData = newArray; + } + + this.size--; + } + + public int size(){ + return this.size; + } + + public void enlarge(){ + Object[] newArray = new Object[this.elementData.length+5]; + System.arraycopy(this.elementData, 0, newArray, 0, this.elementData.length); + this.elementData = newArray; + } + +} + diff --git a/group13/6023757/lesson2/mytest/src/mytest/LinkedList.java b/group13/6023757/lesson2/mytest/src/mytest/LinkedList.java new file mode 100644 index 0000000000..8cfb0d6d2d --- /dev/null +++ b/group13/6023757/lesson2/mytest/src/mytest/LinkedList.java @@ -0,0 +1,116 @@ +package mytest; + +public class LinkedList { + private int size = 0; + private Node firstNode = null; + private Node lastNode = null; + + public void add(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + if(lastNode == null){ + firstNode = newNode; + lastNode = newNode; + } + else{ + lastNode.next = newNode; + lastNode = newNode; + } + this.size++; + } + public void add(int index , Object o){ + if(index < 0 || index >= this.size){ + throw new IndexOutOfBoundsException("Index: "+index+" is out of band"); + } + if(index == 0){ + addFirst(o); + } + else if(index == this.size-1){ + addLast(o); + } + else{ + Node pointer = this.firstNode; + for(int i = 0;i < index - 1;i++){ + pointer = pointer.next; + } + Node newNode = new Node(); + newNode.data = o; + newNode.next = pointer.next; + pointer.next = newNode; + this.size++; + } + + } + public Object get(int index){ + if(index < 0 || index >= this.size){ + throw new IndexOutOfBoundsException("Index: "+index+" is out of band"); + } + Node pointer = this.firstNode; + for(int i = 0;i < index;i++){ + pointer = pointer.next; + } + return pointer.data; + } + public void remove(int index){ + if(index < 0 || index >= this.size){ + throw new IndexOutOfBoundsException("Index: "+index+" is out of band"); + } + if(index == 0){ + removeFirst(); + } + else if(index == this.size-1){ + removeLast(); + } + else{ + Node pointer = this.firstNode; + for(int i = 0;i < index - 1;i++){ + pointer = pointer.next; + } + Node toBeDelete = pointer.next; + pointer.next = toBeDelete.next; + toBeDelete.next = null; + this.size--; + } + + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = firstNode; + firstNode = newNode; + this.size++; + } + public void addLast(Object o){ + add(o); + } + public void removeFirst(){ + Node NextNode = firstNode.next; + firstNode.next = null; + firstNode = NextNode; + this.size--; + } + public void removeLast(){ + Node pointer = this.firstNode; + for(int i = 0;i < this.size - 2;i++){ + pointer = pointer.next; + } + Node toBeDelete = pointer.next; + pointer.next = null; + lastNode = pointer; + toBeDelete.next = null; + this.size--; + } + + private static class Node{ + Object data; + Node next; + + } + +} diff --git a/group13/6023757/lesson2/mytest/src/mytest/myMain.java b/group13/6023757/lesson2/mytest/src/mytest/myMain.java new file mode 100644 index 0000000000..f66910c724 --- /dev/null +++ b/group13/6023757/lesson2/mytest/src/mytest/myMain.java @@ -0,0 +1,50 @@ +package mytest; + +public class myMain { + + public static void main(String[] args) { + // TODO Auto-generated method stub + myMain myTest = new myMain(); +// myTest.testArrayList(); + myTest.testLinkedList(); + } + + public void testLinkedList(){ + LinkedList myList = new LinkedList(); + myList.add("aa"); + myList.add("bb"); + myList.add("cc"); + myList.add("dd"); + myList.add("ee"); + myList.add("ff"); + myList.add("gg"); + myList.removeLast(); + for(int i = 0;i < myList.size();i++){ + System.out.println(myList.get(i)); + } + + } + + public void testArrayList(){ + ArrayList myArray = new ArrayList(5); + myArray.add("xx1"); + myArray.add("xx2"); + myArray.add("xx3"); + myArray.add("xx4"); + myArray.add("xx5"); + myArray.add("xx6"); + myArray.add("xx7"); + myArray.add("xx8"); + myArray.add("xx9"); + myArray.add("xx10"); + myArray.add("xx11"); + myArray.add("xx12"); + myArray.add("xx13"); + myArray.remove(8); + int i; + for(i=0;i size){ + System.out.println("输入有误"); + return; + } + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + if(index > size) { + System.out.println("出界"); + return null; + } + return elementData[index]; + } + + public Object remove(int index){ + if(index < 0 || index > size){ + System.out.println("输入有误"); + return null; + } + Object o = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + elementData[size--] = null; + return o; + } + + public int size(){ + return elementData.length; + } + //判断是否越界 如果越界添加长度 + public void checkLength(int l){ + int oldSize = elementData.length; + if(l > oldSize){ //大于原来的长度创建新的数组 + elementData = Arrays.copyOf(elementData, l+100); + } + } + + public Iterator iterator(){ + return new Iterator(){ + int cursor; + public boolean hasNext() { + + return cursor != size ; + } + + public Object next() { + int i = cursor; + if (i >= size) + throw new NoSuchElementException(); + Object[] elementData_ = elementData; + if (i >= elementData_.length) + throw new ConcurrentModificationException(); + cursor = i + 1; + return elementData_[i]; + } + + }; + + } + + + + + +} diff --git a/group13/771992096/src/com/java/gsl/Iterator.java b/group13/771992096/src/com/java/gsl/Iterator.java new file mode 100644 index 0000000000..b2f2a258d8 --- /dev/null +++ b/group13/771992096/src/com/java/gsl/Iterator.java @@ -0,0 +1,7 @@ +package com.java.gsl; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group13/771992096/src/com/java/gsl/LinkedList.java b/group13/771992096/src/com/java/gsl/LinkedList.java new file mode 100644 index 0000000000..2a4b90cbbf --- /dev/null +++ b/group13/771992096/src/com/java/gsl/LinkedList.java @@ -0,0 +1,96 @@ +package com.java.gsl; + + +public class LinkedList implements List { + + private Node head; + private int size = 0; + + public void add(Object o){ + + } + public void add(int index , Object o){ + if(index < 0 || index > size ){ + return; + } + Node node = (Node) (index==size ? head : get(index)); + Node prenode = node.pre; +// Node l = last; +// Node newNode = new Node(l, o, null); +// last = newNode; +// if (l == null) +// head = newNode; +// else +// l.next = newNode; +// size++; + + } + public Object get(int index){ + if (index < 0 || index >= size){ + System.out.println("错误"); + return null; + } + // 获取index处的节点。 + // 若index < 双向链表长度的1/2,则从前先后查找; + // 否则,从后向前查找。 + if (index < (size/2 )) { + for (int i = 0; i <= index; i++) + head = head.next; + } else { + for (int i = size; i > index; i--) + head = head.pre; + } + return head; + + } + public Object remove(int index){ + Node x = (Node) get(index); + Node next = x.next; + Node prev = x.pre; + + if (prev == null) { + head = next; + } else { + prev.next = next; + x.pre = null; + } + + if (next == null) { + x.last = prev; + } else { + next.pre = prev; + x.next = null; + } + + size--; + return get(index); + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + Node pre; + Node last; + } +} diff --git a/group13/771992096/src/com/java/gsl/List.java b/group13/771992096/src/com/java/gsl/List.java new file mode 100644 index 0000000000..26807394e6 --- /dev/null +++ b/group13/771992096/src/com/java/gsl/List.java @@ -0,0 +1,9 @@ +package com.java.gsl; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group13/771992096/src/com/java/gsl/Queue.java b/group13/771992096/src/com/java/gsl/Queue.java new file mode 100644 index 0000000000..64645156ec --- /dev/null +++ b/group13/771992096/src/com/java/gsl/Queue.java @@ -0,0 +1,20 @@ +package com.java.gsl; + +public class Queue { + LinkedList queue = new LinkedList(); + public void enQueue(Object o){ + queue.add(o); + } + + public Object deQueue(){ + return queue.removeLast(); + } + + public boolean isEmpty(){ + return queue.size() > 0; + } + + public int size(){ + return queue.size(); + } +} diff --git a/group13/771992096/src/com/java/gsl/Stack.java b/group13/771992096/src/com/java/gsl/Stack.java new file mode 100644 index 0000000000..438e07a8ee --- /dev/null +++ b/group13/771992096/src/com/java/gsl/Stack.java @@ -0,0 +1,27 @@ +package com.java.gsl; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + int i = elementData.size(); + elementData.remove(i); + return elementData.get(i); + } + + public Object peek(){ + int i = elementData.size(); + return elementData.get(i); + } + public boolean isEmpty(){ + + return elementData.size()>0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group13/group13.md b/group13/group13.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group13/group13.md @@ -0,0 +1 @@ + diff --git a/group14/1091149131/2017JavaPro/.classpath b/group14/1091149131/2017JavaPro/.classpath new file mode 100644 index 0000000000..0f6a65708e --- /dev/null +++ b/group14/1091149131/2017JavaPro/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group14/1091149131/2017JavaPro/.gitignore b/group14/1091149131/2017JavaPro/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group14/1091149131/2017JavaPro/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group14/1091149131/2017JavaPro/.project b/group14/1091149131/2017JavaPro/.project new file mode 100644 index 0000000000..ab0a07b820 --- /dev/null +++ b/group14/1091149131/2017JavaPro/.project @@ -0,0 +1,17 @@ + + + 2017JavaPro + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group14/1091149131/2017JavaPro/.settings/org.eclipse.jdt.core.prefs b/group14/1091149131/2017JavaPro/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group14/1091149131/2017JavaPro/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/ArrayList.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/ArrayList.java new file mode 100644 index 0000000000..c04d7fe381 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/ArrayList.java @@ -0,0 +1,66 @@ +package com.m0226.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + //不够了怎么扩容 + elementData[size++]=o; + } + public void add(int index, Object o){ + if(index<0||index>size){ + throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); + } + for(int i=size;i>index;i--){ + elementData[i-1]=elementData[i]; + } + elementData[index]=o; + size++; + } + + public Object get(int index){ + if(index<0||index>=size){ + throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); + } + return elementData[index]; + } + + public Object remove(int index){ + if(index<0||index>=size){ + throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); + } + Object removeObj=elementData[index]; + for(int i=index;i=size) return false; + return true; + } + }; + } + +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTree.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTree.java new file mode 100644 index 0000000000..962f73ea14 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTree.java @@ -0,0 +1,45 @@ +package com.m0226.basic; + +import org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName; + +public class BinaryTree> { + private BinaryTreeNode root; + + public void traversal(BinaryTreeNode node){ + if(node.getLeft()!=null){ + traversal(node.getLeft()); + } + System.out.println("--"+node.getData()+"--"); + if(node.getRight()!=null){ + traversal(node.getRight()); + } + } + /** + * 如果根节点为null,则作为根节点,否则遍历下去插值 + * @param o + * @return + * 2017年2月23日 下午4:21:51 + * @Author Joy + */ + public BinaryTreeNode insert(T o){ + if(root==null){ + BinaryTreeNode newB=new BinaryTreeNode(); + newB.setData(o); + newB.setLeft(null); + newB.setRight(null); + root=newB; + return root; + } + + return root.insert(o); + } + public BinaryTreeNode getRoot() { + return root; + } + + public void setRoot(BinaryTreeNode root) { + this.root = root; + } + + +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTreeNode.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..105d3c4e94 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTreeNode.java @@ -0,0 +1,69 @@ +package com.m0226.basic; + +import org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName; + +public class BinaryTreeNode>{ + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + /** + * 如果待插入的值等于节点的值,则抛出异常:duplicate value + * 如果小于节点的值,则往左边遍历 + * 如果大于节点的值,则往右边遍历 + * @param o + * @return + * 2017年2月23日 下午4:22:50 + * @Author Joy + */ + public BinaryTreeNode insert(T o){ + //assume that no duplicate key + + if(o.compareTo(data)==0){ + try { + throw new DuplicateName("duplicate value: "+o); + } catch (DuplicateName e) { + e.printStackTrace(); + } + } + BinaryTreeNode newB=new BinaryTreeNode(); + newB.setData(o); + newB.setLeft(null); + newB.setRight(null); + //o更大,在右边 + if(o.compareTo(data)>0){ + if(this.getRight()!=null){ + this.getRight().insert(o); + }else{ + this.setRight(newB); + } + }else if(o.compareTo(data)<0){ + if(this.getLeft()!=null){ + this.getLeft().insert(o); + }else{ + this.setLeft(newB); + } + } + return newB; + } + + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/Iterator.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Iterator.java new file mode 100644 index 0000000000..f2cf7ea146 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.m0226.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/LinkedList.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/LinkedList.java new file mode 100644 index 0000000000..4622986c31 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/LinkedList.java @@ -0,0 +1,154 @@ +package com.m0226.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + private int size = 0;//自己加的,觉得需要 + /** + * 与addList()是一样的 + */ + public void add(Object o){ + addLast(o); + } + public void add(int index , Object o){ + if(index<0||index>size){ + throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); + } + Node prevNode=head; + Node curNode=head.next; + int count=0; + while(count<=index){ + if(count==index){ + Node newNode=new Node(); + newNode.data=o; + + newNode.next=curNode; + prevNode.next=newNode; + size++; + break; + } + curNode=curNode.next; + prevNode=prevNode.next; + count++; + } + + + } + public Object get(int index){ + if(index<0||index>=size) + throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); + + Node curNode=head.next; + int count=0; + while(count<=index){ + if(count==index){ + return curNode.data; + } + curNode=curNode.next; + count++; + } + return null; + } + public Object remove(int index){ + if(index<0||index>=size) + throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); + Node prevNode=head; + Node curNode=head.next; + int count=0; + while(count<=index){ + if(count==index){ + prevNode.next=curNode.next; + size--; + return curNode.data; + } + curNode=curNode.next; + prevNode=prevNode.next; + count++; + } + return null; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node objNode=new Node(); + objNode.data=o; + if(head==null) head=new Node(); + objNode.next=head.next; + size++; + head.next=objNode; + } + public void addLast(Object o){ + Node objNode=new Node(); + objNode.data=o; + if(head==null) head=new Node(); + + //也可以用iterator迭代,先不用吧 + Node curNode=head; + while(curNode.next!=null){ + curNode=curNode.next; + } + objNode.next=curNode.next; + curNode.next=objNode; + size++; + + } + public Object removeFirst(){ + if(head==null||head.next==null) + throw new NoSuchElementException(); + Node delNode=head.next; + head.next=delNode.next; + size--; + return delNode.data; + } + public Object removeLast(){ + if(head==null||head.next==null) + throw new NoSuchElementException(); + Node prevNode=head; + Node curNode=head.next; + while(curNode!=null){ + if(curNode.next==null){//说明是尾节点 + prevNode.next=curNode.next; + size--; + return curNode.data; + } + curNode=curNode.next; + prevNode=prevNode.next; + } + return null; + } + public Iterator iterator(){ + return new Iterator() { + private Node cur=head!=null?head.next:head; + @Override + public Object next() { + if(cur==null){ + throw new NoSuchElementException(); + } + Object object=cur.data; + cur=cur.next; + return object; + } + + @Override + public boolean hasNext() { + if(cur==null){ + return false; + }else{ + return true; + } + + } + }; + } + + + private static class Node{ + Object data; + Node next; + } +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/List.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/List.java new file mode 100644 index 0000000000..f45e9ebc4f --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/List.java @@ -0,0 +1,9 @@ +package com.m0226.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/Queue.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Queue.java new file mode 100644 index 0000000000..51961056f7 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Queue.java @@ -0,0 +1,21 @@ +package com.m0226.basic; + +public class Queue { + private LinkedList elementData=new LinkedList(); + public void enQueue(Object o){ + elementData.addLast(o); + } + + public Object deQueue(){ + Object first=elementData.removeFirst(); + return first; + } + + public boolean isEmpty(){ + return elementData.size()<=0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/basic/Stack.java b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Stack.java new file mode 100644 index 0000000000..7de23aaff8 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/basic/Stack.java @@ -0,0 +1,26 @@ +package com.m0226.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + Object object=elementData.get(elementData.size()-1); + elementData.remove(elementData.size()-1); + return object; + } + + public Object peek(){ + Object object=elementData.get(elementData.size()-1); + return object; + } + public boolean isEmpty(){ + return elementData.size()<=0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAPIDemo.java b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAPIDemo.java new file mode 100644 index 0000000000..eb3ada6da0 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAPIDemo.java @@ -0,0 +1,53 @@ +package com.m0226.test; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Queue; +import java.util.Stack; + + +/** + * 测试Java中的API + * @author group 14, QQ:1091149131 + */ +public class TestAPIDemo { + public static void main(String[] args) { + + //Stack + /*Stack stack=new Stack(); + stack.push(0); + stack.push(1); + stack.push(2); + System.out.println(stack.peek()); + System.out.println(stack.pop()); + System.out.println(stack.peek());*/ + + //LinkedList + /*LinkedList list2=new LinkedList<>(); + list2.add(0); + list2.add(1); + list2.add(2); + + list2.addLast(3); + list2.remove(0); + //list2.removeFirst(); + Iterator ite2=list2.iterator(); + ite2.next(); + while(ite2.hasNext()){ + System.out.println(ite2.next()); + }*/ + + + //ArrayList + /*ArrayList list1=new ArrayList(); + list1.add(0); + list1.add(1); + //list1.add(3, -1);//error + //list1.remove(2);//error + Iterator ite=list1.iterator(); + while(ite.hasNext()){ + System.out.println(ite.next()); + }*/ + } +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAll.java b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAll.java new file mode 100644 index 0000000000..9ff0f407ce --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestAll.java @@ -0,0 +1,71 @@ +package com.m0226.test; + +import org.junit.Test; + +import com.m0226.basic.ArrayList; +import com.m0226.basic.BinaryTree; +import com.m0226.basic.Iterator; +import com.m0226.basic.LinkedList; +import com.m0226.basic.Queue; +import com.m0226.basic.Stack; + +public class TestAll { + @Test + public void testArrayList(){ + ArrayList list1=new ArrayList(); + list1.add(0); + list1.add(1); + //list1.add(3, -1);//error + //list1.remove(2);//error + Iterator ite=list1.iterator(); + while(ite.hasNext()){ + System.out.println(ite.next()); + } + } + @Test + public void testLinkedList(){ + LinkedList list2=new LinkedList(); + list2.add(0); + list2.add(1); + list2.addFirst(-1); + list2.addLast(-2); + + list2.removeFirst(); + list2.removeLast(); + list2.remove(0); + + Iterator ite2=list2.iterator(); + while(ite2.hasNext()){ + System.out.println(ite2.next()); + } + } + @Test + public void testStack(){ + Stack stack=new Stack(); + stack.push(0); + stack.push(1); + stack.push(2); + System.out.println(stack.peek()); + System.out.println(stack.pop()); + System.out.println(stack.peek()); + } + @Test + public void testQueue(){ + Queue queue=new Queue(); + queue.enQueue(0); + queue.enQueue(1); + + System.out.println(queue.deQueue()); + } + @Test + public void testBinaryTree(){ + BinaryTree tree=new BinaryTree<>(); + tree.insert(3); + tree.insert(2); + tree.insert(5); + //tree.insert(5);//error,duplicate + tree.insert(1); + tree.traversal(tree.getRoot()); + } + +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/test/TestArrayList.java b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestArrayList.java new file mode 100644 index 0000000000..d9cc6e55be --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestArrayList.java @@ -0,0 +1,22 @@ +package com.m0226.test; + +import org.junit.Test; + +import com.m0226.basic.ArrayList; +import com.m0226.basic.Iterator; + +public class TestArrayList{ + + @Test + public void testAdd(){ + ArrayList list1=new ArrayList(); + list1.add(0); + list1.add(1); + //list1.add(3, -1);//error + //list1.remove(2);//error + Iterator ite=list1.iterator(); + while(ite.hasNext()){ + System.out.println(ite.next()); + } + } +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0226/test/TestMyDemo.java b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestMyDemo.java new file mode 100644 index 0000000000..855e84f04d --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0226/test/TestMyDemo.java @@ -0,0 +1,75 @@ +package com.m0226.test; + +import com.m0226.basic.ArrayList; +import com.m0226.basic.BinaryTree; +import com.m0226.basic.BinaryTreeNode; +import com.m0226.basic.Iterator; +import com.m0226.basic.LinkedList; +import com.m0226.basic.Queue; +import com.m0226.basic.Stack; + +/** + * 测试自己写的数据结构 + * @author group 14, QQ:1091149131 + */ +public class TestMyDemo { + public static void main(String[] args) { + //BinaryTree + BinaryTree tree=new BinaryTree<>(); + tree.insert(3); + tree.insert(2); + tree.insert(5); + //tree.insert(5);//error,duplicate + tree.insert(1); + tree.traversal(tree.getRoot()); + + + //Queue + /*Queue queue=new Queue(); + queue.enQueue(0); + queue.enQueue(1); + + System.out.println(queue.deQueue());*/ + + //Stack + /*Stack stack=new Stack(); + stack.push(0); + stack.push(1); + stack.push(2); + System.out.println(stack.peek()); + System.out.println(stack.pop()); + System.out.println(stack.peek());*/ + + //LinkedList + /*LinkedList list2=new LinkedList(); + list2.add(0); + list2.add(1); + list2.addFirst(-1); + list2.addLast(-2); + + list2.removeFirst(); + list2.removeLast(); + list2.remove(0); + + Iterator ite2=list2.iterator(); + while(ite2.hasNext()){ + System.out.println(ite2.next()); + }*/ + + + //ArrayList + /*ArrayList list1=new ArrayList(); + list1.add(0); + list1.add(1); + //list1.add(3, -1);//error + //list1.remove(2);//error + Iterator ite=list1.iterator(); + while(ite.hasNext()){ + System.out.println(ite.next()); + }*/ + + + + + } +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtil.java b/group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtil.java new file mode 100644 index 0000000000..05002d3561 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtil.java @@ -0,0 +1,237 @@ +package com.m0305.array; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int len=origin.length; + + //方法2,用新数据去取旧数组的值 + int[] src=new int[len]; + long start=System.currentTimeMillis(); + for(int i=0;i list=new ArrayList<>(); + for(int i=0;i list=new ArrayList<>(); + //i指向arr1,j指向arr2, + int i=0,j=0; + while(iarr2[j]){ + list.add(arr2[j]); + j++; + } + } + if(i>=len1||j>=len2){ + //如果其中一个数组已经遍历完了,则另外一个数组直接加入到list中 + for(int k1=i;k1 list=new ArrayList<>(); + if(max==1){ + return new int[0];//??空数组?? + } + + int one=1; + int two=2; + list.add(one); + list.add(two); + int temp=one+two; + while(temp list=new ArrayList<>(); + int j=2; + for(int i=2;i list=new ArrayList<>(); + //1是完数吗 + int sum=1; + for(int i=2;i list){ + if(list==null) return null; + int[] descArr=new int[list.size()]; + for(int i=0;i parameters){ + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + SAXReader reader=new SAXReader(); + Document document=null; + try { + document = reader.read(Struts.class.getResource("struts.xml")); + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Element root=document.getRootElement(); + /* + * 当前节点的名称:struts + * + 当前节点的名称:action + 属性name:login + 属性class:com.m0305.lisestruts.LoginAction + + 当前节点的名称:result + 属性name:success + result:/jsp/homepage.jsp + + 当前节点的名称:result + 属性name:fail + result:/jsp/showLogin.jsp + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + + + */ + String xpath = "//action[@name='" + actionName + "']/child::*"; + String xpath1 = "//action[@name='" + actionName + "']"; + + List list1=root.selectNodes(xpath1); + + String className=null; + String methodName=null; + if(!list1.isEmpty()){ + Element elt = (Element) list1.get(0); + Attribute classattr=elt.attribute("class"); + Attribute methodattr=elt.attribute("method"); + className=classattr.getValue(); + if(methodattr!=null){ + methodName=methodattr.getValue(); + } + } + Class clazz=null; + try { + clazz=Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + Object act=null; + try { + act=clazz.getConstructor().newInstance(); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } + for(Entry s:parameters.entrySet()){ + s.getKey(); + try { + Method m1=clazz.getDeclaredMethod(param2methodname(s.getKey()), String.class);//??? + m1.invoke(act, s.getValue());//设置参数的值 + + } catch (NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + //调用execute方法后,读取所有getter方法,将值放到view的param里面去 + String jspkey=null; + View view=new View(); + Map viewParams=new HashMap(); + if(methodName==null){ + methodName="execute"; + } + try { + Method defaultmethod=clazz.getDeclaredMethod(methodName); + jspkey=defaultmethod.invoke(act).toString();//action返回值 + } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Method[] methods=clazz.getDeclaredMethods(); + for(Method method:methods){ + if(method.getName().startsWith("get")){ + try { + viewParams.put(removeGet(method.getName()), method.invoke(act)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + view.setParameters(viewParams); + //读xml文件里面的result,根据返回值决定哪个jsp,放到view里面的jsp中 + + + //读result里面的值 + List list=root.selectNodes(xpath); + Iterator it = list.iterator(); + while (it.hasNext()) { + Element elt = (Element) it.next(); + Attribute attr = elt.attribute("name"); + if(jspkey.equals(attr.getValue())){ + view.setJsp(elt.getStringValue()); + break; + } + } + return view; + } + public static String param2methodname(String name){ + //password change to setPassword + + return "set"+name.substring(0, 1).toUpperCase() + name.substring(1); + } + public static String removeGet(String name){ + String name1=name.substring(3); + String result=name1.substring(0, 1).toLowerCase()+name1.substring(1); + return result; + } + +} + + + + + + + + + + + + + + + diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/StrutsTest.java b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/StrutsTest.java new file mode 100644 index 0000000000..5438c50c88 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.m0305.lisestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/View.java b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/View.java new file mode 100644 index 0000000000..a5d0269d7f --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/View.java @@ -0,0 +1,23 @@ +package com.m0305.lisestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/struts.xml b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/struts.xml new file mode 100644 index 0000000000..6ca2757ed3 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group14/1091149131/2017JavaPro/src/com/util/Dom4JforXML.java b/group14/1091149131/2017JavaPro/src/com/util/Dom4JforXML.java new file mode 100644 index 0000000000..ddf81bffeb --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/util/Dom4JforXML.java @@ -0,0 +1,67 @@ +package com.util; + +import java.util.Iterator; +import java.util.List; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.junit.Test; + +public class Dom4JforXML { + @Test + public void test() throws Exception{ + //创建SAXReader对象 + SAXReader reader = new SAXReader(); + //Dom4JforXML.class.getResourceAsStream(""); + //读取文件 转换成Document + //System.out.println(this.getClass().getResource("/").getPath()+"struts.xml"); + Document document = reader.read(Dom4JforXML.class.getResource("struts.xml")); + //获取根节点元素对象 + Element root = document.getRootElement(); + String xpath1 = "//action[@name='login']"; + + List list1=root.selectNodes(xpath1); + Iterator it = list1.iterator(); + while (it.hasNext()) { + Element elt = (Element) it.next(); + Attribute attr = elt.attribute("name"); + + } + //遍历 + //listNodes(root); + } + @Test + public void test2(){ + //Dom4JforXML.class.getClass().getResourceAsStream("struts.xml"); + String name="getName"; + //name + String name1=name.substring(3); + String result=name1.substring(0, 1).toLowerCase()+name1.substring(1); + System.out.println(result); + + } + + //遍历当前节点下的所有节点 + public void listNodes(Element node){ + System.out.println("当前节点的名称:" + node.getName()); + //首先获取当前节点的所有属性节点 + List list = node.attributes(); + //遍历属性节点 + for(Attribute attribute : list){ + System.out.println("属性"+attribute.getName() +":" + attribute.getValue()); + } + //如果当前节点内容不为空,则输出 + if(!(node.getTextTrim().equals(""))){ + System.out.println( node.getName() + ":" + node.getText()); + } + //同时迭代当前节点下面的所有子节点 + //使用递归 + Iterator iterator = node.elementIterator(); + while(iterator.hasNext()){ + Element e = iterator.next(); + listNodes(e); + } + } +} diff --git a/group14/1091149131/2017JavaPro/src/com/util/struts.xml b/group14/1091149131/2017JavaPro/src/com/util/struts.xml new file mode 100644 index 0000000000..6ca2757ed3 --- /dev/null +++ b/group14/1091149131/2017JavaPro/src/com/util/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group14/1091149131/README.md b/group14/1091149131/README.md new file mode 100644 index 0000000000..734ffcdc97 --- /dev/null +++ b/group14/1091149131/README.md @@ -0,0 +1,7 @@ +#作业记录 +2017/2/26
+基本数据结构代码实现,关于CPU,内存等的硬件说明 + +2017/3/5
+一个大作业:读取struts.xml,实现struts
+ArrayUtil里面实现几个函数 diff --git a/group14/187114392/work_1_20170225/.classpath b/group14/187114392/work_1_20170225/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group14/187114392/work_1_20170225/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group14/187114392/work_1_20170225/.gitignore b/group14/187114392/work_1_20170225/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group14/187114392/work_1_20170225/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group14/187114392/work_1_20170225/.project b/group14/187114392/work_1_20170225/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group14/187114392/work_1_20170225/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group14/187114392/work_1_20170225/.settings/org.eclipse.jdt.core.prefs b/group14/187114392/work_1_20170225/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group14/187114392/work_1_20170225/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group14/187114392/work_1_20170225/ReadMe.md b/group14/187114392/work_1_20170225/ReadMe.md new file mode 100644 index 0000000000..79077789f6 --- /dev/null +++ b/group14/187114392/work_1_20170225/ReadMe.md @@ -0,0 +1,3 @@ +这个项目用idea直接打开。 +运行里面的test 目录就可以直接单元测试。 +谢谢 diff --git a/group14/187114392/work_1_20170225/src/Main.java b/group14/187114392/work_1_20170225/src/Main.java new file mode 100644 index 0000000000..3e44cc8e16 --- /dev/null +++ b/group14/187114392/work_1_20170225/src/Main.java @@ -0,0 +1,31 @@ +/** + * Created by bshu on 2017/2/25. + */ +import com.coding.basic.ArrayList; +import com.coding.basic.Iterator; + +import java.util.*; + +/** + * Created by bshu on 2017/2/21. + */ +public class Main { + public static void main(String[] args) { + int size = 0; + System.out.println("1 size " + (size++)); + System.out.println("2 size " + (size)); + LinkedList lnk = new LinkedList(); + java.util.ArrayList list = new java.util.ArrayList(){{add("str0");}}; + lnk.add("kk1"); + lnk.add("kk2"); + lnk.add("kk3"); + lnk.remove(2); + lnk.iterator(); + int count = 0; + for (java.util.Iterator iter = lnk.iterator(); iter.hasNext();) { + System.out.printf("%s is :%s \n",count, iter.next()); + ++count; + } + } +} + diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/ArrayList.java b/group14/187114392/work_1_20170225/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..78f24c6dae --- /dev/null +++ b/group14/187114392/work_1_20170225/src/com/coding/basic/ArrayList.java @@ -0,0 +1,73 @@ +package com.coding.basic; +import java.util.Arrays; +import java.lang.IndexOutOfBoundsException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void ensure_length(int expect_length) { + if (expect_length > elementData.length) { + elementData = Arrays.copyOf(elementData,elementData.length * 2); + } + } + + public void add(Object o){ + ensure_length(size + 1); + elementData[size] = o; + size += 1; + } + + public void add(int index, Object o){ + ensure_length(size + 1); + System.arraycopy(elementData,index, + elementData,index + 1, + size - index + 1); + elementData[index] = o; + size += 1; + } + + public Object get(int index) { + if (index > size) { + throw new IndexOutOfBoundsException("index out of bounds"); + } else { + return elementData[index]; + } + } + + public Object remove(int index){ + Object oldvalue = elementData[index]; + System.arraycopy(elementData,index + 1,elementData,index,size - index - 1); + elementData[--size] = null; + return oldvalue; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new Iterator_ip(); + } + + private class Iterator_ip implements Iterator { + private int index = 0; + + @Override + public boolean hasNext() { + return (index + 1) <= size; + } + + @Override + public Object next() { + if (index > size) { +// throw new IndexOutOfBoundsException("iterator next out of bounds"); + return null; + } + return elementData[index++]; + } + } + +} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/BinaryTreeNode.java b/group14/187114392/work_1_20170225/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group14/187114392/work_1_20170225/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/Iterator.java b/group14/187114392/work_1_20170225/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group14/187114392/work_1_20170225/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/LinkedList.java b/group14/187114392/work_1_20170225/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..89b4523e0a --- /dev/null +++ b/group14/187114392/work_1_20170225/src/com/coding/basic/LinkedList.java @@ -0,0 +1,168 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private Node tail; + private Node last_but_one; + private int size = 0; + + public LinkedList() { + tail = new Node(); + tail.data = null; + tail.next = null; + + head = new Node(); + head.next = null; + } + + private void add_elementbyindex(int index , Object o) { + Node new_node = new Node(); + if (index == 0) { + if (size > 0) { + new_node.data = head.data; + } else { +// System.out.println("first new node is null"); + new_node.data = null; + head.next = null; + } + head.data = o; + } else { + new_node.data = o; + } + + int count = 0; + Node k = head; + while (count < index - 1) { +// System.out.printf("add count:%s, k is:%s \n",count,k.data); + k = k.next; + ++count; + } + new_node.next = k.next; + k.next = new_node; + ++size; + } + + private Object remove_elementbyindex(int index) { + int count = 0; + Object remove_ob = null; + Node k = head; + while (count < index - 1) { +// System.out.printf("remove count:%s, k is:%s \n",count,k.data); + k = k.next; + ++count; + } + + if (index == 0) { + remove_ob = head.data; + head.data = head.next.data; + if (size == 1) { + head.data = null; + } + head.next = head.next.next; + } else if ((index - 1) == size) { +// System.out.printf("index:%s == size, count:%s, k is:%s \n",index,count,k.data); + remove_ob = k.data; + k.next = null; + } else { + if (size == 1) { + k.data = null; + } + remove_ob = k.next.data; + k.next = k.next.next; + } + --size; + return remove_ob; + } + + public void add(Object o){ + add_elementbyindex(size(),o); + } + + public void add(int index , Object o){ + // if index larger than size , then we set index equal to size; + if (index > size) { + throw new IndexOutOfBoundsException("index out of bounds"); + } + add_elementbyindex(index,o); + + } + public Object get(int index){ + if (index > size) { + throw new IndexOutOfBoundsException("get index out of bounds"); + } + Node k = head; + int count = 0; + while (count < index) { +// System.out.printf("get count:%s, k is:%s \n",count,k.data); + k = k.next; + ++count; + } +// System.out.printf("get count:%s, k is:%s \n",count,k.data); + return k.data; + } + public Object remove(int index){ + if (index < 0 || index > size || size == 0) { + return null; + } + return remove_elementbyindex(index); + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + add_elementbyindex(0,o); + } + public void addLast(Object o){ + add_elementbyindex(size,o); + } + public Object removeFirst(){ + if (size == 0) { + return null; + } + return remove_elementbyindex(0); + } + public Object removeLast(){ + if (size == 0) { + return null; + } + return remove_elementbyindex(size); + } + public Iterator iterator(){ + Iterator_ip iter = new Iterator_ip(head); + return iter; + } + + private static class Node{ + Object data; + Node next; + } + + private class Iterator_ip implements Iterator { + private int index = 0; + private Node node_iter; + + public Iterator_ip(Node node_iter) { + this.node_iter = node_iter; + } + + @Override + public boolean hasNext() { + return node_iter.next != null; + } + + @Override + public Object next() { + if (index > size) { +// throw new IndexOutOfBoundsException("iterator next out of bounds"); + return null; + } + Object now_data = node_iter.data; + node_iter = node_iter.next; + ++index; + return now_data; + } + } +} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/List.java b/group14/187114392/work_1_20170225/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group14/187114392/work_1_20170225/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/Queue.java b/group14/187114392/work_1_20170225/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..ada4130038 --- /dev/null +++ b/group14/187114392/work_1_20170225/src/com/coding/basic/Queue.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList lnk = new LinkedList(); + + public void enQueue(Object o){ + lnk.addLast(o); + } + + public Object deQueue(){ + return lnk.removeFirst(); + } + + public boolean isEmpty(){ + return lnk.size() == 0; + } + + public int size(){ + return lnk.size(); + } +} diff --git a/group14/187114392/work_1_20170225/src/com/coding/basic/Stack.java b/group14/187114392/work_1_20170225/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..d553579b79 --- /dev/null +++ b/group14/187114392/work_1_20170225/src/com/coding/basic/Stack.java @@ -0,0 +1,37 @@ +package com.coding.basic; +import java.lang.ArrayIndexOutOfBoundsException; +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); +// System.out.println("size is " + elementData.size()); + } + + public Object pop() { + int elementData_size = elementData.size(); + if (elementData_size == 0) { + throw new EmptyStackException(); + } + Object top_data = elementData.get(elementData_size - 1); + elementData.remove(elementData_size - 1); + return top_data; + } + + public Object peek() { + if (elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group14/187114392/work_1_20170225/test/ArrayList_Test.java b/group14/187114392/work_1_20170225/test/ArrayList_Test.java new file mode 100644 index 0000000000..fbfbdf1b3a --- /dev/null +++ b/group14/187114392/work_1_20170225/test/ArrayList_Test.java @@ -0,0 +1,52 @@ +import com.coding.basic.ArrayList; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Created by bshu on 2017/2/25. + */ +public class ArrayList_Test { + @Test + public void add_test() { + ArrayList arr = new ArrayList(); + arr.add("one"); + assertEquals(arr.get(0),"one"); + arr.add("two"); + assertEquals(arr.get(1),"two"); + } + + @Test + public void add_index_test() { + ArrayList arr = new ArrayList(); + arr.add(0,"one"); + assertEquals(arr.get(0),"one"); + arr.add(1,"two"); + arr.add(2,"three"); + arr.add(3,"four"); + arr.add(4,"five"); + assertEquals(arr.get(4),"five"); + arr.add(2,"duplicte two"); + assertEquals(arr.get(2),"duplicte two"); + } + + @Test + public void remove_test() { + ArrayList arr = new ArrayList(); + arr.add(0,"one"); + arr.add(1,"two"); + arr.add(2,"three"); + arr.remove(1); + assertEquals(arr.get(1),"three"); + } + + @Test + public void get_test() { + ArrayList arr = new ArrayList(); + arr.add(0,"one"); + arr.add(1,"two"); + arr.add(2,"three"); + assertEquals(arr.get(1),"two"); + assertEquals(arr.get(3),null); + } +} \ No newline at end of file diff --git a/group14/187114392/work_1_20170225/test/LinkedList_Test.java b/group14/187114392/work_1_20170225/test/LinkedList_Test.java new file mode 100644 index 0000000000..986366cb6a --- /dev/null +++ b/group14/187114392/work_1_20170225/test/LinkedList_Test.java @@ -0,0 +1,122 @@ +import org.junit.Test; +import com.coding.basic.*; +import java.lang.Object; + +import static org.junit.Assert.assertEquals; + +/** + * LinkedList_Test Tester. + * + * @author + * @since
bshu 26, 2017
+ * @version 1.0 + */ +public class LinkedList_Test { + @Test + public void get() { + LinkedList link = new LinkedList(); + link.add("kkk"); + assertEquals(link.get(0),"kkk"); + link.add("kkk1"); + assertEquals(link.get(1),"kkk1"); + } + + @Test + public void add() { + LinkedList link = new LinkedList(); + link.add("kkk"); + link.add("aaa"); + link.add("bbb"); + link.add("ccc"); + link.add("ddd"); + link.add("eee"); + Object[] ob = new Object[]{"kkk","aaa","bbb","ccc","ddd","eee"}; + int count = 0; + for (Iterator iter = link.iterator(); iter.hasNext();) { + Object data = iter.next(); +// System.out.printf("%s is :%s \n",count, data); + assertEquals(data,ob[count]); + ++count; + } + } + + @Test + public void add_index() { + LinkedList link = new LinkedList(); + link.add("kkk"); +// System.out.println("0 is " + link.get(0)); + link.add("kkk2"); + link.add(0,"0kkk"); + link.add(3,"3kkk"); + assertEquals(link.get(0),"0kkk"); + assertEquals(link.get(2),"kkk2"); + } + + @Test + public void add_first() { + LinkedList link = new LinkedList(); + link.add("kkk"); + link.addFirst("F_kkk"); + assertEquals(link.get(0),"F_kkk"); + assertEquals(link.get(1),"kkk"); + } + + @Test + public void add_last() { + LinkedList link = new LinkedList(); + link.add("kkk"); + link.addLast("L_kkk"); + assertEquals(link.get(0),"kkk"); + assertEquals(link.get(link.size() - 1),"L_kkk"); + } + + @Test + public void remove() { + LinkedList link = new LinkedList(); + link.add("kkk"); +// System.out.println("0 is " + link.get(0)); + link.add("kkk1"); + link.add("kkk2"); + link.remove(2); + link.add(link.size(),"2kkk"); + link.add("kkk3"); + link.add("kkk4"); + link.add("kkk5"); + link.remove(link.size()); + link.add("kkk6"); + int count = 0; + Object[] ob = new Object[]{"kkk","kkk1","2kkk","kkk3","kkk4","kkk6"}; + for (Iterator iter = link.iterator(); iter.hasNext();) { + Object data = iter.next(); + System.out.printf("%s is :%s \n",count, data); + assertEquals(data,ob[count]); + ++count; + } + } + + @Test + public void remove_first() { + LinkedList link = new LinkedList(); + link.add("kkk"); + link.add("kkk1"); + link.add("kkk2"); + link.removeFirst(); + assertEquals("kkk1",link.get(0)); + assertEquals("kkk2",link.get(1)); + assertEquals(2,link.size()); + } + + @Test + public void remove_last() { + LinkedList link = new LinkedList(); + link.add("kkk"); + link.add("kkk1"); + link.removeLast(); + assertEquals("kkk",link.get(0)); + link.removeLast(); + link.removeLast(); + link.remove(0); + link.remove(0); + assertEquals(null,link.get(0)); + } +} diff --git a/group14/187114392/work_1_20170225/test/Queue_Test.java b/group14/187114392/work_1_20170225/test/Queue_Test.java new file mode 100644 index 0000000000..319baf6706 --- /dev/null +++ b/group14/187114392/work_1_20170225/test/Queue_Test.java @@ -0,0 +1,44 @@ + +import com.coding.basic.LinkedList; +import com.coding.basic.Queue; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import static org.junit.Assert.assertEquals; + +/** + * Queue_Test Tester. + * + * @author + * @since
bshu 26, 2017
+ * @version 1.0 + */ +public class Queue_Test { + + @Test + public void enQueue() { + Queue que = new Queue(); + que.enQueue("kkk"); + que.enQueue("kkk1"); + assertEquals(2,que.size()); + } + + @Test + public void deQueue() { + Queue que = new Queue(); + que.enQueue("kkk"); + que.enQueue("kkk1"); + Object data = que.deQueue(); + assertEquals("kkk",data); + } + + @Test + public void isempty() { + Queue que = new Queue(); + assertEquals(true,que.isEmpty()); + que.enQueue("kk2"); + assertEquals(false,que.isEmpty()); + } + +} diff --git a/group14/187114392/work_1_20170225/test/Stack_Test.java b/group14/187114392/work_1_20170225/test/Stack_Test.java new file mode 100644 index 0000000000..8a11a20632 --- /dev/null +++ b/group14/187114392/work_1_20170225/test/Stack_Test.java @@ -0,0 +1,72 @@ + +import org.junit.Test; +import com.coding.basic.*; + +import java.util.EmptyStackException; + +import static org.junit.Assert.assertEquals; + +/** + * Stack_Test Tester. + * + * @author + * @since
bshu 26, 2017
+ * @version 1.0 + */ +public class Stack_Test { + @Test + public void pop() { + Stack stk = new Stack(); + stk.push("one"); + stk.push("two"); + assertEquals(stk.pop(),"two"); + } + + @Test + public void pop_empty() { + Stack stk = new Stack(); + try { + stk.pop(); + } + catch (EmptyStackException e) { + assertEquals(e.toString(),"java.util.EmptyStackException"); + } + } + + @Test + public void push() { + Stack stk = new Stack(); + stk.push("one"); + stk.push("two"); + assertEquals(stk.peek(),"two"); + } + + @Test + public void peek() { + Stack stk = new Stack(); + stk.push("one"); + stk.push("two"); + stk.push("three"); + assertEquals(stk.peek(),"three"); + } + + @Test + public void peek_empty() { + Stack stk = new Stack(); + try { + stk.peek(); + } + catch (EmptyStackException e) { + assertEquals(e.toString(),"java.util.EmptyStackException"); + } + } + + @Test + public void isempty() { + Stack stk = new Stack(); + stk.push("one"); + assertEquals(stk.isEmpty(),false); + stk.pop(); + assertEquals(stk.isEmpty(),true); + } +} diff --git "a/group14/190530132/20170219\344\275\234\344\270\232/ArrayList.java" "b/group14/190530132/20170219\344\275\234\344\270\232/ArrayList.java" new file mode 100644 index 0000000000..079540bc4e --- /dev/null +++ "b/group14/190530132/20170219\344\275\234\344\270\232/ArrayList.java" @@ -0,0 +1,67 @@ +package com.coding.basic; + +public class ArrayList { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + + //在ArrayList的尾部添加 + public void add(Object o){ + + size = elementData.length + 1; + Object[] tempData = new Object[size]; + System.arraycopy(elementData, 0, tempData,0, elementData.length); + elementData = tempData; + + elementData[size-1] = o; + + } + + //在ArrayList中的某一个元素后面添加, 这里的关键在于先移动末尾的元素 + public void add(int index, Object o){ + + size = elementData.length + 1; + Object[] tempData = new Object[size]; + System.arraycopy(elementData, 0, tempData,0, elementData.length); + elementData = tempData; + + for (int i=elementData.length-2; i>index; i--) { + elementData[i+1] = elementData[i]; + } + + elementData[index+1] = o; + + } + + //按下标来访问ArrayList中的元素 + public Object get(int index){ + return elementData[index]; + } + + //按下标来删除ArrayList中的元素 + public Object remove(int index){ + Object r = elementData[index]; + for (int i=index; i= size) { + throw new IndexOutOfBoundsException("Index:" + index + ",size:" + size); + } + + Node n = new Node(); + n.data = o; + Node m = get(index); + n.next = m.next; + m.next = n; + size = size + 1; + } + + public Node get(int index){ + //index越界检查 + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("Index:" + index + ",size:" + size); + } + + Node n = head.next; + int count = 0; + while(count<=index){ + if(count==index){ + return n; + } + n = n.next; + count++; + } + + return null; + } + + public void remove(int index){ + if(index<0||index>=size) + throw new IndexOutOfBoundsException("Joy Index "+index+", Size: "+size); + + Node d = get(index); + Node pred = get(index-1); + pred.next = d.next; + size = size - 1; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node n = new Node(); + n.data = o; + + //避免空链表 + if (head==null) head=new Node(); + + n.next = head.next; + head.next = n; + size = size + 1; + } + + public void addLast(Object o){ + Node n = new Node(); + n.data = o; + + //避免空链表 + if (head==null) head = new Node(); + + //从头部往后顺序查找,找到尾部就添加 + Node m = head; + while (m.next != null){ + m = m.next; + } + n.next = m.next; + m.next = n; + size = size + 1; + } + + public Object removeFirst(){ + if(head==null||head.next==null) + throw new NoSuchElementException(); + Node d = head.next; + head.next = d.next; + size = size - 1; + return d.data; + } + + public Object removeLast(){ + if(head==null||head.next==null) + throw new NoSuchElementException(); + + Node m = head; + Node n = head.next; + while(n.next != null){ + m = n; + n = n.next; + } + size = size - 1; + return m.data; + } + + //public Iterator iterator(){ + // return null; + //} + + private static class Node{ + Node next; + Object data; + } + +} diff --git "a/group14/190530132/20170219\344\275\234\344\270\232/Queue.java" "b/group14/190530132/20170219\344\275\234\344\270\232/Queue.java" new file mode 100644 index 0000000000..365b65aecb --- /dev/null +++ "b/group14/190530132/20170219\344\275\234\344\270\232/Queue.java" @@ -0,0 +1,25 @@ +package com.coding.basic; + +public class Queue { + + LinkedList l = new LinkedList(); + public void enQueue(Object o){ + l.addLast(o); + } + + public Object deQueue(){ + return l.removeFirst(); + } + + public boolean isEmpty(){ + if (l.size() == 0) + return true; + else + return false; + } + + public int size(){ + return l.size(); + } + +} diff --git "a/group14/190530132/20170219\344\275\234\344\270\232/Stack.java" "b/group14/190530132/20170219\344\275\234\344\270\232/Stack.java" new file mode 100644 index 0000000000..f73de31abc --- /dev/null +++ "b/group14/190530132/20170219\344\275\234\344\270\232/Stack.java" @@ -0,0 +1,33 @@ +package com.coding.basic; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + int index = elementData.size() - 1; + Object o = elementData.remove(index); + return o; + } + + public Object peek(){ + int e = elementData.size() - 1; + return elementData.get(e); + } + + public boolean isEmpty(){ + if (elementData.size() == 0 ) + return true; + else + return false; + } + + public int size(){ + return elementData.size(); + } + +} diff --git "a/group14/190530132/20170219\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" "b/group14/190530132/20170219\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" new file mode 100644 index 0000000000..2c79e20a62 --- /dev/null +++ "b/group14/190530132/20170219\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" @@ -0,0 +1 @@ +http://rexwcl.blog.163.com/blog/static/270599039201712651450997/ \ No newline at end of file diff --git a/group14/254659936/.gitignore b/group14/254659936/.gitignore new file mode 100644 index 0000000000..50039721f2 --- /dev/null +++ b/group14/254659936/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +.idea +lib +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild \ No newline at end of file diff --git a/group14/254659936/out/production/254659936/com/coderising/litestruts/struts.xml b/group14/254659936/out/production/254659936/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..8a9789665d --- /dev/null +++ b/group14/254659936/out/production/254659936/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group14/254659936/src/Main.java b/group14/254659936/src/Main.java new file mode 100644 index 0000000000..f7d10617e3 --- /dev/null +++ b/group14/254659936/src/Main.java @@ -0,0 +1,14 @@ +import com.coderising.litestruts.Struts; + +import java.util.HashMap; + +public class Main { + + public static void main(String[] args) { + System.out.println("Hello World!"); + HashMap parameters = new HashMap<>(); + parameters.put("name", "zg"); + parameters.put("password", "123456"); + Struts.runAction("login", parameters); + } +} diff --git a/group14/254659936/src/com/coderising/array/ArrayUtil.java b/group14/254659936/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..2f2987465b --- /dev/null +++ b/group14/254659936/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,261 @@ +package com.coderising.array; + +import java.util.ArrayList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if (null == origin) { + return; + } + int first = 0; + int last = origin.length - 1; + int temp; + while (first < last) { + temp = origin[first]; + origin[first] = origin[last]; + origin[last] = temp; + first++; + last++; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int[] resultArr = null; + if (null == oldArray) { + return resultArr; + } + int zeroSize = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) { + zeroSize++; + } + } + resultArr = new int[oldArray.length - zeroSize]; + int resultIndex = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + resultArr[resultIndex] = oldArray[i]; + resultIndex++; + } + } + return resultArr; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + if (null == array1) { + return array2; + } + if (null == array2) { + return array1; + } + int[] resultArr = new int[array1.length + array2.length]; + int index1 = 0; + int index2 = 0; + for (int i = 0; i < resultArr.length; i++) { + if (array1[index1] < array2[index2]) { + resultArr[i] = array1[index1]; + index1++; + } else { + resultArr[i] = array2[index2]; + index2++; + } + } + return resultArr; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + if (oldArray == null) { + return new int[size]; + } + int[] resultArr = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + resultArr[i] = oldArray[i]; + } + return resultArr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + ArrayList tempList = new ArrayList<>(); + int resultSize = 0; + while (fibonacci(tempList, resultSize) < max) { + resultSize++; + } + int[] resultArr = new int[resultSize]; + for (int i = 0; i < resultSize; i++) { + resultArr[i] = tempList.get(i); + } + return resultArr; + } + + /** + * 返回第index个斐波那契数列,resultArr用来存已经计算过的结果 + * + * @param resultArr + * @param index + * @return + */ + private int fibonacci(ArrayList resultArr, int index) { + if (resultArr.size() > index) { + return resultArr.get(index); + } + int newResult; + if (index == 0) { + newResult = 1; + } else if (index == 1) { + newResult = 1; + } else { + newResult = (resultArr.get(index - 1) == 0 ? resultArr.get(index - 1) : fibonacci(resultArr, index - 1)) + + (resultArr.get(index - 2) == 0 ? resultArr.get(index - 2) : fibonacci(resultArr, index - 2)); + } + resultArr.add(newResult); + return newResult; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + if (max < 2) { + return null; + } + ArrayList tempList = new ArrayList<>(); + for (int i = 2; i <= max; i++) { + if (isPrimes(tempList, i)) { + tempList.add(i); + } + } + int[] resultArr = new int[tempList.size()]; + for (int i = 0; i < tempList.size(); i++) { + resultArr[i] = tempList.get(i); + } + return resultArr; + } + + private boolean isPrimes(ArrayList primesList, int temp) { + if (temp == 2 || temp == 3) { + return true; + } + for (int i = 0; i < primesList.size(); i++) { + if (temp % primesList.get(i) == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + if (max < 0) { + return null; + } + ArrayList tempList = new ArrayList<>(); + for (int i = 2; i <= max; i++) { + if (isPerfectNumber(i)) { + tempList.add(i); + } + } + int[] resultArr = new int[tempList.size()]; + for (int i = 0; i < tempList.size(); i++) { + resultArr[i] = tempList.get(i); + } + return resultArr; + } + + private boolean isPerfectNumber(int temp) { + if (temp == 1) { + return true; + } + int sum = 0; + for (int i = 1; i < temp; i++) { + if (temp % 1 == 0) { + if ((sum = sum + i) > temp) { + return false; + } + } + } + if (sum == temp) { + return true; + } + return false; + } + + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param separator + * @return + */ + public String join(int[] array, String separator) { + if (null == array || array.length == 0 || null == separator) { + return null; + } + StringBuilder sb = new StringBuilder(array.length * (1 + separator.length())); + int i = 1; + sb.append(array[0]); + for (; i < array.length; i++) { + sb.append(separator); + sb.append(array[i]); + } + return sb.toString(); + } + +} diff --git a/group14/254659936/src/com/coderising/litestruts/LoginAction.java b/group14/254659936/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group14/254659936/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group14/254659936/src/com/coderising/litestruts/Struts.java b/group14/254659936/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..76b1d8e531 --- /dev/null +++ b/group14/254659936/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,150 @@ +package com.coderising.litestruts; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + // 0. 读取配置文件struts.xml + Element rootXmlElement = getRootXmlElement(); + + String className = getClassFromAction(actionName, rootXmlElement); + + View view = new View(); + + try { + Class actionClass = null; + actionClass = Class.forName(className); + Object actionIns = null; + actionIns = actionClass.newInstance(); + + Method[] methods = actionClass.getMethods(); + Set> entries = parameters.entrySet(); + // 遍历map,调用set方法 + for (Map.Entry map : entries) { + String key = "set" + map.getKey(); + String value = map.getValue(); + Method method = null; + for (int i = 0; i < methods.length; i++) { + if (key.equalsIgnoreCase(methods[i].getName())) { + method = methods[i]; + break; + } + } + method.invoke(actionIns, value); + System.out.println("execute set method:" + key + " " + value); + } + + // 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method method = actionClass.getMethod("execute"); + Object executeResult = method.invoke(actionIns); + System.out.println("execute method result:" + executeResult.toString()); + + // 3. 通过反射找到对象的所有getter方法(例如 getMessage), + // 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + // 放到View对象的parameters + HashMap viewParametersMap = new HashMap<>(); + String methodName; + Object methodResult; + for (int i = 0; i < methods.length; i++) { + methodName = methods[i].getName(); + if (methodName.startsWith("get")) { + methodResult = methods[i].invoke(actionIns); + viewParametersMap.put((char) (methodName.charAt(3) - 32) + + methodName.substring(3, methodName.length() - 1), + methodResult); + + System.out.println("execute get method:" + methodName + " " + methodResult); + } + } + view.setParameters(viewParametersMap); + + // 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + // 放到View对象的jsp字段中。 + view.setJsp("" + executeResult); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return view; + } + + private static Element getRootXmlElement() { + SAXReader sax = new SAXReader(); + File xmlFile = new File("src/com/coderising/litestruts/struts.xml"); + Document document = null; + try { + document = sax.read(xmlFile); + } catch (DocumentException e) { + e.printStackTrace(); + } + Element root = document.getRootElement(); + System.out.println("root:" + root.getName()); + return root; + } + + private static String getClassFromAction(String actionName, Element root) { + if (null == actionName || actionName.isEmpty() || null == root) { + return null; + } + List elements = root.elements(); + for (Element element : elements) { + Attribute actionAttribute = element.attribute("name"); + if (actionName.equals(actionAttribute.getValue())) { + Attribute classAttribute = element.attribute("class"); + + + List elements1 = element.elements(); + elements1.get(0).attribute("name").getValue(); + elements1.get(0).getData(); + + + return classAttribute.getValue(); + } + } + return null; + } + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + +} diff --git a/group14/254659936/src/com/coderising/litestruts/StrutsTest.java b/group14/254659936/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..0bab615458 --- /dev/null +++ b/group14/254659936/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group14/254659936/src/com/coderising/litestruts/View.java b/group14/254659936/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group14/254659936/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group14/254659936/src/com/coderising/litestruts/struts.xml b/group14/254659936/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..8a9789665d --- /dev/null +++ b/group14/254659936/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group14/254659936/src/com/coding/basic/ArrayList.java b/group14/254659936/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..7fb9c076b6 --- /dev/null +++ b/group14/254659936/src/com/coding/basic/ArrayList.java @@ -0,0 +1,73 @@ +package com.coding.basic; + +import java.util.Objects; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[5]; + + public void add(Object o) { + if (size == elementData.length) { + Object[] newArr = new Object[elementData.length * 2]; + System.arraycopy(newArr, 0, elementData, 0, elementData.length); + elementData = newArr; + } + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + if (index >= size) { + throw new RuntimeException("the ArrayList size is short than index"); + } + elementData[index] = o; + } + + public Object get(int index) { + if (index >= size) { + throw new RuntimeException("the ArrayList size is short than index"); + } + return elementData[index]; + } + + public Object remove(int index) { + if (index >= size) { + throw new RuntimeException("the ArrayList size is short than index"); + } + Object resultObj = elementData[index]; + size--; + for (int i = index; i < size; i++) { + elementData[index] = elementData[index + 1]; + } + return resultObj; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return null; + } + + private class ArrayIterator implements Iterator { + + private int iteratorIndex = 0; + + @Override + public boolean hasNext() { + return iteratorIndex < size; + } + + @Override + public Object next() { + if (iteratorIndex >= size) { + throw new RuntimeException("the index is out of the list"); + } + return elementData[iteratorIndex++]; + } + } + +} diff --git a/group14/254659936/src/com/coding/basic/BinaryTreeNode.java b/group14/254659936/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..8b89c37114 --- /dev/null +++ b/group14/254659936/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,69 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(T o) { + BinaryTreeNode node = new BinaryTreeNode(); + node.setData(o); + insert(this, node); + return node; + } + + private void insert(BinaryTreeNode parent, BinaryTreeNode child) { + BinaryTreeNode node; + if (child.getData().isLargeThanTarget(parent.getData())) { + // 子节点比父节点大,需要向右插入 + node = getRight(); + if (null == node) { + // 右节点为空则可以直接插入 + parent.setRight(node); + } else { + // 递归检查右边子树的插入位置 + insert(node, child); + } + } else { + // 子节点比父节点小,或者等于父节点,需要向左插入 + node = getLeft(); + if (null == node) { + // 左节点为空,则直接插入 + parent.setLeft(node); + } else { + // 递归检查左子树的插入位置 + insert(node, child); + } + } + } + + public interface Compare { + boolean isLargeThanTarget(Compare target); + } + +} diff --git a/group14/254659936/src/com/coding/basic/Iterator.java b/group14/254659936/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..160f044ad1 --- /dev/null +++ b/group14/254659936/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + + public Object next(); + +} \ No newline at end of file diff --git a/group14/254659936/src/com/coding/basic/LinkedList.java b/group14/254659936/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..e0ad67a6d8 --- /dev/null +++ b/group14/254659936/src/com/coding/basic/LinkedList.java @@ -0,0 +1,155 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size = 0; + + public void add(Object o) { + addLast(o); + } + + public void add(int index, Object o) { + if (index >= size) { + throw new RuntimeException("the LinkedList size is short than index"); + } + Node node = new Node(); + node.data = 0; + if (index == 0) { + node.next = head; + head = node; + } + Node next = head; + int i = 0; + while (null != next) { + i++; + if (index == i) { + node.next = next.next; + next.next = node; + break; + } + next.next = next.next; + } + size++; + } + + public Object get(int index) { + if (index >= size) { + throw new RuntimeException("the LinkedList size is short than index"); + } + Node next = head; + int i = 0; + while (null != next) { + if (i == index) { + return next; + } + next = next.next; + i++; + } + return null; + } + + public Object remove(int index) { + if (index >= size) { + throw new RuntimeException("the LinkedList size is short than index"); + } + size--; + Node resultNode = null; + if (index == 0) { + resultNode = head; + head = head.next; + return resultNode.data; + } + + Node next = head; + int i = 0; + while (null != next) { + if (i == index) { + resultNode = next.next; + next.next = resultNode.next; + } + } + return resultNode.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + size++; + Node node = new Node(); + node.data = 0; + node.next = head; + head = node; + } + + public void addLast(Object o) { + size++; + Node node = new Node(); + node.data = o; + if (null == head) { + head = node; + return; + } + Node next = head; + while (null != next.next) { + next = next.next; + } + next.next = node; + } + + public Object removeFirst() { + if (size == 0) { + throw new RuntimeException("the LinkedList is null"); + } + size--; + Object obj = head.data; + head = head.next; + return obj; + } + + public Object removeLast() { + if (size == 0) { + throw new RuntimeException("the LinkedList is null"); + } + Node next = head; + Object obj = null; + for (int i = 0; i < size - 1; i++) { + next = next.next; + } + next.next = null; + size--; + return obj; + } + + public Iterator iterator() { + return null; + } + + + private static class Node { + Object data; + Node next; + } + + private class LinkedListIterator implements Iterator { + + private Node next = head; + + @Override + public boolean hasNext() { + return null != next; + } + + @Override + public Object next() { + if (null == next) { + throw new RuntimeException("the LinkedList is out of index"); + } + Object obj = next.data; + next = next.next; + return obj; + } + } +} diff --git a/group14/254659936/src/com/coding/basic/List.java b/group14/254659936/src/com/coding/basic/List.java new file mode 100644 index 0000000000..01398944e6 --- /dev/null +++ b/group14/254659936/src/com/coding/basic/List.java @@ -0,0 +1,13 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group14/254659936/src/com/coding/basic/Queue.java b/group14/254659936/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..50f99e6d1c --- /dev/null +++ b/group14/254659936/src/com/coding/basic/Queue.java @@ -0,0 +1,45 @@ +package com.coding.basic; + +public class Queue { + + private Node head; + private Node tail; + private int size; + + public void enQueue(Object o) { + Node node = new Node(); + node.data = o; + if (null == head) { + head = node; + tail = node; + } else { + tail.next = node; + tail = tail.next; + } + size++; + } + + public Object deQueue() { + if (size <= 0) { + throw new RuntimeException("the queue is empty"); + } + Object obj = head.data; + head = head.next; + size--; + return obj; + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + private static class Node { + Object data; + Node next; + Node pre; + } +} diff --git a/group14/254659936/src/com/coding/basic/Stack.java b/group14/254659936/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..796a3e2e24 --- /dev/null +++ b/group14/254659936/src/com/coding/basic/Stack.java @@ -0,0 +1,50 @@ +package com.coding.basic; + +public class Stack { + + private Node mStackNode; + private int size; + + public void push(Object o) { + Node node = new Node(); + node.data = o; + if (null == mStackNode) { + mStackNode = node; + } else { + mStackNode.next = node; + mStackNode = node; + } + size++; + } + + public Object pop() { + if (size == 0) { + throw new RuntimeException("the stack is empty"); + } + Object obj = mStackNode.data; + mStackNode = mStackNode.pre; + size--; + return obj; + } + + public Object peek() { + if (size == 0) { + throw new RuntimeException("the stack is empty"); + } + return mStackNode.data; + } + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + private static class Node { + Object data; + Node next; + Node pre; + } +} diff --git a/group14/296933284/Note/README.md b/group14/296933284/Note/README.md new file mode 100644 index 0000000000..0b08b8f0bb --- /dev/null +++ b/group14/296933284/Note/README.md @@ -0,0 +1,5 @@ +# 2017编程提高(Java)学习系列笔记链接 +--- + +1. [漫谈计算机组成 -- 微型计算机的硬件组成 2017-02-26](http://tennyson.ren/2017/02/25/%E6%BC%AB%E8%B0%88%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E7%BB%84%E6%88%90%20--%20%E5%BE%AE%E5%9E%8B%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E7%A1%AC%E4%BB%B6%E7%BB%84%E6%88%90/) +2. [Java中解析XML的方法 2017-03-04](http://tennyson.ren/2017/03/04/Java%E4%B8%AD%E8%A7%A3%E6%9E%90XML%E7%9A%84%E6%96%B9%E6%B3%95/#more) \ No newline at end of file diff --git a/group14/296933284/README.md b/group14/296933284/README.md new file mode 100644 index 0000000000..5c3f27c267 --- /dev/null +++ b/group14/296933284/README.md @@ -0,0 +1,4 @@ +# 2017年编程提高(Java) 作业、练习、总结 + +[coding --- 代码练习](https://github.com/Tennysons/coding2017/tree/master/group14/296933284/coding) +[Note --- 2017编程提高(Java)学习系列笔记链接](https://github.com/Tennysons/coding2017/tree/master/group14/296933284/Note) diff --git a/group14/296933284/coding/.classpath b/group14/296933284/coding/.classpath new file mode 100644 index 0000000000..11ea08c22c --- /dev/null +++ b/group14/296933284/coding/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/group14/296933284/coding/.gitignore b/group14/296933284/coding/.gitignore new file mode 100644 index 0000000000..1ea200494a --- /dev/null +++ b/group14/296933284/coding/.gitignore @@ -0,0 +1,6 @@ +/bin/ +.eml +.iml +.idea +/lib/ +*.eml \ No newline at end of file diff --git a/group14/296933284/coding/.project b/group14/296933284/coding/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group14/296933284/coding/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group14/296933284/coding/.settings/org.eclipse.core.resources.prefs b/group14/296933284/coding/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..9abffe377f --- /dev/null +++ b/group14/296933284/coding/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/com/coderising/litestruts/StrutsTest.java=UTF-8 diff --git a/group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs b/group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java b/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..557f917c37 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,228 @@ +package com.coderising.array; + +import com.coding.basic.ArrayList; + +import java.util.Arrays; + + +/** + * Created by Tennyson on 2017/3/1. + */ +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + for (int i = 0, j = origin.length - 1; i < origin.length / 2; i++, j--) { + int temp = origin[j]; + origin[j] = origin[i]; + origin[i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray) { + + int i; + // 获取数组中第一个值为 0 的元素的位置 + for (i = 0; i < oldArray.length; i++) + if (oldArray[i] == 0) + break; + // 从第一个值为 0 的元素开始,用之后的非零元素覆盖之前值为 0 的元素,并记录非零元素的个数 + for (int j = i + 1; j < oldArray.length; j++) + if (oldArray[j] != 0) + oldArray[i++] = oldArray[j]; + + // 复制数组 + int[] newArray = new int[i]; + System.arraycopy(oldArray, 0, newArray, 0, i); + + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + public int[] merge(int[] array1, int[] array2) { + int i = 0, j = 0; + ArrayList arrayList = new ArrayList(); + + // 比较两个数组的元素值,将较小的值存入arrayList + while (i < array1.length && j < array2.length) { + + if (array1[i] == array2[j]) { + arrayList.add(array1[i]); + i++; + j++; + } else if (array1[i] < array2[j]) { + arrayList.add(array1[i++]); + } else if (array1[i] > array2[j]) { + arrayList.add(array2[j++]); + } + } + + // 剩下一个数组还未比较完, 将其剩余元素存入arrayList + while (i < array1.length) arrayList.add(array1[i++]); + while (j < array2.length) arrayList.add(array2[j++]); + + return ArrayUtil.toArray(arrayList); + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + + return newArray = Arrays.copyOf(oldArray, newArray.length); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max) { + + ArrayList arrayList = new ArrayList(); + arrayList.add(1); + arrayList.add(1); + + int i, num; + for (i = 2; (num = (int) (arrayList.get(i - 1)) + (int) (arrayList.get(i - 2))) < max; i++) + arrayList.add(num); + + return ArrayUtil.toArray(arrayList); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max) { + + ArrayList arrayList = new ArrayList(); + + for (int i = 2; i < max; i++) { + int k = (int) Math.sqrt(i), j; + for (j = 2; j <= k; j++) + if (i % j == 0) break; + + // 若是 j >= k + 1 表示 i 没有被整除 即 i 为素数 + if (j >= k + 1) + arrayList.add(i); + } + + return ArrayUtil.toArray(arrayList); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + + ArrayList arrayList = new ArrayList(); + + for (int i = 6; i < max; i += 2) { + + if (i == 6) { + arrayList.add(i); + continue; + } + + int factorSum = 0; + + if (i % 3 == 1 && i % 9 == 1) { + + boolean flag = false; + + if (i % 10 == 6 ) { + flag = true; + } + + if (i % 10 == 8) { + if (i % 100 == 28) { + flag = true; + } + } + + if (flag) { + + for (int j = 1; j <= (i / 2); j++) { + + if (i % j == 0) { + factorSum += j; + } + } + } + + } + + if (factorSum == i) { + arrayList.add(i); + } + + } + + return ArrayUtil.toArray(arrayList); + } + + // 将ArrayList对象转换为数组返回 + private static int[] toArray(ArrayList arrayList) { + int[] array = new int[arrayList.size()]; + + for (int i = 0; i < array.length; i++) + array[i] = (Integer) arrayList.get(i); + + return array; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator){ + + StringBuffer stringBuffer = new StringBuffer(); + + for (int i = 0; i < array.length - 1; i++) + stringBuffer.append("" + array[i] + seperator); + + stringBuffer.append(array[array.length - 1]); + + return stringBuffer.toString(); + } + + +} diff --git a/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java b/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..1b1e7005b4 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,99 @@ +package com.coderising.array; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +/** + * Created by damocles on 2017/3/1. + */ +public class ArrayUtilTest { + private ArrayUtil arrayUtil; + private int[] oldArray = null; + private int[] newArray = null; + + @Before + public void setUp() throws Exception { + arrayUtil = new ArrayUtil(); + } + + @After + public void tearDown() throws Exception { + } + + + @Test + public void reverseArray() throws Exception { + oldArray = new int[]{7, 9, 30, 3}; + newArray = new int[]{3, 30, 9, 7}; + arrayUtil.reverseArray(oldArray); + + Assert.assertArrayEquals(newArray, oldArray); + + oldArray = new int[]{3, 30, 9, 7, 4}; + newArray = new int[]{4, 7, 9, 30, 3}; + arrayUtil.reverseArray(oldArray); + + Assert.assertArrayEquals(newArray, oldArray); + } + + @Test + public void removeZero() throws Exception { + oldArray = new int[]{1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + newArray = new int[]{1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}; + + Assert.assertArrayEquals(newArray, arrayUtil.removeZero(oldArray)); + + } + + @Test + public void merge() throws Exception { + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + newArray = new int[]{3, 4, 5, 6, 7, 8}; + + Assert.assertArrayEquals(newArray, arrayUtil.merge(a1, a2)); + } + + @Test + public void grow() throws Exception { + oldArray = new int[]{2, 3, 6}; + newArray = new int[]{2, 3, 6, 0, 0, 0}; + int size = 3; + + Assert.assertArrayEquals(newArray, arrayUtil.grow(oldArray, size)); + } + + @Test + public void fibonacci() throws Exception { + newArray = new int[]{1, 1, 2, 3, 5, 8, 13}; + + Assert.assertArrayEquals(newArray, arrayUtil.fibonacci(15)); + } + + @Test + public void getPrimes() throws Exception { + newArray = new int[]{2, 3, 5, 7, 11, 13, 17, 19}; + + Assert.assertArrayEquals(newArray, arrayUtil.getPrimes(23)); + } + + @Test + public void getPerfectNumbers() throws Exception { + newArray = new int[]{6, 28, 496, 8128}; + System.out.println(33550336 % 27); + Assert.assertArrayEquals(newArray, arrayUtil.getPerfectNumbers(10000)); + } + + @Test + public void join() throws Exception { + oldArray = new int[]{3, 8, 9, 10, 2}; + String seperator = "-"; + String exception = "3-8-9-10-2"; + + Assert.assertEquals(exception, arrayUtil.join(oldArray, seperator)); + } + +} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java b/group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..b76d6548b0 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,44 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + + if("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + + this.message = "login failed,please check your user/pwd"; + + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + + public void setPassword(String password){ + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group14/296933284/coding/src/com/coderising/litestruts/Struts.java b/group14/296933284/coding/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..0c83cf4507 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,141 @@ +package com.coderising.litestruts; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + SAXReader reader = new SAXReader(); + File file = new File("src/com/coderising/litestruts/struts.xml"); + View view = new View(); + + try { + // 加载配置文件 + Document doucment = reader.read(file); + Element struts = doucment.getRootElement(); + Iterator strutsIterator = struts.elementIterator(); + Element action = null; + Object obj = null; + + while (strutsIterator.hasNext()) { + action = (Element) strutsIterator.next(); + Attribute actionAttribute = action.attribute("name"); + + // 通过反射获取实例化对象 + if (actionAttribute.getValue().equals(actionName)) { + obj = Class.forName(action.attribute("class").getValue()).newInstance(); + break; + } + } + + Iterator> parametersIterator = parameters.entrySet().iterator(); + + while (parametersIterator.hasNext()) { + + Map.Entry entry = parametersIterator.next(); + + // 调用相应属性的setter方法 + Method setterMethod = obj.getClass().getMethod("set" + + toUpperFisrtLetter(entry.getKey()), String.class); + setterMethod.invoke(obj, entry.getValue()); + } + + Method exectueMethod= obj.getClass().getMethod("execute"); + String exectueValue = (String) exectueMethod.invoke(obj); + + // 获取类中的所有属性 + Field[] fields = obj.getClass().getDeclaredFields(); + HashMap fieldHashMap = new HashMap<>(); + + for(int i = 0; i < fields.length; i++){ + + String fieldName = fields[i].getName(); + + // 获取对应的getter方法 + Method getterMethod = obj.getClass().getMethod("get" + + toUpperFisrtLetter(fieldName)); + String fieldValue = (String) getterMethod.invoke(obj); + + fieldHashMap.put(fieldName, fieldValue); + } + + + view.setParameters(fieldHashMap); + + Iterator actionIterator = action.elementIterator(); + + while (actionIterator.hasNext()) { + Element result = (Element) actionIterator.next(); + Attribute resuAttribute = result.attribute("name"); + + if (resuAttribute.getValue().equals(exectueValue)) { + view.setJsp(result.getStringValue()); + break; + } + } + + } catch (DocumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return view; + } + + // 将字符串首字母大写 + @NotNull + private static String toUpperFisrtLetter(String str) { + String string = str.toLowerCase(); + char[] cs = string.toCharArray(); + // 首字母大写 + cs[0] -= 32; + + return String.valueOf(cs); + } + +} diff --git a/group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java b/group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..ab335a0ea4 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,41 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group14/296933284/coding/src/com/coderising/litestruts/View.java b/group14/296933284/coding/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group14/296933284/coding/src/com/coderising/litestruts/struts.xml b/group14/296933284/coding/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..ea46090bc9 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/ArrayList.java b/group14/296933284/coding/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..116020466d --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/ArrayList.java @@ -0,0 +1,147 @@ +package com.coding.basic; + +import java.util.Arrays; + +/** + * ArrayList ʵ 14С 296933284 + * + * @author Tonnyson + * + */ +public class ArrayList implements List { + + private int size; + private static final int DEFAULT_CAPACITY = 10; + private Object[] elementData; + + + public ArrayList() { + elementData = new Object[DEFAULT_CAPACITY]; + } + + public ArrayList(int initCapacity) { + elementData = new Object[initCapacity]; + } + + /** + * ĩβָԪأԶչΪԭȵ + */ + public void add(Object obj) { + + ensureCapacityInternal(size); + + elementData[size] = obj; + size++; + } + + + /** + * ָλòԪ + */ + public void add(int index, Object obj) { + + rangCheckForAdd(index); + ensureCapacityInternal(size + 1); + + for (int i = size - 1; i >= index; i--) + elementData[i + 1] = elementData[i]; + + elementData[index] = obj; + size++; + } + + /** + * + */ + private void ensureCapacityInternal(int minCapacity) { + if (minCapacity - elementData.length > 0) { + int newCapacity = elementData.length * 2; + elementData = Arrays.copyOf(elementData, newCapacity); + // elementData = tempElementData; + } + } + + /** + * add() м±ǷԽ + */ + private void rangCheckForAdd(int index) { + if (index > size || index < 0) + throw new IndexOutOfBoundsException(); + } + + /** + * ָλõԪֵ + */ + public Object get(int index) { + + rangCheck(index); + + return elementData[index]; + } + + /** + * ɾָλõԪأظֵ + */ + public Object remove(int index) { + rangCheck(index); + + Object obj = elementData[index]; + + for (int i = index; i < size; i++) + elementData[i] = elementData[i + 1]; + + size--; + + return obj; + } + + /** + * ±ǷԽ + * + * @param index + */ + private void rangCheck(int index) { + if (index >= size) + throw new IndexOutOfBoundsException(); + } + + /** + * 鳤 + */ + public int size() { + return size; + } + + /** + * + * + * @return + */ + public Iterator iterator() { + return new Iter(); + } + + //ڲ + private class Iter implements Iterator { + int current; + + @Override + public boolean hasNext() { + return current != size; + } + + @Override + public Object next() { + + int i = current; + rangCheck(i); + current++; + + return elementData[i]; + } + + } + +} + + diff --git a/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java b/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java new file mode 100644 index 0000000000..b74dbe85a2 --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java @@ -0,0 +1,154 @@ +package com.coding.basic; + +/** + * BST ʵ 14С 296933284 + * + * @author Tonnyson + * + */ +public class BinarySearchTree implements Comparable { + + private Object data; + private BinarySearchTree leftChild; + private BinarySearchTree rightChild; + + public BinarySearchTree() { + super(); + this.data = null; + this.leftChild = null; + this.rightChild = null; + } + + public BinarySearchTree(Object data) { + this(); + this.data = data; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinarySearchTree getLeftChild() { + return leftChild; + } + + public void setLeftChild(BinarySearchTree leftChild) { + this.leftChild = leftChild; + } + + public BinarySearchTree getRightChild() { + return rightChild; + } + + public void setRightChild(BinarySearchTree rightChild) { + this.rightChild = rightChild; + } + + /** + * вڵ + * + * @param obj + * ڵֵ + */ + public void insert(Object obj) { + insert(obj, this); + } + + private boolean insert(Object obj, BinarySearchTree node) { + + BinarySearchTree bstNode = new BinarySearchTree(obj); + + if (node == null) { + node = bstNode; + return true; + } else if (node.compareTo(obj) == 0) { + return true; + } else if (node.compareTo(obj) > 0) { + + if (node.getLeftChild() != null) { + return insert(obj, node.getLeftChild()); + } + + node.leftChild = bstNode; + + } else if (node.compareTo(obj) < 0) { + + if (node.getRightChild() != null) { + return insert(obj, node.getRightChild()); + } + + node.rightChild = bstNode; + } + + return false; + + } + + /** + * BST Ľڵ㣬ʹ֮ + */ + public void inOrder(BinarySearchTree node) { + + if (node != null) { + inOrder(node.getLeftChild()); + visit(node); + inOrder(node.getRightChild()); + } + + } + + /** + * BST Ľڵֵ + */ + public void levelOrder(BinarySearchTree node) { + Queue queue = new Queue(); + BinarySearchTree bstNode = null; + queue.enQueue(node); + + while (!queue.isEmpty()) { + bstNode = (BinarySearchTree) queue.deQueue(); + visit(bstNode); + + if (bstNode.getLeftChild() != null) { + queue.enQueue(bstNode.getLeftChild()); + } + + if (bstNode.getRightChild() != null) { + queue.enQueue(bstNode.getRightChild()); + } + } + } + + /** + * ָڵֵ + * + * @param node + */ + public void visit(BinarySearchTree node) { + System.out.println(node.getData()); + } + + /** + * Ƚ BST ڵֵС + */ + @Override + public int compareTo(Object obj) { + int result = 0; + + if (obj instanceof Integer) { + Integer value = (Integer) obj; + Integer thisValue = (Integer) this.data; + result = thisValue.compareTo(value); + } else { + String value = obj.toString(); + result = this.data.toString().compareTo(value); + } + + return result; + } + +} diff --git a/group14/296933284/coding/src/com/coding/basic/Iterator.java b/group14/296933284/coding/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e7cbd474ec --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group14/296933284/coding/src/com/coding/basic/JavaTest.java b/group14/296933284/coding/src/com/coding/basic/JavaTest.java new file mode 100644 index 0000000000..8c4cab01b6 --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/JavaTest.java @@ -0,0 +1,176 @@ +package com.coding.basic; + +import org.junit.Test; + +public class JavaTest { + + @Test + public void binarySearchTreeTest() { + BinarySearchTree bSTree = new BinarySearchTree(5); + + System.out.println(bSTree.getData()); + + // insert + bSTree.insert(1); + bSTree.insert(2); + bSTree.insert(4); + bSTree.insert(6); + bSTree.insert(7); + bSTree.insert(8); + System.out.println("-----------------"); + // inOrder + bSTree.inOrder(bSTree); + + System.out.println("-----------------"); + // levelOrder + bSTree.levelOrder(bSTree); + } + + @Test + public void queueTest() { + Queue queue = new Queue(); + + // enQueue() + for (int i = 0; i < 10; i++) { + queue.enQueue("hello: " + i); + } + + // size() + System.out.println(queue.size()); // 10 + // isEmpty + System.out.println(queue.isEmpty()); + + // deQueue() + for (int i = 0; i < 10; i++) { + System.out.println(queue.deQueue()); + } + + // size() + System.out.println(queue.size()); // 0 + + // isEmpty + System.out.println(queue.isEmpty()); + } + + @Test + public void stackTest() { + Stack stack = new Stack(); + + // push() + for (int i = 0; i < 10; i++) { + stack.push("hello: " + i); + } + + // size() + System.out.println(stack.size()); + + // pop() + for (int i = 0; i < 10; i++) { + System.out.println(stack.pop()); + } + + // isEmpty() + System.out.println(stack.isEmpty()); + System.out.println(stack.size()); + + stack.push("hello world 1"); + stack.push("hello world 2"); + stack.push("hello world 3"); + stack.push("hello world 4"); + + // peek() + System.out.println(stack.peek()); + + // isEmpty() + System.out.println(stack.isEmpty()); + } + + @Test + public void linkedListTest() { + LinkedList linkedList = new LinkedList(); + + // add() addLast() + for (int i = 0; i < 5; i++) { + linkedList.add("hello: " + i); + } + + // iterator() get() getPreNode() + Iterator iter = linkedList.iterator(); + + while (iter.hasNext()) { + System.out.println(iter.next()); + } + System.out.println("-----------------------"); + LinkedList linkedList1 = new LinkedList(); + + // addFirst() + for (int i = 0; i < 5; i++) { + linkedList1.addFirst("hello: " + i); + } + + Iterator iter1 = linkedList1.iterator(); + + while (iter1.hasNext()) { + System.out.println(iter1.next()); + } + + System.out.println("-----------------------"); + // remove() + System.out.println(linkedList1.remove(0)); // hello: 4 + + System.out.println("-----------------------"); + // removeFirst() removeLast() + System.out.println(linkedList1.removeFirst()); // hello: 3 + System.out.println(linkedList1.removeLast()); // hello: 0 + + System.out.println("-----------------------"); + // size() + System.out.println(linkedList.size()); // 5 + } + + @Test + public void arrayListTest() { + ArrayList arrayList = new ArrayList(); + + // add(obj) + for (int i = 0; i < 10; i++) { + arrayList.add("hello: " + i); + } + + // get(index) + for (int i = 0; i < arrayList.size(); i++) { + System.out.println("-->" + arrayList.get(i)); + } + + // add(index, obj) + arrayList.add(5, "Tennyson"); + + for (int i = 0; i < arrayList.size(); i++) { + System.out.println("++>" + arrayList.get(i)); + } + + // size() + System.out.println("size: " + arrayList.size()); + System.out.println("index 5: " + arrayList.get(5)); + + // remove() + Object value = arrayList.remove(5); + System.out.println("index 5: " + value); + System.out.println("size: " + arrayList.size()); + System.out.println("index5: " + arrayList.get(5)); + + for (int i = 0; i < arrayList.size(); i++) { + System.out.println("index " + i + " : " + arrayList.get(i)); + } + + System.out.println("-------------------------------"); + // iterator + Iterator iter = arrayList.iterator(); + while (iter.hasNext()) { + System.out.println(iter.next()); + } + + System.out.println("-------------------------------"); + + } +} diff --git a/group14/296933284/coding/src/com/coding/basic/LinkedList.java b/group14/296933284/coding/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..3c37904532 --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/LinkedList.java @@ -0,0 +1,215 @@ +package com.coding.basic; + +import java.util.Collection; + + +/** + * LinkedList (ͷĵ) ʵ 14С 296933284 + * + * @author Tonnyson + * + */ +public class LinkedList implements List { + + private Node head; + private int size; + + public LinkedList() { + super(); + this.head = new Node(); + this.size = 0; + } + + public void add(Object obj) { + addLast(obj); + } + + public void add(int index, Object obj) { + + if (index == size + 1) { + addLast(obj); + } else { + Node r = getPreNode(index); + Node node = new Node(); + node.data = obj; + node.next = r.next; + r.next = node; + size++; + } + } + + + + /** + * ײڵ + * + * @param obj ڵĽڵֵ + * + */ + public void addFirst(Object obj) { + Node node = new Node(); + node.data = obj; + + node.next = head.next; + head.next = node; + size++; + } + + /** + * βڵ + * + * @param obj ڵĽڵֵ + * + */ + public void addLast(Object obj) { + + Node node = new Node(); + node.data = obj; + node.next = null; + + Node r = head; + while (r.next != null) r = r.next; + + r.next = node; + + size++; + + } + + /** + * Ԫذ˳뵥 + * + * @param c Ҫ뵥Ԫصļ + * + */ + public void addAll(Collection c) { + + Iterator iter = (Iterator) c.iterator(); + + while (iter.hasNext()) { + addLast(iter.next()); + } + } + + /** + * ȡָλõĽڵֵ + */ + public Object get(int index) { + // rangCheck(index); + + return getPreNode(index).next.data; + } + + /** + * ɾָλýڵ㣬ؽڵֵ + */ + public Object remove(int index) { + + rangCheck(index); + + Node r = getPreNode(index); + + Object result = r.next.data; + + r.next = r.next.next; + size--; + return result; + } + + /** + * ɾһڵ㣬ؽڵֵ + * + * @return һڵֵ + */ + public Object removeFirst() { + return remove(0); + } + + /** + * ɾһڵ㣬ؽڵֵ + * + * @return һڵֵ + */ + public Object removeLast() { + return remove(size - 1); + } + + // ȡָλõǰ㲢 + private Node getPreNode(int index) { + + rangCheck(index); + + if (index == 0) { + return head; + } else { + Node r = head; + + for (int i = 0; i < index; i++) + r = r.next; + + return r; + } + + } + + /** + * صij + */ + public int size() { + return size; + } + + /** + * + * + * @return һ + */ + public Iterator iterator() { + return new Iter(); + } + + // ڲ + private class Iter implements Iterator { + int current = 0; + + @Override + public boolean hasNext() { + return current != size; + } + + @Override + public Object next() { + int i = current; + + rangCheck(i); + + current++; + + return get(i); + } + + } + + /** + * ǷԽ + * + * @param index + */ + private void rangCheck(int index) { + if (index > size || index < 0) + throw new IndexOutOfBoundsException(); + } + + private static class Node { + Object data; + Node next; + + public Node() { + super(); + this.data = null; + this.next = null; + } + + + } +} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/List.java b/group14/296933284/coding/src/com/coding/basic/List.java new file mode 100644 index 0000000000..969e6dd82b --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object obj); + public void add(int index, Object obj); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group14/296933284/coding/src/com/coding/basic/Queue.java b/group14/296933284/coding/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..9257eb04ca --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/Queue.java @@ -0,0 +1,50 @@ +package com.coding.basic; + +/** + * Queue ʵ + * First In First Out + * 14С 296933284 + * + * @author Tonnyson + * + */ +public class Queue { + + private LinkedList elementData = new LinkedList(); + + /** + * вԪ + * + * @param obj + */ + public void enQueue(Object obj){ + elementData.addLast(obj); + } + + /** + * ɾԪ + * + * @return + */ + public Object deQueue(){ + return elementData.removeFirst(); + } + + /** + * ж϶ǷΪ + * + * @return + */ + public boolean isEmpty(){ + return elementData.size() == 0; + } + + /** + * ضеԪظ + * + * @return + */ + public int size(){ + return elementData.size(); + } +} diff --git a/group14/296933284/coding/src/com/coding/basic/Stack.java b/group14/296933284/coding/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..e28a9e3760 --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/Stack.java @@ -0,0 +1,61 @@ +package com.coding.basic; + +/** + * Stack ʵ + * Last In First Out + * 14С 296933284 + * + * @author Tonnyson + * + */ +public class Stack { + + private ArrayList elementData = new ArrayList(); + private int top = 0; + + /** + * ջвԪ + * + * @param obj + */ + public void push(Object obj) { + elementData.add(obj); + top++; + } + + /** + * ջȡԪ + * + * @return + */ + public Object pop() { + return elementData.remove(--top); + } + + /** + * ȡջԪ + * + * @return + */ + public Object peek() { + return elementData.get(top - 1); + } + + /** + * жջǷΪ + * + * @return + */ + public boolean isEmpty() { + return top == 0; + } + + /** + * ȡջԪظ + * + * @return + */ + public int size() { + return top; + } +} diff --git a/group14/352504906/test/.classpath b/group14/352504906/test/.classpath new file mode 100644 index 0000000000..18d70f02cb --- /dev/null +++ b/group14/352504906/test/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group14/352504906/test/.project b/group14/352504906/test/.project new file mode 100644 index 0000000000..b0299dbe76 --- /dev/null +++ b/group14/352504906/test/.project @@ -0,0 +1,17 @@ + + + test + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group14/352504906/test/.settings/org.eclipse.core.resources.prefs b/group14/352504906/test/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..e2d1bdfc9f --- /dev/null +++ b/group14/352504906/test/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +#Sun Feb 26 15:56:36 CST 2017 +eclipse.preferences.version=1 +encoding//src/com/coding/basic=UTF-8 +encoding//src/com/coding/basic/SimpleArrayList.java=UTF-8 +encoding/=UTF-8 +encoding/src=UTF-8 diff --git a/group14/352504906/test/.settings/org.eclipse.jdt.core.prefs b/group14/352504906/test/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..06bffba000 --- /dev/null +++ b/group14/352504906/test/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Sun Feb 26 15:31:53 CST 2017 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/group14/352504906/test/src/com/coding/basic/SimpleArrayList.java b/group14/352504906/test/src/com/coding/basic/SimpleArrayList.java new file mode 100644 index 0000000000..931d0af3aa --- /dev/null +++ b/group14/352504906/test/src/com/coding/basic/SimpleArrayList.java @@ -0,0 +1,118 @@ +package com.coding.basic; + +import java.util.Arrays; + + +/** + * @Description 简单实现ArrayList + */ +public class SimpleArrayList implements SimpleList{ + private int size = 0; + private Object[] elementData = new Object[10]; + /** + * 插入元素o + * @param o 待插入元素 + */ + public void add(Object o){ + //扩容 + if(elementData.length < size + 1){ + grow(size+1); + } + elementData[size++] = o; + } + /** + * 数组扩容 + * @param capacity 数组实际长度 + */ + private void grow(int capacity) { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容50% + if(capacity > newCapacity){ + newCapacity = capacity; + } + elementData = Arrays.copyOf(elementData, newCapacity); + } + /** + * 在指定索引初插入元素 + * @param index 索引 + * @param o 待插入元素 + */ + public void add(int index,Object o){ + rangeCheckForAdd(index); + if(elementData.length size || index <0){ + throw new IndexOutOfBoundsException("数组越界异常"); + } + } + /** + * 索引越界处理 + * @param index 索引 + */ + private void rangeCheck(int index) { + if(index >= size || index <0) + throw new IndexOutOfBoundsException("数组越界异常"); + } + /** + * 移除该索引处元素 + * @param index 索引位置 + * @return 移除元素 + */ + public Object remove(int index){ + rangeCheck(index); + Object oldObject = elementData[index]; + if(size > index +1){ + System.arraycopy(elementData, index +1 , elementData, index, size-index-1); + } + elementData[--size] = null; + return oldObject; + } + /** + * 返回集合长度 + * @return 长度 + */ + public int size(){ + return this.size; + } + /** + * 返回指定索引元素 + * @param index 索引 + * @return Object 元素 + */ + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + private class ArrayListIterator implements SimpleIterator{ + SimpleArrayList l = null; + private int iteratorIndex = 0; + + private ArrayListIterator(SimpleArrayList arrayList){ + this.l = arrayList; + } + + @Override + public boolean hasNext() { + return iteratorIndex < size; + } + + @Override + public Object next() { + if (iteratorIndex >= size) { + throw new RuntimeException("数组越界异常"); + } + return elementData[iteratorIndex++]; + } + + } +} diff --git a/group14/352504906/test/src/com/coding/basic/SimpleIterator.java b/group14/352504906/test/src/com/coding/basic/SimpleIterator.java new file mode 100644 index 0000000000..fd8db0aa8f --- /dev/null +++ b/group14/352504906/test/src/com/coding/basic/SimpleIterator.java @@ -0,0 +1,11 @@ +package com.coding.basic; + +/** + *简单迭代器接口 + * + */ +public interface SimpleIterator { + public Object next(); + public boolean hasNext(); + +} diff --git a/group14/352504906/test/src/com/coding/basic/SimpleLinkedList.java b/group14/352504906/test/src/com/coding/basic/SimpleLinkedList.java new file mode 100644 index 0000000000..692fd23f62 --- /dev/null +++ b/group14/352504906/test/src/com/coding/basic/SimpleLinkedList.java @@ -0,0 +1,126 @@ +package com.coding.basic; +/** + * @Description 简单实现linkedList + */ +public class SimpleLinkedList implements SimpleList{ + private Node head; + + private int size = 0; + /** + * 返回集合长度 + * @return 长度 + */ + public int size(){ + return this.size; + } + /** + * 返回指定索引出元素 + * @param index 索引 + * @return Object 元素 + */ + public Object get(int index){ + rangeCheck(index); + Node current = head; + for(int i =0;i size || index < 0){ + throw new RuntimeException("找不到该节点"); + } + } + //头插法 + public void addFirst(Object o){ + Node newNode = new Node(o); + newNode.next = head; + head = newNode; + size++; + } + //尾插法 + public void addLast(Object o){ + Node newNode = new Node(o); + Node current = head;//设定一个当前节点,便于遍历 + while(current.next!=null){ + current = current.next; + } + if(current.next == null)//尾节点 + { + current.next = newNode; + size++; + } + } + /** + * 移除该索引处元素 + * @param index 索引位置 + * @return 移除元素 + */ + public Object remove(int index){ + rangeCheck(index+1); + Node current = head; + if(index == 0){//头部删除 + Object removeObj = head.o; + head = head.next; + size --; + return removeObj; + } + int i; + for(i=0;i newCapacity){ + newCapacity = capacity; + } + elementData = Arrays.copyOf(elementData, newCapacity); + } + /** + * 移除并返回队列头部元素 + * @return 队列头部元素 + */ + public Object deQueue(){ + Object o = elementData[size-1]; + removeElement(0); + return o; + } + /** + * 删除指定索引处元素 + * @param index 索引 + */ + private void removeElement(int index) { + if(index >= 0){ + System.arraycopy(elementData, index+1, elementData, 0, size-index-1); + elementData[--size] = null; + } + } + /** + * 判断队列是否为空 + * @return Boolean + */ + public boolean isEmpty(){ + return size==0; + } + /** + * 返回队列长度 + * @return int 队列长度 + */ + public int size(){ + return this.size; + } +} diff --git a/group14/352504906/test/src/com/coding/basic/SimpleStack.java b/group14/352504906/test/src/com/coding/basic/SimpleStack.java new file mode 100644 index 0000000000..66d5e7dbe1 --- /dev/null +++ b/group14/352504906/test/src/com/coding/basic/SimpleStack.java @@ -0,0 +1,76 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.EmptyStackException; + +/** + * @Description 简单实现stack + */ +public class SimpleStack { + private Object[] elementData = new Object[10]; + private int size; + /** + * 往栈顶添加新的元素 + * @param o 要添加的元素 + */ + public void push(Object o){ + //扩容 + if(elementData.length < size +1){ + grow(size+1); + } + elementData[size++] = o; + } + /** + * 数组扩容 + * @param capacity 数组实际长度 + */ + private void grow(int capacity) { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity *2;//扩容2倍 + if(newCapacity < capacity){ + newCapacity = capacity; + } + elementData = Arrays.copyOf(elementData, newCapacity); + } + /** + * 移除并返回栈顶元素 + * @return Object 返回该移除的元素 + */ + public Object pop(){ + Object o = peek(); + removeElement(size-1); + return o; + } + /** + * 移除栈顶元素 + * @param length 栈的长度 + */ + private void removeElement(int length) { + elementData = Arrays.copyOf(elementData, length); + size --; + } + /** + * 返回栈顶元素 + * @return Object 栈顶元素 + */ + public Object peek(){ + if(size == 0){ + throw new EmptyStackException(); + } + return elementData[size-1]; + } + /** + * 查询并返回栈的长度 + * @return int 栈的长度 + */ + public int size(){ + return this.size; + } + /** + * 判断是否为空栈 + * @return boolean + */ + public boolean isEmpty(){ + return size==0; + } +} diff --git "a/group14/352504906/\346\265\205\350\260\210CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.txt" "b/group14/352504906/\346\265\205\350\260\210CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.txt" new file mode 100644 index 0000000000..d269d4a4ab --- /dev/null +++ "b/group14/352504906/\346\265\205\350\260\210CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.txt" @@ -0,0 +1 @@ +͵ַhttp://www.cnblogs.com/superFish2016/articles/cpu.html \ No newline at end of file diff --git a/group14/598808350/20170219.txt b/group14/598808350/20170219.txt new file mode 100644 index 0000000000..2570935d90 --- /dev/null +++ b/group14/598808350/20170219.txt @@ -0,0 +1,5 @@ + CPUڴ棬 Ӳָ̣֮Ĺϵ + +http://blog.sina.com.cn/s/blog_986d02cd0102xncn.html + +QQ:598808350 \ No newline at end of file diff --git a/group14/598808350/2017project/src/org/comm/util/StringUtil.java b/group14/598808350/2017project/src/org/comm/util/StringUtil.java new file mode 100644 index 0000000000..9c7b802252 --- /dev/null +++ b/group14/598808350/2017project/src/org/comm/util/StringUtil.java @@ -0,0 +1,30 @@ +package org.comm.util; + +import java.util.Arrays; + +public class StringUtil { + + public static void printStr(Object obj){ + System.out.print(obj); + } + + public static void printlnStr(Object obj){ + System.out.println(obj.toString()); + } + public static void printArr(int[] arr){ + printlnStr(Arrays.toString(arr)); + } + public static boolean isEmpty(Object str){ + boolean flag = false; + if(str == null || "".equals(str)) flag = true; + return flag; + } + public static String objToStr(Object obj){ + if(isEmpty(obj)){ + return ""; + }else{ + return obj.toString(); + } + } + +} diff --git a/group14/598808350/2017project/src/org/learning/container/ArrayList.java b/group14/598808350/2017project/src/org/learning/container/ArrayList.java new file mode 100644 index 0000000000..5755c7cf3a --- /dev/null +++ b/group14/598808350/2017project/src/org/learning/container/ArrayList.java @@ -0,0 +1,186 @@ +package org.learning.container; + + +public class ArrayList { + + private Object [] objs = null; + private int index = -1; + public ArrayList(){ + objs = new Object[5]; + } + public ArrayList(int size){ + objs = new Object[size]; + } + /** + * һµ + * @param src + * @param src_index + * @param dest + * @param dest_index + * @param length + * @return + */ + private static Object[] copy(Object[] src,int src_index,Object[] dest,int dest_index,int length){ + System.arraycopy(src, src_index, dest, dest_index, length); + return dest; + } + + public void add(Object obj){ + if(this.index == objs.length-1) { + Object[] dest = new Object[objs.length+5]; + objs = copy(objs,0,dest,0,objs.length); + } + this.index ++; + objs[this.index] = obj; + } + + public void add(int index,Object obj){ + if(index-1 > this.index || index < 0){ + throw new IndexOutOfBoundsException(); + } + Object[] dest = new Object[objs.length+5]; + if(index == 0){ + dest[index] = obj; + dest =copy(objs,index,dest,index+1,getSize()); + objs = dest; + }else if(index == getSize()){ + objs[index] = obj; + }else{ + dest = copy(objs,0,dest,0,index);//ǰ + dest[index] = obj; //м䲿 + dest =copy(objs,index,dest,index+1,getSize()-index);//󲿷 + objs = dest; + } + this.index++; + } + + public Object get(int index){ + if(index > this.index || index <0){ + throw new IndexOutOfBoundsException(); + } + return objs[index]; + } + + public boolean isEmpty(){ + if(objs == null || this.index == -1){ + return true; + } + return false; + } + + public int getSize(){ + return this.index+1; + } + + public boolean remove(int index){ + if (index <0 || index > objs.length){ + throw new IndexOutOfBoundsException(); + } + Object[] dest = new Object[this.index]; + dest = copy(objs,0,dest,0,index);//ǰ + dest = copy(objs,index+1,dest,index,this.index-index);//󲿷 + objs = dest; + this.index --; + return true; + } + public boolean remove(Object obj){ + for(int i=0;i<=this.index;i++){ + if(obj==null ? get(i)==null : obj.equals(get(i))) { + remove(i); //i ǰԪص±ʶ + return true; + } + } + return false; + } + public static void print(Object obj){ + System.out.println(obj); + } + + public static void main(String [] args){ + ArrayList al = new ArrayList(); + /*print(al.isEmpty()); + al.add("a1"); + print(al.isEmpty()); + print(al.getSize()); + print(al.get(0)); + print(al.get(1));*/ + al.add("a0"); + al.add("a1"); + al.add("a2"); + al.add("a3"); + al.add("a4"); + al.add("a5"); + + //al.remove(0); + //al.remove(5); + //al.remove(2); + /*boolean flag = al.remove("a7"); + print(flag); + for(int i=0;i0;i--){ + newArray[length -i ] = sourceArray[i-1]; + } + return newArray; + + } + + /** + * һ飬 int [] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵ뵽һµ飬Ϊ + * [1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5] + * @param oldArray + * @return + */ + public static int[] removeZero(int [] oldArray){ + int oldLength = oldArray.length; + int [] newArray = new int[oldLength]; + int index = 0; + for(int i=0;i 0){ + newArray[index] = oldArray[i]; + index ++ ; + } + } + int [] dest = new int[index]; + System.arraycopy(newArray, 0, dest, 0, index); + return dest; + } + /** + * ð + * @param array1 + * @return + */ + public static int[] sort(int [] arr){ + //int[] a1 = new int[]{5, 3, 7,8,1,3,42,2,6}; + + for(int i=0;ib){ + arr[i]=b; + arr[j]=a; + }else if(a == b){ + arr[j]=0; + } + } + } + + return arr; + } + + public static int[] replace(int[] sourceArr,int[] resultArr,int index){ + System.arraycopy(sourceArr, 0, resultArr, 0, index); + System.arraycopy(sourceArr, index+1, resultArr, index, sourceArr.length-(index+1)); + return resultArr; + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ + * a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + int [] newArr = new int[array1.length+array2.length]; + //1 + int array1L = removeZero(array1).length; + int array2L = removeZero(array2).length; + int [] array3 = new int[array1L+array2L]; + System.arraycopy(array1, 0, array3, 0, array1L); + System.arraycopy(array2, 0, array3, array1L, array2L); + //2 + sort(array3); + //3 ȥ + for(int i=0;i=max){break;} + //printStr(c+","); + result[rIndex] = c; + rIndex +=1; + }else if(aIndex == 3){ + aIndex = 0; + bIndex = 3; + a = b+c; + if(a>=max){break;} + //printStr(c+","); + result[rIndex] = a; + rIndex +=1; + }else if(bIndex == 3){ + cIndex = 3; + bIndex = 0; + b = c+a; + if(b>=max){break;} + //printStr(c+","); + result[rIndex] = b; + rIndex +=1; + } + } + + + return removeZero(result); + } + + /** + * Сڸֵmax + * max = 23, صΪ[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public static int[] getPrimes(int max){ + int [] result = new int[max]; + result[0] =2; + result[1] =3; + result[2] =5; + result[3] =7; + int index = 4; + for(int i = 8;i params = new HashMap(); + params.put("name", "test"); + params.put("pwd", "1234"); + runAction(actionName,params); + } + + public static View runAction(String actionName, Map parameters) { + HashMap strutsMap = ReadXML.readXml(actionName); + View view = null; + + if(!strutsMap.isEmpty()){ + String className = (String)strutsMap.get("ClassName"); + + try { + Class cls = Class.forName(className); + try { + Object obj = cls.newInstance(); + Field nameF = cls.getDeclaredField("name"); + nameF.setAccessible(true); + nameF.set(obj, StringUtil.objToStr(parameters.get("name"))); + + Field pwdF = cls.getDeclaredField("password"); + pwdF.setAccessible(true); + pwdF.set(obj, StringUtil.objToStr(parameters.get("pwd"))); + + try { + Method method = cls.getMethod("execute"); + String result = (String)method.invoke(obj); + Field messageF = cls.getDeclaredField("message"); + messageF.setAccessible(true); + String msg = (String)messageF.get(obj); + String pageUrl = (String)strutsMap.get(result+"URL"); + view = new View(); + view.setJsp(pageUrl); + HashMap map = new HashMap(); + map.put("msg", msg); + map.put("result", result); + view.setParameters(map); + + StringUtil.printlnStr("result:"+result); + StringUtil.printlnStr("msg:"+msg); + StringUtil.printlnStr("pageUrl:"+pageUrl); + } catch (NoSuchMethodException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + }catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + + + } catch (InstantiationException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IllegalAccessException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + }catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchFieldException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + }else{ + StringUtil.printlnStr("Action is not found"); + } + + + return view; + } + +} diff --git a/group14/598808350/2017project/src/org/lite/struts/View.java b/group14/598808350/2017project/src/org/lite/struts/View.java new file mode 100644 index 0000000000..bb6a56a8c1 --- /dev/null +++ b/group14/598808350/2017project/src/org/lite/struts/View.java @@ -0,0 +1,23 @@ +package org.lite.struts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group14/598808350/2017project/src/org/lite/struts/struts.xml b/group14/598808350/2017project/src/org/lite/struts/struts.xml new file mode 100644 index 0000000000..b9bf410c73 --- /dev/null +++ b/group14/598808350/2017project/src/org/lite/struts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group14/598808350/2017project/test/org/learning/container/TestArrayUtil.java b/group14/598808350/2017project/test/org/learning/container/TestArrayUtil.java new file mode 100644 index 0000000000..8ac30e9dd7 --- /dev/null +++ b/group14/598808350/2017project/test/org/learning/container/TestArrayUtil.java @@ -0,0 +1,78 @@ +package org.learning.container; + +import junit.framework.TestCase; + +import org.junit.Assert; + +public class TestArrayUtil extends TestCase{ + + private ArrayUtil au = null; + + @Override + public void setUp(){ + //ִ + //ʵ + au = new ArrayUtil(); + + } + public void testReverseArray(){ + int [] array1 = {7,9,30,3}; + int[] result1 = au.reverseArray(array1); + int[] exp1 = {3,30,9,7}; + Assert.assertArrayEquals(exp1, result1); + + } + public void testRemoveZero(){ + int[] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] newArray = au.removeZero(oldArray); + int[] exp1 = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}; + Assert.assertArrayEquals(exp1, newArray); + } + public void testMerge(){ + int[] array1 = {3, 5, 7,8}; + int[] array2 = {4, 5, 6,7}; + int[] newArray = au.merge(array1, array2); + int[] exp1 = {3,4,5,6,7,8}; + Assert.assertArrayEquals(exp1, newArray); + } + + public void testGrow(){ + int[] array1 = {3, 5, 7,8}; + int[] newArray = au.grow(array1, 1); + int[] exp1= {3, 5, 7,8,0}; + Assert.assertArrayEquals(exp1, newArray); + } + + public void testFibonacci(){ + int max = 22; + int[] newArray = au.fibonacci(max); + int[] exp1 = {1,1,2,3,5,8,13,21}; + Assert.assertArrayEquals(exp1, newArray); + } + public void testGetPrimes(){ + int max =23; + int[] newArray = au.getPrimes(max); + int[] exp1 = {2,3,5,7,11,13,17,19}; + Assert.assertArrayEquals(exp1, newArray); + } + public void testGetPerfectNumbers(){ + int max = 497; + int[] newArray = au.getPerfectNumbers(max); + int[] exp1 = {6, 28, 496}; + Assert.assertArrayEquals(exp1, newArray); + } + public void testJoin(){ + //join(int[] array, String seperator) + int[] array = {3,8,9}; + String seperator = "-"; + String result = au.join(array, seperator); + String exp1 = "3-8-9"; + Assert.assertEquals("", exp1, result); + } + + + @Override + public void tearDown(){ + //ִ + } +} diff --git a/group14/598808350/2017project/test/org/lite/struts/TestStruts.java b/group14/598808350/2017project/test/org/lite/struts/TestStruts.java new file mode 100644 index 0000000000..16ccc711e0 --- /dev/null +++ b/group14/598808350/2017project/test/org/lite/struts/TestStruts.java @@ -0,0 +1,38 @@ +package org.lite.struts; + +import java.util.HashMap; + +import org.junit.Assert; + +import junit.framework.TestCase; + +public class TestStruts extends TestCase{ + + private Struts struts = null; + + @Override + public void setUp(){ + struts = new Struts(); + } + public void testRunAction(){ + String actionName = "login"; + HashMap params = new HashMap(); + params.put("name", "test"); + params.put("pwd", "1234"); + View view = struts.runAction(actionName, params); + String jsp = view.getJsp(); + String exp1 = "/jsp/homepage.jsp"; + Assert.assertEquals("¼ɹ", exp1, jsp); + + params = new HashMap(); + params = new HashMap(); + params.put("name", "test"); + params.put("pwd", "12341"); + view = struts.runAction(actionName, params); + jsp = view.getJsp(); + exp1 = "/jsp/showLogin.jsp"; + Assert.assertEquals("󣬵¼ʧ", exp1, jsp); + + + } +} diff --git a/group14/598808350/2017project/test/org/test/all/TestAll.java b/group14/598808350/2017project/test/org/test/all/TestAll.java new file mode 100644 index 0000000000..265bdb4c64 --- /dev/null +++ b/group14/598808350/2017project/test/org/test/all/TestAll.java @@ -0,0 +1,24 @@ +package org.test.all; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import org.learning.container.TestArrayUtil; +import org.lite.struts.TestStruts; + +/** + * ӵһзС + * @author z + * + */ +public class TestAll extends TestCase{ + + public static Test suite(){ + TestSuite suite = new TestSuite(); + suite.addTestSuite(TestArrayUtil.class); + suite.addTestSuite(TestStruts.class); + return suite; + } + +} diff --git a/group14/630254746/Code2017/.classpath b/group14/630254746/Code2017/.classpath new file mode 100644 index 0000000000..72c2ba61af --- /dev/null +++ b/group14/630254746/Code2017/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group14/630254746/Code2017/.gitignore b/group14/630254746/Code2017/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group14/630254746/Code2017/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group14/630254746/Code2017/.project b/group14/630254746/Code2017/.project new file mode 100644 index 0000000000..06e2d605ec --- /dev/null +++ b/group14/630254746/Code2017/.project @@ -0,0 +1,17 @@ + + + code2017 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group14/630254746/Code2017/.settings/org.eclipse.jdt.core.prefs b/group14/630254746/Code2017/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group14/630254746/Code2017/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group14/630254746/Code2017/src/com/leaning/code/ArrayList.java b/group14/630254746/Code2017/src/com/leaning/code/ArrayList.java new file mode 100644 index 0000000000..980736245e --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/code/ArrayList.java @@ -0,0 +1,87 @@ +package com.leaning.code; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size; // ¼еԪظ + + private Object[] elementsData; + + private int totalCount = 1; // ¼ϵĴС + + public ArrayList() { + this.elementsData = new Object[totalCount]; + } + + private void grow() { + if (size >= totalCount) { + // + int oldCapacity = size; + int newCapacity = oldCapacity + oldCapacity << 1; + totalCount = newCapacity; + elementsData = Arrays.copyOf(elementsData, newCapacity); + } + } + + @Override + public void add(Object o) { + if (totalCount > size) { + elementsData[size++] = o; + } else { + grow(); + elementsData[size++] = o; + } + } + + @Override + public void add(int index, Object o) { + if (index < size) { + if (totalCount <= size + 1) { + grow(); + } + System.arraycopy(elementsData, index, elementsData, index + 1, size + - index); + elementsData[index] = 0; + + } else { + throw new RuntimeException("±Խ"); + } + size++; + } + + @Override + public Object get(int index) { + if (index < size) + return elementsData[index]; + else + throw new RuntimeException("±Խ"); + } + + @Override + public Object remove(int index) { + if (index >= size || index < 0) { + throw new RuntimeException("±Խ"); + } + Object o = elementsData[index]; + + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementsData, index + 1, elementsData, index, + numMoved); + elementsData[--size] = null; + + return o; + } + + @Override + public int size() { + return size; + } + + @Override + public String toString() { + return "ArrayList [elementsData=" + Arrays.toString(elementsData) + "]"; + } + +} diff --git a/group14/630254746/Code2017/src/com/leaning/code/Iterator.java b/group14/630254746/Code2017/src/com/leaning/code/Iterator.java new file mode 100644 index 0000000000..b9ae65aab1 --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/code/Iterator.java @@ -0,0 +1,8 @@ +package com.leaning.code; + +public interface Iterator { + + public boolean hasNext(); + + public Object Next(); +} diff --git a/group14/630254746/Code2017/src/com/leaning/code/LinkedList.java b/group14/630254746/Code2017/src/com/leaning/code/LinkedList.java new file mode 100644 index 0000000000..fd4c57a924 --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/code/LinkedList.java @@ -0,0 +1,150 @@ +package com.leaning.code; + + + + + + +public class LinkedList implements List { + + private Node head; + + private Node last; + + private int size; + + + void linkLast(Object o){ + Node lastNode = last; + Node newNode = new Node(lastNode, o, null); + last = newNode; + if (lastNode == null) + head = newNode; + else + lastNode.next = newNode; + size++; + } + + void linkHead(Object o){ + Node headNode = head; + Node newNode = new Node(null, o, headNode); + head = newNode; + if (head == null) + last = newNode; + else + head.prev = newNode; + size++; + } + + @Override + public void add(Object o) { + linkLast(o); + } + + @Override + public void add(int index, Object o) { + if (index < 0 || index >= size) { + throw new RuntimeException("±Խ"); + } + Node n = find(index); + Node pred = n.prev; + Node newNode = new Node(pred, o, n); + n.prev = newNode; + if (pred == null) + head = newNode; + else + pred.next = newNode; + size++; + } + + @Override + public Object get(int index) { + return find(index).item; + } + + Node find(int index){ + if (index < (size >> 1)) { + Node n = head; + for (int i = 0; i < index; i++) + n = n.next; + return n; + } else { + Node n = last; + for (int i = size - 1; i > index; i--) + n = n.prev; + return n; + } + } + + @Override + public Object remove(int index) { + Node n = find(index); + Object o = n.item; + final Node prev = n.prev; + final Node next = n.next; + if (null != prev) { + prev.next = next; + } + if (null != next) { + next.prev = prev; + } + n.item = null; + n.next = null; + n.prev = null; + size-- ; + return o; + } + + @Override + public int size() { + return size; + } + + public void addFrist(Object o){ + linkHead(o); + } + + public void addLast(Object o){ + linkLast(o); + } + + public Object removeFirst(){ + Object o = head.item; + Node n = head.next; + head = n; + if (n == null) + last = null; + else + n.prev = null; + size --; + return o; + } + + public Object removeLaset(){ + Object o = last.item; + Node p = last.prev; + last = p; + if (p == null) + head = null; + else + p.next = null; + size --; + return o; + } + + public Iterator iterator(){ + return null; + } + + public static class Node{ + Object item; + Node next; + Node prev; + + Node(Node prev, Object element, Node next) { + this.item = element; + this.next = next; + this.prev = prev; + } + } +} diff --git a/group14/630254746/Code2017/src/com/leaning/code/List.java b/group14/630254746/Code2017/src/com/leaning/code/List.java new file mode 100644 index 0000000000..22d039c4a5 --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/code/List.java @@ -0,0 +1,15 @@ +package com.leaning.code; + +public interface List { + + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); + +} diff --git a/group14/630254746/Code2017/src/com/leaning/code/Queue.java b/group14/630254746/Code2017/src/com/leaning/code/Queue.java new file mode 100644 index 0000000000..f1272b29cc --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/code/Queue.java @@ -0,0 +1,22 @@ +package com.leaning.code; + +public class Queue { + + private LinkedList list = new LinkedList(); + + public void enQueue(Object o) { + list.add(o); + } + + public Object deQueue() { + return list.removeFirst(); + } + + public boolean isEmpty(){ + return list.size() == 0; + } + + public int size(){ + return list.size(); + } +} diff --git a/group14/630254746/Code2017/src/com/leaning/code/Stack.java b/group14/630254746/Code2017/src/com/leaning/code/Stack.java new file mode 100644 index 0000000000..c988f489bb --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/code/Stack.java @@ -0,0 +1,31 @@ +package com.leaning.code; + +public class Stack { + + private ArrayList list = new ArrayList(); + + private int size; + + + public void push(Object o){ + list.add(o); + size ++; + } + + public Object pop(){ + return list.get(--size); + } + + public Object peek(){ + return list.get(size-1); + } + + public boolean isEmpty(){ + return size == 0; + } + + public int size(){ + return size; + } + +} diff --git a/group14/630254746/Code2017/src/com/leaning/code/test/ArrayListTest.java b/group14/630254746/Code2017/src/com/leaning/code/test/ArrayListTest.java new file mode 100644 index 0000000000..c680d5f8a5 --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/code/test/ArrayListTest.java @@ -0,0 +1,37 @@ +package com.leaning.code.test; + +import org.junit.Test; + +import com.leaning.code.ArrayList; +import com.leaning.code.LinkedList; + +public class ArrayListTest { + + @Test + public void test01(){ + ArrayList list = new ArrayList(); + list.add("a"); + list.add("b"); + list.add("c"); + + System.out.println(list.remove(0)); + System.out.println(list); + + } + + @Test + public void test02(){ + LinkedList list = new LinkedList(); + list.add("a"); + list.add("b"); + list.add("c"); + + list.add(2, "d"); + + System.out.println(list.remove(0)); + System.out.println(list.get(0)); + System.out.println(list.get(2)); + + + } +} diff --git a/group14/630254746/Code2017/src/com/leaning/coderising/array/ArrayUtil.java b/group14/630254746/Code2017/src/com/leaning/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..7e93be14ed --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/coderising/array/ArrayUtil.java @@ -0,0 +1,95 @@ +package com.leaning.coderising.array; + +public class ArrayUtil { + + /** + * һa , Ըֵû + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + return null; + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ + * a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ + * oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ + * 磬 max = 15 , 򷵻صӦΪ [11235813] + * max = 1, 򷵻ؿ [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * Сڸֵmax + * max = 23, صΪ[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * ν ָǡõ֮ͣ6=1+2+3 + * һֵmax һ飬 Сmax + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * seperator array + * array= [3,8,9], seperator = "-" + * 򷵻ֵΪ"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + +} diff --git a/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/LoginAction.java b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/LoginAction.java new file mode 100644 index 0000000000..4e3995f0e4 --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/LoginAction.java @@ -0,0 +1,42 @@ +package com.leaning.coderising.litesturts; + +/** + * һչʾ¼ҵ࣬ еû붼Ӳġ + * + * @author liuxin + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/Struts.java b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/Struts.java new file mode 100644 index 0000000000..d636ec27b6 --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/Struts.java @@ -0,0 +1,31 @@ +package com.leaning.coderising.litesturts; + +import java.util.Map; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. ȡļstruts.xml + + 1. actionNameҵӦclass LoginAction, ͨʵ + parametersеݣösetter parametersе + ("name"="test" , "password"="1234") , + ǾӦõ setNamesetPassword + + 2. ͨöexectue ÷ֵ"success" + + 3. ͨҵgetter getMessage, + ͨã ֵγһHashMap , {"message": "¼ɹ"} , + ŵViewparameters + + 4. struts.xmlе ,Լexecuteķֵ ȷһjsp + ŵViewjspֶС + + */ + + return null; + } +} diff --git a/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/View.java b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/View.java new file mode 100644 index 0000000000..1e81bad64d --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/View.java @@ -0,0 +1,23 @@ +package com.leaning.coderising.litesturts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/struts.xml b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/struts.xml new file mode 100644 index 0000000000..dd598a3664 --- /dev/null +++ b/group14/630254746/Code2017/src/com/leaning/coderising/litesturts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group14/641013587/14_641013587/.classpath b/group14/641013587/14_641013587/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group14/641013587/14_641013587/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group14/641013587/14_641013587/.gitignore b/group14/641013587/14_641013587/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group14/641013587/14_641013587/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group14/641013587/14_641013587/.project b/group14/641013587/14_641013587/.project new file mode 100644 index 0000000000..7433fa7872 --- /dev/null +++ b/group14/641013587/14_641013587/.project @@ -0,0 +1,17 @@ + + + 14_641013587 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group14/641013587/14_641013587/.settings/org.eclipse.jdt.core.prefs b/group14/641013587/14_641013587/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group14/641013587/14_641013587/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group14/641013587/14_641013587/src/com/coding/basic/ArrayList.java b/group14/641013587/14_641013587/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..48b84f02a2 --- /dev/null +++ b/group14/641013587/14_641013587/src/com/coding/basic/ArrayList.java @@ -0,0 +1,79 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + //ҳһյλøֵ + for(int i=0;i=size){ + return this.elementData[elementData.length]; + }else{ + return this.elementData[index]; + } + } + + public Object remove(int index){ + Object object = get(index); + System.arraycopy(elementData,index+1,elementData,index,size-1); + elementData[size-1]=null; + size--; + return object; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + + return new Iterator() { + + private int nextNum=0; + + @Override + public Object next() { + return get(nextNum++); + } + + @Override + public boolean hasNext() { + return nextNum>=size?false:true; + } + }; + } + +} diff --git a/group14/641013587/14_641013587/src/com/coding/basic/BinaryTreeNode.java b/group14/641013587/14_641013587/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group14/641013587/14_641013587/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group14/641013587/14_641013587/src/com/coding/basic/Iterator.java b/group14/641013587/14_641013587/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group14/641013587/14_641013587/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group14/641013587/14_641013587/src/com/coding/basic/LinkedList.java b/group14/641013587/14_641013587/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..de7114b424 --- /dev/null +++ b/group14/641013587/14_641013587/src/com/coding/basic/LinkedList.java @@ -0,0 +1,123 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head=new Node(); + + public void add(Object o){ + if(head.data==null){ + head.data=o; + return; + } + Node node=head; + for(;node.next!=null;){ + node=node.next; + } + node.next=new Node(); + node.next.data=o; + + } + public void add(int index , Object o){ + if(index==0){ + addFirst(o); + return; + } + Node node=head; + for(int i=0;i + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group14/676615845/algo/pom.xml b/group14/676615845/algo/pom.xml new file mode 100644 index 0000000000..d2e1f258a0 --- /dev/null +++ b/group14/676615845/algo/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + com.mark + algo + 1.0-SNAPSHOT + + + + junit + junit + 4.12 + + + \ No newline at end of file diff --git a/group14/676615845/algo/src/main/java/algo/BinarySearch.java b/group14/676615845/algo/src/main/java/algo/BinarySearch.java new file mode 100644 index 0000000000..3144a37181 --- /dev/null +++ b/group14/676615845/algo/src/main/java/algo/BinarySearch.java @@ -0,0 +1,17 @@ +package algo; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * Created by mark on 17/2/23. + */ +public class BinarySearch { + + public static int rank(int key, int[] a) { + List list = new ArrayList(); + list = new LinkedList(); + return -1; + } +} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/Array.java b/group14/676615845/algo/src/main/java/com/coding/basic/Array.java new file mode 100644 index 0000000000..44afce6c25 --- /dev/null +++ b/group14/676615845/algo/src/main/java/com/coding/basic/Array.java @@ -0,0 +1,16 @@ +package com.coding.basic; + +import java.util.Arrays; + +/** + * Created by mark on 17/2/24. + */ +public class Array { + + public static Object[] grow(Object[] src, int size) { + return Arrays.copyOf(src, src.length + size); +// Object[] target = new Object[src.length + size]; +// System.arraycopy(src, 0, target, 0, src.length); + + } +} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/ArrayList.java b/group14/676615845/algo/src/main/java/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..e38458e68e --- /dev/null +++ b/group14/676615845/algo/src/main/java/com/coding/basic/ArrayList.java @@ -0,0 +1,73 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size; // ArrayList 中的实际元素个数 + private Object[] elementData; + + public ArrayList() { + size = 0; + elementData = new Object[100]; + } + + public void add(Object o){ + if (size >= elementData.length) { + elementData = Array.grow(elementData, 100); + } + elementData[size++] = o; + } + + public void add(int index, Object o){ + if (size >= elementData.length) { + elementData = Array.grow(elementData, 100); + } + + if (index > size || index < 0) throw new ArrayIndexOutOfBoundsException(); + + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + if (index > size) throw new ArrayIndexOutOfBoundsException(); + return elementData[index]; + } + + public Object remove(int index){ + + if (index >= size || index < 0) throw new ArrayIndexOutOfBoundsException(); + + Object result = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + elementData[--size] = null; + return result; + } + + public int size() { + return size; + } + + public Iterator iterator(){ + + return new Iterator() { + + private int next = 0; // 下一个返回元素所在的位置 + + public boolean hasNext() { + return next < size; + } + + public Object next() { + if (!hasNext()) throw new ArrayIndexOutOfBoundsException(); + return elementData[next++]; + } + + public Object remove() { + if (next <= 0) throw new IllegalStateException(); + return ArrayList.this.remove(--next); + } + }; + } + +} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/BinaryTreeNode.java b/group14/676615845/algo/src/main/java/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..adaf9b8087 --- /dev/null +++ b/group14/676615845/algo/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,41 @@ +package com.coding.basic; + +public class BinaryTreeNode implements Comparable { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + + public int compareTo(Object obj) { + if (obj == null || obj.getClass() != Integer.class) throw new IllegalArgumentException(); + return Integer.compare(((Integer) data).intValue(), ((Integer) obj).intValue()); + } +} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/Iterator.java b/group14/676615845/algo/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..03cfb14466 --- /dev/null +++ b/group14/676615845/algo/src/main/java/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + boolean hasNext(); + Object next(); + Object remove(); +} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/LinkedList.java b/group14/676615845/algo/src/main/java/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..2f6fb6c7e2 --- /dev/null +++ b/group14/676615845/algo/src/main/java/com/coding/basic/LinkedList.java @@ -0,0 +1,164 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node first = null; + private Node last = null; + private int size = 0; + + public void add(Object o){ + Node node = new Node(o); + if (first == null) { + first = node; + } else { + last.next = node; + node.prev = last; + } + last = node; + size++; + } + + public void add(int index , Object o) { + if (index < 0 || index > size) throw new ArrayIndexOutOfBoundsException(); + + Node node = new Node(o); + + if (first == null) { + first = node; + last = node; + } else { + if (index == 0) { + node.next = first; + first.prev = node; + first = node; + } else if (index == size) { + last.next = node; + node.prev = last; + last = node; + } else { + Node temp = first; + while (--index > 0) { + temp = temp.next; + } + node.next = temp.next; + temp.next.prev = node; + temp.next = node; + node.prev = temp; + } + } + size++; + } + public Object get(int index){ + if (index < 0 || index > size - 1) throw new ArrayIndexOutOfBoundsException(); + Node node = first; + while (index-- > 0) { + node = node.next; + } + return node.data; + } + + public Object remove(int index){ + if (index < 0 || index >= size) throw new ArrayIndexOutOfBoundsException(); + + Node node = null; + if (index == 0) { + node = first; + if (size == 1) { + first = null; + last = null; + } else { + first = first.next; + first.prev = null; + } + } else if (index == size - 1) { + node = last; + last = last.prev; + last.next = null; + } else { + node = first; + Node temp = null; + while (index-- > 0) { + node = node.next; + } + temp = node.prev; + temp.next = node.next; + node.next.prev = temp; + } + size--; + return node.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object obj){ + add(0, obj); + } + + public void addLast(Object obj){ + add(size, obj); + } + + public Object removeFirst(){ + return remove(0); + } + + public Object removeLast(){ + return remove(size - 1); + } + + public Iterator iterator(){ + + if (first == null || last == null) throw new IllegalStateException(); + + return new InnerIterator(); + } + + private class InnerIterator implements Iterator { + + private Node nextNode = first; + + public boolean hasNext() { + return nextNode != null; + } + + public Object next() { + if (!hasNext()) throw new ArrayIndexOutOfBoundsException(); + Node node = nextNode; + nextNode = nextNode.next; + return node.data; + } + + public Object remove() { + if (nextNode == first) throw new IllegalStateException(); + + Node node = nextNode.prev; + if (nextNode == first.next) { + first = nextNode; + first.prev = null; + } else if (nextNode == null) { + node = last; + last = last.prev; + last.next = null; + } else { + node.prev = node.next; + node.next.prev = node.prev; + } + return node.data; + } + } + + private static class Node{ + + Object data; + Node next; + Node prev; + + public Node(Object data) { + this.data = data; + next = null; + prev = null; + } + } +} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/List.java b/group14/676615845/algo/src/main/java/com/coding/basic/List.java new file mode 100644 index 0000000000..50dd949d43 --- /dev/null +++ b/group14/676615845/algo/src/main/java/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + void add(Object o); + void add(int index, Object o); + Object get(int index); + Object remove(int index); + int size(); +} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/Queue.java b/group14/676615845/algo/src/main/java/com/coding/basic/Queue.java new file mode 100644 index 0000000000..493e8a5191 --- /dev/null +++ b/group14/676615845/algo/src/main/java/com/coding/basic/Queue.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o){ + linkedList.add(o); + } + + public Object deQueue(){ + return linkedList.removeFirst(); + } + + public boolean isEmpty(){ + return linkedList.size() == 0; + } + + public int size(){ + return linkedList.size(); + } +} diff --git a/group14/676615845/algo/src/main/java/com/coding/basic/Stack.java b/group14/676615845/algo/src/main/java/com/coding/basic/Stack.java new file mode 100644 index 0000000000..c481f25feb --- /dev/null +++ b/group14/676615845/algo/src/main/java/com/coding/basic/Stack.java @@ -0,0 +1,26 @@ +package com.coding.basic; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group14/676615845/algo/src/test/java/algo/BinarySearchTest.java b/group14/676615845/algo/src/test/java/algo/BinarySearchTest.java new file mode 100644 index 0000000000..6308e23251 --- /dev/null +++ b/group14/676615845/algo/src/test/java/algo/BinarySearchTest.java @@ -0,0 +1,26 @@ +package algo; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by mark on 17/2/24. + */ +public class BinarySearchTest { + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void rank() throws Exception { + + } + +} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/ArrayListTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..64fd31eb33 --- /dev/null +++ b/group14/676615845/algo/src/test/java/com/coding/basic/ArrayListTest.java @@ -0,0 +1,146 @@ +package com.coding.basic; + +import org.junit.*; +import org.junit.rules.ExpectedException; + +/** + * Created by mark on 17/2/24. + */ +public class ArrayListTest { + + private static ArrayList list; + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + list = new ArrayList(); + } + + @After + public void tearDown() throws Exception { + list = null; + } + + @Test + public void add() throws Exception { + // 可以加入元素 + list.add("hello"); + Assert.assertEquals(1, list.size()); + + // 可以自动扩容 + for (int i=0; i<150; i++) { + list.add(i); + } + Assert.assertEquals(151, list.size()); + Assert.assertTrue(149 == ((Integer) list.get(150)).intValue()); + } + + @Test + public void add1() throws Exception { + for (int i=0; i<100; i++) { + list.add(i); + } + list.add(0, "zero"); + list.add(50, "fifty"); + list.add(102, "102"); + Assert.assertEquals("zero", list.get(0)); + Assert.assertEquals("fifty", list.get(50)); + Assert.assertEquals("102", list.get(102)); + + list = new ArrayList(); + for (int i=0; i<100; i++) { + list.add(i); + } + list.add(100, "100"); + Assert.assertEquals("100", list.get(100)); + + thrown.expect(ArrayIndexOutOfBoundsException.class); + list.add(102, "102"); + } + + @Test + public void get() throws Exception { + list.add("hello"); + Object obj = list.get(0); + Assert.assertTrue("hello".equals(obj)); + } + + @Test + public void remove() throws Exception { + for (int i=0; i<100; i++) { + list.add(i); + } + Assert.assertEquals(99, ((Integer) list.remove(99)).intValue()); + Assert.assertEquals(99, list.size()); + + thrown.expect(ArrayIndexOutOfBoundsException.class); + list.remove(100); + list.remove(-1); + } + + @Test + public void size() throws Exception { + for (int i=0; i<100; i++) { + list.add(i); + } + Assert.assertEquals(100, list.size()); + list.add("hello"); + Assert.assertEquals(101, list.size()); + } + + @Test + public void iterator() throws Exception { + for (int i=0; i<100; i++) { + list.add(i); + } + + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + Assert.assertNotNull(iterator.next()); + } +// Assert.assertNotNull(iterator.next()); + + Object[] target = new Object[list.size()]; + int i = 0; + iterator = list.iterator(); + while (iterator.hasNext()) { + target[i++] = iterator.next(); + } + Assert.assertEquals(100, target.length); + + for (int j = 0; j < 100; j++) { + Assert.assertEquals(j, ((Integer) target[j]).intValue()); + } + + // 测试迭代器的 remove() 方法 + list = new ArrayList(); + for (int k=0; k<100; k++) { + list.add(k); + } + iterator = list.iterator(); +// thrown.expect(IllegalStateException.class); +// iterator.remove(); + + iterator.next(); + Object i0 = iterator.remove(); + Assert.assertEquals(0, ((Integer) i0).intValue()); + + for (int j=0; j<50; j++) { + iterator.next(); + } + Object i50 = iterator.remove(); + Assert.assertEquals(50, ((Integer)i50).intValue()); + + for (int j = 0; j < 48; j++) { + iterator.next(); + } + Object i99 = iterator.remove(); + Assert.assertEquals(98, ((Integer)i99).intValue()); + } + +} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/ArrayTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/ArrayTest.java new file mode 100644 index 0000000000..579b98c585 --- /dev/null +++ b/group14/676615845/algo/src/test/java/com/coding/basic/ArrayTest.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by mark on 17/2/24. + */ +public class ArrayTest { + private Object[] src; + + @Before + public void setUp() throws Exception { + src = new Object[10]; + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void grow() throws Exception { + src = Array.grow(src, 20); + Assert.assertEquals(30, src.length); + } + +} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/BinaryTreeNodeTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..b3d3c7d557 --- /dev/null +++ b/group14/676615845/algo/src/test/java/com/coding/basic/BinaryTreeNodeTest.java @@ -0,0 +1,64 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by mark on 17/2/25. + */ +public class BinaryTreeNodeTest { + + private BinaryTreeNode tree; + + @Before + public void setUp() throws Exception { + tree = new BinaryTreeNode(); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void getData() throws Exception { + + } + + @Test + public void setData() throws Exception { + + } + + @Test + public void getLeft() throws Exception { + + } + + @Test + public void setLeft() throws Exception { + + } + + @Test + public void getRight() throws Exception { + + } + + @Test + public void setRight() throws Exception { + + } + + @Test + public void insert() throws Exception { + tree.insert("8"); + tree.insert("1"); + tree.insert("2"); + tree.insert("10"); + tree.insert("4"); + tree.insert("34"); + } + +} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/LinkedListTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..24c2a84367 --- /dev/null +++ b/group14/676615845/algo/src/test/java/com/coding/basic/LinkedListTest.java @@ -0,0 +1,115 @@ +package com.coding.basic; + +import org.junit.*; +import org.junit.rules.ExpectedException; + +/** + * Created by mark on 17/2/24. + */ +public class LinkedListTest { + + private LinkedList linkedList; + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Before + public void setUp() throws Exception { + linkedList = new LinkedList(); + } + + @After + public void tearDown() throws Exception { + linkedList = null; + } + + @Test + public void add() throws Exception { + linkedList.add("first"); + Assert.assertEquals(1, linkedList.size()); + Assert.assertEquals("first", linkedList.get(0)); + + linkedList.add("second"); + linkedList.add("third"); + Assert.assertEquals("third", linkedList.get(2)); + } + + @Test + public void add1() throws Exception { + for (int i=0; i<10; i++) { + linkedList.add(i); + } + linkedList.add(5, "Five"); + Assert.assertEquals("Five", linkedList.get(5)); + Assert.assertEquals(11, linkedList.size()); + + linkedList.add(0, "Zero"); + Assert.assertEquals("Zero", linkedList.get(0)); + + linkedList.add(12, "Last"); + Assert.assertEquals("Last", linkedList.get(12)); + } + + @Test + public void get() throws Exception { + + linkedList.add("hello"); + Assert.assertEquals("hello", linkedList.get(0)); + + linkedList.add("two"); + Assert.assertEquals("two", linkedList.get(1)); + + linkedList = new LinkedList(); + thrown.expect(ArrayIndexOutOfBoundsException.class); + linkedList.get(0); + } + + @Test + public void remove() throws Exception { + Object data = null; + + for (int i=0; i<10; i++) { + linkedList.add("" + i); + } + + data = linkedList.remove(0); + Assert.assertEquals("0", data); + + data = linkedList.remove(8); + Assert.assertEquals("9", data); + + data = linkedList.remove(4); + Assert.assertEquals("5", data); + } + + @Test + public void size() throws Exception { + linkedList.add(0); + Assert.assertEquals(1, linkedList.size()); + } + + @Test + public void addFirst() throws Exception { + + } + + @Test + public void addLast() throws Exception { + + } + + @Test + public void removeFirst() throws Exception { + + } + + @Test + public void removeLast() throws Exception { + + } + + @Test + public void iterator() throws Exception { + + } + +} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/QueueTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..76ecb28a48 --- /dev/null +++ b/group14/676615845/algo/src/test/java/com/coding/basic/QueueTest.java @@ -0,0 +1,58 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by mark on 17/2/25. + */ +public class QueueTest { + + private Queue queue; + + @Before + public void setUp() throws Exception { + queue = new Queue(); + } + + @After + public void tearDown() throws Exception { + queue = null; + } + + @Test + public void enQueue() throws Exception { + queue.enQueue("first"); + queue.enQueue("second"); + queue.enQueue("third"); + Assert.assertEquals("first", queue.deQueue()); + Assert.assertEquals("second", queue.deQueue()); + Assert.assertEquals("third", queue.deQueue()); + } + + @Test + public void deQueue() throws Exception { + + } + + @Test + public void isEmpty() throws Exception { + Assert.assertEquals(true, queue.isEmpty()); + queue.enQueue("first"); + Assert.assertEquals(false, queue.isEmpty()); + queue.deQueue(); + Assert.assertEquals(true, queue.isEmpty()); + } + + @Test + public void size() throws Exception { + Assert.assertEquals(0, queue.size()); + queue.enQueue("first"); + Assert.assertEquals(1, queue.size()); + queue.deQueue(); + Assert.assertEquals(0, queue.size()); + } + +} \ No newline at end of file diff --git a/group14/676615845/algo/src/test/java/com/coding/basic/StackTest.java b/group14/676615845/algo/src/test/java/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..21192c9036 --- /dev/null +++ b/group14/676615845/algo/src/test/java/com/coding/basic/StackTest.java @@ -0,0 +1,70 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by mark on 17/2/25. + */ +public class StackTest { + + private Stack stack; + + @Before + public void setUp() throws Exception { + stack = new Stack(); + } + + @After + public void tearDown() throws Exception { + stack = null; + } + + @Test + public void push() throws Exception { + stack.push("first"); + stack.push("second"); + Assert.assertEquals("second", stack.pop()); + Assert.assertEquals("first", stack.pop()); + Assert.assertEquals(0, stack.size()); + } + + @Test + public void pop() throws Exception { + + } + + @Test + public void peek() throws Exception { + stack.push("first"); + stack.push("second"); + Assert.assertEquals("second", stack.peek()); + stack.pop(); + Assert.assertEquals("first", stack.peek()); + } + + @Test + public void isEmpty() throws Exception { + Assert.assertEquals(true, stack.isEmpty()); + stack.push("first"); + Assert.assertEquals(false, stack.isEmpty()); + stack.pop(); + Assert.assertEquals(true, stack.isEmpty()); + + } + + @Test + public void size() throws Exception { + Assert.assertEquals(0, stack.size()); + stack.push("first"); + Assert.assertEquals(1, stack.size()); + stack.push("second"); + Assert.assertEquals(2, stack.size()); + stack.pop(); + stack.pop(); + Assert.assertEquals(0, stack.size()); + } + +} \ No newline at end of file diff --git a/group14/775857669/.gitignore b/group14/775857669/.gitignore new file mode 100644 index 0000000000..09e3bc9b24 --- /dev/null +++ b/group14/775857669/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/group14/775857669/pom.xml b/group14/775857669/pom.xml new file mode 100644 index 0000000000..114ff8d633 --- /dev/null +++ b/group14/775857669/pom.xml @@ -0,0 +1,31 @@ + + 4.0.0 + + com.heyucool + coding + 0.0.1-SNAPSHOT + jar + + coding + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 4.12 + test + + + + dom4j + dom4j + 1.6.1 + + + diff --git a/group14/775857669/src/com/coderising/array/ArrayUtil.java b/group14/775857669/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..43e93ff20f --- /dev/null +++ b/group14/775857669/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,227 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.Stack; + + +public class ArrayUtil { + + private static final String List = null; + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + Stack stack = new Stack<>(); + for (int item : origin) { + stack.push(item); + } + for (int index = 0; index < origin.length; index++) { + origin[index] = stack.pop(); + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + Queue queue = new LinkedList<>(); + for (int item : oldArray) { + if (item != 0) { + queue.add(item); + } + } + int size = queue.size(); + int[] newArray = new int[size]; + for(int i=0 ; i hashSet = new HashSet<>(); + for (Integer integer : array1) { + hashSet.add(integer); + } + for (Integer integer : array2) { + hashSet.add(integer); + } + Integer[] array = hashSet.toArray(new Integer[hashSet.size()]); + if(asc) { + Arrays.sort(array); + } else { + Arrays.sort(array); + } + int[] ret = new int[array.length]; + for(int i=0 ; i list = new ArrayList<>(); + int fib = 1; + if(max <= 1){ + return new int[0]; + } + int count = 1; + list.add(1); + while (fib < max) { + list.add(fib); + fib = fib(++count); + } + int[] ret = new int[list.size()]; + for (int i = 0 ; i list = new ArrayList<>(); + for(int i=2 ; ii).toArray(); + } + /** + * + * @Author: yuhe + * @Description: TODO + * @param num + * @return + */ + private boolean isPrime(int num) { + boolean isPrime = true; + if(num == 2) { + isPrime = true; + }else if(num == 3) { + isPrime = true; + }else if (num%2 == 0) { + isPrime = false; + } else { + for(int i=3 ; i list = new ArrayList<>(); + for(int i=3 ; i i).toArray(); + } + + private boolean isPerfect(int num) { + boolean isPerfect = false; + List list = new ArrayList<>(); + for (int i = 1; i <= num/2; i++) { + if(num%i == 0) { + list.add(i); + } + } + int sum = 0; + for (Integer item : list) { + sum += item; + } + if (sum == num){ + isPerfect = true; + } + return isPerfect; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuffer sb = new StringBuffer(); + for(int i=0 ; i parameters) { + View view = new View(); + Map map = new HashMap<>(); +// view.setParameters(parameters); + SAXReader reader = new SAXReader(); + Document document = null; + try { + document = reader.read("src/com/coderising/iterstruts/struts.xml"); + Element rootElement = document.getRootElement(); + for(Iterator iter = rootElement.elementIterator(); iter.hasNext();){ + Element element = iter.next(); + if ("action".equals(element.getName()) && actionName.equals(element.attributeValue("name"))) {// 找到actionName对应的element + String className = element.attributeValue("class"); + Class targetClass = Class.forName(className); + Object instance = targetClass.newInstance(); + Set keySet = parameters.keySet(); + //setter + for (String key : keySet) { + Character firstLit =Character.toUpperCase(key.charAt(0)); + String leftParts = key.substring(1); + String methodName ="set" + firstLit + leftParts; + Method method = targetClass.getMethod(methodName, String.class); + method.invoke(instance, parameters.get(key)); + } + + Method execute = targetClass.getMethod("execute"); + String result = (String) execute.invoke(instance); + Map resultMap = new HashMap<>(); + for(Iterator innerIter = element.elementIterator(); innerIter.hasNext() ;){ + Element resultElement = innerIter.next(); + if(resultElement.getName().equals("result")){ + String resultValue = resultElement.attributeValue("name"); + String jspPath = resultElement.getStringValue(); + resultMap.put(resultValue, jspPath); + } + } + String targetJspPath = resultMap.get(result); + view.setJsp(targetJspPath); + //getter + for (Method method : targetClass.getMethods()) { + if(method.getName().startsWith("get") && method.getReturnType()==String.class) { + System.out.println(method.getName()); + String key = method.getName().substring(3); + key = Character.toLowerCase(key.charAt(0)) + key.substring(1); + String value = (String) method.invoke(instance); + map.put(key, value); + } + } + view.setParameters(map); + return view; + } + } + } catch (DocumentException | ClassNotFoundException + | NoSuchMethodException | SecurityException | InstantiationException + | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return view; + } + public static void main(String[] args) { + runAction(null, null); + } +} diff --git a/group14/775857669/src/com/coderising/iterstruts/StrutsTest.java b/group14/775857669/src/com/coderising/iterstruts/StrutsTest.java new file mode 100644 index 0000000000..ee4a35467b --- /dev/null +++ b/group14/775857669/src/com/coderising/iterstruts/StrutsTest.java @@ -0,0 +1,40 @@ +package com.coderising.iterstruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group14/775857669/src/com/coderising/iterstruts/View.java b/group14/775857669/src/com/coderising/iterstruts/View.java new file mode 100644 index 0000000000..f7f8422262 --- /dev/null +++ b/group14/775857669/src/com/coderising/iterstruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.iterstruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group14/775857669/src/com/coderising/iterstruts/struts.xml b/group14/775857669/src/com/coderising/iterstruts/struts.xml new file mode 100644 index 0000000000..7c52368dfb --- /dev/null +++ b/group14/775857669/src/com/coderising/iterstruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group14/775857669/src/com/coding/basic/ArrayList.java b/group14/775857669/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..b560f97afb --- /dev/null +++ b/group14/775857669/src/com/coding/basic/ArrayList.java @@ -0,0 +1,86 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private static final int MIN_EXTEND = 10; + + private Object[] elementData = new Object[100]; + /** + * + * @Author: yuhe + * @Description: 确保数组的容量 + * @param next 要插入的位置 + */ + private void ensureCapacity(int capacity) { + if (capacity < elementData.length) { + return; + } else { + int newLength = capacity + MIN_EXTEND; + elementData = Arrays.copyOf(elementData, newLength); + } + + } + + private void rangeCheckForAdd(int index) { + if (index < 0 || index > size) { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + private void rangeCheck(int index) { + if (index < 0 || index >= size) { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + public void add(Object o){ + ensureCapacity(size+1); + elementData[size++] = o; + } + + public void add(int index, Object o){ + rangeCheckForAdd(index); + ensureCapacity(size +1); + System.arraycopy(elementData, index, elementData, index+1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + + public Object remove(int index){ + rangeCheck(index); + Object ret = elementData[index]; + int numToRemove = size-index-1; + if (numToRemove > 0) + System.arraycopy(elementData, index+1, elementData, index, numToRemove); + elementData[size--] = null; + return ret; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new Iterator() { + private int index = 0; + @Override + public Object next() { + return elementData[index++]; + } + + @Override + public boolean hasNext() { + return index < size; + } + }; + } +} diff --git a/group14/775857669/src/com/coding/basic/BinaryTreeNode.java b/group14/775857669/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..cbe6e1e9c3 --- /dev/null +++ b/group14/775857669/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,52 @@ +package com.coding.basic; + +public class BinaryTreeNode> { + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public void insert(T t) { + BinaryTreeNode node = new BinaryTreeNode<>(); + node.setData(t); + compare(this, node); + } + + private void compare(BinaryTreeNode targetNode, BinaryTreeNode insertNode) { + + if (targetNode.data.compareTo(insertNode.data) < 0) { + if (targetNode.left != null){ + compare(targetNode.getLeft(), insertNode); + } else { + targetNode.left = insertNode; + } + + } else { + if (targetNode.right != null) { + compare(targetNode.getRight(), insertNode); + } else { + targetNode.right = insertNode; + } + + } + } + +} diff --git a/group14/775857669/src/com/coding/basic/Iterator.java b/group14/775857669/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group14/775857669/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group14/775857669/src/com/coding/basic/JUnitTest.java b/group14/775857669/src/com/coding/basic/JUnitTest.java new file mode 100644 index 0000000000..3cf54bc02c --- /dev/null +++ b/group14/775857669/src/com/coding/basic/JUnitTest.java @@ -0,0 +1,69 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + + +import org.junit.Test; + +public class JUnitTest { + @Test + public void testArrayList() { + ArrayList list = new ArrayList(); + for (int i = 0; i < 300; i++) { + list.add(i); + } + assertTrue(list.size() == 300); + list.add(3, 3); + assertTrue( (int)list.get(3) == 3 ); + assertTrue( (int)list.get(2) == 2 ); + assertTrue( (int)list.get(4) == 3 ); + assertTrue( (int)list.get(299) == 298 ); + assertTrue( (int)list.get(300) == 299 ); + assertTrue(list.size() == 301); + list.remove(3); + assertTrue( (int)list.get(3) == 3 ); + assertTrue( (int)list.get(2) == 2 ); + assertTrue( (int)list.get(4) == 4 ); + assertTrue( (int)list.get(299) == 299 ); + assertTrue(list.size() == 300); + Iterator iterator = list.iterator(); + while(iterator.hasNext()) { + System.out.print(iterator.next() + " "); + } + System.out.println(); + LinkedList linkedList = new LinkedList(); + for(int i=0 ; i<10 ; i++){ + linkedList.add(i); + } + assertTrue(linkedList.size() == 10); + Iterator iterator2 = linkedList.iterator(); + while(iterator2.hasNext()) { + System.out.print(iterator2.next() + " "); + } + linkedList.add(0, -1); + linkedList.add(11,10); + + assertTrue(linkedList.size() == 12); + assertTrue((int)linkedList.removeFirst() == -1); + + assertTrue((int)linkedList.removeLast() == 10); + assertTrue((int)linkedList.remove(5) == 5); + assertTrue(linkedList.size() == 9); + + Stack stack = new Stack(); + for (int i = 0; i < 10; i++) { + stack.push(i); + } + assertTrue(stack.size() == 10); + assertFalse(stack.isEmpty()); + assertTrue((int)stack.peek() == 9); + assertTrue((int)stack.pop() == 9); + assertTrue(stack.size() == 9); + System.out.println(); + for (int i=0 ; i<9 ; i++){ + System.out.print(stack.pop() + " "); + } + assertTrue(stack.isEmpty()); + } + +} diff --git a/group14/775857669/src/com/coding/basic/LinkedList.java b/group14/775857669/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..517df82b23 --- /dev/null +++ b/group14/775857669/src/com/coding/basic/LinkedList.java @@ -0,0 +1,140 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private int size = 0; + + private Node head; + + public LinkedList() { + head = new Node(); + } + + public void add(Object o){ + Node temp = head; + for (int i=0 ; i size) { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + private void checkRange(int index) { + if (index < 0 || index >= size) { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + private static class Node{ + public Node() { + } + + public Node(Object data, Node next) { + super(); + this.data = data; + this.next = next; + } + + private Object data; + private Node next; + + } +} diff --git a/group14/775857669/src/com/coding/basic/List.java b/group14/775857669/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group14/775857669/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group14/775857669/src/com/coding/basic/Queue.java b/group14/775857669/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..5d9b003bd3 --- /dev/null +++ b/group14/775857669/src/com/coding/basic/Queue.java @@ -0,0 +1,21 @@ +package com.coding.basic; + +public class Queue { + private LinkedList list = new LinkedList(); + + public void enQueue(Object o){ + list.add(o); + } + + public Object deQueue(){ + return list.removeFirst(); + } + + public boolean isEmpty(){ + return list.size() == 0; + } + + public int size(){ + return list.size(); + } +} diff --git a/group14/775857669/src/com/coding/basic/Stack.java b/group14/775857669/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..4f8133de7c --- /dev/null +++ b/group14/775857669/src/com/coding/basic/Stack.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (!isEmpty()){ + return elementData.remove(elementData.size()-1); + } else { + return null; + } + + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group14/857999411/FirstHomework/.classpath b/group14/857999411/FirstHomework/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group14/857999411/FirstHomework/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group14/857999411/FirstHomework/.gitignore b/group14/857999411/FirstHomework/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group14/857999411/FirstHomework/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group14/857999411/FirstHomework/.project b/group14/857999411/FirstHomework/.project new file mode 100644 index 0000000000..e93e0072c0 --- /dev/null +++ b/group14/857999411/FirstHomework/.project @@ -0,0 +1,17 @@ + + + FirstHomework + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group14/857999411/FirstHomework/.settings/org.eclipse.jdt.core.prefs b/group14/857999411/FirstHomework/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group14/857999411/FirstHomework/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group14/857999411/FirstHomework/src/com/coding/basic/MyArrayList.java b/group14/857999411/FirstHomework/src/com/coding/basic/MyArrayList.java new file mode 100644 index 0000000000..6e75248b73 --- /dev/null +++ b/group14/857999411/FirstHomework/src/com/coding/basic/MyArrayList.java @@ -0,0 +1,73 @@ +package com.coding.basic; + +import java.util.*; + +public class MyArrayList implements MyList{ + //定义Object类型数组 + //定义数组元素个数 + private int size=0; + private Object [] elementData =new Object[10]; + + public void add(Object o) { + ensureCapacity(size+1); + elementData[size] = o; + size++; + } + + //添加指定位置的元 + public void add (int index,Object element){ + if(index > size || index < 0) + throw new IndexOutOfBoundsException("数组角标越界"); + ensureCapacity(size+1); + //添加指定位置元素 + //将该位置后的有元素右 + System.arraycopy(elementData,index,elementData,index+1,size-index); + elementData[index] =element; + size++; + } + + //可调整数组的容量 + public void ensureCapacity (int mincapacity){ + int oldlen =elementData.length; + if(mincapacity > oldlen){ + int newlen =(oldlen * 3)/2 + 1; + if(mincapacity > newlen) + newlen =mincapacity; + elementData =Arrays.copyOf(elementData,newlen); + } + } + + + //获取指定位置的元 + public Object get(int index){ + if(index < 0 || index >size-1){ + throw new IndexOutOfBoundsException("数组角标越界"); + } + return elementData[index]; + } + + public Object remove(int index){ + if(index >=size || index < 0){ + throw new IndexOutOfBoundsException("数组角标越界"); + } + Object oldelement =elementData[index]; + int numMoved = size-index-1; + if(numMoved > 0){ + System.arraycopy(elementData,index+1,elementData,index,numMoved); + } + size--; + return oldelement; + } + + public void clear(){ + elementData = null; + } + + public boolean isEmpty (){ + return size == 0; + } + + public int size (){ + return size; + } +} diff --git a/group14/857999411/FirstHomework/src/com/coding/basic/MyLinkedList.java b/group14/857999411/FirstHomework/src/com/coding/basic/MyLinkedList.java new file mode 100644 index 0000000000..221a8c9092 --- /dev/null +++ b/group14/857999411/FirstHomework/src/com/coding/basic/MyLinkedList.java @@ -0,0 +1,138 @@ +package com.coding.basic; + +import java.util.*; + +public class MyLinkedList implements MyList{ + //用内部类定义链表中的节点 + private class Node{ + //节点中包含数据和引用 + Object data; + Node next; + + public Node (){ + + } + + //每个节点包含数据和引 + public Node (Object data,Node next){ + this.data =data; + this.next =next; + } + } + //定义头节点和尾节 + public Node head; + public Node tail; + public int size; + + //无参数构造函数创建空链表 + public MyLinkedList(){ + head =null; + tail =null; + } + + //链表中传入元 + public MyLinkedList(Object element){ + head.data =element; + head.next =tail; + size++; + } + + public void add(Object o){ + addLast(o); + } + public void addFirst(Object element) { + + head =new Node(element,head); + if(tail == null){ + tail=head; + } + size++; + } + + public void addLast(Object element) { + if(head == null) { + head =new Node (element,null); + tail =head; + }else{ + Node newNode =new Node(element,null); + tail.next =newNode; + tail=newNode; + } + size++; + + } + + public void add(int index,Object element){ + + if(index < 0 || index > size) { + throw new IndexOutOfBoundsException("索引越界"); + } + if(index == 0) { + head =new Node(element,head); + } + Node frontNode =getNode(index-1); + frontNode.next =new Node(element,frontNode.next); + size++; + } + public Node getNode(int index) + { + if(index < 0 || index > size-1) { + + throw new IndexOutOfBoundsException("索引越界"); + } + Node current=head; + for(int i=0;i < size; i++,current =current.next) { + if(i == index) { + return current; + } + } + return null; + } + + public Object get(int index){ + return getNode(index).data; + } + + public Object remove(int index){ + if(index < 0 || index > size-1) { + throw new IndexOutOfBoundsException("索引越界"); + } + Node delNode =null; + if(index == 0) { + delNode =head; + head =head.next; + }else{ + Node frontNode =getNode(index-1); + delNode =frontNode.next; + frontNode.next =delNode.next; + delNode.next =null; + } + size--; + return delNode.data; + } + + public Object removeFirst(){ + if(head == null || head.next == null) + throw new NoSuchElementException(); + Node oldhead =head; + head =head.next; + oldhead.next =null; + size--; + return oldhead.data; + + } + + public Object removeLast(){ + return remove(size - 1); + + } + + + public int size() { + return size; + } + + +} + + diff --git a/group14/857999411/FirstHomework/src/com/coding/basic/MyList.java b/group14/857999411/FirstHomework/src/com/coding/basic/MyList.java new file mode 100644 index 0000000000..03fffb96c3 --- /dev/null +++ b/group14/857999411/FirstHomework/src/com/coding/basic/MyList.java @@ -0,0 +1,10 @@ +package com.coding.basic; + +public interface MyList { + + public void add(Object o); + public void add(int index,Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group14/857999411/FirstHomework/src/com/coding/basic/MyQueue.java b/group14/857999411/FirstHomework/src/com/coding/basic/MyQueue.java new file mode 100644 index 0000000000..3f397f69ec --- /dev/null +++ b/group14/857999411/FirstHomework/src/com/coding/basic/MyQueue.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +public class MyQueue { + + MyLinkedList link =new MyLinkedList(); + + //入队 + public void enQueue(Object o){ + link.addLast(o); + } + //出队 + public Object deQueue(){ + return link.removeFirst(); + } + //判断是否为空 + public boolean isEmpty(){ + return link.size == 0; + } + //获取长度 + public int size(){ + return link.size; + } +} diff --git a/group14/857999411/FirstHomework/src/com/coding/basic/MyStack.java b/group14/857999411/FirstHomework/src/com/coding/basic/MyStack.java new file mode 100644 index 0000000000..c0d6395726 --- /dev/null +++ b/group14/857999411/FirstHomework/src/com/coding/basic/MyStack.java @@ -0,0 +1,44 @@ +package com.coding.basic; + +import java.util.*; + +public class MyStack { + + + MyArrayList elementData=new MyArrayList(); + + //入栈 + public void push(Object o){ + elementData.add(o); + } + + //出栈 + public Object pop(){ + + Object element =elementData.get(elementData.size() - 1); + elementData.remove(elementData.size()-1); + return element; + } + + //获取栈顶元素 + public Object peek(){ + int len =elementData.size(); + if(len == 0) + throw new EmptyStackException(); + Object element =elementData.get(len - 1); + return element; + } + + public int size(){ + return elementData.size(); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public boolean empty(){ + return elementData.isEmpty(); + } + +} diff --git a/group14/857999411/FirstHomework/src/com/coding/test/MyArrayListTest.java b/group14/857999411/FirstHomework/src/com/coding/test/MyArrayListTest.java new file mode 100644 index 0000000000..a489b51623 --- /dev/null +++ b/group14/857999411/FirstHomework/src/com/coding/test/MyArrayListTest.java @@ -0,0 +1,34 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.coding.basic.MyArrayList; + +public class MyArrayListTest { + + @Test + public void test() { + MyArrayList sa =new MyArrayList(); + sa.add(0,0); + sa.add(1,1); + sa.add(2,2); + sa.add(3,3); + + //System.out.println(sa.get(1)); + + for(int i=0; i + + + + + + + + + diff --git a/group14/857999411/SecondHomework/.gitignore b/group14/857999411/SecondHomework/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group14/857999411/SecondHomework/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group14/857999411/SecondHomework/.project b/group14/857999411/SecondHomework/.project new file mode 100644 index 0000000000..1bcfdd57a3 --- /dev/null +++ b/group14/857999411/SecondHomework/.project @@ -0,0 +1,17 @@ + + + SecondHomework + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group14/857999411/SecondHomework/.settings/org.eclipse.jdt.core.prefs b/group14/857999411/SecondHomework/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group14/857999411/SecondHomework/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group14/857999411/SecondHomework/src/com/coderising/array/ArrayUtil.java b/group14/857999411/SecondHomework/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..95be832836 --- /dev/null +++ b/group14/857999411/SecondHomework/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,264 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int len =origin.length; + int [] newArray =new int[len]; + + int j=0; + for(int i=len-1;i>=0;i--){ + if(j list = new ArrayList(); + + if(array1[0] != array2[0]){ + list.add(array1[0]); + list.add(array2[0]); + }else if(array1[0] == array2[0]){ + list.add(array1[0]); + } + + int i =1; + for(int j=1;j array2[j]){ + list.add(array2[j]); + list.add(array1[i]); + }else if(array1[i] < array2[j]){ + list.add(array1[i]); + list.add(array2[j]); + }else if(array1[i] == array2[j]){ + list.add(array1[i]); + } + i++; + } + + int[] newA =new int[list.size()]; + + for(int k=0;k2?f(n-1)+f(n-2):1; + } + public int[] fibonacci(int max){ + ArrayList list =new ArrayList(); + for(int i=1; i list = new ArrayList(); + + int j; + for(int i=2; i<=max; i++){ + j=2; + while(i%j != 0){ + j++; + } + if(j == i){ + list.add(i); + } + } + + for (Integer in : list) { + System.out.println(in); + } + + int num=0; + int [] newA =null; + for(int i=0; i list = new ArrayList(); + + int s; + for(int i=1;i<=10000;i++) + { + s=0; + for(int j=1;j parameters) throws Exception { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的execute 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + SAXReader reader = new SAXReader(); + Document doc = reader.read("./src/struts.xml"); + Element root = doc.getRootElement(); + Element el = root.element("action"); + Attribute attr = el.attribute("class"); + String value = attr.getValue(); + System.out.println(attr.getValue()); + + + Class clazz = Class.forName(value); + LoginAction login =(LoginAction) clazz.newInstance(); + + Method setN = clazz.getMethod("setName", String.class); + setN.invoke(login, "test"); + Method setP = clazz.getMethod("setPassword", String.class); + setP.invoke(login, "1234"); + + Method getM = clazz.getMethod("execute", null); + String str = (String) getM.invoke(login, null); + System.out.println(str); + + /*PropertyDescriptor pro = new PropertyDescriptor("name", LoginAction.class); + Method readM = pro.getReadMethod(); + String message = (String) readM.invoke(login, null);*/ + + String bean = BeanUtils.getProperty(login, "name"); + System.out.println(bean); + return null; + } + +} diff --git a/group14/857999411/SecondHomework/src/com/coderising/litestruts/StrutsTest.java b/group14/857999411/SecondHomework/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..92a6758a69 --- /dev/null +++ b/group14/857999411/SecondHomework/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws Exception { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group14/857999411/SecondHomework/src/com/coderising/litestruts/View.java b/group14/857999411/SecondHomework/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group14/857999411/SecondHomework/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group14/857999411/SecondHomework/src/com/coderising/litestruts/struts.xml b/group14/857999411/SecondHomework/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group14/857999411/SecondHomework/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group14/864020162/.classpath b/group14/864020162/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group14/864020162/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group14/864020162/.gitignore b/group14/864020162/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group14/864020162/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group14/864020162/.project b/group14/864020162/.project new file mode 100644 index 0000000000..f16286d15c --- /dev/null +++ b/group14/864020162/.project @@ -0,0 +1,17 @@ + + + 2017Improve + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group14/864020162/src/com/coderising/litestruts/LoginAction.java b/group14/864020162/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group14/864020162/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group14/864020162/src/com/coderising/litestruts/Struts.java b/group14/864020162/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..85e2e22de3 --- /dev/null +++ b/group14/864020162/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,34 @@ +package com.coderising.litestruts; + +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group14/864020162/src/com/coderising/litestruts/View.java b/group14/864020162/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group14/864020162/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group14/864020162/src/com/datastructure/basic/ArrayList.java b/group14/864020162/src/com/datastructure/basic/ArrayList.java new file mode 100644 index 0000000000..5245563b7e --- /dev/null +++ b/group14/864020162/src/com/datastructure/basic/ArrayList.java @@ -0,0 +1,32 @@ +package com.datastructure.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group14/864020162/src/com/datastructure/basic/BinaryTreeNode.java b/group14/864020162/src/com/datastructure/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..1c052a5005 --- /dev/null +++ b/group14/864020162/src/com/datastructure/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.datastructure.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group14/864020162/src/com/datastructure/basic/Iterator.java b/group14/864020162/src/com/datastructure/basic/Iterator.java new file mode 100644 index 0000000000..bee5d797c9 --- /dev/null +++ b/group14/864020162/src/com/datastructure/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.datastructure.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group14/864020162/src/com/datastructure/basic/LinkedList.java b/group14/864020162/src/com/datastructure/basic/LinkedList.java new file mode 100644 index 0000000000..a5b0b31c40 --- /dev/null +++ b/group14/864020162/src/com/datastructure/basic/LinkedList.java @@ -0,0 +1,46 @@ +package com.datastructure.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group14/864020162/src/com/datastructure/basic/List.java b/group14/864020162/src/com/datastructure/basic/List.java new file mode 100644 index 0000000000..633f1f73e2 --- /dev/null +++ b/group14/864020162/src/com/datastructure/basic/List.java @@ -0,0 +1,9 @@ +package com.datastructure.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group14/864020162/src/com/datastructure/basic/Queue.java b/group14/864020162/src/com/datastructure/basic/Queue.java new file mode 100644 index 0000000000..d59788a45f --- /dev/null +++ b/group14/864020162/src/com/datastructure/basic/Queue.java @@ -0,0 +1,19 @@ +package com.datastructure.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group14/864020162/src/com/datastructure/basic/Stack.java b/group14/864020162/src/com/datastructure/basic/Stack.java new file mode 100644 index 0000000000..6a1d31a3d4 --- /dev/null +++ b/group14/864020162/src/com/datastructure/basic/Stack.java @@ -0,0 +1,22 @@ +package com.datastructure.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group14/864020162/src/com/datastructure/util/ArrayUtil.java b/group14/864020162/src/com/datastructure/util/ArrayUtil.java new file mode 100644 index 0000000000..3b6f9cc7aa --- /dev/null +++ b/group14/864020162/src/com/datastructure/util/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.datastructure.util; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + return null; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + +} diff --git a/group14/group14.md b/group14/group14.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group14/group14.md @@ -0,0 +1 @@ + diff --git a/group15/1501_2535894075/2017code/src/com/coderising/array/ArrayUtil.java b/group15/1501_2535894075/2017code/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..8d5a83d85d --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,190 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] o){ + + int length=o.length; + int half=length/2; + if(length==0||length==1){ + return; + } + for(int i=0;i parameters) { + + try{ + File f=new File("src\\com\\coderising\\litestruts\\struts.xml");//找到xml文件 + DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//得到dom解析器工厂实例 + DocumentBuilder builder =factory.newDocumentBuilder();//从工厂中得到DOM解析器 + Document doc=builder.parse(f);//解析文件得到docunment + Element root=doc.getDocumentElement();//得到xml文档的根节点 + NodeList books=root.getChildNodes();//得到每一个节点 + if(books!=null){//如果不为空节点 + for(int i=0;i 则 + String name=book.getAttributes().getNamedItem("name").getNodeValue();//获取里的 属性值 + String classname=book.getAttributes().getNamedItem("class").getNodeValue(); + if(actionName.equals(name)){//如果传进来的值等于 属性name的值 + Class localclass=Class.forName(classname);//根据class属性的值创建class + Object object =localclass.newInstance();//创建class实例 + for(Entry entry :parameters.entrySet()){//循环遍历传进来的参数 + String methodname=new StringBuffer("set").append(entry.getKey().substring(0,1).toUpperCase()).append(entry.getKey().substring(1)).toString();//根据参数来生成相应的set函数 + Method method=localclass.getMethod(methodname,entry.getKey().getClass()); + method.invoke(object, entry.getValue());//执行函数 + } + Method methods=localclass.getMethod("execute"); + String returnvalue=(String)methods.invoke(object); + Map map=new HashMap(); + String namepara=(String) getter(object,"name"); + String passwordpara=(String)getter(object,"password"); + String message=(String)getter(object,"message"); + map.put("name",namepara); + map.put("password", passwordpara); + map.put("message",message); + View view= new View(); + view.setParameters(map); + String jsp = null; + if(returnvalue.equals(" ")){ + + } + NodeList nl = doc.getElementsByTagName("result"); + for(int w=0;w 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + public static Object getter(Object object,String toGet){ + Method target=null; + Object result=null; + try{ + target=object.getClass().getMethod("get"+upperFirst(toGet), null); + result=target.invoke(object); + return result; + }catch(Exception e){ + e.printStackTrace(); + } + return result; + } + public static String upperFirst(String toUpper){ + return toUpper.substring(0,1).toUpperCase()+toUpper.substring(1); + } +} diff --git a/group15/1501_2535894075/2017code/src/com/coderising/litestruts/StrutsTest.java b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group15/1501_2535894075/2017code/src/com/coderising/litestruts/View.java b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group15/1501_2535894075/2017code/src/com/coderising/litestruts/struts.xml b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..d60b234c2b --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,21 @@ + + + + + + + /jsp/homepage.jsp + + /jsp/showLogin.jsp + + + + + + /jsp/welcome.jsp + + /jsp/error.jsp + + + + \ No newline at end of file diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/ArrayList.java b/group15/1501_2535894075/2017code/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..1f185736f9 --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coding/basic/ArrayList.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/BinaryTreeNode.java b/group15/1501_2535894075/2017code/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/Iterator.java b/group15/1501_2535894075/2017code/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/LinkedList.java b/group15/1501_2535894075/2017code/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..e2c4e5e795 --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coding/basic/LinkedList.java @@ -0,0 +1,46 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/List.java b/group15/1501_2535894075/2017code/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/Queue.java b/group15/1501_2535894075/2017code/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group15/1501_2535894075/2017code/src/com/coding/basic/Stack.java b/group15/1501_2535894075/2017code/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group15/1501_2535894075/2017code/src/com/coding/basic/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group15/1502_1617273078/src/com/coderising/array/ArrayUtil.java b/group15/1502_1617273078/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..de36e61726 --- /dev/null +++ b/group15/1502_1617273078/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,283 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int[] a = new int[origin.length]; + for (int i = 0; i < origin.length; i++) { + a[i] = origin[origin.length - 1 - i]; + } + for (int i = 0; i < a.length; i++) { + System.out.print(a[i]); + + } + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int count = 0; + int index = 0; + //int[] brige = new int[oldArray.length]; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + + count++; + } + } + int[] result = new int[count]; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + result[index++] = oldArray[i]; + } + + + } + return result; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int alength = array1.length; + int blength = array2.length; + int[] newint = new int[alength + blength]; + for (int i = 0; i < alength; i++) { + newint[i] = array1[i]; + } + int index = alength; + //有相同项为true,没有为false + boolean flag = false; + for (int c = 0; c < blength; c++) { + for (int j = 0; j < alength; j++) { + if (array1[j] == array2[c]) { + + flag = true; + break; + } + + } + if (flag) { + + flag = false; + } else { + newint[index] = array2[c]; + index++; + } + + } + // 去零 + newint = removeZero(newint); + //排序 + + quickSort(newint); + return newint; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newarry = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newarry[i] = oldArray[i]; + } + return newarry; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + int count = 0; + for (int i = 0; ; i++) { + if (createfibonacci(i + 1) < max) { + count++; + } else { + break; + + } + } + int[] arry = new int[count]; + for (int a = 0; a < count; a++) { + arry[a] = createfibonacci(a + 1); + } + return arry; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int count = 0; + for (int i = 0; i < max; i++) { + if (isprime(i)) { + count++; + } + } + int[] arry = new int[count]; + int sign = 0; + for (int i = 0; i < max; i++) { + if (isprime(i)) { + arry[sign] = i; + sign++; + } + } + return arry; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int count = 0; + for (int i = 0; i < max; i++) { + if (isperfectnmber(i)) { + count++; + } + } + int[] arry = new int[count]; + int sign = 0; + for (int i = 0; i < max; i++) { + if (isperfectnmber(i)) { + arry[sign] = i; + sign++; + } + } + return arry; + + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param + * @return + */ + public String join(int[] array, String seperator) { + String stringBuilder=new String(String.valueOf(array[0])); + for (int i = 1; i = pivot) --high; + arr[low] = arr[high]; //交换比枢轴小的记录到左端 + while (low < high && arr[low] <= pivot) ++low; + arr[high] = arr[low]; //交换比枢轴小的记录到右端 + } + //扫描完成,枢轴到位 + arr[low] = pivot; + //返回的是枢轴的位置 + return low; + } + + //生成斐波那契数列 + public static int createfibonacci(int n) { + if (n <= 2) { + return 1; + } else { + return createfibonacci(n - 1) + createfibonacci(n - 2); + } + } + + //判断是否是素数 + public static boolean isprime(int a) { + boolean flag = true; + if (a < 2) { + return false; + } else { + for (int i = 2; i <= Math.sqrt(a); i++) { + if (a % i == 0) { + flag = false; + break; + } + } + } + return flag; + } + + //判断是否是完数 + public static boolean isperfectnmber(int a) { + boolean flag = true; + int temp = 0;// 定义因子之和变量 + + for (int n = 1; n < a / 2 + 1; n++) { + if (a % n == 0) { + temp += n;// 能被整除的除数则被加到temp中 + } + } + if (temp == a) {// 如果因子之和与原数相等的话,说明是完数 + //System.out.print(a + " ");// 输出完数 + flag = true; + } else { + flag = false; + } + return flag; + } + +} diff --git a/group15/1502_1617273078/src/com/coderising/array/ArrayUtilTest.java b/group15/1502_1617273078/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..17f810bc0f --- /dev/null +++ b/group15/1502_1617273078/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,163 @@ +package com.coderising.array; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** +* ArrayUtil Tester. +* +* @author +* @since
 27, 2017
+* @version 1.0 +*/ +public class ArrayUtilTest { + +@Before +public void before() throws Exception { + ArrayUtil arrayUtil = new ArrayUtil(); + int[] a = new int[10]; + a[0] = 1; + a[1] = 2; + a[2] = 3; + a[3] = 4; + a[4] = 5; + a[5] = 6; +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: reverseArray(int[] origin) +* +*/ +@Test +public void testReverseArray() throws Exception { +//TODO: Test goes here... + int[] a = new int[10]; + a[0] = 1; + a[1] = 2; + a[2] = 3; + a[3] = 4; + a[4] = 5; + a[5] = 6; + ArrayUtil arrayUtil = new ArrayUtil(); + for (int i = 0; i parameters) throws DocumentException { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + HashMap Parameters = new HashMap<>(); + View view = new View(); + SAXReader reader = new SAXReader(); + Document document = reader.read(new File("./src/com/coderising/litestruts/struts.xml")); + Element root = document.getRootElement(); + Element thiselement = null; + List list = root.elements(); + String classpath = null; + for (Element element : list) { + //System.out.println(element.attribute("name").getValue()); + if (element.attribute("name").getValue().equals(actionName)) { + thiselement = element; + classpath = element.attribute("class").getValue(); + break; + } + } + Class ojbect; + + try { + ojbect=Class.forName(classpath); + Object acionclass = ojbect.newInstance(); + for (String string : parameters.keySet()) { + Method method = ojbect.getMethod("set"+upperCase(string),String.class); + method.invoke(acionclass,parameters.get(string)); + } + Method execute = ojbect.getMethod("execute"); + String result= (String) execute.invoke(acionclass); + //判断返回的jsp + List elementresult = thiselement.elements(); + for (Element element:elementresult){ + if (element.attribute("name").getValue().equals(result)) { + view.setJsp(element.getStringValue()); + break; + } + } + // 获得getter方法,并设置Parameters + Method[] methods = ojbect.getDeclaredMethods(); + + for (Method method : methods) { + if (method.getName().substring(0, 3).equals("get")) { + String attribute= (String) method.invoke(acionclass); + Parameters.put(method.getName().substring(3).toLowerCase(), attribute); + } + } + view.setParameters(Parameters); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + + return view; + } + //首字母大写 + public static String upperCase(String str) { + char[] ch = str.toCharArray(); + if (ch[0] >= 'a' && ch[0] <= 'z') { + ch[0] = (char) (ch[0] - 32); + } + return new String(ch); + } + +} diff --git a/group15/1502_1617273078/src/com/coderising/litestruts/StrutsTest.java b/group15/1502_1617273078/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..05b7a00aa8 --- /dev/null +++ b/group15/1502_1617273078/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,44 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws DocumentException { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws DocumentException { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group15/1502_1617273078/src/com/coderising/litestruts/View.java b/group15/1502_1617273078/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group15/1502_1617273078/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group15/1502_1617273078/src/com/coderising/litestruts/struts.xml b/group15/1502_1617273078/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group15/1502_1617273078/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/1502_1617273078/src/com/coding/basic/ArrayList.java b/group15/1502_1617273078/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..cdf06c0a6d --- /dev/null +++ b/group15/1502_1617273078/src/com/coding/basic/ArrayList.java @@ -0,0 +1,77 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[5]; + + public void add(Object o) { + add(size(),o); + //size++; + } + + public void add(int index, Object o) { + if (size+1 > elementData.length) { + Object[] newelementData = new Object[elementData.length * 2]; + System.arraycopy(elementData,0,newelementData,0,elementData.length); + System.arraycopy(newelementData,index,newelementData,index+1,newelementData.length-index-1); + newelementData[index] = o; + elementData = newelementData; + newelementData = null; + size = size + 1; +// Arrays.copyOf() + } else { + System.arraycopy(elementData,index,elementData,index+1,elementData.length-index-1); + elementData[index] = o; + size=size+1; + } + +} + + public Object get(int index) { + + return elementData[index]; + } + + public Object remove(int index) { + System.arraycopy(elementData,index+1,elementData,index,size-2); + return elementData; + } + + public int size() { + return size; + } + + public Iterator iterator() { + + return new Iterator() { + int cuindex = 0; + int lastRet = -1; + + @Override + public boolean hasNext() { + return cuindex != size; + } + + @Override + public Object next() { + int i = cuindex; + if (i>=size){ + throw new NoSuchElementException(); + } + if (i >= elementData.length) + throw new ConcurrentModificationException(); + cuindex = i + 1; + return elementData[lastRet=i]; + } + + }; + } + + +} diff --git a/group15/1502_1617273078/src/com/coding/basic/Iterator.java b/group15/1502_1617273078/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group15/1502_1617273078/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group15/1502_1617273078/src/com/coding/basic/LinkedList.java b/group15/1502_1617273078/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..f10225fb5e --- /dev/null +++ b/group15/1502_1617273078/src/com/coding/basic/LinkedList.java @@ -0,0 +1,163 @@ +package com.coding.basic; + +public class LinkedList implements List { + private int thesize; + private Node head; + public void add(Object o){ + if (head == null) { + head = new Node(); + head.data = o; + head.next = null; + thesize++; + } else { + addLast(o); + //thesize++; + } + } + public void add(int index , Object o){ + if (index > thesize) { + throw new IndexOutOfBoundsException(); + } else if (index == thesize) { + addLast(o); + //thesize++; + } else if(index= thesize) { + throw new IndexOutOfBoundsException(); + } else{ + Node x = head; + int i=0; + do { + x = x.next; + i++; + } while (i == index); + return x.data; + } + } + public Object remove(int index){ + Node x = head; + for (int i = 1; i =length){ + grow(100); + } + elementData[size]=o; + size++; + } + public void add(int index, Object o){ + size++; + if(size>=length){ + grow(100); + } + System.arraycopy(elementData,index,elementData,index+1,size-index-1); + elementData[index]=o; + } + + public Object get(int index){ + if(index=size) + throw new IndexOutOfBoundsException(); + size--; + Object a=elementData[index]; + //刚好最后一个 + if (index+1==size){ + return a; + } + System.arraycopy(elementData,index+1,elementData,index,size); + return a; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + private class ArrayListIterator implements Iterator{ + private int index=0; + @Override + public boolean hasNext() { + if(index+1o){ + if(right==null){ + right=b; + return b; + } + right.insert(o); + } + return b; + } + + public void showAll(){ + if(right!=null){ + right.showAll(); + } + System.out.print(data+" "); + if(left!=null){ + left.showAll(); + } + + } + + + +} diff --git a/group15/1503_1311822904/myCollection/src/Iterator.java b/group15/1503_1311822904/myCollection/src/Iterator.java new file mode 100644 index 0000000000..96a43dbe0a --- /dev/null +++ b/group15/1503_1311822904/myCollection/src/Iterator.java @@ -0,0 +1,5 @@ +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group15/1503_1311822904/myCollection/src/LinkedList.java b/group15/1503_1311822904/myCollection/src/LinkedList.java new file mode 100644 index 0000000000..69fad47ace --- /dev/null +++ b/group15/1503_1311822904/myCollection/src/LinkedList.java @@ -0,0 +1,182 @@ +public class LinkedList implements List { + private int size = 0; + private Node head=new Node(null); + + public void add(Object o){ + if(head.data==null){ + head.data=o; + return; + } + Node n=head; + while (n.next!=null){ + n=n.next; + } + n.next=new Node(o); + size++; + } + public void add(int index , Object o){ + Node n=getNode(index); + Node newN=new Node(o); + newN.next=n.next; + n.next=newN; + size++; + } + public Object get(int index){ + return getNode(index).data; + } + private Node getNode(int index){ + Node n=head; + for (int i=0;i-1;i--){ + origin[i]=reverse[i]; + } + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray){ + int length=oldArray.length; + int[] index=new int[length]; + int i=0; + int j=0; + for(;i= 0 && arr[j] > temp; j --){ + arr[j+1] = arr[j]; + } + arr[j+1] = temp; + } + } + //去重合 + int j=0; + for(int i = 1;i parameters) { + SAXReader reader = new SAXReader(); + View view=new View(); + try { + File f= new File("src/struts.xml");//E:\mygit\coding2017\liuxin\src\com\coderising\litestruts\struts.xml + Document e = reader.read(f); + //得到根节点 + Element struts = e.getRootElement(); + Iterator it = struts.elementIterator(); + + while(it.hasNext()) {//action遍历 + Element action = (Element)it.next(); + // 找到 name=actionName 的action + List actionAtr = action.attributes(); + if(!actionAtr.get(0).getValue().equals(actionName)) + continue; + String className= actionAtr.get(1).getValue(); + //得到actionName 对应的class + Class aClass=Class.forName(className); + Object o=aClass.newInstance(); + Field field; + for(Map.Entry entry:parameters.entrySet()){ + field = aClass.getDeclaredField( entry.getKey()); + field.setAccessible(true); + field.set(o, entry.getValue()); + } + + Method m = aClass.getMethod("execute"); + String resultString=(String)m.invoke(o); + Method m2 = aClass.getMethod("getMessage"); + String message=(String)m2.invoke(o); + + Map map=new HashMap<>(); + + map.put("message",message); + view.setParameters(map); + it=action.elementIterator(); + //遍历 + while (it.hasNext()){ + Element result = (Element)it.next(); + String s= result.attribute(0).getValue(); + if(resultString.equals(s)){ + view.setJsp(result.getStringValue()); + return view; + } + + } + + //Element results = (Element)it.next(); + //List results = action.attributes(); + + } + } catch (DocumentException var9) { + var9.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group15/1503_1311822904/week2/test/ArrayUtilTest.java b/group15/1503_1311822904/week2/test/ArrayUtilTest.java new file mode 100644 index 0000000000..8ba10c75f7 --- /dev/null +++ b/group15/1503_1311822904/week2/test/ArrayUtilTest.java @@ -0,0 +1,114 @@ +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + +/** +* ArrayUtil Tester. +* +* @author +* @since
���� 1, 2017
+* @version 1.0 +*/ +public class ArrayUtilTest { + int[] a={0,1,2,3,4,5,6,7,8,9}; +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: reverseArray(int[] origin) +* +*/ +@Test +public void testReverseArray() throws Exception { + + ArrayUtil.reverseArray(a); + System.out.println(Arrays.toString(a)); + +} + +/** +* +* Method: removeZero(int[] oldArray) +* +*/ +@Test +public void testRemoveZero() throws Exception { + int[] a={0,1,0,3,4,0,0,7,8,0,10}; + System.out.println(Arrays.toString(ArrayUtil.removeZero(a))); +} + +/** +* +* Method: merge(int[] array1, int[] array2) +* +*/ +@Test +public void testMerge() throws Exception { + int[] a={0,1,0,3,4,-90,0,0,7,8,0,10}; + int[] b={-90,0,10}; + System.out.println(Arrays.toString(ArrayUtil.merge(a,b))); + +//TODO: Test goes here... +} + +/** +* +* Method: grow(int [] oldArray, int size) +* +*/ +@Test +public void testGrow() throws Exception { + int[] b= ArrayUtil.grow(a,4); + System.out.println(Arrays.toString(b)); +} + +/** +* +* Method: fibonacci(int max) +* +*/ +@Test +public void testFibonacci() throws Exception { + System.out.println(Arrays.toString(ArrayUtil.fibonacci(2))); +} + +/** +* +* Method: getPrimes(int max) +* +*/ +@Test +public void testGetPrimes() throws Exception { + System.out.println(Arrays.toString(ArrayUtil.getPrimes(99))); +} + +/** +* +* Method: getPerfectNumbers(int max) +* +*/ +@Test +public void testGetPerfectNumbers() throws Exception { + System.out.println(Arrays.toString(ArrayUtil.getPerfectNumbers(99))); +} + +/** +* +* Method: join(int[] array, String seperator) +* +*/ +@Test +public void testJoin() throws Exception { + System.out.println(ArrayUtil.join(a,"@")); +} + + +} diff --git a/group15/1506_1084478979/1506_1084478979/.classpath b/group15/1506_1084478979/1506_1084478979/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group15/1506_1084478979/1506_1084478979/.gitignore b/group15/1506_1084478979/1506_1084478979/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group15/1506_1084478979/1506_1084478979/.project b/group15/1506_1084478979/1506_1084478979/.project new file mode 100644 index 0000000000..13c7a33b93 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/.project @@ -0,0 +1,17 @@ + + + 1506_1084478979 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.core.resources.prefs b/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..ac8e1d1ea4 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/banshee/WorkTwo=GBK +encoding//src/banshee/WorkTwo/ArrayUtil.java=UTF-8 +encoding/=UTF-8 diff --git a/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.jdt.core.prefs b/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group15/1506_1084478979/1506_1084478979/RemoteSystemsTempFiles/.project b/group15/1506_1084478979/1506_1084478979/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000000..5447a64fa9 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group15/1506_1084478979/1506_1084478979/src/RemoteSystemsTempFiles/.project b/group15/1506_1084478979/1506_1084478979/src/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000000..5447a64fa9 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/src/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java b/group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java new file mode 100644 index 0000000000..5cc79a3457 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java @@ -0,0 +1,70 @@ +package banshee; + +import java.util.Arrays; +public class ArrayList { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + ensureCapacity(size + 1); + elementData[size++] = o; + } + public void add(int index, Object o){ + rangeCheck(index); + ensureCapacity(size+1); + System.arraycopy(elementData, index, elementData, index + 1, + size - index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + + public Object remove(int index){ + rangeCheck(index); + Object oldValue = elementData[index]; + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementData, index + 1, elementData, index, + numMoved); + elementData[--size] = null; + return oldValue; + } + + public int size(){ + return -1; + } + +// public Iterator iterator(){ +// //TODO +// //���ᡣ���� +// return null; +// } + + + private void rangeCheck( int index) { + if (index >= size || index < 0){ + throw new IndexOutOfBoundsException("ָ����index��������"); + } + } + + + public void ensureCapacity(int minCapacity) { + int oldCapacity = elementData.length; + if (minCapacity > oldCapacity) { + //�����µ�������С��Ϊ��ǰ������1.5�� + int newCapacity = (oldCapacity * 3) / 2 + 1; + if (newCapacity < minCapacity) + newCapacity = minCapacity; + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + +} + + diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java b/group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java new file mode 100644 index 0000000000..9462e7fbae --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java @@ -0,0 +1,155 @@ +package banshee; + +import java.util.NoSuchElementException; + + +public class LinkedList { + + private Node head; + private Node last; + private int size = 0; + + public void add(Object o){ + addAtLast(o); + } + public void add(int index , Object o){ + rangeCheck(index); + if (index == size) { + addAtLast(o); + }else{ + linkBrfore(o, node(index)); + } + } + public Object get(int index){ + rangeCheck(index); + return node(index); + } + public Object remove(int index){ + Node e = node(index); + remove(e); + return null; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + final Node h = head ; + final Node newNode = new Node(null, o, h); + if (h == null) { + last = newNode; + }else{ + h.prev = newNode; + } + size++; + } + public void addLast(Object o){ + addAtLast(o); + } + public Object removeFirst(){ + final Node h = head; + final Object e = h.data; + Node next = h.next; + h.data = null; + h.next = null; + head = next; + if (next == null) + last = null; + else + next.prev = null; + size--; + return e; + } + public Object removeLast(){ + final Node l = last; + final Object e = l.data; + Node newL = l.prev; + l.data = null; + l.prev = null; + last = newL; + if (newL == null) + head = null; + else + newL.next = null; + size--; + return e; + } +// public Iterator iterator(){ +// //TODO +// //����... +// return null; +// } + + + private static class Node{ + Object data; + Node next; + Node prev; + + Node(Node prev, Object element,Node next){ + this.data = element ; + this.next = next; + this.prev = prev ; + } + } + + private void addAtLast(Object element){ + Node l = last; + Node newLink = new Node(l, element, null); + last = newLink; + if (l == null) { + head = newLink; + }else { + l.next = newLink; + } + size++; + } + + private void linkBrfore(Object element , Node spNode ){ + final Node pred = spNode.prev; + final Node newNode = new Node(pred, element, spNode); + spNode.prev = newNode; + if (pred == null) { + head = newNode; + }else{ + pred.next = newNode; + } + size++; + } + + private void rangeCheck(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("ָ����index��������"); + } + } + + private Node node(int index) { + if (index < (size >> 1)) { + Node x = head; + for (int i = 0; i < index; i++) + x = x.next; + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) + x = x.prev; + return x; + } + } + + private Object remove(Node e) { + if (e == head ) + throw new NoSuchElementException(); + Object result = e. data; + e. prev.next = e.next; + e. next.prev = e.prev; + e. next = e.prev = null; + e. data = null; + size--; + return result; + } + +} + + diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/Queue.java b/group15/1506_1084478979/1506_1084478979/src/banshee/Queue.java new file mode 100644 index 0000000000..2886d458f3 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/src/banshee/Queue.java @@ -0,0 +1,20 @@ +package banshee; + +public class Queue { + private LinkedList elementData = new LinkedList(); + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + return elementData.size() == 0 ? true : false; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/RemoteSystemsTempFiles/.project b/group15/1506_1084478979/1506_1084478979/src/banshee/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000000..5447a64fa9 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/src/banshee/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/Stack.java b/group15/1506_1084478979/1506_1084478979/src/banshee/Stack.java new file mode 100644 index 0000000000..e1ec7a9ab3 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/src/banshee/Stack.java @@ -0,0 +1,23 @@ +package banshee; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size()==0?true:false; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtil.java b/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtil.java new file mode 100644 index 0000000000..3bac4a642c --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtil.java @@ -0,0 +1,165 @@ +package banshee.WorkTwo; + +import java.util.Arrays; +import java.util.ArrayList; + + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int j = origin.length - 1; + int temp; + for(int i = 0; i < origin.length /2; i++,j--){ + temp = origin[j]; + origin[j] = origin[i]; + origin[i] = temp; + } + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int[] newArr = new int[oldArray.length]; + int j = 0; + for (int i = 0; i < newArr.length; i++) { + if (oldArray[i] != 0){ + newArr[j] = oldArray[i]; + j++; + } + } + + return Arrays.copyOfRange(newArr, 0, j) ; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + + int i = 0,j = 0, k = 0; + int[] array3 = new int[array1.length + array2.length]; + + while (i < array1.length && j < array2.length) { + if (array1[i] < array2[j]) { + array3[k++] = array1[i++]; + } else if (array1[i] > array2[j]) { + array3[k++] = array2[j++]; + }else { + array3[k++] = array1[i++]; + j++; + } + } + while (i < array1.length) { + array3[k++] = array1[i++]; + } + while (j < array2.length) { + array3[k++] = array2[j++]; + } + return Arrays.copyOf(array3, k); + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int newCapacity = oldArray.length + size; + int[] newArr = Arrays.copyOf(oldArray, newCapacity); + return newArr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + ArrayList list = new ArrayList(); + if (max == 1) { + return new int[0]; + }else{ + list.add(1); + list.add(1); + int temp = 0, a = 1,b = 1; + while (a + b < max) { + list.add(a + b); + temp = a; + a = b; + b = temp + b; + } + } + int[] arr = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + + arr[i] = (Integer) list.get(i); + + } + return arr; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder sb = new StringBuilder(); + for (int element : array) { + sb.append(element).append(seperator); + } + sb.setLength(sb.length() - 1); + return sb.toString(); + } + + + + +} diff --git a/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtilTest.java b/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtilTest.java new file mode 100644 index 0000000000..4b0c7cd328 --- /dev/null +++ b/group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtilTest.java @@ -0,0 +1,72 @@ +package banshee.WorkTwo; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + + private ArrayUtil util; + + @Before + public void setUp() throws Exception { + util = new ArrayUtil(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverseArray() throws Exception { + int[] origin1 = {7, 9 , 30, 3}; + int[] origin2 = {7, 9, 30, 3, 4}; + util.reverseArray(origin1); + util.reverseArray(origin2); + assertArrayEquals(new int[]{3, 30, 9,7}, origin1); + assertArrayEquals(new int[]{4,3, 30 , 9,7}, origin2); + } + + @Test + public void testRemoveZero() throws Exception { + int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + assertArrayEquals(new int[]{1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}, util.removeZero(oldArr)); + } + + @Test + public void testMerge() throws Exception{ + int[] arr1 = new int[]{3, 5, 7, 8}; + int[] arr2 = new int[]{4, 5, 6, 7}; + assertArrayEquals(new int[]{3, 4, 5, 6, 7, 8}, util.merge(arr1, arr2)); + } + + @Test + public void testGrow() throws Exception{ + int[] old = new int[]{2, 3, 6}; + assertArrayEquals(util.grow(old, 3), new int[]{2, 3, 6, 0, 0, 0}); + } + + @Test + public void testFibonacci() throws Exception { + assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8, 13}, util.fibonacci(15)); + } + + @Test + public void testGetPrimes() { + fail("Not yet implemented"); + } + + @Test + public void testGetPerfectNumbers() { + fail("Not yet implemented"); + } + + @Test + public void testJoin() throws Exception { + int[] arr = new int[]{3, 8, 9}; + assertEquals("3-8-9", util.join(arr, "-")); + } + +} diff --git a/group15/1506_1084478979/RemoteSystemsTempFiles/.project b/group15/1506_1084478979/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000000..5447a64fa9 --- /dev/null +++ b/group15/1506_1084478979/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group15/1507_977996067/README.md b/group15/1507_977996067/README.md new file mode 100644 index 0000000000..78a3f19258 --- /dev/null +++ b/group15/1507_977996067/README.md @@ -0,0 +1 @@ +### qq 977996067 的作业文件夹 \ No newline at end of file diff --git a/group15/1507_977996067/src/task1/MyArrayList.java b/group15/1507_977996067/src/task1/MyArrayList.java new file mode 100644 index 0000000000..e4d01a2c06 --- /dev/null +++ b/group15/1507_977996067/src/task1/MyArrayList.java @@ -0,0 +1,95 @@ +package task1; + +import java.util.Arrays; +import java.util.Iterator; + +/** + * ArrayList实现 + */ +public class MyArrayList implements MyList { + + //列表元素的个数 + private int size; + //列表存放的元素 + private Object[] elements; + //初始容量10 + private static final int DEFAULT_CAPACITY = 10; + + public MyArrayList() { + elements = new Object[DEFAULT_CAPACITY]; + } + + public MyArrayList(int capacity) { + elements = new Object[capacity <= DEFAULT_CAPACITY ? DEFAULT_CAPACITY : capacity]; + } + + @Override + public void add(T o) { + add(size, o); + } + + @Override + public void add(int index, T o) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("index " + index + " 不合法"); + if (size >= elements.length) + ensureCapacity((size >> 1) + size); + elements[index] = o; + size++; + } + + @Override + @SuppressWarnings("unchecked") + public T get(int index) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("index " + index + " 越界"); + return (T) elements[index]; + } + + @Override + @SuppressWarnings("unchecked") + public T remove(int index) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("index " + index + " 越界"); + T removeElement = (T) elements[index]; + System.arraycopy(elements, index + 1, elements, index, elements.length - index - 1); + size--; + return removeElement; + } + + @Override + public int size() { + return size; + } + + public Iterator iterator() { + return new MyItr(); + } + + private void ensureCapacity(int newCapacity) { + elements = Arrays.copyOf(elements, newCapacity); + } + + private class MyItr implements Iterator { + + private int current = 0; + + @Override + public boolean hasNext() { + return current < size; + } + + @Override + @SuppressWarnings("unchecked") + public T next() { + return (T) elements[current++]; + } + + @Override + public void remove() { + if (current == 0) + throw new IllegalStateException("先调用next后才能再调用remove"); + MyArrayList.this.remove(--current); + } + } +} diff --git a/group15/1507_977996067/src/task1/MyLinkedList.java b/group15/1507_977996067/src/task1/MyLinkedList.java new file mode 100644 index 0000000000..fa5d651078 --- /dev/null +++ b/group15/1507_977996067/src/task1/MyLinkedList.java @@ -0,0 +1,130 @@ +package task1; + +import java.util.Iterator; + +/** + * LinkedList 实现 + */ +public class MyLinkedList implements MyList { + + //存放的元素数量 + private int size; + + private Node head; + + public MyLinkedList() { + head = new Node<>(null, null); + } + + @Override + public void add(T o) { + add(size, o); + } + + @Override + public void add(int index, T o) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException("index " + index + " 不合法"); + Node targetNode = new Node<>(null, o); + Node targetPrevNode = getPrevNode(index); + targetNode.next = targetPrevNode.next; + targetPrevNode.next = targetNode; + size++; + } + + @Override + public T get(int index) { + checkIndexRange(index); + return getPrevNode(index).next.data; + } + + + @Override + public T remove(int index) { + checkIndexRange(index); + Node prevNode = getPrevNode(index); + Node nodeToRemove = prevNode.next; + prevNode.next = nodeToRemove.next; + size--; + return nodeToRemove.data; + } + + @Override + public int size() { + return size; + } + + public void addFirst(T o) { + add(0, o); + + } + + public void addLast(T o) { + add(size, o); + } + + public T removeFirst() { + return remove(0); + } + + public T removeLast() { + return remove(size - 1); + } + + + public Iterator iterator() { + return new MyLinkedItr(); + } + + /** + * 找到位置为index的前一个node + * + * @param index 索引值 + */ + + private Node getPrevNode(int index) { + Node targetPrevNode = head; + for (int i = 0; i < index; i++) { + targetPrevNode = targetPrevNode.next; + } + return targetPrevNode; + } + + /** + * 检查索引是否越界 + * + * @param index 索引值 + */ + private void checkIndexRange(int index) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("index " + index + " 越界"); + } + + private static class Node { + private Node next; + private T data; + + private Node(Node next, T data) { + this.next = next; + this.data = data; + } + } + + private class MyLinkedItr implements Iterator { + + private Node currentNode = head; + + @Override + public boolean hasNext() { + return currentNode.next != null; + } + + @Override + public T next() { + Node nextNode = currentNode.next; + T data = nextNode.data; + currentNode = nextNode; + return data; + } + } +} diff --git a/group15/1507_977996067/src/task1/MyList.java b/group15/1507_977996067/src/task1/MyList.java new file mode 100644 index 0000000000..e68f445174 --- /dev/null +++ b/group15/1507_977996067/src/task1/MyList.java @@ -0,0 +1,16 @@ +package task1; + +/** + * List 接口 + */ +public interface MyList { + public void add(T o); + + public void add(int index, T o); + + public T get(int index); + + public T remove(int index); + + public int size(); +} diff --git a/group15/1507_977996067/src/task1/MyQueue.java b/group15/1507_977996067/src/task1/MyQueue.java new file mode 100644 index 0000000000..2ae3d8529f --- /dev/null +++ b/group15/1507_977996067/src/task1/MyQueue.java @@ -0,0 +1,25 @@ +package task1; + +/** + * Queue 实现 + */ +public class MyQueue { + private MyLinkedList elementData = new MyLinkedList(); + + public void enQueue(T o) { + elementData.addFirst(o); + } + + public T deQueue() { + return elementData.removeLast(); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } + +} diff --git a/group15/1507_977996067/src/task1/MyStack.java b/group15/1507_977996067/src/task1/MyStack.java new file mode 100644 index 0000000000..476caf67e2 --- /dev/null +++ b/group15/1507_977996067/src/task1/MyStack.java @@ -0,0 +1,29 @@ +package task1; + +/** + * Stack 实现 + */ +public class MyStack { + private MyLinkedList elementData = new MyLinkedList(); + + public void push(T o) { + elementData.addFirst(o); + } + + public T pop() { + return elementData.removeFirst(); + } + + public T peek() { + return elementData.get(0); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } + +} diff --git a/group15/1507_977996067/src/task1/README.md b/group15/1507_977996067/src/task1/README.md new file mode 100644 index 0000000000..d012aef953 --- /dev/null +++ b/group15/1507_977996067/src/task1/README.md @@ -0,0 +1 @@ +###2.26作业:实现简单的数据结构 \ No newline at end of file diff --git a/group15/1507_977996067/src/task2/README.md b/group15/1507_977996067/src/task2/README.md new file mode 100644 index 0000000000..8c99b55977 --- /dev/null +++ b/group15/1507_977996067/src/task2/README.md @@ -0,0 +1,3 @@ +## 3.5 作业文件夹 +1. ArrayUtil +2. struts \ No newline at end of file diff --git a/group15/1507_977996067/src/task2/array/ArrayUtil.java b/group15/1507_977996067/src/task2/array/ArrayUtil.java new file mode 100644 index 0000000000..21cb4286c7 --- /dev/null +++ b/group15/1507_977996067/src/task2/array/ArrayUtil.java @@ -0,0 +1,215 @@ +package task2.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int length = origin.length; + int[] temp = new int[length]; + for (int i = 0; i < length; i++) { + temp[i] = origin[length - i - 1]; + } + System.arraycopy(temp, 0, origin, 0, length); + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int count = 0; + int length = oldArray.length; + for (int i = 0; i < length; i++) { + int element = oldArray[i]; + if (element != 0) { + oldArray[count] = element; + count++; + } + } + return Arrays.copyOf(oldArray, count); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int firstPos = 0; + int secondPos = 0; + int firstLength = array1.length; + int secondLength = array2.length; + int[] tempArray = new int[firstLength + secondLength]; + int tempArrayPos = 0; +/* 比较两个数组第一个元素的大小,小的元素放到tempArray中且数组索引加一,然后继续比较. + 直到有一个数组遍历完,把另外一个数组剩下的元素依次放到tempArray中*/ + while (firstPos < firstLength && secondPos < secondLength) { + int firstElement = array1[firstPos]; + int secondElement = array2[secondPos]; + if (firstElement < secondElement) { + tempArray[tempArrayPos++] = array1[firstPos++]; + } else if (firstElement > secondElement) { + tempArray[tempArrayPos++] = array2[secondPos++]; + } else { + tempArray[tempArrayPos++] = array1[firstPos++]; + secondPos++; + } + } + if (firstPos == firstLength && secondPos < secondLength) { + System.arraycopy(array2, secondPos, tempArray, tempArrayPos, secondLength - secondPos); + tempArrayPos += secondLength - secondPos; + } else if (secondPos == secondLength && firstPos < firstLength) { + System.arraycopy(array1, firstPos, tempArray, tempArrayPos, firstLength - firstPos); + tempArrayPos += firstLength - firstPos; + } + return Arrays.copyOf(tempArray, tempArrayPos); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] temp = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, temp, 0, oldArray.length); + return temp; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max == 1) + return new int[0]; + int[] result = new int[max + 1]; + result[0] = 1; + result[1] = 1; + return getFibonacci(result, 2, max); + } + + private int[] getFibonacci(int[] arr, int index, int max) { + if (arr[index - 1] >= max) { + return Arrays.copyOf(arr, index - 1); + } + arr[index] = arr[index - 1] + arr[index - 2]; + return getFibonacci(arr, ++index, max); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + if (max == 2) + return new int[]{2}; + else if (max >= 3 && max <= 4) + return new int[]{2, 3}; + else if (max > 4) { + int[] arr = new int[max]; + arr[0] = 2; + arr[1] = 3; + int pos = 2; + for (int i = 5; i < max; i++) { + //去掉能被2、3整除的数:6n+2 6n+3 6n+4 + if ((i + 1) % 6 == 0 || (i - 1) % 6 == 0) { + if (isPrime(i)) { + arr[pos++] = i; + } + } + } + return Arrays.copyOf(arr, pos); + } + return null; + } + + private boolean isPrime(int number) { + //去掉偶数 + if (number % 2 == 0) + return false; + //只能被自身整除的为素数 + for (int i = 2; i < number; i++) { + if (number % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int[] arr = new int[max]; + int pos = 0; + for (int i = 4; i < max; i++) { + //去掉素数 + if (!isPrime(i)) { + List list = new ArrayList<>(); + for (int j = 1; j < i; j++) { + if (i % j == 0) + list.add(j); + } + if (i == list.stream().reduce(0, (a, b) -> a + b)) + arr[pos++] = i; + } + } + return Arrays.copyOf(arr, pos); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param separator + * @return + */ + public String join(int[] array, String separator) { + StringBuilder sb = new StringBuilder(); + for (int element : array) { + sb.append(element).append(separator); + } + sb.setLength(sb.length() - 1); + return sb.toString(); + } + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task2/array/ArrayUtilTest.java b/group15/1507_977996067/src/task2/array/ArrayUtilTest.java new file mode 100644 index 0000000000..8a38dd59ce --- /dev/null +++ b/group15/1507_977996067/src/task2/array/ArrayUtilTest.java @@ -0,0 +1,75 @@ +package task2.array; + +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + +import static org.junit.Assert.*; + +public class ArrayUtilTest { + + private ArrayUtil util; + + @Before + public void pre() { + util = new ArrayUtil(); + } + + @Test + public void reverseArray() throws Exception { + int[] i = {7, 9, 40, 30, 3}; + int[] ii = {7, 9, 40, 30, 3, 11}; + util.reverseArray(i); + util.reverseArray(ii); + assertArrayEquals(new int[]{3, 30, 40, 9, 7}, i); + assertArrayEquals(new int[]{11, 3, 30, 40, 9, 7}, ii); + } + + @Test + public void removeZero() throws Exception { + int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + assertArrayEquals(new int[]{1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}, util.removeZero(oldArr)); + } + + @Test + public void merge() throws Exception { + int[] arr1 = new int[]{3, 5, 7, 8}; + int[] arr2 = new int[]{4, 5, 6, 7}; + assertArrayEquals(new int[]{3, 4, 5, 6, 7, 8}, util.merge(arr1, arr2)); + } + + @Test + public void grow() throws Exception { + int[] old = new int[]{2, 3, 6}; + assertArrayEquals(util.grow(old, 3), new int[]{2, 3, 6, 0, 0, 0}); + } + + @Test + public void fibonacci() throws Exception { + assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8, 13}, util.fibonacci(15)); + } + + @Test + public void getPrimes() throws Exception { + int[] primes = util.getPrimes(33); + assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31}, primes); + } + + @Test + public void getPerfectNumbers() throws Exception { + assertArrayEquals(new int[]{6,28,496,8128}, util.getPerfectNumbers(10000)); + } + + @Test + public void join() throws Exception { + int[] arr = new int[]{3, 8, 9}; + assertEquals("3-8-9", util.join(arr, "-")); + } + + private void printArray(int[] arr) { + Arrays.stream(arr).forEach(System.out::println); + } + + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task2/litestruts/LogOutAction.java b/group15/1507_977996067/src/task2/litestruts/LogOutAction.java new file mode 100644 index 0000000000..b62d25ecc9 --- /dev/null +++ b/group15/1507_977996067/src/task2/litestruts/LogOutAction.java @@ -0,0 +1,34 @@ +package task2.litestruts; + +public class LogOutAction { + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "logout successful"; + return "success"; + } + this.message = "logout failed,please check your user/pwd"; + return "error"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task2/litestruts/LoginAction.java b/group15/1507_977996067/src/task2/litestruts/LoginAction.java new file mode 100644 index 0000000000..abde57860a --- /dev/null +++ b/group15/1507_977996067/src/task2/litestruts/LoginAction.java @@ -0,0 +1,34 @@ +package task2.litestruts; + +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task2/litestruts/Struts.java b/group15/1507_977996067/src/task2/litestruts/Struts.java new file mode 100644 index 0000000000..c2c8a61c3a --- /dev/null +++ b/group15/1507_977996067/src/task2/litestruts/Struts.java @@ -0,0 +1,80 @@ +package task2.litestruts; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + +// 0. 读取配置文件struts.xml,引用Jsoup + Document document = null; + try { + document = Jsoup.connect("http://my.977996067.cn/2017_2/struts.xml").get(); + } catch (IOException e) { + System.err.println("xml解析失败"); + } +// 获取所有的action标签 + Elements actions = document != null ? document.select("action") : null; + if (actions == null) + return null; + for (Element actionElement : actions) { + String name = actionElement.attr("name"); +// 反射action + if (actionName.equals(name)) { + try { + Class actionClass = Class.forName(actionElement.attr("class")); + Object o = actionClass.getConstructor().newInstance(); + parameters.forEach((k, v) -> { + try { + Field field = actionClass.getDeclaredField(k); + field.setAccessible(true); + //赋值 + field.set(o, v); + } catch (Exception e) { + e.printStackTrace(); + } + }); +// 执行execute方法,获取返回值 + Method method = actionClass.getMethod("execute"); + String returnValue = (String) method.invoke(o); + View view = new View(); + Map map = new HashMap(); + Arrays.stream(actionClass.getMethods()) + .forEach(((Method m) -> { + try { + String methodName = m.getName(); + if (methodName.startsWith("get")) + map.put(methodName.substring(methodName.indexOf("get") + 3).toLowerCase(), m.invoke(o)); + } catch (Exception e) { + e.printStackTrace(); + } + })); + view.setParameters(map); +// 获取返回视图名 + Elements children = actionElement.children().select("result"); + for (Element aChildren : children) { + if (returnValue.equals(aChildren.attr("name"))) { + view.setJsp(aChildren.text()); + } + } + System.out.println(view); + return view; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return null; + } +} diff --git a/group15/1507_977996067/src/task2/litestruts/StrutsTest.java b/group15/1507_977996067/src/task2/litestruts/StrutsTest.java new file mode 100644 index 0000000000..ec7d992cf2 --- /dev/null +++ b/group15/1507_977996067/src/task2/litestruts/StrutsTest.java @@ -0,0 +1,39 @@ +package task2.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group15/1507_977996067/src/task2/litestruts/View.java b/group15/1507_977996067/src/task2/litestruts/View.java new file mode 100644 index 0000000000..667068ef37 --- /dev/null +++ b/group15/1507_977996067/src/task2/litestruts/View.java @@ -0,0 +1,33 @@ +package task2.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } + + @Override + public String toString() { + return "View{" + "jsp='" + jsp + '\'' + + ", parameters=" + parameters + + '}'; + } +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task2/litestruts/struts.xml b/group15/1507_977996067/src/task2/litestruts/struts.xml new file mode 100644 index 0000000000..8716d96c5a --- /dev/null +++ b/group15/1507_977996067/src/task2/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/1510_739253131/src/com/bruce/homework0226/ArrayListV00.java b/group15/1510_739253131/src/com/bruce/homework0226/ArrayListV00.java new file mode 100644 index 0000000000..3137c7568b --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0226/ArrayListV00.java @@ -0,0 +1,177 @@ +package com.bruce.homework0226; + +import com.bruce.utils.MyException; + +import java.io.Serializable; +import java.util.Arrays; + +/** + * 用数组实现ArrayList基本功能:add,remove,size,contains,toArray方法 + * @Version: 0.0 + * Created by Bruce.Jiao on 17-2-23. + */ +public class ArrayListV00 implements Serializable { + + /** + * 存放集合元素的数组 + */ + private transient Object[] elementData; + /** + * 集合中元素的个数 + */ + private int size; + + /** + * 空构造,默认数组长度为10 + */ + public ArrayListV00() throws MyException { + this(10); + } + + /** + * 有参构造 + * + * @param initCapacity + * 用户传入的集合大小,底层数组的初始化大小 + */ + public ArrayListV00(int initCapacity) throws MyException{ + if(initCapacity < 0){ + throw new MyException("集合大小不能小于0"); + } + elementData = new Object[initCapacity]; + } + + /** + * 向集合中添加元素 + * + * @param value + * 添加的元素,允许添加null + * @return true:添加成功 ; false:添加失败 + */ + public boolean add(Object value) { + // 添加元素之前,对数组长度进行判断,此处需要传入当前元素个数+1, + ensureCapacity(size + 1); + elementData[size++] = value; + return true; + } + + /** + * 返回指定位置的元素 数组和集合,下标从1开始 + * + * @param index + * 用户指定的位置 + * @return + */ + public Object get(int index) throws MyException { + // 判断是否越界,注意:此处判断依据是size,而不能是elementData.length, + // 集合元素个数size小于等于elementData.length + if (index >= size || index < 0) { + throw new MyException("给定数值超出集合范围"); + } + return elementData[index]; + } + + /** + * 删除指定位置的元素 + * + * @param index + * 用户指定位置,从0开始 + * @return 返回删除掉的指定位置的元素 + */ + public Object remove(int index) throws MyException { + if (index >= size || index < 0) { + throw new MyException("给定数值超出集合范围"); + } + Object value = elementData[index]; + // 数组中被删除元素后边的所有元素的个数,此处不能使用elementData.length + int length = size - 1 - index; + // 被删除位置后还有元素,将数组中被删除位置往后(不包含被删除位置)的所有元素往前移动一位 + if (length > 0) { + System.arraycopy(elementData, index + 1, elementData, index, length); + } + elementData[--size] = null; + return value; + } + + /** + * 判断集合中是否包含指定的元素 + * + * @param value + * 用户制定的元素 + * @return true:包含指定元素;false:不包含指定元素 + */ + public boolean contains(Object value) { + for (int i = 0; i < elementData.length; i++) { + if (value == null) { + if (elementData[i] == null) { + return true; + } + } else { + if (value.equals(elementData[i])) { + return true; + } + } + } + return false; + } + + /** + * 得到集合对应的静态数组 + * + * @return 底层数组 + */ + public Object[] toArray() { + //elementData可能会包含null元素,不能直接返回,需返回一个包含集合所有元素的新数组 +// return elementData; + return Arrays.copyOf(elementData,size); + } + + /** + * 返回集合大小 + * + * @return + */ + public int size() { + return size; + } + + /** + * 传入的数值与数组长度进行比较,长度小于传入数值,对数组进行扩容 + * + * @param minCapacity + * 传入的数值 + */ + public void ensureCapacity(int minCapacity) { + int oldCapacity = elementData.length; + // 如果传入数值大于现有数组长度,对现有数组进行扩容 + if (minCapacity > oldCapacity) { + // 此处用新的局部变量引用指向原有数组的内存地址,仅为了避免复制数组元素到新数组时候,发生原有数组内存地址被覆盖的情况 + Object[] oldArray = elementData; + // 先得到现有数组长度1.5倍的值 + int newCapacity = oldCapacity + oldCapacity >> 1; + // 如果增加1.5倍后的数值仍然小于传入的数值,将传入的数值赋给新数组长度 + if (minCapacity > newCapacity) { + newCapacity = minCapacity; + } + // 将elementData引用指向一个新的扩容后的数组,并且将原有数组的元素复制到新数组中 + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + /** + * 重写toString方法,查看集合具体内容 + * @return + */ + @Override + public String toString() { + return Arrays.toString(elementData); + } + + /** + * 仅仅作为自己查看底层数组长度的方法, + * @return + */ + int arrayLength() { + return elementData.length; + } +} diff --git a/group15/1510_739253131/src/com/bruce/homework0226/JuintTest.java b/group15/1510_739253131/src/com/bruce/homework0226/JuintTest.java new file mode 100644 index 0000000000..b0aa452f6d --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0226/JuintTest.java @@ -0,0 +1,141 @@ +package com.bruce.homework0226; + +import com.bruce.utils.MyException; +import junit.framework.TestCase; +import org.junit.Test; +import java.util.Arrays; +import java.util.Random; + +/** + * Created by Bruce.Jiao on 17-2-23. + */ +public class JuintTest extends TestCase{ + + @Test + public void testArrayList(){ + try { + ArrayListV00 arrayList = new ArrayListV00(0); + arrayList.add("aaa"); + arrayList.add("bbb"); + arrayList.add("ccc"); + arrayList.add("fff"); + arrayList.add("ggg"); + System.out.println("集合下标2处的元素:"+arrayList.get(2)); + System.out.println("是否包含ccc这个元素:"+arrayList.contains("ccc")); + System.out.println("是否包含ddd这个元素:"+arrayList.contains("ddd")); + System.out.println("删除前集合大小为:"+arrayList.size()); + System.out.println("删除下标2处元素前底层数组:"+arrayList); + arrayList.remove(2); + System.out.println("删除下标2处元素后底层数组:"+arrayList); + System.out.println("删除一个元素后集合大小为:"+arrayList.size()); + arrayList.remove(2); + System.out.println("再删除下标2处元素后底层数组:"+arrayList); + System.out.println("集合为:"+ Arrays.toString(arrayList.toArray())); + System.out.println("集合底层数组长度:"+ arrayList.arrayLength()); +// System.out.println("集合下标-1处的元素:"+arrayList.get(-1)); + } catch (MyException e) { + System.out.println("发生异常>>>"+e); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void testLinkedList(){ + try { + LinkedListV00 linkedList = new LinkedListV00<>(); + linkedList.add("aaa"); + linkedList.add("bbb"); + linkedList.add("ccc"); + linkedList.add("ddd"); + System.out.println("删除index=2的元素前:"+linkedList); + System.out.println("链表尺寸"+linkedList.size()); + System.out.println("拿到index=2的元素"+linkedList.get(2)); + linkedList.remove(2); + System.out.println("删除index=2的元素后:"+linkedList); + } catch (MyException e) { + System.out.println(e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void testStack(){ + try { + StackV00 stack = new StackV00(); + stack.push("ccc"); + stack.push(null); + stack.push("bbb"); + stack.push("aaa"); + System.out.println("栈的大小:"+stack.size()); + System.out.println("栈是否为空:"+stack.isEmpty()); + System.out.println("栈是否为空:"+stack); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + stack.clear(); + System.out.println("清空后,栈大小:"+stack.size()); + System.out.println("栈是否为空:"+stack.isEmpty()); + } catch (MyException e) { + System.out.println(e); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void testQueue(){ + try { + QueueV00 queue = new QueueV00(); + System.out.println("队列是否为空:"+queue.isEmpty()); + queue.add("aaa"); + queue.add("bbb"); + queue.add("ccc"); + queue.add("ddd"); + System.out.println(queue); + System.out.println("queue.peek结果:"+queue.peek()); + System.out.println("peek后队列长度:"+queue.length()); + System.out.println("queue.poll结果:"+queue.poll()); + System.out.println("poll后队列长度:"+queue.length()); + System.out.println("队列是否为空:"+queue.isEmpty()); + } catch (MyException e) { + System.out.println(e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void testArrayLinked(){ + try { + ArrayListV00 arrayList = new ArrayListV00(); + LinkedListV00 linkedList = new LinkedListV00(); + long start1 = System.currentTimeMillis(); + for(int i = 0;i<10000;i++){ + arrayList.add("abc"+i); + } + long end1 = System.currentTimeMillis(); + for(int i = 0;i<10000;i++){ + linkedList.add("abc"+i); + } + long end2 = System.currentTimeMillis(); + System.out.println("ArrayList的时间:"+(end1-start1)); + System.out.println("LinkedList的时间:"+(end2-end1)); + } catch (MyException e) { + e.printStackTrace(); + } + } + + public String getRandomString(int length){ + String base = "abcdefghijklmnopqrstuvwxyz0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for(int i = 0;i implements Serializable { + + /** + * 双向链表中节点实例的个数 + */ + private transient int size = 0; + + /** + * 前一个节点 + */ + private transient Node first; + + /** + * 后一个节点 + */ + private transient Node last; + + /** + * 空构造 + */ + public LinkedListV00(){} + + /** + * 添加一个节点 + * @param element + * @return + */ + public boolean add(E element){ + linkNext(element); + return true; + } + + /** + * 拿到制定位置的元素 + * @param index + * @return + */ + public E get(int index) throws MyException{ + if(index < 0 || index > size){ + throw new MyException("索引越界"); + } + return node(index).element; + } + + /** + * 删除指定位置的元素 + * 将index-1处节点的next指向index+1处节点,将index+1处节点的previous指向index-1节点 + * @param index 节点位置 + * @return 删除节点的element数据 + */ + public E remove(int index) throws MyException{ + if(index < 0 || index > size){ + throw new MyException("节点索引越界"); + } + return unlink(node(index)); + } + + /** + * 返回链表的长度 + * @return 双向链表中节点实例的个数 + */ + public int size(){ + return size; + } + + /** + * 拿到链表对应的数组 + * @return 链表各节点的element元素组成的数组 + */ + public Object[] toArray(){ + Object[] array = new Object[size]; + for(int i = 0;i x = first; x != null; x = x.next) +// result[i++] = x.element; +// return result; + } + + /** + * 表示一个节点的内部类 + * @param 链表元素泛型 + */ + private static class Node{ + E element; + Node previous; + Node next; + Node(Node previous,E element,Node next){ + this.element = element; + this.previous = previous; + this.next = next; + } + } + + /** + * 根据索引拿对应的节点 + * @param index 索引号 + * @return 索引号对应的节点 + */ + private Node node(int index){ + Node x; + //如果index小于size的一半,即目标节点在链表前半部分 + if(index < (size >> 1)){ + //从第一个节点挨个向后查找,一直到(index-1)处,将其next赋值给x + x = first; + for(int i = 0; iindex;i--){ + x = x.previous; + } + } + //返回x + return x; + } + + /** + * 链接下一个 + * @param e 新节点的element + */ + private void linkNext(E e){ + //将当前的last节点赋值给n + final Node n = last; + //创建一个新的Node节点,其previous为n,next为null + final Node newNode = new Node(n,e,null); + //创建一个新的节点后,则last更新为新节点newNode + last = newNode; + //如果n为null,说明还是一个空的双向链表,将新节点newNode赋值给first + //否则,将newNode赋值给n的next + if(n == null){ + first = newNode; + }else{ + n.next = newNode; + } + //添加一个新节点后,size加1 + size++; + } + + /** + * 从链表解除一个节点 + * @param node 将要被链表接触关联的目标节点 + * @return 目标节点的element元素 + */ + private E unlink(Node node){ + //拿到传入节点的元素 + final E element = node.element; + //拿到传入节点的next节点 + final Node next = node.next; + //拿到传入节点的previous节点 + final Node previous = node.previous; + //如果传入节点的previous=null,说明是第一个节点 + if(previous == null){ + //将链表第一个节点指向本节点的下一个节点next,即把原有的第一个节点解除 + first = next; + }else{ + //将本节点前一个节点的next指向本节点后一个节点,即跳过了本节点 + previous.next = next; + //将本节点的previous节点设置为null + node.previous = null; + } + //如果传入节点的next=null,说明是最后一个节点 + if(next == null){ + //将链表最后一个节点指向本节点的前一个节点,即把原来的最后一个节点解除 + last = previous; + }else{ + //将本节点下一个节点的previous节点指向本节点的前一个节点,即跳过了本节点 + next.previous = previous; + //本节点的next节点设置为null + node.next = null; + } + node.element = null; + size--; + return element; + } + + /** + * 仅作为临时方法,打印链表元素使用,方面查看 + * @return + */ + @Override + public String toString() { + return Arrays.toString(toArray()); + } +} diff --git a/group15/1510_739253131/src/com/bruce/homework0226/QueueV00.java b/group15/1510_739253131/src/com/bruce/homework0226/QueueV00.java new file mode 100644 index 0000000000..7e86244d66 --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0226/QueueV00.java @@ -0,0 +1,117 @@ +package com.bruce.homework0226; + +import com.bruce.utils.MyException; + +import java.util.Arrays; + +/** + * 实现Queue的基本功能:peek,poll,add,length,isEmpty + * Created by Bruce.Jiao on 2017/2/25. + */ +public class QueueV00 { + /** + * 队列元素的数组 + */ + private Object[] elementData; + + /** + * 队列容量 + */ + private int max_size; + + /** + * 队列头,允许删除 + */ + private int head; + + /** + * 队列尾,允许插入 + */ + private int tail; + + /** + * 无参构造,默认的初始长度10 + */ + public QueueV00() throws MyException{ + this(10); + } + + /** + * 有参构造 + * @param initCapacity 用户自定的初始长度 + */ + public QueueV00(int initCapacity) throws MyException{ + if(initCapacity < 0){ + throw new MyException("队列长度不能为负数"); + } + this.max_size = initCapacity; + elementData = new Object[initCapacity]; + head = tail = 0; + } + + /** + * 向队列里添加元素 + * @param value 添加的元素 + * @return true:添加成功;false:添加失败 + * @throws MyException 加入添加完成后元素个数超过队列最大尺寸,抛出异常 + */ + public boolean add(Object value) throws MyException{ + if(tail == max_size){ + throw new MyException("队列已满,不能继续插入"); + } + elementData[tail++] = value; + return true; + } + + /** + * 返回队列的第一个元素,但不从队列中删除该元素 + * @return 队列的第一个元素,以插入顺序为先后标准 + */ + public Object peek() throws MyException{ + if(isEmpty()){ + throw new MyException("队列为空队列"); + } + return elementData[head]; + } + + /** + * 返回队列的第一个元素,并且从队列中将该元素删除 + * @return 队列的第一个元素 + * @throws MyException 队列为空,抛出异常 + */ + public Object poll() throws MyException{ + if(isEmpty()){ + throw new MyException("队列为空队列"); + } + //将队列的第一个元素暂存 + Object result = elementData[head]; + //将队列的第一个元素设置为null,并且将head加1 + elementData[head++] = null; + return result; + } + + /** + * 队列长度 + * @return 队列中元素个数 + */ + public int length(){ + return tail-head; + } + + /** + * 判断队列是否为空 + * @return true:队列为空;false:队列不为空 + */ + public boolean isEmpty(){ + return tail == head; + } + + /** + * 临时方法,仅作为测试阶段打印队列元素使用 + * @return + */ + @Override + public String toString() { + return Arrays.toString(Arrays.copyOf(elementData,length())); + } +} diff --git a/group15/1510_739253131/src/com/bruce/homework0226/StackV00.java b/group15/1510_739253131/src/com/bruce/homework0226/StackV00.java new file mode 100644 index 0000000000..29cfe7e9fd --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0226/StackV00.java @@ -0,0 +1,144 @@ +package com.bruce.homework0226; + +import com.bruce.utils.MyException; + +import java.io.Serializable; +import java.util.Arrays; + +/** + * 用数组实现一个栈的基本功能:push,pop,isEmpty,size,clear方法 + * @Version: 0.0 + * Created by Bruce.Jiao on 17-2-24. + */ +public class StackV00 implements Serializable{ + + /** + * 底层存放栈元素的数组 + */ + private Object[] elementData; + + /** + * 栈中元素的个数 + */ + private int size; + + /** + * 每次扩容增加的大小 + */ + private int capacityIncrement; + + /** + * 空构造,数组初始长度为10 + */ + public StackV00() throws MyException{ + this(10); + } + + /** + * 有参构造 + * @param initCapacity 用户指定的栈空间初始大小(底层数组的初始大小) + * @throws MyException 对传入参数进行判断,不符合要求抛出异常 + */ + public StackV00(int initCapacity) throws MyException{ + this(initCapacity,0); + } + + /** + * 有参构造 + * @param initCapacity 用户指定的栈空间初始大小(底层数组的初始大小) + * @param capacityIncrement 用户指定的每次扩容大小(当空间不足时,每一次扩容增加的大小) + * @throws MyException 对传入参数进行判断,不符合要求抛出异常 + */ + public StackV00(int initCapacity, int capacityIncrement) throws MyException{ + if(initCapacity < 0 || capacityIncrement <0){ + throw new MyException(initCapacity < 0?"栈空间大小不能为负数":"扩容参数不能为负数"); + } + elementData = new Object[initCapacity]; + } + + /** + * 向栈中添加元素 + * @param value 添加的元素,可以为null + * @return 添加成功后的元素 + */ + public Object push(Object value){ + ensureCapacity(size+1); + //将新增的元素放在size索引处,并且将size加1 + elementData[size++] = value; + return value; + } + + /** + * 从栈中获取元素,拿到当前所有元素中最后添加进来的元素 + * @return 最后的元素 + */ + public Object pop(){ + //拿到最后的元素,在栈中将该元素删除,将size减1 + return elementData[--size]; + } + + /** + * 判断栈是否为空 + * @return true:空栈,无元素;false:有元素 + */ + public boolean isEmpty(){ + return size == 0; + } + + /** + * 获取栈大小(元素数量,包括null元素) + * @return 栈中元素大小 + */ + public int size(){ + return size; + } + + /** + * 清空栈中元素 + */ + public void clear(){ + int oldCapacity = elementData.length; + size = 0; + elementData = new Object[oldCapacity]; + } + + /** + * 判断数组尺寸 + * @param minCapacity + */ + public void ensureCapacity(int minCapacity){ + int oldCapacity = elementData.length; + //如果传入值大于当前数组尺寸,对数组进行扩容 + if(minCapacity > oldCapacity){ + //如果capacityIncrement大于0,每次扩容用户指定的大小,否则每次将当前数组尺寸扩大一倍 + int newCapacity = oldCapacity + capacityIncrement > 0 ? capacityIncrement : oldCapacity; + //元素数组扩容,并且将原有的元素复制到新数组中 + elementData = Arrays.copyOf(elementData,newCapacity); + } + } + + /** + * 拿到底层的静态数组 + * @return 底层元素数组 + */ + public Object[] toArray(){ + return Arrays.copyOf(elementData,size); + } + + /** + * toString方法,可以直接打印出栈底层的数组 + * @return + */ + @Override + public String toString() { + return Arrays.toString(toArray()); + } + + /** + * 仅仅作为自己查看底层数组长度的方法, + * @return 数组长度,大于等于元素个数 + */ + int arrayLength() { + return elementData.length; + } +} diff --git a/group15/1510_739253131/src/com/bruce/homework0305/array/ArrayUtil.java b/group15/1510_739253131/src/com/bruce/homework0305/array/ArrayUtil.java new file mode 100644 index 0000000000..85276ce4da --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0305/array/ArrayUtil.java @@ -0,0 +1,232 @@ +package com.bruce.homework0305.array; + +import com.bruce.homework0226.LinkedListV00; + +import java.util.*; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public int[] reverseArray(int[] origin){ + if(origin != null && origin.length > 0) { + int temp; + for (int i = 0; i < origin.length / 2; i++) { + temp = origin[i]; + origin[i] = origin[origin.length-1 - i]; + origin[origin.length-1 - i] = temp; + } + } + return origin; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int[] result = null; + if(oldArray != null && oldArray.length >= 0){ + int index = 0; + LinkedList linkedList = new LinkedList(); + for(int i = 0;i list = new LinkedList<>(); + getElementFromArray(array1,list); + getElementFromArray(array2,list); + Collections.sort(list); + int[] result = new int[list.size()]; + for(int n = 0;n Integer.MAX_VALUE) { + return result;//抛出异常 + } else if (max == 1) { + result = new int[0]; + } else { + ArrayList list = new ArrayList(); + list.add(1); + list.add(1); + for (int i = 2;i max){ + break; + } + list.add(i,(list.get(i-2)+list.get(i-1))); + } + result = new int[list.size()]; + for (int j=0;j Integer.MAX_VALUE) { + return result;//抛出异常 + } else if(max == 1){ + result = new int[0]; + }else { + ArrayList list = new ArrayList<>(); + for (int i=2 ; i<=max ; i++) { + if(isPrimes(i)){ + list.add(i); + } + } + result = new int[list.size()]; + for(int m = 0 ; m Integer.MAX_VALUE){ + return result; + } else { + LinkedList list = new LinkedList<>(); + for(int i = 1 ; i < max ; i++){ + if (isPerfectNumber(i)) { + list.add(i); + } + } + result = new int[list.size()]; + for (int i = 0 ; i < list.size() ; i++) { + result[i] = list.get(i); + } + } + return result; + } + + //判断一个数是否是完数,true:是完数;false:不是完数。 + public boolean isPerfectNumber(int value){ + int sum = 0; + for(int i = 1 ; i < value ; i++){ + if(value % i == 0){ + sum += i; + } + } + return sum == value; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuffer sb = new StringBuffer(); + if (array != null && array.length >= 1) { + for (int i = 0 ; i < array.length ; i++) { + sb.append(array[i]); + if (i < array.length-1) { + sb.append(seperator); + } + } + } + return sb.toString(); + } + + +} diff --git a/group15/1510_739253131/src/com/bruce/homework0305/array/JuintArrayUtil.java b/group15/1510_739253131/src/com/bruce/homework0305/array/JuintArrayUtil.java new file mode 100644 index 0000000000..eb5487e76d --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0305/array/JuintArrayUtil.java @@ -0,0 +1,84 @@ +package com.bruce.homework0305.array; + +import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + +/** + * Created by Bruce.Jiao on 2017/3/2. + */ +public class JuintArrayUtil extends TestCase { + + @Test + public void testReverse(){ + ArrayUtil au = new ArrayUtil(); + int[] demo0 = {}; + int[] demo1 = {6}; + int[] demo = {7, 9, 30, 3, 4, 6}; + int[] nullArray = au.reverseArray(null); + int[] reverseArray0 = au.reverseArray(demo0); + int[] reverseArray1 = au.reverseArray(demo1); + int[] reverseArray = au.reverseArray(demo); + System.out.println(Arrays.toString(nullArray)); + System.out.println(Arrays.toString(reverseArray0)); + System.out.println(Arrays.toString(reverseArray1)); + System.out.println(Arrays.toString(reverseArray)); + } + + @Test + public void testRemoveZero(){ + ArrayUtil au = new ArrayUtil(); + int[] one = {0}; + int[] many = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + System.out.println(Arrays.toString(au.removeZero(one))); + System.out.println(Arrays.toString(au.removeZero(many))); + System.out.println(Arrays.toString(au.removeZero(null))); + System.out.println(Arrays.toString(au.removeZero(new int[0]))); + } + + @Test + public void testMerge(){ + ArrayUtil au = new ArrayUtil(); + int[] arr1 = {3,4,5,6,7,8,9}; + int[] arr2 = {1,3,5,6,7,9,10,12,13}; + int[] arr3 = null; + int[] arr4 = new int[0]; + System.out.println(Arrays.toString(au.merge(arr1,arr2))); + System.out.println(Arrays.toString(au.merge(arr1,arr3))); + System.out.println(Arrays.toString(au.merge(arr2,arr4))); + } + + @Test + public void testGrow(){ + ArrayUtil au = new ArrayUtil(); + int[] arr = {3,4,5,6,7,8,9}; + System.out.println(Arrays.toString(au.grow(arr,5))); + } + + @Test + public void testFibonacci(){ + ArrayUtil au = new ArrayUtil(); + System.out.println(Arrays.toString(au.fibonacci(15))); + } + + @Test + public void testPrimes(){ + ArrayUtil au = new ArrayUtil(); + System.out.println(Arrays.toString(au.getPrimes(23))); + } + + @Test + public void testPerfectNumbers(){ + ArrayUtil au = new ArrayUtil(); + System.out.println(Arrays.toString(au.getPerfectNumbers(23))); + } + + @Test + public void testJoin(){ + ArrayUtil au = new ArrayUtil(); + int[] array = {1,6,8,8,8,8,8,8,8,8,8,}; + System.out.println(au.join(array,"-")); + } +} diff --git a/group15/1510_739253131/src/com/bruce/homework0305/mystruts/LoginAction.java b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/LoginAction.java new file mode 100644 index 0000000000..4b509b2102 --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.bruce.homework0305.mystruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group15/1510_739253131/src/com/bruce/homework0305/mystruts/Struts.java b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/Struts.java new file mode 100644 index 0000000000..ab54fd0625 --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/Struts.java @@ -0,0 +1,81 @@ +package com.bruce.homework0305.mystruts; + +import com.sun.deploy.util.StringUtils; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.junit.Test; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) throws DocumentException, + ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { + + /* + 0. 读取配置文件struts.xml + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + SAXReader reader = new SAXReader(); + Document document = reader.read(new File("src/com/bruce/homework0305/mystruts/struts.xml")); + Element root = document.getRootElement(); + Iterator actions = root.elementIterator("action"); + HashMap map = new HashMap<>(); + View view = new View(); + while(actions.hasNext()){ + Element next = actions.next(); + List attributes = next.attributes(); + Attribute action_name = next.attribute("name"); + if(actionName.equals(action_name.getValue())){ + //找到name="login"的action,拿到其class路径 + Attribute aClass = next.attribute("class"); + //通过反射拿到LoginAction类 + Class clazz = Class.forName(aClass.getValue()); + LoginAction login = (LoginAction) clazz.newInstance(); + //从parameters中拿到所有的key,通过这些key拿到对应的值,并且传入LoginAction对应的setter方法 + Set keys = parameters.keySet();parameters.entrySet(); + for(String key : keys){ + //首字母大写,拿到setter方法,并将parameters中对应该key的value拿出来,反射传入相应方法 + String setter = "set"+ key.substring(0,1).toUpperCase()+key.substring(1,key.length()); + Method method = clazz.getMethod(setter,String.class); + method.invoke(login,parameters.get(key)); + } + //反射拿到execute方法,并拿到执行结果 + Method execute = clazz.getMethod("execute"); + String result = (String) execute.invoke(login); + //反射拿到getMessage方法,结果以map格式保存,并保存在view对象中 + Method getMessage = clazz.getMethod("getMessage"); + String message = (String)getMessage.invoke(login); + map.put("message",message); + view.setParameters(map); + //根据execute方法的执行结果,找到相关result的jsp路径,将该路径保存在view对象中 + Iterator results = next.elementIterator("result"); + while(results.hasNext()){ + Element element = results.next(); + if(result.equals(element.attribute("name").getValue())){ + view.setJsp(element.getText()); + break; + } + } + } + } + return view; + } +} diff --git a/group15/1510_739253131/src/com/bruce/homework0305/mystruts/StrutsTest.java b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/StrutsTest.java new file mode 100644 index 0000000000..e54809e4b6 --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/StrutsTest.java @@ -0,0 +1,61 @@ +package com.bruce.homework0305.mystruts; + +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + try { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + @Test + public void testLoginActionFailed() { + try { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + View view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } +} diff --git a/group15/1510_739253131/src/com/bruce/homework0305/mystruts/View.java b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/View.java new file mode 100644 index 0000000000..47abd77a37 --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/View.java @@ -0,0 +1,23 @@ +package com.bruce.homework0305.mystruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group15/1510_739253131/src/com/bruce/homework0305/mystruts/struts.xml b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/struts.xml new file mode 100644 index 0000000000..41c7be3d2f --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/homework0305/mystruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/1510_739253131/src/com/bruce/utils/MyException.java b/group15/1510_739253131/src/com/bruce/utils/MyException.java new file mode 100644 index 0000000000..2e2fa7833e --- /dev/null +++ b/group15/1510_739253131/src/com/bruce/utils/MyException.java @@ -0,0 +1,29 @@ +package com.bruce.utils; + +/** + * Created by Bruce.Jiao on 15-6-23. + */ +public class MyException extends Exception{ + private int code; + private String message; + + public MyException() { + } + + public MyException(String message) { + this.message = message; + } + + public MyException(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/struts.xml b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/1511_714512544/src/com/coderising/array/ArrayUtil.java b/group15/1511_714512544/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..cd48c18e32 --- /dev/null +++ b/group15/1511_714512544/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,183 @@ +package com.coderising.array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int len = origin.length; + int temp = 0; + for (int i = 0; i < len/2; i++) { + temp = origin[i]; + origin[i] = origin[len -1 -i]; + origin[len -1 -i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int[] temp = new int[oldArray.length]; + int index = 0; + for (int i : oldArray) { + if(i != 0){ + temp[index++] = i; + } + } + if(index == 0){ + return new int[]{}; + } + return Arrays.copyOf(temp, index); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int[] array3 = new int[array1.length+array2.length]; + for (int i = 0; i < array1.length; i++) { + array3[i] = array1[i]; + } + int index = array1.length; + for (int i = 0; i < array2.length; i++) { + boolean flag = true; //a2元素不在a3中 + for (int j = 0; j < index; j++) { + if(array3[j] == array2[i]){ + flag = false; + } + } + if(flag){ //a2元素不在a3中 + array3[index++] = array2[i]; + } + } + int[] temp = Arrays.copyOf(array3, index); + Arrays.sort(temp); + return temp; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return Arrays.copyOf(oldArray, oldArray.length+size); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if(max == 1) return new int[]{}; //max=1,返回空数组 + int[] arr = new int[max+1]; + arr[0] = 1; + arr[1] = 1; + + int sum = 2; + for (int i = 2; i < arr.length; i++) { + arr[i] = arr[i-1] + arr[i-2]; + if(arr[i] >= max){ + break; + } + sum ++; + } + return Arrays.copyOf(arr, sum); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if(max<=2) return new int[]{}; + + int[] temp = new int[max]; + int index = 0; + for (int i = 2; i < max; i++) { + boolean flag = true; + for (int j = 2; j <= Math.sqrt(i); j++) { + if(i % j == 0){ + flag = false; + } + } + if(flag){temp[index++] = i;} + } + return Arrays.copyOf(temp, index); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + if(max <= 2) return new int[]{}; + + int[] temp = new int[max]; + int index = 0; + for (int i = 2; i < max; i++) { + int sum = 0; + for (int j = 1; j <= Math.sqrt(i); j++) { + if(j == 1) { + sum += 1; + }else{ + if(i % j == 0){ + sum += j + i/j; + } + } + } + if(sum == i) temp[index++] = i; + } + return Arrays.copyOf(temp, index); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator){ + if(array.length == 0){ + return ""; + } + StringBuilder sb = new StringBuilder(); + for (int i : array) { + sb.append(i).append(seperator); + } + String temp = sb.toString(); + return temp.substring(0,temp.length()-1); + } + + +} \ No newline at end of file diff --git a/group15/1511_714512544/src/com/coderising/array/ArrayUtilTest.java b/group15/1511_714512544/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..939c5c7ac6 --- /dev/null +++ b/group15/1511_714512544/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,76 @@ +package com.coderising.array; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + +import static org.junit.Assert.*; + +/** + * ArrayList测试 + */ +public class ArrayUtilTest { + private ArrayUtil util = null; + + @Before + public void setUp() throws Exception { + util = new ArrayUtil(); + } + + @After + public void tearDown() throws Exception { + util = null; + } + + @Test + public void reverseArray() throws Exception { + int[] arr = new int[]{7, 9, 30, 3, 4}; + util.reverseArray(arr); + assertArrayEquals(new int[]{4,3, 30 , 9,7}, arr); + } + + @Test + public void removeZero() throws Exception { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] newArr = util.removeZero(oldArr); + assertArrayEquals(new int[]{1,3,4,5,6,6,5,4,7,6,7,5}, newArr); + } + + @Test + public void merge() throws Exception { + int[] a1 = {3, 5, 7,8}; + int[] a2 = {4, 5, 6,7}; + assertArrayEquals(new int[]{3,4,5,6,7,8}, util.merge(a1, a2)); + } + + @Test + public void grow() throws Exception { + int[] oldArray = {2,3,6}; + int[] newArr = util.grow(oldArray, 3); + assertArrayEquals(new int[]{2,3,6,0,0,0}, newArr); + } + + @Test + public void fibonacci() throws Exception { + assertArrayEquals(new int[]{1,1,2,3,5,8,13}, util.fibonacci(15) ); + } + + @Test + public void getPrimes() throws Exception { + assertArrayEquals(new int[]{2,3,5,7,11,13,17,19}, util.getPrimes(23)); + } + + @Test + public void getPerfectNumbers() throws Exception { + assertArrayEquals(new int[]{6} , util.getPerfectNumbers(7)); + } + + @Test + public void join() throws Exception { + int[] array= {3,8,9}; + assertEquals("3-8-9" ,util.join(array, "-")); + } + +} \ No newline at end of file diff --git a/group15/1511_714512544/src/com/coderising/litestruts/LoginAction.java b/group15/1511_714512544/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group15/1511_714512544/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group15/1511_714512544/src/com/coderising/litestruts/Struts.java b/group15/1511_714512544/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..8822339c00 --- /dev/null +++ b/group15/1511_714512544/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,113 @@ +package com.coderising.litestruts; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + /* + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 根据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + + try { + //0读取配置文件struts.xml + SAXReader reader = new SAXReader(); + Document doc = reader.read(new File("src/com/coderising/litestruts/struts.xml")); + Element root = doc.getRootElement(); //根元素 + Map action = new HashMap<>(); + Map loginResult = new HashMap<>(); + Map logoutResult = new HashMap<>(); + java.util.Iterator iterator = root.elementIterator("action"); + while(iterator.hasNext()){ + Element actionNode = (Element) iterator.next(); + String key = actionNode.attributeValue("name"); + String value = actionNode.attributeValue("class"); + action.put(key,value); + java.util.Iterator it = actionNode.elementIterator("result"); + while(it.hasNext()){ + Element resultNode = (Element) it.next(); + String k = resultNode.attributeValue("name"); + String v = resultNode.getText(); + if(key.equals("login")){ + loginResult.put(k,v); + }else { + logoutResult.put(k,v); + } + } + } + + //1 + String className = action.get(actionName); //获取类名 + Object o = Class.forName(className).newInstance(); //创建对象 + if(o instanceof LoginAction){ + LoginAction loginAction = (LoginAction) o; + Set> set = parameters.entrySet(); + for (Map.Entry en : set) { + if(en.getKey().equals("name")){ + loginAction.setName(en.getValue()); + }else if(en.getKey().equals("password")){ + loginAction.setPassword(en.getValue()); + } + } + + //2 + Class clazz = (Class) loginAction.getClass(); + Method m = clazz.getDeclaredMethod("execute",null); + m.setAccessible(true); + String message = (String) m.invoke(loginAction,null); + + //3 + View view = new View(); + Map params = new HashMap(); + Method[] ms = clazz.getDeclaredMethods(); + for (Method method : ms) { + method.setAccessible(true); + if(method.getName().equals("getName")){ + String value = (String) method.invoke(loginAction,null); + params.put("name",value); + }else if(method.getName().equals("getPassword")){ + String value = (String) method.invoke(loginAction,null); + params.put("password",value); + }else if(method.getName().equals("getMessage")){ + String value = (String) method.invoke(loginAction,null); + params.put("message",value); + } + } + view.setParameters(params); + + //4 + String jsp = loginResult.get(message); + view.setJsp(jsp); + + return view; + }else { + return null; + } + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } + +} diff --git a/group15/1511_714512544/src/com/coderising/litestruts/StrutsTest.java b/group15/1511_714512544/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..d28d29c0e2 --- /dev/null +++ b/group15/1511_714512544/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,38 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group15/1511_714512544/src/com/coderising/litestruts/View.java b/group15/1511_714512544/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group15/1511_714512544/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group15/1511_714512544/src/com/coderising/litestruts/struts.xml b/group15/1511_714512544/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group15/1511_714512544/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/1511_714512544/src/com/coding/basic/ArrayList.java b/group15/1511_714512544/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..27911198d2 --- /dev/null +++ b/group15/1511_714512544/src/com/coding/basic/ArrayList.java @@ -0,0 +1,66 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +public class ArrayList implements List { + private int size = 0; //表内现有元素个数 + private Object[] elementData = new Object[2]; //数据结构--数组 + + public void add(Object o){ //在后面追加 + if(size == elementData.length) elementData = grow(elementData, 2* elementData.length); //先扩容 + elementData[size++] = o; + } + + public void add(int index, Object o){ //在指定位置插入 + if(size == elementData.length) elementData = grow(elementData, 2* elementData.length); //先扩容 + if(index > size || index < 0) throw new ArrayIndexOutOfBoundsException(); //保证最后一个元素后面也可以插 + System.arraycopy(elementData,index, elementData,index+1,size-index); + elementData[index] = o; + size ++; + } + + public Object get(int index){ //返回指定索引的元素 + if(index > size - 1 || index < 0) throw new ArrayIndexOutOfBoundsException(); + return elementData[index]; + } + + public Object remove(int index){ //删除指定索引处的元素 + if(index > size - 1 || index < 0) throw new ArrayIndexOutOfBoundsException(); + Object o = elementData[index]; + System.arraycopy(elementData,index+1, elementData,index,size-index-1); + elementData[size-1] = null; + size --; + return o; + } + + public int size(){ //number of elements + return size; + } + + public Iterator iterator(){ //迭代器 + return new ListIterator(); + } + + private class ListIterator implements Iterator{ //实例内部类 + private int i = 0; + + @Override + public boolean hasNext() { + return i < size; + } + + @Override + public Object next() { + if(size() == 0) throw new NoSuchElementException("Stack Underflow"); + return elementData[i++]; + } + } + + //数组扩容 + private Object[] grow(Object[] src, int newLength){ + assert src.length < newLength; //断言 + return Arrays.copyOf(src,newLength); + } + +} diff --git a/group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java b/group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java new file mode 100644 index 0000000000..7f30ecd124 --- /dev/null +++ b/group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java @@ -0,0 +1,318 @@ +package com.coding.basic; + +import edu.princeton.cs.algs4.BinarySearch; + +import java.util.Stack; + +/** + 二叉树 + 5 + / \ + 2 7 + / \ /\ +1 4 6 8 + + 1.前序遍历: 5 2 1 4 7 6 8 + 2.中序遍历: 1 2 4 5 6 7 8 + 3.后序遍历: 1 4 2 6 8 7 5 + */ +public class BinarySearchTree> { + private BinarySearchTreeNode root; //root node + + public BinarySearchTreeNode getRoot() { + return root; + } + + public void setRoot(BinarySearchTreeNode root) { + this.root = root; + } + + /** + * 二叉树插入节点 + * @param data 节点元素 + * @return 插入的节点 + */ + public BinarySearchTreeNode insert(T data){ + if(root == null){ + root = new BinarySearchTreeNode(data); + return root; + } + //root非空 + BinarySearchTreeNode current = root; + while(true){ + //当前节点的数据小于data + if(current.getData().compareTo(data) >= 0){ + if(current.getLeft() != null){ + current = current.getLeft(); + }else { + BinarySearchTreeNode child = new BinarySearchTreeNode(data); + current.setLeft(child); + child.setParent(current); + return child; + } + }else {//当前节点数据大于root + if(current.getRight() != null){ + current = current.getRight(); + }else { + BinarySearchTreeNode child = new BinarySearchTreeNode(data); + current.setRight(child ); + child.setParent(current); + return child; + } + } + } + } + + /** + * 查找元素data + * @param data 要查找的元素 + * @return 返回true找到、false未找到 + */ + public boolean contains(T data){ + if(root == null){ + return false; + } + BinarySearchTreeNode current = root; + while(true){ + if(current.getData().compareTo(data) > 0){ + if(current.getLeft() != null){ + current = current.getLeft(); + }else{ + return false; + } + }else if(current.getData().compareTo(data) < 0){ + if(current.getRight() != null){ + current = current.getRight(); + }else { + return false; + } + }else { + return true; + } + } + } + + /** + * 前序遍历递归实现 根节点 左子树 右子树 + * @param n 根节点 + */ + public void preOrder(BinarySearchTreeNode n){ + System.out.print(n.getData()+" "); + if(n.getLeft() != null){ + preOrder(n.getLeft()); + } + if(n.getRight() != null){ + preOrder(n.getRight()); + } + } + + /** + * 中序遍历递归实现 左子树 根节点 右子树 + * @param n 根节点 + */ + public void midOrder(BinarySearchTreeNode n){ + if(n.getLeft() != null){ + midOrder(n.getLeft()); + } + System.out.print(n.getData()+" "); + if(n.getRight() != null){ + midOrder(n.getRight()); + } + } + + /** + * 后序遍历递归实现 左子树 右子树 根节点 + * @param n 根节点 + */ + public void postOrder(BinarySearchTreeNode n){ + if(n.getLeft() != null){ + postOrder(n.getLeft()); + } + if(n.getRight() != null){ + postOrder(n.getRight()); + } + System.out.print(n.getData()+" "); + } + + /** + * 非递归实现前序遍历 + */ + public void preOrderWithoutRecursion(){ + if(root == null){ //根节点为空 + return; + } + + Stack> stack = new Stack<>(); //存放未执行完的节点 + stack.push(root); //首先push根节点 + BinarySearchTreeNode current = null; + + while(!stack.isEmpty()){ //栈内还有节点 + current = stack.peek(); //得到栈顶节点 + if(current.getState() == 0){ + System.out.print(current.getData() + " "); //打印数据 + current.setState(1); + }else if(current.getState() == 1){ + if(current.getLeft() != null){ + stack.push(current.getLeft()); + } + current.setState(2); //确认是否有左子树 + }else if(current.getState() == 2){ + if(current.getRight() != null){ + stack.push(current.getRight()); + } + current.setState(3); //确认是否有右子树 + }else if(current.getState() == 3){ + stack.pop(); //删除栈顶节点(该节点已经执行完所有程序) + current.setState(0); + } + } + } + + /** + * 非递归实现中序遍历 + */ + public void midOrderWithoutRecursion(){ + if(root == null){ //根节点为空 + return; + } + + Stack> stack = new Stack<>(); //存放未执行完的节点 + stack.push(root); //首先push根节点 + BinarySearchTreeNode current = null; + + while(!stack.isEmpty()){ //栈内还有节点 + current = stack.peek(); //得到栈顶节点 + if(current.getState() == 0){ + if(current.getLeft() != null){ + stack.push(current.getLeft()); //确认是否有左子树 + } + current.setState(1); + }else if(current.getState() == 1){ + System.out.print(current.getData() + " "); //打印数据 + current.setState(2); + }else if(current.getState() == 2){ + if(current.getRight() != null){ + stack.push(current.getRight()); + } + current.setState(3); //确认是否有右子树 + }else if(current.getState() == 3){ + stack.pop(); //删除栈顶节点 + current.setState(0); + } + } + } + + /** + * 非递归实现后序遍历 + */ + public void postOrderWithoutRecursion(){ + if(root == null){ //根节点为空 + return; + } + + Stack> stack = new Stack<>(); //存放未执行完的节点 + stack.push(root); //首先push根节点 + BinarySearchTreeNode current = null; + + while(!stack.isEmpty()){ //栈内还有节点 + current = stack.peek(); //得到栈顶节点 + if(current.getState() == 0){ + if(current.getLeft() != null){ + stack.push(current.getLeft()); + } + current.setState(1); + }else if(current.getState() == 1){ + if(current.getRight() != null){ + stack.push(current.getRight()); + } + current.setState(2); //确认是否有左子树 + }else if(current.getState() == 2){ + System.out.print(current.getData() + " "); //打印数据 + current.setState(3); //确认是否有右子树 + }else if(current.getState() == 3){ + stack.pop(); //删除栈顶节点 + current.setState(0); + } + } + } + + //删除某个节点n + public void delete(BinarySearchTreeNode n){ + BinarySearchTreeNode p = n.getParent(); //节点的父节点 + BinarySearchTreeNode child; //节点的子节点 + + //该节点没有任何子节点。// 叶子结点,直接删除即可。要考虑待删除结点是root的情况。 + if(n.getLeft()==null && n.getRight()==null){ + //该节点是根节点 + if(n == root){ + root = null; + return ; + } + //非根节点 + if(n == p.getLeft()){ + p.setLeft(null); + }else if(n == p.getRight()){ + p.setRight(null); + } + } + + // 内部结点,把它的后继的值拷进来,然后递归删除它的后继。 + else if(n.getLeft()!=null && n.getRight()!=null){ + BinarySearchTreeNode next = successor(n); //找到n的中序后继节点 + n.setData(next.getData()); + delete(next); //中序后继节点 + } + + //只有一个孩子的结点,把它的孩子交给它的父结点即可 + else { + if(n.getLeft() != null){ //得到子节点 + child = n.getLeft(); + }else { + child = n.getRight(); + } + + if(n == root){ // n是根节点的情况 + child.setParent(null); + root = child; + return; + } + //非根节点 + if(n == p.getLeft()){ + p.setLeft(child); + child.setParent(p); + }else{ + p.setRight(child); + child.setParent(p); + } + + } + } + + //找到n的中序后继节点 + public BinarySearchTreeNode successor(BinarySearchTreeNode n){ + if( n == null) return null; + if( n.getRight() == null ) return null; + return findMin(n.getRight()); + } + + //查找n树的最小值 + public BinarySearchTreeNode findMin(BinarySearchTreeNode n){ + BinarySearchTreeNode current = n; + while(current.getLeft() != null){ + current = current.getLeft(); + } + return current; + } + + //查找n树的最大值 + public BinarySearchTreeNode findMax(BinarySearchTreeNode n){ + BinarySearchTreeNode current = n; + while(current.getRight() != null){ + current = current.getRight(); + } + return current; + } + + + +} diff --git a/group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java b/group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java new file mode 100644 index 0000000000..323a040832 --- /dev/null +++ b/group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java @@ -0,0 +1,58 @@ +package com.coding.basic; + +/** + * 二叉树BST结点 + */ +public class BinarySearchTreeNode{ + private T data; + private BinarySearchTreeNode parent; //父节点 + private BinarySearchTreeNode left; + private BinarySearchTreeNode right; + private int state; //递归状态(非递归遍历表示一个节点运行到的状态) + + public BinarySearchTreeNode(T data) { + this.data = data; + this.left = null; + this.right = null; + this.parent = null; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public BinarySearchTreeNode getLeft() { + return left; + } + + public void setLeft(BinarySearchTreeNode left) { + this.left = left; + } + + public BinarySearchTreeNode getRight() { + return right; + } + + public void setRight(BinarySearchTreeNode right) { + this.right = right; + } + + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } + public BinarySearchTreeNode getParent() { + return parent; + } + + public void setParent(BinarySearchTreeNode parent) { + this.parent = parent; + } +} diff --git a/group15/1511_714512544/src/com/coding/basic/Iterator.java b/group15/1511_714512544/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..b8c8e0ce6a --- /dev/null +++ b/group15/1511_714512544/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + boolean hasNext(); + Object next(); +} diff --git a/group15/1511_714512544/src/com/coding/basic/LinkedList.java b/group15/1511_714512544/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..e806c0e6a2 --- /dev/null +++ b/group15/1511_714512544/src/com/coding/basic/LinkedList.java @@ -0,0 +1,157 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + private Node head; //首节点 + private int size; //节点个数 + + public void add(Object o){ //在链表尾部添加node + if(head == null){ + head = new Node(o, null); + }else { + Node last = head; + while(last.next != null){ + last = last.next; + } + last.next = new Node(o, null); + } + size ++; + } + + public void add(int index , Object o){ //在指定索引处插入node + if(index > size || index < 0) throw new RuntimeException("IndexOutOfBounds"); + if(head == null){ + head = new Node(o, null); + }else { + if(index == 0){ //插入位置在头部 + head = new Node(o, head); + }else { //后面位置插入 + Node temp = head; + int i = 0; + while(i != index - 1){ + temp = temp.next; + i ++; + } + Node tempNext = temp.next; + temp.next = new Node(o, tempNext); + } + } + size ++; + } + + public Object get(int index){ //取出指定节点处的元素,从0开始 + if(index > size -1 || index < 0) throw new RuntimeException("IndexOutOfBounds"); + int i = 0; + Node temp = head; + while(i != index){ + i ++; + temp = temp.next; + } + return temp.data; + } + + public Object remove(int index){ //删除指定索引处的节点 + if(index > size -1 || index < 0) throw new RuntimeException("IndexOutOfBounds"); + if(index == 0) { //第一个元素或只有一个元素 + Object o = head.data; + head = head.next; + size --; + return o; + }else { //其他元素 + int i = 0; + Node temp = head; //被删除节点之前的节点 + while(i != index - 1){ + i ++; + temp = temp.next; + } + Node delete = temp.next; //被删除的节点 + Object o = delete.data; + temp.next = delete.next; //删除 + size --; + return o; + } + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ //在表头添加节点 + head = new Node(o, head); + size ++; + } + + public void addLast(Object o){ //在链表尾部添加节点 + if(head == null){ + head = new Node(o,null); + size ++; + return; + } + Node last = head; + while(last.next != null){ + last = last.next; + } + last.next = new Node(o, null); + size ++; + } + + public Object removeFirst(){ //在链表头部删除节点 + if(size() == 0) throw new RuntimeException("Underflow"); + Object o = head.data; + head = head.next; + size --; + return o; + } + + public Object removeLast(){ //在链表尾部删除节点 + if(size() == 0) throw new RuntimeException("Underflow"); + if(size() == 1){ + Object o = head.data; + head = null; + size --; + return o; + } + Node temp = head; + int i = 0; + while(i != size-2){ + temp = temp.next; + i ++; + } + Object o = temp.next.data; + temp.next = null; + size --; + return o; + } + + public Iterator iterator(){ //迭代器 + return new ListIterator(); + } + + private class ListIterator implements Iterator{ //实例内部类 + private Node current = head; + + @Override + public boolean hasNext() { + return current != null; + } + + @Override + public Object next() { + if(size() == 0) throw new NoSuchElementException("Underflow"); + Object o = current.data; + current = current.next; + return o; + } + } + + //这里内部类须为static,在类级别上一一对应,非实例级别 + private static class Node{ + Object data; + Node next; + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } +} diff --git a/group15/1511_714512544/src/com/coding/basic/List.java b/group15/1511_714512544/src/com/coding/basic/List.java new file mode 100644 index 0000000000..4cc4f6fe5b --- /dev/null +++ b/group15/1511_714512544/src/com/coding/basic/List.java @@ -0,0 +1,16 @@ +package com.coding.basic; + +/** + * List可以随机访问,不需要遍历 + */ +public interface List { + void add(Object o); + + void add(int index, Object o); + + Object get(int index); + + Object remove(int index); + + int size(); +} diff --git a/group15/1511_714512544/src/com/coding/basic/Queue.java b/group15/1511_714512544/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..00a69823b5 --- /dev/null +++ b/group15/1511_714512544/src/com/coding/basic/Queue.java @@ -0,0 +1,37 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +/** + * 队列,先进先出 + */ +public class Queue { + private LinkedList list = new LinkedList(); //链表数据结构 + + //入队 + public void enQueue(Object o){ + list.addLast(o); + } + + //出队 + public Object deQueue(){ + if(list.size() == 0) throw new NoSuchElementException("队列无元素"); + return list.removeFirst(); + } + + //是否为空 + public boolean isEmpty(){ + return list.size() == 0; + } + + //队列内元素 + public int size(){ + return list.size(); + } + + //迭代器 + public Iterator iterator(){ + return list.iterator(); + } + +} diff --git a/group15/1511_714512544/src/com/coding/basic/Stack.java b/group15/1511_714512544/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..d54b896356 --- /dev/null +++ b/group15/1511_714512544/src/com/coding/basic/Stack.java @@ -0,0 +1,35 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; +//LIFO +public class Stack { + private ArrayList elementData = new ArrayList(); //使用刚实现的ArrayList + + //入栈 + public void push(Object o){ + elementData.add(o); + } + + //出栈 + public Object pop(){ + if(elementData.size() == 0) throw new NoSuchElementException("Stack Underflow"); + return elementData.remove(elementData.size()-1); + } + + //栈顶元素 + public Object peek(){ + if(elementData.size() == 0) throw new NoSuchElementException("Stack Underflow"); + return elementData.get(elementData.size()-1); + } + + //是否为空 + public boolean isEmpty(){ + return elementData.size() == 0; + } + + //栈内元素个数 + public int size(){ + return elementData.size(); + } + +} diff --git a/group15/1511_714512544/src/test/com/coding/basic/ArrayListTest.java b/group15/1511_714512544/src/test/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..8e6cc5a64d --- /dev/null +++ b/group15/1511_714512544/src/test/com/coding/basic/ArrayListTest.java @@ -0,0 +1,74 @@ +package test.com.coding.basic; + +import com.coding.basic.ArrayList; +import com.coding.basic.Iterator; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * ArrayList Test + */ +public class ArrayListTest { + @Test + public void add() throws Exception { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(3); + assertEquals(3, list.size()); + } + + @Test + public void addByIndex() throws Exception { + ArrayList list = new ArrayList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + assertEquals(3,list.get(0)); + } + + @Test + public void get() throws Exception { + ArrayList list = new ArrayList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + assertEquals(3,list.get(0)); + } + + @Test + public void remove() throws Exception { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.remove(0); + assertEquals(2, list.get(0)); + } + + @Test + public void size() throws Exception { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + assertEquals(5, list.size()); + } + + @Test + public void iterator() throws Exception { + ArrayList list = new ArrayList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + Iterator iterator = list.iterator(); + while(iterator.hasNext()){ + System.out.print(iterator.next() + " "); + } + } + +} \ No newline at end of file diff --git a/group15/1511_714512544/src/test/com/coding/basic/BinarySearchTreeTest.java b/group15/1511_714512544/src/test/com/coding/basic/BinarySearchTreeTest.java new file mode 100644 index 0000000000..3b7102e5cd --- /dev/null +++ b/group15/1511_714512544/src/test/com/coding/basic/BinarySearchTreeTest.java @@ -0,0 +1,113 @@ +package test.com.coding.basic; + +import static org.junit.Assert.*; + +import com.coding.basic.BinarySearchTree; +import org.junit.Test; + +public class BinarySearchTreeTest { + + @Test + public void testInsert() { + BinarySearchTree bst = new BinarySearchTree(); + bst.insert(5); + bst.insert(2); + bst.insert(7); + bst.insert(1); + bst.insert(6); + bst.insert(4); + bst.insert(8); + } + + @Test + public void testContains() { + BinarySearchTree bst = new BinarySearchTree(); + bst.insert(5); + bst.insert(2); + bst.insert(7); + bst.insert(1); + bst.insert(6); + bst.insert(4); + bst.insert(8); + assertEquals(true,bst.contains(8)); + } + + @Test + public void testPreOrder(){ + BinarySearchTree bst = new BinarySearchTree(); + bst.insert(5); + bst.insert(2); + bst.insert(7); + bst.insert(1); + bst.insert(6); + bst.insert(4); + bst.insert(8); + bst.preOrder(bst.getRoot()); + } + + @Test + public void testPreOrderWithoutRecursion(){ + BinarySearchTree bst = new BinarySearchTree<>(); + bst.insert(5); + bst.insert(2); + bst.insert(7); + bst.insert(1); + bst.insert(6); + bst.insert(4); + bst.insert(8); + bst.preOrderWithoutRecursion(); + } + + @Test + public void testMidOrder(){ + BinarySearchTree bst = new BinarySearchTree(); + bst.insert(5); + bst.insert(2); + bst.insert(7); + bst.insert(1); + bst.insert(6); + bst.insert(4); + bst.insert(8); + bst.midOrder(bst.getRoot()); + } + + @Test + public void testMidOrderWithoutRecursion(){ + BinarySearchTree bst = new BinarySearchTree<>(); + bst.insert(5); + bst.insert(2); + bst.insert(7); + bst.insert(1); + bst.insert(6); + bst.insert(4); + bst.insert(8); + bst.midOrderWithoutRecursion(); + } + + @Test + public void testPostOrder(){ + BinarySearchTree bst = new BinarySearchTree(); + bst.insert(5); + bst.insert(2); + bst.insert(7); + bst.insert(1); + bst.insert(6); + bst.insert(4); + bst.insert(8); + bst.postOrder(bst.getRoot()); + } + + @Test + public void testPostOrderWithoutRecursion(){ + BinarySearchTree bst = new BinarySearchTree<>(); + bst.insert(5); + bst.insert(2); + bst.insert(7); + bst.insert(1); + bst.insert(6); + bst.insert(4); + bst.insert(8); + bst.postOrderWithoutRecursion(); + } + +} diff --git a/group15/1511_714512544/src/test/com/coding/basic/LinkedListTest.java b/group15/1511_714512544/src/test/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..e5a2617247 --- /dev/null +++ b/group15/1511_714512544/src/test/com/coding/basic/LinkedListTest.java @@ -0,0 +1,149 @@ +package test.com.coding.basic; + +import com.coding.basic.Iterator; +import com.coding.basic.LinkedList; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * LinkedList Test + */ +public class LinkedListTest { + @Test + public void add() throws Exception { + LinkedList list = new LinkedList(); + list.add(1); + list.add(2); + list.add(3); + assertEquals(3,list.size()); + } + + @Test + public void addByIndex() throws Exception { + LinkedList list = new LinkedList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + Iterator iterator = list.iterator(); + while(iterator.hasNext()){ + System.out.println(iterator.next()); + } + assertEquals(3, list.get(0)); + } + + @Test + public void get() throws Exception { + LinkedList list = new LinkedList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + assertEquals(3,list.get(0)); + } + + @Test + public void remove() throws Exception { + LinkedList list = new LinkedList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + list.add(3,4); + list.add(4,5); + list.remove(0); + System.out.println(list.size()); + Iterator iterator = list.iterator(); + while(iterator.hasNext()){ + System.out.print(iterator.next() + " "); + } + } + + @Test + public void size() throws Exception { + LinkedList list = new LinkedList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + list.add(3,4); + list.add(4,5); + assertEquals(5, list.size()); + } + + @Test + public void addFirst() throws Exception { + LinkedList list = new LinkedList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + list.add(3,4); + list.add(4,5); + list.addFirst(0); + System.out.println(list.size()); + Iterator iterator = list.iterator(); + while(iterator.hasNext()){ + System.out.print(iterator.next() + " "); + } + } + + @Test + public void addLast() throws Exception { + LinkedList list = new LinkedList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + list.add(3,4); + list.add(4,5); + list.addLast(0); + System.out.println(list.size()); + Iterator iterator = list.iterator(); + while(iterator.hasNext()){ + System.out.print(iterator.next() + " "); + } + } + + @Test + public void removeFirst() throws Exception { + LinkedList list = new LinkedList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + list.add(3,4); + list.add(4,5); + list.removeFirst(); + System.out.println(list.size()); + Iterator iterator = list.iterator(); + while(iterator.hasNext()){ + System.out.print(iterator.next() + " "); + } + } + + @Test + public void removeLast() throws Exception { + LinkedList list = new LinkedList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + list.add(3,4); + list.add(4,5); + list.removeLast(); + System.out.println(list.size()); + Iterator iterator = list.iterator(); + while(iterator.hasNext()){ + System.out.print(iterator.next() + " "); + } + } + + @Test + public void iterator() throws Exception { + LinkedList list = new LinkedList(); + list.add(0,1); + list.add(1,2); + list.add(0,3); + list.add(3,4); + list.add(4,5); + Iterator iterator = list.iterator(); + while(iterator.hasNext()){ + System.out.print(iterator.next() + " "); + } + } + +} \ No newline at end of file diff --git a/group15/1511_714512544/src/test/com/coding/basic/QueueTest.java b/group15/1511_714512544/src/test/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..597966d62e --- /dev/null +++ b/group15/1511_714512544/src/test/com/coding/basic/QueueTest.java @@ -0,0 +1,67 @@ +package test.com.coding.basic; + +import com.coding.basic.Iterator; +import com.coding.basic.Queue; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * QueueTest + */ +public class QueueTest { + @Test + public void enQueue() throws Exception { + Queue queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(4); + assertEquals(1, queue.deQueue()); + } + + @Test + public void deQueue() throws Exception { + Queue queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(4); + assertEquals(1, queue.deQueue()); + } + + @Test + public void isEmpty() throws Exception { + Queue queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(4); + assertEquals(false, queue.isEmpty()); + } + + @Test + public void size() throws Exception { + Queue queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(4); + assertEquals(4 , queue.size()); + } + + @Test + public void iterator() throws Exception { + Queue queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(4); + queue.enQueue(4); + Iterator iterator = queue.iterator(); + while(iterator.hasNext()){ + System.out.print(iterator.next() + " "); + } + } + +} \ No newline at end of file diff --git a/group15/1511_714512544/src/test/com/coding/basic/StackTest.java b/group15/1511_714512544/src/test/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..96eabc523d --- /dev/null +++ b/group15/1511_714512544/src/test/com/coding/basic/StackTest.java @@ -0,0 +1,59 @@ +package test.com.coding.basic; + +import com.coding.basic.Stack; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Stack Test + */ +public class StackTest { + @Test + public void push() throws Exception { + Stack stack = new Stack(); + stack.push(1); + assertEquals(1,stack.pop()); + } + + @Test + public void pop() throws Exception { + Stack stack = new Stack(); + stack.push(1); + assertEquals(1,stack.pop()); + } + + @Test + public void peek() throws Exception { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + assertEquals(5,stack.peek()); + } + + @Test + public void isEmpty() throws Exception { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + assertEquals(false,stack.isEmpty()); + } + + @Test + public void size() throws Exception { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + assertEquals(5,stack.size()); + } + +} \ No newline at end of file diff --git "a/group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md" "b/group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md" new file mode 100644 index 0000000000..3a34a9a3fb --- /dev/null +++ "b/group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md" @@ -0,0 +1,3 @@ +(1)介绍CPU,内存,硬盘,指令以及他们之间的关系的文章地址:http://www.jianshu.com/p/f86ca5072c5d + +(2)程序的机器及表示: http://www.jianshu.com/p/1eed6fe682cd diff --git a/group15/1512_656512403/1512_656512403.md b/group15/1512_656512403/1512_656512403.md new file mode 100644 index 0000000000..08b657df23 --- /dev/null +++ b/group15/1512_656512403/1512_656512403.md @@ -0,0 +1 @@ +//这是1512深的文件夹 diff --git a/group15/1512_656512403/src/Iterator.java b/group15/1512_656512403/src/Iterator.java new file mode 100644 index 0000000000..4af68013b5 --- /dev/null +++ b/group15/1512_656512403/src/Iterator.java @@ -0,0 +1,7 @@ +/** + * Created by wangtiegang on 2017/2/25. + */ +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group15/1512_656512403/src/List.java b/group15/1512_656512403/src/List.java new file mode 100644 index 0000000000..c952972cea --- /dev/null +++ b/group15/1512_656512403/src/List.java @@ -0,0 +1,10 @@ +/** + * Created by wangtiegang on 2017/2/25. + */ +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group15/1512_656512403/src/Main.java b/group15/1512_656512403/src/Main.java new file mode 100644 index 0000000000..db9b7162b6 --- /dev/null +++ b/group15/1512_656512403/src/Main.java @@ -0,0 +1,7 @@ +public class Main { + + public static void main(String[] args) { + System.out.println("Hello World!"); + + } +} diff --git a/group15/1512_656512403/src/MyArrayList.java b/group15/1512_656512403/src/MyArrayList.java new file mode 100644 index 0000000000..125cbfe052 --- /dev/null +++ b/group15/1512_656512403/src/MyArrayList.java @@ -0,0 +1,198 @@ +import java.io.Serializable; +import java.util.Collection; + +/** + * Created by wangtiegang on 2017/2/18. + */ +public class MyArrayList implements List,Serializable{ + private int size; + private Object[] elementData; + + //空构造方法,初始容量10 + public MyArrayList(){ + this(10); + } + + //构造指定容量的空列表 + public MyArrayList(int size){ + this.elementData = new Object[size]; + } + + //构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。 + public MyArrayList(Collection collection){ + this.size = collection.size(); + this.elementData = new Object[collection.size()]; + //复制元素到数组中 + } + + //添加值到列表尾 + public void add(Object obj){ + //先判断长度够不够 + this.ensureCapacity(size+1); + //添加到数组 + elementData[size++] = obj; + } + + //添加值到指定位置 + public void add(int index,Object obj){ + this.ensureCapacity(size+1); + //添加元素到指定位置,将所有指定位置开始的值都往后移一位 + for(int i = index;i=0;i--){ + if(obj.equals(elementData[i])){ + return i; + } + } + return -1; + } + + //没有元素则返回true + public boolean isEmpty(){ + return size == 0 ? true : false; + } + + //remove指定位置元素 + public Object remove(int index){ + if(index > size){ + throw new IndexOutOfBoundsException(); + }else { + Object removeObj = elementData[index]; + for(int i=index;i size) || (toIndex < 0 || toIndex > size) ){ + throw new IndexOutOfBoundsException(); + }else{ + if(fromIndex < toIndex){ + for(int i = fromIndex ; i < size ; i++){ + if(toIndex + 1 <= size){ + elementData[i] = elementData[toIndex+1]; + }else{ + elementData[i] = null; + } + } + size = size - (toIndex - fromIndex) - 1; + }else if(fromIndex > toIndex){ + for(int i = toIndex ; i < size ; i++){ + if(fromIndex + 1 <= size){ + elementData[i] = elementData[fromIndex+1]; + }else{ + elementData[i] = null; + } + } + size = size - (fromIndex - toIndex) - 1; + } + } + } + + //替换指定位置元素 + public Object set(int index,Object obj){ + if(index > size || index < 0){ + throw new IndexOutOfBoundsException(); + }else { + Object oldObj = elementData[index]; + elementData[index] = obj; + return oldObj; + } + } + + public Object[] toArray(){ + Object[] arr = new Object[elementData.length]; + for(int i = 0 ; i elementData.length){ + Object[] oldData = elementData; + int newCapacity = (elementData.length*3)/2 + 1; + if(newCapacity < minCapacity){ + newCapacity = minCapacity; + } + Object[] newData = new Object[newCapacity]; + //复制元素到新的数组中 + elementData = this.copyArray(elementData,newCapacity); + } + } + + public Object[] copyArray(Object[] arr,int newCapacity){ + Object[] newArray = new Object[newCapacity]; + + for(int i = 0 ; i < arr.length ; i++){ + newArray[i] = arr[i]; + } + + return newArray; + } + + public int size(){ + return this.size; + } + + public Object get(int index){ + return elementData[index]; + } + +} diff --git a/group15/1512_656512403/src/MyBinaryTreeNode.java b/group15/1512_656512403/src/MyBinaryTreeNode.java new file mode 100644 index 0000000000..186a4c182f --- /dev/null +++ b/group15/1512_656512403/src/MyBinaryTreeNode.java @@ -0,0 +1,27 @@ +/** + * Created by wangtiegang on 2017/2/25. + */ +public class MyBinaryTreeNode { + private Node root; + + private static class Node{ + Object data; + Node right; + Node left; + + public Node(Object obj,Node right,Node left){ + this.data = obj; + this.right = right; + this.left = left; + } + } + + public Object insert(Object o){ + if(root == null){ + root = new Node(o,null,null); + }else{ + + } + return null; + } +} diff --git a/group15/1512_656512403/src/MyLinkedList.java b/group15/1512_656512403/src/MyLinkedList.java new file mode 100644 index 0000000000..30dda78d17 --- /dev/null +++ b/group15/1512_656512403/src/MyLinkedList.java @@ -0,0 +1,119 @@ +/** + * Created by wangtiegang on 2017/2/25. + */ +public class MyLinkedList implements List { + //当前size + private int size; + //第一个节点 + private Node firstNode; + //最后一个节点 + private Node lastNode; + + + //构造存放数据及指针的Node + private static class Node{ + E data; + Node preNode; + Node nextNode; + + public Node(E data,Node preNode,Node nextNode){ + this.data = data; + this.preNode = preNode; + this.nextNode = nextNode; + } + } + + @Override + public void add(Object o) { + + //将最后一个node放到preNode + Node node = new Node(o,lastNode,null); + //将最后一个node的nextNode设置成o + if(lastNode != null){ + lastNode.nextNode = node; + } + + lastNode = node; + + if(firstNode == null){ + firstNode = node; + } + //size增加 + size++; + } + + @Override + public void add(int index, Object o) { + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException(); + } + + if(index == size){ + this.add(o); + }else { + //找到index个 + Node node = firstNode; + for(int i = 0;i= size){ + throw new IndexOutOfBoundsException(); + } + Node node = firstNode; + for(int i = 0;i= size){ + throw new IndexOutOfBoundsException(); + } + + //找到index个 + Node node = firstNode; + for(int i = 0;i + + + + + diff --git a/group15/1513_121469918/HomeWork01/.gitignore b/group15/1513_121469918/HomeWork01/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group15/1513_121469918/HomeWork01/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group15/1513_121469918/HomeWork01/.project b/group15/1513_121469918/HomeWork01/.project new file mode 100644 index 0000000000..2865c24f37 --- /dev/null +++ b/group15/1513_121469918/HomeWork01/.project @@ -0,0 +1,17 @@ + + + HomeWork01 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group15/1513_121469918/HomeWork01/.settings/org.eclipse.core.resources.prefs b/group15/1513_121469918/HomeWork01/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..bcb09d4d64 --- /dev/null +++ b/group15/1513_121469918/HomeWork01/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +encoding//src/coding/ArrayList.java=GBK +encoding//src/coding/BinaryTreeNode.java=GBK +encoding//src/coding/Iterator.java=GBK +encoding//src/coding/LinkedList.java=GBK +encoding//src/coding/List.java=GBK +encoding//src/coding/Queue.java=GBK +encoding//src/coding/Stack.java=GBK diff --git a/group15/1513_121469918/HomeWork01/.settings/org.eclipse.jdt.core.prefs b/group15/1513_121469918/HomeWork01/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group15/1513_121469918/HomeWork01/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group15/1513_121469918/HomeWork01/src/coding/ArrayList.java b/group15/1513_121469918/HomeWork01/src/coding/ArrayList.java new file mode 100644 index 0000000000..f85c800084 --- /dev/null +++ b/group15/1513_121469918/HomeWork01/src/coding/ArrayList.java @@ -0,0 +1,118 @@ +package coding; + +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + int len = size + 1; + // жlistijǷ + if (len > elementData.length) { + // + Object[] newElemDate = new Object[elementData.length + 1]; + // ƾԪص + System.arraycopy(elementData, 0, newElemDate, 0, elementData.length); + elementData = newElemDate; + } + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + // ǷԽ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("index:" + index + "size:" + size); + } + // Ԫصĩβֱӵadd + if (index == size) { + add(o); + } else { + // + Object[] newElemData = new Object[elementData.length + 1]; + // indexǰԪص + System.arraycopy(elementData, 0, newElemData, 0, index); + newElemData[index] = o; + // index ԺԪص + System.arraycopy(elementData, index, newElemData, index + 1, size - index); + + elementData = newElemData; + size++; + } + } + + public Object get(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("index:" + index + "size:" + size); + } + return elementData[index]; + } + + public Object remove(int index) { + if (index >= size) { + throw new IndexOutOfBoundsException("index:" + index + "size:" + size); + } + Object removeElement = elementData[index]; + //һԪصֵҪ + if(index != (size-1)){ + // + Object[] newElemData = new Object[elementData.length]; + // indexǰԪص + System.arraycopy(elementData, 0, newElemData, 0, index); + // index ԺԪص + System.arraycopy(elementData, index+1, newElemData, index, size - index -1); + } + //һԪصֱֵӼlist + size--; + return removeElement; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new MyIterator(this); + } + + private class MyIterator implements Iterator { + private int poi = -1; + private ArrayList array = null; + + private MyIterator(ArrayList array) { + this.array = array; + } + + @Override + public boolean hasNext() { + return (poi + 1) < array.size; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + poi++; + if (poi >= array.size) { + poi--; + throw new IndexOutOfBoundsException(); + } + + return array.get(poi); + } + + @Override + public Object remove() { + // TODO Auto-generated method stub + if (poi < 0) { + throw new NoSuchElementException(); + } + Object val = array.remove(poi); + poi--; + return val; + } + + } +} diff --git a/group15/1513_121469918/HomeWork01/src/coding/BinaryTreeNode.java b/group15/1513_121469918/HomeWork01/src/coding/BinaryTreeNode.java new file mode 100644 index 0000000000..8e40fa1d90 --- /dev/null +++ b/group15/1513_121469918/HomeWork01/src/coding/BinaryTreeNode.java @@ -0,0 +1,53 @@ +package coding; + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + // жϵǰڵԪ + if (data == null) { + setData(o); + } else { + Integer i = (Integer) o; + // ǰڵжҽڵ + if (i.compareTo((Integer) data) == -1) { + if(right == null) + right = new BinaryTreeNode(); + return right.insert(i); + } else if (i.compareTo((Integer) data) == 1) { + if(left == null) + left = new BinaryTreeNode(); + return left.insert(i); + } + return null; + } + return null; + } + +} diff --git a/group15/1513_121469918/HomeWork01/src/coding/Iterator.java b/group15/1513_121469918/HomeWork01/src/coding/Iterator.java new file mode 100644 index 0000000000..26ca2a672a --- /dev/null +++ b/group15/1513_121469918/HomeWork01/src/coding/Iterator.java @@ -0,0 +1,7 @@ +package coding; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + public Object remove(); +} diff --git a/group15/1513_121469918/HomeWork01/src/coding/LinkedList.java b/group15/1513_121469918/HomeWork01/src/coding/LinkedList.java new file mode 100644 index 0000000000..5d15f141f7 --- /dev/null +++ b/group15/1513_121469918/HomeWork01/src/coding/LinkedList.java @@ -0,0 +1,170 @@ +package coding; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + private Node head; + private int size; + + public void add(Object o) { + // жͷǷ + if (head == null) { + head = new Node(o, null); + } else { + Node newNode = head; + while (newNode.next != null) { + newNode = newNode.next; + } + newNode.next = new Node(o, null); + } + size++; + } + + public void add(int index, Object o) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("index:" + index + "size:" + size); + } + Node node = head; + if (index != 0) { + // ǵһֵҵֵǰһڵ + for (int i = 1; i < index; i++) { + node = node.next; + } + Node newNode = new Node(o, node.next); + node.next = newNode; + size++; + } else { + // һֵͽͷڵָ + Node newNode = new Node(o, head); + head = newNode; + size++; + } + } + + public Object get(int index) { + indexCheck(index); + Node node = head; + for (int i = 1; i <= index; i++) { + node = node.next; + } + return node.data; + } + + public Object remove(int index) { + indexCheck(index); + + Node node = head; + Node removeNode; + if (index == 0) { + //ɾһڵͰͷڵָԭĵڶڵ + removeNode = head; + head = head.next; + } else { + //ҵֵǰһڵ + for (int i = 1; i < index; i++) { + node = node.next; + } + removeNode = node.next; + //ǰһڵָ룬ָɾڵָĽڵ + node.next = removeNode.next; + } + size--; + return removeNode.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newNode = new Node(o, head.next); + head.next = newNode; + size++; + } + + public void addLast(Object o) { + add(o); + } + + public Object removeFirst() { + //ûԪؾ쳣 + if (size <= 0) { + throw new IndexOutOfBoundsException("size:" + size); + } + Object val = head.data; + head = head.next; + size--; + return val; + } + + public Object removeLast() { + if (size <= 0) { + throw new IndexOutOfBoundsException("size:" + size); + } + Node node = head; + while (node.next != null) { + node = node.next; + } + Object val = node.data; + node = null; + size--; + return val; + } + + public Iterator iterator() { + return new MyIterator(this); + } + + private class MyIterator implements Iterator{ + private int poi = -1; + private LinkedList list ; + private MyIterator(LinkedList list) { + this.list= list; + } + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return (poi + 1) < list.size; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + poi++; + if (poi >= list.size) { + poi--; + throw new IndexOutOfBoundsException(); + } + + return list.get(poi); + } + + @Override + public Object remove() { + // TODO Auto-generated method stub + if (poi < 0) { + throw new NoSuchElementException(); + } + Object val = list.removeLast(); + poi--; + return val; + } + + } + + private void indexCheck(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("index:" + index + "size:" + size); + } + } + + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } +} diff --git a/group15/1513_121469918/HomeWork01/src/coding/List.java b/group15/1513_121469918/HomeWork01/src/coding/List.java new file mode 100644 index 0000000000..8b85bc5b37 --- /dev/null +++ b/group15/1513_121469918/HomeWork01/src/coding/List.java @@ -0,0 +1,9 @@ +package coding; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group15/1513_121469918/HomeWork01/src/coding/Queue.java b/group15/1513_121469918/HomeWork01/src/coding/Queue.java new file mode 100644 index 0000000000..f4b6faaa8a --- /dev/null +++ b/group15/1513_121469918/HomeWork01/src/coding/Queue.java @@ -0,0 +1,35 @@ +package coding; + +import java.util.NoSuchElementException; + +public class Queue { + private int size; + private LinkedList list = new LinkedList(); + + public void enQueue(Object o){ + list.addLast(o);; + size++; + } + + public Object deQueue(){ + if(size<=0){ + throw new NoSuchElementException(); + } + Object val = list.removeFirst(); + size--; + return val; + } + + public boolean isEmpty(){ + boolean flag = false; + if(size >= 0){ + flag = true; + } + return flag; + } + + public int size(){ + return size; + } + +} diff --git a/group15/1513_121469918/HomeWork01/src/coding/Stack.java b/group15/1513_121469918/HomeWork01/src/coding/Stack.java new file mode 100644 index 0000000000..742a6c4e40 --- /dev/null +++ b/group15/1513_121469918/HomeWork01/src/coding/Stack.java @@ -0,0 +1,41 @@ +package coding; + +import java.util.NoSuchElementException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size; + + public void push(Object o){ + elementData.add(o); + size++; + } + + public Object pop(){ + if(size<=0){ + throw new NoSuchElementException(); + } + int len = size-1; + Object val = elementData.remove(len); + size--; + return val; + } + + public Object peek(){ + if(size<=0){ + throw new NoSuchElementException(); + } + int len = size-1; + return elementData.get(len); + } + public boolean isEmpty(){ + boolean flag = false; + if(size >= 0){ + flag = true; + } + return flag; + } + public int size(){ + return size; + } +} diff --git a/group15/1513_121469918/HomeWork20170305/.classpath b/group15/1513_121469918/HomeWork20170305/.classpath new file mode 100644 index 0000000000..a851141e9a --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/group15/1513_121469918/HomeWork20170305/.project b/group15/1513_121469918/HomeWork20170305/.project new file mode 100644 index 0000000000..0e4fe1fc91 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/.project @@ -0,0 +1,17 @@ + + + HomeWork20170305 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.core.resources.prefs b/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..67f156c482 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +encoding//src/com/coderising/array/ArrayUtil.java=UTF-8 +encoding//src/com/coding/basic/ArrayList.java=GBK +encoding//src/com/coding/basic/BinaryTreeNode.java=GBK +encoding//src/com/coding/basic/Iterator.java=GBK +encoding//src/com/coding/basic/LinkedList.java=GBK +encoding//src/com/coding/basic/List.java=GBK +encoding//src/com/coding/basic/Queue.java=GBK +encoding//src/com/coding/basic/Stack.java=GBK diff --git a/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.jdt.core.prefs b/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group15/1513_121469918/HomeWork20170305/bin/com/coderising/litestruts/struts.xml b/group15/1513_121469918/HomeWork20170305/bin/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..a7cb57e188 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/bin/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/array/ArrayUtil.java b/group15/1513_121469918/HomeWork20170305/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..985ca47709 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,281 @@ +package com.coderising.array; + + +import java.util.Arrays; +import java.util.TreeSet; +import com.coding.basic.ArrayList; +import com.coding.basic.Iterator; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int len = origin.length; + for (int i = 0; i < len / 2; i++) { + int temp = origin[i]; + origin[i] = origin[len - 1 - i]; + origin[len - 1 - i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int count = 0; + + // 创建一个临时数组装没有零的旧数组 + int[] temp = new int[oldArray.length - count]; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) { + // 如果值为0,统计、跳过不加入新数组 + count++; + continue; + } else { + temp[i - count] = oldArray[i]; + } + } + // 定义返回数组的长度 + int len = oldArray.length - count; + int[] resultArray = new int[len]; + System.arraycopy(temp, 0, resultArray, 0, len); + return resultArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { +/* int[] result = array1; + // 去除重复元素 + for (int i = 0; i < array2.length; i++) { + boolean sameVal = false; + for (int j = 0; j < array1.length; j++) { + if (array1[j] == array2[i]) { + sameVal = true; + break; + } + } + if(sameVal == false){ + result = grow(result, 1); + result[result.length-1] = array2[i]; + } + } + //冒泡排序 + for (int i = 0; i < result.length-1; i++) { + for (int j = i+1; j < result.length; j++) { + if(result[i]>result[j]){ + int temp = result[i]; + result[i] = result[j]; + result[j] =temp; + } + } + } + return result; +*/ + int len1=0,len2=0;//arr1长度len1 + ArrayList list = new ArrayList(); + for (int k=0;k < array1.length+array2.length; k++) { + //如果两个数组都还有元素 + if(len1array2[len2]){ + list.add(array2[len2]); + len2++; + }else{ + list.add(array1[len1]); + len1++; + len2++; + } + }else if(len1==array1.length && len2 < array2.length){ + //如果数组1没有元素,并且2有元素 + list.add(array2[len2]); + len2++; + }else if(len2==array2.length && len1 < array1.length){ + //数组2没有元素,并且1有元素 + list.add(array1[len1]); + len1++; + }else{ + break; + } + } + //list转数组 + int[] result = new int[list.size()]; + Iterator it = list.iterator(); + int index = 0; + while(it.hasNext()){ + result[index++] = ((Integer)it.next()).intValue(); + } + return result; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] resultArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, resultArray, 0, oldArray.length); + return resultArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max <= 1) { + return new int[0]; + } else { + int[] temp = new int[max]; + temp[0] = 1; + temp[1] = 1; + // 定义返回数组的长度变量 + int len = 2; + for (int i = 2; i < max; i++) { + int last = temp[i - 1] + temp[i - 2]; + if (last >= max) { + break; + } else { + temp[i] = last; + len = i + 1; + } + } + return Arrays.copyOf(temp, len); + } + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + + if (max <= 1) { + return new int[0]; + } else { + // 创建临时数组 + int[] temp = new int[max]; + int count = 0; + // 从零开始遍历到max,如果有是素数就加入临时数组。 + for (int i = 0; i < max; i++) { + if (isPrimes(i)) { + temp[i - count] = i; + } else { + count++; + } + } + // max -1 -count是最后一个元素索引 + int len = max - count; + int[] resultArray = Arrays.copyOf(temp, len); + return resultArray; + } + } + + boolean isPrimes(int x) { + if (x <= 1) { + return false; + } else { + for (int i = 2; i < x; i++) { + if (x % i == 0) { + return false; + } + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + if (max < 1) { + return new int[0]; + } else { + ArrayList array = new ArrayList(); + for (int i = 1; i <= max; i++) { + if (isPerfectNumber(i)) { + array.add(i); + } + } + int[] result = new int[array.size()]; + Iterator it = array.iterator(); + int index = 0; + while (it.hasNext()) { + result[index] = ((Integer) it.next()).intValue(); + index++; + } + return result; + } + } + + boolean isPerfectNumber(int x) { + if (x < 1) { + return false; + } else { + int count = 0; + for (int i = 1; i < x; i++) { + if (x % i == 0) { + count += i; + } + } + if (x == count) { + return true; + } + return false; + } + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < array.length; i++) { + if(i == array.length-1){ + sb.append(String.valueOf(array[i])); + break; + } + sb.append(String.valueOf(array[i])+seperator); + } + String result = sb.toString(); + return result; + } + +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/LoginAction.java b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/Struts.java b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..a0dd465d25 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,116 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + + + + //读取配置文件 + try { + Document doc =new SAXReader().read(new File("./src/com/coderising/litestruts/struts.xml")); + //获取XML中的action标签 + Element loginName = (Element)doc.selectSingleNode("//action[1]"); + Element logoutName = (Element)doc.selectSingleNode("//action[2]"); + //判断action的name属性内容 + if(actionName.equals(loginName.attributeValue("name"))){ + //传入的actionName内容为login则进行login操作 + + //获取class路径 + String s = loginName.attributeValue("class"); + Class c = Class.forName(s); + Constructor con = c.getConstructor(); + //实例化LoginAction + LoginAction login =(LoginAction) con.newInstance(); + + //通过parameters获取name,password + String executeName = parameters.get("name"); + String executePassword = parameters.get("password"); + + //获取 setter 方法,并调用 + Method m = c.getMethod("setName", String.class); + m.invoke(login, executeName); + m =c.getMethod("setPassword", String.class); + m.invoke(login, executePassword); + + //调用LoginAction 的exectue 方法 exectueResult值为:帐号密码正确返回success,反之为fail + m = c.getMethod("execute"); + String exectueResult = (String)m.invoke(login); + + //获取 getMessage 方法 + m = c.getMethod("getMessage"); + String message =(String) m.invoke(login); + m = c.getMethod("getName"); + String name =(String) m.invoke(login); + m = c.getMethod("getPassword"); + String password =(String) m.invoke(login); + + //创建HashMap,将登录操作返回的3个变量放到Map + HashMap hm = new HashMap(); + hm.put("message", message); + hm.put("name", name); + hm.put("password", password); + + //创建View对象 + View view = new View(); + view.setParameters(hm); + + //读取struts.xml中的 配置 + List list =(List) doc.selectNodes("//action[@name = 'login']/result"); + for(Element e : list){ + String resultName = e.attributeValue("name"); + //exectue返回值比对XML下result 对应的值返回对应的jsp + if(resultName.equals(exectueResult)){ + //将对应的jsp 放到view对象中 + view.setJsp(e.getText()); + } + } + return view; + + }else if(actionName.equals(logoutName.attributeValue("name"))){ + //actionName是logout则进行logout操作 + } + + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + } + + return null; + } + +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/StrutsTest.java b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/View.java b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/struts.xml b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..a7cb57e188 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/ArrayList.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..951b1ce0e9 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/ArrayList.java @@ -0,0 +1,118 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + int len = size + 1; + // жlistijǷ + if (len > elementData.length) { + // + Object[] newElemDate = new Object[elementData.length + 1]; + // ƾԪص + System.arraycopy(elementData, 0, newElemDate, 0, elementData.length); + elementData = newElemDate; + } + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + // ǷԽ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("index:" + index + "size:" + size); + } + // Ԫصĩβֱӵadd + if (index == size) { + add(o); + } else { + // + Object[] newElemData = new Object[elementData.length + 1]; + // indexǰԪص + System.arraycopy(elementData, 0, newElemData, 0, index); + newElemData[index] = o; + // index ԺԪص + System.arraycopy(elementData, index, newElemData, index + 1, size - index); + + elementData = newElemData; + size++; + } + } + + public Object get(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("index:" + index + "size:" + size); + } + return elementData[index]; + } + + public Object remove(int index) { + if (index >= size) { + throw new IndexOutOfBoundsException("index:" + index + "size:" + size); + } + Object removeElement = elementData[index]; + //һԪصֵҪ + if(index != (size-1)){ + // + Object[] newElemData = new Object[elementData.length]; + // indexǰԪص + System.arraycopy(elementData, 0, newElemData, 0, index); + // index ԺԪص + System.arraycopy(elementData, index+1, newElemData, index, size - index -1); + } + //һԪصֱֵӼlist + size--; + return removeElement; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new MyIterator(this); + } + + private class MyIterator implements Iterator { + private int poi = -1; + private ArrayList array = null; + + private MyIterator(ArrayList array) { + this.array = array; + } + + @Override + public boolean hasNext() { + return (poi + 1) < array.size; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + poi++; + if (poi >= array.size) { + poi--; + throw new IndexOutOfBoundsException(); + } + + return array.get(poi); + } + + @Override + public Object remove() { + // TODO Auto-generated method stub + if (poi < 0) { + throw new NoSuchElementException(); + } + Object val = array.remove(poi); + poi--; + return val; + } + + } +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/BinaryTreeNode.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..b3a1ee65b6 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,53 @@ +package com.coding.basic; + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + // жϵǰڵԪ + if (data == null) { + setData(o); + } else { + Integer i = (Integer) o; + // ǰڵжҽڵ + if (i.compareTo((Integer) data) == -1) { + if(right == null) + right = new BinaryTreeNode(); + return right.insert(i); + } else if (i.compareTo((Integer) data) == 1) { + if(left == null) + left = new BinaryTreeNode(); + return left.insert(i); + } + return null; + } + return null; + } + +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Iterator.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..f5cf74673d --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + public Object remove(); +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/LinkedList.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..d8f759fdcb --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/LinkedList.java @@ -0,0 +1,170 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + private Node head; + private int size; + + public void add(Object o) { + // жͷǷ + if (head == null) { + head = new Node(o, null); + } else { + Node newNode = head; + while (newNode.next != null) { + newNode = newNode.next; + } + newNode.next = new Node(o, null); + } + size++; + } + + public void add(int index, Object o) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("index:" + index + "size:" + size); + } + Node node = head; + if (index != 0) { + // ǵһֵҵֵǰһڵ + for (int i = 1; i < index; i++) { + node = node.next; + } + Node newNode = new Node(o, node.next); + node.next = newNode; + size++; + } else { + // һֵͽͷڵָ + Node newNode = new Node(o, head); + head = newNode; + size++; + } + } + + public Object get(int index) { + indexCheck(index); + Node node = head; + for (int i = 1; i <= index; i++) { + node = node.next; + } + return node.data; + } + + public Object remove(int index) { + indexCheck(index); + + Node node = head; + Node removeNode; + if (index == 0) { + //ɾһڵͰͷڵָԭĵڶڵ + removeNode = head; + head = head.next; + } else { + //ҵֵǰһڵ + for (int i = 1; i < index; i++) { + node = node.next; + } + removeNode = node.next; + //ǰһڵָ룬ָɾڵָĽڵ + node.next = removeNode.next; + } + size--; + return removeNode.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newNode = new Node(o, head.next); + head.next = newNode; + size++; + } + + public void addLast(Object o) { + add(o); + } + + public Object removeFirst() { + //ûԪؾ쳣 + if (size <= 0) { + throw new IndexOutOfBoundsException("size:" + size); + } + Object val = head.data; + head = head.next; + size--; + return val; + } + + public Object removeLast() { + if (size <= 0) { + throw new IndexOutOfBoundsException("size:" + size); + } + Node node = head; + while (node.next != null) { + node = node.next; + } + Object val = node.data; + node = null; + size--; + return val; + } + + public Iterator iterator() { + return new MyIterator(this); + } + + private class MyIterator implements Iterator{ + private int poi = -1; + private LinkedList list ; + private MyIterator(LinkedList list) { + this.list= list; + } + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return (poi + 1) < list.size; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + poi++; + if (poi >= list.size) { + poi--; + throw new IndexOutOfBoundsException(); + } + + return list.get(poi); + } + + @Override + public Object remove() { + // TODO Auto-generated method stub + if (poi < 0) { + throw new NoSuchElementException(); + } + Object val = list.removeLast(); + poi--; + return val; + } + + } + + private void indexCheck(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("index:" + index + "size:" + size); + } + } + + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/List.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Queue.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..ea25224bd2 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Queue.java @@ -0,0 +1,35 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class Queue { + private int size; + private LinkedList list = new LinkedList(); + + public void enQueue(Object o){ + list.addLast(o);; + size++; + } + + public Object deQueue(){ + if(size<=0){ + throw new NoSuchElementException(); + } + Object val = list.removeFirst(); + size--; + return val; + } + + public boolean isEmpty(){ + boolean flag = false; + if(size >= 0){ + flag = true; + } + return flag; + } + + public int size(){ + return size; + } + +} diff --git a/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Stack.java b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..9a28ee4d36 --- /dev/null +++ b/group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Stack.java @@ -0,0 +1,41 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size; + + public void push(Object o){ + elementData.add(o); + size++; + } + + public Object pop(){ + if(size<=0){ + throw new NoSuchElementException(); + } + int len = size-1; + Object val = elementData.remove(len); + size--; + return val; + } + + public Object peek(){ + if(size<=0){ + throw new NoSuchElementException(); + } + int len = size-1; + return elementData.get(len); + } + public boolean isEmpty(){ + boolean flag = false; + if(size >= 0){ + flag = true; + } + return flag; + } + public int size(){ + return size; + } +} diff --git a/group15/1514_616019420/.classpath b/group15/1514_616019420/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group15/1514_616019420/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group15/1514_616019420/.gitignore b/group15/1514_616019420/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group15/1514_616019420/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group15/1514_616019420/.project b/group15/1514_616019420/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group15/1514_616019420/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group15/1514_616019420/src/com/coderising/array/ArrayUtil.java b/group15/1514_616019420/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..d636e46186 --- /dev/null +++ b/group15/1514_616019420/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,205 @@ +package com.coderising.array; + +import java.lang.reflect.Array; +import java.util.*; +import com.coding.basic.ArrayList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public int[] reverseArray(int[] origin) { + + if (origin != null && origin.length > 0) { + int size = origin.length; + int[] intarray = new int[size]; + for (int i = 0; i < size; i++) { + intarray[i] = origin[size - 1 - i]; + } + origin = intarray; + + } else if (origin != null && origin.length == 0) { + + } else { + throw new NullPointerException(); + } + return origin; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + + if (oldArray != null) { + int[] intarry = new int[oldArray.length]; + int x = 0; + int y = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + intarry[y] = oldArray[i]; + y++; + } else { + x++; + } + } + int[] newarray = new int[y]; + System.arraycopy(intarry, 0, newarray, 0, y); + return newarray; + } else { + throw new NullPointerException(); + } + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int count = array2.length; + array2 = grow(array2, array1.length); + System.arraycopy(array1, 0, array2, count, array1.length); + Arrays.sort(array2); + int[] array3 = new int[array2.length]; + array3[0] = array2[0]; + int x = 0; + for (int i = 1; i < array2.length; i++) { + if (array2[i] != array3[x]) { + array3[x + 1] = array2[i]; + x++; + } + } + + int[] array4 = new int[x + 1]; + System.arraycopy(array3, 0, array4, 0, x + 1); + return array4; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int[] array, int max) { + int[] array0 = new int[array.length]; + int x = 0; + int y = 0; + for (int i = 0; i < array.length; i++) { + if (array[i] < max) { + array0[y] = array[i]; + y++; + } else { + x++; + } + } + int[] array1 = new int[y]; + return Arrays.copyOf(array0, y); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + + + if(max<=2) + {return new int[]{}; + + } + int[] temp = new int[max]; + int index = 0; + for (int i = 2; i < max; i++) { + boolean flag = true; + for (int j = 2; j <= Math.sqrt(i); j++) { + if(i % j == 0){ + flag = false; + } + } + if(flag){temp[index++] = i;} + } + return Arrays.copyOf(temp, index); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + + if(max <= 2) return new int[]{}; + + int[] array = new int[max]; + int index = 0; + for (int i = 2; i < max; i++) { + int x = 0; + for (int j = 1; j <= Math.sqrt(i); j++) { + if(j == 1) { + x += 1; + }else{ + if(i % j == 0){ + x += j + i/j; + } + } + } + if(x == i) array[index++] = i; + } + return Arrays.copyOf(array, index); + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + if(array.length == 0){ + return ""; + } + StringBuilder sb = new StringBuilder(); + for (int i : array) { + sb.append(i).append(seperator); + } + String temp = sb.toString(); + return temp.substring(0,temp.length()-1); + } + +} diff --git a/group15/1514_616019420/src/com/coderising/array/ArrayUtilTest.java b/group15/1514_616019420/src/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..0f244f272a --- /dev/null +++ b/group15/1514_616019420/src/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,110 @@ +package com.coderising.array; + +import static org.junit.Assert.*; + +import java.util.Arrays; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + + private ArrayUtil u; + int[] array; + + @Before + public void setUp() throws Exception { + + u = new ArrayUtil(); + + array = new int[100]; + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testReverseArray() { + fail("Not yet implemented"); + for (int i = 0; i < 100; i++) { + array[i] = i; + + } + array = u.reverseArray(array); + System.out.println("testReverseArray:" + Arrays.toString(array)); + + } + + @Test + public void testRemoveZero() { + fail("Not yet implemented"); + for (int i = 0; i < 100; i++) { + if (i < 50) { + array[i] = 0; + } else { + array[i] = i; + } + } + array = u.removeZero(array); + System.out.println("testRemoveZero:" + Arrays.toString(array)); + } + + @Test + public void testMerge() { + //fail("Not yet implemented"); + int[] intarray={0,1,2,3,4,5,6,7}; + int[] intarray0={10,11,12,13,14,15,16,17,0,3}; + int[] intarray1=u.merge(intarray, intarray0); + System.out.println("testMerge:" + Arrays.toString(intarray1)); + + } + + @Test + public void testGrow() { + //fail("Not yet implemented"); + int[] intarray={0,1,2,3,4,5,6,7}; + int[] intarray0={10,11,12,13,14,15,16,17,0,3}; + int[] intarray1=u.grow(intarray, 10); + System.out.println("testGrow:" + Arrays.toString(intarray1)); + + } + + @Test + public void testFibonacci() { + //fail("Not yet implemented"); + int[] intarray={0,1,2,3,4,5,6,7}; + int[] intarray0={10,11,12,13,14,15,16,17,0,3}; + int[] intarray1=u.fibonacci(intarray0, 17); + System.out.println("testFibonacci:" + Arrays.toString(intarray1)); + } + + @Test + public void testGetPrimes() { + //fail("Not yet implemented");int[] intarray={0,1,2,3,4,5,6,7}; + int[] intarray0={10,11,12,13,14,15,16,17,0,3}; + int[] intarray1=u.getPrimes(10); + System.out.println("testGetPrimes:" + Arrays.toString(intarray1)); + + } + + @Test + public void testGetPerfectNumbers() { + // fail("Not yet implemented"); + int[] intarray0={10,11,12,13,14,15,16,17,0,3}; + int[] intarray1=u.getPerfectNumbers(10); + System.out.println("testGetPerfectNumbers:" + Arrays.toString(intarray1)); + } + + @Test + public void testJoin() { + // fail("Not yet implemented"); + int[] intarray0={10,11,12,13,14,15,16,17,0,3}; + String str=u.join(intarray0, "++"); + System.out.println("testJoin:" + str); + } + +} diff --git a/group15/1514_616019420/src/com/coderising/litestruts/LoginAction.java b/group15/1514_616019420/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group15/1514_616019420/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group15/1514_616019420/src/com/coderising/litestruts/Struts.java b/group15/1514_616019420/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..9081b94e78 --- /dev/null +++ b/group15/1514_616019420/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,113 @@ +package com.coderising.litestruts; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + /* + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 根据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + + try { + //0读取配置文件struts.xml + SAXReader saxReader = new SAXReader(); + Document document = saxReader.read(new File("src/com/coderising/litestruts/struts.xml")); + Element rootElement = document.getRootElement(); //根元素 + Map actionMap = new HashMap<>(); + Map loginResult = new HashMap<>(); + Map logoutResult = new HashMap<>(); + java.util.Iterator iterator = rootElement.elementIterator("action"); + while(iterator.hasNext()){ + Element actionNode = (Element) iterator.next(); + String key = actionNode.attributeValue("name"); + String value = actionNode.attributeValue("class"); + action.put(key,value); + java.util.Iterator it = actionNode.elementIterator("result"); + while(it.hasNext()){ + Element resultNode = (Element) it.next(); + String k = resultNode.attributeValue("name"); + String v = resultNode.getText(); + if(key.equals("login")){ + loginResult.put(k,v); + }else { + logoutResult.put(k,v); + } + } + } + + //1 + String className = actionMap.get(actionName); //获取类名 + Object o = Class.forName(className).newInstance(); //创建对象 + if(o instanceof LoginAction){ + LoginAction loginAction = (LoginAction) o; + Set> set = parameters.entrySet(); + for (Map.Entry en : set) { + if(en.getKey().equals("name")){ + loginAction.setName(en.getValue()); + }else if(en.getKey().equals("password")){ + loginAction.setPassword(en.getValue()); + } + } + + //2 + Class clazz = (Class) loginAction.getClass(); + Method m = clazz.getDeclaredMethod("execute",null); + m.setAccessible(true); + String message = (String) m.invoke(loginAction,null); + + //3 + View view = new View(); + Map params = new HashMap(); + Method[] ms = clazz.getDeclaredMethods(); + for (Method method : ms) { + method.setAccessible(true); + if(method.getName().equals("getName")){ + String value = (String) method.invoke(loginAction,null); + params.put("name",value); + }else if(method.getName().equals("getPassword")){ + String value = (String) method.invoke(loginAction,null); + params.put("password",value); + }else if(method.getName().equals("getMessage")){ + String value = (String) method.invoke(loginAction,null); + params.put("message",value); + } + } + view.setParameters(params); + + //4 + String jsp = loginResult.get(message); + view.setJsp(jsp); + + return view; + }else { + return null; + } + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } + +} diff --git a/group15/1514_616019420/src/com/coderising/litestruts/StrutsTest.java b/group15/1514_616019420/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group15/1514_616019420/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group15/1514_616019420/src/com/coderising/litestruts/View.java b/group15/1514_616019420/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group15/1514_616019420/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group15/1514_616019420/src/com/coderising/litestruts/struts.xml b/group15/1514_616019420/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..dd598a3664 --- /dev/null +++ b/group15/1514_616019420/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/1514_616019420/src/com/coding/basic/ArrayList.java b/group15/1514_616019420/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..e4f5d255c5 --- /dev/null +++ b/group15/1514_616019420/src/com/coding/basic/ArrayList.java @@ -0,0 +1,79 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + for (int i = size; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + + elementData[index] = o; + + } + + public Object get(int index) { + return elementData[index]; + } + + public Object remove(int index) { + Object oj = elementData[index]; + for (int i = index; i < size; i++) { + elementData[i] = elementData[i + 1]; + } + elementData[size--] = null; + return oj; + } + + public int size() { + + return size; + } + + public Iterator iterator() { + return new MyIterator(); + } + + public class MyIterator implements Iterator { + + int i = 0; + + @Override + public boolean hasNext() { + while (elementData[i] != null) { + return true; + } + return false; + } + + @Override + public Object next() { + return elementData[i++]; + } + } + + + public static void main(String[] args) { + ArrayList a = new ArrayList(); + a.add(1); + a.add(2); + a.add(3); + + MyIterator b = (MyIterator) a.iterator(); + + while(b.hasNext()){ + System.out.println(b.next()); + } + } + + + +} diff --git a/group15/1514_616019420/src/com/coding/basic/BinaryTreeNode.java b/group15/1514_616019420/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..763f79c06c --- /dev/null +++ b/group15/1514_616019420/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,46 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + BinaryTreeNode node = new BinaryTreeNode(); + if (left == null && right != null) { + right = node; + } else if (right == null & left != null) { + left = node; + } else { + return null; + } + return node; + } + +} diff --git a/group15/1514_616019420/src/com/coding/basic/Iterator.java b/group15/1514_616019420/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group15/1514_616019420/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group15/1514_616019420/src/com/coding/basic/LinkedList.java b/group15/1514_616019420/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..0e3bed357f --- /dev/null +++ b/group15/1514_616019420/src/com/coding/basic/LinkedList.java @@ -0,0 +1,136 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size; + + public void add(Object o) { + Node n = new Node(); + n.data = o; + if (head != null) { + n.next = head; + size++; + } else { + size = 1; + } + head = n; + } + + public void add(int index, Object o) { + + Node n1 = head; + Node n2 = new Node(); + for (int i = size - 1; i >= index; i--) { + if (i == index) { + n2.next = n1.next; + n2.data = 0; + n1.next = n2; + } else { + n1 = n1.next; + } + + } + + size++; + } + + public Object get(int index) { + Node n1 = head; + Object o = null; + for (int i = size - 1; i >= index; i--) { + n1 = n1.next; + if (i == index) { + o = n1.data; + } + + } + + return o; + } + + public Object remove(int index) { + Node n1 = head; + Node n2 = new Node(); + Node n3 = new Node(); + Object o = null; + for (int i = size - 1; i >= index; i--) { + if (i == index + 1) { + n2 = n1.next; + } else if (i == index) { + n3 = n2.next; + o = n3.data; + n1 = n3.next; + } else { + n1 = n1.next; + } + + } + n2.next = n1; + size--; + return o; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node n=new Node(); + Node n1=head; + + for(int i=size-1;i>=0;i--) + { + n1=n1.next; + if(i==0){ + n=n1.next; + n.data=o; + } + + } + } + + public void addLast(Object o) { + Node n=new Node(); + n.data=o; + n.next=head; + head=n; + + } + + public Object removeFirst() { + Object o= new Object(); + Node n1=head; + + for(int i=size-1;i>=0;i--) + { + n1=n1.next; + if(i==1){ + o=n1.next.data; + n1.next=null; + } + + } + return o; + } + + public Object removeLast() { + Object o= new Object(); + Node n=head; + head=n.next; + o=n.data; + n.next=null; + return o; + } + + public Iterator iterator() { + + return null; + } + + private static class Node { + Object data; + Node next; + + } +} diff --git a/group15/1514_616019420/src/com/coding/basic/List.java b/group15/1514_616019420/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group15/1514_616019420/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group15/1514_616019420/src/com/coding/basic/Queue.java b/group15/1514_616019420/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..9f55b2a4fa --- /dev/null +++ b/group15/1514_616019420/src/com/coding/basic/Queue.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList list =new LinkedList(); + + public void enQueue(Object o){ + + list.addFirst(o); + } + + public Object deQueue(){ + return list.removeLast(); + } + + public boolean isEmpty(){ + return list.size()==0; + } + + public int size(){ + return list.size(); + } +} diff --git a/group15/1514_616019420/src/com/coding/basic/Stack.java b/group15/1514_616019420/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..88589d98c7 --- /dev/null +++ b/group15/1514_616019420/src/com/coding/basic/Stack.java @@ -0,0 +1,24 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + + return elementData.remove(elementData.size()-1); + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size()==0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group15/1514_616019420/src/com/coding/basic/readme.txt b/group15/1514_616019420/src/com/coding/basic/readme.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group15/1515_337959725/.classpath b/group15/1515_337959725/.classpath new file mode 100644 index 0000000000..28e2b79383 --- /dev/null +++ b/group15/1515_337959725/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group15/1515_337959725/.gitignore b/group15/1515_337959725/.gitignore new file mode 100644 index 0000000000..5e56e040ec --- /dev/null +++ b/group15/1515_337959725/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/group15/1515_337959725/.project b/group15/1515_337959725/.project new file mode 100644 index 0000000000..62dd270833 --- /dev/null +++ b/group15/1515_337959725/.project @@ -0,0 +1,17 @@ + + + coding0305 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group15/1515_337959725/.settings/org.eclipse.jdt.core.prefs b/group15/1515_337959725/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..416f4fb696 --- /dev/null +++ b/group15/1515_337959725/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/group15/1515_337959725/src/com/coderising/array/ArrayUtil.java b/group15/1515_337959725/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..26ca6bcab0 --- /dev/null +++ b/group15/1515_337959725/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,184 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * һa , Ըֵû + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int a; + int length=origin.length; + for(int i=0;iarray2[j]){ + array3[k]=array1[j]; + j++; + k++; + } + } + return array3; + } + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ + * oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray =new int[oldArray.length+size]; + int i; + for(i=0;i parameters) { + + /* + + 0. ȡļstruts.xml + + 1. actionNameҵӦclass LoginAction, ͨʵ + parametersеݣösetter parametersе + ("name"="test" , "password"="1234") , + ǾӦõ setNamesetPassword + + 2. ͨöexectue ÷ֵ"success" + + 3. ͨҵgetter getMessage, + ͨã ֵγһHashMap , {"message": "¼ɹ"} , + ŵViewparameters + + 4. struts.xmlе ,Լexecuteķֵ ȷһjsp + ŵViewjspֶС + + */ + DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); + View view = null; + try { + DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder(); + File f = new File("E:/gitProject/coding2017/group15/1515_337959725/src/com/coderising/litestruts/struts.xml"); + Document document = documentBuilder.parse(f); + NodeList actionList = document.getElementsByTagName("action"); + Node node = null; + String className=""; + for(int i=0;i params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //ԤIJһ + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} + diff --git a/group15/1515_337959725/src/com/coderising/litestruts/View.java b/group15/1515_337959725/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group15/1515_337959725/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group15/1515_337959725/src/com/coderising/litestruts/struts.xml b/group15/1515_337959725/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..6f23f0a83d --- /dev/null +++ b/group15/1515_337959725/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/1515_337959725/src/com/coding/basic/ArrayListTest.java b/group15/1515_337959725/src/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..2e535ae354 --- /dev/null +++ b/group15/1515_337959725/src/com/coding/basic/ArrayListTest.java @@ -0,0 +1,65 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayListTest implements ListTest{ + private Object[] obj; + + public ArrayListTest() { + obj=new Object[0]; + } + + public void add(Object o) { + obj = Arrays.copyOf(obj, obj.length+1); + obj[obj.length-1]=o; + } + + public void add(int index, Object o) { + obj = Arrays.copyOf(obj, obj.length+1); + for(int i=index;inode2.data){ + if(node1.left==null){ + node1.left=node2; + }else{ + compareNode(node1.left,node2); + } + }else{ + if(node1.right==null){ + node1.right=node2; + }else{ + compareNode(node1.right,node2); + } + } + } + +} diff --git a/group15/1515_337959725/src/com/coding/basic/IteratorTest.java b/group15/1515_337959725/src/com/coding/basic/IteratorTest.java new file mode 100644 index 0000000000..e4d061cd56 --- /dev/null +++ b/group15/1515_337959725/src/com/coding/basic/IteratorTest.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface IteratorTest { + public boolean hasNext(); + public Object next(); +} diff --git a/group15/1515_337959725/src/com/coding/basic/LinkedListTest.java b/group15/1515_337959725/src/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..e5fc3db60d --- /dev/null +++ b/group15/1515_337959725/src/com/coding/basic/LinkedListTest.java @@ -0,0 +1,100 @@ +package com.coding.basic; + +public class LinkedListTest implements ListTest { + private Node headNode; + private Node tailNode; + + class Node{ + private Object obj; +// private Node proNode; + private Node nextNode; + + public Node(Object obj) { + this.obj = obj; + } + + + } + + public void add(Object o) { + if(headNode==null){ + headNode=new Node(o); + tailNode=headNode; + }else{ + tailNode.nextNode=new Node(o); + tailNode=tailNode.nextNode; + } + } + + public void add(int index, Object o) { + Node newNode=new Node(o); + Node node=headNode; + for(int i=0;i array2[j]){ + retTmp[k++] = array2[j++]; + }else{ + j++; + sameCount++; + } + } + //insert remainder array + while(i < array1.length){ + retTmp[k++] = array1[i++]; + } + while(j < array2.length){ + retTmp[k++] = array2[j++]; + } + int[] ret = new int[retTmp.length - sameCount]; + if(sameCount > 0){ + System.arraycopy(retTmp, 0, ret, 0, retTmp.length - sameCount); + } + return ret; + } + + /** + * 4把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + for(int i=0; i0; i--){ + //get divide numbers + MyArrayList divideNumArrayList = new MyArrayList(10); + for(int j=1; j parameters) { + View view = new View(); + /* + * 0. 读取配置文件struts.xml + * */ + SAXReader reader = new SAXReader(); + try { + Document document = reader.read(new File("src/com/coderising/litestruts/struts.xml")); + Element root = document.getRootElement(); + Iterator iter = root.elementIterator(); + while(iter.hasNext()){ + Element secondNode = (Element) iter.next(); + String nameStr = secondNode.attributeValue("name"); + String classStr = secondNode.attributeValue("class"); + + /* + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + */ + if(nameStr.equals(actionName)){ + Class cls = Class.forName(classStr); + Object obj = cls.newInstance(); + Method mtd1 = cls.getDeclaredMethod("setName", String.class); + mtd1.invoke(obj, parameters.get("name")); + + Method mtd2 = cls.getDeclaredMethod("setPassword", new Class[]{String.class}); + mtd2.invoke(obj, parameters.get("password")); + + /* + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * */ + Method execute = cls.getDeclaredMethod("execute"); + String runStatus = (String) execute.invoke(obj); + + /* + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + */ + Method mtd3 = cls.getDeclaredMethod("getMessage"); + String getMes = (String) mtd3.invoke(obj); + Map params = new HashMap(); + params.put("message",getMes); + + /* + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + Iterator iterSecond = secondNode.elementIterator(); + while(iterSecond.hasNext()){ + Element thirdNode = (Element) iterSecond.next(); + String resultNameStr = thirdNode.attributeValue("name"); + String pageStr = thirdNode.getText(); + + if(runStatus.equals(resultNameStr)){ + view.setJsp(pageStr); + view.setParameters(params); + break; + } + } + } + } + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return view; + } +} diff --git a/group15/1517_279137987/src/com/coderising/litestruts/StrutsTest.java b/group15/1517_279137987/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..9f20bbfd59 --- /dev/null +++ b/group15/1517_279137987/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group15/1517_279137987/src/com/coderising/litestruts/View.java b/group15/1517_279137987/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group15/1517_279137987/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group15/1517_279137987/src/com/coderising/litestruts/struts.xml b/group15/1517_279137987/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..ea46090bc9 --- /dev/null +++ b/group15/1517_279137987/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/1517_279137987/src/my/collection/linear/MyArrayList.java b/group15/1517_279137987/src/my/collection/linear/MyArrayList.java new file mode 100644 index 0000000000..d84b583dcb --- /dev/null +++ b/group15/1517_279137987/src/my/collection/linear/MyArrayList.java @@ -0,0 +1,104 @@ +package my.collection.linear; + +import java.util.Arrays; + +public class MyArrayList implements MyList{ + + private int size = 0; + private int CAPACITY = 10; + private Object[] elementData = new Object[CAPACITY]; + + public MyArrayList(int len){ + this.elementData = new Object[len]; + } + + public void add(Object obj){ + add(size,obj); + } + + public void add(int index, Object obj){ + if(index < 0){ + System.out.println("insert position illegal."); + }else{ + if(size + 1 < elementData.length){ + System.arraycopy(elementData, 0, this.elementData, 0, index); + System.arraycopy(elementData, index, this.elementData, index+1, elementData.length-index-1); + this.elementData[index] = obj; + }else{ + Object[] newElementData = Arrays.copyOf(elementData, elementData.length + CAPACITY); + System.arraycopy(elementData, index, newElementData, index+1, elementData.length - index); + newElementData[index] = obj; + this.elementData = newElementData; + } + size++; + } + } + + public Object remove(int index){ + if(index == 0){ + System.arraycopy(elementData, 1, this.elementData, 0, elementData.length-1); + }else{ + System.arraycopy(elementData, 0, this.elementData, 0, index); + System.arraycopy(elementData, index + 1, this.elementData, index, elementData.length-index-1); + } + size--; + return elementData[index]; + } + + public Object get(int index){ + if(index < 0 || index > elementData.length-1){ + return "get position illegal."; + }else{ + return elementData[index]; + } + } + + public int size(){ + return size; + } + + public String toString(){ + String str ="toString():"; + for(int i=0; i size){ + return false; + }else{ + return true; + } + } + + public Object next() { + return get(pos); + } + + public Object remove(){ //? + return MyArrayList.this.remove(this.pos); + } + + } +} diff --git a/group15/1517_279137987/src/my/collection/linear/MyBinaryTreeNode.java b/group15/1517_279137987/src/my/collection/linear/MyBinaryTreeNode.java new file mode 100644 index 0000000000..8b52c6f838 --- /dev/null +++ b/group15/1517_279137987/src/my/collection/linear/MyBinaryTreeNode.java @@ -0,0 +1,83 @@ +package my.collection.linear; + +public class MyBinaryTreeNode implements Comparable{ + + private Object data; + private MyBinaryTreeNode left; + private MyBinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public MyBinaryTreeNode getLeft() { + return left; + } + public void setLeft(MyBinaryTreeNode left) { + this.left = left; + } + public MyBinaryTreeNode getRight() { + return right; + } + public void setRight(MyBinaryTreeNode right) { + this.right = right; + } + + public MyBinaryTreeNode insert(Object o){ + //cast to MyBinaryTreeNode + MyBinaryTreeNode newNode = new MyBinaryTreeNode(); + newNode.setData(o); + newNode.setLeft(null); + newNode.setRight(null); + + //insert to current node + if(data == null){ + this.setData(o); + this.setLeft(null); + this.setRight(null); + }else{ + //insert to left child + if(compareTo(o) == -1){ + if(this.getLeft() == null){ + this.setLeft(newNode); + }else{ + this.data = this.getLeft().data; + this.setLeft(this.getLeft().getLeft()); + this.setRight(this.getRight().getRight()); + insert(o); + } + //insert to right child + }else if(compareTo(o) == 1){ + if(this.getRight() == null){ + this.setRight(newNode); + }else{ + this.data = this.getLeft().data; + this.setLeft(this.getLeft().getLeft()); + this.setRight(this.getRight().getRight()); + insert(o); + } + //can't insert node which has same data. + }else{ + + } + } + return newNode; + } + + public int compareTo(Object o) { + int compareFlag = 0; + if(o instanceof Integer){ + if(Integer.valueOf(o.toString()) < Integer.valueOf(data.toString())){ + compareFlag = -1; + }else if(Integer.valueOf(o.toString()) > Integer.valueOf(data.toString())){ + compareFlag = 1; + }else{ + compareFlag = 0; + } + } + return compareFlag; + } + +} diff --git a/group15/1517_279137987/src/my/collection/linear/MyIterator.java b/group15/1517_279137987/src/my/collection/linear/MyIterator.java new file mode 100644 index 0000000000..5eb9528fd7 --- /dev/null +++ b/group15/1517_279137987/src/my/collection/linear/MyIterator.java @@ -0,0 +1,8 @@ +package my.collection.linear; + +public interface MyIterator { + + public boolean hasNext(); //if has next element + + public Object next(); //get next element +} diff --git a/group15/1517_279137987/src/my/collection/linear/MyLinkedList.java b/group15/1517_279137987/src/my/collection/linear/MyLinkedList.java new file mode 100644 index 0000000000..d72ec475a6 --- /dev/null +++ b/group15/1517_279137987/src/my/collection/linear/MyLinkedList.java @@ -0,0 +1,95 @@ +package my.collection.linear; + +public class MyLinkedList implements MyList { + + private Node head; + + private int size = 0; + + public void add(Object obj) { + add(this.size, obj); + } + + public void add(int index, Object obj) { + Node curNode = head; + Node addNode = new Node(obj); + if(index == 0){ + addNode.next = head; + head = addNode; + }else{ + for(int i=0; i0){ + for(int i=0;i=array1.length&&b=array2.length&&am)list.add(n); + } + int[] arr = new int[list.size()]; + for(int i=0;i + + + + + diff --git a/group15/1519_137845093/.gitignore b/group15/1519_137845093/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group15/1519_137845093/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group15/1519_137845093/.project b/group15/1519_137845093/.project new file mode 100644 index 0000000000..7371704aff --- /dev/null +++ b/group15/1519_137845093/.project @@ -0,0 +1,17 @@ + + + helloworld + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group15/1519_137845093/3.5_homework/array/ArrayUtil.java b/group15/1519_137845093/3.5_homework/array/ArrayUtil.java new file mode 100644 index 0000000000..e8660ed7ce --- /dev/null +++ b/group15/1519_137845093/3.5_homework/array/ArrayUtil.java @@ -0,0 +1,210 @@ +package com.coderising.array; +import java.util.*; +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if(origin.length > 0 && origin != null){ + int temp; + for (int i = 0; i < origin.length / 2; i++) { + temp = origin[i]; + origin[i] = origin[origin.length-1 - i]; + origin[origin.length-1 - i] = temp; + } + } + else { + throw new IndexOutOfBoundsException("原数组有错" ); + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + if(oldArray.length == 0){ + return oldArray; + } + int index = 0; + for(int i =0; i< oldArray.length; i++){ + if(oldArray[index] != 0){ + oldArray[index] = oldArray[i]; + index++; + } + } + return Arrays.copyOf(oldArray, index); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int length1 = array1.length; + int length2 = array2.length; + int newArrayLength = length1 + length2; + int[] result = new int[newArrayLength]; + int i = 0, j = 0, k = 0; //i:用于标示1数组 j:用来标示2数组 k:用来标示传入的数组 + + while (i < length1 && j < length2) { + /* 去重复元素 */ + if (array1[i] < array2[j]) { + result[k++] = array1[i++]; + } else if (array1[i] == array2[j]) { + result[k++] = array1[i]; + //在某个位置上2个值相等的话,取哪个都一样, + // 然后这个相等的位置的2个值都直接向后移动1,继续比较 + j++; + i++; + } else { + result[k++] = array2[j++]; + } + } + /* 后面while循环是用来保证两个数组比较完之后剩下的一个数组里的元素能顺利传入结果数组 */ + while (i < length1) { + result[k++] = array1[i++]; + } + + while (j < length2) { + result[k++] = array2[j++]; + } + return Arrays.copyOf(result, k); + } + + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArr = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArr, 0, oldArray.length); + return newArr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int[] array = new int[]{}; + for(int i=1; getfb(i) k) { + if (i % k == 0) + break; + k++; + } + //扩容 + prime = grow(prime, 1); + prime[j++] = i; + } + return prime; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int[] array = new int[0]; + int j = 0; + for (int i = 1; i < max; i++) { + if (isPerfect(i)) { + //加入到数组中 + array = grow(array, 1); + array[j] = i; + j++; + } + } + return array; + } + + //判断一个数是否是“完数” + private static boolean isPerfect(int max) { + int i = 1; + int n = 0; + while (i < max) { + if (max % i == 0) { + n += i; + } + i++; + } + if (n == max) + return true; + return false; + } + + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + if (array == null) + return null; + String s = ""; + for (int i = 0; i < array.length; i++) { + s += array[i]; + if (i != array.length - 1) + s += seperator; + } + return s; + } + +} + + diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/ArrayList.java b/group15/1519_137845093/src_1st_homework_1519_137845093/ArrayList.java new file mode 100644 index 0000000000..e0ef246f9b --- /dev/null +++ b/group15/1519_137845093/src_1st_homework_1519_137845093/ArrayList.java @@ -0,0 +1,117 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class ArrayList implements List { + //Ԫظ + private int size = 0; + //ʼΪ10 + private Object[] elementData = new Object[10]; + + public void add(Object o) { + int len = size + 1; + // жlistijǷ鳤 + if (len > elementData.length) { + // + Object[] newElemData = new Object[elementData.length + 1]; + // ƾԪص + System.arraycopy(elementData, 0, newElemData, 0, elementData.length); + elementData = newElemData; + } + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + // ±ǷԽ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("index:" + index + "Խ磻" ); + } + // Ԫصĩβֱӵadd + if (index == size) { + add(o); + } else { + // + Object[] newElemData = new Object[elementData.length + 1]; + // indexǰԪص + System.arraycopy(elementData, 0, newElemData, 0, index); + newElemData[index] = o; + // index ԺԪص + System.arraycopy(elementData, index, newElemData, index + 1, size - index); + + elementData = newElemData; + size++; + } + } + + public Object get(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("index:" + index + "Խ磻"); + } + return elementData[index]; + } + + public Object remove(int index) { + //±鳤ȵģ׳쳣 + if (index >= size) { + throw new IndexOutOfBoundsException("index:" + index + "Խ磻"); + } + //indexһԪصֵҪɾ + if(index != (size-1)){ + // + Object[] newElemData = new Object[elementData.length]; + // indexǰԪص + System.arraycopy(elementData, 0, newElemData, 0, index); + // index ԺԪص + System.arraycopy(elementData, index+1, newElemData, index, size - index -1); + } + Object removeElement = elementData[index]; + //Сij + size--; + return removeElement; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new MyItr(this); + } + + private class MyItr implements Iterator { + private int l = -1; + private ArrayList array = null; + + private MyItr(ArrayList array) { + this.array = array; + } + + @Override + public boolean hasNext() { + return (l + 1) < array.size; + } + + @Override + public Object next() { + l++; + if (l >= array.size) { + l = array.size - 1 ; + throw new IndexOutOfBoundsException(); + } + + return array.get(l); + } + + @Override + public Object remove() { + if (l < 0) { + throw new NoSuchElementException(); + } + Object val = array.remove(l); + l--; + return val; + } + + } +} \ No newline at end of file diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/BinaryTreeNode.java b/group15/1519_137845093/src_1st_homework_1519_137845093/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group15/1519_137845093/src_1st_homework_1519_137845093/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/Iterator.java b/group15/1519_137845093/src_1st_homework_1519_137845093/Iterator.java new file mode 100644 index 0000000000..2d4150183f --- /dev/null +++ b/group15/1519_137845093/src_1st_homework_1519_137845093/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + public Object remove(); + +} diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/LinkedList.java b/group15/1519_137845093/src_1st_homework_1519_137845093/LinkedList.java new file mode 100644 index 0000000000..7f06138ec1 --- /dev/null +++ b/group15/1519_137845093/src_1st_homework_1519_137845093/LinkedList.java @@ -0,0 +1,180 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + private int size; + + public void add(Object o){ + //жûͷ + if(head == null) + head = new Node(o,null); + else { + Node newNode = head; + while(newNode.next != null){ + newNode = newNode.next; + } + newNode.next = new Node(o,null); + + } + + } + public void add(int index , Object o){ + //±ǷԽ + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("index:" + index + "Խ磻"); + } + Node node = head; + //ǵһͷ + if(index == 0){ + Node newNode = new Node(o,head); + head = newNode; + size ++; + } + else{ + for(int i = 1; i < index; i++){ + node = node.next; + } + //indexoҽonextڵΪnode.next + Node newNode = new Node(o, node.next); + node.next = newNode; + size++; + } +} + + public Object get(int index){ + //±ǷԽ + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("index:" + index + "Խ磻"); + } + Node node = head; + for (int i = 1; i <= index; i++) { + node = node.next; + } + return node.data; + } + + public Object remove(int index){ + //±ǷԽ + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("index:" + index + "Խ磻"); + } + Node node = head; + Node removeNode; + if (index == 0) { + //һڵֱӽͷڵָһڵ + removeNode = head; + head = head.next; + } + else { + //ҵֵǰһڵ + for (int i = 1; i < index; i++) { + node = node.next; + } + removeNode = node.next; + //ǰһڵָ룬ָɾڵָĽڵ + node.next = removeNode.next; + } + size--; + return removeNode.data; + } + + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node newNode = new Node(o, head.next); + head.next = newNode; + size++; + } + + public void addLast(Object o){ + add(o); + } + + public Object removeFirst(){ + if(size <= 0){ + throw new IndexOutOfBoundsException("ûԪأ"); + } + Node node = head; + head = head.next; + size--; + return node.data; + } + + public Object removeLast(){ + if(size <= 0){ + throw new IndexOutOfBoundsException("ûԪأ"); + } + Node node = head; + while(node.next != null){ + node = node.next; + } + Object val = node.data; + node = null; + size--; + return val; + } + private static class Node{ + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + + } + } + + + + + public Iterator iterator(){ + return new Itr(this); + } + + private class Itr implements Iterator{ + private int l = -1; + private LinkedList list; + private Itr(LinkedList linkedList) { + // TODO Auto-generated constructor stub + this.list = list; + + } + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return l < list.size - 1; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + l++; + if (l >= list.size) { + l--; + throw new IndexOutOfBoundsException(); + } + + return list.get(l); + } + + @Override + public Object remove() { + // TODO Auto-generated method stub + if (l < 0) { + throw new NoSuchElementException(); + } + Object val = list.removeLast(); + l--; + return val; + } + + } + + } diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/List.java b/group15/1519_137845093/src_1st_homework_1519_137845093/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group15/1519_137845093/src_1st_homework_1519_137845093/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/Queue.java b/group15/1519_137845093/src_1st_homework_1519_137845093/Queue.java new file mode 100644 index 0000000000..3433125a8b --- /dev/null +++ b/group15/1519_137845093/src_1st_homework_1519_137845093/Queue.java @@ -0,0 +1,29 @@ +package com.coding.basic; +import java.util.NoSuchElementException; + +public class Queue { + private int size; + private LinkedList list = new LinkedList(); + + public void enQueue(Object o){ + list.addLast(o); + size++; + } + + public Object deQueue(){ + if(size<=0){ + throw new NoSuchElementException(); + } + Object deQueue = list.removeLast(); + size--; + return deQueue; + } + + public boolean isEmpty(){ + return (size>=0); + } + + public int size(){ + return size; + } +} diff --git a/group15/1519_137845093/src_1st_homework_1519_137845093/Stack.java b/group15/1519_137845093/src_1st_homework_1519_137845093/Stack.java new file mode 100644 index 0000000000..036baafc73 --- /dev/null +++ b/group15/1519_137845093/src_1st_homework_1519_137845093/Stack.java @@ -0,0 +1,39 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size; + private Object removeElement; + public void push(Object o){ + elementData.add(o); + size++; + } + + public Object pop(){ + if(size<=0){ + throw new NoSuchElementException(); + } + int l = size - 1; + removeElement = elementData.remove(l); + size--; + return removeElement; + } + + public Object peek(){ + if(size<=0){ + throw new NoSuchElementException(); + } + int len = size-1; + return elementData.get(len); + } + + public boolean isEmpty(){ + return (size>=0); + } + + public int size(){ + return size; + } +} diff --git a/group15/1521_653895972/.gitignore b/group15/1521_653895972/.gitignore new file mode 100644 index 0000000000..6c9d8afec3 --- /dev/null +++ b/group15/1521_653895972/.gitignore @@ -0,0 +1,3 @@ +/out +.idea +*.iml \ No newline at end of file diff --git a/group15/1521_653895972/src/com/coding/basic/ArrayList.java b/group15/1521_653895972/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..2b692ab814 --- /dev/null +++ b/group15/1521_653895972/src/com/coding/basic/ArrayList.java @@ -0,0 +1,150 @@ +package com.coding.basic; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +/** + * Created by wanc on 2017/2/21. + * 实现ArrayList + */ +public class ArrayList implements List { + /** + * 实例化空数组 不用每次都new + */ + private static final Object[] Empty_elementData = {}; + /** + * 计数 + */ + private int size = 0; + /** + * 数据存放 + */ + private Object[] elementData = new Object[100]; + + public ArrayList() { + this.elementData = Empty_elementData; + } + + /** + * 检查是否越界 + */ + private void checkLenght(int index) { + if (index - size > 0) + throw new IndexOutOfBoundsException(); + } + + /** + * 增加数组容量 + */ + private void kuorong() { + elementData = Arrays.copyOf(elementData, size + 1); + } + + /** + * 添加数据 + * + * @param o + */ + public void add(Object o) { + //扩容 + kuorong(); + //添加数据 + elementData[size++] = o; + } + + /** + * 在指定索引添加数据 + * + * @param index + * @param o + */ + public void add(int index, Object o) { + //扩容 + kuorong(); + //移动数据 + System.arraycopy(elementData, index, elementData, index + 1, size - index); + //添加数据 + elementData[index] = o; + size++; + } + + /** + * 获取指定索引数据 + * + * @param index + * @return + */ + public Object get(int index) { + //检查是否越界 + checkLenght(index); + return elementData[index]; + } + + /** + * 移除指定索引数据 + * + * @param index + * @return + */ + public Object remove(int index) { + //检查是否越界 + checkLenght(index); + Object element = elementData[index]; + //计算移除该元素后,要前移的个数 + int movesize = size - index - 1; + //移动数据 + System.arraycopy(elementData, index + 1, elementData, index, movesize); + //删除末尾元素 + elementData[--size] = null; + return element; + } + + /** + * 返回数量 + * + * @return + */ + public int size() { + return size; + } + + /** + * 获取迭代器 + * + * @return + */ + public Iterator iterator() { + return new ArrayItr(); + } + + //迭代器实现类部类 + private class ArrayItr implements Iterator { + int cursor;//游标 + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + int i = cursor; + if (i > size) throw new NoSuchElementException(); + Object[] newElementData = ArrayList.this.elementData; + if (i > newElementData.length) throw new IndexOutOfBoundsException(); + cursor = i + 1; + return newElementData[i]; + } + } + + /** + * 重写toString 方便打印 + * + * @return + */ + @Override + public String toString() { + Object[] s = Arrays.copyOf(elementData, size); + return Arrays.toString(s); + } +} diff --git a/group15/1521_653895972/src/com/coding/basic/BasicTest.java b/group15/1521_653895972/src/com/coding/basic/BasicTest.java new file mode 100644 index 0000000000..a181087104 --- /dev/null +++ b/group15/1521_653895972/src/com/coding/basic/BasicTest.java @@ -0,0 +1,184 @@ +package com.coding.basic; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by wanc on 2017/2/21. + */ +public class BasicTest { + + @Test + public void test() { + //测试 + testArrayList(); + testLinkedList(); + testBinaryTreeNode(); + testStack(); + testQueue(); + } + + + public void testQueue(){ + Queue queue = new Queue(); + queue.enQueue("S"); + queue.enQueue("Y"); + queue.enQueue(5); + System.out.println(queue); + System.out.println("queue.size()="+queue.size()); + System.out.println("queue.deQueue()="+queue.deQueue()); + System.out.println(queue); + System.out.println("queue.isEmpty()="+queue.isEmpty()); + System.out.println(queue); + } + public void testStack(){ + Stack stack = new Stack(); + stack.push("S"); + stack.push("Y"); + stack.push(5); + System.out.println("stack.size()="+stack.size()); + System.out.println("stack.peek()="+stack.peek()); + System.out.println(stack); + System.out.println("stack.isEmpty()="+stack.isEmpty()); + stack.pop(); + System.out.println(stack); + } + public void testBinaryTreeNode(){ + System.out.println("-------------------BinaryTreeNode 测试开始-------------------"); + System.out.println("new 一个实例"); + BinaryTreeNode root = new BinaryTreeNode(); + root.insert(5); + root.insert(6); + root.insert(9); + root.insert(3); + root.insert(3); + root.insert(2); + root.insert(10); + System.out.println(root); + System.out.println("-------------------LinkedList 测试结束-------------------"); + } + public void testLinkedList() { + System.out.println("-------------------LinkedList 测试开始-------------------"); + + System.out.println("new 一个实例"); + LinkedList list = new LinkedList(); + + System.out.println("添加元素----A"); + list.add("A"); + Assert.assertEquals(list.get(list.size()-1),"A"); + System.out.println("结果:"+list); + + System.out.println(); + System.out.println("添加元素----B"); + list.add("B"); + Assert.assertEquals(list.get(list.size()-1),"B"); + System.out.println("结果:"+list); + + System.out.println(); + System.out.println("添加元素----3"); + list.add(3); + Assert.assertEquals(list.get(list.size()-1),3); + System.out.println("结果:"+list); + + System.out.println(); + System.out.println("在下标1插入元素----3"); + list.add(1, 3); + Assert.assertEquals(list.get(1),3); + System.out.println("结果:"+list); + + System.out.println(); + System.out.println("在下标3插入元素----6"); + list.add(3, 6); + Assert.assertEquals(list.get(3),6); + System.out.println("结果:"+list); + + System.out.println(); + System.out.println("删除下标0元素"); + list.remove(0); + System.out.println("结果:"+list); + + System.out.println(); + System.out.println("获取size"); + System.out.println("结果:"+list.size()); + + System.out.println(); + System.out.println("在首位前插入F"); + list.addFirst("F"); + Assert.assertEquals(list.get(0),"F"); + System.out.println("结果:"+list); + + System.out.println(); + System.out.println("在末位前插入K"); + list.addLast("K"); + Assert.assertEquals(list.get(list.size()-1),"K"); + System.out.println("结果:"+list); + + System.out.println(); + System.out.println("删除首位"); + list.removeFirst(); + System.out.println("结果:"+list); + + System.out.println(); + System.out.println("删除末尾"); + list.removeLast(); + System.out.println("结果:"+list); + + System.out.println(); + System.out.println("迭代器输出:"); + Iterator i = list.iterator(); + while (i.hasNext()){ + System.out.print(i.next()+" "); + } + System.out.println("-------------------LinkedList 测试结束-------------------"); + } + + /** + * 测试 ArrayList + */ + public void testArrayList() { + System.out.println("-------------------ArrayList 测试开始-------------------"); + + System.out.println("new 一个实例"); + ArrayList list = new ArrayList(); + + System.out.println("添加元素 A"); + list.add("A"); + Assert.assertEquals(list.get(list.size()-1),"A"); + + System.out.println("添加元素 B"); + list.add("B"); + Assert.assertEquals(list.get(list.size()-1),"B"); + + System.out.println("添加元素 3"); + list.add(3); + Assert.assertEquals(list.get(list.size()-1),3); + System.out.println("输出:"+list); + + System.out.println("添加元素 3 到索引 1"); + list.add(1, 3); + Assert.assertEquals(list.get(1),3); + System.out.println("输出:"+list); + + System.out.println("添加元素 6 到索引 3"); + list.add(3, 6); + Assert.assertEquals(list.get(3),6); + System.out.println("输出:"+list); + + System.out.println("移除 索引 4 元素"); + Object rm = list.remove(4); + System.out.println("输出:"+list); + + System.out.println("获取 索引 4 元素"); + Object get = list.get(4); + Assert.assertNotEquals(rm,get); + + System.out.println("输出:"+list); + System.out.println("数量:"+list.size()); + Iterator i = list.iterator(); + System.out.print("迭代器输出:"); + while (i.hasNext()){ + System.out.print(i.next()+" "); + } + System.out.println("-------------------ArrayList 测试结束-------------------"); + } +} diff --git a/group15/1521_653895972/src/com/coding/basic/BinaryTreeNode.java b/group15/1521_653895972/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..34d76db083 --- /dev/null +++ b/group15/1521_653895972/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,105 @@ +package com.coding.basic; + +/** + * 实现二叉树 + * left总比父节点小 + * right总比父节点大 + */ +public class BinaryTreeNode { + private Node root; + private int size = 0; + + /** + * 插入数据 + * @param data + */ + public void insert(int data) { + final Node newNode = new Node(data); + if (root == null) {//根节点为空 直接插入数据到根节点 + root = newNode; + } else { + Node current = root; + while (true) {//循环判断 + Node parent = current; + if (data < current.data) {//比父节点小 就是left + current = current.left; + //直到left节点不存在 + if (current == null) { + //插入数据 + parent.left = newNode; + return; + } + } else {//比父节点大 也就是right + current = current.right; + //直到right节点不存在 + if (current == null) { + //插入数据 + parent.right = newNode; + return; + } + } + } + } + size++; + } + + + /** + * 返回数量 + * @return + */ + public int size() { + return size; + } + + /** + * 重写toString 方便打印 + * + * @return + */ + @Override + public String toString() { + return "["+midTraverse(root)+"]"; + } + + /** + * 节点内部类 用于保存数据 + */ + private static class Node { + int data; + Node left; + Node right; + + Node(int data) { + this.data = data; + this.left = null; + this.right = null; + } + } + + //先序遍历 + private String preTraverse(Node node) { + if (node == null) + return ""; + else + return node.data + preJointComma(preTraverse(node.left)) + preJointComma(preTraverse(node.right)); + } + //中序遍历 + private String midTraverse(Node node) { + if (node == null) + return ""; + else + return midTraverse(node.left)+" "+node.data+" " +midTraverse(node.right); + } + //后序遍历 + private String posTraverse(Node node) { + if (node == null) + return ""; + else + return posTraverse(node.left)+" " +posTraverse(node.right)+" "+node.data; + } + + private String preJointComma(String str) { + return str == "" ? "" : "," + str; + } +} diff --git a/group15/1521_653895972/src/com/coding/basic/Iterator.java b/group15/1521_653895972/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group15/1521_653895972/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group15/1521_653895972/src/com/coding/basic/LinkedList.java b/group15/1521_653895972/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..f1f942590d --- /dev/null +++ b/group15/1521_653895972/src/com/coding/basic/LinkedList.java @@ -0,0 +1,271 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +/** + * Created by wanc on 2017/2/21. + * 实现单向链表集合 + */ +public class LinkedList implements List { + /** + * 首节点 + */ + private Node head; + /** + * 计数 + */ + private int size = 0; + + /** + * 检查是否越界 利用jdk源码的检测方法 + */ + private boolean isElementIndex(int index) { + return index >= 0 && index < size; + } + + /** + * JDK 源码检测方法 + * + * @param index + * @return + */ + private boolean isPositionIndex(int index) { + return index >= 0 && index <= size; + } + + /** + * JDK 源码 错误信息 + * + * @param index + * @return + */ + private String outOfBoundsMsg(int index) { + return "Index: " + index + ", Size: " + size; + } + + /** + * JDK 源码检测方法 + * + * @param index + * @return + */ + private void checkElementIndex(int index) { + if (!isElementIndex(index)) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + /** + * JDK 源码检测方法 + * + * @param index + * @return + */ + private void checkPositionIndex(int index) { + if (!isPositionIndex(index)) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + /** + * 获取对应下标的节点 + */ + Node node(int index) { + Node x = head; + for (int i = 0; i < index; i++) + x = x.next; + return x; + } + + /** + * 在末尾添加数据 + * + * @param o + */ + public void add(Object o) { + + if (head == null) + head = new Node(o, null); + else { + final Node lastNode = node(size - 1); + final Node newNode = new Node(o, null); + lastNode.next = newNode; + } + size++; + } + + /** + * 指定位置添加数据 + * + * @param index + * @param o + */ + public void add(int index, Object o) { + checkPositionIndex(index); + if (size == index) + add(o); + else { + final Node prevNode = node(index - 1); + final Node nextNode = prevNode.next; + final Node newNode = new Node(o, nextNode); + prevNode.next = newNode; + size++; + } + } + + /** + * 获取指定索引数据 + * + * @param index + * @return + */ + public Object get(int index) { + return node(index).data; + } + + /** + * 移除指定索引数据 + * + * @param index + * @return + */ + public Object remove(int index) { + checkElementIndex(index); + final Node prevNode = node(index - 1); + final Node x = prevNode.next; + if (index - 1 < 0) { + prevNode.next = null; + head = x; + } else { + final Node nextNode = x.next; + prevNode.next = nextNode; + x.next = null; + } + size--; + return x.data; + } + + /** + * 返回数量 + * + * @return + */ + public int size() { + return size; + } + + /** + * 在链首添加数据 + * + * @return + */ + public void addFirst(Object o) { + final Node h = head; + final Node newNode = new Node(o, h); + head = newNode; + size++; + } + + /** + * 在链尾添加数据 + * + * @return + */ + public void addLast(Object o) { + add(o); + } + + /** + * 移除链首数据 + * + * @return + */ + public Object removeFirst() { + final Node h = head; + if (h == null) + throw new NoSuchElementException(); + final Node newFirst = h.next; + h.next = null; + head = newFirst; + size--; + return h.data; + } + + /** + * 移除链尾数据 + * + * @return + */ + public Object removeLast() { + final Node prev = node(size - 1 - 1); + final Node l = prev.next; + prev.next = null; + l.next = null; + size--; + return l.data; + } + + /** + * 获取迭代器 + * + * @return + */ + public Iterator iterator() { + return new LinkedItr(); + } + + /** + * 迭代器实现内部类 + * + * @return + */ + private class LinkedItr implements Iterator { + int cursor;//游标 + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + int i = cursor; + if (i > size - 1) throw new NoSuchElementException(); + Node current = node(i); + if (current == null) throw new IndexOutOfBoundsException(); + cursor = i + 1; + return current.data; + } + } + + /** + * 节点内部类 用于保存数据 + */ + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + /** + * 重写toString 方便打印 + * + * @return + */ + @Override + public String toString() { + String result = "["; + for (int i = 0; i < size; i++) { + Node n = node(i); + if (i == 0) + result += n.data; + else + result += "," + n.data; + + } + + return result + "]"; + } +} diff --git a/group15/1521_653895972/src/com/coding/basic/List.java b/group15/1521_653895972/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group15/1521_653895972/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group15/1521_653895972/src/com/coding/basic/Queue.java b/group15/1521_653895972/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..4add2be9a4 --- /dev/null +++ b/group15/1521_653895972/src/com/coding/basic/Queue.java @@ -0,0 +1,60 @@ +package com.coding.basic; + +/** + * Created by wanc on 2017/2/21. + * 利用LinkedList 实现队列 + */ +public class Queue { + /** + * 利用LinkedList 保存数据 + */ + private LinkedList elementData = new LinkedList(); + + /** + * 入队 + * + * @param o + */ + public void enQueue(Object o) { + elementData.add(o); + } + + /** + * 出队 + * + * @return + */ + public Object deQueue() { + return elementData.removeFirst(); + } + + /** + * 是否为空 + * + * @return + */ + public boolean isEmpty() { + return elementData.size() == 0 ? true : false; + } + + /** + * 返回队列长度 + * + * @return + */ + public int size() { + return elementData.size(); + } + + /** + * 重写toString 方便打印 + * + * @return + */ + @Override + public String toString() { + return "Queue{" + + "elementData=" + elementData + + '}'; + } +} diff --git a/group15/1521_653895972/src/com/coding/basic/Stack.java b/group15/1521_653895972/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..23c5ba6a7b --- /dev/null +++ b/group15/1521_653895972/src/com/coding/basic/Stack.java @@ -0,0 +1,64 @@ +package com.coding.basic; +/** + * Created by wanc on 2017/2/21. + * 利用ArrayList 实现栈 + */ +public class Stack { + /** + * 利用ArrayList 保存数据 + */ + private ArrayList elementData = new ArrayList(); + + /** + * 入栈 + * @param o + */ + public void push(Object o) { + elementData.add(o); + } + + /** + * 出栈 + * @return + */ + public Object pop() { + elementData.remove(elementData.size()-1); + return null; + } + + /** + * 返回栈顶数据 + * @return + */ + public Object peek() { + return elementData.get(elementData.size()-1); + } + + /** + * 是否为空 + * @return + */ + public boolean isEmpty() { + return elementData.size()==0?true:false; + } + + /** + * 返回栈长度 + * @return + */ + public int size() { + return elementData.size(); + } + + /** + * 重写toString 方便打印 + * + * @return + */ + @Override + public String toString() { + return "Stack{" + + "elementData=" + elementData + + '}'; + } +} diff --git a/group15/1521_653895972/src/com/coding/coderising/array/ArrayUtilTest.java b/group15/1521_653895972/src/com/coding/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..92c581254b --- /dev/null +++ b/group15/1521_653895972/src/com/coding/coderising/array/ArrayUtilTest.java @@ -0,0 +1,73 @@ +package com.coding.coderising.array; + +import org.junit.Test; + +import java.util.Arrays; + +/** + * Created by wanc on 2017/2/28. + */ +public class ArrayUtilTest { + + @Test + public void testReverseArray() throws Exception { + int[] arr = {7, 9, 30, 3}; + SimpleArrayUtil.reverseArray(arr); + System.out.println(Arrays.toString(arr)); + System.out.println("----------------------置换 end-----------------------------"); + } + + + @Test + public void testRemoveZero() throws Exception { + int oldArr[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + int newArr[] = SimpleArrayUtil.removeZero(oldArr); + System.out.println(Arrays.toString(newArr)); + System.out.println("----------------------去零 end-----------------------------"); + } + + @Test + public void testMerge() throws Exception { + int arr1[] = {3, 5, 7, 8}; + int arr2[] = {4, 5, 6, 7}; + int arr3[] = SimpleArrayUtil.merge(arr1, arr2); + System.out.println(Arrays.toString(arr3)); + System.out.println("----------------------merge end-----------------------------"); + } + + @Test + public void testGrow() throws Exception { + int arr1[] = {3, 5, 7, 8}; + int[] newArr = SimpleArrayUtil.grow(arr1, 3); + System.out.println(Arrays.toString(newArr)); + System.out.println("----------------------扩展 end-----------------------------"); + } + + @Test + public void testFibonacci() throws Exception { + int[] arr = SimpleArrayUtil.fibonacci(15); + System.out.println(Arrays.toString(arr)); + System.out.println("----------------------斐波那契 end-----------------------------"); + } + + @Test + public void testGetPrimes() throws Exception { + int[] arr = SimpleArrayUtil.getPrimes(23); + System.out.println(Arrays.toString(arr)); + System.out.println("----------------------素数 end-----------------------------"); + } + + @Test + public void testGetPerfectNumbers() throws Exception { + int[] newArr = SimpleArrayUtil.getPerfectNumbers(50); + System.out.println(Arrays.toString(newArr)); + System.out.println("----------------------完数 end-----------------------------"); + } + + @Test + public void testJoin() throws Exception { + int arr1[] = {3, 5, 7, 8}; + System.out.println(SimpleArrayUtil.join(arr1, "-")); + System.out.println("----------------------Join end-----------------------------"); + } +} \ No newline at end of file diff --git a/group15/1521_653895972/src/com/coding/coderising/array/SimpleArrayUtil.java b/group15/1521_653895972/src/com/coding/coderising/array/SimpleArrayUtil.java new file mode 100644 index 0000000000..0aa491fb16 --- /dev/null +++ b/group15/1521_653895972/src/com/coding/coderising/array/SimpleArrayUtil.java @@ -0,0 +1,250 @@ +package com.coding.coderising.array; + +public class SimpleArrayUtil { + + private static void checkNull(int[] array) { + if (array == null) + throw new NullPointerException("array is null"); + } + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static void reverseArray(int[] origin) { + checkNull(origin); + int i = 0; + for (int j = origin.length - 1; j > i; ++i) { + int tmp = origin[i]; + origin[i] = origin[j]; + origin[j] = tmp; + --j; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + checkNull(oldArray); + if (0 == oldArray.length) + return oldArray; + int[] temp = new int[oldArray.length]; + int index = 0; + for (int i = 0; i < oldArray.length; i++) { + if (0 != oldArray[i]) { + temp[index++] = oldArray[i]; + } + } + int[] tem2 = new int[index]; + + System.arraycopy(temp, 0, tem2, 0, Math.min(oldArray.length, index)); + return tem2; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + public static int[] merge(int[] array1, int[] array2) { + if (array1 == null && array2 == null) + return null; + if (array1.length == 0) + return array2.clone(); + if (array2.length == 0) + return array1.clone(); + //判断排序方向 + boolean sort = array1[0] < array1[array1.length - 1]; + //去重 + for (int i = 0; i < array2.length; i++) { + boolean flag = true; + for (int j = 0; j < array1.length; j++) { + if (array2[i] == array1[j]) { + flag = false; + break; + } + } + if (flag) { + //扩容 + array1 = grow(array1, 1); + array1[array1.length - 1] = array2[i]; + } + } + //排序 + if (sort) {//小到大 + int tmp; + //冒泡排序 + for (int i = 0; i < array1.length; i++) { + for (int j = i + 1; j < array1.length; j++) { + if (array1[i] > array1[j]) { + tmp = array1[i]; + array1[i] = array1[j]; + array1[j] = tmp; + } + } + } + } else {//大到小 + int tmp; + //冒泡排序 + for (int i = 0; i < array1.length; i++) { + for (int j = i + 1; j < array1.length; j++) { + if (array1[i] < array1[j]) { + tmp = array1[i]; + array1[i] = array1[j]; + array1[j] = tmp; + } + } + } + } + return array1; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + int[] newArr = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArr, 0, oldArray.length); + return newArr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + int[] arr = new int[]{}; + int i = 1; + while (true) { + int a = fb(i); + if (a > 15) + break; + //扩容 + arr = grow(arr, 1); + arr[i - 1] = a; + i++; + } + return arr; + } + + /** + * 获取斐波那契数 + * F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) + */ + public static int fb(int i) { + i = i < 1 ? 1 : i; + if (i == 1 || i == 2) { + return 1; + } + return fb(i - 1) + fb(i - 2); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + int[] arr = new int[]{2}; + if (max < 1) throw new IllegalArgumentException("不是大于1的自然数"); + int j = 1; + for (int n = 3; n < max; n++) { + int k = 2; + while (n > k) { + if (n % k == 0) + break; + k++; + } + //扩容 + arr = grow(arr, 1); + arr[j++] = n; + } + return arr; + } + + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + int[] arr = new int[0]; + int a = 0; + for (int i = 1; i < max; i++) { + if (isPerfect(i)) { + //扩容 + arr = grow(arr, 1); + arr[a++] = i; + } + } + return arr; + } + + //判断 “完数” + public static boolean isPerfect(int max) { + int i = 1; + int n = 0; + while (i < max) { + if (max % i == 0) { + n += i; + } + i++; + } + if (n == max) + return true; + return false; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public static String join(int[] array, String seperator) { + if (array == null) + return null; + String s = ""; + for (int i = 0; i < array.length; i++) { + s += array[i]; + if (i != array.length - 1) + s += seperator; + } + return s; + } + + +} diff --git a/group15/1521_653895972/src/com/coding/coderising/litestruts/LoginAction.java b/group15/1521_653895972/src/com/coding/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..273741bbfb --- /dev/null +++ b/group15/1521_653895972/src/com/coding/coderising/litestruts/LoginAction.java @@ -0,0 +1,42 @@ +package com.coding.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author wanc + */ +public class LoginAction { + private String name; + private String password; + + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group15/1521_653895972/src/com/coding/coderising/litestruts/Struts.java b/group15/1521_653895972/src/com/coding/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..ed20c588fe --- /dev/null +++ b/group15/1521_653895972/src/com/coding/coderising/litestruts/Struts.java @@ -0,0 +1,145 @@ +package com.coding.coderising.litestruts; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + +public class Struts { + + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + //解析xml + Map xmlInfo = parsersXml(actionName); + //获取类名 + String allName = (String) xmlInfo.get("className"); + try { + //加载类 + Class cls = Class.forName(allName); + //实例化 + Object object = cls.newInstance(); + for (String key : parameters.keySet()) { + //拼接set方法名 + String setName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); + Method setMethod = cls.getDeclaredMethod(setName, String.class); + //放射执行set方法 + setMethod.invoke(object, parameters.get(key)); + } + //执行execute方法 + Method exectue = cls.getDeclaredMethod("execute", null); + String reslut = (String) exectue.invoke(object, null); + //执行getMessage方法 + Method getMessage = cls.getDeclaredMethod("getMessage", null); + String message = (String) getMessage.invoke(object, null); + //获取xml配置想返回结果 + String jsp = (String) xmlInfo.get(reslut); + //组装view + Map map = new HashMap(); + map.put("message", message); + View view = new View(); + view.setJsp(jsp); + view.setParameters(map); + return view; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return null; + } + + + private static Map parsersXml(String actionName) { + File file = new File(Struts.class.getResource("").getPath() + "/struts.xml"); + //1.获取DOM解析器工厂 + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + HashMap map = new HashMap<>(); + try { + //2.获取解析器 + DocumentBuilder builder = factory.newDocumentBuilder(); + //3.加载xml文档 + Document document = builder.parse(file); + //4.获取指定action的action集合 + NodeList actionlist = document.getElementsByTagName("action"); + //5.如果actionName重复 只去第一个 + for (int j = 0; j < actionlist.getLength(); j++) { + Element actionElement = (Element) actionlist.item(j); + if (actionElement.getAttribute("name") != null && actionElement.getAttribute("name").equalsIgnoreCase(actionName)) { + //6.获取 类全限定名 + String className = actionElement.getAttribute("class"); + map.put("className", className); + //7.获取 action子节点 + NodeList childList = actionElement.getChildNodes(); + int lenght = childList.getLength(); + for (int i = 0; i < lenght; i++) { + Node node = childList.item(i); + //判断为element节点 排除空格 换行 + if (node.getNodeType() == Node.ELEMENT_NODE) { + Element child = (Element) node; + switch (child.getAttribute("name")) { + case "success": + map.put("success", child.getTextContent()); + break; + case "fail": + map.put("fail", child.getTextContent()); + break; + case "error": + map.put("error", child.getTextContent()); + break; + } + } + } + break; + } + + } + + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return map; + } +} diff --git a/group15/1521_653895972/src/com/coding/coderising/litestruts/StrutsTest.java b/group15/1521_653895972/src/com/coding/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..8699cc3eca --- /dev/null +++ b/group15/1521_653895972/src/com/coding/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coding.coderising.litestruts; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group15/1521_653895972/src/com/coding/coderising/litestruts/View.java b/group15/1521_653895972/src/com/coding/coderising/litestruts/View.java new file mode 100644 index 0000000000..2c909058cb --- /dev/null +++ b/group15/1521_653895972/src/com/coding/coderising/litestruts/View.java @@ -0,0 +1,27 @@ +package com.coding.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group15/1521_653895972/src/com/coding/coderising/litestruts/struts.xml b/group15/1521_653895972/src/com/coding/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..bec462fdf5 --- /dev/null +++ b/group15/1521_653895972/src/com/coding/coderising/litestruts/struts.xml @@ -0,0 +1,12 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group15/group15.md b/group15/group15.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group15/group15.md @@ -0,0 +1 @@ + diff --git a/group16/1012075117/DataStructure219/.classpath b/group16/1012075117/DataStructure219/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group16/1012075117/DataStructure219/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group16/1012075117/DataStructure219/.project b/group16/1012075117/DataStructure219/.project new file mode 100644 index 0000000000..567baae65f --- /dev/null +++ b/group16/1012075117/DataStructure219/.project @@ -0,0 +1,17 @@ + + + DataStructure219 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group16/1012075117/DataStructure219/.settings/org.eclipse.jdt.core.prefs b/group16/1012075117/DataStructure219/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group16/1012075117/DataStructure219/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/ArrayList.java b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/ArrayList.java new file mode 100644 index 0000000000..a1d46a21d8 --- /dev/null +++ b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/ArrayList.java @@ -0,0 +1,94 @@ +package com.stackwei.DataStructure; + +/** + * + * @author stackwei -2017.2.25 + * + */ +public class ArrayList implements List { + + private int flag = -1; + private static final int DEFAULT_CAPACITY = 1; + private Object[] elementData = new Object[DEFAULT_CAPACITY]; + + @Override + public void add(Object element) { + // 当要添加数据的位置已经超过数组长度时,增长数组长度 + if (size() + 1 == elementData.length) { + grow(); + } + elementData[flag + 1] = element; + flag++; + } + + @Override + public void add(int index, Object element) { + if (index < 0 || index > getFlag() + 1) { + System.out.println("在--" + index + "--添加的--" + element + "--无效,因为越界了!"); + return; + } + // 数组长度永远比已存数据大一个。 + if (size() + 1 == elementData.length) { + grow(); + } + elementData[index] = element; + if (index > getFlag()) { + flag++; + } + } + + @Override + public Object get(int index) { + if (index < 0 || index > getFlag()) { + System.out.print("在--" + index + "--的get无效,因为越界了!"); + return null; + } + return elementData[index]; + } + + @Override + public Object remove(int index) { + if (index < 0 || index > getFlag()) { + System.out.println("在--" + index + "--的remove无效,因为越界了!"); + return null; + } + Object oldValue = elementData[index]; + elementData[index] = null; + // 将删除处后面的数据往前移一格。 + Object[] data2 = new Object[elementData.length - 1]; + System.arraycopy(elementData, 0, data2, 0, getFlag()); + elementData = data2; + flag--; + return oldValue; + } + + @Override + public int size() { + return getFlag() + 1; + } + + public int getFlag() { + return flag; + } + + private void grow() { + Object[] data2 = new Object[elementData.length + 1]; + System.arraycopy(elementData, 0, data2, 0, getFlag() + 2);// 最后一个参数是需要复制的数据的数量。 + elementData = data2; + } + + /** + * 测试用例 + * + * @param args + */ + public static void main(String[] args) { + ArrayList al = new ArrayList(); + al.add(0, 99); + al.add(1, 100); + System.out.println(al.get(1)); + al.remove(1); + System.out.println(al.get(1)); + System.out.println(al.size()); + } +} \ No newline at end of file diff --git a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/LinkedList.java b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/LinkedList.java new file mode 100644 index 0000000000..a1c728f0a1 --- /dev/null +++ b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/LinkedList.java @@ -0,0 +1,194 @@ +package com.stackwei.DataStructure; + +/** + * + * @author stackwei -2017.2.25 + * + */ +public class LinkedList implements List { + + private Node head = null; + private Node last = null; + private int size = 0; + + private static class Node { + Object item; + Node prev; + Node next; + + public Node(Node prev, Object item, Node next) { + this.prev = prev; + this.item = item; + this.next = next; + } + } + + @Override + public void add(Object element) { + addLast(element); + } + + @Override + public void add(int index, Object element) { + if (index < 0 || index > size) { + System.out.println("操作无效,越界了"); + return; + } + if (index == 0) { + addFirst(element); + return; + } + if (index == size) { + addLast(element); + return; + } + Node indexNode = node(index); + Node newNode = new Node(indexNode.prev, element, indexNode); + indexNode.prev.next = newNode; + indexNode.prev = newNode; + size++; + } + + @Override + public Object get(int index) { + if (index < 0 || index >= size) { + System.out.println("查询无效,越界了"); + return null; + } + if (index == 0) { + return head.item; + } + return node(index).item; + } + + @Override + public Object remove(int index) { + if (index < 0 || index > size) { + System.out.println("是空的,无法删除"); + return null; + } + if (index == 0) { + return removeFirst(); + } + if (index == size - 1) { + return removeLast(); + } + Node x = node(index); + final Object element = x.item; + final Node next = x.next; + final Node prev = x.prev; + + if (prev == null) { + head = next; + } else { + prev.next = next; + x.prev = null; + } + + if (next == null) { + last = prev; + } else { + next.prev = prev; + x.next = null; + } + + x.item = null; + size--; + return element; + } + + @Override + public int size() { + return size; + } + + private void addFirst(Object element) { + final Node f = head; + Node newNode = new Node(null, element, f); + head = newNode; + if (f == null) + last = newNode; + else + f.prev = newNode; + size++; + } + + public void addLast(Object element) { + if (head == null) { + addFirst(element); + } else { + Node newNode = new Node(last, element, null); + last.next = newNode; + last = newNode; + size++; + } + } + + public Object removeFirst() { + if (head == null) { + System.out.println("是空的,无法删除"); + return null; + } else { + Node x = head; + Node next = head.next; + Object element = x.item; + x.item = null; + x.next = null; + head = next; + if (next == null) + last = null; + else + x.prev = null; + size--; + return element; + } + } + + public Object removeLast() { + if (last == null) { + System.out.println("是空的,无法删除"); + return null; + } else { + final Node l = last; + final Object element = l.item; + final Node p = l.prev; + l.item = null; + l.prev = null; + last = p; + if (p == null) + head = null; + else + p.next = null; + size--; + return element; + } + } + + Node node(int index) { + if (index < (size >> 1)) { + Node x = head; + for (int i = 0; i < index; i++) + x = x.next; + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) + x = x.prev; + return x; + } + } + + /** + * 测试用例 + * + * @param args + */ + public static void main(String[] args) { + LinkedList ll = new LinkedList(); + ll.add(0, "xxx"); + ll.add(1, 111); + System.out.println(ll.size()); + System.out.println(ll.get(2)); + + } +} \ No newline at end of file diff --git a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/List.java b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/List.java new file mode 100644 index 0000000000..5226796141 --- /dev/null +++ b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/List.java @@ -0,0 +1,13 @@ +package com.stackwei.DataStructure; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Queue.java b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Queue.java new file mode 100644 index 0000000000..4a227495e9 --- /dev/null +++ b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Queue.java @@ -0,0 +1,52 @@ +package com.stackwei.DataStructure; + +/** + * + * @author stackwei -2017.2.25 + * + */ +public class Queue { + + private LinkedList ll = new LinkedList(); + + /** + * 在队尾添加数据 + * @param element + */ + public void enQueue(Object element) { + ll.addLast(element); + } + + /** + * 删除队头数据 + * @return + */ + public Object deQueue() { + return ll.removeFirst(); + } + + /** + * 队列是否为空 + * @return + */ + public boolean isEmpty() { + if (ll.size() > 0) { + return false; + } + return true; + } + + /** + * 测试用例 + * @param args + */ + public static void main(String[] args) { + Queue q = new Queue(); + q.enQueue(97); + q.enQueue(98); + q.enQueue(99); + System.out.println(q.isEmpty()); + System.out.println(q.deQueue()); + } + +} diff --git a/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Stack.java b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Stack.java new file mode 100644 index 0000000000..1b047ffafd --- /dev/null +++ b/group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Stack.java @@ -0,0 +1,59 @@ +package com.stackwei.DataStructure; + +/** + * + * @author stackwei -2017.2.25 + * + */ +public class Stack { + + private ArrayList al = new ArrayList(); + + /** + * 进栈 + * @param item + */ + public void push(Object item) { + al.add(item); + } + + /** + * 出栈 + * @return + */ + public Object pop() { + return al.remove(al.getFlag()); + } + + /** + * 获取栈顶元素 + * @return + */ + public Object peek() { + return al.get(al.getFlag()); + } + + /** + * 栈是否为空 + * @return + */ + public boolean isEmpty() { + if (al.getFlag() >= 0) { + return false; + } + return true; + } + + /** + * 测试用例 + * @param args + */ + public static void main(String[] args) { + Stack s = new Stack(); + s.push(98); + s.push(99); + s.pop(); + System.out.println(s.peek()); + } + +} diff --git a/group16/1154151360/.classpath b/group16/1154151360/.classpath new file mode 100644 index 0000000000..9746a6c933 --- /dev/null +++ b/group16/1154151360/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/group16/1154151360/.gitignore b/group16/1154151360/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group16/1154151360/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group16/1154151360/.project b/group16/1154151360/.project new file mode 100644 index 0000000000..f88388f6d7 --- /dev/null +++ b/group16/1154151360/.project @@ -0,0 +1,17 @@ + + + DataStructure2 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group16/1154151360/.settings/org.eclipse.core.resources.prefs b/group16/1154151360/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/group16/1154151360/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/group16/1154151360/src/com/array/ArrayUtil.java b/group16/1154151360/src/com/array/ArrayUtil.java new file mode 100644 index 0000000000..39f587c847 --- /dev/null +++ b/group16/1154151360/src/com/array/ArrayUtil.java @@ -0,0 +1,266 @@ +package com.array; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.sun.org.apache.xalan.internal.xsltc.compiler.sym; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public int[] reverseArray(int[] origin){ + + int [] temp = new int [origin.length]; + + for (int i = 0; i < temp.length; i++){ + temp [i] = origin [temp.length - 1 - i]; + } + + origin = temp; + + return origin; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + + int newLength = 0; + + for (int i = 0; i < oldArray.length ; i++){ + if (oldArray[i] == 0) + newLength ++; + } + + int [] newArray = new int [oldArray.length - newLength]; + int index = 0; + for (int j = 0; j < oldArray.length; j++){ + if (oldArray[j] != 0) + newArray[index++] = oldArray[j]; + } + + newArray = sort(newArray, 0, newArray.length - 1); + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + + int newLength = array1.length + array2.length; + int [] newArray = new int [newLength]; + System.arraycopy(array1, 0, newArray, 0, array1.length); + System.arraycopy(array2, 0, newArray, array1.length, array2.length); + Set arraySet = new HashSet(); + for (int i = 0; i < newArray.length; i++){ + arraySet.add(newArray[i]); + } + int [] tempArray = new int[arraySet.size()]; + Iterator iterator = arraySet.iterator(); + int index = 0; + while (iterator.hasNext()){ + tempArray[index++] = iterator.next(); + } + newArray = sort(tempArray, 0, tempArray.length - 1); + return newArray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int [] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, size); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if (max > 1){ + List array = new ArrayList(); + array.add(1); + array.add(1); + for(int i = 2;;i++){ + array.add(array.get(i - 1) + array.get(i - 2)); + if (array.get(i) > max){ + array.remove(i); + break; + } + } + int [] result = returnArray(array); + return result; + }else{ + int [] b = new int[]{}; + return b; + } + + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + ArrayList list1 = new ArrayList(); + ArrayList list2 = new ArrayList(); + for (int i = 2; i < max; i++){ + list1.add(i); + } + + for (int m = 0; m < list1.size(); m++){ + boolean flag = true; + for (int n = 2; n < list1.get(m); n++){ + if (list1.get(m) % n == 0){ + flag = false; + break; + } + + } + if (flag) + list2.add(list1.get(m)); + } + + int [] result = returnArray(list2); + + return result; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + ArrayList array = new ArrayList(); + Map> arrayMap = new HashMap>(); + ArrayList array2 = new ArrayList(); + for (int i = 2; i < max; i++){ + array.add(i); + } + for(int m = 0; m < array.size(); m++){ + ArrayList tempArray = new ArrayList(); + for (int n = 2; n < array.get(m);n++){ + if (array.get(m) % n == 0) + tempArray.add(n); + } + arrayMap.put(array.get(m), tempArray); + } + for(Map.Entry> entry: arrayMap.entrySet()){ + Integer key = entry.getKey(); + ArrayList tempArray = entry.getValue(); + Integer tempInt = 0; + for (Integer i:tempArray){ + tempInt += i; + } + if (key == tempInt){ + array2.add(key); + } + } + int [] result = returnArray(array2); + + return result; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + + StringBuilder builder = new StringBuilder(); + + for (int i = 0; i < array.length; i++){ + builder.append(array[i]); + builder.append(seperator); + } + builder.deleteCharAt(builder.length() - 1); + return builder.toString(); + } +//***************************工具类***************************************** + public int [] returnArray( List list){ + int [] result = new int[list.size()]; + int index = 0; + Iterator iterator = list.iterator(); + while(iterator.hasNext()){ + result[index++] = iterator.next(); + } + return result; + } + + //快速排序算法 + public int [] sort (int [] array, int low, int height ){ + + int start = low; + int end = height; + int key = array[low]; + + while (end > start){ + //从后往前遍历 + while (end > start && array[end] >= key) + end--; + + if (array[end] <= key){ + int temp = array[end]; + array[end] = array[start]; + array[start] = temp; + } + + //从前往后遍历 + while(end > start && array[start] <= key) + start++; + + if (array[start] >= key){ + int temp = array[start]; + array[start] = array[end]; + array[end] = temp; + } + } + + if(start > low)sort(array, low, start - 1); + if (end < height)sort(array, end + 1, height); + + return array; + } +//******************************************************************8 +} diff --git a/group16/1154151360/src/com/array/ArrayUtilTest.java b/group16/1154151360/src/com/array/ArrayUtilTest.java new file mode 100644 index 0000000000..159d497b6d --- /dev/null +++ b/group16/1154151360/src/com/array/ArrayUtilTest.java @@ -0,0 +1,102 @@ +package com.array; + +import static org.junit.Assert.*; +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; +@SuppressWarnings("deprecation") +public class ArrayUtilTest { + + ArrayUtil util; + + @Before + public void init(){ + util = new ArrayUtil(); + } + + @Test + public void test_reverseArray() { + int [] a = {7, 9, 30, 3, 4}; + a = util.reverseArray(a); + Assert.assertEquals("[4,3,30,9,7]", toString(a)); + } + + @Test + public void test_removeZero(){ + int [] oldArr={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + + oldArr = util.removeZero(oldArr); + + Assert.assertEquals("[1,3,4,5,6,6,5,4,7,6,7,5]", toString(oldArr)); + } + + + @Test + public void test_merge(){ + int [] a1 = {3, 5, 7,8}; + int [] a2 = {4, 5, 6,7}; + int [] a3 = util.merge(a1, a2); + + Assert.assertEquals("[3,4,5,6,7,8]", toString(a3)); + + } + + @Test + public void test_grow(){ + int [] oldArray = {2,3,6}; + int size = 3; + int [] newArray = util.grow(oldArray, size); + + Assert.assertEquals("[2,3,6,0,0,0]", toString(newArray)); + } + + + @Test + public void test_fibonacci(){ + + int [] array = util.fibonacci(15); + + Assert.assertEquals("[1,1,2,3,5,8,13]", toString(array)); + + } + + + @Test + public void test_getPrimes(){ + + int [] array = util.getPrimes(23); + Assert.assertEquals("[2,3,5,7,11,13,17,19]", toString(array)); + + } + + @Test + public void test_getPerfectNumbers(){ + int [] array = util.getPerfectNumbers(10); + + Assert.assertEquals("[6]", toString(array)); + + } + + @Test + public void test_join(){ + + int [] array = {3,8,9}; + String result = util.join(array, "-"); + Assert.assertEquals("3-8-9", result); + } + + + public String toString(int [] array){ + StringBuilder builder = new StringBuilder(); + builder.append("["); + for(int item: array){ + builder.append(item) + .append(","); + } + builder.replace(builder.length() - 1, builder.length(), ""); + builder.append("]"); + return builder.toString(); + + } +} diff --git a/group16/1154151360/src/com/list/ArrayList.java b/group16/1154151360/src/com/list/ArrayList.java new file mode 100644 index 0000000000..733dc0f341 --- /dev/null +++ b/group16/1154151360/src/com/list/ArrayList.java @@ -0,0 +1,93 @@ +package com.list; + + +//ArrayList +public class ArrayList { + + private int size; + + private Object [] elementData = new Object[10]; + + public boolean add(Object data){ + + getRow(size+1); + elementData[size++] = data; + return true; + } + + public boolean add(int index, Object data){ + if (index < 0 || index > elementData.length){ + throw new IndexOutOfBoundsException("�±�Խ��"); + } + getRow(size + 1); + Object object = elementData [index]; + System.arraycopy(elementData, index,elementData , index + 1,size - index ); + elementData[index] = data; + size++; + return true; + } + + public Object get(int index){ + if (index < 0 || index > elementData.length){ + throw new IndexOutOfBoundsException("下标越界"); + } + return elementData[index]; + } + + public Object remove(int index){ + if (index < 0 || index > elementData.length){ + throw new IndexOutOfBoundsException("下标越界"); + } + Object object = elementData [index]; + System.arraycopy(elementData, index + 1 , elementData, index, size - 1 - index); + elementData[size--]= null; + return object; + } + + + private void getRow(int num){ + if (num > elementData.length ){ + int oldLength = elementData.length; + int newLength = ((num + elementData.length) * 3) >> 2; + Object [] oldelements = elementData; + elementData = new Object[newLength]; + System.arraycopy(oldelements, 0, elementData, 0, size); + } + } + + public int size(){ + return size; + } + + public int length(){ + return elementData.length; + } + public static void main(String[] args) { + ArrayList list = new ArrayList(); + + list.add("A"); + list.add("B"); + list.add("C"); + list.add("D"); + list.add("E"); + list.add("F"); + list.add("G"); + list.add("H"); + list.add("I"); + list.add("J"); + list.add("K"); + list.add("L"); + list.add(2, 1); + System.out.println("elementsData.Length: "+list.length()); + System.out.println("elementsData.size: "+list.size()); + for (int i = 0; i < list.size; i++){ + System.out.print(list.get(i)+ " "); + } + System.out.println(" "); + list.remove(2); + + for (int i = 0; i < list.size; i++){ + System.out.print(list.get(i)+ " "); + } + } +} diff --git a/group16/1154151360/src/com/list/LinkedList.java b/group16/1154151360/src/com/list/LinkedList.java new file mode 100644 index 0000000000..46f61fb667 --- /dev/null +++ b/group16/1154151360/src/com/list/LinkedList.java @@ -0,0 +1,158 @@ +package com.list; + +public class LinkedList { + + private int size; + + private Node head;//头节点 + + Node current; //当前节点 + + public LinkedList(){ + this.head = current = new Node(null); + this.size = 0; + } + + + private boolean add(Object object){ + addAfter(object); + size++; + return true; + } + + + private boolean add(int index,Object object) throws Exception{ + index(index - 1); + current.nextNode = new Node(object,current.nextNode.nextNode); + size++; + return true; + } + + + private boolean addFirst(Object object){ + Node node = new Node(object,null); + current = head.nextNode; + head.nextNode = node; + node.nextNode = current; + size++; + return true; + } + + + private boolean addLast(Object object){ + add(object); + return true; + } + + + private Object get(int index) throws Exception{ + index(index); + return current.object; + } + + + private Object remove(int index) throws Exception{ + + if (index == size - 1){ + Object object = removeLast(); + return object; + } + index(index - 1); + Object object = current.nextNode.object; + + current.nextNode = current.nextNode.nextNode; + size--; + return object; + } + + private Object removeFirst(){ + Object object = null; + if (size > 0){ + current = head.nextNode; + object = current.object; + head.nextNode = head.nextNode.nextNode; + size--; + } + return object; + } + + private Object removeLast() throws Exception{ + Object object = null; + if (size > 0){ + int j = 0; + current = head.nextNode; + + while (current != null){ + current = current.nextNode; + j++; + } + index(j - 1); + object = current.nextNode.object; + current.nextNode = null; + size--; + } + return object; + } + private void index (int index) throws Exception{ + + if (index < -1 || index > size){ + + throw new Exception(" "); + } + + if (index == -1){ + return; + } + current = head.nextNode; + int j = 0; + while (current != null && j < index){ + current = current.nextNode; + j++; + } + } + + + private void addAfter(Object object){ + + if (head.nextNode == null){ + + Node newNode = new Node(object,null); + }else{ + current = head.nextNode; + while (current.nextNode == null){ + current = current.nextNode; + } + current.setNode(new Node(object,null)); + } + + + } + + + + + private static class Node{ + + Object object; + + Node nextNode; + + + Node (Node nextNode){ + this.nextNode = nextNode; + } + + + Node (Object object, Node nextNode){ + this.nextNode = nextNode; + this.object = object; + } + + private void setNode(Node node){ + this.nextNode = node; + } + + } + + +} diff --git a/group16/1154151360/src/com/list/Queue.java b/group16/1154151360/src/com/list/Queue.java new file mode 100644 index 0000000000..faa3e87381 --- /dev/null +++ b/group16/1154151360/src/com/list/Queue.java @@ -0,0 +1,51 @@ +package com.list; +//队列 +public class Queue { + + Object [] element; + + private static int DEFAULT_SIZE = 10; + + int front;//头指针 + + int rear;//尾指针 + + public Queue(){ + this(DEFAULT_SIZE); + } + public Queue(int size){ + element = new Object[size]; + this.front = 0; + this.rear = 0; + } + + public boolean enQueue(Object object){ + + if ((rear + 1) % element.length == front){ + return false; + }else{ + element[rear] = object; + rear = (rear + 1) % element.length; + return true; + } + } + + public Object deQueue(){ + if (front == rear){ + return null; + }else{ + Object object = element[front]; + front = (front + 1) % element.length; + return object; + } + + } + + public int size(){ + return (rear -front) & (element.length - 1); + } + + public boolean isEmpty(){ + return rear == front; + } +} diff --git a/group16/1154151360/src/com/list/Stack.java b/group16/1154151360/src/com/list/Stack.java new file mode 100644 index 0000000000..f92a9e731c --- /dev/null +++ b/group16/1154151360/src/com/list/Stack.java @@ -0,0 +1,35 @@ +package com.list; + +import java.util.ArrayList; +import java.util.EmptyStackException; + +public class Stack { + + ArrayList elelmentData = new ArrayList(); + + //压入栈 + public void push(Object object){ + elelmentData.add(object); + } + + //弹出栈 + public Object pop(){ + if (isEmpty()){ throw new EmptyStackException();} + return elelmentData.remove(elelmentData.size() - 1); + } + + //取栈顶元素 + public Object peek(){ + if (isEmpty()){return null;} + return elelmentData.get(elelmentData.size() - 1); + } + + public boolean isEmpty(){ + return elelmentData.isEmpty(); + } + + public int size(){ + if (isEmpty()){throw new EmptyStackException();} + return elelmentData.size(); + } +} diff --git a/group16/1154151360/src/com/litestruts/LoginAction.java b/group16/1154151360/src/com/litestruts/LoginAction.java new file mode 100644 index 0000000000..24369135f9 --- /dev/null +++ b/group16/1154151360/src/com/litestruts/LoginAction.java @@ -0,0 +1,40 @@ +package com.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction { + + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group16/1154151360/src/com/litestruts/Struts.java b/group16/1154151360/src/com/litestruts/Struts.java new file mode 100644 index 0000000000..49254d6a5f --- /dev/null +++ b/group16/1154151360/src/com/litestruts/Struts.java @@ -0,0 +1,139 @@ +package com.litestruts; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + + + //创建SAXreader对象 + SAXReader reader = new SAXReader(); + //将读取的文件封装成document对象 + Document document = reader.read(new File("src/com/litestruts/struts.xml")); + //获取文档的根节点 + Element root = document.getRootElement(); + + List elist = listNode(root); + + Map > actionMap = getAction(elist, actionName); + + for(Map.Entry> entity: actionMap.entrySet()){ + String className = entity.getKey(); + Class clazz = Class.forName(className); + Method setName = clazz.getMethod("setName", String.class); + Method setPassword = clazz.getMethod("setPassword", String.class); + Method getMessage = clazz.getMethod("getMessage"); + Method execute = clazz.getMethod("execute"); + Object object = clazz.newInstance(); + setName.invoke(object, parameters.get("name")); + setPassword.invoke(object, parameters.get("password")); + String status = (String) execute.invoke(object); + String message = (String) getMessage.invoke(object); + + String jsp = entity.getValue().get(status); + + Map parameter = new HashMap(); + + parameter.put("message", message); + + View view = new View(); + + view.setJsp(jsp); + view.setParameters(parameter); + + return view; + } + + return null; + } + + //获取节点的所有子节点 + private static List listNode(Element node){ + + Iterator iterator = node.elementIterator(); + List elist = new ArrayList(); + while (iterator.hasNext()){ + Element e = iterator.next(); + elist.add(e); + } + if (elist.isEmpty()) + return null; + else + return elist; + } + + //获取对应的Action信息 + private static Map > getAction(List elist,String actionName){ + + for (Element node:elist){ + List attributes = node.attributes(); + if (attributes.isEmpty()) + getAction(listNode(node),actionName); + else{ + Attribute attribute = node.attribute("name"); + if (attribute.getValue().equals(actionName)){ + String className = node.attribute("class").getValue(); + List childElements = listNode(node); + Map resMap =install(childElements); + Map > actionMap = new HashMap>(); + actionMap.put(className, resMap); + return actionMap; + } + } + } + return null; + } + + //组装action的result + private static Map install(List elements){ + Map resultMap = new HashMap(); + for (Element node: elements){ + Attribute attribute = node.attribute("name"); + String value; + if (node.getTextTrim().isEmpty()) + value = ""; + else + value = node.getTextTrim(); + + resultMap.put(attribute.getValue(), value); + + } + return resultMap; + } + +} diff --git a/group16/1154151360/src/com/litestruts/StrutsTest.java b/group16/1154151360/src/com/litestruts/StrutsTest.java new file mode 100644 index 0000000000..9317cc5e26 --- /dev/null +++ b/group16/1154151360/src/com/litestruts/StrutsTest.java @@ -0,0 +1,51 @@ +package com.litestruts; + +import static org.junit.Assert.*; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import junit.framework.Assert; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group16/1154151360/src/com/litestruts/View.java b/group16/1154151360/src/com/litestruts/View.java new file mode 100644 index 0000000000..af63dce301 --- /dev/null +++ b/group16/1154151360/src/com/litestruts/View.java @@ -0,0 +1,23 @@ +package com.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group16/1154151360/src/com/litestruts/struts.xml b/group16/1154151360/src/com/litestruts/struts.xml new file mode 100644 index 0000000000..ddbcbc38da --- /dev/null +++ b/group16/1154151360/src/com/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/1287642108/0226/src/com/coding/basic/ArrayList.java b/group16/1287642108/0226/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..e287419dc0 --- /dev/null +++ b/group16/1287642108/0226/src/com/coding/basic/ArrayList.java @@ -0,0 +1,63 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + IncrementsCapacity(size + 1); + elementData[size++] = o; + + } + + public void add(int index, Object o) { + checkIndex(index); + IncrementsCapacity(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index) { + checkIndex(index); + return elementData[index]; + } + + public Object remove(int index) { + checkIndex(index); + Object o = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + elementData[--size] = null; + return o; + } + + public int size() { + return size; + } + + public int length() { + return elementData.length; + } + + // + private void IncrementsCapacity(int num) { + if (num > elementData.length) { + int oldCapacity = elementData.length; // ǰ鳤 + int newCapacity = ((num + oldCapacity) * 3) >> 2; // ǰ鳤ȵ1.5 + if (newCapacity - num < 0) { + newCapacity = num; // Dz,ֱΪֵ + } + Object[] oldelements = elementData; + elementData = new Object[newCapacity]; + System.arraycopy(oldelements, 0, elementData, 0, size); + } + } + + // ±Խж + private void checkIndex(int index) { + if (index >= size || index < 0) + throw new IndexOutOfBoundsException("±Խ"); + } +} diff --git a/group16/1287642108/0226/src/com/coding/basic/Iterator.java b/group16/1287642108/0226/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e7cbd474ec --- /dev/null +++ b/group16/1287642108/0226/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group16/1287642108/0226/src/com/coding/basic/LinkedList.java b/group16/1287642108/0226/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..99c92fb9f1 --- /dev/null +++ b/group16/1287642108/0226/src/com/coding/basic/LinkedList.java @@ -0,0 +1,101 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private Node tail; + private int size = 0 ; + + public void add(Object o){ + addLast(o); + } + + public void add(int index, Object o) { + if (index == 0) { + addFirst(o); + } else if (index >= size) { + addLast(o); + } else { + Node node = new Node(); + node.data = o; + node.next = getNode(index); + getNode(index - 1).next = node; + size++; + } + } + + public Object get(int index) { + Node node = getNode(index); + return node.data; + } + + public Object remove(int index){ + Node currentNode = getNode(index); + Node prevNode = getNode(index - 1); + Node lastNode = getNode(index + 1); + prevNode.next = lastNode; + size--; + return currentNode.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node node=new Node(); + node.data = o; + node.next = head; + head = node; + size++; + } + public void addLast(Object o){ + Node node=new Node(); + node.data = o; + node.next = null; + Node lastNode = getNode(size-1); + lastNode.next = node; + size++; + } + public Object removeFirst(){ + Object obj = getNode(0).data; + Node node = getNode(1); + node.next = head; + size--; + return obj; + } + public Object removeLast(){ + Object obj = getNode(size - 1).data; + Node node = getNode(size - 2); + node.next = null; + size--; + return obj; + } + + //ȡڵ + public Node getNode(int index){ + checkIndex(index); + if(index == 0 ){ + return head; + }else if(index == size -1 ){ + return tail; + }else{ + Node node = head; + for(int i=0;i= size || index < 0) + throw new IndexOutOfBoundsException("±Խ"); + } + + private static class Node { + Object data; + Node next; + } +} diff --git a/group16/1287642108/0226/src/com/coding/basic/List.java b/group16/1287642108/0226/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group16/1287642108/0226/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group16/1287642108/0226/src/com/coding/basic/Queue.java b/group16/1287642108/0226/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..95dee3d81b --- /dev/null +++ b/group16/1287642108/0226/src/com/coding/basic/Queue.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Queue { + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.addLast(o); + } + + public Object deQueue(){ + if (isEmpty()) { + return null; + }else{ + return elementData.removeFirst(); + } + } + + public boolean isEmpty(){ + if (elementData.size() == 0) { + return true; + } + return false; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group16/1287642108/0226/src/com/coding/basic/Stack.java b/group16/1287642108/0226/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..c0b7da89f8 --- /dev/null +++ b/group16/1287642108/0226/src/com/coding/basic/Stack.java @@ -0,0 +1,38 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + if (isEmpty()) { + elementData.add(elementData.length() - 1, o); + } + elementData.add(elementData.length() - elementData.size() - 1, o); + } + + public Object pop() { + if (isEmpty()) { + return null; + } + return elementData.remove(elementData.length() - elementData.size() - 1); + } + + public Object peek() { + if (isEmpty()) { + return null; + } + return elementData.get(elementData.length() - elementData.size() - 1); + } + + public boolean isEmpty() { + if (elementData.size() == 0) { + return true; + } + return false; + } + + public int size() { + return elementData.size(); + } + +} diff --git a/group16/1287642108/0305/src/com/coderising/array/ArrayUtil.java b/group16/1287642108/0305/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..c600534218 --- /dev/null +++ b/group16/1287642108/0305/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,205 @@ +package com.coderising.array; + +import java.util.ArrayList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = {7, 9 , 30, 3} , 置换后为 {3, 30, 9,7} 如果 a = + * {7, 9, 30, 3, 4} , 置换后为 {4,3, 30 , 9,7} + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int[] temp = new int[origin.length]; + int index = 0; + for (int i = origin.length - 1; i >= 0; i--) { + temp[index++] = origin[i]; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + int countZero = 0; + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i] == 0){ + countZero++; + } + } + + int[] temp = new int[oldArray.length - countZero]; + int index = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + temp[index++] = oldArray[i]; + } + } + return temp; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * {3, 5, 7,8} a2 = {4, 5, 6,7} 则 a3 为{3,4,5,6,7,8} , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public Integer[] merge(int[] array1, int[] array2) { + Integer[] temp = new Integer[array1.length + array2.length]; + int i = 0,j = 0; + int index = 0; + + while(i < array1.length && j < array2.length){ + if(array1[i] <= array2[j]){ + temp[index++] = array1[i++]; + }else{ + temp[index++] = array2[j++]; + } + } + + while(i < array1.length){ + temp[index++] = array1[i++]; + } + while(j < array2.length){ + temp[index++] = array2[j++]; + } + return removeRepetition(temp); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = {2,3,6} , size = 3,则返回的新数组为 + * {2,3,6,0,0,0} + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + int[] temp = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, temp, 0, oldArray.length); + return temp; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max){ + int[] temp = new int[max]; + if(max == 1){ + return null; + } + int index = 0; + for(int i = 0;i temp = new ArrayList<>(); + for(int i=2; i < max; i++){ + isPrime = true; + for (int j = 2; j < i; j++){ + if ((i % j) == 0) { + isPrime = false; + break; + } + } + if(isPrime){ + temp.add(i); + } + } + int[] array = new int[temp.size()]; + int index = 0; + for(Integer te : temp){ + array[index++] = te; + } + return array; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static Integer[] getPerfectNumbers(int max) { + Integer[] temp = new Integer[max]; + int index = 0; + for (int i = 2; i < max; i++) { + int sum = 0; + for (int j = 1; j < i; j++) { + if (i % j == 0) { + sum += j; + } + if (sum == i){ + temp[index++] = i; + } + } + } + return removeRepetition(temp); + } + + /** + * 用seperator 把数组 array给连接起来 例如array= {3,8,9}, seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + String temp = ""; + for(int i = 0;i < array.length -1; i++){ + temp += array[i] + seperator; + } + temp += array[array.length-1]; + return temp; + } + + public static Integer[] removeRepetition(Integer[] oldArray){ + ArrayList temp = new ArrayList<>(); + for(int i=0;i parameters) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { + //创建SAXReader读取器,专门用于读取xml + SAXReader saxReader = new SAXReader(); + Document document = null; + try { + document = saxReader.read(new File("D:/DemoSpace/coding2017/group16/1287642108/0305/src/com/coderising/litestruts/struts.xml")); + Element root = document.getRootElement(); + //根据节点名称找节点 + Node node = root.selectSingleNode("action[@name='"+actionName+"']"); + String classPath = ((Element) node).attributeValue("class"); + //根据类名反射实例化 + Class onwClass = Class.forName(classPath); + Object o = onwClass.newInstance(); + Method setName = onwClass.getMethod("setName",String.class); + Method setPassword = onwClass.getMethod("setPassword",String.class); + Method execute = onwClass.getMethod("execute"); + Method getName = onwClass.getMethod("getName"); + Method getPassword = onwClass.getMethod("getPassword"); + Method getMessage = onwClass.getMethod("getMessage"); + setName.invoke(o,parameters.get("name")); + setPassword.invoke(o,parameters.get("password")); + String result = (String) execute.invoke(o); + //组装params参数 + HashMap map = new HashMap<>(); + String name = (String) getName.invoke(o); + String password = (String) getPassword.invoke(o); + String message = (String) getMessage.invoke(o); + map.put("name", name); + map.put("password", password); + map.put("message", message); + //组装view数据 + View view = new View(); + view.setParameters(map); + //根据execute的返回值,找对应的jsp页面路径 + String jspPath = node.valueOf("//result[@name='"+result+"']"); + view.setJsp(jspPath); + return view; + } catch (DocumentException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/group16/1287642108/0305/src/com/coderising/litestruts/StrutsTest.java b/group16/1287642108/0305/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..d7c1b587e0 --- /dev/null +++ b/group16/1287642108/0305/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,40 @@ +package com.coderising.litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group16/1287642108/0305/src/com/coderising/litestruts/View.java b/group16/1287642108/0305/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group16/1287642108/0305/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group16/1287642108/0305/src/com/coderising/litestruts/struts.xml b/group16/1287642108/0305/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..4b9edeb956 --- /dev/null +++ b/group16/1287642108/0305/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/1325756593/.classpath b/group16/1325756593/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group16/1325756593/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group16/1325756593/.gitignore b/group16/1325756593/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group16/1325756593/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group16/1325756593/.project b/group16/1325756593/.project new file mode 100644 index 0000000000..e3d07b6899 --- /dev/null +++ b/group16/1325756593/.project @@ -0,0 +1,17 @@ + + + DongqiHomeWork + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group16/1325756593/dongqihust.readme b/group16/1325756593/dongqihust.readme new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group16/1325756593/src/com/coderising/array/ArrayUtil.java b/group16/1325756593/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..0f67e6b54f --- /dev/null +++ b/group16/1325756593/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,273 @@ +package com.coderising.array; + +import static org.hamcrest.CoreMatchers.nullValue; + +import java.util.Arrays; + +import com.dong.week1.ArrayList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if(origin==null||origin.length==0){ + return; + } + int len = origin.length; + for(int i=0;iarray2[index2]){ + arrayList.add(array2[index2]); + index2++; + }else if(array1[index1]==array2[index2]){ + arrayList.add(array2[index2]); + index1++; + index2++; + } + else{ + arrayList.add(array1[index1]); + index1++; + } + } + if(index1==len1){ + for(int i=index2;i=max){ + break; + } + arrayList.add(third); + first = second; + second=third; + + + } + return ListToArray(arrayList); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + ArrayList arrayList = new ArrayList(); + for(int i=2;i resultAndViewMap; + public String getActioName() { + return actioName; + } + public void setActioName(String actioName) { + this.actioName = actioName; + } + @Override + public String toString() { + return "Action [actioName=" + actioName + ", className=" + className + ", resultAndViewMap=" + resultAndViewMap + + "]"; + } + public String getClassName() { + return className; + } + public void setClassName(String className) { + this.className = className; + } + public Map getResultAndViewMap() { + return resultAndViewMap; + } + public void setResultAndViewMap(Map resultAndViewMap) { + this.resultAndViewMap = resultAndViewMap; + } + + + + +} diff --git a/group16/1325756593/src/com/coderising/litestruts/LoginAction.java b/group16/1325756593/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group16/1325756593/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group16/1325756593/src/com/coderising/litestruts/Struts.java b/group16/1325756593/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..ae6289d5f0 --- /dev/null +++ b/group16/1325756593/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,246 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + + + +public class Struts { + + public static String strutsPath; + + + public static String getStrutsPath() { + return strutsPath; + } + + public static void setStrutsPath(String strutsPath) { + Struts.strutsPath = strutsPath; + } + + + + + public static View runAction(String actionName, Map parameters) throws ParserConfigurationException, SAXException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + if(strutsPath==null||strutsPath.equals("")){ + strutsPath = initStrutsPath(); + } + List actions = parseXml(strutsPath); + Action action = getAction(actions,actionName); + NotBeNull(action); + + + String actionClassName = action.getClassName(); + Class actionClass = Class.forName(actionClassName); + Object actionClassObject = actionClass.newInstance(); + + doSetterMethod(parameters, actionClass, actionClassObject); + + Method excuteMethod = actionClass.getMethod("execute", null); + String result = excuteMethod.invoke(actionClassObject, null).toString(); + String viewPath = action.getResultAndViewMap().get(result); + View view = new View(); + view.setJsp(viewPath); + Map parametersMap = doGetterMethod(actionClass, actionClassObject); + view.setParameters(parametersMap); + + return view; + } + + + /** + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + * @param actionClass + * @param actionClassObject + * @return + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + private static Map doGetterMethod(Class actionClass, Object actionClassObject) + throws IllegalAccessException, InvocationTargetException { + Map parametersMap = new HashMap<>(); + for(Method method :actionClass.getMethods()){ + if(method.getName().startsWith("get")){ + String getValue = getMethodValue(method.getName()); + parametersMap.put(getValue, method.invoke(actionClassObject, null)); + } + } + return parametersMap; + } + + /** + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + * @param parameters + * @param actionClass + * @param actionClassObject + * @throws NoSuchMethodException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + private static void doSetterMethod(Map parameters, Class actionClass, Object actionClassObject) + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + for( Map.Entry entry: parameters.entrySet()){ + String param = entry.getKey(); + Method methodKeySet = actionClass.getMethod(getMethodSet(param), String.class); + methodKeySet.invoke(actionClassObject, entry.getValue()); + } + } + + /** + * 初始化strutsPath + * @return + */ + private static String initStrutsPath() { + String path = Struts.class.getClassLoader().getResource("").getPath(); + String strutsXmlPath = path+"/com/coderising/litestruts/struts.xml"; + return strutsXmlPath; + } + + + /** + * 通过name构造setName + * @param name + * @return + */ + public static String getMethodSet(String name){ + String firstChar = name.substring(0, 1).toUpperCase(); + return "set"+firstChar+name.substring(1); + } + + /** + * 获取getMessage对应的message + * @param name + * @return + */ + public static String getMethodValue(String name){ + if(name.length()>=3){ + name = name.substring(3); + } + String firstChar = name.substring(0, 1).toLowerCase(); + return firstChar+name.substring(1); + } + + + + /** + * 将xml解析成为Action的List结构 + * @param xmlPath + * @return + * @throws ParserConfigurationException + * @throws SAXException + * @throws IOException + */ + public static List parseXml(String xmlPath) throws ParserConfigurationException, SAXException, IOException{ + List retActionList = new ArrayList<>(); + File xmlFile = new File(xmlPath); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(xmlFile); + NodeList actionLists = doc.getElementsByTagName("action"); + for(int i=0;i resultAndViewMap=getResultAndViewNodeList(currentNode); + action.setResultAndViewMap(resultAndViewMap); + retActionList.add(action); + } + return retActionList; + } + + /** + * 获取该Node对应的result和对应的jsppath + * @param currentNode + * @param resultAndViewMap + */ + private static HashMap getResultAndViewNodeList(Node currentNode) { + Map resultAndViewMap = new HashMap<>(); + NodeList resultAndViewNodeList = currentNode.getChildNodes(); + + for(int j=0;j) resultAndViewMap; + } + + + private static void NotBeNull(Object result) { + if(result==null){ + throw new IllegalArgumentException(); + } + } + + + + public static String getAttribute(Node node ,String name){ + NamedNodeMap nameNodeMap = node.getAttributes(); + NotBeNull(nameNodeMap); + Node nameNode = nameNodeMap.getNamedItem(name); + NotBeNull(nameNode); + String actionName =nameNode.getNodeValue(); + return actionName; + } + + public static Action getAction(List actions ,String actionName){ + for(Action action:actions){ + if(action.getActioName().equals(actionName)){ + return action; + } + } + return null; + + } + + + +} diff --git a/group16/1325756593/src/com/coderising/litestruts/StrutsTest.java b/group16/1325756593/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..487f05542c --- /dev/null +++ b/group16/1325756593/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,48 @@ +package com.coderising.litestruts; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.parsers.ParserConfigurationException; + +import org.junit.Assert; +import org.junit.Test; +import org.xml.sax.SAXException; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, ParserConfigurationException, SAXException, IOException { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, ParserConfigurationException, SAXException, IOException { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group16/1325756593/src/com/coderising/litestruts/View.java b/group16/1325756593/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group16/1325756593/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group16/1325756593/src/com/coderising/litestruts/struts.xml b/group16/1325756593/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group16/1325756593/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/1325756593/src/com/dong/week1/ArrayList.java b/group16/1325756593/src/com/dong/week1/ArrayList.java new file mode 100644 index 0000000000..a700aecfb5 --- /dev/null +++ b/group16/1325756593/src/com/dong/week1/ArrayList.java @@ -0,0 +1,109 @@ +package com.dong.week1; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + /** + * жǷѾˣѾݴ + */ + if(elementData.length==size){ + elementData = Arrays.copyOf(elementData, elementData.length*2+1); + } + elementData[size++]=o; + + } + public void add(int index, Object o){ + if(index >size || index < 0 ){ + throw new ArrayIndexOutOfBoundsException("Խ,ǰ鳤"+size+",Ԫص:"+index); + } + /** + * Ѿˣ + */ + if(size==elementData.length){ + elementData = Arrays.copyOf(elementData, elementData.length*2+1); + } + Object[] elementDataClone = elementData.clone(); + System.arraycopy(elementData, index, elementDataClone, index+1, size-index); + elementDataClone[index++]=o; + size++; + elementData = elementDataClone; + } + + + public Object get(int index){ + if(index >=size || index < 0 ){ + throw new ArrayIndexOutOfBoundsException("Խ,ǰ鳤"+size+",Ԫص:"+index); + } + return elementData[index]; + } + + public Object remove(int index){ + if(index >=size || index < 0 ){ + throw new ArrayIndexOutOfBoundsException("Խ,ǰ鳤"+size+",ɾԪص:"+index); + } + elementData[index]=null; + size--; + Object[] elementDataClone = elementData.clone(); + System.arraycopy(elementData, index+1, elementDataClone, index, size-index-1); + elementData = elementDataClone; + return elementData[index]; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new IteratorArrayList(this); + } + @Override + public String toString() { + return "ArrayList [size=" + size + ", elementData=" + Arrays.toString(elementData) + "]"; + } + + + private class IteratorArrayList implements Iterator{ + + private ArrayList arrayList; + private int index=0; + + + public IteratorArrayList(ArrayList arrayList) { + super(); + this.arrayList = arrayList; + } + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return this.arrayList.size() >index; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + if(hasNext()){ + return this.arrayList.get(index++); + } + return null; + } + + } + + public static void main(String[] args) { + ArrayList arrayList= new ArrayList(); + + Iterator iterator= arrayList.iterator(); + while(iterator.hasNext()){ + System.out.println(iterator.next()); + } + } + + +} diff --git a/group16/1325756593/src/com/dong/week1/ArrayListTest.java b/group16/1325756593/src/com/dong/week1/ArrayListTest.java new file mode 100644 index 0000000000..128130cfb2 --- /dev/null +++ b/group16/1325756593/src/com/dong/week1/ArrayListTest.java @@ -0,0 +1,63 @@ +package com.dong.week1; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class ArrayListTest { + + //@Test + public void testAddObject() { + ArrayList arrayList = new ArrayList(); + for(int i=0;i<=200;i++){ + arrayList.add(i); + } + System.out.println(arrayList); + } + + //@Test + public void testAddIntObject() { + ArrayList arrayList = new ArrayList(); + for(int i=0;i<=2;i++){ + arrayList.add(i); + } + arrayList.add(1,100); + arrayList.add(1, 1000); + System.out.println(arrayList); + } + +// @Test + public void testGet() { + ArrayList arrayList = new ArrayList(); + for(int i=0;i<=200;i++){ + arrayList.add(i); + } + //System.out.println(arrayList.get(-1)); + //System.out.println(arrayList.get(50)); + System.out.println(arrayList.get(200)); + //System.out.println(arrayList.get(300)); + + + } + + @Test + public void testRemove() { + ArrayList arrayList = new ArrayList(); + for(int i=0;i<=10;i++){ + arrayList.add(i); + } + arrayList.remove(1); + arrayList.remove(1); + System.out.println(arrayList); + } + +// @Test + public void testSize() { + ArrayList arrayList = new ArrayList(); + for(int i=0;i<=10;i++){ + arrayList.add(i); + } + System.out.println(arrayList.size()); + } + +} diff --git a/group16/1325756593/src/com/dong/week1/BinaryTreeNode.java b/group16/1325756593/src/com/dong/week1/BinaryTreeNode.java new file mode 100644 index 0000000000..ef41ced8df --- /dev/null +++ b/group16/1325756593/src/com/dong/week1/BinaryTreeNode.java @@ -0,0 +1,39 @@ +package com.dong.week1; + +public class BinaryTreeNode { + private TreeNode node; + + private static class TreeNode{ + private int key=0; + private TreeNode leftChild=null; + private TreeNode rightChild=null; + + public TreeNode(){} + + /** + * @param key + * @param data + */ + public TreeNode(int key){ + this.key=key; + this.leftChild=null; + this.rightChild=null; + } + + + } + + + + public TreeNode insert(TreeNode o){ + if(node == null){ + return o; + } + if(node.key > o.key){ + return insert(o.leftChild); + }else{ + return insert(node.leftChild); + } + } + +} diff --git a/group16/1325756593/src/com/dong/week1/Iterator.java b/group16/1325756593/src/com/dong/week1/Iterator.java new file mode 100644 index 0000000000..9147ab8264 --- /dev/null +++ b/group16/1325756593/src/com/dong/week1/Iterator.java @@ -0,0 +1,7 @@ +package com.dong.week1; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group16/1325756593/src/com/dong/week1/LinkedList.java b/group16/1325756593/src/com/dong/week1/LinkedList.java new file mode 100644 index 0000000000..339b5862ee --- /dev/null +++ b/group16/1325756593/src/com/dong/week1/LinkedList.java @@ -0,0 +1,208 @@ +package com.dong.week1; + +public class LinkedList implements List { + + private int size = 0; + private Node head; + private Node tail; + + + public void add(Object o){ + //һԪص߼dz򵥣ֻҪжheadǷΪաΪգֱӼӼ + Node node = new Node(o,null); + if(head ==null){ + head =node; + }else{ + tail.next=node; + } + tail=node; + size++; + + } + public void add(int index , Object o){ + if(index < 0){ + throw new ArrayIndexOutOfBoundsException("indexΪ"); + } + if(index > size){ + throw new ArrayIndexOutOfBoundsException("ǰlistΪ"+size+",ȡǣ"+index); + } + if(size==0){ + head=new Node(o, null); + tail=head; + return; + } + if(index==0){ + Node curNode =head; + Node newNode =new Node(o, curNode); + head=newNode; + return; + } + Node curNode =head; + Object retVal = null; + for(int i=0;i= size){ + throw new ArrayIndexOutOfBoundsException("ǰlistΪ"+size+",Ƴǣ"+index); + } + Node curNode = head; + for(int i=0;i= size){ + throw new ArrayIndexOutOfBoundsException("ǰlistΪ"+size+",ȡǣ"+index); + } + Object retVal = null; + if(index==0){ + retVal =head.data; + head=head.next; + return retVal; + } + Node curNode =head; + + for(int i=0;iindex; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + if(hasNext()){ + return this.list.get(index++); + } + return null; + } +} + public static void main(String[] args) { + + LinkedList arrayList= new LinkedList(); + + Iterator iterator= arrayList.iterator(); + while(iterator.hasNext()){ + System.out.println(iterator.next()); + } + +} + +} diff --git a/group16/1325756593/src/com/dong/week1/List.java b/group16/1325756593/src/com/dong/week1/List.java new file mode 100644 index 0000000000..adc694241a --- /dev/null +++ b/group16/1325756593/src/com/dong/week1/List.java @@ -0,0 +1,9 @@ +package com.dong.week1; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group16/1325756593/src/com/dong/week1/Queue.java b/group16/1325756593/src/com/dong/week1/Queue.java new file mode 100644 index 0000000000..445390a168 --- /dev/null +++ b/group16/1325756593/src/com/dong/week1/Queue.java @@ -0,0 +1,24 @@ +package com.dong.week1; + +public class Queue { + private ArrayList elementData = new ArrayList(); + + public void enQueue(Object o){ + elementData.add(elementData.size(), o); + } + + public Object deQueue(){ + if(elementData.size()==0){ + throw new IndexOutOfBoundsException("Ϊ"); + } + return elementData.remove(0); + } + + public boolean isEmpty(){ + return elementData.size()==0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group16/1325756593/src/com/dong/week1/Stack.java b/group16/1325756593/src/com/dong/week1/Stack.java new file mode 100644 index 0000000000..1dea6cdfd9 --- /dev/null +++ b/group16/1325756593/src/com/dong/week1/Stack.java @@ -0,0 +1,31 @@ +package com.dong.week1; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + + public Object pop(){ + if(elementData.size()==0){ + throw new IndexOutOfBoundsException("ջΪ"); + } + return elementData.remove(elementData.size()-1); + + } + + public Object peek(){ + if(elementData.size()==0){ + throw new IndexOutOfBoundsException("ջΪ"); + } + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size()==0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group16/1924332561/.classpath b/group16/1924332561/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group16/1924332561/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group16/1924332561/.project b/group16/1924332561/.project new file mode 100644 index 0000000000..5f960262bc --- /dev/null +++ b/group16/1924332561/.project @@ -0,0 +1,17 @@ + + + 1924332561Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group16/1924332561/.settings/org.eclipse.core.resources.prefs b/group16/1924332561/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/group16/1924332561/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/group16/1924332561/src/com/coding/basic/ArrayList.java b/group16/1924332561/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..3fc0960e08 --- /dev/null +++ b/group16/1924332561/src/com/coding/basic/ArrayList.java @@ -0,0 +1,41 @@ +package com.coding.basic; + +public class ArrayList implements List{ + private int size = 0; + + private Object[] elementDate = new Object[100]; + + + @Override + public void add(Object o) { + + this.elementDate[this.size]=o; + this.size++; + } + + @Override + public void add(int index, Object o) { + + } + + @Override + public Object get(int dex) { + + return null; + } + + @Override + public Object remove(int index) { + return null; + } + + @Override + public int size() { + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group16/1924332561/src/com/coding/basic/BinaryTreeNode.java b/group16/1924332561/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..e7d9e43e24 --- /dev/null +++ b/group16/1924332561/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +public class BinaryTreeNode { + private Object date; + private BinaryTreeNode left; + private BinaryTreeNode right; + public Object getDate() { + return date; + } + public void setDate(Object date) { + this.date = date; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } +} diff --git a/group16/1924332561/src/com/coding/basic/Iterator.java b/group16/1924332561/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e7cbd474ec --- /dev/null +++ b/group16/1924332561/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group16/1924332561/src/com/coding/basic/LinkedList.java b/group16/1924332561/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..d39557be29 --- /dev/null +++ b/group16/1924332561/src/com/coding/basic/LinkedList.java @@ -0,0 +1,62 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private static class Node{ + Object date; + Node next; + } + + private Node head; + + + @Override + public void add(Object o) { + + } + + @Override + public void add(int index, Object o) { + + } + + @Override + public Object get(int dex) { + return null; + } + + @Override + public Object remove(int index) { + return null; + } + + @Override + public int size() { + + return 0; + } + + public void addFirst(Object o){ + + } + + public void addLast(Object o){ + + } + + public Object removeFirst(){ + + return null; + } + + public Object removeLast(){ + + return null; + } + + public Iterator iterator(){ + + return null; + } + +} diff --git a/group16/1924332561/src/com/coding/basic/List.java b/group16/1924332561/src/com/coding/basic/List.java new file mode 100644 index 0000000000..d48b1f4827 --- /dev/null +++ b/group16/1924332561/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index,Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group16/1924332561/src/com/coding/basic/Queue.java b/group16/1924332561/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..7dc7b4820a --- /dev/null +++ b/group16/1924332561/src/com/coding/basic/Queue.java @@ -0,0 +1,23 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(){ + + + } + public Object deQueue(){ + + return null; + } + + public boolean isEmpty(){ + + return false; + } + + public int size(){ + + return -1; + } +} diff --git a/group16/1924332561/src/com/coding/basic/Stack.java b/group16/1924332561/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..7a49c48279 --- /dev/null +++ b/group16/1924332561/src/com/coding/basic/Stack.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementDate = new ArrayList(); + + public void push(Object o){ + + } + + public Object pop(){ + + return null; + } + + public Object peek(){ + + return null; + } + + public boolean isEmpty(){ + + return false; + } + + public int size(){ + + return -1; + } +} diff --git a/group16/214074094/readme.txt b/group16/214074094/readme.txt new file mode 100644 index 0000000000..c1b06ddcc2 --- /dev/null +++ b/group16/214074094/readme.txt @@ -0,0 +1 @@ +I am 北京-Shane diff --git a/group16/214074094/src/main/java/study/coderising/array/ArrayUtil.java b/group16/214074094/src/main/java/study/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..812e167576 --- /dev/null +++ b/group16/214074094/src/main/java/study/coderising/array/ArrayUtil.java @@ -0,0 +1,213 @@ +package study.coderising.array; + + +import study.coding.basic.ArrayList; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static void reverseArray(int[] origin) { + int tmp; + for (int i = 0; i < origin.length / 2; i++) { + tmp = origin[i]; + origin[i] = origin[origin.length - i - 1]; + origin[origin.length - i - 1] = tmp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + int[] newArray = new int[oldArray.length]; + int k = 0; + for (int i = 0; i < oldArray.length; i++) { + if (0 != oldArray[i]) { + newArray[k++] = oldArray[i]; + } + } + return Arrays.copyOf(newArray, k); + } + + /** + * 给定两个已经排序好的整形数组,a1和a2,创建一个新的数组a3,使得a3包含a1和a2的所有元素,并且仍然是有序的 + * 例如 a1 = {3, 5, 7, 8},a2 = {4, 5, 6, 7},则 a3 为[3,4,5,6,7,8],注意:已经消除了重复 + * + * @param a1 + * @param a2 + * @return + */ + + public static int[] merge(int[] a1, int[] a2) { + Set set = new HashSet(); + + for (int i = 0; i < a1.length + a2.length; i++) { + if (i < a1.length) { + set.add(a1[i]); + } else { + set.add(a2[i - a1.length]); + } + } + + int[] a3 = new int[set.size()]; + + Iterator it = set.iterator(); + int i = 0; + while (it.hasNext()) { + a3[i++] = (Integer) it.next(); + } + return a3; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + return Arrays.copyOf(oldArray, oldArray.length + size); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max == 1) { + return new int[0]; + } + ArrayList list = new ArrayList(); + list.add(1); + list.add(1); + for (int i = 0; ; i++) { + int tmp = list.get(i) + list.get(i + 1); + if (tmp >= max) { + break; + } + list.add(i + 2, tmp); + } + + return convertIntegerArray2Int(list); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + if (max < 2) { + return null; + } + ArrayList list = new ArrayList<>(); + for (int i = 2; i < max; i++) { + if (isPrime(i)) { + list.add(i); + } + } + return convertIntegerArray2Int(list); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + if (max < 2) { + return null; + } + ArrayList list = new ArrayList<>(); + + int count = 0; + //如果p是质数,且2^p-1也是质数,那么(2^p-1)X2^(p-1)便是一个完全数 + for (int i = 2; i <= max / 2; i++) { + count++; + if (isPrime(i) && isPrime((int) Math.pow(2, i) - 1)) { + System.out.println("count " + i + ":" + (int) (Math.pow(2, i) - 1) + " * " + (int) Math.pow(2, (i - 1))); + int perfectNum = (int) ((Math.pow(2, i) - 1) * Math.pow(2, (i - 1))); + if (perfectNum > max) { + break; + } + if (perfectNum < max) { + list.add(perfectNum); + } + } + } + System.out.println("total count : " + count); + return convertIntegerArray2Int(list); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public static String join(int[] array, String seperator) { + if (null == array || array.length < 1) { + return null; + } + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]).append(seperator); + } + return sb.substring(0, sb.length() - 1); + } + + private static boolean isPrime(int n) { + if (n == 2) { + return true; + } + for (int j = 2; j <= Math.sqrt(n); j++) { + if (n % j == 0) { + return false; + } + } + return true; + } + + private static int[] convertIntegerArray2Int(ArrayList list) { + int[] arr = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + arr[i] = list.get(i).intValue(); + } + return arr; + } + + +} diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/LoginAction.java b/group16/214074094/src/main/java/study/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..0073661631 --- /dev/null +++ b/group16/214074094/src/main/java/study/coderising/litestruts/LoginAction.java @@ -0,0 +1,42 @@ +package study.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + */ +public class LoginAction { + + private String name; + private String password; + private String message; + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/LogoutAction.java b/group16/214074094/src/main/java/study/coderising/litestruts/LogoutAction.java new file mode 100644 index 0000000000..e3a10a6726 --- /dev/null +++ b/group16/214074094/src/main/java/study/coderising/litestruts/LogoutAction.java @@ -0,0 +1,39 @@ +package study.coderising.litestruts; + +/** + * @Author shane + * @Time 2017/3/4 12:13 + * @Email stevenchenguang@gmail.com + * @Desc ... + */ +public class LogoutAction { + + private String name; + + private String message; + + public String execute() { + if ("test".equalsIgnoreCase(name)) { + message = name + " logout success"; + return "success"; + } + message = name + " logout fail"; + return "error"; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/Struts.java b/group16/214074094/src/main/java/study/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..3529341620 --- /dev/null +++ b/group16/214074094/src/main/java/study/coderising/litestruts/Struts.java @@ -0,0 +1,147 @@ +package study.coderising.litestruts; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import study.coderising.litestruts.bean.Action; +import study.coderising.litestruts.bean.Result; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; + + +public class Struts { + + private static final String EXECUTE = "execute"; + + public static View runAction(String actionName, Map parameters) + throws DocumentException, ClassNotFoundException, NoSuchMethodException, + InvocationTargetException, IllegalAccessException, InstantiationException { + + //0. 读取配置文件struts.xml + SAXReader reader = new SAXReader(); + Document doc = reader.read("./src/main/resources/struts.xml"); + Element root = doc.getRootElement(); + Action action = getAction(actionName, root); + + //1. 根据actionName找到相对应的class + Class clz = Class.forName(action.getClassPath()); + //获取一个实例,方便接下来对同一个对象赋值 + Object obj = clz.newInstance(); + + //1.1 据parameters中的数据,调用对象的setter方法 + for (Map.Entry entry : parameters.entrySet()) { + String setFunctionName = getFunctionName("set", entry.getKey()); + Method set = clz.getDeclaredMethod(setFunctionName, String.class); + set.invoke(obj, entry.getValue()); + } + + //2. 通过反射调用对象的exectue方法, 并获得返回值 + Method execute = clz.getDeclaredMethod(EXECUTE); + String response = execute.invoke(obj).toString(); + + //3. 通过反射找到对象的所有getter方法并调用, 把值和属性形成一个HashMap + Method[] methods = clz.getDeclaredMethods(); + Map map = new HashMap<>(); + for (Method m : methods) { + if (m.getName().startsWith("get")) { + String paramName = m.getName().replaceFirst("get", ""); + map.put(paramName.toLowerCase(), m.invoke(obj)); + } + } + + //3.1 放到View对象的parameters + View view = new View(); + view.setParameters(map); + + //4. 根据struts.xml中的配置,以及execute的返回值,确定jsp,放到View对象的jsp字段中。 + for (Result result : action.getResults()) { + if (response.equalsIgnoreCase(result.getResult())) { + view.setJsp(result.getJumpPath()); + break; + } + } + + return view; + } + + /** + * @Author: shane + * @Time: 2017/3/4 23:53 + * @Email: stevenchenguang@gmail.com + * @param: begin, key + * @Return: String + * @Throw: + * @Desc: 根据开始名称和key获取方法名 + * e.g.: begin: get, key: name, return getName + */ + private static String getFunctionName(String begin, String key) { + if (key == null || "".equals(key)) { + return null; + } + StringBuffer sb = new StringBuffer(begin); + if (key.length() < 2) { + sb.append(key.toUpperCase()); + } else { + String first = String.valueOf(key.charAt(0)); + sb.append(first.toUpperCase()); + sb.append(key.substring(1, key.length())); + } + return sb.toString(); + } + + /** + * @Author: shane + * @Time: 2017/3/4 23:55 + * @Email: stevenchenguang@gmail.com + * @param: actionName, node + * @Return: Action + * @Throw: + * @Desc: 根据actionName和xml节点获取Action + */ + private static Action getAction(String actionName, Element node) { + Action action = new Action(); + + Iterator iterator = node.elementIterator(); + boolean flag = false; + while (iterator.hasNext()) { + Element e = iterator.next(); + List list = e.attributes(); + + //遍历属性节点 + for (Attribute attr : list) { + if ("name".equalsIgnoreCase(attr.getName())) { + if (!actionName.equalsIgnoreCase(attr.getValue())) { + continue; + } else { + flag = true; + } + action.setName(attr.getValue()); + } + if ("class".equalsIgnoreCase(attr.getName())) { + action.setClassPath(attr.getValue()); + } + + List results = new ArrayList<>(); + + Iterator it = e.elementIterator(); + while (it.hasNext()) { + Result result = new Result(); + Element el = it.next(); + result.setResult(el.attribute(0).getValue()); + result.setJumpPath(el.getText()); + results.add(result); + } + action.setResults(results); + } + if (flag) { + break; + } + } + return action; + } + +} diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/StrutsTest.java b/group16/214074094/src/main/java/study/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..f5fc6e8a40 --- /dev/null +++ b/group16/214074094/src/main/java/study/coderising/litestruts/StrutsTest.java @@ -0,0 +1,109 @@ +package study.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); //密码和预设的不一致 + + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + + @Test + public void testLogoutSuccess() { + String actionName = "logout"; + + Map params = new HashMap(); + params.put("name", "test"); + + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + + Assert.assertEquals("/jsp/welcome.jsp", view.getJsp()); + Assert.assertEquals("test logout success", view.getParameters().get("message")); + } + + @Test + public void testLogoutFail() { + String actionName = "logout"; + + Map params = new HashMap(); + params.put("name", "unknownUser"); + + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + + Assert.assertEquals("/jsp/error.jsp", view.getJsp()); + Assert.assertEquals("unknownUser logout fail", view.getParameters().get("message")); + } +} diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/View.java b/group16/214074094/src/main/java/study/coderising/litestruts/View.java new file mode 100644 index 0000000000..3b1da16be8 --- /dev/null +++ b/group16/214074094/src/main/java/study/coderising/litestruts/View.java @@ -0,0 +1,27 @@ +package study.coderising.litestruts; + +import java.util.Map; + +public class View { + + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/bean/Action.java b/group16/214074094/src/main/java/study/coderising/litestruts/bean/Action.java new file mode 100644 index 0000000000..12aa461cfc --- /dev/null +++ b/group16/214074094/src/main/java/study/coderising/litestruts/bean/Action.java @@ -0,0 +1,43 @@ +package study.coderising.litestruts.bean; + + +import java.util.List; + +/** + * @Author shane + * @Time 2017/3/4 21:49 + * @Email shanbaohua@lxfintech.com + * @Desc ... + */ +public class Action { + + private String name; + + private String classPath; + + private List results; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassPath() { + return classPath; + } + + public void setClassPath(String classPath) { + this.classPath = classPath; + } + + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } +} diff --git a/group16/214074094/src/main/java/study/coderising/litestruts/bean/Result.java b/group16/214074094/src/main/java/study/coderising/litestruts/bean/Result.java new file mode 100644 index 0000000000..649844ff31 --- /dev/null +++ b/group16/214074094/src/main/java/study/coderising/litestruts/bean/Result.java @@ -0,0 +1,30 @@ +package study.coderising.litestruts.bean; + +/** + * @Author shane + * @Time 2017/3/4 21:50 + * @Email shanbaohua@lxfintech.com + * @Desc ... + */ +public class Result { + + private String result; + + private String jumpPath; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public String getJumpPath() { + return jumpPath; + } + + public void setJumpPath(String jumpPath) { + this.jumpPath = jumpPath; + } +} diff --git a/group16/214074094/src/main/java/study/coding/basic/ArrayList.java b/group16/214074094/src/main/java/study/coding/basic/ArrayList.java new file mode 100644 index 0000000000..ebe04dd177 --- /dev/null +++ b/group16/214074094/src/main/java/study/coding/basic/ArrayList.java @@ -0,0 +1,170 @@ +package study.coding.basic; + + +import java.util.Arrays; +import java.util.NoSuchElementException; + +/** + * @Author shane + * @Time 2017/2/25 13:06 + * @Email stevenchenguang@gmail.com + * @Desc OwnArrayList + */ +public class ArrayList implements List { + + private int size = 0; + + private final static Object[] EMPTY_ELEMENTDATA = {}; + + /** + * 默认容量 + */ + private static int DEFAULT_CAPACITY = 10; + + private Object[] elementData; + + public ArrayList() { + this.elementData = EMPTY_ELEMENTDATA; + } + + @Override + public void add(E e) { + if (elementData == EMPTY_ELEMENTDATA) { + elementData = Arrays.copyOf(elementData, DEFAULT_CAPACITY); + elementData[0] = e; + } else if (size < elementData.length) { + elementData[size] = e; + } else { + _grow(); + elementData[size] = e; + } + size++; + _analyze(); + } + + @Override + public void add(int index, E e) { + if (index < 0) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } + if (elementData == EMPTY_ELEMENTDATA) { + if (index != 0) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } else { + elementData = new Object[DEFAULT_CAPACITY]; + elementData[0] = e; + } + } else if (index > size) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } else if (index == size) { + _grow(); + elementData[size] = e; + size++; + } else { + if (elementData.length == size) { + _grow(); + } + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = e; + size++; + } + _analyze(); + } + + @Override + public E get(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } + return (E) elementData[index]; + } + + @Override + public E remove(int index) { + + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } + E oldValue = (E) elementData[index]; + //需要复制的长度 + int needMoveLength = size - index - 1; + //如果该长度小于0, 说明只有一个元素, 直接置空即可 + if (needMoveLength > 0) { + System.arraycopy(elementData, index + 1, elementData, index, needMoveLength); + } + elementData[--size] = null; + _analyze(); + return oldValue; + } + + @Override + public int size() { + return size; + } + + @Override + public E[] toArray() { + return (E[]) elementData; + } + + public Iterator iterator() { + return new ArrayListItrator(); + } + + /** + * @Author: shane + * @Time: 2017/2/25 20:18 + * @Email: stevenchenguang@gmail.com + * @param: + * @Return: + * @Throw: + * @Desc: 返回真实长度的数组数据 + */ + private void _analyze() { + if (size < elementData.length) { + elementData = Arrays.copyOf(elementData, size); + } + } + + /** + * @Author: shane + * @Time: 2017/2/25 20:19 + * @Email: stevenchenguang@gmail.com + * @param: + * @Return: + * @Throw: + * @Desc: 将数组的长度扩容至2倍 + */ + private void _grow() { + elementData = Arrays.copyOf(elementData, elementData.length << 1); + } + + @Override + public String toString() { + return Arrays.toString(elementData); + } + + public boolean isEmpty() { + return size == 0; + } + + private class ArrayListItrator implements Iterator { + + private int position = 0; + + @Override + public boolean hasNext() { + return position != size; + } + + @Override + public Object next() { + int i = position; + if (i >= size) { + throw new NoSuchElementException(); + } + position = i + 1; + return elementData[i]; + } + } +} diff --git a/group16/214074094/src/main/java/study/coding/basic/BinaryTreeNode.java b/group16/214074094/src/main/java/study/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..4eae81c97a --- /dev/null +++ b/group16/214074094/src/main/java/study/coding/basic/BinaryTreeNode.java @@ -0,0 +1,95 @@ +package study.coding.basic; + +/** + * @Author shane + * @Time 2017/2/26 19:30 + * @Email stevenchenguang@gmail.com + * @Desc Own BinaryTreeNode + */ +public class BinaryTreeNode { + + private Object data; + + private BinaryTreeNode left; + + private BinaryTreeNode right; + + public BinaryTreeNode insert(Object o) { + if (null == data) { + data = o; + return this; + } + if (bigger(data, o)) { + if (null == left) { + left = new BinaryTreeNode(); + left.data = o; + } else { + left.insert(o); + } + } else if (smaller(data, o)) { + if (null == right) { + right = new BinaryTreeNode(); + right.data = o; + } else { + right.insert(o); + } + } else { + throw new RuntimeException("The value has exists"); + } + return this; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + private boolean bigger(Object data1, Object data2) { + return data1.toString().compareTo(data2.toString()) > 0; + } + + private boolean smaller(Object data1, Object data2) { + return data1.toString().compareTo(data2.toString()) < 0; + } + + private ArrayList list = new ArrayList(); + + /** + * 对二叉树进行遍历 结果存储到list中 + */ + private void sort(BinaryTreeNode node) { + + list.add(node.data); + if(null != node.left){ + sort(node.left); + } + if(null != node.right){ + sort(node.right); + } + } + + @Override + public String toString() { + sort(this); + return list.toString(); + } +} diff --git a/group16/214074094/src/main/java/study/coding/basic/Iterator.java b/group16/214074094/src/main/java/study/coding/basic/Iterator.java new file mode 100644 index 0000000000..0befe6a209 --- /dev/null +++ b/group16/214074094/src/main/java/study/coding/basic/Iterator.java @@ -0,0 +1,9 @@ +package study.coding.basic; + +public interface Iterator { + + boolean hasNext(); + + Object next(); + +} diff --git a/group16/214074094/src/main/java/study/coding/basic/LinkedList.java b/group16/214074094/src/main/java/study/coding/basic/LinkedList.java new file mode 100644 index 0000000000..b6fede6824 --- /dev/null +++ b/group16/214074094/src/main/java/study/coding/basic/LinkedList.java @@ -0,0 +1,228 @@ +package study.coding.basic; + +/** + * @Author shane + * @Time 2017/2/25 21:01 + * @Email stevenchenguang@gmail.com + * @Desc OwnLinkedList + */ +public class LinkedList implements List { + + private int size = 0; + + private Node first; + + private Node last; + + public void add(Object o) { + if (size == 0) { + first = new Node(null, o, null); + last = first; + size++; + } else { + addLast(o); + } + } + + public void add(int index, Object o) { + _checkIndex(index); + if (index == size - 1) { + addLast(o); + } else { + Node prev = _node(index); + Node next = _node(index + 1); + Node newNode = new Node(prev, o, next); + prev.next = newNode; + next.prev = newNode; + size++; + } + } + + public Object get(int index) { + _checkIndex(index); + return node(index); + } + + public Object remove(int index) { + _checkIndex(index); + if (index == 0) { + return removeFirst(); + } else if (index == size - 1) { + return removeLast(); + } + + Node curr = _node(index); + Object data = curr.data; + final Node prev = curr.prev; + final Node next = curr.next; + + prev.next = next; + next.prev = prev; + curr = null; + size--; + + return data; + } + + private Object removeFirst() { + Node oldFirst = first; + Object data = first.data; + final Node oldSecond = oldFirst.next; + if (null == oldSecond) { + first = null; + last = null; + } else { + oldSecond.prev = null; + first = oldSecond; + oldFirst = null; + } + size--; + return data; + } + + private Object removeLast() { + Node oldLast = last; + Object data = last.data; + final Node oldLastButOne = last.prev; + if (null == oldLastButOne) { + first = null; + last = null; + } else { + oldLastButOne.next = null; + last = oldLastButOne; + oldLast = null; + } + size--; + return data; + } + + public void addFirst(Object o) { + final Node oldFirst = first; + final Node param = new Node(null, o, null); + if (null == oldFirst) { + first = param; + } else { + oldFirst.prev = param; + param.next = oldFirst; + first = param; + } + size++; + } + + public void addLast(Object o) { + final Node n = last; + final Node newNode = new Node(n, o, null); + last = newNode; + n.next = newNode; + size++; + } + + public int size() { + return size; + } + + @Override + public Object[] toArray() { + return new Object[0]; + } + + public Iterator iterator() { + return null; + } + + public boolean isEmpty() { + return size == 0; + } + + private static class Node { + Node prev; + Object data; + Node next; + + public Node(Node prev, Object data, Node next) { + this.prev = prev; + this.data = data; + this.next = next; + } + } + + /** + * @Author: shane + * @Time: 2017/2/25 22:44 + * @Email: stevenchenguang@gmail.com + * @param: int index + * @Return: Node + * @Throw: + * @Desc: 根据下标获取节点元素上的数据 + */ + private Object node(int index) { + //如果下标在左一半, 从左往右取 + if (index < size >> 1) { + Node tmp = first; + for (int i = 0; i < index; i++) { + tmp = tmp.next; + } + return tmp.data; + } else { + Node tmp = last; + for (int i = size - 1; i > index; i--) { + tmp = tmp.prev; + } + return tmp.data; + } + } + + /** + * @Author: shane + * @Time: 2017/2/25 22:44 + * @Email: stevenchenguang@gmail.com + * @param: int index + * @Return: Node + * @Throw: + * @Desc: 根据下标获取节点元素 + */ + private Node _node(int index) { + //如果下标在左一半, 从左往右取 + if (index < size >> 1) { + Node tmp = first; + for (int i = 0; i < index; i++) { + tmp = tmp.next; + } + return tmp; + } else { + Node tmp = last; + for (int i = size - 1; i > index; i--) { + tmp = tmp.prev; + } + return tmp; + } + } + + /** + * @Author: shane + * @Time: 2017/2/25 22:43 + * @Email: stevenchenguang@gmail.com + * @param: int index + * @Return: + * @Throw: IndexOutOfBoundsException + * @Desc: 校验下标是否合法 + */ + private void _checkIndex(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); + } + } + + @Override + public String toString() { + if (0 == size) { + return "[]"; + } + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < this.size; i++) { + sb.append(get(i)).append(", "); + } + String tmp = sb.substring(0, sb.length() - 2); + return "[" + tmp + "]"; + } +} \ No newline at end of file diff --git a/group16/214074094/src/main/java/study/coding/basic/List.java b/group16/214074094/src/main/java/study/coding/basic/List.java new file mode 100644 index 0000000000..e62dd86d52 --- /dev/null +++ b/group16/214074094/src/main/java/study/coding/basic/List.java @@ -0,0 +1,16 @@ +package study.coding.basic; + +public interface List { + + void add(E e); + + void add(int index, E e); + + E get(int index); + + E remove(int index); + + int size(); + + E[] toArray(); +} diff --git a/group16/214074094/src/main/java/study/coding/basic/Queue.java b/group16/214074094/src/main/java/study/coding/basic/Queue.java new file mode 100644 index 0000000000..b15950ac36 --- /dev/null +++ b/group16/214074094/src/main/java/study/coding/basic/Queue.java @@ -0,0 +1,36 @@ +package study.coding.basic; + +/** + * @Author shane + * @Time 2017/2/26 17:19 + * @Email stevenchenguang@gmail.com + * @Desc Own Queue + */ +public class Queue { + + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o) { + elementData.add(o); + } + + public Object deQueue() { + if (isEmpty()) { + throw new RuntimeException("Queue is empty"); + } + return elementData.remove(0); + } + + public boolean isEmpty() { + return elementData.isEmpty(); + } + + public int size() { + return elementData.size(); + } + + @Override + public String toString() { + return elementData.toString(); + } +} diff --git a/group16/214074094/src/main/java/study/coding/basic/Stack.java b/group16/214074094/src/main/java/study/coding/basic/Stack.java new file mode 100644 index 0000000000..188de74ee9 --- /dev/null +++ b/group16/214074094/src/main/java/study/coding/basic/Stack.java @@ -0,0 +1,37 @@ +package study.coding.basic; + +/** + * @Author shane + * @Time 2017/2/26 16:55 + * @Email stevenchenguang@gmail.com + * @Desc Own Stack + */ +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + return elementData.remove(elementData.size() - 1); + } + + public Object peek() { + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.isEmpty(); + } + + public int size() { + return elementData.size(); + } + + @Override + public String toString() { + return elementData.toString(); + } +} diff --git a/group16/214074094/src/main/java/study/reading/blog.txt b/group16/214074094/src/main/java/study/reading/blog.txt new file mode 100644 index 0000000000..f112f8ea6a --- /dev/null +++ b/group16/214074094/src/main/java/study/reading/blog.txt @@ -0,0 +1 @@ +学习-CPU、内存、硬盘、指令及它们之间的关系: https://stevenshane.github.io/study/2017/02/27/coding2017-reading.html \ No newline at end of file diff --git a/group16/214074094/src/main/resources/struts.xml b/group16/214074094/src/main/resources/struts.xml new file mode 100644 index 0000000000..4a65db6709 --- /dev/null +++ b/group16/214074094/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/214074094/src/test/java/study/AbstractTest.java b/group16/214074094/src/test/java/study/AbstractTest.java new file mode 100644 index 0000000000..42737e270f --- /dev/null +++ b/group16/214074094/src/test/java/study/AbstractTest.java @@ -0,0 +1,24 @@ +package study; + +import com.alibaba.fastjson.JSON; + +/** + * @Author shane + * @Time 2017/2/25 13:06 + * @Email stevenchenguang@gmail.com + * @Desc 测试基类 + */ +public class AbstractTest { + + protected void printStar() { + System.out.println("********************************************"); + } + + protected void printHyphen() { + System.out.println("--------------------------------------------"); + } + + protected void printJson(Object obj) { + System.out.println(JSON.toJSONString(obj)); + } +} diff --git a/group16/214074094/src/test/java/study/coderising/ArrayUtilTest.java b/group16/214074094/src/test/java/study/coderising/ArrayUtilTest.java new file mode 100644 index 0000000000..24cdeadb64 --- /dev/null +++ b/group16/214074094/src/test/java/study/coderising/ArrayUtilTest.java @@ -0,0 +1,82 @@ +package study.coderising; + +import org.junit.Assert; +import org.junit.Test; +import study.AbstractTest; +import study.coderising.array.ArrayUtil; + +/** + * @Author shane + * @Time 2017/3/1 20:29 + * @Email shanbaohua@lxfintech.com + * @Desc ... + */ +public class ArrayUtilTest extends AbstractTest { + + @Test + public void testReverseArray(){ + int[] a = {7, 9 , 30, 3}; + printJson(a); + ArrayUtil.reverseArray(a); + printJson(a); + } + + @Test + public void testremoveZero(){ + int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int newArr[] = ArrayUtil.removeZero(oldArr); + printJson(oldArr); + printJson(newArr); + } + + @Test + public void testMerge(){ + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + + int[] a3 = ArrayUtil.merge(a1, a2); + printJson(a1); + printJson(a2); + printJson(a3); + } + + @Test + public void testGrow(){ + int[] oldArray = {2,3,6}; + printJson(oldArray); + int[] newArray = ArrayUtil.grow(oldArray, 3); + printJson(newArray); + } + + @Test + public void testFibonacci(){ + int[] onlyOne = {}; + int[] before15 = {1, 1, 2, 3, 5, 8, 13}; + int[] before21 = {1, 1, 2, 3, 5, 8, 13}; + Assert.assertArrayEquals(onlyOne, ArrayUtil.fibonacci(1)); + Assert.assertArrayEquals(before15, ArrayUtil.fibonacci(15)); + Assert.assertArrayEquals(before21, ArrayUtil.fibonacci(21)); + } + + @Test + public void testGetPrimes(){ + int[] _19 = {2,3,5,7,11,13,17,19}; + Assert.assertArrayEquals(_19, ArrayUtil.getPrimes(23)); + int[] _32 = {2,3,5,7,11,13,17,19,23,29,31}; + Assert.assertArrayEquals(_32, ArrayUtil.getPrimes(32)); + } + + @Test + public void testGetPerfectNumbers(){ + int[] arr = {6,28,496,8128,33550336}; + Assert.assertArrayEquals(arr, ArrayUtil.getPerfectNumbers(33550337)); + } + + @Test + public void testJoin(){ + int[] arr = {3,8,9}; + String seperator = "-"; + Assert.assertEquals("3-8-9", ArrayUtil.join(arr, seperator)); + } + +} diff --git a/group16/214074094/src/test/java/study/coding/basic/ArrayListTest.java b/group16/214074094/src/test/java/study/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..6ffe2e5715 --- /dev/null +++ b/group16/214074094/src/test/java/study/coding/basic/ArrayListTest.java @@ -0,0 +1,82 @@ +package study.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import study.AbstractTest; + +/** + * @Author shane + * @Time 2017/2/25 13:02 + * @Email stevenchenguang@gmail.com + * @Desc ... + */ + +public class ArrayListTest extends AbstractTest { + + private static ArrayList list; + + @Before + public void before() { + + list = new ArrayList(); + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + list.add("e"); + + printStar(); + System.out.println("Before Test data :" + list); + printHyphen(); + } + + @After + public void after() { + printHyphen(); + System.out.println("After Test data : " + list); + printStar(); + } + + @Test + public void testAddI() { + int index = list.size(); + list.add(index, "test add i"); + Assert.assertEquals(list.get(index), "test add i"); + } + + @Test + public void test() { + java.util.ArrayList list = new java.util.ArrayList(); + list.add("a"); + list.add("b"); + java.util.Iterator it = list.iterator(); + while (it.hasNext()) { + + } + System.out.println(it.next()); + System.out.println(it.next()); + System.out.println(it.next()); + } + + @Test + public void testSize() { + Assert.assertEquals(5, list.size()); + } + + @Test + public void testRemove() { + list.remove(5); + Assert.assertEquals(list.get(3), "d"); + } + + @Test + public void testIterator() { + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } + +} diff --git a/group16/214074094/src/test/java/study/coding/basic/BinaryTreeNodeTest.java b/group16/214074094/src/test/java/study/coding/basic/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..370b339434 --- /dev/null +++ b/group16/214074094/src/test/java/study/coding/basic/BinaryTreeNodeTest.java @@ -0,0 +1,33 @@ +package study.coding.basic; + +import org.junit.Test; +import study.AbstractTest; + +/** + * @Author shane + * @Time 2017/2/26 19:57 + * @Email shanbaohua@lxfintech.com + * @Desc ... + */ +public class BinaryTreeNodeTest extends AbstractTest { + + @Test + public void test(){ + BinaryTreeNode node = new BinaryTreeNode(); + node.insert(8); + node.insert(5); + node.insert(9); + node.insert(1); + node.insert(6); + node.insert(11); + node.insert(10); + node.insert(15); + node.insert(13); + node.insert(19); + + printStar(); + System.out.println(node.getData()); + System.out.println(node); + printStar(); + } +} diff --git a/group16/214074094/src/test/java/study/coding/basic/LinkedListTest.java b/group16/214074094/src/test/java/study/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..f22d1cc611 --- /dev/null +++ b/group16/214074094/src/test/java/study/coding/basic/LinkedListTest.java @@ -0,0 +1,64 @@ +package study.coding.basic; + +import junit.framework.Assert; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import study.AbstractTest; + +/** + * @Author shane + * @Time 2017/2/25 23:32 + * @Email stevenchenguang@gmail.com + * @Desc ... + */ +public class LinkedListTest extends AbstractTest { + + private static LinkedList list; + + @Before + public void before() { + list = new LinkedList(); + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + list.add("e"); + + printStar(); + System.out.println("Before Test data :" + list); + printHyphen(); + } + + @After + public void after() { + printHyphen(); + System.out.println("After Test data : " + list); + printStar(); + } + + @Test + public void testAddIndex() { + list.add(0, "after a"); + Assert.assertEquals("after a", list.get(1)); + + list.add(3, "after c"); + Assert.assertEquals("after c", list.get(4)); + + list.add(6, "after e"); + Assert.assertEquals("after e", list.get(7)); + } + + @Test + public void testRemove() { + list.remove(0); + Assert.assertEquals("b", list.get(0)); + + list.remove(list.size() - 1); + Assert.assertEquals("d", list.get(list.size() - 1)); + + Object obj = list.remove(1); + Assert.assertEquals("c", obj); + Assert.assertEquals(2, list.size()); + } +} diff --git a/group16/214074094/src/test/java/study/coding/basic/QueueTest.java b/group16/214074094/src/test/java/study/coding/basic/QueueTest.java new file mode 100644 index 0000000000..cdfe5c95ab --- /dev/null +++ b/group16/214074094/src/test/java/study/coding/basic/QueueTest.java @@ -0,0 +1,63 @@ +package study.coding.basic; + +import junit.framework.Assert; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import study.AbstractTest; + +/** + * @Author shane + * @Time 2017/2/26 17:24 + * @Email stevenchenguang@gmail.com + * @Desc ... + */ +public class QueueTest extends AbstractTest { + + private static Queue queue; + + @Before + public void before() { + queue = new Queue(); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + printStar(); + System.out.println("Before Test data :" + queue); + printHyphen(); + } + + @After + public void after() { + printHyphen(); + System.out.println("After Test data : " + queue); + printStar(); + } + + @Test + public void testDeQueueAndIsEmpty() { + Assert.assertEquals("a", queue.deQueue()); + + queue.deQueue(); + queue.deQueue(); + queue.deQueue(); + queue.deQueue(); + + Assert.assertEquals(true, queue.isEmpty()); + + try { + queue.deQueue(); + } catch (RuntimeException e) { + Assert.assertEquals("Queue is empty", e.getMessage()); + } + } + + @Test + public void testSize() { + Assert.assertEquals(5, queue.size()); + } +} diff --git a/group16/214074094/src/test/java/study/coding/basic/StackTest.java b/group16/214074094/src/test/java/study/coding/basic/StackTest.java new file mode 100644 index 0000000000..8269967dff --- /dev/null +++ b/group16/214074094/src/test/java/study/coding/basic/StackTest.java @@ -0,0 +1,69 @@ +package study.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import study.AbstractTest; + +/** + * @Author shane + * @Time 2017/2/26 16:58 + * @Email stevenchenguang@gmail.com + * @Desc ... + */ +public class StackTest extends AbstractTest { + + private static Stack stack; + + @Before + public void before() { + stack = new Stack(); + + stack.push("a"); + stack.push("b"); + stack.push("c"); + stack.push("d"); + stack.push("e"); + + printStar(); + System.out.println("Before Test data :" + stack); + printHyphen(); + } + + @After + public void after() { + printHyphen(); + System.out.println("After Test data : " + stack); + printStar(); + } + + @Test + public void testPop() { + Assert.assertEquals("e", stack.pop()); + } + + @Test + public void testPeek() { + Assert.assertEquals("e", stack.peek()); + } + + @Test + public void testIsEmpty() { + Assert.assertEquals(false, stack.isEmpty()); + + stack.pop(); + stack.pop(); + stack.pop(); + stack.pop(); + stack.pop(); + + Assert.assertEquals(true, stack.isEmpty()); + } + + @Test + public void testSize() { + Assert.assertEquals(5, stack.size()); + } + +} diff --git a/group16/2562124714/src/Test/ArrayListTest.java b/group16/2562124714/src/Test/ArrayListTest.java new file mode 100644 index 0000000000..9bd8f2aeca --- /dev/null +++ b/group16/2562124714/src/Test/ArrayListTest.java @@ -0,0 +1,70 @@ +package Test; + +import com.coding.basic.ArrayList; +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by zhangwj on 2017/2/23. + */ +public class ArrayListTest { + private static ArrayList arraylist = new ArrayList(); + @BeforeClass + public static void setUp() throws Exception { + + System.out.println("初始化变量"); + for (Integer i = 0; i < 5; i++) + { + arraylist.add(i); + } + + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void add() throws Exception { + Integer i = arraylist.size(); + Integer AddElement = 999; + arraylist.add(AddElement); + assertEquals(i + 1, arraylist.size()); + assertEquals(AddElement, arraylist.get(arraylist.size())); + arraylist.remove(arraylist.size()); + } + + @Test + public void add1() throws Exception { + Integer AddElement = 999; + arraylist.add(1, AddElement); + assertEquals(AddElement, arraylist.get(1)); + arraylist.remove(1); + } + + @Test + public void get() throws Exception { + assertEquals(null, arraylist.get(9999)); + } + + @Test + public void remove() throws Exception { + Integer i = (Integer)arraylist.get(1); + assertEquals(i, arraylist.remove(1)); + arraylist.add(1, i); + + } + + @Test + public void size() throws Exception { + assertEquals(5, arraylist.size()); + + } + +} \ No newline at end of file diff --git a/group16/2562124714/src/Test/BinaryTreeNodeTest.java b/group16/2562124714/src/Test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..7d8f4fdd01 --- /dev/null +++ b/group16/2562124714/src/Test/BinaryTreeNodeTest.java @@ -0,0 +1,100 @@ +package Test; + +import com.coding.basic.BinaryTreeNode; +import com.coding.basic.TreeData; +import com.sun.org.apache.bcel.internal.generic.NEW; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by zhangwj on 2017/2/23. + */ +public class BinaryTreeNodeTest { + private BinaryTreeNode binaryTree = new BinaryTreeNode(); + @Before + public void setUp() throws Exception { + //System.out.println("初始化二叉树,5, 4, 7"); + TreeData element = new TreeData(); + element.setT((Integer)5); + binaryTree.insert(element); + TreeData element2 = new TreeData(); + element2.setT((Integer)4); + binaryTree.insert(element2); + TreeData element3 = new TreeData(); + element3.setT((Integer)7); + binaryTree.insert(element3); +// binaryTree.PriOder(this.binaryTree); + } + + @Test + public void getData() throws Exception { + assertEquals(5, binaryTree.getData().getT()); + + } + + @Test + public void setData() throws Exception { + TreeData element = new TreeData(); + element.setT(6); + binaryTree.setData(element); + assertEquals(6, binaryTree.getData().getT()); +// binaryTree.PriOder(this.binaryTree); + + } + + @Test + public void getLeft() throws Exception { + assertEquals(4, binaryTree.getLeft().getData().getT()); + + } + + @Test + public void setLeft() throws Exception { + TreeData element = new TreeData(); + element.setT(2); + BinaryTreeNode NewTreeNode = new BinaryTreeNode(); + NewTreeNode.setData(element); + binaryTree.setLeft(NewTreeNode); + assertEquals(2, binaryTree.getLeft().getData().getT()); +// binaryTree.PriOder(this.binaryTree); + } + + @Test + public void getRight() throws Exception { + assertEquals(7, binaryTree.getRight().getData().getT()); + + } + + @Test + public void setRight() throws Exception { + TreeData element = new TreeData(); + element.setT(9); + BinaryTreeNode NewTreeNode = new BinaryTreeNode(); + NewTreeNode.setData(element); + binaryTree.setRight(NewTreeNode); + assertEquals(9, binaryTree.getRight().getData().getT()); + } + + @Test + public void priOder() throws Exception { + + + } + + @Test + public void insert() throws Exception { + TreeData element = new TreeData(); + element.setT(2); + binaryTree.insert(element); + binaryTree.PriOder(this.binaryTree); + element.setT(9); + binaryTree.insert(element); + binaryTree.PriOder(this.binaryTree); + element.setT(8); +// binaryTree.PriOder(this.binaryTree); + + } + +} \ No newline at end of file diff --git a/group16/2562124714/src/Test/LinkedListTest.java b/group16/2562124714/src/Test/LinkedListTest.java new file mode 100644 index 0000000000..276b389f15 --- /dev/null +++ b/group16/2562124714/src/Test/LinkedListTest.java @@ -0,0 +1,81 @@ +package Test; + +import com.coding.basic.LinkedList; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by zhangwj on 2017/2/23. + */ +public class LinkedListTest { + private LinkedList linkedlist = new LinkedList(); + + @Before + public void Init() + { + System.out.println("初始化"); + linkedlist.add(9.9); + linkedlist.add(9.99); + } + + + @Test + public void add() throws Exception { + linkedlist.add(8.8); + assertEquals(3, linkedlist.size()); + System.out.println("after add size is " + linkedlist.size()); + System.out.println("after add last element is " + linkedlist.get(linkedlist.size())); + + } + + @Test + public void add1() throws Exception { + linkedlist.add(2, 7.7); + assertEquals(3, linkedlist.size()); + System.out.println("after add in 2th size is " + linkedlist.size()); + System.out.println("after add 2th element is " + linkedlist.get(2)); + } + + @Test + public void get() throws Exception { + assertEquals(9.9, linkedlist.get(1)); + } + + @Test + public void remove() throws Exception { + assertEquals(9.9, linkedlist.remove(1)); + } + + @Test + public void size() throws Exception { + assertEquals(2, linkedlist.size()); + + } + + @Test + public void addFirst() throws Exception { + linkedlist.addFirst(3.3); + assertEquals(3.3, linkedlist.get(1)); +// System.out.println(); + } + + @Test + public void addLast() throws Exception { + linkedlist.addLast(3.3); + assertEquals(3.3, linkedlist.get(linkedlist.size())); + + } + + @Test + public void removeFirst() throws Exception { + assertEquals(9.9, linkedlist.removeFirst()); + } + + @Test + public void removeLast() throws Exception { + assertEquals(9.99, linkedlist.removeLast()); + } + +} \ No newline at end of file diff --git a/group16/2562124714/src/Test/QueueTest.java b/group16/2562124714/src/Test/QueueTest.java new file mode 100644 index 0000000000..3f0557f262 --- /dev/null +++ b/group16/2562124714/src/Test/QueueTest.java @@ -0,0 +1,58 @@ +package Test; + +import com.coding.basic.Queue; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by zhangwj on 2017/2/23. + */ +public class QueueTest { + private Queue queue = new Queue(); + @Before + public void setUp() throws Exception { + System.out.println("初始化队列,元素为a,b,c,d"); + + String[] s = {"a", "b","c","d"}; + for (String a:s + ) { + queue.enQueue(a); + } + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void enQueue() throws Exception { + queue.enQueue("dasdas"); + assertEquals(5, queue.size()); +// assertEquals("dasdas", queue.); + } + + @Test + public void deQueue() throws Exception { + assertEquals("a",queue.deQueue()); + assertEquals(3, queue.size()); + + } + + @Test + public void isEmpty() throws Exception { + assertEquals(false, queue.isEmpty()); + + } + + @Test + public void size() throws Exception { + assertEquals(4, queue.size()); + + } + +} \ No newline at end of file diff --git a/group16/2562124714/src/Test/StackTest.java b/group16/2562124714/src/Test/StackTest.java new file mode 100644 index 0000000000..0a36d4dc0f --- /dev/null +++ b/group16/2562124714/src/Test/StackTest.java @@ -0,0 +1,57 @@ +package Test; + +import com.coding.basic.Stack; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by zhangwj on 2017/2/23. + */ +public class StackTest { + private Stack stack = new Stack(); + @Before + public void setUp() throws Exception { + System.out.println("初始化栈,元素为a,b,c,d"); + + String[] s = {"a", "b","c","d"}; + for (String a:s + ) { + stack.push(a); + } + + } + + @Test + public void push() throws Exception { + stack.push("aaa"); + assertEquals(5, stack.size()); + assertEquals("aaa", stack.peek()); + + } + + @Test + public void pop() throws Exception { + assertEquals("d", stack.pop()); + assertEquals(3, stack.size()); + + } + + @Test + public void peek() throws Exception { + assertEquals("d", stack.peek()); + assertEquals(4, stack.size()); + } + + @Test + public void isEmpty() throws Exception { + assertEquals(false, stack.isEmpty()); + } + + @Test + public void size() throws Exception { + assertEquals(4, stack.size()); + } + +} \ No newline at end of file diff --git a/group16/2562124714/src/Test/TestRunner.java b/group16/2562124714/src/Test/TestRunner.java new file mode 100644 index 0000000000..2bf465f832 --- /dev/null +++ b/group16/2562124714/src/Test/TestRunner.java @@ -0,0 +1,19 @@ +package Test; + +import org.junit.runner.JUnitCore; +import org.junit.runner.notification.Failure; + +import javax.xml.transform.Result; + +/** + * Created by zhangwj on 2017/2/23. 调用测试类 可重复使用 + */ +public class TestRunner { + public static void main(String[] args) { + org.junit.runner.Result result = JUnitCore.runClasses(BinaryTreeNodeTest.class); + for (Failure failure:result.getFailures()) { + System.out.println(failure.toString()); + } + System.out.println(result.wasSuccessful()); + } +} diff --git a/group16/2562124714/src/com/coding/basic/ArrayList.java b/group16/2562124714/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..f1d5a9fdd9 --- /dev/null +++ b/group16/2562124714/src/com/coding/basic/ArrayList.java @@ -0,0 +1,100 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private int Scale; //每次扩展大小 + + private Object[] elementData = new Object[100]; + + public ArrayList() + { + this.Scale = 10; + } + + public ArrayList(int i) + { + this.Scale = i; + } + + public void add(Object o){ + if (this.size == elementData.length) + { + DoEnlage(); + } + elementData[size] = o; + this.size++; + } + + private void DoEnlage() + { + if (this.Scale >= 1 && this.Scale <= 10000) + { + Object[] NewElementData = new Object[this.elementData.length + this.Scale]; + System.arraycopy(this.elementData,0,NewElementData,0,this.elementData.length); + + this.elementData = NewElementData; + } + + } + + //index从1开始 位置1,2,3,4,5,6 + public void add(int index, Object o){ + if (this.size == elementData.length) + { + DoEnlage(); + } + int i = 0; + //遍历赋值 + for(i = this.size; i >= index;i--) + { + this.elementData[i] = this.elementData[i - 1]; + } + + this.elementData[i] = o; + this.size++; + + } + + public Object get(int index){ + if (index >= 1 && index <= this.size) + { + return this.elementData[index - 1]; + } + else { + return null; + } + + + } + + public Object remove(int index){ + if (index >= 1 && index <= this.size) + { + int i = 0; + Object DelElement = this.elementData[index - 1]; + for(i = index; i <= this.size; i++) + { + this.elementData[i - 1] = this.elementData[i]; + } + this.elementData[i] = null; + this.size--; + + return DelElement; + + } + else { + return null; + } + } + + public int size(){ + return this.size; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group16/2562124714/src/com/coding/basic/BinaryTreeNode.java b/group16/2562124714/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..a703ad3165 --- /dev/null +++ b/group16/2562124714/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,94 @@ +package com.coding.basic; + +import java.util.Properties; + +public class BinaryTreeNode { + + private TreeData treeData; + //private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public TreeData getData() { + return treeData; + } + public void setData(TreeData data) { + this.treeData = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public void PriOder(BinaryTreeNode Node) + { + if (Node.treeData != null) + { + System.out.println(Node.treeData.getT()); + if (Node.left != null) + { + PriOder(Node.left); + } + if (Node.right != null) + { + PriOder(Node.right); + } + } + + } + + + public BinaryTreeNode insert(TreeData o){ + if (this.treeData == null && this.left == null && this.right == null) + { + this.treeData = o; + this.left = null; + this.right = null; + return null; + } + + //遍历寻找元素应该插入的位置 + if (o.compareTo(this.treeData) <= 0) + { + if (this.left != null) + { + this.left.insert(o); + } + else + { + BinaryTreeNode NewNode = new BinaryTreeNode(); + NewNode.setData(o); + NewNode.setLeft(null); + NewNode.setRight(null); + this.left = NewNode; + } + } + else + { + if (this.right != null) + { + this.right.insert(o); + } + else + { + BinaryTreeNode NewNode = new BinaryTreeNode(); + NewNode.setData(o); + NewNode.setLeft(null); + NewNode.setRight(null); + this.right = NewNode; + } + } + + + return null; + } + +} diff --git a/group16/2562124714/src/com/coding/basic/Iterator.java b/group16/2562124714/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group16/2562124714/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group16/2562124714/src/com/coding/basic/LinkedList.java b/group16/2562124714/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..f1de0a6839 --- /dev/null +++ b/group16/2562124714/src/com/coding/basic/LinkedList.java @@ -0,0 +1,200 @@ +package com.coding.basic; + +import com.sun.org.apache.bcel.internal.generic.NEW; + +import java.awt.*; + +public class LinkedList implements List { + public LinkedList() + { + head = null; + this.Size = 0; + } + + private Node head; + private int Size; + + public void add(Object o){ + Node NewNode = new Node(o); + + if (this.head == null) + { + head = NewNode; + } + else + { + Node node; + for (node = head; node.next != null; node = node.next) + { + } + node.next = NewNode; + } + this.Size++; + + } + //index为位置1,2,3,4,5,6,7 + public void add(int index , Object o){ + Node NewNode = new Node(o); + + if (1 == index) + { + NewNode.next = head; + head = NewNode; + } + else { + Node node; + int i = 0; + for (i = 1, node = head; i < index - 1; i++, node = node.next) { + } + NewNode.next = node.next; + node.next = NewNode; + } + this.Size++; + + } + public Object get(int index){ + Node node; + int i = 0; + + for (i = 1, node = head; i < index ; i++, node = node.next) { + } + + return node.data; +// return null; + } + public Object remove(int index){ + Node node; + int i = 0; + + if (1 == index) + { + if (head.next == null) + { + Object DelData = head.data; + head = null; + this.Size--; + return DelData; + } + else + { + Node DelNode = head; + head = DelNode.next; + DelNode.next = null; + this.Size--; + return DelNode.data; + + } + } + else { + + for (i = 1, node = head; i < index - 1; i++, node = node.next) { + } + Node DelNode = node.next; + node.next = DelNode.next; + DelNode.next = null; + this.Size--; + return DelNode.data; + } + } + + public int size(){ + + return this.Size; + } + + public void addFirst(Object o){ + Node NewNode = new Node(o); + + if (null == this.head) + { + NewNode.next = null; + head = NewNode; + } + else + { + NewNode.next = head; + head = NewNode; + } + + this.Size++; + + } + public void addLast(Object o){ + Node NewNode = new Node(o); + + if (this.Size == 0) + { + NewNode.next = null; + head = NewNode; + } + else + { +// int i = 0; + Node node; + for (node = head; node.next != null; node = node.next) { + + } + node.next = NewNode; + } + + this.Size++; + + } + public Object removeFirst(){ + Node DelFirst; + + if (1 == this.Size) + { + DelFirst = this.head; + DelFirst.next = null; + head = null; + } + else + { + DelFirst = this.head; + head = head.next; + DelFirst.next = null; + } + this.Size--; + + return DelFirst.data; + } + public Object removeLast(){ + Node DelLast; + + if (1 == this.Size) + { + DelLast = head; + DelLast.next = null; + head = null; + } + else + { + Node node; + for (node = head; node.next.next != null; node = node.next) { + + } + DelLast = node.next; + node.next = null; + } + this.Size--; + + return DelLast.data; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + public Node(Object o) + { + this.data = o; + this.next = null; + } + + } +} diff --git a/group16/2562124714/src/com/coding/basic/List.java b/group16/2562124714/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group16/2562124714/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group16/2562124714/src/com/coding/basic/Queue.java b/group16/2562124714/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..40b8f22607 --- /dev/null +++ b/group16/2562124714/src/com/coding/basic/Queue.java @@ -0,0 +1,24 @@ +package com.coding.basic; + +public class Queue { + private ArrayList elementData = new ArrayList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + + + return elementData.get(1); + } + + public boolean isEmpty(){ + + return elementData.size() == 0 ? true : false; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group16/2562124714/src/com/coding/basic/Stack.java b/group16/2562124714/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..9dba3befa5 --- /dev/null +++ b/group16/2562124714/src/com/coding/basic/Stack.java @@ -0,0 +1,34 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + +// public Stack() +// { +// elementData +// } + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + Object o = elementData.remove(elementData.size()); + return o; + } + + public Object peek(){ + Object o = elementData.get(elementData.size()); + return o; + } + public boolean isEmpty(){ + if (elementData.size() == 0) + { + return true; + } + return false; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group16/2562124714/src/com/coding/basic/TestJunit.java b/group16/2562124714/src/com/coding/basic/TestJunit.java new file mode 100644 index 0000000000..59ef43a992 --- /dev/null +++ b/group16/2562124714/src/com/coding/basic/TestJunit.java @@ -0,0 +1,17 @@ +package com.coding.basic; +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +/** + * Created by zhangwj on 2017/2/23. + */ +public class TestJunit { + @Test + + public void testAdd() + { + String str = "Junit is working fine"; + assertEquals("Junit is working fine", str); + } + +} diff --git a/group16/2562124714/src/com/coding/basic/TestRunner.java b/group16/2562124714/src/com/coding/basic/TestRunner.java new file mode 100644 index 0000000000..625ace52c6 --- /dev/null +++ b/group16/2562124714/src/com/coding/basic/TestRunner.java @@ -0,0 +1,25 @@ +package com.coding.basic; + +import com.sun.net.httpserver.Authenticator; +import org.junit.runner.JUnitCore; +import org.junit.runner.notification.Failure; +import org.junit.runners.model.TestClass; + +import javax.xml.transform.Result; + +/** + * Created by zhangwj on 2017/2/23. + */ +public class TestRunner { + public static void main(String[] args) + { + org.junit.runner.Result result = JUnitCore.runClasses(TestJunit.class); + + for (Failure failure : result.getFailures()) + { + System.out.println(failure.toString()); + } + + System.out.println(result.wasSuccessful()); + } +} diff --git a/group16/2562124714/src/com/coding/basic/TreeData.java b/group16/2562124714/src/com/coding/basic/TreeData.java new file mode 100644 index 0000000000..e79b7bd450 --- /dev/null +++ b/group16/2562124714/src/com/coding/basic/TreeData.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +/** + * Created by zhangwj on 2017/2/22. + */ +public class TreeData> implements Comparable>{ + private int s; + private T t; + + public T getT() + { + return t; + } + + public void setT(T o) { t = o;} + + @Override + public int compareTo(TreeData o) { + return getT().compareTo(o.getT()); + } + +// public int compareTo(TreeData o) +// { +// +// } + + +} diff --git a/group16/2816977791/.gitignore b/group16/2816977791/.gitignore new file mode 100644 index 0000000000..4ede1404d2 --- /dev/null +++ b/group16/2816977791/.gitignore @@ -0,0 +1,181 @@ +# Created by https://www.gitignore.io/api/java,intellij,eclipse,emacs,svn,maven + +### Java ### +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/workspace.xml +.idea/tasks.xml +.idea/dictionaries +.idea/vcs.xml +.idea/jsLibraryMappings.xml +*.idea + +# Sensitive or high-churn files: +.idea/dataSources.ids +.idea/dataSources.xml +.idea/dataSources.local.xml +.idea/sqlDataSources.xml +.idea/dynamic.xml +.idea/uiDesigner.xml + +# Gradle: +.idea/gradle.xml +.idea/libraries + +# Mongo Explorer plugin: +.idea/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### Intellij Patch ### +*.iml + + +### Eclipse ### + +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + + +### Emacs ### +# -*- mode: gitignore; -*- +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ + +# Flycheck +flycheck_*.el + +# server auth directory +/server/ + +# projectiles files +.projectile + +### SVN ### +.svn/ + + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties + +Servers/ diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/ArrayList.java b/group16/2816977791/firstExercise/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..7ac196b700 --- /dev/null +++ b/group16/2816977791/firstExercise/src/com/coding/basic/ArrayList.java @@ -0,0 +1,94 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + public void add(Object o) { + ensureCapacity(size + 1); + elementData[size++] = o; + } + + public void add(int index, Object o) { + checkForLength(index); + + ensureCapacity(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index) { + checkForLength(index); + return elementData[index]; + } + + public Object remove(int index) { + checkForLength(index); + Object oldValue = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return oldValue; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return null; + } + + private void checkForLength(int index) { + if (index < 0 || index >= size) { + throw new RuntimeException("out of memory"); + } + } + + private void ensureCapacity(int minCapacity) { + if (minCapacity - elementData.length > 0) { + grow(minCapacity); + } + } + + private void grow(int minCapacity) { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + (oldCapacity >> 1);//增大容量 + if (newCapacity - minCapacity < 0) { + newCapacity = minCapacity; + } + elementData = copyOf(elementData, newCapacity); + } + + private Object[] copyOf(Object[] src, int newCapacity) { + Object[] target = new Object[newCapacity]; + System.arraycopy(src, 0, target, 0, src.length); + return target; + } + + public static void main(String[] args) { + ArrayList list = new ArrayList(); + String num = "num"; + for (int i = 0; i < 100; i++) { + list.add(num + String.valueOf(i)); + System.out.println(String.valueOf(i) + ":size:" + list.size()); + System.out.println(String.valueOf(i) + ":length:" + list.elementData.length); + } + System.out.println(list.size()); + + for (int i = 0; i < 100; i++) { + list.add(i, num + String.valueOf(i)); + System.out.println(String.valueOf(i) + ":size:" + list.size()); + System.out.println(String.valueOf(i) + ":length:" + list.elementData.length); + } + System.out.println(list.size()); + + for (int i = 0; i < 200; i++) { + System.out.println(list.remove(0)); + } + + System.out.println(list.size()); + } +} diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/BinaryTreeNode.java b/group16/2816977791/firstExercise/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..e34a68b3c2 --- /dev/null +++ b/group16/2816977791/firstExercise/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,67 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode root; + + public BinaryTreeNode(Object data, BinaryTreeNode left, BinaryTreeNode right) { + this.data = data; + this.left = left; + this.right = right; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + BinaryTreeNode binaryTreeNode = new BinaryTreeNode(o, null, null); + if (root == null) { + root = binaryTreeNode; + } else { + add(o, root); + } + return binaryTreeNode; + } + + private BinaryTreeNode add(Object o, BinaryTreeNode target) { + if (target == null) { + target = new BinaryTreeNode(o, null, null); + } else { + if (compare(o, target.data) > 0) { + target.right = add(o, target.right); + } else if (compare(o, target.data) < 0) { + target.left = add(o, target.left); + } + } + return target; + } + + private int compare(Object src, Object target) { + return ((String) src).compareTo((String) target); + } + +} diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/Iterator.java b/group16/2816977791/firstExercise/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group16/2816977791/firstExercise/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/LinkedList.java b/group16/2816977791/firstExercise/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..be5b236700 --- /dev/null +++ b/group16/2816977791/firstExercise/src/com/coding/basic/LinkedList.java @@ -0,0 +1,140 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private Node last; + + private int size = 0; + + public void add(Object o) { + addLast(o); + } + + public void add(int index, Object o) { + checkPosition(index); + if (index == size) { + addLast(o); + } else { + addIndex(index, o); + } + } + + public Object get(int index) { + return node(index).data; + } + + public Object remove(int index) { + checkPosition(index); + Object old = get(index); + if (index == 0) { + removeFirst(); + } else if (index == size - 1) { + removeLast(); + } else { + node(index - 1).next = node(index + 1); + size--; + } + return old; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node h = head; + Node newNode = new Node(o, h); + head = newNode; + if (h == null) { + last = newNode; + } + size++; + } + + public void addLast(Object o) { + Node l = last; + Node newNode = new Node(o, null); + last = newNode; + if (l == null) { + head = newNode; + } else { + l.next = newNode; + } + size++; + } + + public Object removeFirst() { + Node old = head; + head = old.next; + size--; + return old.data; + } + + public Object removeLast() { + Node old = last; + Node prev = node(size - 2); + last = prev; + size--; + return old.data; + } + + public Iterator iterator() { + return null; + } + + private void checkPosition(int index) { + if (index < 0 || index >= size) { + throw new RuntimeException("out of memory"); + } + } + + private void addIndex(int index, Object o) { + checkPosition(index); + Node newNode = new Node(o, node(index)); + if (index != 0) { + node(index - 1).next = newNode; + } else { + head = newNode; + } + size++; + } + + private Node node(int index) { + Node x = head; + for (int i = 0; i < index; i++) { + x = x.next; + } + return x; + } + + private static class Node { + Object data; + Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + public static void main(String[] args) { + LinkedList list = new LinkedList(); + list.addLast("last"); + System.out.println(list.size()); + list.addFirst("head"); + System.out.println(list.size()); + list.add(0, "0Object"); + System.out.println(list.size()); + list.add(2, "2Object"); + System.out.println(list.size()); + list.removeLast(); + System.out.println(list.size()); + list.removeFirst(); + System.out.println(list.size()); + list.removeLast(); + System.out.println(list.size()); + list.get(0); + System.out.println(list.size()); + } +} diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/List.java b/group16/2816977791/firstExercise/src/com/coding/basic/List.java new file mode 100644 index 0000000000..01398944e6 --- /dev/null +++ b/group16/2816977791/firstExercise/src/com/coding/basic/List.java @@ -0,0 +1,13 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/Queue.java b/group16/2816977791/firstExercise/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..f2475fcfd6 --- /dev/null +++ b/group16/2816977791/firstExercise/src/com/coding/basic/Queue.java @@ -0,0 +1,21 @@ +package com.coding.basic; + +public class Queue { + private ArrayList elementData = new ArrayList(); + + public void enQueue(Object o) { + elementData.add(o); + } + + public Object deQueue() { + return elementData.get(0); + } + + public boolean isEmpty() { + return elementData.size() == 0 ? true : false; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group16/2816977791/firstExercise/src/com/coding/basic/Stack.java b/group16/2816977791/firstExercise/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..12a89eb613 --- /dev/null +++ b/group16/2816977791/firstExercise/src/com/coding/basic/Stack.java @@ -0,0 +1,25 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(0, o); + } + + public Object pop() { + return elementData.remove(0); + } + + public Object peek() { + return elementData.get(0); + } + + public boolean isEmpty() { + return elementData.size() == 0 ? true : false; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group16/2816977791/secondExercise/src/com/coderising/array/ArrayUtil.java b/group16/2816977791/secondExercise/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..c91c019634 --- /dev/null +++ b/group16/2816977791/secondExercise/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,258 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int i = 0; + while (i < origin.length - 1 - i) { + int temp = origin[origin.length - 1 - i]; + origin[origin.length - 1 - i] = origin[i]; + origin[i] = temp; + i++; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int point = 0; + for (int i : oldArray) { + if (i != 0) { + oldArray[point++] = i; + } + } + int[] newArray = new int[point]; + System.arraycopy(oldArray, 0, newArray, 0, point); + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + //两个指针 + int pos1 = 0; + int pos2 = 0; + int point = 0; + int[] newArray = new int[array1.length + array2.length]; + while (pos1 < array1.length && pos2 < array2.length) { + if (array1[pos1] > array2[pos2]) { + newArray[point++] = array2[pos2++]; + } else if (array1[pos1] < array2[pos2]) { + newArray[point++] = array1[pos1++]; + } else { + newArray[point++] = array1[pos1++]; + pos2++; + } + } + while (pos1 < array1.length) { + newArray[point++] = array1[pos1++]; + } + while (pos1 < array2.length) { + newArray[point++] = array1[pos2++]; + } + int[] array = new int[point]; + System.arraycopy(newArray, 0, array, 0, point); + return array; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + int a = 0; + int b = 1; + int[] array = new int[max]; + int i = 0; + if (max >= 2) { + array[i++] = 1; + } + while (a + b < max) { + int temp = b; + b = a + b; + a = temp; + array[i++] = b; + } + int[] newArray = new int[i]; + System.arraycopy(array, 0, newArray, 0, i); + return newArray; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int[] array = new int[max / 2 + 1]; + int pos = 0; + for (int i = 1; i < max; i++) { + if (prime(i)) { + array[pos++] = i; + } + } + int[] newArray = new int[pos]; + System.arraycopy(array, 0, newArray, 0, pos); + return newArray; + } + + private boolean prime(int value) { + if (value < 2) { + return false; + } else if (value == 2) { + return true; + } else { + for (int i = 2; i < value / 2 + 1; i++) { + if (value % 2 == 0) { + return false; + } + } + return true; + } + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int pos = 0; + int[] array = new int[max]; + for (int i = 1; i < max; i++) { + if (perfectNumber(i)) { + array[pos++] = i; + } + } + int[] newArray = new int[pos]; + System.arraycopy(array, 0, newArray, 0, pos); + return newArray; + } + + private boolean perfectNumber(int value) { + if (value == 1 || prime(value)) { + return false; + } else { + int sum = 0; + for (int i = 1; i <= value / 2; i++) { + if (value % i == 0) { + sum += i; + } + } + if (sum == value) { + return true; + } + return false; + } + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + String out = ""; + for (int i = 0; i < array.length; i++) { + if (i == 0) { + out += String.valueOf(i); + } else { + out += seperator + String.valueOf(i); + } + } + return out; + } + + + public static void main(String[] args) { + ArrayUtil arrayUtil = new ArrayUtil(); + //reverse + int[] a = {7, 9, 30, 3}; + arrayUtil.reverseArray(a); + System.out.println(a); + + //remove zero + int[] zero = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + int[] afterZero = arrayUtil.removeZero(zero); + System.out.println(afterZero); + + //merge + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + int[] merge = arrayUtil.merge(a1, a2); + System.out.println(merge); + + //grow + int[] oldArray = {2, 3, 6}; + int[] grow = arrayUtil.grow(oldArray, 3); + System.out.println(grow); + + //fibonacci + int[] fibonacci = arrayUtil.fibonacci(2); + System.out.println(fibonacci); + + //primes + int[] primes = arrayUtil.getPrimes(15); + System.out.println(primes); + + //perfect + int[] perfect = arrayUtil.getPerfectNumbers(500); + System.out.println(perfect); + + //join + int[] joinArray = {2}; + String join = arrayUtil.join(joinArray, "-"); + System.out.println(join); + + } +} diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/ActionXml.java b/group16/2816977791/secondExercise/src/com/coderising/litestruts/ActionXml.java new file mode 100644 index 0000000000..55988befbe --- /dev/null +++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/ActionXml.java @@ -0,0 +1,37 @@ +package com.coderising.litestruts; + +import java.util.Map; + +/** + * @author nvarchar + * date 2017/3/1 + */ +public class ActionXml { + private String name; + private String className; + private Map map; + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } +} diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/LoginAction.java b/group16/2816977791/secondExercise/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/Struts.java b/group16/2816977791/secondExercise/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..be69131e19 --- /dev/null +++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,150 @@ +package com.coderising.litestruts; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + +public class Struts { + + private static Map actionXmlMap; + + static { + //0. 读取配置文件struts.xml + actionXmlMap = parserXml("src/com/coderising/litestruts/struts.xml"); + System.out.println("parse end"); + } + + public static View runAction(String actionName, Map parameters) { + + try { + ActionXml actionXml = actionXmlMap.get(actionName); + if (actionName == null) { + return null; + } else { + String className = actionXml.getClassName(); + Class cls = Class.forName(className); + Object obj = cls.newInstance(); + /** + 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + */ + Method[] methods = cls.getMethods(); + for (String field : parameters.keySet()) { + for (Method method : methods) { + if (method.getName().startsWith("set") && method.getName().toLowerCase().endsWith(field.toLowerCase())) { + method.invoke(obj, parameters.get(field)); + break; + } + } + } + Method action = cls.getMethod("execute"); + //通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + String result = (String) action.invoke(obj); + /** + 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + */ + Field[] fields = cls.getDeclaredFields(); + Map params = new HashMap<>(); + for (Field field : fields) { + for (Method method : methods) { + if (method.getName().startsWith("get") && method.getName().toLowerCase().endsWith(field.getName().toLowerCase())) { + String viewResult = (String) method.invoke(obj); + params.put(field.getName(), viewResult); + break; + } + } + } + /** + 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + View view = new View(); + view.setParameters(params); + view.setJsp(actionXmlMap.get(actionName).getMap().get(result)); + return view; + } + } catch (ClassNotFoundException e) { + e.printStackTrace(); + return null; + } catch (InstantiationException e) { + e.printStackTrace(); + return null; + } catch (IllegalAccessException e) { + e.printStackTrace(); + return null; + } catch (NoSuchMethodException e) { + e.printStackTrace(); + return null; + } catch (InvocationTargetException e) { + e.printStackTrace(); + return null; + } + } + + //解析xml文件 + private static Map parserXml(String fileName) { + try { + Map map = new HashMap<>(); + //create documentBuilder + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + //create document + Document document = db.parse(fileName); + //extract root element + Element root = document.getDocumentElement(); + System.out.println("Root element :" + document.getDocumentElement().getNodeName()); + NodeList nodeList = document.getElementsByTagName("action"); + System.out.println("----------------------------"); + for (int temp = 0; temp < nodeList.getLength(); temp++) { + Node nNode = nodeList.item(temp); + System.out.println("\nCurrent Element :" + + nNode.getNodeName()); + if (nNode.getNodeType() == Node.ELEMENT_NODE) { + ActionXml actionXml = new ActionXml(); + Element eElement = (Element) nNode; + System.out.println("action name : " + + eElement.getAttribute("name")); + System.out.println("class name : " + + eElement.getAttribute("class")); + actionXml.setName(eElement.getAttribute("name")); + actionXml.setClassName(eElement.getAttribute("class")); + NodeList result = eElement.getElementsByTagName("result"); + Map results = new HashMap<>(); + for (int i = 0; i < result.getLength(); i++) { + Node resultNode = result.item(i); + if (resultNode.getNodeType() == Node.ELEMENT_NODE) { + Element resultElement = (Element) resultNode; + System.out.println("result name:" + resultElement.getAttribute("name")); + System.out.println("result context:" + resultElement.getTextContent()); + results.put(resultElement.getAttribute("name"), resultElement.getTextContent()); + } + actionXml.setMap(results); + } + map.put(actionXml.getName(), actionXml); + } + } + return map; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static void main(String[] args) { +// parserXml("src/com/coderising/litestruts/struts.xml"); + } +} diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/StrutsTest.java b/group16/2816977791/secondExercise/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/View.java b/group16/2816977791/secondExercise/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group16/2816977791/secondExercise/src/com/coderising/litestruts/struts.xml b/group16/2816977791/secondExercise/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group16/2816977791/secondExercise/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/313001956/.classpath b/group16/313001956/.classpath new file mode 100644 index 0000000000..b42037dde2 --- /dev/null +++ b/group16/313001956/.classpath @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/group16/313001956/.gitignore b/group16/313001956/.gitignore new file mode 100644 index 0000000000..84c048a73c --- /dev/null +++ b/group16/313001956/.gitignore @@ -0,0 +1 @@ +/build/ diff --git a/group16/313001956/.project b/group16/313001956/.project new file mode 100644 index 0000000000..16d7526efa --- /dev/null +++ b/group16/313001956/.project @@ -0,0 +1,36 @@ + + + assignment + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/group16/313001956/.settings/.jsdtscope b/group16/313001956/.settings/.jsdtscope new file mode 100644 index 0000000000..92e666d77d --- /dev/null +++ b/group16/313001956/.settings/.jsdtscope @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/group16/313001956/.settings/org.eclipse.jdt.core.prefs b/group16/313001956/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..c537b63063 --- /dev/null +++ b/group16/313001956/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/group16/313001956/.settings/org.eclipse.wst.common.component b/group16/313001956/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000000..2a267dc19d --- /dev/null +++ b/group16/313001956/.settings/org.eclipse.wst.common.component @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group16/313001956/.settings/org.eclipse.wst.common.project.facet.core.xml b/group16/313001956/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000000..611d2dfa73 --- /dev/null +++ b/group16/313001956/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.container b/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000000..3bd5d0a480 --- /dev/null +++ b/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.name b/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000000..05bd71b6ec --- /dev/null +++ b/group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/group16/313001956/WebContent/META-INF/MANIFEST.MF b/group16/313001956/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..254272e1c0 --- /dev/null +++ b/group16/313001956/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/group16/313001956/src/com/coding/basic/ArrayList.java b/group16/313001956/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..3250c14f0d --- /dev/null +++ b/group16/313001956/src/com/coding/basic/ArrayList.java @@ -0,0 +1,70 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = null; + + private final int cap = 10;// + + public ArrayList() { + elementData = new Object[100]; + } + + public ArrayList(int initialCapacity ) { + elementData = new Object[initialCapacity]; + } + + public void add(Object o) { + if (elementData.length <= size) + IncreaseCap(); + elementData[size] = o; + + size++; + + } + + public void add(int index, Object o) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException(); + if (elementData.length <= size) + IncreaseCap(); + + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException(); + + return elementData[index]; + } + + public Object remove(int index) { + if (index < 0 || index > size) + throw new IndexOutOfBoundsException(); + Object o = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return o; + } + + public int size() { + return size; + } + + public Iterator iterator(){ + return null; + } + + // ݷ + private void IncreaseCap() { + Object[] icrelementData = new Object[elementData.length + cap]; + System.arraycopy(elementData, 0, icrelementData, 0, elementData.length); + elementData = icrelementData; + + } +} \ No newline at end of file diff --git a/group16/313001956/src/com/coding/basic/LinkedList.java b/group16/313001956/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..65eabc4ac0 --- /dev/null +++ b/group16/313001956/src/com/coding/basic/LinkedList.java @@ -0,0 +1,140 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size; + + public LinkedList() { + + } + + public void add(Object o) { + addLast(o); + } + + public void add(int index, Object o) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("Խ磡"); + } + if (head == null) { + head = new Node(); + head.data = o; + } else { + + Node n = getNodebyIndex(index); + + Node newnode = new Node(); + newnode.data = o; + newnode.next = n.next; + n.next = newnode; + } + size++; + } + + public Object get(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("Խ磡"); + } + if (head == null) + return null; + Node n = getNodebyIndex(index); + return n.data; + } + + public Object remove(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("Խ磡"); + } + Node n = getNodebyIndex(index - 1); + Object o = n.next.data; + n.next = n.next.next; + size--; + return o; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + if (head == null) { + head = new Node(); + head.data = o; + } else { + Node newnode = new Node(); + newnode.data = o; + newnode.next = head; + head = newnode; + } + size++; + } + + public void addLast(Object o) { + if (head == null) { + head = new Node(); + head.data = o; + } else { + Node n = getNodebyIndex(size); + Node newnode = new Node(); + newnode.data = o; + n.next = newnode; + } + size++; + } + + public Object removeFirst() { + if (head == null) + return null; + + head = head.next; + size--; + return head.data; + } + + public Object removeLast() { + if (head == null) + return null; + Node n = getNodebyIndex(size - 1); + Object o = n.next.data; + n.next = null; + size--; + return o; + } + + public Iterator iterator() { + return null; + } + + private Node getNodebyIndex(int index) { + int i = 0; + Node n = head; + while (i < index) { + n = n.next; + i++; + } + return n; + } + + private static class Node { + Object data; + Node next; + + Object Getdata() { + return data; + } + + void Setdata(Object o) { + data = o; + } + + Node Getnext() { + return next; + } + + void Setnext(Node n) { + next = n; + } + } +} + diff --git a/group16/313001956/src/com/coding/basic/Queue.java b/group16/313001956/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..d4decef6e8 --- /dev/null +++ b/group16/313001956/src/com/coding/basic/Queue.java @@ -0,0 +1,24 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList elementData = new LinkedList(); + public void enQueue(Object o){ + elementData.addLast(o); + } + + public Object deQueue(){ + Object o= elementData.get(0); + elementData.removeFirst(); + return o; + } + + + public boolean isEmpty(){ + return elementData.size()==0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group16/313001956/src/com/coding/basic/Stack.java b/group16/313001956/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..2b9d9a1b0d --- /dev/null +++ b/group16/313001956/src/com/coding/basic/Stack.java @@ -0,0 +1,37 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public Stack() { + // TODO Auto-generated constructor stub + } + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + int size = elementData.size(); + Object o = elementData.get(size - 1); + elementData.remove(size - 1); + return o; + } + + public Object peek() { + int size = elementData.size(); + Object o = elementData.get(size - 1); + + return o; + } + + public boolean isEmpty() { + if (elementData.size() == 0) + return true; + return false; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group16/420355244/Homework1/.classpath b/group16/420355244/Homework1/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group16/420355244/Homework1/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group16/420355244/Homework1/.gitignore b/group16/420355244/Homework1/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group16/420355244/Homework1/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group16/420355244/Homework1/.project b/group16/420355244/Homework1/.project new file mode 100644 index 0000000000..ec1134f33a --- /dev/null +++ b/group16/420355244/Homework1/.project @@ -0,0 +1,17 @@ + + + Homework1 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group16/420355244/Homework1/.settings/org.eclipse.jdt.core.prefs b/group16/420355244/Homework1/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group16/420355244/Homework1/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group16/420355244/Homework1/src/com/coding/basic/ArrayList.java b/group16/420355244/Homework1/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..6534c3c029 --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/ArrayList.java @@ -0,0 +1,91 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + if(size < elementData.length){ + elementData[size] = o; + }else{ + Object[] newElementData = new Object[elementData.length + elementData.length/2]; + System.arraycopy(elementData, 0, newElementData, 0, size); + newElementData[size] = o; + this.elementData = newElementData; + } + size++; + + } + public void add(int index, Object o){ + if(index >= 0 && index <= size){ + //1.不扩容 + if(index == size - 1){ + //1.1 加在最后 + elementData[index] = o; + }else{ + //1.2 加在前面 + //index的位置的数值变为改对象,index以后位置的都往后挪一位 + Object[] newElementData = new Object[elementData.length]; + System.arraycopy(elementData, 0, newElementData, 0, index); + newElementData[index] = o ; + System.arraycopy(elementData, index, newElementData, index + 1, size - index); + this.elementData = newElementData; + } + size++; + }else{ + throw new IndexOutOfBoundsException(); + } + } + + public Object get(int index){ + if(index < size){ + return elementData[index]; + }else{ + throw new IndexOutOfBoundsException(); + } + } + + public Object remove(int index){ + if(index < size){ + Object obj = elementData[index]; + Object[] newElementData = new Object[elementData.length]; + if(size != 1){ + //1.若集合长度为1 + if(0 == index){ + //1.1.如果remove的是0索引的 + System.arraycopy(elementData, 1, newElementData, 0, size - 1); + }else if(index == size -1){ + //1.2.如果remove的是最后索引的 + System.arraycopy(elementData, 0, newElementData, 0, size - 1); + }else{ + //1.3.在中间 + System.arraycopy(elementData, 0, newElementData, 0, index); + System.arraycopy(elementData, index + 1, newElementData, index, size - index - 1); + } + } + this.elementData = newElementData; + size--; + return obj; + }else{ + throw new IndexOutOfBoundsException(); + } + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + @Override + public String toString() { + return "ArrayList [size=" + size + ", elementData=" + Arrays.toString(elementData) + "]"; + } + + +} diff --git a/group16/420355244/Homework1/src/com/coding/basic/ArrayListTest.java b/group16/420355244/Homework1/src/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..420c412a7b --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/ArrayListTest.java @@ -0,0 +1,62 @@ +package com.coding.basic; + +import org.junit.Before; +import org.junit.Test; + +public class ArrayListTest { + + private static ArrayList arrayList = new ArrayList(); + + @Before + public void setUp() throws Exception { + } + + @Test + public void testAddObject() { + for(int i = 0 ;i < 150; i++){ + arrayList.add("aaa"); + } + System.out.println(arrayList); + System.out.println(arrayList.size()); + } + + @Test + public void testAddIntObject() { + arrayList.add("aaa"); + arrayList.add("bbb"); + arrayList.add("ccc"); + arrayList.add("ddd"); + arrayList.add(1,"eee"); + System.out.println(arrayList); + } + + @Test + public void testGet() { + arrayList.add("aaa"); + arrayList.add("bbb"); + arrayList.add("ccc"); + arrayList.add("ddd"); + Object object = arrayList.get(0); + System.out.println(object); + } + + @Test + public void testRemove() { + arrayList.add("aaa"); + arrayList.add("bbb"); + arrayList.add("ccc"); + arrayList.add("ddd"); + arrayList.remove(0); + System.out.println(arrayList); + } + + @Test + public void testSize() { + arrayList.add("aaa"); + arrayList.add("bbb"); + arrayList.add("ccc"); + arrayList.add("ddd"); + System.out.println(arrayList.size()); + } + +} diff --git a/group16/420355244/Homework1/src/com/coding/basic/BinaryTreeNode.java b/group16/420355244/Homework1/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group16/420355244/Homework1/src/com/coding/basic/Iterator.java b/group16/420355244/Homework1/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group16/420355244/Homework1/src/com/coding/basic/LinkedList.java b/group16/420355244/Homework1/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..9af35a399d --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/LinkedList.java @@ -0,0 +1,224 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + + private Node first; + + private Node last; + + private int size = 0; + + public void add(Object o){ + if(null == first){ + //当链表元素为空时,新建一个Node + Node node = new Node(); + node.data = o; + node.next = null; + first = node; + last = node; + size ++; + }else{ + addLast(o); + } + } + public void add(int index , Object o){ + if(index < 0 || index >= size){ + //数组越界异常 + throw new IndexOutOfBoundsException(); + }else{ + if(0 == index){ + //1.如果加在头上 + addFirst(o); + }else{ + //2.加在中间位置 + Node node = first.next; + int nodeIndex = 1; + if(nodeIndex == index){ + //如果是第二个位置的话 + Node nodeAdd = new Node(); + nodeAdd.data = o; + first.next = nodeAdd; + nodeAdd.next = node; + last = node; + size ++; + } + //第三个位置及以后、开始遍历所有的索引 + while(null != node.next){ + //保留遍历中node之前的结点 + Node nodeLast = node; + node = node.next; + nodeIndex++; + if(nodeIndex == index){ + Node nodeAdd = new Node(); + nodeAdd.data = o; + nodeLast.next = nodeAdd; + nodeAdd.next = node; + size ++; + break; + } + } + } + } + + } + public Object get(int index){ + if(index < 0 || index >= size){ + //数组越界异常 + throw new IndexOutOfBoundsException(); + }else{ + if(0 == index){ + //1.如果加在头上 + return first.data; + } + Node node = first.next; + int nodeIndex = 1; + if(nodeIndex == index){ + //如果是第二个位置的话 + return node.data; + } + //第三个位置及以后、开始遍历所有的索引 + while(null != node.next){ + //保留遍历中node之前的结点 + node = node.next; + nodeIndex++; + if(nodeIndex == index){ + return node.data; + } + } + } + throw new IndexOutOfBoundsException(); + } + public Object remove(int index){ + if(index < 0 || index >= size){ + //数组越界异常 + throw new IndexOutOfBoundsException(); + }else{ + if(0 == index){ + //1.如果移除头 + removeFirst(); + }else if(index == (size - 1)){ + //2.移除尾 + removeLast(); + }else{ + //3.移除中间位置 + Node node = first.next; + //从first的零号索引开始 + int nodeIndex = 1; + + //开始遍历所有的索引,记住要移除的索引位数据的前后结点 + Node lastNode = first; + if(index == nodeIndex){ + //第一次不匹配则后续的循环执行 + Object o = node.data; + lastNode.next = node.next; + size--; + return o; + }else{ + while(null != node.next){ + lastNode = node; + node = node.next; + nodeIndex++; + if(index == nodeIndex){ + Object o = node.data; + lastNode.next = node.next; + size--; + return o; + } + } + } + } + } + throw new IndexOutOfBoundsException(); + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node node = new Node(); + node.data = o ; + node.next = first; + first = node; + size++; + } + public void addLast(Object o){ + Node node = new Node(); + node.data = o ; + node.next = null; + last.next = node; + last = node; + size++; + } + public Object removeFirst(){ + Object o = first.data; + Node node = first.next; + first = node; + size--; + return o; + } + public Object removeLast(){ + if(0 == size){ + throw new NoSuchElementException(); + + }else if(1 == size){ + //只有一个元素 + removeFirst(); + }else{ + //第二个元素 + Node node = first.next; + if(null == node.next){ + Object o = node.data; + last = first; + first.next = null; + return o; + }else{ + while(null != node.next){ + //若不止只有2个 ,记录最后一个结点的前一个。 + Node lastNode = node; + node = node.next; + if(null == node.next){ + Object o = node.data; + lastNode.next = null; + last = lastNode; + size--; + return o; + } + } + } + } + throw new NoSuchElementException(); + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if(null != first){ + sb.append(first.data.toString() + ","); + Node node = first.next; + sb.append(node.data.toString() + ","); + while(null != node.next){ + node = node.next; + sb.append(node.data.toString() + ","); + } + } + return sb.toString(); + } + + + +} diff --git a/group16/420355244/Homework1/src/com/coding/basic/LinkedListTest.java b/group16/420355244/Homework1/src/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..2caea9679b --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/LinkedListTest.java @@ -0,0 +1,112 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class LinkedListTest { + private static LinkedList linkedList = new LinkedList(); + @Before + public void setUp() throws Exception { + } + + @Test + public void testAddObject() { + linkedList.add("aaa"); + linkedList.add("bbb"); + System.out.println(linkedList); + } + + @Test + public void testAddIntObject() { + linkedList.add("aaa"); + linkedList.add("bbb"); + linkedList.add("ccc"); + linkedList.add(2,"ddd"); + System.out.println(linkedList); + System.out.println(linkedList.size()); + } + + @Test + public void testGet() { + linkedList.add("aaa"); + linkedList.add("bbb"); + linkedList.add("ccc"); + linkedList.add("eee"); + linkedList.add("fff"); + linkedList.add("ddd"); +// System.out.println(linkedList.size()); + System.out.println(linkedList.get(3)); + } + + @Test + public void testRemove() { + linkedList.add("aaa"); + linkedList.add("bbb"); + linkedList.add("ccc"); + linkedList.add("eee"); + linkedList.add("fff"); + linkedList.add("ddd"); + linkedList.remove(5); + linkedList.remove(1); + linkedList.remove(2); + System.out.println(linkedList); + System.out.println(linkedList.size()); + } + + @Test + public void testSize() { + linkedList.add("aaa"); + linkedList.add("bbb"); + linkedList.add("ccc"); + linkedList.add("eee"); + linkedList.add("fff"); + linkedList.add("ddd"); + System.out.println(linkedList.size()); + } + + @Test + public void testAddFirst() { + linkedList.add("aaa"); + linkedList.add("bbb"); + linkedList.addFirst("sss"); + System.out.println(linkedList); + } + + @Test + public void testAddLast() { + linkedList.add("aaa"); + linkedList.add("bbb"); + linkedList.add("ccc"); + System.out.println(linkedList); + } + + @Test + public void testRemoveFirst() { + linkedList.add("aaa"); + linkedList.add("bbb"); + linkedList.add("ccc"); + linkedList.removeFirst(); + linkedList.addFirst("eee"); + linkedList.removeFirst(); + System.out.println(linkedList); + } + + @Test + public void testRemoveLast() { + linkedList.add("aaa"); + linkedList.add("bbb"); + linkedList.add("ccc"); + linkedList.removeLast(); + linkedList.add("eee"); + linkedList.addFirst("xxx"); + System.out.println(linkedList); + } + + @Test + public void testIterator() { + fail("Not yet implemented"); + } + +} diff --git a/group16/420355244/Homework1/src/com/coding/basic/List.java b/group16/420355244/Homework1/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group16/420355244/Homework1/src/com/coding/basic/Queue.java b/group16/420355244/Homework1/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..a2f9577b7b --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/Queue.java @@ -0,0 +1,66 @@ +package com.coding.basic; + +public class Queue { + private Node first; + private Node last; + private int size = 0; + public void enQueue(Object o){ + if(null == first){ + Node node = new Node(); + node.data = o; + node.next = null; + first = node; + last = node; + }else{ + Node node = new Node(); + node.data = o; + node.next = null; + last.next = node; + last = node; + } + size++; + } + + public Object deQueue(){ + Node second = first.next; + Object o = first.data; + if(null != second){ + first = second; + return o; + }else{ + first = null; + size = 0; + return o; + } + } + + public boolean isEmpty(){ + if(size > 0){ + return false; + }else{ + return true; + } + } + + public int size(){ + return size; + } + static class Node{ + Node next; + Object data; + } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if(null != first){ + sb.append(first.data.toString() + ","); + Node node = first.next; + sb.append(node.data.toString() + ","); + while(null != node.next){ + node = node.next; + sb.append(node.data.toString() + ","); + } + } + return sb.toString(); + } +} diff --git a/group16/420355244/Homework1/src/com/coding/basic/QueueTest.java b/group16/420355244/Homework1/src/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..50d7fc0903 --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/QueueTest.java @@ -0,0 +1,56 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class QueueTest { + + public static Queue queue = new Queue(); + @Before + public void setUp() throws Exception { + } + + @Test + public void testEnQueue() { + queue.enQueue("aaa"); + queue.enQueue("bbb"); + queue.enQueue("ccc"); + queue.enQueue("aaa"); + System.out.println(queue); + } + + @Test + public void testDeQueue() { + queue.enQueue("aaa"); + queue.enQueue("bbb"); + queue.enQueue("ccc"); + queue.enQueue("ddd"); + queue.enQueue("eee"); + queue.deQueue(); + System.out.println(queue); + } + + @Test + public void testIsEmpty() { + System.out.println(queue.isEmpty()); + + } + + @Test + public void testSize() { + queue.enQueue("aaa"); + queue.enQueue("bbb"); + queue.enQueue("ccc"); + queue.enQueue("ddd"); + queue.enQueue("eee"); + System.out.println(queue.size()); + } + + @Test + public void testToString() { + fail("Not yet implemented"); + } + +} diff --git a/group16/420355244/Homework1/src/com/coding/basic/Stack.java b/group16/420355244/Homework1/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..5c59bf34fc --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/Stack.java @@ -0,0 +1,39 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size = 0; + public void push(Object o){ + //入栈在栈顶进入最后压入 + elementData.add(o); + size ++; + } + + public Object pop(){ + Object object = elementData.get(size -1); + elementData.remove(size -1); + size --; + return object; + } + + public Object peek(){ + Object object = elementData.get(size -1); + return object; + } + public boolean isEmpty(){ + if(size <= 0){ + return true; + }else{ + return false; + } + } + public int size(){ + return size; + } + + @Override + public String toString() { + return elementData.toString(); + } + +} diff --git a/group16/420355244/Homework1/src/com/coding/basic/StackTest.java b/group16/420355244/Homework1/src/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..b436785574 --- /dev/null +++ b/group16/420355244/Homework1/src/com/coding/basic/StackTest.java @@ -0,0 +1,62 @@ +package com.coding.basic; + +import org.junit.Before; +import org.junit.Test; + +public class StackTest { + private static Stack stack = new Stack(); + @Before + public void setUp() throws Exception { + } + + @Test + public void testPush() { + stack.push("aaa"); + stack.push("bbb"); + stack.push("ccc"); + System.out.println(stack); + } + + @Test + public void testPop() { + stack.push("aaa"); + stack.push("bbb"); + stack.push("ccc"); + Object pop = stack.pop(); + System.out.println(pop); + System.out.println(stack); + } + + @Test + public void testPeek() { + stack.push("aaa"); + stack.push("bbb"); + stack.push("ccc"); + Object peek = stack.peek(); + System.out.println(peek); + } + + @Test + public void testIsEmpty() { + System.out.println(stack.isEmpty()); + stack.push("aaa"); + stack.push("bbb"); + stack.push("ccc"); + System.out.println(stack.isEmpty()); + stack.pop(); + stack.pop(); + stack.pop(); + System.out.println(stack.isEmpty()); + } + + @Test + public void testSize() { + stack.push("aaa"); + stack.push("bbb"); + stack.push("ccc"); + stack.pop(); + stack.pop(); + System.out.println(stack.size()); + } + +} diff --git a/group16/420355244/Homework2/.classpath b/group16/420355244/Homework2/.classpath new file mode 100644 index 0000000000..f5d4a033ec --- /dev/null +++ b/group16/420355244/Homework2/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group16/420355244/Homework2/.gitignore b/group16/420355244/Homework2/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group16/420355244/Homework2/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group16/420355244/Homework2/.project b/group16/420355244/Homework2/.project new file mode 100644 index 0000000000..1a13fc592d --- /dev/null +++ b/group16/420355244/Homework2/.project @@ -0,0 +1,17 @@ + + + Homework2 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group16/420355244/Homework2/src/com/coderising/action/LoginAction.java b/group16/420355244/Homework2/src/com/coderising/action/LoginAction.java new file mode 100644 index 0000000000..5496d8084d --- /dev/null +++ b/group16/420355244/Homework2/src/com/coderising/action/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.action; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java b/group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..5fd5f1efba --- /dev/null +++ b/group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,120 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static void reverseArray(int[] origin){ + for(int i = 0;i < origin.length/2; i++){ + int x = origin[i]; + origin[i] = origin[origin.length - i -1]; + origin[origin.length - i -1] = x; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray){ + for(int i = 0;i < oldArray.length ;i++){ + if(oldArray[i] == 0){ + int[] a = {}; + System.arraycopy(oldArray, 0, a, 0, i); + System.arraycopy(oldArray, 0, a, i, oldArray.length); + oldArray = a; + removeZero(oldArray); + } + } + return oldArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public static int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator){ + return null; + } + + public static void main(String[] args) { + /*int[] a = {7, 9 , 30, 3}; + reverseArray(a); + for (int i : a) { + System.out.print(i+","); + }*/ + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} ; + removeZero(oldArr); + for (int i : oldArr) { + System.out.print(i+","); + } + } +} diff --git a/group16/420355244/Homework2/src/com/coderising/litestruts/Struts.java b/group16/420355244/Homework2/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..40af955dfa --- /dev/null +++ b/group16/420355244/Homework2/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,133 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + //0. 读取配置文件struts.xml + SAXReader reader = new SAXReader(); + try { + //0.2 读取文件 + Document doc = reader.read(new File("./src/com/coderising/litestruts/struts.xml")); + //0.3 得到根标签 + Element rootElement = doc.getRootElement(); + //0.4 得到根标签下的所有action标签 + Iterator elementIterator = rootElement.elementIterator("action"); + while(elementIterator.hasNext()){ + Element element = elementIterator.next(); + String nameValue = element.attributeValue("name"); + try { + if(null != actionName && actionName.trim() != ""){ + if(actionName.equals(nameValue)){ + View view = new View(); + //进入该action标签内,结束后停止循环 + String classValue = element.attributeValue("class"); + //1.1 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象)据parameters中的数据 + Class clazz =Class.forName(classValue); + Object instance = clazz.newInstance(); + Method[] methods = clazz.getMethods(); + for (Entry entry : parameters.entrySet()) { + String methodName = "set" + entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1); + //1.2调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , "password"="1234") ,那就应该调用 setName和setPassword方法 + for (Method setterMethod : methods) { + if(methodName.equals(setterMethod.getName())){ + setterMethod.invoke(instance,entry.getValue()); + break; + } + } + } + //2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method method = clazz.getMethod("execute", null); + Object exectueResult = method.invoke(instance, null); + Iterator resultElement = element.elementIterator("result"); + while(resultElement.hasNext()){ + Element result = resultElement.next(); + if(exectueResult.equals(result.attributeValue("name"))){ + String jsp = result.getText(); + view.setJsp(jsp); + break; + } + } + /*3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters*/ + HashMap hashMap = new HashMap<>(); + for (Method getterMethod : methods) { + if(getterMethod.getName().contains("get")){ + Object resultValue = getterMethod.invoke(instance,null); + String resultKey = getterMethod.getName().replace("get", "").substring(0,1).toLowerCase() + + getterMethod.getName().replace("get", "").substring(1); + hashMap.put(resultKey, resultValue); + } + } + view.setParameters(hashMap); + return view; + } + } + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchMethodException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } catch (DocumentException e) { + e.printStackTrace(); + } + return null; + } + public static void main(String[] args) { + runAction("login",null); + } + +} diff --git a/group16/420355244/Homework2/src/com/coderising/litestruts/StrutsTest.java b/group16/420355244/Homework2/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group16/420355244/Homework2/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group16/420355244/Homework2/src/com/coderising/litestruts/View.java b/group16/420355244/Homework2/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group16/420355244/Homework2/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group16/420355244/Homework2/src/com/coderising/litestruts/struts.xml b/group16/420355244/Homework2/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..dd598a3664 --- /dev/null +++ b/group16/420355244/Homework2/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/502059278/.classpath b/group16/502059278/.classpath new file mode 100644 index 0000000000..c0abaf014f --- /dev/null +++ b/group16/502059278/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group16/502059278/.gitignore b/group16/502059278/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group16/502059278/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group16/502059278/.project b/group16/502059278/.project new file mode 100644 index 0000000000..72a951f7c1 --- /dev/null +++ b/group16/502059278/.project @@ -0,0 +1,17 @@ + + + DataStructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group16/502059278/src/cn/mark/work0219/MyArrayList.java b/group16/502059278/src/cn/mark/work0219/MyArrayList.java new file mode 100644 index 0000000000..3d7a064919 --- /dev/null +++ b/group16/502059278/src/cn/mark/work0219/MyArrayList.java @@ -0,0 +1,144 @@ +package cn.mark.work0219; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 自定义实现ArrayList的数据结构 + * @author hilih + * + */ +public class MyArrayList implements MyList{ + + private int size = 0; + + private Object[] elementData; + + public MyArrayList(){ + //默认容量初始化为10 + this(10); + } + + /** + * 初始即指定大小的构造方法 + * @param size 集合容量 + */ + public MyArrayList(int size){ + if ( size < 0 ){ + System.out.println("不合法的容量输入"); + return; + } + elementData = new Object[size]; + } + + /** + * 集合增容 + * @param minSize + */ + private void ensureSize(int minSize){ + int oldSize = elementData.length; + if(minSize > oldSize){ + int newSize = 3 * oldSize / 2 + 1; + if(minSize > newSize){ + newSize = minSize; + } + elementData = Arrays.copyOf(elementData, newSize); + } + } + + /** + * 下标范围判断 + * @param index + */ + private boolean rangeCheck(int index){ + if ( index >= size || index < 0 ){ + System.out.println("索引不合法!"); + return false; + } + return true; + } + + @Override + public boolean add(Object o) { + ensureSize(size+1); + elementData[size++] = o; + return true; + } + + @Override + public boolean add(int index, Object o) { + if (!rangeCheck(index)){ + return false; + } + ensureSize(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + return true; + } + + @Override + public Object get(int index) { + if (!rangeCheck(index)){ + return null; + } + Object o = elementData[index]; + return o; + } + + @Override + public Object remove(int index) { + if (!rangeCheck(index)){ + return null; + } + Object oldValue = elementData[index]; + int numMoved = size - index - 1; + if( numMoved > 0 ){ + System.arraycopy(elementData, index + 1, elementData, index, numMoved); + } + return oldValue; + } + + @Override + public int size() { + return size; + } + + + + @Override + public String toString() { + StringBuilder s = new StringBuilder(); + s.append("["); + for (int i = 0; i < size; i++){ + Object o = elementData[i]; + s.append(o.toString()); + if( i < size-1 ){ + s.append(","); + } + } + s.append("]"); + return s.toString(); + } + + /** + * 判断当前集合是否为空 + * @return + */ + public boolean isEmpty(){ + return size == 0; + } + + public static void main(String[] args) { + MyList list = new MyArrayList(); + list.add("a"); + list.add("b"); + list.add("c"); + list.add(2,"d"); + Object o = list.get(5); + System.out.println(o); + System.out.println(list.size()); + System.out.println(list); + } +} diff --git a/group16/502059278/src/cn/mark/work0219/MyLinkedList.java b/group16/502059278/src/cn/mark/work0219/MyLinkedList.java new file mode 100644 index 0000000000..896d7bcb79 --- /dev/null +++ b/group16/502059278/src/cn/mark/work0219/MyLinkedList.java @@ -0,0 +1,67 @@ +package cn.mark.work0219; +/** + * 自定义实现LinkedList数据结构 + * @author hilih + * + */ +public class MyLinkedList implements MyList{ + + private Node head; + private int size;//集合的长度 + + /** + * 添加元素 + */ + @Override + public boolean add(Object o) { + //为空判断 + if ( o == null ){ + System.out.println("不允许null的元素插入!"); + return false; + } + if(head == null){ + head = new Node(); + head.data = o; + }else{ + + } + + return false; + } + + @Override + public boolean add(int index, Object o) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object get(int index) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object remove(int index) { + // TODO Auto-generated method stub + return null; + } + + @Override + public int size() { + // TODO Auto-generated method stub + return 0; + } + + private static class Node{ + Object data; + Node next; + } + + + public static void main(String[] args) { + + + } + +} diff --git a/group16/502059278/src/cn/mark/work0219/MyList.java b/group16/502059278/src/cn/mark/work0219/MyList.java new file mode 100644 index 0000000000..91f26ff8d5 --- /dev/null +++ b/group16/502059278/src/cn/mark/work0219/MyList.java @@ -0,0 +1,32 @@ +package cn.mark.work0219; + +public interface MyList { + /** + * 向集合中增加元素 + * @param o + */ + public boolean add(Object o); + /** + * 向集合指定的位置中增加元素 + * @param index 下标 + * @param o 元素 + */ + public boolean add(int index, Object o); + /** + * 从集合指定位置取出元素 + * @param index 下标 + * @return + */ + public Object get(int index); + /** + * 从集合中删除指定位置的元素 + * @param index 下标 + * @return + */ + public Object remove(int index); + /** + * 当前集合的元素个数 + * @return + */ + public int size(); +} \ No newline at end of file diff --git a/group16/502059278/src/cn/mark/work0226/ArrayUtil.java b/group16/502059278/src/cn/mark/work0226/ArrayUtil.java new file mode 100644 index 0000000000..94e253e8bb --- /dev/null +++ b/group16/502059278/src/cn/mark/work0226/ArrayUtil.java @@ -0,0 +1,166 @@ +package cn.mark.work0226; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int[] target = new int[origin.length];//声明置换后数组 + int temp = target.length - 1;//记录置换后下标位置 + for( int i = 0; i < origin.length; i++ ){ + target[temp] = origin[i]; + temp--; + } + System.out.println("置换前:"+Arrays.toString(origin)); + System.out.println("置换后:"+Arrays.toString(target)); + + + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int[] target = new int[1]; + boolean flag = true; + for( int i = 0; i < oldArray.length; i++ ){ + if ( oldArray[i] == 0 ){ // 跳过值为0的元素 + continue; + } + + if ( flag ){ + //首位赋值无需扩容 + target[target.length-1] = oldArray[i]; + flag = false; + }else{ + //确定值不是0才能进入扩容步骤 + target = Arrays.copyOf(target, target.length+1); + target[target.length-1] = oldArray[i]; + } + + + + } + System.out.println("去0前:"+Arrays.toString(oldArray)); + System.out.println("去0后:"+Arrays.toString(target)); + return target; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + //1.去重 + int[] array3 = Arrays.copyOf(array1, array1.length); + for( int i = 0; i < array1.length; i++ ){ + for( int j = 0; j < array2.length ; j++ ){ + if ( array1[i] == array2[j] ){ + + } + } + + + + + } + + System.out.println(Arrays.toString(array1)); + System.out.println(Arrays.toString(array2)); + //2.合并 + + //3.排序 + + + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = Arrays.copyOf(oldArray, oldArray.length+size); + System.out.println("扩容后:"+Arrays.toString(newArray)); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder sb = new StringBuilder(); + for( int i = 0; i < array.length; i++ ){ + if ( i == 0 ){ + sb.append(array[i]); + }else{ + sb.append(seperator+array[i]); + } + } + return sb.toString(); + } + + + public static void main(String[] args) { + int[] a1 =new int[]{3,8}, a2 = new int[]{4, 5, 6,7}; + System.out.println(new ArrayUtil().join(a1, "*")); + + } +} diff --git a/group16/502059278/src/cn/mark/work0226/TestArrayUtil.java b/group16/502059278/src/cn/mark/work0226/TestArrayUtil.java new file mode 100644 index 0000000000..da1abd3b38 --- /dev/null +++ b/group16/502059278/src/cn/mark/work0226/TestArrayUtil.java @@ -0,0 +1,35 @@ +package cn.mark.work0226; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TestArrayUtil { + ArrayUtil arrayUtil = null; + + @Before + public void setUp() throws Exception { + arrayUtil = new ArrayUtil(); + + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void reverseArray() { + int[] origin = new int[]{1,2,8,31}; + arrayUtil.reverseArray(origin); + } + + @Test + public void removeZero() { + int[] origin = new int[]{0,1,2,0,3,0,4,7,0}; + Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 7}, arrayUtil.removeZero(origin)); + } + +} diff --git a/group16/502059278/src/cn/mark/work0226/litestruts/LoginAction.java b/group16/502059278/src/cn/mark/work0226/litestruts/LoginAction.java new file mode 100644 index 0000000000..4966d7d170 --- /dev/null +++ b/group16/502059278/src/cn/mark/work0226/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package cn.mark.work0226.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group16/502059278/src/cn/mark/work0226/litestruts/Struts.java b/group16/502059278/src/cn/mark/work0226/litestruts/Struts.java new file mode 100644 index 0000000000..93a449adaf --- /dev/null +++ b/group16/502059278/src/cn/mark/work0226/litestruts/Struts.java @@ -0,0 +1,84 @@ +package cn.mark.work0226.litestruts; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + String classPath = null; + String className = null; + + Document dom = XMLUtils.getDocument("bin"+File.separator+"struts.xml"); + Element ele = XMLUtils.getElement(dom, actionName); + Attribute classAttr = ele.attribute("class"); + classPath = classAttr.getValue(); + className = classPath.substring(classPath.lastIndexOf(".")+1); + System.out.println(className); + + + + try { + Class clz = Class.forName(classPath); + System.out.println(clz.getName()); + + + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + return null; + } + + + public static void main(String[] args) { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + Struts.runAction(actionName,params); + } +} diff --git a/group16/502059278/src/cn/mark/work0226/litestruts/StrutsTest.java b/group16/502059278/src/cn/mark/work0226/litestruts/StrutsTest.java new file mode 100644 index 0000000000..1a60626460 --- /dev/null +++ b/group16/502059278/src/cn/mark/work0226/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package cn.mark.work0226.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group16/502059278/src/cn/mark/work0226/litestruts/View.java b/group16/502059278/src/cn/mark/work0226/litestruts/View.java new file mode 100644 index 0000000000..31e3df3427 --- /dev/null +++ b/group16/502059278/src/cn/mark/work0226/litestruts/View.java @@ -0,0 +1,23 @@ +package cn.mark.work0226.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group16/502059278/src/cn/mark/work0226/litestruts/XMLUtils.java b/group16/502059278/src/cn/mark/work0226/litestruts/XMLUtils.java new file mode 100644 index 0000000000..2eeb6e624e --- /dev/null +++ b/group16/502059278/src/cn/mark/work0226/litestruts/XMLUtils.java @@ -0,0 +1,49 @@ +package cn.mark.work0226.litestruts; + +import java.util.List; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class XMLUtils { + /** + * 获取Document + * @param filePath 配置文件路径名 + * @return Document对象 + */ + public static Document getDocument(String filePath){ + //1.创建解析器 + SAXReader reader = new SAXReader(); + //2.解析XML文档,返回document对象 + Document dom = null; + try { + dom = reader.read(filePath); + } catch (DocumentException e) { + e.printStackTrace(); + } + return dom; + } + /** + * 获取指定action元素 + * @param doc Document + * @param actionName 要获取的元素属性名 + * @return 包含所要属性的元素 + */ + public static Element getElement(Document doc , String actionName){ + Element result = null; + Element root = doc.getRootElement(); + List elements = root.elements(); + for(Element e : elements){ + Attribute attr = e.attribute("name"); + if(attr.getValue().equals(actionName)){ + result = e; + return result; + } + } + return result; + } + +} diff --git a/group16/502059278/src/struts.xml b/group16/502059278/src/struts.xml new file mode 100644 index 0000000000..1aaa6ea5a0 --- /dev/null +++ b/group16/502059278/src/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/542087872/out/production/coding2017/com/coderising/litestruts/struts.xml b/group16/542087872/out/production/coding2017/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..a6cfe43e6c --- /dev/null +++ b/group16/542087872/out/production/coding2017/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/542087872/out/production/coding2017/net/coding/coderising/litestruts/struts.xml b/group16/542087872/out/production/coding2017/net/coding/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..3a726352c1 --- /dev/null +++ b/group16/542087872/out/production/coding2017/net/coding/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/542087872/src/net/coding/basic/ArrayList.java b/group16/542087872/src/net/coding/basic/ArrayList.java new file mode 100644 index 0000000000..a0286827d6 --- /dev/null +++ b/group16/542087872/src/net/coding/basic/ArrayList.java @@ -0,0 +1,88 @@ +package net.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + // 每次乘2增长 + private void grow() { + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + + + public void add(Object o){ + if (size >= elementData.length) { + this.grow(); + } + + elementData[size++] = o; + } + public void add(int index, Object o){ + if (size >= elementData.length) { + this.grow(); + } + System.arraycopy(elementData, index, elementData, index + 1, size - index); + + elementData[index] = o; + size++; + } + + public Object get(int index){ + if (index >= size) { + throw new IndexOutOfBoundsException(); + } + return elementData[index]; + } + + public Object remove(int index){ + if (index >= size) { + throw new IndexOutOfBoundsException(); + } + + Object el = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + + size--; + return el; + } + + public int size(){ + return size; + } + + private class ArrIter implements Iterator { + int cursor = 0; + + @Override + public boolean hasNext() { + return cursor < size; + } + + @Override + public Object next() { + return elementData[cursor++]; + } + } + + public Iterator iterator(){ + return new ArrIter(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < size; i++) { + sb.append(elementData[i]); + if (i < size - 1) { + sb.append(","); + } + } + sb.append("]"); + return sb.toString(); + } +} diff --git a/group16/542087872/src/net/coding/basic/BinaryTreeNode.java b/group16/542087872/src/net/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..4cac873d08 --- /dev/null +++ b/group16/542087872/src/net/coding/basic/BinaryTreeNode.java @@ -0,0 +1,62 @@ +package net.coding.basic; + +public class BinaryTreeNode { + + private int data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public int getData() { + return data; + } + public void setData(int data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + + public BinaryTreeNode(int data) { + this.data = data; + } + + private BinaryTreeNode insertAt(BinaryTreeNode node, int o) { + if (o < node.getData()) { + if (node.getLeft() != null) { + return insertAt(node.getLeft(), o); + } else { + BinaryTreeNode nowNode = new BinaryTreeNode(o); + node.setLeft(nowNode); + + return nowNode; + } + } else { + if (node.getRight() != null) { + return insertAt(node.getRight(), o); + } else { + BinaryTreeNode nowNode = new BinaryTreeNode(o); + node.setRight(nowNode); + return nowNode; + } + } + } + + public BinaryTreeNode insert(int o){ + return insertAt(this, o); + } + + @Override + public String toString() { + return "data: " + data; + } +} diff --git a/group16/542087872/src/net/coding/basic/Iterator.java b/group16/542087872/src/net/coding/basic/Iterator.java new file mode 100644 index 0000000000..ca3fd054ae --- /dev/null +++ b/group16/542087872/src/net/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package net.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group16/542087872/src/net/coding/basic/LinkedList.java b/group16/542087872/src/net/coding/basic/LinkedList.java new file mode 100644 index 0000000000..0f9d326545 --- /dev/null +++ b/group16/542087872/src/net/coding/basic/LinkedList.java @@ -0,0 +1,192 @@ +package net.coding.basic; + +public class LinkedList implements List { + + private Node head; + private Node tail; + + public void add(Object o){ + Node nowNode = new Node(o); + if (head == null) { + head = nowNode; + } else { + tail.next = nowNode; + } + tail = nowNode; + } + public void add(int index , Object o){ + int count = 0; + Node lastOne = null; + Node tpHead = head; + while (tpHead != null && count != index) { + count++; + lastOne = tpHead; + tpHead = tpHead.next; + } + if (count != index) { + throw new IndexOutOfBoundsException(); + } + + + Node nowNode = new Node(o); + if (lastOne == null) { + head = nowNode; + head.next = tpHead; + } else { + lastOne.next = nowNode; + nowNode.next = tpHead; + } + } + public Object get(int index){ + int count = 0; + Node tpHead = head; + while (tpHead != null && count != index) { + count++; + tpHead = tpHead.next; + } + if (count != index) { + throw new IndexOutOfBoundsException(); + } + + return tpHead.data; + } + public Object remove(int index){ + int count = 0; + Node lastOne = null; + Node tpHead = head; + while (tpHead != null && count != index) { + count++; + lastOne = tpHead; + tpHead = tpHead.next; + } + if (count != index) { + throw new IndexOutOfBoundsException(); + } + + if (lastOne == null) { + head = tpHead.next; + } else { + lastOne.next = tpHead.next; + } + + if (tpHead.next == null) { + tail = lastOne; + } + + return tpHead.data; + } + + public int size(){ + int count = 0; + Node tpHead = head; + while (tpHead != null) { + count ++; + tpHead = tpHead.next; + } + + return count; + } + + public void addFirst(Object o){ + Node nowNode = new Node(o); + if (head == null) { + head = nowNode; + tail = nowNode; + } else { + nowNode.next = head; + head = nowNode; + } + } + public void addLast(Object o){ + Node nowNode = new Node(o); + if (head == null) { + head = nowNode; + tail = nowNode; + } else { + tail.next = nowNode; + tail = nowNode; + } + } + public Object removeFirst(){ + if (head == null) { + throw new IndexOutOfBoundsException(); + } + + Node nowValue = head; + + Node nextNode = head.next; + if (nextNode == null) { + tail = null; + } + head = nextNode; + + return nowValue.data; + } + public Object removeLast(){ + if (head == null) { + throw new IndexOutOfBoundsException(); + } + + Node nowValue = tail; + + Node lastOne = null; + Node tpHead = head; + while (tpHead != tail) { + lastOne = tpHead; + tpHead = tpHead.next; + } + if (lastOne == null) { + head = null; + } else { + lastOne.next = null; + } + tail = lastOne; + + return nowValue.data; + } + + private class LinkIter implements Iterator { + + Node cursor = head; + + @Override + public boolean hasNext() { + return cursor != null; + } + + @Override + public Object next() { + Node ret = cursor; + cursor = cursor.next; + return ret.data; + } + } + + public Iterator iterator(){ + return new LinkIter(); + } + + + private static class Node{ + Object data; + Node next; + + public Node(Object data) { + this.data = data; + } + } + + @Override + public String toString() { + Node tpHead = head; + StringBuilder sb = new StringBuilder("["); + while (tpHead != null) { + sb.append(tpHead.data); + sb.append(","); + tpHead = tpHead.next; + } + sb.append("]"); + return sb.toString(); + } + +} diff --git a/group16/542087872/src/net/coding/basic/List.java b/group16/542087872/src/net/coding/basic/List.java new file mode 100644 index 0000000000..189fe091d8 --- /dev/null +++ b/group16/542087872/src/net/coding/basic/List.java @@ -0,0 +1,9 @@ +package net.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group16/542087872/src/net/coding/basic/Queue.java b/group16/542087872/src/net/coding/basic/Queue.java new file mode 100644 index 0000000000..d233a02617 --- /dev/null +++ b/group16/542087872/src/net/coding/basic/Queue.java @@ -0,0 +1,22 @@ +package net.coding.basic; + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o){ + linkedList.addLast(o); + } + + public Object deQueue(){ + return linkedList.removeFirst(); + } + + public boolean isEmpty(){ + return linkedList.size() == 0; + } + + public int size(){ + return linkedList.size(); + } +} diff --git a/group16/542087872/src/net/coding/basic/Stack.java b/group16/542087872/src/net/coding/basic/Stack.java new file mode 100644 index 0000000000..4a8099bcee --- /dev/null +++ b/group16/542087872/src/net/coding/basic/Stack.java @@ -0,0 +1,25 @@ +package net.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + Object o = elementData.get(elementData.size() - 1); + elementData.remove(elementData.size() - 1); + return o; + } + + public Object peek(){ + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group16/542087872/src/net/coding/basic/Test.java b/group16/542087872/src/net/coding/basic/Test.java new file mode 100644 index 0000000000..d973793899 --- /dev/null +++ b/group16/542087872/src/net/coding/basic/Test.java @@ -0,0 +1,166 @@ +package net.coding.basic; + + +/** + * Created by xiaoyuan on 25/02/2017. + */ +public class Test { + public static void main(String[] args) { + + testArrayList(); + testLinkedList(); + + testQueue(); + testStack(); + + + testBinaryTreeNode(); + } + + private static void testBinaryTreeNode() { + + BinaryTreeNode binaryTreeNode = new BinaryTreeNode(10); + binaryTreeNode.insert(5); + binaryTreeNode.insert(4); + binaryTreeNode.insert(6); + binaryTreeNode.insert(11); + + traverse(binaryTreeNode); + + } + + private static void traverse(BinaryTreeNode node) { + if (node.getLeft() != null) { + traverse(node.getLeft()); + } + + System.out.println("-- " + node.getData() + " --"); + + if (node.getRight() != null) { + traverse(node.getRight()); + } + + } + + + static void testStack() { + + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + + System.out.println(stack.size()); + System.out.println(stack.isEmpty()); + + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + + System.out.println(stack.isEmpty()); + + } + + static void testQueue() { + Queue queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + + System.out.println(queue.size()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.size()); + } + static void testLinkedList() { + LinkedList linkedList = new LinkedList(); + linkedList.add(1); + linkedList.add(2); + + System.out.println(linkedList.size()); + System.out.println(linkedList); + + linkedList.add(4); + linkedList.add(5); + System.out.println(linkedList.size()); + System.out.println(linkedList); + + + linkedList.add(0, 10); + linkedList.add(0, 9); + System.out.println(linkedList.size()); + System.out.println(linkedList); + + System.out.println(linkedList.get(3)); + + linkedList.remove(0); + System.out.println(linkedList.size()); + System.out.println(linkedList); + + + linkedList.addFirst(100); + linkedList.addLast(8888); + System.out.println(linkedList.size()); + System.out.println(linkedList); + + + linkedList.removeFirst(); + linkedList.removeLast(); + System.out.println(linkedList.size()); + System.out.println(linkedList); + + Iterator iterator = linkedList.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + + } + + static void testArrayList() { + ArrayList arrayList = new ArrayList(); + arrayList.add("1"); + arrayList.add("2"); + // test size and add + System.out.println(arrayList.size()); + System.out.println(arrayList); + + + arrayList.add("3"); + arrayList.add("4"); + arrayList.add("5"); + arrayList.add("6"); + arrayList.add("7"); + arrayList.add("8"); + arrayList.add("9"); + arrayList.add("10"); + arrayList.add("11"); + arrayList.add("12"); + arrayList.add("13"); + + // test size + // test grow + System.out.println(arrayList.size()); + System.out.println(arrayList); + + // test add at index + arrayList.add(2, 100); + System.out.println(arrayList.size()); + System.out.println(arrayList); + + // test remove + arrayList.remove(0); + System.out.println(arrayList.size()); + System.out.println(arrayList); + arrayList.remove(2); + System.out.println(arrayList.size()); + System.out.println(arrayList); + + // test iterator + Iterator iterator = arrayList.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + + } +} diff --git a/group16/542087872/src/net/coding/coderising/array/ArrayUtil.java b/group16/542087872/src/net/coding/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..38ce6ff0ca --- /dev/null +++ b/group16/542087872/src/net/coding/coderising/array/ArrayUtil.java @@ -0,0 +1,203 @@ +package net.coding.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int l = 0, r = origin.length - 1; + while (l < r) { + int tmp = origin[l]; + origin[l] = origin[r]; + origin[r] = tmp; + l++; + r--; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int cntZero = 0; + for (int i = 0; i < oldArray.length;i++) { + if (oldArray[i] == 0) { + cntZero ++; + } + } + if (cntZero == 0) { + return oldArray; + } + + int[] newArray = new int[oldArray.length - cntZero]; + int j = 0; + for (int i = 0; i < oldArray.length;i++) { + if (oldArray[i] != 0) { + newArray[j++] = oldArray[i]; + } + } + + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int[] result = new int[array1.length + array2.length]; + int l = 0; + int r = 0; + + int cnt = 0; + while (true) { + if (l >= array1.length && r >= array2.length) { + break; + } + if (l >= array1.length) { + result[cnt++] = array2[r]; + r++; + } else if (r >= array1.length) { + result[cnt++] = array1[l]; + l++; + } else { + if (array1[l] < array2[r]) { + result[cnt++] = array1[l]; + l++; + } else { + result[cnt++] = array2[r]; + r++; + } + } + } + + return result; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] result = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, result, 0, oldArray.length); + return result; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int[] result = {}; + int a = 0; + int b = 1; + + int cnt = 0; + while (b < max) { + result = grow(result, 1); + result[cnt++] = b; + int tmp = a + b; + a = b; + b = tmp; + } + + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[1,2,3,5,7,11,13,17,19] + * @param max + * @return + */ + private boolean isPrime(int n) { + for (int i = 2; i <= Math.sqrt(n + 1.0); i++) { + if (n % i == 0) { + return false; + } + } + return true; + } + public int[] getPrimes(int max){ + int[] result = {}; + int cnt = 0; + for (int i = 1; i < max; i++) { + if (isPrime(i)) { + result = grow(result, 1); + result[cnt++] = i; + } + } + return result; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + private boolean isPerfect(int n) { + int total = 0; + for (int i = 1; i < n; i++) { + if (n % i == 0) { + total += i; + } + } + + return total == n; + } + public int[] getPerfectNumbers(int max){ + int[] result = {}; + int cnt = 0; + for (int i = 1; i < max; i++) { + if (isPerfect(i)) { + result = grow(result, 1); + result[cnt++] = i; + } + } + return result; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + if (sb.length() > 0) { + sb.append(seperator); + } + sb.append(array[i]); + } + return sb.toString(); + } + + +} diff --git a/group16/542087872/src/net/coding/coderising/array/ArrayUtilTest.java b/group16/542087872/src/net/coding/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..0ae290bbfd --- /dev/null +++ b/group16/542087872/src/net/coding/coderising/array/ArrayUtilTest.java @@ -0,0 +1,76 @@ +package net.coding.coderising.array; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by xiaoyuan on 02/03/2017. + */ +public class ArrayUtilTest { + + @Test + public void testReverseArray() { + int[] nums = {1, 2, 3}; + new ArrayUtil().reverseArray(nums); + Assert.assertArrayEquals(nums, new int[]{3, 2, 1}); + } + // removeZero + @Test + public void testRemoveZero() { + int[] nums = {0, 1, 0, 2, 3}; + int[] ans = new ArrayUtil().removeZero(nums); + Assert.assertArrayEquals(ans, new int[]{1, 2, 3}); + } + + // merge + @Test + public void testMerge() { + int[] nums1 = {1, 3, 9}; + int[] nums2 = {2, 4, 5}; + int[] ans = new ArrayUtil().merge(nums1, nums2); + Assert.assertArrayEquals(ans, new int[]{1, 2, 3, 4, 5, 9}); + } + + // grow + @Test + public void testGrow() { + int[] nums = {1, 3, 9}; + int[] ans = new ArrayUtil().grow(nums, 2); + Assert.assertArrayEquals(ans, new int[]{1, 3, 9, 0, 0}); + } + + // fibonacci + @Test + public void testFibonacci() { + int[] ans = new ArrayUtil().fibonacci(10); + Assert.assertArrayEquals(ans, new int[]{1, 1, 2, 3, 5, 8}); + } + + + // getPrimes + @Test + public void testgetPrimes() { + int[] ans = new ArrayUtil().getPrimes(10); + Assert.assertArrayEquals(ans, new int[]{1, 2, 3, 5, 7}); + } + + + // getPerfectNumbers + @Test + public void testGetPerfectNumbers() { + int[] ans = new ArrayUtil().getPerfectNumbers(10); + Assert.assertArrayEquals(ans, new int[]{6}); + } + + + // join + + @Test + public void testJoin() { + String ans = new ArrayUtil().join(new int[]{1, 3, 4}, "-"); + Assert.assertEquals(ans, "1-3-4"); + } + + + +} diff --git a/group16/542087872/src/net/coding/coderising/litestruts/LoginAction.java b/group16/542087872/src/net/coding/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..2d52d70bb8 --- /dev/null +++ b/group16/542087872/src/net/coding/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package net.coding.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group16/542087872/src/net/coding/coderising/litestruts/LogoutAction.java b/group16/542087872/src/net/coding/coderising/litestruts/LogoutAction.java new file mode 100644 index 0000000000..560d8f4fd8 --- /dev/null +++ b/group16/542087872/src/net/coding/coderising/litestruts/LogoutAction.java @@ -0,0 +1,36 @@ +package net.coding.coderising.litestruts; + +/** + * Created by xiaoyuan on 02/03/2017. + */ +public class LogoutAction { + + String ifLogout; + String message; + + public String execute() { + if (ifLogout.equals("yes")) { + this.message = "success"; + return "success"; + } else { + this.message = "error"; + return "error"; + } + } + + public String getIfLogout() { + return ifLogout; + } + + public void setIfLogout(String ifLogout) { + this.ifLogout = ifLogout; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/group16/542087872/src/net/coding/coderising/litestruts/Struts.java b/group16/542087872/src/net/coding/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..5fb61e3e1a --- /dev/null +++ b/group16/542087872/src/net/coding/coderising/litestruts/Struts.java @@ -0,0 +1,126 @@ +package net.coding.coderising.litestruts; + + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + Map name2ClassMap = new HashMap(); + Map result2JSPMap = new HashMap(); + + + try { + File xmlFile = new File("group16/542087872/src/net/coding/coderising/litestruts/struts.xml"); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = factory.newDocumentBuilder(); + Document doc = documentBuilder.parse(xmlFile); + + doc.getDocumentElement().normalize(); + + NodeList actionList = doc.getElementsByTagName("action"); + for (int i = 0; i < actionList.getLength(); i++) { + Node node = actionList.item(i); + System.out.println(node.getNodeName()); + if (node.getNodeType() == Node.ELEMENT_NODE) { + Element element = (Element)node; + String acName = element.getAttribute("name"); + String acClass = element.getAttribute("class"); + name2ClassMap.put(acName, acClass); + + NodeList resultList = element.getElementsByTagName("result"); + for (int j = 0; j < resultList.getLength(); j++) { + Element resultElemet = (Element)(resultList.item(j)); + String acResultName = resultElemet.getAttribute("name"); + String acResultJSP = resultElemet.getTextContent(); + + result2JSPMap.put(acName + "_" + acResultName, acResultJSP); + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("parse XML ERROR!"); + } + + String classStr = name2ClassMap.get(actionName); + if (classStr == null) { + throw new RuntimeException("ACTION FOUND ERROR!"); + } + + try { + Class actionClass = Class.forName(classStr); + Object actionObj = actionClass.newInstance(); + for (String key : parameters.keySet()) { + String value = parameters.get(key); + Method theMethod = actionClass.getMethod("set" + key.substring(0, 1).toUpperCase() + key.substring(1), String.class); + theMethod.invoke(actionObj, value); + } + + // execut + Method exeMethod = actionClass.getMethod("execute"); + String result = (String)exeMethod.invoke(actionObj); + + // find JSP + String JSPPath = result2JSPMap.get(actionName + "_" + result); + View view = new View(); + view.setJsp(JSPPath); + + // generate map + Map map = new HashMap(); + for(Method method: actionClass.getMethods()) { + if (method.getName().startsWith("get")) { + Object key = method.getName().substring(3).toLowerCase(); + Object value = method.invoke(actionObj); + map.put(key, value); + } + } + view.setParameters(map); + + return view; + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + public static void main(String[] args) { + runAction(null, null); + } + +} diff --git a/group16/542087872/src/net/coding/coderising/litestruts/StrutsTest.java b/group16/542087872/src/net/coding/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..dfb31ee0f3 --- /dev/null +++ b/group16/542087872/src/net/coding/coderising/litestruts/StrutsTest.java @@ -0,0 +1,70 @@ +package net.coding.coderising.litestruts; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + + + @Test + public void testLogoutActionSuccess() { + String actionName = "logout"; + + Map params = new HashMap(); + params.put("ifLogout","yes"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/welcome.jsp", view.getJsp()); + Assert.assertEquals("success", view.getParameters().get("message")); + } + + @Test + public void testLogoutActionError() { + String actionName = "logout"; + + Map params = new HashMap(); + params.put("ifLogout","no"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/error.jsp", view.getJsp()); + Assert.assertEquals("error", view.getParameters().get("message")); + } + +} diff --git a/group16/542087872/src/net/coding/coderising/litestruts/View.java b/group16/542087872/src/net/coding/coderising/litestruts/View.java new file mode 100644 index 0000000000..7101682d65 --- /dev/null +++ b/group16/542087872/src/net/coding/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package net.coding.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group16/542087872/src/net/coding/coderising/litestruts/struts.xml b/group16/542087872/src/net/coding/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..3a726352c1 --- /dev/null +++ b/group16/542087872/src/net/coding/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/63912401/.classpath b/group16/63912401/.classpath new file mode 100644 index 0000000000..34c2d41672 --- /dev/null +++ b/group16/63912401/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/group16/63912401/.gitignore b/group16/63912401/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group16/63912401/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group16/63912401/.project b/group16/63912401/.project new file mode 100644 index 0000000000..91b20aa78f --- /dev/null +++ b/group16/63912401/.project @@ -0,0 +1,17 @@ + + + 63912401 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group16/63912401/src/com/coderising/action/LoginAction.java b/group16/63912401/src/com/coderising/action/LoginAction.java new file mode 100644 index 0000000000..9e0b9f2ff7 --- /dev/null +++ b/group16/63912401/src/com/coderising/action/LoginAction.java @@ -0,0 +1,45 @@ +package com.coderising.action; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/group16/63912401/src/com/coderising/array/ArrayUtil.java b/group16/63912401/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..fa0e056502 --- /dev/null +++ b/group16/63912401/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,270 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + + +/** + * ArrayUtil + * @author greenhills + * 2017年2月28日 下午10:49:41 + */ +public class ArrayUtil { + + public static void main(String[] args) { +// int[] array1={5,8,9,0,-4}; +// int[] array2={4,5,6,7,8,9}; +// int[] array3=ArrayUtil.merge(array1, array2); +// for(Integer t:array3){ +// System.out.print(t +"\t"); +// } + +// int[] array3={4,5,6,7,8,9}; +// array3 = ArrayUtil.grow(array3,5); +// for(int t:array3){ +// System.out.print(t +"\t"); +// } + +// int[] array4=ArrayUtil.fibonacci(100); +// for(Integer t:array4){ +// System.out.print(t +"\t"); +// } + +// int[] array5=ArrayUtil.getPrimes(2); +// for(Integer t:array5){ +// System.out.print(t +"\t"); +// } + + int[] array6=ArrayUtil.getPerfectNumbers(2000); + for(Integer t:array6){ + System.out.print(t +"\t"); + } + + } + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static void reverseArray(int[] origin){ + for (int i = 0; i < origin.length>>1; i++) { + origin[i]^=origin[origin.length - 1 - i]^(origin[origin.length - 1 - i]=origin[i]); + } + + //方法2 可以使用Collections.reverse(list)方法,但是int 和 Integer数组之间转化消耗性能 + //Collections.reverse(list); + } + + /** + * 现在有如下的一个数组: Integer oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + List list=new ArrayList(); + for(Integer data:oldArray){ + if(data != 0){ + list.add(data); + } + } + int[] newArray=new int[list.size()]; + for(Integer i=0;i set=new HashSet(); + for(Integer t:array1){ + set.add(t); + } + for(Integer t:array2){ + set.add(t); + } + List list=new ArrayList(set); + java.util.Collections.sort(list); + int[] result =new int[list.size()]; + for(int i=0;i 1){ + List list=new ArrayList(); + list.add(1); + list.add(1); + int i=0; + int temp=list.get(i)+list.get(i+1); + while(temp < max){ + list.add(temp); + i++; + temp=list.get(i)+list.get(i+1); + } + + result=new int[list.size()]; + + i=0; + for(int d:list){ + result[i]=d; + i++; + } + } + + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public static int[] getPrimes(int max){ + List list=new ArrayList(); + for(int i=2;i list=new ArrayList(); + for(int i=1;i resultMappings=new HashMap(); + + public ActionMapping() {} + + public ActionMapping(String name, String className, String method) { + this.name = name; + this.className = className; + this.method = StringUtils.isBlank(method) ? "execute" : method; //未配置时,默认查找execute方法执行 + } + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getClassName() { + return className; + } + public void setClassName(String className) { + this.className = className; + } + public String getMethod() { + return method; + } + public void setMethod(String method) { + this.method = method; + } + public Map getResultMappings() { + return resultMappings; + } + public void setResultMappings(Map resultMappings) { + this.resultMappings = resultMappings; + } + + //扩展的方法,用于保存 + public void setResultMappings(String key, ResultMapping value) { + this.resultMappings.put(key, value); + } +} diff --git a/group16/63912401/src/com/coderising/litestruts/ConfigurationManager.java b/group16/63912401/src/com/coderising/litestruts/ConfigurationManager.java new file mode 100644 index 0000000000..2925367814 --- /dev/null +++ b/group16/63912401/src/com/coderising/litestruts/ConfigurationManager.java @@ -0,0 +1,83 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +/** + * 解析XML文件 + * ConfigurationManager + * @author greenhills + * 2017年2月27日 下午10:18:10 + */ +public class ConfigurationManager { + /** + * 读取xml文件的文档对象 + */ + private static Document document; + /** + * 配置文件路径 + */ + static String configureFileName="struts.xml"; + /** + * 当前类路径 + */ + static String currentPath; + static{ + currentPath = ConfigurationManager.class.getResource("").getPath().substring(1); + } + + static{ + try { + SAXReader sax=new SAXReader(); + document = sax.read(new File(currentPath+configureFileName)); + } catch (DocumentException e) { + e.printStackTrace(); + } + } + + /** + * 解析配置文件 + * ConfigurationManager.java + * @param @return + * @author greenhills + * 2017年2月27日 下午11:28:59 + */ + public static Map loadXml(){ + Map actionMappings=new HashMap(); + + Element root=document.getRootElement(); + List actionList= root.elements("action"); + + for(Element actionElemnt:actionList){ + ActionMapping actionMapping=new ActionMapping( + actionElemnt.attributeValue("name"), + actionElemnt.attributeValue("class"), + actionElemnt.attributeValue("method") + ); + //获取action下的result节点 + List resultList = actionElemnt.elements("result"); + for(Element resultElemnt:resultList){ + ResultMapping resultMapping=new ResultMapping( + resultElemnt.attributeValue("name"), + resultElemnt.attributeValue("type"), + resultElemnt.getTextTrim() + ); + + //保存ResultMapping(以result标签的name为key) + actionMapping.setResultMappings(resultMapping.getName(),resultMapping); + } + + //保存ActionMapping(以action标签的name为key) + actionMappings.put(actionMapping.getName(), actionMapping); + } + + return actionMappings; + } +} diff --git a/group16/63912401/src/com/coderising/litestruts/DefaultAction.java b/group16/63912401/src/com/coderising/litestruts/DefaultAction.java new file mode 100644 index 0000000000..94894bfdf2 --- /dev/null +++ b/group16/63912401/src/com/coderising/litestruts/DefaultAction.java @@ -0,0 +1,121 @@ +package com.coderising.litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * @author greenhills + * @version 创建时间:2017年2月27日 下午11:48:56 + * + */ +public class DefaultAction { + private ActionMapping actionMapping; + private Object targetAction; //由DefaultAction反射调用的目标对象 + + //构造方法,实例化对象 + public DefaultAction(ActionMapping actionMapping) { + this.actionMapping = actionMapping; + //实例化对象 + try { + this.targetAction = Class.forName(this.actionMapping.getClassName()).newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 初始化参数 + * DefaultAction.java + * @param + * @author greenhills + * 2017年2月27日 下午11:58:05 + */ + public void initParam(Map parameters){ + Class clazz=this.targetAction.getClass(); + Set keys=parameters.keySet(); + try { + for(String key:keys){ + String _key = getFirstUpper(key); + //调用set方法赋值 + Method method=clazz.getDeclaredMethod("set"+_key,clazz.getDeclaredField(key).getType()); + method.invoke(this.targetAction, parameters.get(key)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 调用实例方法 + * DefaultAction.java + * @param @return + * @author greenhills + * 2017年2月27日 下午11:53:56 + */ + public String runMethod(){ + String methodName=this.actionMapping.getMethod(); + Class clazz=this.targetAction.getClass(); + String result="success"; + //调用set方法赋值 + try { + Method method=clazz.getDeclaredMethod(methodName); + result = (String) method.invoke(this.targetAction); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * 获取action字段的值 + * DefaultAction.java + * @param @param fields + * @param @return + * @author greenhills + * 2017年2月28日 上午12:39:01 + */ + public Map getFieldValue(String[] fields){ + Map result=new HashMap(); + try { + Class clazz=this.targetAction.getClass(); + for(String field:fields){ + String _field = getFirstUpper(field); + //调用get方法获取值 + Method method=clazz.getDeclaredMethod("get"+_field); + result.put(field,method.invoke(this.targetAction)); + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + + /** + * 将首字母改为大写 + * DefaultAction.java + * @param @param val + * @param @return + * @author greenhills + * 2017年2月28日 上午12:24:34 + */ + private String getFirstUpper(String val){ + return val.substring(0, 1).toUpperCase()+val.substring(1); + } + + + public ActionMapping getActionMapping() { + return actionMapping; + } + public void setActionMapping(ActionMapping actionMapping) { + this.actionMapping = actionMapping; + } + public Object getTargetAction() { + return targetAction; + } + public void setTargetAction(Object targetAction) { + this.targetAction = targetAction; + } +} diff --git a/group16/63912401/src/com/coderising/litestruts/ResultMapping.java b/group16/63912401/src/com/coderising/litestruts/ResultMapping.java new file mode 100644 index 0000000000..975b040d7a --- /dev/null +++ b/group16/63912401/src/com/coderising/litestruts/ResultMapping.java @@ -0,0 +1,48 @@ +package com.coderising.litestruts; + +import org.apache.commons.lang3.StringUtils; + +/** + * @author greenhills + * @version 创建时间:2017年2月27日 下午10:39:20 + * + */ +public class ResultMapping { + /** + * 映射结构:/jsp/homepage.jsp + */ + private String name; + private String type; + private String urlPath; + + public ResultMapping() { + super(); + } + + public ResultMapping(String name, String type, String urlPath) { + super(); + this.name = StringUtils.isBlank(name) ? "success" : name; //默认成功 + this.type = StringUtils.isBlank(type) ? "dispatcher" : type; //默认转发 + this.urlPath = urlPath; + } + + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getUrlPath() { + return urlPath; + } + public void setUrlPath(String urlPath) { + this.urlPath = urlPath; + } +} diff --git a/group16/63912401/src/com/coderising/litestruts/Struts.java b/group16/63912401/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..20975a7501 --- /dev/null +++ b/group16/63912401/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,37 @@ +package com.coderising.litestruts; + +import java.util.Map; + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { +// 0. 读取配置文件struts.xml + Map actionMappings = ConfigurationManager.loadXml(); + +// 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) +// 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 +// ("name"="test" , "password"="1234") , +// 那就应该调用 setName和setPassword方法 + ActionMapping actionMapping = actionMappings.get(actionName); + DefaultAction action=new DefaultAction(actionMapping); + action.initParam(parameters); + +// 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + String result= action.runMethod(); + +// 3. 通过反射找到对象的所有getter方法(例如 getMessage), +// 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , +// 放到View对象的parameters + + Map messageMaps=action.getFieldValue(new String[]{"message"}); + +// 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, +// 放到View对象的jsp字段中。 + View view =new View(); + view.setJsp(actionMapping.getResultMappings().get(result).getUrlPath()); + view.setParameters(messageMaps); + return view; + } + +} diff --git a/group16/63912401/src/com/coderising/litestruts/StrutsTest.java b/group16/63912401/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..9f20bbfd59 --- /dev/null +++ b/group16/63912401/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group16/63912401/src/com/coderising/litestruts/View.java b/group16/63912401/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group16/63912401/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group16/63912401/src/com/coderising/litestruts/struts.xml b/group16/63912401/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..9982b114c7 --- /dev/null +++ b/group16/63912401/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group16/63912401/src/com/coding/basic/ArrayList.java b/group16/63912401/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..939c97782e --- /dev/null +++ b/group16/63912401/src/com/coding/basic/ArrayList.java @@ -0,0 +1,206 @@ +package com.coding.basic; + +import java.util.Arrays; + +/** + * ArrayList + * @author greenhills + * @version 创建时间:2017年2月19日 下午10:54:02 + * @param + * + */ +public class ArrayList implements List { + /** + * 默认容量 + */ + private static final int DEFAULT_CAPACITY = 10; + + /** + * 数据存放区 + */ + private Object[] elementData; + + /** + * 真实的数据数量 + */ + private int size = 0; + + /** + * 无参构造函数 + */ + public ArrayList(){ + this.elementData=new Object[DEFAULT_CAPACITY]; + } + + /** + * 带初始大小的构造函数 + * @param beginSize + */ + public ArrayList(int beginSize){ + if(beginSize<0) + this.elementData=new Object[DEFAULT_CAPACITY]; + else + this.elementData=new Object[beginSize]; + } + + /** + * 在后面追加数据 + */ + @Override + public void add(Object o){ + autoGrow(size+1); + this.elementData[size++] = o; //在尾部追加数据 + } + + /** + * 把数据加入指定索引处 + */ + @Override + public void add(int index, Object o){ + rangeCheck(index); + autoGrow(size+1); + //把index处的所有数据往后移 + //System.arraycopy(elementData, index, elementData, index+1, size-index); + + for(int i=size;i>index;i--){ + elementData[i] = elementData[i-1]; + } + + this.elementData[index] = o; //使数据连续加入 + size++; + } + + /** + * 获取指定索引处的数据 + */ + @Override + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + + /** + * 获取末尾数据 + */ + public Object getLast(){ + return elementData[this.size-1]; + } + + /** + * 移除索引处数据 + */ + @Override + public Object remove(int index){ + rangeCheck(index); + + Object removed = elementData[index]; + int num=size - index - 1; //移动数量 + if(num>0) { + System.arraycopy(elementData, index+1, elementData, index,num); + } + elementData[--size] = null; //清除最后一个数据位 + return removed; + } + + /** + * 移除末尾数据 + */ + public Object removeLast(){ + return remove(this.size-1); + } + + /** + * 获取数据量 + */ + @Override + public int size(){ + return this.size; + } + + /** + * 获取存储数据的容量大小 + */ + @Override + public int capacity() { + return this.elementData.length; + } + + /** + * 判断是否为空 + */ + @Override + public boolean isEmpty() { + return this.size==0; + } + + /** + * 空间容量自增长 + * @param minCapacity 增长后最小容量 + */ + private void autoGrow(int minCapacity){ + int oldCapacity = elementData.length; + if (minCapacity >= oldCapacity) { + int newCapacity = oldCapacity<<1; //空间翻倍 + if (newCapacity < minCapacity){ + newCapacity = minCapacity; + } + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + /** + * 判断是否为有效索引 + * @param @param index + * @param @return + */ + private void rangeCheck(int index) { + if (!isEffectiveIndex(index)) + throw new IndexOutOfBoundsException("Index: "+index+" Out Of Bounds, 有效数据索引范围:0~"+(this.size-1)); + } + + /** + * 判断是否为有效索引 + * @param @param index + * @param @return + */ + private boolean isEffectiveIndex(int index){ + return index >-1 && index < this.size; + } + + /** + * 返回遍历数据对象 + * @param @return + * @author greenhills + * 2017年2月25日 下午9:55:31 + */ + public Iterator iterator(){ + return new Its(); + } + + /** + * 实现Iterator的内部实现类 + * Its + * @author greenhills + * 2017年2月25日 下午9:54:54 + */ + private class Its implements Iterator { + private int index=0; + + public Its(){ + //this.len = size; //逆向遍历 + } + + @Override + public boolean hasNext() { +// return this.len > 0; //逆向遍历 + return this.index < size; //正向遍历 + } + + @Override + public Object next() { +// return get(--this.len); //逆向遍历 +// return elementData[--this.len];//逆向遍历 + return get(this.index++); //正向遍历 + } + } +} diff --git a/group16/63912401/src/com/coding/basic/BinaryTreeNode.java b/group16/63912401/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..c1ac02e684 --- /dev/null +++ b/group16/63912401/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,99 @@ +package com.coding.basic; + +/** + * 二叉树数据结构 + * BinaryTreeNode + * @author greenhills + * 2017年2月25日 下午9:51:05 + */ +public class BinaryTreeNode implements Comparable{ + + private int height=0; //当前树高度 + private Object data; //当前节点数据 + private BinaryTreeNode left; //小于当前节点数据data的节点 + private BinaryTreeNode right; //大于当前节点数据data的节点 + + public BinaryTreeNode() { + } + + public BinaryTreeNode(Object data) { + this.data = data; + } + + public BinaryTreeNode insert(Object o){ + BinaryTreeNode newNode=new BinaryTreeNode(o); + BinaryTreeNode that = findNode(o); + int result=that.compareTo(o); + + if(result<0){//节点数据小于插入数据,进右树 + that.setRight(newNode); + }else if(result>0){ //当前节点数据大于插入数据,进左树 + that.setLeft(newNode); + }else{ + return null; + } + newNode.height++; //树高度加1 + return newNode; + } + + private BinaryTreeNode findNode(Object data){ + int result=this.compareTo(data); + BinaryTreeNode that = new BinaryTreeNode(); //空节点 + if(result<0){ //当前节点数据小于插入数据,进右树 + if(this.right==null){ + that = this; + }else{ + that = findNode(this.getRight()); + } + }else if(result>0){ //当前节点数据大于插入数据,进左树 + if(this.left==null){ + that = this; + }else{ + that = findNode(this.getLeft()); + } + }else{ + System.out.println("无效数据"); + } + return that; + } + + public int getTreeMaxHeight(){ + int h=0; + //TODO + + return h; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + @Override + public int compareTo(Object o) { + if(this.data==null || o==null) return 0; + return Double.valueOf(this.data.toString()).compareTo(Double.valueOf(o.toString())); + } +} diff --git a/group16/63912401/src/com/coding/basic/Iterator.java b/group16/63912401/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..017cbc4240 --- /dev/null +++ b/group16/63912401/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group16/63912401/src/com/coding/basic/LinkedList.java b/group16/63912401/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..227d38e234 --- /dev/null +++ b/group16/63912401/src/com/coding/basic/LinkedList.java @@ -0,0 +1,320 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +/** + * 链表数据结构 + * LinkedList + * @author greenhills + * 2017年2月22日 下午11:52:41 + */ +public class LinkedList implements List { + /** + * 链表数据量 + */ + private int size=0; + /** + * 链表头节点 + */ + private Node head; + /** + * 链表尾节点 + */ + private Node tail; + + + /** + * 在数据链尾部添加数据 + */ + @Override + public void add(Object o) { + addLast(o); + } + + /** + * 在数据链指定位置添加数据 + */ + @Override + public void add(int index, Object data) { + checkIndex(index); + Node old=getNode(index); + link2Before(old,data); + } + + /** + * 获取指定索引处数据 + */ + @Override + public Object get(int index) { + checkIndex(index); + return getNode(index).data; + } + + /** + * 移除指定索引位置的节点 + */ + @Override + public Object remove(int index) { + checkIndex(index); + return unlink(getNode(index)); + } + + /** + * 获取数据链的数据量 + */ + @Override + public int size() { + return this.size; + } + + /** + * 获取数据链的数据量 + */ + @Override + @Deprecated + public int capacity() { + return size(); + } + + /** + * 判断是否为空 + */ + @Override + public boolean isEmpty() { + return this.size==0; + } + + /** + * 在数据链头部追加数据 + * @param data + */ + public void addFirst(Object data){ + final Node oldNode=this.head; + final Node newNode=new Node(null,data,oldNode);//形成新节点,并指向第一个节点 + this.head = newNode; //变更集合保存的首节点 + + if(oldNode == null){ //没有数据 + this.tail = newNode; //变更集合保存的尾节点 + }else{ + oldNode.prev = newNode; //原首节点指向新的首节点 + } + this.size++;//数据量加1 + } + + /** + * 在数据链尾部追加数据 + * @param data + */ + public void addLast(Object data){ + final Node oldNode=this.tail; + final Node newNode=new Node(oldNode,data,null);//形成新节点,并指向最后一个节点 + this.tail = newNode; //变更集合保存的尾节点 + + if(oldNode == null){ //没有数据 + this.head = newNode; //变更集合保存的首节点 + }else{ + oldNode.next = newNode;//原尾节点指向新的尾节点 + } + this.size++;//数据量加1 + } + + /** + * 把指定数据链接到指定节点前面 + */ + void link2Before(Node node,Object data){ + //传进来的node就是后节点 + final Node prev=node.prev; //指定节点的上一个节点(前节点) + //生成新节点,并指向前后的节点 + final Node newNode=new Node(prev,data,node);//生成新节点 + //后节点指向新节点 + node.prev = newNode; + //前节点指向新节点 + if(prev == null){//没有前节点了(当前节点已是首节点) + this.head = newNode;//把新的节点作为首节点 + }else{ + prev.next = newNode; + } + this.size++;//数据量加1 + } + + /** + * 把指定数据链接到指定节点后面 + */ + void link2Last(Node node,Object data){ + //传进来的node就是前节点 + final Node next=node.next; //指定节点的下一个节点(后节点) + //生成新节点,并指向前后的节点 + final Node newNode=new Node(node,data,next); + //前节点指向新节点 + node.next = newNode; + //后节点指向新节点 + if(next == null){//没有后节点了(当前节点已是尾节点) + this.tail = newNode;//把新的节点作为尾节点 + }else{ + next.prev = newNode; + } + this.size++;//数据量加1 + } + + /** + * 移除首节点 + * @return + */ + public Object removeFirst(){ + return unlink(getNode(0)); + } + + /** + * 移除尾节点 + * @return + */ + public Object removeLast(){ + return unlink(getNode(this.size-1)); + } + + /** + * 移除节点 + * @return + */ + Object unlink(Node node){ + final Object element = node.data; + final Node next = node.next; //下一个节点 + final Node prev = node.prev;//前一个节点 + + if (prev == null) {//待删除节点是首节点 + head = next; + } else { + prev.next = next; + node.prev = null;//解除待删除节点的引用关系 + } + + if (next == null) {//待删除节点是尾节点 + tail = prev; + } else { + next.prev = prev; + node.next = null;//解除待删除节点的引用关系 + } + + node.data = null;//清除节点数据 + size--; + return element;//返回清除节点数据 + } + + /** + * 在中间位置创建Iterator遍历 + * @return + */ + public Iterator iterator() { + return new Its(this.size>>1); + } + + /** + * 在指定位置创建Iterator遍历 + * @return + */ + public Iterator iterator(int index) { + checkIndex(index); + return new Its(index); + } + + /** + * 获取指定索引的节点对象 + * @param @param index + * @param @return + */ + private Node getNode(int index){ + if (index < (this.size >> 1)) { //在前半部分 + Node node = this.head; + for (int i = 0; i < index; i++){ + node = node.next; //向后查找 + } + return node; + } else { //在后半部分 + Node node = this.tail; + for (int i = this.size - 1; i > index; i--){ + node = node.prev; //向前查找 + } + return node; + } + } + + /** + * 判断是否为有效索引 + * @param @param index + * @param @return + */ + private boolean isEffectiveIndex(int index){ + return (index>=0 && index < size); + } + + /** + * 检测索引有效性,无效时抛出异常 + * @param index + */ + private void checkIndex(int index) { + if (!isEffectiveIndex(index)) + throw new IndexOutOfBoundsException("Index: "+index+" Out Of Bounds, 最大索引: "+(size-1)); + } + + + /** + * 实现Iterator的内部实现类 + */ + private class Its implements Iterator { + private Node lastReturned = null; + private Node node;//当前节点 + private int index;//当前节点索引 + + public Its(int index){ + node = isEffectiveIndex(index) ? getNode(index) : null; + this.index = index; + } + + @Override + public boolean hasNext() { + return index < size; + } + + @Override + public Object next() { + if (!hasNext()) + throw new NoSuchElementException(); + + lastReturned = node; + node = node.next; + index++; + return lastReturned.data; + + } + + public boolean hasPrevious() { + return index >= 0; + } + + public Object previous() { + if (!hasPrevious()) + throw new NoSuchElementException(); + + lastReturned = node; + node = node.prev; + index--; + return lastReturned.data; + } + } + + /** + * 节点数据 + * Node + */ + private static class Node{ + Object data; + Node prev; + Node next; + + Node(Node prev,Object data,Node next){ + this.prev=prev; + this.data=data; + this.next=next; + } + } +} diff --git a/group16/63912401/src/com/coding/basic/List.java b/group16/63912401/src/com/coding/basic/List.java new file mode 100644 index 0000000000..cf6f2f6b1c --- /dev/null +++ b/group16/63912401/src/com/coding/basic/List.java @@ -0,0 +1,16 @@ +package com.coding.basic; +/** + * 集合接口 + * @author greenhills + * @version 创建时间:2017年2月19日 下午10:49:40 + * + */ +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + public int capacity(); + boolean isEmpty(); +} diff --git a/group16/63912401/src/com/coding/basic/Queue.java b/group16/63912401/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..07398d17a9 --- /dev/null +++ b/group16/63912401/src/com/coding/basic/Queue.java @@ -0,0 +1,43 @@ +package com.coding.basic; + +/** + * 队列数据结构 + * Queue + * @author greenhills + * 2017年2月25日 下午9:50:04 + */ +public class Queue { + private LinkedList elementData = new LinkedList(); + + /** + * 入队 + * @param o + */ + public void enQueue(Object o){ + elementData.addLast(o); + } + + /** + * 出队 + * @return + */ + public Object deQueue(){ + return elementData.removeFirst(); + } + + /** + * 判断是否为空 + * @return + */ + public boolean isEmpty(){ + return elementData.size()==0; + } + + /** + * 获取栈内数据量 + * @return + */ + public int size(){ + return elementData.size(); + } +} diff --git a/group16/63912401/src/com/coding/basic/Stack.java b/group16/63912401/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..71a1266f4c --- /dev/null +++ b/group16/63912401/src/com/coding/basic/Stack.java @@ -0,0 +1,51 @@ +package com.coding.basic; + +/** + * 栈数据结构 + * Stack + * @author greenhills + * 2017年2月25日 下午9:49:41 + */ +public class Stack { + private ArrayList elementData = new ArrayList(); + + /** + * 入栈 + * @param o + */ + public void push(Object o){ + elementData.add(o); + } + + /** + * 出栈 + * @return + */ + public Object pop(){ + return elementData.removeLast(); + } + + /** + * 获取栈顶数据 + * @return + */ + public Object peek(){ + return elementData.getLast(); + } + + /** + * 判断是否为空 + * @return + */ + public boolean isEmpty(){ + return elementData.size()==0; + } + + /** + * 获取栈内数据量 + * @return + */ + public int size(){ + return elementData.size(); + } +} diff --git a/group16/63912401/src/com/coding/basic/Stack2.java b/group16/63912401/src/com/coding/basic/Stack2.java new file mode 100644 index 0000000000..44c92349bc --- /dev/null +++ b/group16/63912401/src/com/coding/basic/Stack2.java @@ -0,0 +1,51 @@ +package com.coding.basic; + +/** + * 栈数据结构 + * Stack + * @author greenhills + * 2017年2月25日 下午9:49:41 + */ +public class Stack2 { + private LinkedList elementData = new LinkedList(); + + /** + * 入栈 + * @param o + */ + public void push(Object o){ + elementData.addFirst(o); + } + + /** + * 出栈 + * @return + */ + public Object pop(){ + return elementData.removeFirst(); + } + + /** + * 获取栈顶数据 + * @return + */ + public Object peek(){ + return elementData.get(0); + } + + /** + * 判断是否为空 + * @return + */ + public boolean isEmpty(){ + return elementData.size()==0; + } + + /** + * 获取栈内数据量 + * @return + */ + public int size(){ + return elementData.size(); + } +} diff --git a/group16/932886072/djj/ArrayList.java b/group16/932886072/djj/ArrayList.java new file mode 100644 index 0000000000..df3a11c386 --- /dev/null +++ b/group16/932886072/djj/ArrayList.java @@ -0,0 +1,64 @@ +package djj; + + +import java.util.Arrays; + +/** + * Created by jerry on 2017/2/26. + */ +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + if(size>elementData.length*0.8){ + Arrays.copyOf(elementData,elementData.length*2); + } + elementData[size]=o; + size++; + } + public void add(int index, Object o){ + if (size>=index){ + Object[] temp=new Object[elementData.length]; + System.arraycopy(elementData,0,temp,0,index); + temp[index]=o; + System.arraycopy(elementData,index,temp,index+1,size-index); + elementData=temp; + }else if(sizesize){ + throw new RuntimeException("越界"); + }else{ + return elementData[index]; + } + } + + public Object remove(int index){ + Object tempObj=null; + if(index<=size){ + Object[] temp=new Object[elementData.length]; + System.arraycopy(elementData,0,temp,0,index); + tempObj=elementData[index]; + System.arraycopy(elementData,index+1,temp,index,size-index-1); + elementData=temp; + } + size--; + return tempObj; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group16/932886072/djj/BinaryTreeNode.java b/group16/932886072/djj/BinaryTreeNode.java new file mode 100644 index 0000000000..d697be6ffc --- /dev/null +++ b/group16/932886072/djj/BinaryTreeNode.java @@ -0,0 +1,34 @@ +package djj; + +public class BinaryTreeNode { + + private BinaryTreeNode root; + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode insert(Object o){ + + return null; + } + + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } +} diff --git a/group16/932886072/djj/Iterator.java b/group16/932886072/djj/Iterator.java new file mode 100644 index 0000000000..4482e3a408 --- /dev/null +++ b/group16/932886072/djj/Iterator.java @@ -0,0 +1,9 @@ +package djj; + +/** + * Created by jerry on 2017/2/26. + */ +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group16/932886072/djj/LinkedList.java b/group16/932886072/djj/LinkedList.java new file mode 100644 index 0000000000..6e40d5cc69 --- /dev/null +++ b/group16/932886072/djj/LinkedList.java @@ -0,0 +1,96 @@ +package djj; + +public class LinkedList implements List { + //头节点 + private Node head; + //尾节点 +// private Node tail; + //当前游标节点 + private Node curNode; + public int size=0; + + + public void add(Object o){ + if(head==null){ + head=new Node(o); + head.next=null; + }else{ + curNode=head; + while(curNode.next!=null){ + curNode=curNode.next; + } + curNode.next=new Node(o); + } + size++; + } + public void add(int index , Object o){ + if(index>size||index<=0){ + throw new RuntimeException("越界"); + }else{ + curNode=head; + for(int i=0;isize||index<=0){ + throw new RuntimeException("越界"); + } + Node temp=head; + for(int i=0;isize||index<=0){ + throw new RuntimeException("越界"); + } + Node temp=head; + for(int i=0;i + + + + + diff --git a/group17/102228177/work2_19/.gitignore b/group17/102228177/work2_19/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group17/102228177/work2_19/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group17/102228177/work2_19/.project b/group17/102228177/work2_19/.project new file mode 100644 index 0000000000..7f56ab1057 --- /dev/null +++ b/group17/102228177/work2_19/.project @@ -0,0 +1,17 @@ + + + 102228177 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group17/102228177/work2_19/src/data2_19/ArrayList.java b/group17/102228177/work2_19/src/data2_19/ArrayList.java new file mode 100644 index 0000000000..35a17dcf59 --- /dev/null +++ b/group17/102228177/work2_19/src/data2_19/ArrayList.java @@ -0,0 +1,148 @@ +package data2_19; + +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + + +public class ArrayList implements List{ + public static final int defLen = 10; + private Object[] elements; + private int size; + private int maxLen; + + public ArrayList(){ + size = 0; + maxLen = defLen; + elements = new Object[defLen]; + } + + /** + * 在ArrayList末尾处追加元素 + * @param o 添加的元素 + */ + public void add(Object o){ + if(size >= maxLen){ + grow(); + } + elements[size] = o; + size++; + } + + /** + * 数组扩容 + */ + private void grow(){ + maxLen = maxLen + (maxLen >> 1); + Object[] newArr = new Object[maxLen]; + System.arraycopy(elements, 0, newArr, 0, size); + elements = newArr; + } + + /** + * 在指定索引处添加元素 + * @param i 指定索引 + * @param o 添加元素 + */ + public void add(int i,Object o){ + //判断插入位置大于数组实际长度 + if(i > size){ + size = i; + if(size >= maxLen){//数组大小大于数组最大容量则需要扩容 + grow(); + } + } + //插入位置不大于数组实际长度时,将插入位置的元素向后移。 + for (int j = size; j > i ; j++) { + elements[j] = elements[j-1]; + } + elements[i] = o; + size++; + } + + /** + * 获取传入索引的元素 + * @param index 索引 + * @return 返回传入索引的元素 + */ + public Object get(int index){ + //索引不在实际范围内 + if(index < 0||index >= size){ + throw new ArrayIndexOutOfBoundsException(); + } + for (int i = 0; i < size; i++) { + return elements[index]; + } + return null; + } + + /** + * 删除指定索引元素并返回 + * @param index + * @return 该索引处元素 + */ + public Object remove(int index){ + //索引不在实际范围内 + if(index < 0||index >= size){ + throw new ArrayIndexOutOfBoundsException(); + }else{ + for (int j = index; j < size-1; j++) { + elements[j]=elements[j+1]; + } + size--; + return elements[index]; + } + } + + /** + * 获取大小 + * @return + */ + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + int cursor; + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + int i = cursor; + if(i >= size){ + throw new NoSuchElementException(); + } + if (i >= elements.length){ + throw new ConcurrentModificationException(); + } + cursor = i+1; + return elements[i]; + } + } + + public static void main(String[] args) { + ArrayList list = new ArrayList(); + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(6, 6); + list.remove(3); + for (int i = 0; i < list.size(); i++) { + System.out.println(i+":"+list.get(i)); + } + + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } +} diff --git a/group17/102228177/work2_19/src/data2_19/BinaryTreeNode.java b/group17/102228177/work2_19/src/data2_19/BinaryTreeNode.java new file mode 100644 index 0000000000..adb23e8467 --- /dev/null +++ b/group17/102228177/work2_19/src/data2_19/BinaryTreeNode.java @@ -0,0 +1,74 @@ +package data2_19; + +public class BinaryTreeNode implements Comparable{ + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Object o) { + this.data = o; + } + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + @Override + public int compareTo(BinaryTreeNode o) { + return (this.data.hashCode() < o.data.hashCode()) ? -1 : + ((this.data.hashCode() == o.data.hashCode()) ? 0 : 1); + } + + public BinaryTreeNode insert(Object o){ + BinaryTreeNode node = new BinaryTreeNode(o); + insertNode(this,node); + return node; + } + + private void insertNode(BinaryTreeNode parentNode, BinaryTreeNode node) { + //父节点大于添加元素 + if(parentNode.compareTo(node) == 1){ + if(parentNode.left == null){ + parentNode.left = node; + return; + } + insertNode(parentNode.left, node); + } + //父节点小于添加元素 + else + if(parentNode.compareTo(node) == -1){ + if(parentNode.right == null){ + parentNode.right = node; + return; + } + insertNode(parentNode.right, node); + }else{ + throw new RuntimeException("No duplicate vertex allowed!"); + } + } + + public static void main(String[] args) { + BinaryTreeNode tree = new BinaryTreeNode(5); + tree.insert(2); + tree.insert(23); + tree.insert(7); + tree.insert(1); + } + +} \ No newline at end of file diff --git a/group17/102228177/work2_19/src/data2_19/Iterator.java b/group17/102228177/work2_19/src/data2_19/Iterator.java new file mode 100644 index 0000000000..cbb3f605c2 --- /dev/null +++ b/group17/102228177/work2_19/src/data2_19/Iterator.java @@ -0,0 +1,8 @@ +package data2_19; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} \ No newline at end of file diff --git a/group17/102228177/work2_19/src/data2_19/LinkedList.java b/group17/102228177/work2_19/src/data2_19/LinkedList.java new file mode 100644 index 0000000000..9c53c7d99d --- /dev/null +++ b/group17/102228177/work2_19/src/data2_19/LinkedList.java @@ -0,0 +1,142 @@ +package data2_19; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + private int size; + + public LinkedList(){ + size = 0; + head = null; + } + + public void add(Object o){ + Node node = new Node(o); + if(head == null){ + head = node; + }else{ + //p为游标 从头遍历到尾 + Node p = head; + while(p.next != null){ + p = p.next; + } + p.next = node; + } + size++; + } + + public void add(int index , Object o){ + //判断不为空链表 + if(head != null){ + Node p = head; + int k = 0; + //扫描单链表查找第index-1个节点 + while(k < index-1 && p.next != null){ + k++; + p = p.next; + } + //判断是否找到第index-1个节点 + if(p != null){ + Node node = new Node(o); + node.next = p.next; + p.next = node; + } + size++; + } + } + + public Object get(int index){ + if(index <0 || index >= size){ + throw new IndexOutOfBoundsException(); + }else{ + Node p = head; + int k = 0; + while(k < index && p.next != null){ + k++; + p = p.next; + } + return p.data; + } + } + public Object remove(int index){ + if(index <0 || index >= size){ + throw new IndexOutOfBoundsException(); + }else{ + if(head != null){ + Node p = head; + int k = 0; + while(k > index-1 && p.next != null){ + k++; + p = p.next; + } + Node next = p.next; + p.next = next.next; + size--; + return next.data; + } + } + return null; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node node = new Node(o); + node.next = head; + head = node; + size++; + } + + public void addLast(Object o){ + Node node = new Node(o); + if(head == null){ + head = node; + }else{ + Node p = head; + while(p.next != null){ + p = p.next; + } + p.next = node; + } + size++; + } + + public Object removeFirst(){ + if(head == null){ + throw new NoSuchElementException(); + } + Node node = head; + head = node.next; + size--; + return node.data; + } + public Object removeLast(){ + if(head == null){ + throw new NoSuchElementException(); + }else{ + Node p = head; + int k = 0; + while(k < size-1 && p.next != null){ + k++; + p = p.next; + } + Node last = p.next; + p.next = null; + size--; + return last.data; + } + } + + private static class Node{ + Object data; + Node next; + private Node(Object o){ + this.data = o; + this.next = null; + } + } +} \ No newline at end of file diff --git a/group17/102228177/work2_19/src/data2_19/List.java b/group17/102228177/work2_19/src/data2_19/List.java new file mode 100644 index 0000000000..8a03fb9c8c --- /dev/null +++ b/group17/102228177/work2_19/src/data2_19/List.java @@ -0,0 +1,10 @@ +package data2_19; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group17/102228177/work2_19/src/data2_19/Queue.java b/group17/102228177/work2_19/src/data2_19/Queue.java new file mode 100644 index 0000000000..95bd77729d --- /dev/null +++ b/group17/102228177/work2_19/src/data2_19/Queue.java @@ -0,0 +1,38 @@ +package data2_19; +public class Queue { + + private LinkedList linkedList = new LinkedList(); + private int elementCount; + + public Queue() { + this.elementCount = 0; + } + + public void enQueue(Object o){ + linkedList.addLast(o); + elementCount++; + } + + public Object deQueue(){ + Object object = linkedList.removeFirst(); + elementCount--; + return object; + } + + public boolean isEmpty(){ + return elementCount == 0; + } + + public int size(){ + return elementCount; + } + + public static void main(String[] args) { + Queue queue = new Queue(); + queue.enQueue(2); + queue.enQueue(3); + System.out.println(queue.isEmpty()); + System.out.println(queue.size()); + System.out.println(queue.deQueue()); + } +} \ No newline at end of file diff --git a/group17/102228177/work2_19/src/data2_19/Stack.java b/group17/102228177/work2_19/src/data2_19/Stack.java new file mode 100644 index 0000000000..7c26967ef4 --- /dev/null +++ b/group17/102228177/work2_19/src/data2_19/Stack.java @@ -0,0 +1,44 @@ +package data2_19; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData; + private int elementCount; + + public Stack() { + this.elementData = new ArrayList(); + this.elementCount = 0; + } + public void push(Object o){ + elementData.add(o); + elementCount++; + } + + public Object pop(){ + Object object = elementData.remove(elementCount-1); + elementCount--; + return object; + } + + public Object peek(){ + if(isEmpty()){ + throw new EmptyStackException(); + } + return elementData.get(elementCount-1); + } + public boolean isEmpty(){ + return elementCount==0; + } + public int size(){ + return elementCount; + } + public static void main(String[] args) { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + System.out.println(stack.pop()); + System.out.println(stack.peek()); + + } +} \ No newline at end of file diff --git a/group17/102228177/work2_26/.classpath b/group17/102228177/work2_26/.classpath new file mode 100644 index 0000000000..f95ef22928 --- /dev/null +++ b/group17/102228177/work2_26/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group17/102228177/work2_26/.project b/group17/102228177/work2_26/.project new file mode 100644 index 0000000000..2ae5966b60 --- /dev/null +++ b/group17/102228177/work2_26/.project @@ -0,0 +1,17 @@ + + + work2_26 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group17/102228177/work2_26/.settings/org.eclipse.jdt.core.prefs b/group17/102228177/work2_26/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group17/102228177/work2_26/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..60949d043e --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,202 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + for (int i = 0; i < origin.length/2; i++) { + int temp = origin[i]; + origin[i] = origin[origin.length-i-1]; + origin[origin.length-i-1] = temp; + } + } + + public static void main(String[] args) { + ArrayUtil util = new ArrayUtil(); + int[] origin = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; +// System.out.println(Arrays.toString(util.removeZero(origin))); + + int[] a1 = {3, 5, 7,8}; + int[] a2 = {4, 5, 6,7}; +// System.out.println(Arrays.toString(util.merge(a1, a2))); + System.out.println(Arrays.toString(util.fibonacci(15))); + + System.out.println(Arrays.toString(util.getPrimes(23))); + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int[] newArray = new int[oldArray.length]; + int j = 0; + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i] != 0){ + newArray[j] = oldArray[i]; + j++; + } + } + return Arrays.copyOf(newArray, j); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + + //Set是不允许重复的,所以将数组的值全部放在Set对象中 + Set set = new HashSet(); + + for(int i = 0; i < array1.length ; i++){ + set.add(array1[i]); + } + + for(int i = 0; i < array2.length ; i++){ + set.add(array2[i]); + } + + Iterator i = set.iterator(); + int[] arrays = new int[set.size()]; + int num=0; + while(i.hasNext()){ + int a = (Integer)i.next(); + arrays[num] = a; + num = num + 1; + } + + //对结果进行排序 + Arrays.sort(arrays); + return arrays; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, newArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + List list = new ArrayList(); + int f1 = 1, f2 = 1, f = 0; + list.add(f1); + list.add(f2); + while(f < max){ + f = f1+f2; + f1 = f2; + f2 = f; + list.add(f); + } + int[] arr = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + arr[i] = list.get(i); + } + return arr; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + List list = new ArrayList(); + for (int i = 2; i < max; i++) { + boolean flag = true; + for (int j = 2; j < i; j++) { + if ( i % j == 0) { + flag = false; + break; + } + } + if(flag){ + list.add(i); + } + } + int[] arr = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + arr[i] = list.get(i); + } + return arr; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + List list = new ArrayList(); + for (int i = 1; i <= max; i++){ + int sum=0; + for (int j = 1; j < i; j++){ + if(i%j==0){ + sum+=j; + } + } + if(i==sum){ + list.add(sum); + } + } + int[] arr = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + arr[i] = list.get(i); + } + return arr; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + String str = ""; + for (int i = 0; i < array.length; i++) { + str += seperator+array[i]; + } + return str.substring(1); + } +} diff --git a/group17/102228177/work2_26/src/com/coderising/litestruts/BeanUtil.java b/group17/102228177/work2_26/src/com/coderising/litestruts/BeanUtil.java new file mode 100644 index 0000000000..96e6a9f867 --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/litestruts/BeanUtil.java @@ -0,0 +1,27 @@ +package com.coderising.litestruts; + +/** + * javaBean 工具 + * @author ren + * + */ +public class BeanUtil { + /** + * 返回set方法名 + * @param filedName 属性名 + * @return set方法名 + */ + public static String setter(String filedName){ + return "set"+filedName.substring(0, 1).toUpperCase()+filedName.substring(1); + } + + /** + * 返回get方法名 + * @param filedName 属性名 + * @return get方法名 + */ + public static String getter(String filedName){ + return "get"+filedName.substring(0, 1).toUpperCase()+filedName.substring(1); + } + +} diff --git a/group17/102228177/work2_26/src/com/coderising/litestruts/Dom4jUtil.java b/group17/102228177/work2_26/src/com/coderising/litestruts/Dom4jUtil.java new file mode 100644 index 0000000000..3eefec6d3d --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/litestruts/Dom4jUtil.java @@ -0,0 +1,101 @@ +package com.coderising.litestruts; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +/** + * Dom4J 解析XML文件 + * @author ren + * + */ +public class Dom4jUtil { + + /** + * 传入文件路径解析xml文件获取根节点 + * @param path xml文件的绝对路径 + * @return Element 根节点 + */ + public static Element parseXml(String path){ + InputStream is = null; + Map map = new HashMap(); + try { + is = new FileInputStream(path); + //创建SAXReader读取XML + SAXReader reader = new SAXReader(); + //根据saxReader的read重写方法可知,既可以通过inputStream输入流来读取,也可以通过file对象来读取 + Document document = reader.read(is); + //获取根节点对象 + Element rootElement = document.getRootElement(); + return rootElement; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + finally{ + if( is!=null ){ + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + /** + * 获取子节点的属性值并添加到map中并返回 + * @param element xml文件根节点对象 + * @return map 封装的属性值map对象 + */ + public static Map getAttribute(Element element){ + Map map = new HashMap(); + List elements = element.elements(); + for (Element ele : elements) { + String name = ele.attributeValue("name"); + String clas = ele.attributeValue("class"); + map.put(name, clas); + } + return map; + } + + /** + * 根据传入的Action名返回结果JSP + * @param element 根节点 + * @param actionName 标签name属性的value + * @return map 封装返回结果jsp的map对象 + */ + public static Map getJspMap(Element element,String actionName){ + Map map = new HashMap(); + List actions = element.elements(); + for (Element action : actions) { + if(actionName.equals(action.attributeValue("name"))){ + List results = action.elements(); + for (Element result : results) { + String name = result.attributeValue("name"); + String text = result.getText(); + map.put(name, text); + } + } + } + return map; + } + + public static void main(String[] args) { + String path = Dom4jUtil.class.getResource("").getPath()+"struts.xml"; + System.out.println(path); + Element element = parseXml(path); + Map attribute = getAttribute(element); + System.out.println(getJspMap(element,"login").get("success")); + } +} diff --git a/group17/102228177/work2_26/src/com/coderising/litestruts/LoginAction.java b/group17/102228177/work2_26/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group17/102228177/work2_26/src/com/coderising/litestruts/Struts.java b/group17/102228177/work2_26/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..0aeaf71537 --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,77 @@ +package com.coderising.litestruts; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.Element; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + String path = Struts.class.getResource("").getPath()+"struts.xml"; + Element element = Dom4jUtil.parseXml(path); + Map attribute = Dom4jUtil.getAttribute(element); + String className = attribute.get(actionName); + try { + Class clazz = Class.forName(className); + Object o = clazz.newInstance(); + for (Map.Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + Field field = clazz.getDeclaredField(key); + Method method = clazz.getDeclaredMethod(BeanUtil.setter(field.getName()),String.class); + method.invoke(o, value); + } + Method method = clazz.getDeclaredMethod("execute"); + String str = (String) method.invoke(o); + Field[] fields = clazz.getDeclaredFields(); + Map map = new HashMap(); + for (Field field : fields) { + String fieldName = field.getName(); + Method method2 = clazz.getDeclaredMethod(BeanUtil.getter(fieldName)); + String ret = (String) method2.invoke(o); + map.put(fieldName, ret); + } + View view = new View(); + view.setParameters(map); + Map result = Dom4jUtil.getJspMap(element, actionName); + view.setJsp(result.get(str)); + return view; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static void main(String[] args) { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + runAction(actionName, params); + } +} diff --git a/group17/102228177/work2_26/src/com/coderising/litestruts/StrutsTest.java b/group17/102228177/work2_26/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group17/102228177/work2_26/src/com/coderising/litestruts/View.java b/group17/102228177/work2_26/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group17/102228177/work2_26/src/com/coderising/litestruts/struts.xml b/group17/102228177/work2_26/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..0141537ddb --- /dev/null +++ b/group17/102228177/work2_26/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group17/1158154002/.classpath b/group17/1158154002/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group17/1158154002/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group17/1158154002/.gitignore b/group17/1158154002/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group17/1158154002/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group17/1158154002/.project b/group17/1158154002/.project new file mode 100644 index 0000000000..8e85980b02 --- /dev/null +++ b/group17/1158154002/.project @@ -0,0 +1,17 @@ + + + 1158154002 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group17/1158154002/src/test01/arrayList/ArrayListTest.java b/group17/1158154002/src/test01/arrayList/ArrayListTest.java new file mode 100644 index 0000000000..42e2115306 --- /dev/null +++ b/group17/1158154002/src/test01/arrayList/ArrayListTest.java @@ -0,0 +1,34 @@ +package test01.arrayList; + +import org.junit.Test; + +public class ArrayListTest { + + @Test + public void cetrinWArrayListTest(){ + CetrinwList list = new CetrinwArrayList(); + + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + + System.out.println("下标为3的元素为"+list.get(3)); + System.out.println("数组size:"+list.size()); + list.remove(2); + System.out.print("remove后的数组size:"+list.size()); + + System.out.print("remove后的数组:"); + for (int i = 0; i < list.size() ; i++) { + System.out.print(list.get(i)+","); + } + + list.insert(3,"gg"); + + System.out.println(""); + System.out.print("insert后的数组:"); + for (int i = 0; i < list.size() ; i++) { + System.out.print(list.get(i)+","); + } + } +} diff --git a/group17/1158154002/src/test01/arrayList/CetrinwArrayList.java b/group17/1158154002/src/test01/arrayList/CetrinwArrayList.java new file mode 100644 index 0000000000..2a1943f78e --- /dev/null +++ b/group17/1158154002/src/test01/arrayList/CetrinwArrayList.java @@ -0,0 +1,124 @@ +package test01.arrayList; + +public class CetrinwArrayList implements CetrinwList { + + /** + * 数组默认长度 + */ + private static final int DEFAULT_SIZE=10; + + /** + * 存储队列中的元素 + */ + private Object[] elements=null; + + /** + * 数组大小指针 + */ + private int capacity; + + /** + * 当前游标 + */ + private int current; + + public CetrinwArrayList() { + this(DEFAULT_SIZE); + } + + public CetrinwArrayList(int size) { + if (size<0) { + throw new RuntimeException("数组大小不能小于0"); + } else { + this.elements=new Object[size]; + this.current=0; + this.capacity=size; + } + } + + @Override + public E get(int index) { + confirmIndex(index); + return (E)elements[index]; + } + + @Override + public void add(E e) { + confirmSize(); + this.elements[current]=e; + this.current++; + } + + @Override + public void remove(int index) { + confirmIndex(index); + for (int i = index; i < elements.length; i++) { + if (i+1=index; i--) { + elements[i+1]=elements[i]; + } + elements[index]=e; + current++; + } + + @Override + public boolean contains(Object o) { + for (Object object : elements) { + if (object.equals(o)) { + return true; + } + } + return false; + } + + @Override + public int size() { + return this.current; + } + + @Override + public boolean isEmpty() { + if (current>0) { + return false; + } + return true; + } + + @Override + public void clearList() { + for (int i = 0; i < current; i++) { + elements[i]=null; + } + } + + /** + * 确认当前数组的容量,如果满足,则不操作,如果不满足,则增加空间 + */ + private void confirmSize(){ + if (this.current==this.capacity) { + this.capacity=this.capacity*3/2; + Object[] newElements=new Object[this.capacity]; + System.arraycopy(elements, 0, newElements, 0, elements.length); + this.elements=newElements; + } + } + + + /** + * 判断下标是否越界 + */ + private void confirmIndex(int index){ + if (index>capacity||index<0) { + throw new RuntimeException("下标越界"); + } + } +} diff --git a/group17/1158154002/src/test01/arrayList/CetrinwList.java b/group17/1158154002/src/test01/arrayList/CetrinwList.java new file mode 100644 index 0000000000..5f7aeb50a2 --- /dev/null +++ b/group17/1158154002/src/test01/arrayList/CetrinwList.java @@ -0,0 +1,43 @@ +package test01.arrayList; + +public interface CetrinwList { + /** + * 取得数据 + */ + E get(int index); + + /** + *新增数据 + */ + void add(E e); + + /** + * 移除数据 + */ + void remove(int index); + + /** + * 插入数据 + */ + void insert(int index,E e); + + /** + * 是否存在数据 + */ + boolean contains(Object o); + + /** + * 获得List长度 + */ + int size(); + + /** + * 是否为空 + */ + boolean isEmpty(); + + /** + * 清空 + */ + void clearList(); +} diff --git a/group17/1158154002/src/test01/linkedList/MyLinkedList.java b/group17/1158154002/src/test01/linkedList/MyLinkedList.java new file mode 100644 index 0000000000..a0c940e795 --- /dev/null +++ b/group17/1158154002/src/test01/linkedList/MyLinkedList.java @@ -0,0 +1,172 @@ +package test01.linkedList; + +import java.util.ConcurrentModificationException; +import java.util.Iterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements Iterable { + private int theSize; + private int modCount = 0; + private Node beginMarker; + private Node endMarker; + + private static class Node { + public T data; + public Node prev; + public Node next; + + public Node(T d, Node p, Node n) { + data = d; + prev = p; + next = n; + } + } + + public MyLinkedList() { + clear(); + } + + public void clear() { + beginMarker = new Node(null, null, null); + endMarker = new Node(null, beginMarker, null); + beginMarker.next = endMarker; + theSize = 0; + modCount++; + } + + public int size() { + return theSize; + } + + public boolean isEmpty() { + return size() == 0; + } + + public void add(T x) { + add(size(), x); + } + + public void add(int idx, T x) { + addBefore(getNode(idx), x); + } + + public T get(int idx) { + return getNode(idx).data; + } + + public T set(int idx, T newVal) { + Node p = getNode(idx); + T oldVal = p.data; + p.data = newVal; + return oldVal; + } + + public T remove(int idx) { + return remove(getNode(idx)); + } + + private void addBefore(Node p, T x) { + Node newNode = new Node(x, p.prev, p); + newNode.prev.next = newNode; + p.prev = newNode; + theSize++; + modCount++; + } + + private T remove(Node p) { + + final T element = p.data; + final Node next = p.next; + final Node prev = p.prev; + + if (prev == null) { + beginMarker = next; + } else { + prev.next = next; + p.prev = null; + } + + if (next == null) { + endMarker = prev; + } else { + next.prev = prev; + p.next = null; + } + + p.data = null; + theSize--; + modCount++; + return p.data; + } + + private Node getNode(int idx) { +// Node p; +// if (idx < 0 || idx > size()) { +// throw new IndexOutOfBoundsException(); +// } +// if (idx < size() / 2) { +// p = beginMarker.next; +// for (int i = 0; i < idx; i++) { +// p = p.next; +// } +// } else { +// p = endMarker; +// for (int i = size(); i < idx; i--) { +// p = p.prev; +// } +// } +// + if (idx < (size() >> 1)) { + Node p = beginMarker; + for (int i = 0; i < idx; i++) + p = p.next; + return p; + } else { + Node p = endMarker; + for (int i = size() - 1; i > idx; i--) + p = p.prev; + return p; + } + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + private Node current = beginMarker.next; + private int expectedModCount = modCount; + private boolean okToRemove = false; + + @Override + public boolean hasNext() { + return current != endMarker; + } + + @Override + public T next() { + if (modCount != expectedModCount) { + throw new ConcurrentModificationException(); + } + if (!hasNext()) { + throw new NoSuchElementException(); + } + T nextItem = current.data; + current = current.next; + okToRemove = true; + return nextItem; + } + + public void remove() { + if (modCount != expectedModCount) { + throw new ConcurrentModificationException(); + } + if (!okToRemove) { + throw new IllegalStateException(); + } + MyLinkedList.this.remove(current.prev); + okToRemove = false; + expectedModCount++; + } + } +} diff --git a/group17/1158154002/src/test01/linkedList/MyLinkedListTest.java b/group17/1158154002/src/test01/linkedList/MyLinkedListTest.java new file mode 100644 index 0000000000..87e50a1911 --- /dev/null +++ b/group17/1158154002/src/test01/linkedList/MyLinkedListTest.java @@ -0,0 +1,37 @@ +package test01.linkedList; + +import org.junit.Test; + +public class MyLinkedListTest { + + @Test + public void MyLinkedListTest(){ + MyLinkedList list = new MyLinkedList(); + + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + + for (int i = 0; i < list.size() ; i++) { + System.out.print(list.get(i)+","); + } + System.out.println("下标为3的元素为"+list.get(3)); + System.out.println("数组size:"+list.size()); + list.remove(2); + System.out.print("remove后的数组size:"+list.size()); + + System.out.print("remove后的数组:"); + for (int i = 0; i < list.size() ; i++) { + System.out.print(list.get(i)+","); + } + + list.add(3,"gg"); + + System.out.println(""); + System.out.print("insert后的数组:"); + for (int i = 0; i < list.size() ; i++) { + System.out.print(list.get(i)+","); + } + } +} diff --git a/group17/1158154002/src/test01/queue/Queue.java b/group17/1158154002/src/test01/queue/Queue.java new file mode 100644 index 0000000000..b3bca26abf --- /dev/null +++ b/group17/1158154002/src/test01/queue/Queue.java @@ -0,0 +1,105 @@ +package test01.queue; + +import java.util.Arrays; +import java.util.Collection; + +/** + *

+ * structure for queue + *

+ *

+ * 用1个数组存数据,数组 小index 是 head,大index是tail,
+ * 插入在 tail 处,删除在 head 处, + *

+ * + * @author eric + * @param + */ +public class Queue { + /** 初始容量 */ + public static final int DEFAULT_SIZE = 10; + /** 容量不足时翻倍数 */ + public static final float DEFAULT_INCREMENT = 1.5f; + /** 数据 */ + private Object[] elementData; + /** 元素个数 */ + private int elementCount; + /** 数组的头部,即 下次删除数据的 index */ + private int head; + /** 数组的尾部,即 下次插入数据的 index */ + private int tail; + + public Queue() { + this(DEFAULT_SIZE); + } + + public Queue(int size) { + this.elementData = new Object[size]; + this.elementCount = 0; + this.head = 0; + this.tail = 0; + } + + public Queue(Object[] data) { + this.elementData = data; + this.elementCount = data.length; + this.head = 0; + this.tail = 0; + } + + public Queue(Collection c) { + this(c.toArray()); + } + + /** + * 添加数据 到尾部 + * + * @param ele + * @return + */ + public synchronized E add(E ele) { + if (tail >= elementData.length) { + adjustData(); + } + elementData[tail] = ele; + elementCount++; + tail++; + return ele; + }; + + /** + * 删除数据 从头部 + * + * @return + */ + @SuppressWarnings("unchecked") + public synchronized E remove() { + E e = (E) elementData[head]; + elementData[head] = null; + elementCount--; + head++; + return e; + }; + + /** + * 获得当前的数据 + * + * @return + */ + public synchronized Object[] getData() { + return Arrays.copyOfRange(this.elementData, this.head, this.tail); + } + + public synchronized void adjustData() { + if (tail >= elementData.length) { // tail 处空间不足时调用 + // head 的空位去掉 + int newSize = (elementData.length == elementCount) ? (int) Math.ceil(elementCount * DEFAULT_INCREMENT) + : elementData.length; + elementData = Arrays.copyOfRange(elementData, head, elementData.length); + // 调整空间 + elementData = Arrays.copyOf(elementData, newSize); + tail = elementCount; + head = 0; + } + } +} diff --git a/group17/1158154002/src/test01/queue/QueueTest.java b/group17/1158154002/src/test01/queue/QueueTest.java new file mode 100644 index 0000000000..e17612a9e4 --- /dev/null +++ b/group17/1158154002/src/test01/queue/QueueTest.java @@ -0,0 +1,41 @@ +package test01.queue; + +import org.junit.Test; + +public class QueueTest{ + @Test + public void test() { + Queue queueOne = new Queue(); + // 第1次 加入个数 + int addCountOne = 30; + // 第1次 删除个数 + int removeCountOne = 20; + // 第2次 加入个数 + int addCountTwo = 10; + + for (int i = 0; i < addCountOne; i++) { + queueOne.add(i); + } + Object[] data = queueOne.getData(); + for (int i = 0; i < data.length; i++) { + System.out.println((Integer) data[i] == i); + } + + for (int i = 0; i < removeCountOne; i++) { + System.out.println(queueOne.remove() == i); + } + + for (int i = 0; i < addCountTwo; i++) { + queueOne.add(i * 10); + } + Object[] data2 = queueOne.getData(); + int baseCount = addCountOne - removeCountOne; + for (int i = 0; i < addCountTwo; i++) { + System.out.println((Integer) data2[baseCount + i] == i * 10); + } + } + + public static void main(String[] args) { + new QueueTest().test(); + } +} diff --git a/group17/1158154002/src/test01/stack/MyStack.java b/group17/1158154002/src/test01/stack/MyStack.java new file mode 100644 index 0000000000..0e25b21ae7 --- /dev/null +++ b/group17/1158154002/src/test01/stack/MyStack.java @@ -0,0 +1,111 @@ +package test01.stack; + +import java.util.Iterator; + +import com.sun.org.apache.bcel.internal.generic.POP; +import com.sun.org.apache.bcel.internal.generic.PUSH; + +public class MyStack implements Iterable { + private static final int DEFAULT_SIZE=10; + private int size; + private T[] item; + private int top; + + public MyStack() { + clear(); + } + + public void clear(){ + size=0; + top=-1; + ensureCapacity(DEFAULT_SIZE); + } + + public int size(){ + return size; + } + + public boolean isEmpty(){ + return size()==0; + } + + public void trumToSize(){ + ensureCapacity(size()); + } + + public void ensureCapacity(int capacity){ + if (capacity iterator() { + // TODO Auto-generated method stub + return new StackIterator(); + } + + private class StackIterator implements Iterator{ + private int current=0; + + @Override + public boolean hasNext() { + return current<=top; + } + + @Override + public T next() { + if (!hasNext()) { + throw new NullPointerException(); + } + return item[current++]; + } + + } + + public static void main(String[] args) { + MyStack stack = new MyStack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.pop(); + stack.push(4); + stack.push(5); + Iterator iterator = stack.iterator(); + while (iterator.hasNext()) { + System.out.print(iterator.next() + " "); + } + } +} diff --git a/group17/1158154002/src/test01/tree/Test.java b/group17/1158154002/src/test01/tree/Test.java new file mode 100644 index 0000000000..85fd9aa7a5 --- /dev/null +++ b/group17/1158154002/src/test01/tree/Test.java @@ -0,0 +1,20 @@ +package test01.tree; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + Tree tree = new Tree(); + tree.addNode(null, "string"); + tree.addNode(tree.getNode("string"), "hello"); + tree.addNode(tree.getNode("string"), "world"); + tree.addNode(tree.getNode("hello"), "sinny"); + tree.addNode(tree.getNode("hello"), "fredric"); + tree.addNode(tree.getNode("world"), "Hi"); + tree.addNode(tree.getNode("world"), "York"); + tree.showNode(tree.root); + + System.out.println("end of the test"); + } + +} diff --git a/group17/1158154002/src/test01/tree/Tree.java b/group17/1158154002/src/test01/tree/Tree.java new file mode 100644 index 0000000000..8dc7d364ad --- /dev/null +++ b/group17/1158154002/src/test01/tree/Tree.java @@ -0,0 +1,56 @@ +package test01.tree; + +public class Tree { + + public TreeNode root; + + public Tree(){} + + public void addNode(TreeNode node, T newNode){ + //增加根节点 + if(null == node){ + if(null == root){ + root = new TreeNode(newNode); + } + }else{ + TreeNode temp = new TreeNode(newNode); + node.nodelist.add(temp); + } + } + + /* 查找newNode这个节点 */ + public TreeNode search(TreeNode input, T newNode){ + + TreeNode temp = null; + + if(input.t.equals(newNode)){ + return input; + } + + for(int i = 0; i < input.nodelist.size(); i++){ + + temp = search(input.nodelist.get(i), newNode); + + if(null != temp){ + break; + } + } + + return temp; + } + + public TreeNode getNode(T newNode){ + return search(root, newNode); + } + + public void showNode(TreeNode node){ + if(null != node){ + //循环遍历node的节点 + System.out.println(node.t.toString()); + + for(int i = 0; i < node.nodelist.size(); i++){ + showNode(node.nodelist.get(i)); + } + } + } +} \ No newline at end of file diff --git a/group17/1158154002/src/test01/tree/TreeNode.java b/group17/1158154002/src/test01/tree/TreeNode.java new file mode 100644 index 0000000000..e78f1dca7f --- /dev/null +++ b/group17/1158154002/src/test01/tree/TreeNode.java @@ -0,0 +1,21 @@ +package test01.tree; + +import java.util.ArrayList; +import java.util.List; + +public class TreeNode { + public T t; + private TreeNode parent; + + public List> nodelist; + + public TreeNode(T stype){ + t = stype; + parent = null; + nodelist = new ArrayList>(); + } + + public TreeNode getParent() { + return parent; + } +} \ No newline at end of file diff --git a/group17/1158154002/src/test02/array/ArrayUtil.java b/group17/1158154002/src/test02/array/ArrayUtil.java new file mode 100644 index 0000000000..697f32e6ec --- /dev/null +++ b/group17/1158154002/src/test02/array/ArrayUtil.java @@ -0,0 +1,241 @@ +package test02.array; + +import java.util.ArrayList; +import java.util.Arrays; + +import com.sun.javafx.image.impl.IntArgb; + +public class ArrayUtil { + + public static void main(String[] args) { +// int[] arr={7, 9, 30, 3, 4}; +// reverseArray(arr); + +// int[] oldArr={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; +// removeZero(oldArr); + +// int[] a1={3, 5, 7,8}; +// int[] a2={4, 5, 6,7}; +// merge(a1,a2); + +// int[] a1={3, 5, 7,8}; +// grow(a1, 3); + +// fibonacci(15); + +// getPrimes(23); + +// getPerfectNumbers(4000); + + int[] a={1,2,3,4}; + join(a, "-"); + } + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static void reverseArray(int[] origin){ + int[] newArr=new int[origin.length]; + int j=0; + for (int i = origin.length-1; i >=0; i--) { + newArr[j++]=origin[i]; + } + System.out.println(Arrays.toString(newArr)); + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray){ + ArrayList list=new ArrayList<>(); + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i]!=0) { + list.add(oldArray[i]); + } + } + + int[] newArr=new int[list.size()]; + int j=0; + for (int i : list) { + newArr[j++]=i; + } + System.out.println(Arrays.toString(newArr)); + return newArr; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + ArrayList list=new ArrayList<>(); + for (Integer arr1 : array1) { + list.add(arr1); + } + + for (Integer arr2 : array2) { + if (!list.contains(arr2)) { + list.add(arr2); + } + } + + int[] newArr=new int[list.size()]; + int i=0; + for (int one : list) { + newArr[i++]=one; + } + + for (int j = 0; j < newArr.length-1; j++) { + for (int k = 0; k < newArr.length-1-j; k++) { + + if (newArr[k]>newArr[k+1]) { + int temp=newArr[k]; + newArr[k]=newArr[k+1]; + newArr[k+1]=temp; + } + } + } + System.out.println(Arrays.toString(newArr)); + return newArr; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int [] oldArray, int size){ + int[] newArr=new int[oldArray.length+size]; + System.arraycopy(oldArray, 0, newArr, 0, oldArray.length); + System.out.println(Arrays.toString(newArr)); + return newArr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + if (max>1) { + ArrayList list=new ArrayList<>(); + list.add(1); + list.add(1); + while (list.get(list.size()-1) list = new ArrayList<>(); + + for (int i = 2; i < max; i++) { + int j = 2; + while (j < i) { +// System.out.println("i:"+i+",j:"+j+",i%j:"+(i%j)); + if (i%j==0) { + break; + } + j++; + } + if (j==i) { + list.add(i); + } + } + + int[] newArr = new int[list.size()]; + int i = 0; + for (int item : list) { + newArr[i++] = item; + } + System.out.println(Arrays.toString(newArr)); + + return newArr; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max){ + ArrayList list = new ArrayList<>(); + for (int i = 1; i < max; i++) { + int j = 1; + int sum=0; + while (j < i) { +// System.out.println("i:"+i+",j:"+j+",i%j:"+(i%j)); + if (i%j==0) { + sum=sum+j; + } + j++; + } + + if (sum==i) { + list.add(i); + } + } + + int[] newArr = new int[list.size()]; + int i = 0; + for (int item : list) { + newArr[i++] = item; + } + System.out.println(Arrays.toString(newArr)); + + return newArr; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator){ + String result=Arrays.toString(array).replace(" ", "").replace("[", "").replace("]", "").replace(",", seperator); + System.out.println(result); + return result; + } +} diff --git a/group17/1158154002/src/test02/litestruts/Action.java b/group17/1158154002/src/test02/litestruts/Action.java new file mode 100644 index 0000000000..5a3278013f --- /dev/null +++ b/group17/1158154002/src/test02/litestruts/Action.java @@ -0,0 +1,22 @@ +package test02.litestruts; + +import java.util.HashMap; + +public class Action { + String className; + HashMap resultJspMap; + + public String getClassName() { + return className; + } + public void setClassName(String className) { + this.className = className; + } + public HashMap getResultJspMap() { + return resultJspMap; + } + public void setResultJspMap(HashMap resultJspMap) { + this.resultJspMap = resultJspMap; + } + +} diff --git a/group17/1158154002/src/test02/litestruts/LoginAction.java b/group17/1158154002/src/test02/litestruts/LoginAction.java new file mode 100644 index 0000000000..3210515a03 --- /dev/null +++ b/group17/1158154002/src/test02/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package test02.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} \ No newline at end of file diff --git a/group17/1158154002/src/test02/litestruts/Struts.java b/group17/1158154002/src/test02/litestruts/Struts.java new file mode 100644 index 0000000000..b50b21c231 --- /dev/null +++ b/group17/1158154002/src/test02/litestruts/Struts.java @@ -0,0 +1,60 @@ +package test02.litestruts; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import test02.litestruts.sax.SAXParserDemo; +import test02.litestruts.util.StringUtil; + +public class Struts { + + public static View runAction(String actionName, Map parameters){ + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + Action action = SAXParserDemo.run(); + View view=new View(); + try { + Class clazz = Class.forName(action.getClassName()); + Object obj = clazz.newInstance(); + for (String element : parameters.keySet()) { + Method method = clazz.getMethod("set" + StringUtil.captureName(element), String.class); + method.invoke(obj, parameters.get(element)); + } + Method exectue = clazz.getMethod("execute", null); + String result = (String) exectue.invoke(obj, null); + view.setJsp(action.getResultJspMap().get(result)); + + Method getMsg = clazz.getMethod("getMessage", null); + String msg=(String) getMsg.invoke(obj, null); + Map map=new HashMap<>(); + map.put("message", msg); + System.out.println(map); + view.setParameters(map); + + } catch (Exception e) { + e.printStackTrace(); + } + return view; + } + +} \ No newline at end of file diff --git a/group17/1158154002/src/test02/litestruts/StrutsTest.java b/group17/1158154002/src/test02/litestruts/StrutsTest.java new file mode 100644 index 0000000000..a029517460 --- /dev/null +++ b/group17/1158154002/src/test02/litestruts/StrutsTest.java @@ -0,0 +1,39 @@ +package test02.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed(){ + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git a/group17/1158154002/src/test02/litestruts/View.java b/group17/1158154002/src/test02/litestruts/View.java new file mode 100644 index 0000000000..ae131cddfb --- /dev/null +++ b/group17/1158154002/src/test02/litestruts/View.java @@ -0,0 +1,23 @@ +package test02.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group17/1158154002/src/test02/litestruts/sax/SAXParser.java b/group17/1158154002/src/test02/litestruts/sax/SAXParser.java new file mode 100644 index 0000000000..5104a704bc --- /dev/null +++ b/group17/1158154002/src/test02/litestruts/sax/SAXParser.java @@ -0,0 +1,221 @@ +package test02.litestruts.sax; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; + +import test02.litestruts.Action; + +public class SAXParser { + private static SAXParser parserInstance = new SAXParser(); + private static SAXParserHandler parserHandler; + private SAXParser(){} // Singleton Pattern, a private constructor + private static SAXParserState state = SAXParserState.OUT_OF_TAG; // initial state + + public static SAXParser getInstance() { + return parserInstance; + } + + public Action parse(String path){ + try { + BufferedReader br = new BufferedReader(new FileReader(path)); + int currentCharCode; + // callback start document + parserHandler.startDocument(); + try { + while((currentCharCode = br.read()) != -1){ + char currentChar = (char)currentCharCode; + handleParser(currentChar); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return parserHandler.endDocument(); + } + + public void setHandler(SAXParserHandler handler){ + parserHandler = handler; + } + + private static void handleParser(char c) { + // This SAX Parser will ignore any line wrap. + if(c == '\n'){ + return; + } + switch (state){ + case OUT_OF_TAG:{ + if(c == '<'){ + if(SAXParsedData.innerText.trim().length() != 0) { + parserHandler.innerText(SAXParsedData.innerText); + } + SAXParsedData.innerText = ""; + SAXParsedData.tagName = ""; + state = SAXParserState.BEGIN_START_OR_END_TAG; + } else if (c == '>') { + state = SAXParserState.SYNTAX_ERROR; + } else { + SAXParsedData.innerText += c; + } + break; + } + case BEGIN_START_OR_END_TAG:{ + if(c == '/') { + SAXParsedData.tagName = ""; + state = SAXParserState.IN_END_TAG; + }else if(c == '?' || c == '!'){ + state = SAXParserState.METADATA; + }else{ + SAXParsedData.tagName += c; + state = SAXParserState.IN_START_TAG; + } + break; + } + case IN_START_TAG:{ + if(c == ' '){ + state = SAXParserState.SPACE_IN_START_TAG; + }else if(c == '>'){ + // callback startElement event; + parserHandler.startElement(SAXParsedData.tagName, SAXParsedData.attributes); + SAXParsedData.clear(); + state = SAXParserState.CLOSE_START_TAG; + }else { + SAXParsedData.tagName += c; + } + break; + } + case SPACE_IN_START_TAG:{ + if(SAXParsedData.tagName.length() > 0){ + if(c != ' '){ + SAXParsedData.attribKey += c; + state = SAXParserState.IN_ATTRIB_KEY; + } + } + break; + } + case IN_ATTRIB_KEY:{ + if(c == '='){ + state = SAXParserState.IN_ATTRIB_EQUAL; + }else{ + SAXParsedData.attribKey += c; + } + break; + } + case IN_ATTRIB_EQUAL:{ + if(c == '"'){ + state = SAXParserState.IN_ATTRIB_VALUE; + } + break; + } + case IN_ATTRIB_VALUE:{ + if(c == '"'){ + SAXParsedData.newAttribute(); + state = SAXParserState.IN_START_TAG; + }else{ + SAXParsedData.attribValue += c; + } + break; + } + case CLOSE_START_TAG:{ + if(c == '<') { + state = SAXParserState.BEGIN_START_OR_END_TAG; + }else{ + SAXParsedData.innerText += c; + state = SAXParserState.OUT_OF_TAG; + } + break; + } + case IN_END_TAG:{ + if(c == '>'){ + // callback endElement event + parserHandler.endElement(SAXParsedData.tagName); + state = SAXParserState.CLOSE_END_TAG; + }else{ + SAXParsedData.tagName += c; + } + break; + } + case CLOSE_END_TAG:{ + if(c == ' '){ + state = SAXParserState.OUT_OF_TAG; + }else if(c == '<'){ + SAXParsedData.tagName = ""; + state = SAXParserState.BEGIN_START_OR_END_TAG; + } + break; + } + case METADATA:{ + if(c == '>'){ + state = SAXParserState.CLOSE_END_TAG; + } + break; + } + case SYNTAX_ERROR:{ + try { + throw new Exception(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + } + + private enum SAXParserState { + // The state when parser meets "<". This is a pending state. + // If the next char is "/", the state will be IN_END_TAG, + // Otherwise, the state will be IN_START_TAG + BEGIN_START_OR_END_TAG, + + // The state when parser is reading between start tag(<...>). + // When parser meets ">", callback "startElement" event + IN_START_TAG, + + // The state when parser is reading between end tag(). + // When parser meets "<", callback "endElement" event + IN_END_TAG, + + // The state when parser meets " ", and is in IN_START_TAG state. + // If the length of tag_name is non-zero, finish parsing tag_name. + // Otherwise, finish parsing a key/value attribute. + SPACE_IN_START_TAG, + IN_ATTRIB_KEY,IN_ATTRIB_EQUAL,IN_ATTRIB_VALUE, + CLOSE_START_TAG,CLOSE_END_TAG, + + // The state when parser is reading any char at the outside of , or between two . This is a pending state. + // Contents between will be recorded, but if the contents consist only spaces, the content will be discarded. + // Otherwise, callback "innerText" event. + OUT_OF_TAG, + + METADATA, SYNTAX_ERROR + } + + private static class SAXParsedData{ + private static String tagName = ""; + private static String attribKey = ""; + private static String attribValue = ""; + private static String innerText = ""; + private static HashMap attributes = new HashMap<>(); + + private static void clear(){ + tagName = ""; + attribKey = ""; + attribValue = ""; + innerText = ""; + attributes.clear(); + } + + private static void newAttribute(){ + attributes.put(attribKey, attribValue); + attribKey = ""; + attribValue = ""; + } + } +} \ No newline at end of file diff --git a/group17/1158154002/src/test02/litestruts/sax/SAXParserDemo.java b/group17/1158154002/src/test02/litestruts/sax/SAXParserDemo.java new file mode 100644 index 0000000000..f756b30040 --- /dev/null +++ b/group17/1158154002/src/test02/litestruts/sax/SAXParserDemo.java @@ -0,0 +1,76 @@ +package test02.litestruts.sax; + +import java.util.HashMap; + +import test02.litestruts.Action; + +public class SAXParserDemo{ + + public static Action run( ){ + //创建实例 + SAXParser parser = SAXParser.getInstance(); + //为解析器设置好各个事件的回调函数 + parser.setHandler(new SAXParserHandler() { + //创建好自定义变量,用以记录XML文档中需要的数据 + String resultName = ""; + String className = ""; + HashMap resultJspMap = new HashMap<>(); + + boolean foundClass = false; + + //当解析开始时调用 + @Override + public void startDocument() { + System.out.println("Start parsing"); + } + + //当完成一个XML开始标签(例如)的解析时调用 + @Override + public void startElement(String tagName, HashMap attributes) { + if(tagName.equals("action")){ + if(attributes.get("name").equals("login")){ + className = attributes.get("class"); + foundClass = true; + }else{ + foundClass = false; + } + }else if(tagName.equals("result") && foundClass){ + resultName = attributes.get("name"); + } + } + + //当完成一个XML结束标签(例如)的解析时调用 + @Override + public void endElement(String tagName) { + + } + + //当一段XML标签之间的内容被解析完成时调用 + @Override + public void innerText(String innerText) { + if(foundClass){ + String jsp = innerText; + resultJspMap.put(resultName,jsp); + } + } + + @Override + //当解析器读到XML文档结尾时调用 + public Action endDocument() { + + System.out.println(className); + System.out.println(resultJspMap); + System.out.println("End parsing"); + + Action action=new Action(); + action.setClassName(className); + action.setResultJspMap(resultJspMap); + return action; + } + }); + + //调用此方式,开始解析 + return parser.parse("src/test02/litestruts/struts.xml"); + } + +} \ No newline at end of file diff --git a/group17/1158154002/src/test02/litestruts/sax/SAXParserHandler.java b/group17/1158154002/src/test02/litestruts/sax/SAXParserHandler.java new file mode 100644 index 0000000000..9fd6668723 --- /dev/null +++ b/group17/1158154002/src/test02/litestruts/sax/SAXParserHandler.java @@ -0,0 +1,13 @@ +package test02.litestruts.sax; + +import java.util.HashMap; + +import test02.litestruts.Action; + +public interface SAXParserHandler { + void startDocument(); + void startElement(String tagName, HashMap attributes); + void endElement(String tagName); + Action endDocument(); + void innerText(String innerText); +} \ No newline at end of file diff --git a/group17/1158154002/src/test02/litestruts/struts.xml b/group17/1158154002/src/test02/litestruts/struts.xml new file mode 100644 index 0000000000..65b6cfbc06 --- /dev/null +++ b/group17/1158154002/src/test02/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group17/1158154002/src/test02/litestruts/util/StringUtil.java b/group17/1158154002/src/test02/litestruts/util/StringUtil.java new file mode 100644 index 0000000000..616718b5c6 --- /dev/null +++ b/group17/1158154002/src/test02/litestruts/util/StringUtil.java @@ -0,0 +1,13 @@ +package test02.litestruts.util; + +public class StringUtil { + + //首字母大写 + public static String captureName(String name) { + // name = name.substring(0, 1).toUpperCase() + name.substring(1); + // return name; + char[] cs=name.toCharArray(); + cs[0]-=32; + return String.valueOf(cs); + } +} diff --git a/group17/116665530/homework/src/com/coding/basic/MyArrayList.java b/group17/116665530/homework/src/com/coding/basic/MyArrayList.java new file mode 100644 index 0000000000..e9af793f47 --- /dev/null +++ b/group17/116665530/homework/src/com/coding/basic/MyArrayList.java @@ -0,0 +1,41 @@ +package com.coding.basic; + +public class MyArrayList implements MyList { + private int size = 0; + private Object[] elementData = new Object[100]; + + public void add(Object o){ + elementData[size++] = o; + } + public void add(int index, Object o){ + for(int i = size; i > index; i--) + { + elementData[i] = elementData[i - 1]; + } + elementData[index] = o; + size++; + } + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + Object obj = elementData[index]; + for(int i = index; i < size(); i++) + { + elementData[i] = elementData[i + 1]; + } + size--; + return elementData; + } + + public int size(){ + return size; + } + + public MyIterator myIterator(){ + return null; + } + +} diff --git a/group17/116665530/homework/src/com/coding/basic/MyBinaryTreeNode.java b/group17/116665530/homework/src/com/coding/basic/MyBinaryTreeNode.java new file mode 100644 index 0000000000..c79328b1ed --- /dev/null +++ b/group17/116665530/homework/src/com/coding/basic/MyBinaryTreeNode.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +public class MyBinaryTreeNode { + private Object data; + private MyBinaryTreeNode left; + private MyBinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public MyBinaryTreeNode getLeft() { + return left; + } + public void setLeft(MyBinaryTreeNode left) { + this.left = left; + } + public MyBinaryTreeNode getRight() { + return right; + } + public void setRight(MyBinaryTreeNode right) { + this.right = right; + } + + public MyBinaryTreeNode insert(Object o){ + return null; + } +} diff --git a/group17/116665530/homework/src/com/coding/basic/MyIterator.java b/group17/116665530/homework/src/com/coding/basic/MyIterator.java new file mode 100644 index 0000000000..9247878483 --- /dev/null +++ b/group17/116665530/homework/src/com/coding/basic/MyIterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface MyIterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group17/116665530/homework/src/com/coding/basic/MyLinkedList.java b/group17/116665530/homework/src/com/coding/basic/MyLinkedList.java new file mode 100644 index 0000000000..fb75a27c6b --- /dev/null +++ b/group17/116665530/homework/src/com/coding/basic/MyLinkedList.java @@ -0,0 +1,45 @@ +package com.coding.basic; + +public class MyLinkedList implements MyList{ + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public MyIterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group17/116665530/homework/src/com/coding/basic/MyList.java b/group17/116665530/homework/src/com/coding/basic/MyList.java new file mode 100644 index 0000000000..3cc9d10473 --- /dev/null +++ b/group17/116665530/homework/src/com/coding/basic/MyList.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface MyList { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group17/116665530/homework/src/com/coding/basic/MyQueue.java b/group17/116665530/homework/src/com/coding/basic/MyQueue.java new file mode 100644 index 0000000000..c5e79cdf4e --- /dev/null +++ b/group17/116665530/homework/src/com/coding/basic/MyQueue.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class MyQueue { + private Object[] elementData; + private int elementCount; + private int head; + private int next; + public void enQueue(Object o){ + elementData[next] = o; + elementCount++; + next++; + } + + public Object deQueue(){ + Object obj = elementData[head]; + elementData[head] = null; + elementCount--; + head++; + return obj; + } + + public boolean isEmpty(){ + if(elementData.length==0){ + return true; + } + return false; + } + + public int size(){ + return elementData.length; + } +} diff --git a/group17/116665530/homework/src/com/coding/basic/MyStack.java b/group17/116665530/homework/src/com/coding/basic/MyStack.java new file mode 100644 index 0000000000..194a8259d3 --- /dev/null +++ b/group17/116665530/homework/src/com/coding/basic/MyStack.java @@ -0,0 +1,34 @@ +package com.coding.basic; + +public class MyStack { + Object[] elementData; + private int size; + + public void push(Object o){ + elementData[size++]=o; + } + + public Object pop(){ + if(size>0) + { + elementData[--size]=null; + } + return null; + } + + public Object peek(){ + if(elementData.length == 0){ + return null; + } + return elementData[size - 1]; + } + public boolean isEmpty(){ + if(elementData.length == 0){ + return true; + } + return false; + } + public int size(){ + return elementData.length; + } +} diff --git a/group17/1204187480/.gitignore b/group17/1204187480/.gitignore new file mode 100644 index 0000000000..2a5296f902 --- /dev/null +++ b/group17/1204187480/.gitignore @@ -0,0 +1,21 @@ +*.class +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +#ide config +.metadata +.recommenders +.idea/ +*.iml +rebel.* +.rebel.* + +target diff --git a/group17/1204187480/code/homework/basic/pom.xml b/group17/1204187480/code/homework/basic/pom.xml new file mode 100644 index 0000000000..039af72d42 --- /dev/null +++ b/group17/1204187480/code/homework/basic/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + basic + + com.coding + parent + 1.0-SNAPSHOT + ../parent/pom.xml + + + \ No newline at end of file diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..6ddf8cef58 --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java @@ -0,0 +1,108 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + private Iterator iterator = new ArrayListIterator(); + + private int length() { + return elementData.length; + } + + private static final int ENLARGE_LENGTH = 100; + + private Object[] enlarge(Object[] origin) { + return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH); + } + + private void enLargeElementData() { + if (size == length()) { + elementData = enlarge(elementData); + } + } + + public void add(Object o) { + enLargeElementData(); + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + checkForAdd(index); + enLargeElementData(); + // 备份 index 处及后面的数据 + Object[] elementsBehindIndex = backBehindElements(elementData, index); + // 给index处 设值 + elementData[index] = o; + // 追加 备份的数据 + appendElement(elementData, index, elementsBehindIndex); + size++; + } + + private void appendElement(Object[] origin, int pos, Object[] append) { + System.arraycopy(append, 0, origin, pos, append.length); + } + + private Object[] backBehindElements(Object[] elementData, int index) { + int backSize = size - index; + Object[] back = new Object[backSize]; + System.arraycopy(elementData, index, back, 0, backSize); + return back; + } + + public Object get(int index) { + checkIndex(index); + return elementData[index]; + } + + private void checkIndex(int index) { + if (index < 0 || index >= size) { + throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); + } + } + + private void checkForAdd(int index) { + if (index < 0 || index > size) { + throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); + } + } + + public Object remove(int index) { + checkIndex(index); + Object[] back = backBehindElements(elementData, index + 1); + System.arraycopy(back, 0, elementData, index, back.length); + Object ret = elementData[index]; + elementData[index] = null; + size--; + return ret; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return iterator; + } + + private class ArrayListIterator implements Iterator { + + int next = 0; + + @Override + public boolean hasNext() { + return next < size; + } + + @Override + public Object next() { + return elementData[next++]; + } + } + +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..175d3adb74 --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java @@ -0,0 +1,147 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size = 0; + private Iterator iterator = new LinkedListIterator(); + + + public void add(Object o) { + Node newNode = new Node(o, null); + if (head == null) { + head = newNode; + } else { + node(size - 1).next = newNode; + } + size++; + } + + public void add(int index, Object o) { + checkForAdd(index); + if (index == size) { + add(o); + }else { + Node newNode = new Node(o, null); + if (index == 0){ + addFirst(o); + } else { + Node preNode = node(index - 1); + Node now = preNode.next; + preNode.next = newNode; + newNode.next = now; + size++; + } + } + + } + + private Node node(int index) { + Node x = head; + for (int i = 0; i < index; i++) { + x = x.next; + } + return x; + } + + public Object get(int index) { + checkIndex(index); + return node(index).data; + } + + /** + * 让被删除的引用的持有者指向下一个节点 + * @param index + * @return + */ + public Object remove(int index) { + final Object ret; + checkIndex(index); + if (index == 0) { + Node removeNode = head; + ret = head.data; + head = removeNode.next; + } else { + Node pre = node(index - 1); + Node removeNode = pre.next; + ret = removeNode.data; + pre.next = removeNode.next; + } + size--; + return ret; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + head = new Node(o, head);; + size++; + } + + public void addLast(Object o) { + add(o); + } + + public Object removeFirst() { + if (size == 0){ + return null; + }else { + return remove(0); + } + } + + public Object removeLast() { + return remove(size - 1); + } + + public Iterator iterator() { + return iterator; + } + + private void checkIndex(int index) { + if (index < 0 || index >= size) { + throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); + } + } + + private void checkForAdd(int index) { + if (index < 0 || index > size) { + throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); + } + } + + private static class Node { + Object data; + Node next; + + public Node() { + } + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + private class LinkedListIterator implements Iterator{ + + private Node next; + + @Override + public boolean hasNext() { + return next != null; + } + + @Override + public Object next() { + if (next == null) { + throw new IndexOutOfBoundsException("there is no node in list"); + } + Node ret = next; + next = next.next; + return ret.data; + } + } +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java new file mode 100644 index 0000000000..0f6caaec6f --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java @@ -0,0 +1,24 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class Queue { + + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.remove(0); + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java new file mode 100644 index 0000000000..7d91c326e0 --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (isEmpty()) { + throw new IllegalStateException("the stack is empty"); + } + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + if (isEmpty()) { + throw new IllegalStateException("the stack is empty"); + } + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty(){ + return size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArrayListTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArrayListTest.java new file mode 100644 index 0000000000..85d3cf6901 --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArrayListTest.java @@ -0,0 +1,25 @@ +package com.coding.api; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Created by luoziyihao on 2/25/17. + */ +public class ArrayListTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Test + public void testAdd(){ + List list = new ArrayList(Arrays.asList(0, 1, 2, 3)); + logger.info("list={}", list); + list.add(5, 2); + logger.info("list={}", list); + } +} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java new file mode 100644 index 0000000000..eb41a7e262 --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java @@ -0,0 +1,22 @@ +package com.coding.api; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +/** + * Created by luoziyihao on 2/25/17. + */ +public class ArraysTest { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + @Test + public void testCopyOf(){ + Object[] a = new Object[]{1, 2, 3, 4}; + Object[] b = Arrays.copyOf(a, 10); + logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b)); + } +} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java new file mode 100644 index 0000000000..efc4022378 --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java @@ -0,0 +1,24 @@ +package com.coding.api; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +/** + * Created by luoziyihao on 2/25/17. + */ +public class SystemTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Test + public void testArrayCopy() { + int[] a = new int[]{1, 2, 3, 4, 5, 6, 7}; + int[] b = new int[]{11, 22, 33, 44, 55, 66, 77}; + System.arraycopy(a, 2, b, 4, 3); + logger.info("b={}", Arrays.toString(b)); + + } +} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..9241fe72da --- /dev/null +++ b/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java @@ -0,0 +1,35 @@ +package com.coding.basic; + +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * Created by luoziyihao on 2/25/17. + */ +public class ArrayListTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + private List list = new ArrayList(); + + @Before + public void before() { + + } + + @Test + public void add() throws Exception { + list.add(1); + } + + @Test + public void get() throws Exception { + add(); + logger.info("{}", list.get(0)); + } + +} \ No newline at end of file diff --git a/group17/1204187480/code/homework/coderising/pom.xml b/group17/1204187480/code/homework/coderising/pom.xml new file mode 100644 index 0000000000..b457f36dab --- /dev/null +++ b/group17/1204187480/code/homework/coderising/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + coderising + + com.coding + parent + 1.0-SNAPSHOT + ../parent/pom.xml + + + + 2.1 + 1.2.24 + + + + + commons-digester + commons-digester + ${commons-digester.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + + + + \ No newline at end of file diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/action/LoginAction.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/action/LoginAction.java new file mode 100644 index 0000000000..5496d8084d --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/action/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.action; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..9aa6404d2a --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java @@ -0,0 +1,252 @@ +package com.coderising.array; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ArrayUtil { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int length = origin.length; + int mid = length >> 1; + for (int i = 0; i < mid; i++) { + int hIndex = length - 1 -i; + int l = origin[i]; + int h = origin[hIndex]; + origin[hIndex] = l; + origin[i] = h; + } + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int removeValue = 0; + return removeValue(oldArray, removeValue); + } + + private int[] removeValue(int[] oldArray, int removeValue) { + int length = oldArray.length; + int[] dest = new int[length]; + int j = 0; + for(int i = 0; i < length; i++) { + int v = oldArray[i]; + if (v != removeValue) { + dest[j++] = v; + } + } + + int[] retArray = new int[j]; + System.arraycopy(dest, 0, retArray, 0, j); + return retArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * todo 数组 a1, b1 自身去重 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int length1 = array1.length; + int length2 = array2.length; + int length = length1 + length2; + int[] newArray = new int[length]; + + return findAndSetLeastWithOutDuplicate(array1, array2, 0, 0, 0, 0, newArray); + } + + /** + * todo 优化递归出口判断, 优化三个条件判断为一个 + * @param array1 + * @param array2 + * @param i + * @param j + * @param k + * @param duplicate + * @param newArray + * @return + */ + private int[] findAndSetLeastWithOutDuplicate(int[] array1, int[] array2, int i, int j, int k, int duplicate, int[] newArray) { + + if (i == array1.length && j < array2.length) { + System.arraycopy(array2, j, newArray, k, array2.length - j); + return copyLastValues(newArray, duplicate); + } + if (j == array2.length && i < array1.length) { + System.arraycopy(array1, i, newArray, k, array1.length - i); + return copyLastValues(newArray, duplicate); + } + if (j == array2.length && i == array1.length) { + return copyLastValues(newArray, duplicate); + } + + int v1 = array1[i]; + int v2 = array2[j]; + if (v1 < v2) { + newArray [k] = v1; + return findAndSetLeastWithOutDuplicate(array1, array2, ++i, j, ++k, duplicate, newArray); + } else if (v1 > v2){ + newArray [k] = v2; + return findAndSetLeastWithOutDuplicate(array1, array2, i, ++j, ++k, duplicate, newArray); + } else { + newArray [k] = v2; + return findAndSetLeastWithOutDuplicate(array1, array2, ++i, ++j, ++k, ++duplicate, newArray); + } + + } + + private int[] copyLastValues(int[] newArray, int duplicate) { + int[] retArray = new int[newArray.length - duplicate]; + System.arraycopy(newArray, 0, retArray, 0, retArray.length); + return retArray; + } + + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if (max <= 1) { + return new int[]{}; + } + int [] newArray = new int[max]; + newArray[0] = 1; + return fibonacciN(1, 1, 1, max, newArray); + } + + private int[] fibonacciN(int size, int current, int next, int max, int[] newArray) { + if (next >= max) { + int[] retArray = new int[size]; + System.arraycopy(newArray, 0, retArray, 0, size); + return retArray; + } else { + newArray[++size - 1] = next; + return fibonacciN(size, next, current + next, max, newArray); + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * todo 使用已有的质数序列 优化质数验证 + * @param max + * @return + */ + public int[] getPrimes(int max){ + if (max <= 2) { + return new int[]{}; + } + + int[] newArray = new int[max]; + int j = 0; + for (int i = 2; i < max; i++) { + if (isPrime(i)) { + newArray[j++] = i; + } + } + int[] retArray = new int[j]; + System.arraycopy(newArray, 0, retArray, 0, j); + return retArray; + } + + private boolean isPrime(int number) { + int limit = Double.valueOf(Math.sqrt(number)).intValue(); + for(int i = 2; i <= limit; i++) { + if (number % i == 0 ) { + return false; + } + } + return true; + + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int[] newArray = new int[48]; // 经过不少数学家研究,到2013年2月6日为止,一共找到了48个完全数。 + int j = 0; + for (int i = 2; i < max; i++) { + if (isPerfectNumber(i)) { + if (j >= newArray.length) { + newArray = this.grow(newArray, 1); + } + newArray[j++] = i; + + } + } + int[] retArray = new int[j]; + System.arraycopy(newArray, 0, retArray, 0, j); + return retArray; + } + + private boolean isPerfectNumber(int number) { + int sum = 0; + for (int i = 1; i < number; i++) { + if (number % i == 0) { + sum += i; + } + } + + return sum == number; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder builder = new StringBuilder(20); + int length = array.length; + for (int i = 0; i< length; i++) { + builder.append(array[i]).append(seperator); + } + builder.deleteCharAt(builder.length() - seperator.length()); + return builder.toString(); + } + + +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..4e1cf74391 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java @@ -0,0 +1,122 @@ +package com.coderising.litestruts; + +import com.coderising.litestruts.parser.ActionConfig; +import com.coderising.litestruts.parser.DefaultStrutsParser; +import com.coderising.litestruts.parser.StrutsConfig; +import com.coderising.litestruts.parser.StrutsParser; +import com.coderising.litestruts.util.BeanUtils; + +import java.util.HashMap; +import java.util.Map; + + +public class Struts { + + private static StrutsParser strutsParser = new DefaultStrutsParser(); + + private static final String STRUTS_CONFIG_PATH = "struts.xml"; + private static final BeanUtils beanUtils = new BeanUtils(); + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + /** + * 0. 读取配置文件struts.xml + */ + StrutsConfig strutsConfig = strutsParser.parser(STRUTS_CONFIG_PATH); + ActionConfig actionConfig = strutsConfig.getActions().get(actionName); + /** + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + */ + Object action = setPropertiesForAction(actionConfig, actionName, parameters); + + /** + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + */ + String resultName = doExecute(action); + /** + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + */ + View view = createViewAndSetParameters(action); + /** + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + setViewValue(view, resultName, actionConfig); + return view; + } + + private static void setViewValue(View view, String resultName, ActionConfig config) { + view.setJsp(config.getResults().get(resultName).getView()); + } + + private static View createViewAndSetParameters(Object action) { + View view = new View(); + view.setParameters(beanUtils.describe(action)); + return view; + } + + private static String doExecute(Object action) { + return (String) beanUtils.invokeWithNoParamter("execute", action); + } + + private static Object setPropertiesForAction(ActionConfig actionConfig, String actionName, Map parameters) { + Object action = createInstance(findActionClass(actionConfig.getClassName())); + for (Map.Entry entry : parameters.entrySet()) { + setProperty(entry.getKey(), entry.getValue(), action); + } + return action; + } + + /** + * todo 校验 key 是否存在 + * + * @param key + * @param value + * @param action + */ + private static void setProperty(String key, String value, Object action) { + beanUtils.setPara(value, key, action); + } + + private static Object createInstance(Class classValue) { + try { + return classValue.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + + private static Class findActionClass(String className) { + try { + return Class.forName(className); + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + } + +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java new file mode 100644 index 0000000000..4aaba284fb --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java @@ -0,0 +1,45 @@ +package com.coderising.litestruts.parser; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by luoziyihao on 3/5/17. + */ +public class ActionConfig { + private String name; + private String className; + private Map results = new HashMap<>(10); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public Map getResults() { + return results; + } + + public void setResults(Map results) { + this.results = results; + } + + public void addResult(Result result) { + this.results.put(result.getName(), result); + } + + +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java new file mode 100644 index 0000000000..ea58507738 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java @@ -0,0 +1,52 @@ +package com.coderising.litestruts.parser; + +import com.alibaba.fastjson.JSON; +import org.apache.commons.digester.Digester; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.SAXException; + +import java.io.File; +import java.io.IOException; + +/** + * 解析 struts.xml 文件 + * @apiNote 借鉴 http://www.everycoding.com/coding/78.html; http://blog.csdn.net/caihaijiang/article/details/5944955 + * Created by luoziyihao on 3/5/17. + */ +public class DefaultStrutsParser implements StrutsParser { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public StrutsConfig parser(String filePathInClasspath) { + String path = this.getClass().getClassLoader().getResource(filePathInClasspath).getPath(); + File input = new File(path); + Digester digester = new Digester(); + // 创建 StrutsConfig 对象 + digester.addObjectCreate("struts", StrutsConfig.class); + // 将 struts 节点上的attribute属性映射到 StrutsConfig 对象的属性上 + digester.addSetProperties("struts"); + digester.addObjectCreate("struts/action", ActionConfig.class); + // 将 struts/action 节点上的attribute属性映射到 Action 对象的属性上, 并自定义属性映射 + digester.addSetProperties("struts/action" + , new String[]{"name", "class"}, new String[]{"name", "className"}); + digester.addObjectCreate("struts/action/result", Result.class); + digester.addSetProperties("struts/action/result" + , new String[]{"name"}, new String[]{"name"}); + // 将 struts/action/result 节点上的body属性映射到 Result 对象的属性上 + digester.addCallMethod("struts/action/result", "setView", 0); + // 对应struts/action/result 生成的对象添加到 Action中 + digester.addSetNext("struts/action/result", "addResult"); + // 对应struts/action 生成的对象添加到 Struts中 + digester.addSetNext("struts/action", "addAction"); + + try { + StrutsConfig strutsConfig = (StrutsConfig) digester.parse(input); + logger.debug("strutsConfig={}", JSON.toJSONString(strutsConfig)); + return strutsConfig; + } catch (IOException | SAXException e) { + throw new IllegalStateException(e); + } + + } +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java new file mode 100644 index 0000000000..c402418e6b --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java @@ -0,0 +1,22 @@ +package com.coderising.litestruts.parser; + +public class Result { + private String name; + private String view; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getView() { + return view; + } + + public void setView(String view) { + this.view = view; + } +} \ No newline at end of file diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java new file mode 100644 index 0000000000..88f769157e --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts.parser; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by luoziyihao on 3/5/17. + */ +public class StrutsConfig { + public Map actions = new HashMap<>(10); + + public Map getActions() { + return actions; + } + + public void setActions(Map actions) { + this.actions = actions; + } + + public void addAction(ActionConfig action) { + this.actions.put(action.getName(), action); + } +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java new file mode 100644 index 0000000000..ab7358c777 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java @@ -0,0 +1,8 @@ +package com.coderising.litestruts.parser; + +/** + * Created by luoziyihao on 3/5/17. + */ +public interface StrutsParser { + StrutsConfig parser(String filePathInClasspath); +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/BeanUtils.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/BeanUtils.java new file mode 100644 index 0000000000..775b005466 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/BeanUtils.java @@ -0,0 +1,144 @@ +package com.coderising.litestruts.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by luoziyihao on 5/25/16. + */ +public class BeanUtils { + + + public static final String SET = "set"; + public static final String GET = "get"; + // 日志输出类 + private final Logger log = LoggerFactory.getLogger(this.getClass()); + private final StringUtils stringUtils = new StringUtils(); + + public Object setInvoke(Object para, String methodName, Object obj) { + Method method = null; + Object returnObj = null; + try { + + method = obj.getClass().getMethod(methodName, para.getClass()); + returnObj = method.invoke(obj, para); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return returnObj; + } + + public Object getInvoke(String methodName, Object obj) { + Method method = null; + Object returnObj = null; + try { + method = obj.getClass().getMethod(methodName); + returnObj = method.invoke(obj); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return returnObj; + } + + public Object invokeWithNoParamter(String methodName, Object obj) { + Method method; + Object returnObj = null; + try { + method = obj.getClass().getMethod(methodName); + returnObj = method.invoke(obj); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return returnObj; + } + + + + public Object getPara(String paraName, Object object) { + if (stringUtils.isSpaceOrNull(paraName)) { + throw new RuntimeException("paraname is null or space"); + } + String methodName = new StringBuilder().append(GET).append(stringUtils.toUpperCase(paraName, 0)).toString(); + return getInvoke(methodName, object); + } + + + + public Object setPara(Object para, String paraName, Object object) { + if (stringUtils.isSpaceOrNull(paraName)) { + throw new RuntimeException("paraname is null or space"); + } + String methodName = new StringBuilder().append(SET).append(stringUtils.toUpperCase(paraName, 0)).toString(); + return setInvoke(para, methodName, object); + } + + public T get(String paraName, Object object, Class clazz) { + return (T) getPara(paraName, object); + } + + public Integer getInt(String paraName, Object object) { + return (Integer) getPara(paraName, object); + } + + public Long getLong(String paraName, Object object) { + return (Long) getPara(paraName, object); + } + + public Double getDouble(String paraName, Object object) { + return (Double) getPara(paraName, object); + } + + public BigDecimal getBigDecimal(String paraName, Object object) { + return (BigDecimal) getPara(paraName, object); + } + + public String getString(String paraName, Object object) { + return getPara(paraName, object).toString(); + } + + public Date getDate(String paraName, Object object) { + return (Date) getPara(paraName, object); + } + + public Long getLongByString(String paraName, Object object) { + return Long.parseLong(getString(paraName, object)); + } + + public Integer getIntByString(String paraName, Object object) { + return Integer.parseInt(getString(paraName, object)); + } + + public Double getDoubleByString(String paraName, Object object) { + return Double.parseDouble(getString(paraName, object)); + } + + public BigDecimal getBigDecimalByString(String paraName, Object object) { + return new BigDecimal(getString(paraName, object)); + } + + private final static String GETTER_PRE = "get"; + public Map describe(Object model) { + Method[] methods = model.getClass().getDeclaredMethods(); //获取实体类的所有属性,返回Field数组 + Map properties = new HashMap<>(); + for (Method method : methods) { + String methodName = method.getName(); + if (methodName.startsWith(GETTER_PRE)) { + try { + Object o = method.invoke(model); + String valueName = stringUtils.toLowwerCase(methodName.substring(GETTER_PRE.length()), 0); + properties.put(valueName, o); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new IllegalStateException(e); + } + } + } + return properties; + } +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/StringUtils.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/StringUtils.java new file mode 100644 index 0000000000..7fe2ed5ac4 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/StringUtils.java @@ -0,0 +1,34 @@ +package com.coderising.litestruts.util; + +/** + * Created by luoziyihao on 3/5/17. + */ +public class StringUtils { + + /** + * 改变指定位置的 char的大小写 + */ + public String toUpperCase(String str, int index) { + char[] chars = str.toCharArray(); + if (index + 1 > chars.length) { + throw new RuntimeException("the char at the index don't exist"); + } + chars[index] = Character.toUpperCase(chars[index]); + return new String(chars); + } + + /** + * 改变指定位置的 char的大小写 + */ + public String toLowwerCase(String str, int index) { + char[] chars = str.toCharArray(); + if (index + 1 > chars.length ) {throw new RuntimeException("the char at the index don't exist");} + chars[index] = Character.toLowerCase(chars[index]); + return new String(chars); + } + + public boolean isSpaceOrNull(String paraName) { + return (paraName == null || paraName.trim().isEmpty()); + } + +} diff --git a/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml b/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml new file mode 100644 index 0000000000..dd598a3664 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java new file mode 100644 index 0000000000..0ea94e4183 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java @@ -0,0 +1,19 @@ +package com.coderising.api; + +import org.junit.Test; + +/** + * Created by luoziyihao on 3/5/17. + */ +public class ComputeTest { + + @Test + public void testDivisionExactly(){ + System.out.println( 7 >> 1); + } + + @Test + public void testSqrt() { + System.out.println(Math.sqrt(10)); + } +} diff --git a/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java new file mode 100644 index 0000000000..6abb5d925d --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java @@ -0,0 +1,25 @@ +package com.coderising.api; + +import org.junit.Test; + +/** + * Created by luoziyihao on 3/5/17. + */ +public class CycleTest { + + /** + * checkIndex will be excuted in each cycle + */ + @Test + public void testForSize() { + int[] arr = new int[]{1, 2, 3, 4, 54}; + for (int i = 0; checkIndex(i, arr); i++ ) { + + } + } + + private boolean checkIndex(int i, int[] arr) { + System.out.println(i); + return i < arr.length; + } +} diff --git a/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/array/ArrayUtilTest.java b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..be29b01d42 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,76 @@ +package com.coderising.array; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; + +import static org.junit.Assert.*; + +/** + * Created by luoziyihao on 3/5/17. + */ +public class ArrayUtilTest { + + private ArrayUtil creatArrayUtil(){ + return new ArrayUtil(); + } + + @Test + public void reverseArray() throws Exception { + int[] origin = new int[]{1, 2, 3}; + int[] destArray = new int[]{3, 2, 1}; + creatArrayUtil().reverseArray(origin); + Assert.assertArrayEquals(destArray, origin); + } + + @Test + public void removeZero() throws Exception { + int[] origin = new int[]{1, 2, 3, 0, 10}; + int[] destArray = new int[]{1, 2, 3, 10}; + int[] retArray = creatArrayUtil().removeZero(origin); + Assert.assertArrayEquals(destArray, retArray); + } + + @Test + public void merge() throws Exception { + int[] a = new int[]{1, 2, 3}; + int[] b = new int[]{2, 3}; + + int[] newArray = creatArrayUtil().merge(a, b); + info(newArray); + assertArrayEquals(new int[]{1, 2, 3}, newArray); + } + + @Test + public void grow() throws Exception { + assertArrayEquals(new int[]{1, 2, 0, 0}, creatArrayUtil().grow(new int[]{1, 2}, 2)); + } + + @Test + public void fibonacci() throws Exception { + assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8}, creatArrayUtil().fibonacci(10)); + } + + @Test + public void getPrimes() throws Exception { + int max = Double.valueOf(Math.pow(2, 4)).intValue(); + assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13}, creatArrayUtil().getPrimes(max)); + } + + @Test + public void getPerfectNumbers() throws Exception { + int max = Double.valueOf(Math.pow(2, 16)).intValue(); + assertArrayEquals(new int[]{6, 28, 496, 8128}, creatArrayUtil().getPerfectNumbers(max)); + + } + + @Test + public void join() throws Exception { + assertEquals("1_2_3_10", creatArrayUtil().join(new int[]{1, 2, 3, 10}, "_")); + } + + private void info(int[] array) { + System.out.println(Arrays.toString(array)); + } +} \ No newline at end of file diff --git a/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java new file mode 100644 index 0000000000..72e841a230 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java @@ -0,0 +1,14 @@ +package com.coderising.litestruts.parser; + +import org.junit.Test; + +/** + * Created by luoziyihao on 3/5/17. + */ +public class StructsParserTest { + @Test + public void parser() throws Exception { + new DefaultStrutsParser().parser("struts.xml"); + } + +} \ No newline at end of file diff --git a/group17/1204187480/code/homework/parent/pom.xml b/group17/1204187480/code/homework/parent/pom.xml new file mode 100644 index 0000000000..9d29a4d93e --- /dev/null +++ b/group17/1204187480/code/homework/parent/pom.xml @@ -0,0 +1,95 @@ + + 4.0.0 + + com.coding + parent + pom + 1.0-SNAPSHOT + https://github.com/luoziyihao/coding2017 + + + UTF-8 + UTF-8 + UTF-8 + 1.8 + 1.8 + 1.8 + 3.0 + 1.1.7 + 1.2 + 1.2.17 + 4.12 + + + + + + ch.qos.logback + logback-classic + ${logback-classic.version} + + + + commons-logging + commons-logging + ${commons-logging.version} + + + log4j + log4j + ${log4j.version} + + + + + junit + junit + ${junit.version} + + + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + + + ${project.artifactId} + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + \ No newline at end of file diff --git a/group17/1204187480/code/homework/pom.xml b/group17/1204187480/code/homework/pom.xml new file mode 100644 index 0000000000..4e0dcf9a8d --- /dev/null +++ b/group17/1204187480/code/homework/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + com.coding + coding2017 + 1.0-SNAPSHOT + pom + + parent + basic + coderising + + + diff --git "a/group17/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272" "b/group17/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272" new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group17/1264835468/src/assignment/BinaryTree.java b/group17/1264835468/src/assignment/BinaryTree.java new file mode 100644 index 0000000000..1d76a7ce2c --- /dev/null +++ b/group17/1264835468/src/assignment/BinaryTree.java @@ -0,0 +1,154 @@ +package assignment; + +// +public class BinaryTree> implements Iterable> { + private BinaryTreeNode root; + + public BinaryTree(T data) { + root = new BinaryTreeNode(data); + } + + public BinaryTree(BinaryTreeNode root) { + this.root = root; + } + + public BinaryTreeNode insert(T data) { + BinaryTreeNode node = new BinaryTreeNode(data); + if (root == null) + root = node; + else + insert(root, node); + return node; + } + + public BinaryTreeNode insert(BinaryTreeNode node) { + return insert(node.getData()); + } + + private void insert(BinaryTreeNode current, BinaryTreeNode node) { + + if (current.getData().compareTo(node.getData()) > 0) { + if (current.getLeft() == null) + current.setLeft(node); + else + insert(current.getLeft(), node); + } + else { + if (current.getRight() == null) + current.setRight(node); + else + insert(current.getRight(), node); + } + } + + @Override + public String toString() { + return new BFSNodeQueue().toString(); + } + + /** + * 广度优先遍历节点队列 + * + * @author Administrator + * + */ + private class BFSNodeQueue { + private MyQueue> nodeQueue; + + public BFSNodeQueue() { + nodeQueue = new MyQueue<>(); + } + + public boolean isEmpty() { + return nodeQueue.isEmpty(); + } + + public void enQueue(BinaryTreeNode node) { + if (node != null) nodeQueue.enQueue(node); + } + + // 出队同时把子节点入队 + public BinaryTreeNode deQueue() { + if (!isEmpty()) { + BinaryTreeNode first = nodeQueue.deQueue(); + enQueue(first.getLeft()); + enQueue(first.getRight()); + return first; + } + throw new QueueIsEmptyException(); + } + + // 把所有出队节点放进另一个队列中 + public MyQueue> getResult() { + prepare(); + MyQueue> result = new MyQueue<>(); + while (!isEmpty()) { + result.enQueue(deQueue()); + } + return result; + } + + private void prepare() { + clearQueue(); + enQueue(root); + } + + public void clearQueue() { + while (!isEmpty()) { + deQueue(); + } + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + + Iterator> iterator = iterator(); + while (iterator.hasNext()) { + stringBuilder.append(iterator.next() + "\n"); + } + return stringBuilder.toString(); + } + } + + @Override + public Iterator> iterator() { + return new BFSIterator(); + } + + private class BFSIterator implements Iterator> { + MyArrayList> list; + Iterator> iterator; + + public BFSIterator() { + MyQueue> BFSQueue = new BFSNodeQueue().getResult(); + list = new MyArrayList<>(); + while (!BFSQueue.isEmpty()) { + list.add(BFSQueue.deQueue()); + } + iterator = list.iterator(); + } + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public BinaryTreeNode next() { + return iterator.next(); + } + } + + public static void main(String[] args) { + BinaryTree binaryTree = new BinaryTree<>(5); + binaryTree.insert(6); + binaryTree.insert(7); + binaryTree.insert(4); + Iterator> iterator = binaryTree.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + System.out.println(binaryTree); + } +} diff --git a/group17/1264835468/src/assignment/BinaryTreeNode.java b/group17/1264835468/src/assignment/BinaryTreeNode.java new file mode 100644 index 0000000000..02a162ae10 --- /dev/null +++ b/group17/1264835468/src/assignment/BinaryTreeNode.java @@ -0,0 +1,58 @@ +package assignment; + +public class BinaryTreeNode> { + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data) { + this.data = data; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("node:" + data); + // 非叶节点则加上左右子节点data + if (left != null || right != null) { + if (left != null) + stringBuilder.append(",left:" + left.data); + else + stringBuilder.append(",left:null"); + if (right != null) + stringBuilder.append(",right:" + right.data); + else + stringBuilder.append(",right:null"); + } + return stringBuilder.toString(); + } + + public static void main(String[] args) { + // BinaryTreeNode binaryTreeNode = new BinaryTreeNode<>(1); + } + +} diff --git a/group17/1264835468/src/assignment/Iterable.java b/group17/1264835468/src/assignment/Iterable.java new file mode 100644 index 0000000000..403c5e9866 --- /dev/null +++ b/group17/1264835468/src/assignment/Iterable.java @@ -0,0 +1,6 @@ +package assignment; + +// +public interface Iterable { + Iterator iterator(); +} diff --git a/group17/1264835468/src/assignment/Iterator.java b/group17/1264835468/src/assignment/Iterator.java new file mode 100644 index 0000000000..feb4e2066a --- /dev/null +++ b/group17/1264835468/src/assignment/Iterator.java @@ -0,0 +1,7 @@ +package assignment; + +public interface Iterator { + public boolean hasNext(); + + public E next(); +} diff --git a/group17/1264835468/src/assignment/List.java b/group17/1264835468/src/assignment/List.java new file mode 100644 index 0000000000..ba31dc333b --- /dev/null +++ b/group17/1264835468/src/assignment/List.java @@ -0,0 +1,14 @@ +package assignment; + +// +public interface List { + public void add(E o); + + public void add(int index, E o); + + public E get(int index); + + public E remove(int index); + + public int size(); +} diff --git a/group17/1264835468/src/assignment/MyArrayList.java b/group17/1264835468/src/assignment/MyArrayList.java new file mode 100644 index 0000000000..ea9ae87755 --- /dev/null +++ b/group17/1264835468/src/assignment/MyArrayList.java @@ -0,0 +1,110 @@ +package assignment; + +import java.util.Arrays; + +public class MyArrayList implements List, Iterable { + private Object[] elementData; + private static final int DEFAULT_SIZE = 10; + private int size; + + public MyArrayList() { + this(DEFAULT_SIZE); + } + + public MyArrayList(int initSize) { + if (initSize < 0) { + throw new IllegalArgumentException(initSize + " < 0"); + } + if (initSize == 0) { + elementData = new Object[DEFAULT_SIZE]; + } + else { + elementData = new Object[initSize]; + } + size = 0; + } + + public void add(E o) { + growIfNeed(); + elementData[size++] = o; + } + + public void add(int index, E o) { + if (index < 0 || index > size) { + throw new IllegalArgumentException("index:" + index); + } + growIfNeed(); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + @SuppressWarnings("unchecked") + public E get(int index) { + rangeCheck(index); + return (E) elementData[index]; + } + + public E remove(int index) { + rangeCheck(index); + E target = get(index); + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return target; + } + + public int size() { + return size; + } + + private void rangeCheck(int index) { + if (index >= size) { + throw new NoSuchElementException("index:" + index); + } + } + + private void growIfNeed() { + if (size == elementData.length) + grow(); + } + + private void grow() { + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + + @Override + public Iterator iterator() { + return new ArrayIterator<>(); + } + + private class ArrayIterator implements Iterator { + private int currentPos = 0; + + @Override + public boolean hasNext() { + return currentPos < size; + } + + @SuppressWarnings("unchecked") + @Override + public E next() { + rangeCheck(currentPos); + return (E) elementData[currentPos++]; + } + + } + + @Override + public String toString() { + return Arrays.toString(Arrays.copyOf(elementData, size)); + } + +} + +class NoSuchElementException extends RuntimeException { + + public NoSuchElementException(String string) { + super(string); + } + +} diff --git a/group17/1264835468/src/assignment/MyLinkedList.java b/group17/1264835468/src/assignment/MyLinkedList.java new file mode 100644 index 0000000000..b96a7e1d5b --- /dev/null +++ b/group17/1264835468/src/assignment/MyLinkedList.java @@ -0,0 +1,144 @@ +package assignment; + +public class MyLinkedList implements List, Iterable { + private Node head; + private int size; + + public MyLinkedList() { + size = 0; + } + + public void add(E o) { + if (head == null) + addFirst(o); + else + addLast(o); + } + + public void addFirst(E o) { + Node oldFirst = head; + head = new Node<>(o, oldFirst); + size++; + } + + public void addLast(E o) { + if (head == null) { + addFirst(o); + } + else { + Node oldLast = movePtrTo(size - 1); + oldLast.next = new Node<>(o, null); + size++; + } + + } + + public void add(int index, E o) { + if (index > size || index < 0) { + throw new IllegalArgumentException("index:" + index); + } + if (index == 0) { + addFirst(o); + return; + } + Node temp = movePtrTo(index - 1); + Node oldNext = temp.next; + Node newNext = new Node<>(o, oldNext); + temp.next = newNext; + size++; + } + + public E remove(int index) { + rangeCheck(index); + E data; + if (index == 0) { + data = head.data; + head = head.next; + } + else { + Node pre = movePtrTo(index - 1); + Node target = pre.next; + pre.next = target.next; + data = target.data; + } + size--; + return data; + } + + public E get(int index) { + rangeCheck(index); + return movePtrTo(index).data; + } + + public int size() { + return size; + } + + private Node movePtrTo(int index) { + Node resultNode = head; + for (int i = 0; i < index; i++) { + resultNode = resultNode.next; + } + return resultNode; + } + + private void rangeCheck(int index) { + if (index >= size) { + throw new NoSuchElementException("index:" + index); + } + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder('['); + Node temp = head; + while (temp != null) { + stringBuilder.append(String.valueOf(temp.toString()) + ","); + temp = temp.next; + } + stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length()); + stringBuilder.append(']'); + return stringBuilder.toString(); + } + + private static class Node { + private T data; + private Node next; + + public Node(T data, Node next) { + this.data = data; + this.next = next; + } + + @Override + public String toString() { + return data.toString(); + } + } + + @Override + public Iterator iterator() { + return new ListIterator(); + } + + private class ListIterator implements Iterator { + Node currentNode; + + public ListIterator() { + currentNode = head; + } + + @Override + public boolean hasNext() { + return currentNode.next != null; + } + + @Override + public E next() { + Node temp = currentNode; + currentNode = currentNode.next; + return temp.data; + } + + } +} \ No newline at end of file diff --git a/group17/1264835468/src/assignment/MyQueue.java b/group17/1264835468/src/assignment/MyQueue.java new file mode 100644 index 0000000000..c5e3e8ce88 --- /dev/null +++ b/group17/1264835468/src/assignment/MyQueue.java @@ -0,0 +1,34 @@ +package assignment; + +public class MyQueue { + private MyLinkedList elementData = new MyLinkedList<>(); + + public void enQueue(T o) { + elementData.addLast(o); + } + + public T deQueue() { + if (!isEmpty()) { + return elementData.remove(0); + } + throw new QueueIsEmptyException(); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} + +class QueueIsEmptyException extends RuntimeException { + public QueueIsEmptyException() { + super(); + } + + public QueueIsEmptyException(String string) { + super(string); + } +} diff --git a/group17/1264835468/src/assignment/MyStack.java b/group17/1264835468/src/assignment/MyStack.java new file mode 100644 index 0000000000..0c3d30337b --- /dev/null +++ b/group17/1264835468/src/assignment/MyStack.java @@ -0,0 +1,39 @@ +package assignment; + +public class MyStack { + private MyArrayList elementData = new MyArrayList<>(); + + public void push(T o) { + elementData.add(o); + } + + public T pop() { + if (!isEmpty()) { + T data = elementData.remove(elementData.size() - 1); + return data; + } + throw new StackIsEmptyException(); + } + + public T peek() { + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} + +class StackIsEmptyException extends RuntimeException { + public StackIsEmptyException() { + super(); + } + + public StackIsEmptyException(String string) { + super(string); + } +} diff --git a/group17/1264835468/src/assignment2_26/ArrayUtil.java b/group17/1264835468/src/assignment2_26/ArrayUtil.java new file mode 100644 index 0000000000..3e268a05bd --- /dev/null +++ b/group17/1264835468/src/assignment2_26/ArrayUtil.java @@ -0,0 +1,183 @@ +package assignment2_26; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.TreeSet; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static void reverseArray(int[] origin) { + int mid = origin.length / 2; + for (int i = 0; i < mid; i++) { + int temp = origin[i]; + int reversePosition = origin.length - 1; + origin[i] = origin[reversePosition]; + origin[reversePosition] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + int count = 0; + for (int i : oldArray) { + if (i != 0) + count++; + } + int[] newArray = new int[count]; + int currentPos = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) + newArray[currentPos++] = oldArray[i]; + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2) { + TreeSet set = new TreeSet<>(); + for (Integer integer : array1) { + set.add(integer); + } + for (Integer integer : array2) { + set.add(integer); + } + int[] result = new int[set.size()]; + for (int i = 0; i < result.length; i++) { + result[i] = set.pollFirst(); + } + return result; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + return Arrays.copyOf(oldArray, size); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max <= 1) + return new int[0]; + List fList = new ArrayList<>(); + fList.add(1); + fList.add(1); + int last = fList.size() - 1; + while (fList.get(last) < max) { + fList.add(fList.get(last) + fList.get(last - 1)); + last++; + } + int[] result = new int[fList.size() - 1]; + for (int i = 0; i < result.length; i++) { + result[i] = fList.get(i); + } + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + boolean[] isPrime = new boolean[max]; + List primes = new ArrayList<>(); + for (int i = 0; i < isPrime.length; i++) { + isPrime[i] = true; + } + for (int i = 2; i * i < max; i++) { + for (int j = i; i * j < max; j++) + isPrime[i * j] = false; + } + for (int i = 2; i < isPrime.length; i++) { + if (isPrime[i]) + primes.add(i); + } + int[] result = new int[primes.size()]; + for (int i = 0; i < result.length; i++) { + result[i] = primes.get(i); + } + return result; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + int sum = 0; + ArrayList perfectNumbers = new ArrayList<>(); + for (int i = 1; i < max; i++) { + for (int j = 1; j < i; j++) { + if (i % j == 0) { + sum += j; + } + } + if (sum == i) + perfectNumbers.add(i); + sum = 0; + } + + int[] result = new int[perfectNumbers.size()]; + for (int i = 0; i < result.length; i++) { + result[i] = perfectNumbers.get(i); + } + return result; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator) { + StringBuilder stringBuilder = new StringBuilder(); + for (int i : array) { + stringBuilder.append(i + seperator); + } + stringBuilder.delete(stringBuilder.length() - seperator.length(), stringBuilder.length()); + + return stringBuilder.toString(); + } + +} diff --git a/group17/1264835468/src/assignment2_26/ArrayUtilTest.java b/group17/1264835468/src/assignment2_26/ArrayUtilTest.java new file mode 100644 index 0000000000..c850714cd5 --- /dev/null +++ b/group17/1264835468/src/assignment2_26/ArrayUtilTest.java @@ -0,0 +1,100 @@ +package assignment2_26; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class ArrayUtilTest { + + @Test + public void testReverseArray() { + int[] array = new int[] {}; + ArrayUtil.reverseArray(array); + assertArrayEquals(new int[] {}, array); + + array = new int[] { 1 }; + ArrayUtil.reverseArray(array); + assertArrayEquals(new int[] { 1 }, array); + + array = new int[] { 1, 2, 3 }; + ArrayUtil.reverseArray(array); + assertArrayEquals(new int[] { 3, 2, 1 }, array); + } + + @Test + public void testRemoveZero() { + int[] array = new int[] {}; + assertArrayEquals(new int[] {}, ArrayUtil.removeZero(array)); + + array = new int[] { 0 }; + assertArrayEquals(new int[] {}, ArrayUtil.removeZero(array)); + + array = new int[] { 1 }; + assertArrayEquals(new int[] { 1 }, ArrayUtil.removeZero(array)); + + array = new int[] { 1, 2, 0, 0, 3 }; + assertArrayEquals(new int[] { 1, 2, 3 }, ArrayUtil.removeZero(array)); + + array = new int[] { 1, 2, 3 }; + assertArrayEquals(new int[] { 1, 2, 3 }, ArrayUtil.removeZero(array)); + } + + @Test + public void testMerge() { + int[] array1 = { 3, 5, 7, 8 }; + int[] array2 = { 4, 5, 6, 7 }; + assertArrayEquals(new int[] { 3, 4, 5, 6, 7, 8 }, ArrayUtil.merge(array1, array2)); + } + + @Test + public void testGrow() { + int[] array = { 3, 5, 7 }; + assertArrayEquals(new int[] { 3, 5, 7, 0, 0 }, ArrayUtil.grow(array, 5)); + assertArrayEquals(new int[] { 3, 5, 7 }, ArrayUtil.grow(array, 3)); + } + + @Test + public void testFibonacci() { + assertArrayEquals(new int[] {}, ArrayUtil.fibonacci(1)); + + assertArrayEquals(new int[] { 1, 1 }, ArrayUtil.fibonacci(2)); + + assertArrayEquals(new int[] { 1, 1, 2, 3, 5, 8, 13 }, ArrayUtil.fibonacci(15)); + } + + @Test + public void testGetPrimes() { + assertArrayEquals(new int[] {}, ArrayUtil.getPrimes(1)); + + assertArrayEquals(new int[] {}, ArrayUtil.getPrimes(2)); + + assertArrayEquals(new int[] { 2 }, ArrayUtil.getPrimes(3)); + + assertArrayEquals(new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }, ArrayUtil.getPrimes(20)); + } + + @Test + public void testGetPerfectNumbers() { + assertArrayEquals(new int[] { 6 }, ArrayUtil.getPerfectNumbers(10)); + + assertArrayEquals(new int[] { 6, 28 }, ArrayUtil.getPerfectNumbers(100)); + + assertArrayEquals(new int[] { 6, 28, 496 }, ArrayUtil.getPerfectNumbers(1000)); + + assertArrayEquals(new int[] { 6, 28, 496, 8128 }, ArrayUtil.getPerfectNumbers(10000)); + + } + + @Test + public void testJoin() { + assertEquals("3-4-5", ArrayUtil.join(new int[] { 3, 4, 5 }, "-")); + + assertEquals("345", ArrayUtil.join(new int[] { 3, 4, 5 }, "")); + + assertEquals("3", ArrayUtil.join(new int[] { 3 }, "")); + + assertEquals("3--4--5", ArrayUtil.join(new int[] { 3, 4, 5 }, "--")); + } + +} diff --git a/group17/1264835468/src/assignment2_26/LoginAction.java b/group17/1264835468/src/assignment2_26/LoginAction.java new file mode 100644 index 0000000000..b3bcf6a6c8 --- /dev/null +++ b/group17/1264835468/src/assignment2_26/LoginAction.java @@ -0,0 +1,42 @@ +package assignment2_26; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group17/1264835468/src/assignment2_26/Struts.java b/group17/1264835468/src/assignment2_26/Struts.java new file mode 100644 index 0000000000..4965ec33a9 --- /dev/null +++ b/group17/1264835468/src/assignment2_26/Struts.java @@ -0,0 +1,99 @@ +package assignment2_26; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +public class Struts { + + private static File configFile = new File("./src/struts.xml");; + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + // 0 + XmlParser phraser = new XmlParser(configFile); + String className = phraser.getClassNameByActionName(actionName); + View view = new View(); + try { + // 1 + Class actionClass = Class.forName(className); + Constructor constructor = actionClass.getConstructor(); + Object instance = constructor.newInstance(); + invokeSetters(actionClass, instance, parameters); + + // 2 + String result = invokeExecute(actionClass, instance); + + // 3 + Map getterResult = invokeGetters(actionClass, instance); + view.setParameters(getterResult); + + // 4 + String resultJsp = phraser.getResultJsp(actionName, result); + view.setJsp(resultJsp); + + } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException + | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + + return view; + } + + private static Map invokeGetters(Class actionClass, Object instance) + throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Map result = new HashMap<>(); + for (Method method : actionClass.getDeclaredMethods()) { + if (method.getName().matches("get.*")) { + String fieldName = method.getName().substring(3).toLowerCase(); + String value = (String) (method.invoke(instance)); + result.put(fieldName, value); + } + } + return result; + } + + private static String invokeExecute(Class actionClass, Object instance) throws NoSuchMethodException, + SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Method method = actionClass.getDeclaredMethod("execute"); + return (String) method.invoke(instance); + } + + private static void invokeSetters(Class actionClass, Object instance, Map parameters) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException { + for (String fieldName : parameters.keySet()) { + invokeSetter(actionClass, instance, fieldName, parameters.get(fieldName)); + } + } + + private static void invokeSetter(Class actionClass, Object instance, String fieldName, String value) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException { + String setterName = "set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1); + Method setter = actionClass.getDeclaredMethod(setterName, String.class); + setter.invoke(instance, value); + } +} diff --git a/group17/1264835468/src/assignment2_26/StrutsTest.java b/group17/1264835468/src/assignment2_26/StrutsTest.java new file mode 100644 index 0000000000..a7375d29bb --- /dev/null +++ b/group17/1264835468/src/assignment2_26/StrutsTest.java @@ -0,0 +1,38 @@ +package assignment2_26; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); // 密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group17/1264835468/src/assignment2_26/View.java b/group17/1264835468/src/assignment2_26/View.java new file mode 100644 index 0000000000..527c2d771b --- /dev/null +++ b/group17/1264835468/src/assignment2_26/View.java @@ -0,0 +1,26 @@ +package assignment2_26; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group17/1264835468/src/assignment2_26/XmlParser.java b/group17/1264835468/src/assignment2_26/XmlParser.java new file mode 100644 index 0000000000..ec1ca305c9 --- /dev/null +++ b/group17/1264835468/src/assignment2_26/XmlParser.java @@ -0,0 +1,72 @@ +package assignment2_26; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +public class XmlParser { + private File file; + List actionElements; + + public XmlParser(File file) { + this.file = file; + actionElements = new ArrayList<>(); + getActionsFromFile(); + } + + public String getClassNameByActionName(String actionName) { + Element action = getElementByActionName(actionName); + return action.getAttribute("class"); + } + + public String getResultJsp(String actionName, String resultName) { + Element action = getElementByActionName(actionName); + NodeList results = action.getChildNodes(); + for (int i = 0; i < results.getLength(); i++) { + Node child = results.item(i); + if (child instanceof Element) { + Element result = (Element) child; + if (result.getAttribute("name").equals(resultName)) + return result.getTextContent(); + } + } + throw new RuntimeException("not found result named:" + resultName); + } + + private Element getElementByActionName(String actionName) { + for (Element element : actionElements) { + if (element.getAttribute("name").equals(actionName)) { + return element; + } + } + throw new RuntimeException("no such element named " + actionName); + } + + private void getActionsFromFile() { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(file); + Element root = document.getDocumentElement(); + NodeList children = root.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child instanceof Element) + actionElements.add((Element) child); + } + } catch (ParserConfigurationException | SAXException | IOException e) { + e.printStackTrace(); + } + } +} diff --git a/group17/1264835468/src/struts.xml b/group17/1264835468/src/struts.xml new file mode 100644 index 0000000000..83666ad411 --- /dev/null +++ b/group17/1264835468/src/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group17/1282579502/.classpath b/group17/1282579502/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group17/1282579502/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group17/1282579502/.gitignore b/group17/1282579502/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group17/1282579502/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group17/1282579502/.project b/group17/1282579502/.project new file mode 100644 index 0000000000..5745b9c135 --- /dev/null +++ b/group17/1282579502/.project @@ -0,0 +1,37 @@ +<<<<<<< HEAD:group17/876385982/.project + + + 876385982 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + +======= + + + 1282579502Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + +>>>>>>> 907d4deeb1542a0f373ee6874add67184cd8332d:group17/1282579502/.project diff --git a/group17/1282579502/.settings/org.eclipse.jdt.core.prefs b/group17/1282579502/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..a698e59674 --- /dev/null +++ b/group17/1282579502/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group17/1282579502/src/com/coderising/array/ArrayUtil.java b/group17/1282579502/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..3f8385d85a --- /dev/null +++ b/group17/1282579502/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,229 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if(origin == null) return; + int tmp; + for(int i = 0; i< origin.length; i++){ + int end = origin.length - 1 -i; + if(end>i){ + tmp = origin[i]; + origin[i] = origin[end]; + origin[end] = tmp; + } + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + LinkedList newArray = new LinkedList<>(); + + for(int i = 0; i< oldArray.length; i++){ + if(oldArray[i] != 0){ + newArray.add(oldArray[i]); + } + } + int[] ret = new int[newArray.size()]; + for(int i = 0; i= array2[j]){ + merged[index] = array2[j]; + j++;} +// }else{ +// merged[index] = array1[i]; +// i++; +// j++; +// } + + index++; + } + //o(n) + while(i store = new LinkedList<>(); + for(int candidate = 2; candidate< max; candidate++ ){ + int sum = 0; + for(int i = 1; i parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + String path = "src/com/coderising/litestruts/struts.xml"; + File rootFile = new File(""); + File rootDir = new File(rootFile.getAbsolutePath()); + File configFile = findFile(rootDir, "struts.xml"); + if(configFile != null){ + //System.out.println("find: " + configFile.getAbsolutePath()); + path = configFile.getAbsolutePath(); + } + View retView = new View(); + XmlParser parser = new XmlParser(path); + //parser.dump(); + List branchNodesList = parser.getActionNodeList(); + try { + for(eNode node : branchNodesList){ + //System.out.println(node); + String classPath = node.attributeMap.get("class"); + Class actionObjectClass = getClassObj(classPath); + if(actionObjectClass != null){ + Constructor actionConstructorObject = createClass(actionObjectClass); + Object newInstance = null; + newInstance = actionConstructorObject.newInstance(); + + Method[] methods = actionObjectClass.getDeclaredMethods(); +// for(Method m : methods){ +// System.out.println("method: " + m.getName()); +// } + Iterator> itr = parameters.entrySet().iterator(); + while(itr.hasNext()){ + Entry call = itr.next(); + //System.out.println(call.getKey() + " " + call.getValue()); + String key = call.getKey(); + String val = call.getValue(); + String setMethodName = "set" + Character.toUpperCase(key.charAt(0)) + key.substring(1); + Method setMethod = getMethod(actionObjectClass, setMethodName, String.class); + if(newInstance != null){ + setMethod.invoke(newInstance, val); + } + } + Method exeMethod = actionObjectClass.getDeclaredMethod("execute", null); + Class returnType = exeMethod.getReturnType(); + Object returnValue = exeMethod.invoke(newInstance, null); + HashMap viewHashParam = new HashMap<>(); + for(Method m:methods){ + if(m.getName().startsWith("get")){ + Object v = m.invoke(newInstance, null); + String getMethodName = m.getName().substring(3); + getMethodName = Character.toLowerCase(getMethodName.charAt(0)) + getMethodName.substring(1); + //System.out.println("get method: " + getMethodName); + viewHashParam.put(getMethodName, v); + } + } + String viewStr = null; + for(eNode resultNode : node.subNodes){ + String nameAttr = resultNode.attributeMap.get("name") ; + if(nameAttr.equals(returnValue)){ + //System.out.println("node: " + resultNode.element_name + " " + resultNode.attributeMap.get("name") + " matches"); + for(eNode jspNode : resultNode.subNodes){ + if(jspNode.isLeaf){ + viewStr = jspNode.element_raw_content; + //System.out.println("jsp str: " + viewStr); + break; + } + } + } + } + + retView.setJsp(viewStr); + retView.setParameters(viewHashParam); + + } + } + } catch (IllegalAccessException | IllegalArgumentException + | InvocationTargetException | InstantiationException | NoSuchMethodException | SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return retView; + } + + public static Class getClassObj(String classPath){ + Class classObject = null; + try { + classObject = Class.forName(classPath); + } catch (ClassNotFoundException e) { + //System.err.println(e.getMessage()); + } + return classObject; + } + + public static Constructor createClass(Class classObject){ + Constructor constructor = null; + try { + constructor = classObject.getConstructor(); + } catch (NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } + return constructor; + } + + public static Method getMethod(Class clazz, String methodName, Class paramClass){ + Method ret = null; + try { + ret = clazz.getMethod(methodName, paramClass); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } + return ret; + } + + public static void main(String[] args){ + + + //System.out.println("absolute path: " + absPath); + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + String actionName = "login"; + + View view = Struts.runAction(actionName,params); + } + + public static File findFile(File targetDir, String targetFileName){ + //System.out.println("targetDir: " + targetDir.getAbsolutePath() + " " + targetDir.isDirectory()); + File configFile = null; + File[] files = targetDir.listFiles(); + + if(files != null){ + for(File f: files){ + //System.out.println("test: " + f.getName()); + if(f.isDirectory()){ + //System.out.println("Dir: " + f.getName()); + configFile = findFile(f, targetFileName); + if(configFile != null){ + break; + } + } + else{ + //System.out.println("File: " + f.getName()); + if(f.getAbsolutePath().endsWith(targetFileName)){ + configFile = f; + break; + } + } + } + } + return configFile; + } + + public static FilenameFilter createFilter(String targetName){ + return new FilenameFilter(){ + + @Override + public boolean accept(File dir, String name) { + // TODO Auto-generated method stub + System.out.println("testing: " + dir + " name: " + name); + return name.endsWith(targetName); + } + + }; + } + + public static List getDirectories(File targetFile){ + List childDirs = new LinkedList<>(); + if(targetFile.isDirectory()){ + File[] files = targetFile.listFiles(); + for(File f: files){ + if(f.isDirectory()) childDirs.add(f); + } + } + + return childDirs; + } + +} diff --git a/group17/1282579502/src/com/coderising/litestruts/StrutsTest.java b/group17/1282579502/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group17/1282579502/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group17/1282579502/src/com/coderising/litestruts/View.java b/group17/1282579502/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group17/1282579502/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group17/1282579502/src/com/coderising/litestruts/struts.xml b/group17/1282579502/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..07f80b6476 --- /dev/null +++ b/group17/1282579502/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group17/1282579502/src/com/coderising/parser/TestDriver.java b/group17/1282579502/src/com/coderising/parser/TestDriver.java new file mode 100644 index 0000000000..a4decf8986 --- /dev/null +++ b/group17/1282579502/src/com/coderising/parser/TestDriver.java @@ -0,0 +1,22 @@ +package com.coderising.parser; + +import com.coderising.parser.XmlParser.eNode; + +public class TestDriver { + + public static void main(String[] args) { + XmlParser testParser = new XmlParser("src/xml/input.xml"); + String input = ""; + System.out.println(); + //eNode e = testParser.parseRawData(input); + //XmlParser.dumpNodePreOrder(e); +// try{ +// testParser.loadFile(testParser.getFile()); +// }catch(Exception e){ +// e.printStackTrace(); +// } + } + + + +} diff --git a/group17/1282579502/src/com/coderising/parser/XmlParser.java b/group17/1282579502/src/com/coderising/parser/XmlParser.java new file mode 100644 index 0000000000..f78be14555 --- /dev/null +++ b/group17/1282579502/src/com/coderising/parser/XmlParser.java @@ -0,0 +1,277 @@ +package com.coderising.parser; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.Stack; + +public class XmlParser { + + private File targetFile = null; + private eNode root = null; + + public XmlParser(String path){ + setTargetFile(path); + try { + String content = loadFile(targetFile); + parseString(content); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public void setTargetFile(String path){ + targetFile = new File(path); + if(! targetFile.isFile() || ! targetFile.exists()){ + throw new IllegalArgumentException("Path: " + path + " is NOT valid."); + } + } + + public File getFile(){ + return targetFile; + } + + protected String loadFile(File f) throws FileNotFoundException{ + StringBuilder sb = new StringBuilder(); + FileReader fr = new FileReader(f); + BufferedReader br = new BufferedReader(fr); + String line = null; + try{ + while((line = br.readLine()) != null){ + line = line.trim(); + if(!line.startsWith("#") && !line.startsWith(" cache = new LinkedList<>(); + int bracketStart=0; + int contentStart=0; + for(int i=0; i< str.length(); i++){ + if(str.charAt(i) == '<'){ + bracketStart = i; + if(i>contentStart){ + String tagVal = str.substring(contentStart, i).trim(); + if(tagVal.length() > 0){ + //System.out.println("content: " + tagVal); + cache.add(tagVal); + } + } + } + else if(str.charAt(i) == '>'){ + String elementTag = str.substring(bracketStart, i+1); + //System.out.println("pushing: " + elementTag); + cache.add(elementTag); + contentStart=i+1; + + } + } + + //debug information + //dumpStack(cache); + + root = processElementStack(cache); + //System.out.println(); + //System.out.println("Dump node tree"); + //dumpNodePreOrder(root); + return root; + } + + private eNode processElementStack(Queue stk){ + + if(!stk.isEmpty()){ + String token = stk.remove(); + if(token.startsWith("'){ + String elementName = str.substring(i+1, j); + branchNode.element_name = elementName.trim(); + //System.out.println("element name: " + elementName); + i = j; + break; + } + } + } + else if(Character.isAlphabetic(c) || c == '"'){ + + if(!foundAttributeName){ + for(int j=i; j'){ + String attr_val = str.substring(i, k).trim(); + if(attr_name != null && attr_val != null){ + //System.out.println("Element: " + branchNode.element_name + " put in: " + attr_name + " " + attr_val); + branchNode.attributeMap.put(attr_name, attr_val.replaceAll("\"", "")); + } + foundAttributeName = false; + i = k; + break; + } + } + } + + } + } + //System.out.println(); + return branchNode; + } + + public List getActionNodeList(){ + return root.subNodes; + } + + private void dumpNodeBFS(eNode root){ + Stack stk = new Stack(); + stk.push(root); + while(!stk.isEmpty()){ + eNode cur = stk.pop(); + dump(cur, stk); + } + + } + + public static void dumpNodePreOrder(eNode root){ + if(root.isLeaf){ + System.out.println("Leaf: "+root.element_raw_content); + } + else{ + System.out.println("Branch: " + root.element_name); + Iterator itr = root.attributeMap.keySet().iterator(); + while(itr.hasNext()){ + String key = itr.next(); + System.out.println("["+ key + "]=[" + root.attributeMap.get(key)+"]"); + } + } + for(eNode i : root.subNodes){ + dumpNodePreOrder(i); + } + } + + private void dump(eNode node, Stack stk){ + System.out.println(node.element_raw_content); + for(int i = 0 ; i< node.subNodes.size(); i++){ + stk.push(node.subNodes.get(i)); + } + } + + private void dumpStack(Collection cache){ + Iterator itr = cache.iterator(); + while(itr.hasNext()){ + String item = itr.next(); + System.out.println(""+item+""); + } + } + + public void dump(){ + dumpNodePreOrder(root); + } + +// private String parseOpenElement(String str){ +// +// } +// +// private String parseCloseElment(String str){ +// +// } + + + + public class eNode{ + public boolean isLeaf = false; + public String element_raw_content = null; + public HashMap attributeMap = null; + public String element_name = null; + public List subNodes = null; + + public eNode(){ + _init(); + } + + private void _init(){ + attributeMap = new HashMap<>(); + subNodes = new LinkedList<>(); + } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + sb.append("element_name: ").append(element_name).append("\n"); + sb.append("isLeaf: ").append(isLeaf).append("\n"); + sb.append("name attr: ").append(attributeMap.get("name")).append("\n"); + if(attributeMap.get("class") != null) + sb.append("class attr: ").append(attributeMap.get("class")).append("\n"); + return sb.toString(); + } + } + +// protected class eGraph{ +// public eNode root = null; +// +// public eGraph(eNode root){ +// this.root = root; +// } +// } + +} diff --git a/group17/1282579502/src/com/coding/basic/ArrayList.java b/group17/1282579502/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..c07b58281c --- /dev/null +++ b/group17/1282579502/src/com/coding/basic/ArrayList.java @@ -0,0 +1,106 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[8]; + + public int test = 10; + + public void add(Object o){ + if(size + 1 >elementData.length){ + expand(); + } + elementData[size] = o; + size++; + } + /** + * Parameters: + * index index at which the specified element is to be inserted + * element element to be inserted + * Throws: + * IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size()) + */ + + public void add(int index, Object o){ + if(index <0 || index > size()) throw new IndexOutOfBoundsException(index + ": Invalid Index"); + if(size()+1>elementData.length){ + expand(); + } + if(index < size()) + System.arraycopy(elementData, index, elementData, index+1, size() - index); + elementData[index] = o; + size ++; + } + + public Object get(int index){ + if(index <0 || index >= size()) throw new ArrayIndexOutOfBoundsException(index + ": Invalid Index."); + return elementData[index]; + } + + public Object remove(int index) { + if(index <0 || index >= size()) throw new ArrayIndexOutOfBoundsException(index + ": Invalid Index."); + Object item = elementData[index]; + if(size() == 1){ + size--; + }else{ + if(index o, return 1 + * this.data < o, return -1 + * this.data == o, return 0; + */ + public BinaryTreeNode insert(Object o){ + if(!( o instanceof Comparable)) throw new IllegalArgumentException(o + " is NOT comparable. "); + if(data == null) { + data = o; + return this; + } + + Comparable cdata = (Comparable) data; + if(cdata.compareTo(o)>0){ + if(left == null) { + left = new BinaryTreeNode(o); + return left; + } + else{ + return left.insert(o); + } + } + else if(cdata.compareTo(o)<0){ + if(right == null){ + right = new BinaryTreeNode(o); + return right; + }else{ + return right.insert(o); + } + } + else{ + throw new IllegalArgumentException(o + " encountered a duplication."); + } + } + +} diff --git a/group17/1282579502/src/com/coding/basic/Iterator.java b/group17/1282579502/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group17/1282579502/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group17/1282579502/src/com/coding/basic/LinkedList.java b/group17/1282579502/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..55db7e97bc --- /dev/null +++ b/group17/1282579502/src/com/coding/basic/LinkedList.java @@ -0,0 +1,148 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head = null; + private Node tail = null; + private int size = 0; + + public void add(Object o){ + if(head == null){ + head = new Node(o); + tail = head; + }else{ + tail.next = new Node(o); + tail = tail.next; + } + size ++; + } + /** + * Add to index from 0 to size + * Add to index at 0 is equivalent to addFirst + * Add to index at size is equivalent to add and addLast + * + */ + public void add(int index , Object o){ + if(index < 0 || index >size+1) throw new IndexOutOfBoundsException(index + ": Invalid Index"); + Node newNode = new Node(o); + //manage head node + if(index == 0){ + if(head == null){ + this.add(o); + } + else{ + newNode.next = head; + head = newNode; + size++; + } + } + else if (index == size){ + this.add(o); + } + else{ + Node prevNode = getNodeAt(index-1); + newNode.next = prevNode.next; + prevNode.next = newNode; + size ++; + } + } + public Object get(int index){ + Node c = getNodeAt(index); + if(c == null ) return null; + return c.data; + } + + private Node getNodeAt(int index){ + if(index < 0 || index >size-1) throw new IndexOutOfBoundsException(index + ": Invalid Index"); + Node c = head; + while(index-- > 0 ){ + if(c != null) c = c.next; + else return null; + } + return c; + } + + public Object remove(int index){ + if(index<0 || index >size-1) throw new IndexOutOfBoundsException(index + ": Invalid Index"); + Node ret = null; + if(index == 0){ + ret = head; + head = head.next; + size --; + }else if(index == size -1){ + Node nodeBeforeTail = getNodeAt(index -1); + ret = tail; + nodeBeforeTail.next = null; + size --; + }else{ + Node nodeBeforeTarget = getNodeAt(index -1); + Node target = nodeBeforeTarget.next; + ret = target; + nodeBeforeTarget.next = target.next; + size --; + } + + return ret.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + this.add(0, o); + } + + public void addLast(Object o){ + this.add(o); + } + + public Object removeFirst(){ + return remove(0); + } + + public Object removeLast(){ + return remove(size-1); + } + + public Iterator iterator(){ + return new LinkedListIterator(this); + } + + private class Node{ + public Object data = null; + public Node next = null; + public Node(Object o){ + data = o; + } + } + + private static class LinkedListIterator implements Iterator{ + + Object[] oArray = null; + int cursor = 0; + public LinkedListIterator(LinkedList ll){ + if(ll == null) throw new NullPointerException("Linkedlist Object is NULL"); + oArray = new Object[ll.size()]; + for(int i = 0; i< ll.size(); i++){ + oArray[i] = ll.get(i); + } + } + + @Override + public boolean hasNext() { + if(cursor < oArray.length){ + return true; + } + return false; + } + + @Override + public Object next() { + Object o = oArray[cursor]; + cursor ++; + return o; + } + + } +} diff --git a/group17/1282579502/src/com/coding/basic/List.java b/group17/1282579502/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group17/1282579502/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group17/1282579502/src/com/coding/basic/Queue.java b/group17/1282579502/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..b9cbd3c500 --- /dev/null +++ b/group17/1282579502/src/com/coding/basic/Queue.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +public class Queue { + private LinkedList ll = null; + + public Queue(){ + ll = new LinkedList(); + } + + public void enQueue(Object o){ + ll.add(o); + } + + public Object deQueue() throws IndexOutOfBoundsException{ + try{ + return ll.remove(0); + }catch(IndexOutOfBoundsException ie){ + throw new IndexOutOfBoundsException(ie.getMessage()); + } + + } + + public boolean isEmpty(){ + return (ll.size() == 0) ? true : false; + } + + public int size(){ + return ll.size(); + } +} diff --git a/group17/1282579502/src/com/coding/basic/Stack.java b/group17/1282579502/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..7bfcd75ec3 --- /dev/null +++ b/group17/1282579502/src/com/coding/basic/Stack.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +public class Stack { + private ArrayList al = null; + + public Stack(){ + al = new ArrayList(); + } + + public void push(Object o){ + al.add(o); + } + + public Object pop(){ + return al.remove(al.size()-1); + } + + public Object peek(){ + return (al.size() == 0) ? null : al.get(al.size() -1); + } + + public boolean isEmpty(){ + return (al.size() == 0) ? true : false; + } + + public int size(){ + return al.size(); + } +} diff --git a/group17/1282579502/src/com/coding/basic/ut/ArrayListTest.java b/group17/1282579502/src/com/coding/basic/ut/ArrayListTest.java new file mode 100644 index 0000000000..9bce65892b --- /dev/null +++ b/group17/1282579502/src/com/coding/basic/ut/ArrayListTest.java @@ -0,0 +1,121 @@ +package com.coding.basic.ut; + +import static org.junit.Assert.*; + +import java.lang.reflect.Field; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.ArrayList; +import com.coding.basic.Iterator; + +public class ArrayListTest { + + ArrayList target; + Object[] elementDataField; + @Before + public void setUp() throws Exception { + target = new ArrayList(); + /* + * NOTE: getField only returns PUBLIC fields, getDeclaredField get all fields + Field[] allFields = target.getClass().getFields(); + System.out.println("Get all fields"); + for(Field tmpf : allFields){ + System.out.println(tmpf.getName()); + } + Field[] allDeclFields = target.getClass().getDeclaredFields(); + System.out.println("Get all declared fields"); + for(Field tmpf : allDeclFields){ + System.out.println(tmpf.getName()); + } + * + */ + try { + Field f = target.getClass().getDeclaredField("elementData"); + + f.setAccessible(true); + if(f.getType().isArray()){ + elementDataField = (Object[]) f.get(target); + } + } catch (NoSuchFieldException e) { + fail(e.getMessage()); + } catch (SecurityException e) { + fail(e.getMessage()); + } catch (IllegalArgumentException e) { + fail(e.getMessage()); + } catch (IllegalAccessException e) { + fail(e.getMessage()); + } + } + + @Test + public void testAddObject() { + Object item = new String("s1"); + target.add(item); + assertEquals(item, elementDataField[0]); + } + + @Test + public void testAddIndexObject() { + //fail("Not yet implemented"); + Object item0 = new String("s0"); + target.add(0, item0); + + Object item1 = new String("s1"); + target.add(0, item1); + + assertEquals(item1, elementDataField[0]); + assertEquals(item0, elementDataField[1]); + } + + @Test + public void testGet() { + target.add("0"); + Object o = target.get(0); + assertEquals("0", o); + assertNotEquals("2", 0); + } + + @Test + public void testRemove() { + String[] items = new String[]{"0","1","2"}; + for(int i = 0; i=0; i--){ + assertEquals(ll.get(i), items[items.length - 1 -i]); + } + + } + + @Test + public void testAddLast() { + LinkedList ll = new LinkedList(); + String[] items = new String[]{"0","1","2","3","4"}; + for(int i = 0 ; i< items.length; i++){ + ll.addLast(items[i] ); + } + //expect 0, 1, 2, 3, 4 + for(int i = 0; i= elementData.length) { + resize(2 * size); + } + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + if (index > size) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + } + if (size >= elementData.length) { + resize(2 * size); + } + for (int i = size; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + elementData[index] = o; + size++; + } + + public Object get(int index) { + if (index >= size) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + } + return elementData[index]; + } + + public Object remove(int index) { + Object o = elementData[index]; + for (int i = index; i < size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + elementData[size - 1] = null; + size--; + return o; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return null; + } + + private void resize(int n) { + Object[] temp = elementData; + elementData = new Object[n]; + for (int i = 0; i < temp.length; i++) { + elementData[i] = temp[i]; + } + } + +} diff --git a/group17/1540186032/First/src/BinaryTreeNode.java b/group17/1540186032/First/src/BinaryTreeNode.java new file mode 100644 index 0000000000..f5ff087138 --- /dev/null +++ b/group17/1540186032/First/src/BinaryTreeNode.java @@ -0,0 +1,31 @@ + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group17/1540186032/First/src/Iterator.java b/group17/1540186032/First/src/Iterator.java new file mode 100644 index 0000000000..73b303c8c2 --- /dev/null +++ b/group17/1540186032/First/src/Iterator.java @@ -0,0 +1,6 @@ + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group17/1540186032/First/src/LinkedList.java b/group17/1540186032/First/src/LinkedList.java new file mode 100644 index 0000000000..8510036684 --- /dev/null +++ b/group17/1540186032/First/src/LinkedList.java @@ -0,0 +1,131 @@ +public class LinkedList implements List { + public static void main(String[] args) { + LinkedList linkedList = new LinkedList(); + linkedList.add(0); + + System.out.println(linkedList.get(0)); + + } + + private Node first; + + private Node last; + + private int size = 0; + + public void add(Object o) { + Node oldLast = last; + last = new Node(); + last.data = o; + last.next = null; + if (oldLast != null) { + oldLast.next = last; + } + if (first == null) { + first = last; + } + size++; + } + + public void add(int index, Object o) { + if (index > size) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + } + if (index == 0) { + addFirst(o); + return; + } + if (index == size) { + addLast(o); + return; + } + Node curserNode = cursor(index - 1); + Node newNode = new Node(); + newNode.data = o; + newNode.next = curserNode.next; + curserNode.next = newNode; + size++; + } + + public Object get(int index) { + return cursor(index).data; + } + + public Object remove(int index) { + Node node = cursor(index - 1).next; + cursor(index - 1).next = node.next; + node.next = null; + return node.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newNode = new Node(); + newNode.data = o; + if (first == null) { + first = newNode; + } else { + newNode.next = first; + first = newNode; + } + if (last == null) { + last = first; + } + size++; + } + + public void addLast(Object o) { + Node newNode = new Node(); + newNode.data = o; + if (last == null) { + last = newNode; + } else { + last.next = newNode; + last = newNode; + } + if (first == null) { + first = last; + } + size++; + } + + public Object removeFirst() { + Node node = first; + Node newFirst = first.next; + first.next = null; + first = newFirst; + size--; + return node.data; + } + + public Object removeLast() { + Node node = last; + Node newLast = cursor(size - 1); + newLast.next = null; + last = newLast; + size--; + return node.data; + } + + public Iterator iterator() { + return null; + } + + private Node cursor(int index) { + Node curserNode = first; + for (int i = 0; i < index; i++) { + curserNode = curserNode.next; + } + return curserNode; + } + + private static class Node { + Object data; + Node next; + + } +} diff --git a/group17/1540186032/First/src/List.java b/group17/1540186032/First/src/List.java new file mode 100644 index 0000000000..8cb4ba5aff --- /dev/null +++ b/group17/1540186032/First/src/List.java @@ -0,0 +1,8 @@ + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group17/1540186032/First/src/Queue.java b/group17/1540186032/First/src/Queue.java new file mode 100644 index 0000000000..325fa033d1 --- /dev/null +++ b/group17/1540186032/First/src/Queue.java @@ -0,0 +1,23 @@ + +public class Queue { + LinkedList elementData = new LinkedList(); + + public void enQueue(Object o) { + elementData.add(o); + } + + public Object deQueue() { + if (elementData.size() == 0) { + + } + return elementData.removeFirst(); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group17/1540186032/First/src/Stack.java b/group17/1540186032/First/src/Stack.java new file mode 100644 index 0000000000..47f5244f0d --- /dev/null +++ b/group17/1540186032/First/src/Stack.java @@ -0,0 +1,28 @@ +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + if (elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.remove(elementData.size() - 1); + } + + public Object peek() { + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group17/176653813/1766538130226Lesson/.classpath b/group17/176653813/1766538130226Lesson/.classpath new file mode 100644 index 0000000000..373dce4005 --- /dev/null +++ b/group17/176653813/1766538130226Lesson/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group17/176653813/1766538130226Lesson/.gitignore b/group17/176653813/1766538130226Lesson/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group17/176653813/1766538130226Lesson/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group17/176653813/1766538130226Lesson/.project b/group17/176653813/1766538130226Lesson/.project new file mode 100644 index 0000000000..96a5027846 --- /dev/null +++ b/group17/176653813/1766538130226Lesson/.project @@ -0,0 +1,17 @@ + + + 1766538130226Lesson + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group17/176653813/1766538130226Lesson/.settings/org.eclipse.jdt.core.prefs b/group17/176653813/1766538130226Lesson/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group17/176653813/1766538130226Lesson/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/ArrayList.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..61df9ada90 --- /dev/null +++ b/group17/176653813/1766538130226Lesson/src/com/coding/basic/ArrayList.java @@ -0,0 +1,80 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + private Object[] obj = new Object[5]; + + @Override + public void add(Object o) { + if(this.size < 0 ) + System.out.print("Error"); + this.extend(100); + obj[this.size] = o; + this.size ++; + } + + @Override + public void add(int index, Object o) { + + if(index < 0) + System.out.println("Error"); + if(index < this.size){ + extend(100); + for(int i = this.size;i < index; i--){ + obj[i+1] = obj[i]; + } + obj[index] = o; + }else if(index >= size){ + extend(100); + obj[size] = o; + } + this.size++; + } + + @Override + public Object get(int index) { + if(index < 0 || index > size){ + System.out.println("Error"); + return null; + } + return obj[index]; + } + + @Override + public Object remove(int index) { + if(index < 0 || index > size){ + System.out.println("Error"); + return null; + } + for(int i = index;i <= size;i++){ + obj[i] = obj[i+1]; + } + size--; + return obj[index]; + } + + @Override + public int size() { + return size; + } + public int length(){ + return obj.length; + } + public void extend(int newLength){ + if (this.size >= obj.length){ + //չ + Object[] old = obj; + obj = new Object[size+newLength]; + for(int i = 0;i < size; i++){ + obj[i] = old[i]; + } + } + return; + } + public void Iteror(){ + for(int i = 0 ;i < size ; i++){ + System.out.println(obj[i]); + } + } +} diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/LinkList.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/LinkList.java new file mode 100644 index 0000000000..2f4e0e3067 --- /dev/null +++ b/group17/176653813/1766538130226Lesson/src/com/coding/basic/LinkList.java @@ -0,0 +1,96 @@ +package com.coding.basic; + +public class LinkList implements List{ + + private Node head; //ͷ㲻 + private static class Node{ + Object data; + Node next; + } + + @Override + public void add(Object o) { + //һû뵽 + if(null == head){ + head = new Node(); + head.next = null; + head.data = o; + }else{ + //β뷨 + //Node t = new Node(); + Node t; + Node ins = new Node(); + t = head; + while(t.next != null){ + t = t.next; + } + t.next = ins; + ins.next = null; + ins.data = o; + } + } + + @Override + public void add(int index, Object o) { + if(index < 0 ){ + System.out.println("Error"); + }else if(index == 0 || index == 1){ + Node t = new Node(); + t.next = head.next; + head.next = t; + t.data = o; + }else{ + Node t = new Node();//ǰڵ + Node p = new Node();//ǰһڵ + t = head.next; + for(int i = 1;i < index;i++){ + p = t; + t = t.next; + } + Node ins = new Node(); + p.next = ins; + ins.next = t; + ins.data = o; + } + + } + + @Override + public Object get(int index) { + if(index < 0 || head == null){ + System.out.println("Error"); + return null; + }else{ + Node t ; + t = head; + for(int i = 1;i < index;i++){ + t = t.next; + } + return t.data; + } + } + + @Override + public Object remove(int index) { + + return null; + } + + public void display(){ + if(head == null){ + System.out.println("No Data"); + }else{ + Node t ; + t = head; + while(t != null){ + System.out.println("******"+t.data); + t = t.next; + } + } + + } + @Override + public int size() { + return 0; + } +} diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/List.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/List.java new file mode 100644 index 0000000000..124fba53ec --- /dev/null +++ b/group17/176653813/1766538130226Lesson/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List{ + public void add(Object o); + public void add(int index,Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/Queue.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..032b636962 --- /dev/null +++ b/group17/176653813/1766538130226Lesson/src/com/coding/basic/Queue.java @@ -0,0 +1,35 @@ +package com.coding.basic; + +public class Queue { + + private LinkList elementData = new LinkList(); + private int front = 0; + private int rear = 0; + + + public void enQueue(Object o){ + elementData.add(o); + rear++; + } + public Object deQueue(){ + if(!isEmpty()){ + Object obj = elementData.remove(front); + front++; + return obj; + }else{ + System.out.println("Queue is empty"); + return null; + } + } + public boolean isEmpty(){ + if(front > rear){ + return true; + } + return false; + } + + public int size(){ + return rear-front+1; + } +} + diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/Stack.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..b902dea844 --- /dev/null +++ b/group17/176653813/1766538130226Lesson/src/com/coding/basic/Stack.java @@ -0,0 +1,41 @@ +package com.coding.basic; + +public class Stack { + + // + private ArrayList elementData = new ArrayList(); + private int top = 0; + + public void push(Object o){ + elementData.add(o); + top++; + } + + public Object pop(){ + if(!isEmpty()){ + System.out.println("stack is empoty"); + return null; + } + Object obj = elementData.remove(top); + top--; + return obj; + } + + public Object peek(){ + return elementData.get(top); + } + + public boolean isEmpty(){ + if(top != 0){ + return true; + } + return false; + } + + public int size(){ + return top++; + } + + + +} diff --git a/group17/176653813/1766538130226Lesson/src/com/coding/basic/Test.java b/group17/176653813/1766538130226Lesson/src/com/coding/basic/Test.java new file mode 100644 index 0000000000..6f48b4b4fd --- /dev/null +++ b/group17/176653813/1766538130226Lesson/src/com/coding/basic/Test.java @@ -0,0 +1,36 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +public class Test { + + @org.junit.Test + public void test() { + +/* ArrayList al = new ArrayList(); + al.add(1); + al.add(2); + al.add(3); + al.add(4); + al.add(5); + al.add(200); + al.add(10,100); + al.Iteror(); + //System.out.println(al.length()); + //System.out.println(al.size()); + System.out.println("=================="); + al.remove(0); + al.Iteror();*/ + + LinkList ls = new LinkList(); + ls.add(100); + ls.add(300); + ls.add(500); + ls.add(1000); + ls.add(3,2000); + ls.display(); + System.out.println(ls.get(4)); + } + +} + diff --git a/group17/176653813/RemoteSystemsTempFiles/.project b/group17/176653813/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000000..5447a64fa9 --- /dev/null +++ b/group17/176653813/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group17/240094626/.gitignore b/group17/240094626/.gitignore new file mode 100644 index 0000000000..eae78c8515 --- /dev/null +++ b/group17/240094626/.gitignore @@ -0,0 +1,45 @@ +<<<<<<< HEAD:group17/.gitignore +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +#ide config +.metadata +.recommenders + +.classpath +.project +. +======= +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +#ide config +.metadata +.recommenders + +*.settings +*.project +*.classpath +*/.settings +/**/target/**/* +>>>>>>> 306b41b325671fb7420952ad0788ea6be114d674:group17/240094626/.gitignore diff --git a/group17/240094626/warm-up/.gitignore b/group17/240094626/warm-up/.gitignore new file mode 100644 index 0000000000..c7b6e44e1d --- /dev/null +++ b/group17/240094626/warm-up/.gitignore @@ -0,0 +1,4 @@ +/bin/ +*.classpath +*.project +/.settings/ diff --git a/group17/240094626/warm-up/src/com/array/ArrayUtil.java b/group17/240094626/warm-up/src/com/array/ArrayUtil.java new file mode 100644 index 0000000000..214ecae3bb --- /dev/null +++ b/group17/240094626/warm-up/src/com/array/ArrayUtil.java @@ -0,0 +1,243 @@ +package com.coderising.array; + +import com.coding.basic.impl.ArrayList; +import com.coding.basic.impl.LinkedList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + for(int i=0; i < origin.length; i++){ + if(i >= origin.length-1-i){ + break; + } + int tmp = origin[i]; + origin[i] = origin[origin.length-i-1]; + origin[origin.length-i-1] = tmp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int size = 0, // 记录非0数量 + tmp = 0; // 需要比较的下一个位置 + for(int i=0; i < oldArray.length;){ + if(oldArray[i] == 0){ + int j=tmp==0?(i+1):tmp; + for(;j < oldArray.length; j++){ + if(oldArray[j] == 0){ + continue; + }else{ + oldArray[i] = oldArray[j]; + oldArray[j] = 0; + size++; + tmp = j+1; + i=j; + break; + } + } + }else{ + i++; + size++; + continue; + } + } + int a[] = new int[size]; + System.arraycopy(oldArray, 0, a, 0, size); + return a; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + int[] a3 = new int[array1.length+array2.length]; + int i = array1.length-1, + j = array2.length-1, + k = a3.length-1; + while(i >= 0 && j >= 0){ + if(array1[i] > array2[j]){ + a3[k--] = array1[i--]; + }else{ + a3[k--] = array2[j--]; + } + } + while(j >= 0){ + a3[k--] = array2[j--]; + } + while(i >= 0){ + a3[k--] = array1[i--]; + } + + return a3; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int a[] = new int[oldArray.length+size]; + System.arraycopy(oldArray, 0, a, 0, oldArray.length); + return a; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + if(max == 1){ + int[] a = {0}; + return a; + } + if(max == 2){ + int[] a = {0,1}; + return a; + } + if(max == 3){ + int[] a = {0,1,1,2}; + return a; + } + ArrayList list = new ArrayList(); + list.add(0); + list.add(1); + list.add(1); + list.add(2); + int size = 4; + for(int i = 3; i < max ; i++){ + if(i == ((int)list.get(size-1)+(int)list.get(size-2))){ + list.add(i); + size++; + } + } + int[] a = new int[size]; + for(int i = 0; i < size; i++){ + a[i] = (int) list.get(i); + } + return a; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if(max < 2){ + int[] a ={}; + return a; + } + if(max == 2){ + int[] a ={2}; + return a; + } + LinkedList list = new LinkedList(); + list.add(2); + for(int n = 3; n < max; n=n+2){ + int i=3; + boolean flag = true; + for(;i*i <= n;i=i+2){ + // 先排除偶数 + if(n%i == 0){ + flag = false; + break; + } + } + if(flag){ + list.add(n); + } + } + int[] a = new int[list.size()]; + for(int i = 0; i < list.size(); i++){ + a[i] = (int) list.get(i); + } + return a; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + if(max <= 6){ + int a[] = {}; + return a; + } + LinkedList list = new LinkedList(); + int p = 6,sum; + for(; p < max; p++){ + sum = 0; + for(int i=1; i < p % 2; i++){ + if(p % i == 0){ + sum += i; + } + } + if(sum == p){ + list.add(p); + } + } + int a[] = new int[list.size()]; + for(int i = 0; i < list.size(); i++){ + a[i] = (int) list.get(i); + } + return a; + + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + for(int i=0;i 0){ + s.append("-"); + } + s.append(a); + } + seperator = s.toString();*/ + return seperator; + } + +} diff --git a/group17/240094626/warm-up/src/com/coderising/litestruts/Struts.java b/group17/240094626/warm-up/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..d3dd810e13 --- /dev/null +++ b/group17/240094626/warm-up/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,165 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.util.Iterator; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; + +import com.coderising.litestruts.exception.StrutsException; +import com.coderising.litestruts.util.FileUtils; +import com.coding.basic.impl.ArrayList; +import com.sun.org.apache.xml.internal.security.encryption.XMLEncryptionException; + + + +public class Struts { + + public static final String DETAULT_XML = "struts.xml"; + public static final String ACTION_TAGNAME = "action"; + public static final String RESULT_TAGNAME = "result"; + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + + + /** + * 获取struts中配置的所有action + * 通过dom4j实现读xml文件 + * Struts action元素的是2层结构,故,这里只解析2层 + * @param path + * @return + * @return:ArrayList + */ + private static ArrayList getActionBeans(String dir,String fileName){ + if(!FileUtils.createDir(dir)){ + throw new IllegalArgumentException("文件路径不存在:"+dir); + } + File f = new File(dir); + if(null == fileName || "".endsWith(fileName)){ + fileName = DETAULT_XML; + } + SAXReader saxReader = new SAXReader(); + try { + f = new File(f.getPath()+"\\"+fileName); + Document document = saxReader.read(f); + Element element = document.getRootElement(); + ArrayList actions = new ArrayList(); + Iterator iterator = element.elementIterator(ACTION_TAGNAME); + // 遍历每一个action + while(iterator.hasNext()){ + Element actionEle = (Element) iterator.next(); + ActionBean bean = new ActionBean(); + bean.setName(actionEle.attributeValue("name")); + bean.setClazz(actionEle.attributeValue("class")); + Iterator it = actionEle.elementIterator(RESULT_TAGNAME); + ArrayList results = new ArrayList(); + // 遍历每一个result + while(it.hasNext()){ + Element resultEle = (Element) it.next(); + Result result = new Result(); + result.setName(resultEle.attributeValue("name")); + result.setValue(resultEle.getText()); + results.add(result); + System.out.println(result); + } + bean.setResults(results); + System.out.println(bean); + actions.add(bean); + } + System.out.println(); + } catch (DocumentException e) { + e.printStackTrace(); + throw new StrutsException("xml文件解析失败:,dir="+dir+",fileName="+fileName,e); + } + + return null; + } + + + + private static class ActionBean{ + String name; + String clazz; + ArrayList results; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getClazz() { + return clazz; + } + public void setClazz(String clazz) { + this.clazz = clazz; + } + public ArrayList getResults() { + return results; + } + public void setResults(ArrayList results) { + this.results = results; + } + @Override + public String toString() { + return "ActionBean [name=" + name + ", clazz=" + clazz + + ", results=" + results + "]"; + } + + + } + + private static class Result{ + String name; + String value; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + @Override + public String toString() { + return "Result [name=" + name + ", value=" + value + "]"; + } + + + } + + public static void main(String[] args) { + Struts.getActionBeans("src/com/coderising/litestruts/",""); + } +} diff --git a/group17/240094626/warm-up/src/com/coderising/litestruts/exception/StrutsException.java b/group17/240094626/warm-up/src/com/coderising/litestruts/exception/StrutsException.java new file mode 100644 index 0000000000..bd1fe8011c --- /dev/null +++ b/group17/240094626/warm-up/src/com/coderising/litestruts/exception/StrutsException.java @@ -0,0 +1,61 @@ +package com.coderising.litestruts.exception; + +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; + +public class StrutsException extends RuntimeException { + + private static final long serialVersionUID = 5481955299021871754L; + + private String message; + private String stackTrace; + private Throwable t; + + public Throwable getCause() { + return this.t; + } + + public String toString() { + return getMessage(); + } + + public String getMessage() { + return this.message; + } + + public void printStackTrace() { + System.err.print(this.stackTrace); + } + + public void printStackTrace(PrintStream paramPrintStream) { + printStackTrace(new PrintWriter(paramPrintStream)); + } + + public void printStackTrace(PrintWriter paramPrintWriter) { + paramPrintWriter.print(this.stackTrace); + } + + public StrutsException(String paramString) { + super(paramString); + this.message = paramString; + this.stackTrace = paramString; + } + + public StrutsException(Throwable paramThrowable) { + super(paramThrowable.getMessage()); + this.t = paramThrowable; + StringWriter localStringWriter = new StringWriter(); + paramThrowable.printStackTrace(new PrintWriter(localStringWriter)); + this.stackTrace = localStringWriter.toString(); + } + + public StrutsException(String paramString, Throwable paramThrowable) { + super(paramString + "; nested exception is " + + paramThrowable.getMessage()); + this.t = paramThrowable; + StringWriter localStringWriter = new StringWriter(); + paramThrowable.printStackTrace(new PrintWriter(localStringWriter)); + this.stackTrace = localStringWriter.toString(); + } +} diff --git a/group17/240094626/warm-up/src/com/coderising/litestruts/struts.xml b/group17/240094626/warm-up/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..fadf460c49 --- /dev/null +++ b/group17/240094626/warm-up/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group17/240094626/warm-up/src/com/coderising/litestruts/util/FileUtils.java b/group17/240094626/warm-up/src/com/coderising/litestruts/util/FileUtils.java new file mode 100644 index 0000000000..f369fc6cdb --- /dev/null +++ b/group17/240094626/warm-up/src/com/coderising/litestruts/util/FileUtils.java @@ -0,0 +1,25 @@ +package com.coderising.litestruts.util; + +import java.io.File; + +public class FileUtils { + + public static boolean createDir(String dir){ + File f = null; + f = new File(dir); + boolean ok = true; + if(!f.exists()){ + ok = f.mkdirs(); + } + return ok; + } + + public static String getProjectPath(){ + return System.getProperty("user.dir"); + } + + public static void main(String[] args) { + System.out.println(createDir("src/com/coderising/litestruts/")); + System.out.println(getProjectPath()); + } +} diff --git a/group17/240094626/warm-up/src/com/coding/basic/Iterator.java b/group17/240094626/warm-up/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group17/240094626/warm-up/src/com/coding/basic/List.java b/group17/240094626/warm-up/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group17/240094626/warm-up/src/com/coding/basic/impl/ArrayList.java b/group17/240094626/warm-up/src/com/coding/basic/impl/ArrayList.java new file mode 100644 index 0000000000..6486868054 --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/impl/ArrayList.java @@ -0,0 +1,169 @@ +package com.coding.basic.impl; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +/** + * + * @描述: ArrayList简单实现 + * @作者:240094626 + * @创建日期:2017-2-20 + */ +public class ArrayList implements List { + + /** + * @comment:元素数组 + */ + private Object data[] = null; + + /** + * @comment:数组元素个数 + */ + private int size = 0; + + /** + * 无参构造函数,初始化容量为10的空列表 + */ + public ArrayList(){ + this(10); + } + + /** + * @param length + * 构造函数,初始化容量为length的空列表 + */ + public ArrayList(int length){ + if(length < 0){ + throw new IllegalArgumentException("初始容量参数非法:"+length); + } + data = new Object[length]; + } + + + /** + * @createTime: 2017-2-21 下午1:32:28 + * @param length + * @return:void + * @comment:列表结构扩展容量,每次增加原来的1/2容量 + */ + private void grow(int length){ + int oldLength = data.length; + if(length > oldLength){ + Object oldData[] = data; + int newLength = oldLength*3/2 + 1; + if(newLength < length){ + newLength = length; + } + data = new Object[newLength]; + System.arraycopy(oldData, 0, data, 0, oldLength); + } + } + + /** + * @createTime: 2017-2-21 下午1:32:05 + * @param index + * @return:void + * @comment:检验下标参数是否超限 + */ + private void check(int index) { + if( index >= size){ + throw new IndexOutOfBoundsException("Index:"+index+",size:"+size); + } + } + + @Override + public void add(Object o) { + grow(size+1); + data[size++]=o; + } + + @Override + public void add(int index, Object o) { + if( index > size || index < 0){ + throw new IndexOutOfBoundsException("Index:"+index+",size:"+size); + } + grow(size+1); + System.arraycopy(data, index, data, index+1, size-index); + data[index] = o; + size++; + + } + + @Override + public Object get(int index) { + check(index); + return data[index]; + } + + + + @Override + public Object remove(int index) { + check(index); + Object remove = data[index]; + System.arraycopy(data, index+1, data, index, size-index); + data[--size] = null; + return remove; + } + + @Override + public int size() { + return size; + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for(int i =0; i 0){ + sb.append(","); + } + sb.append(data[i]); + } + return String.format("ArrayList {data=[%s], size=%d}", sb.toString(),size); + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + /** + * @描述: 简单实现迭代器 + * @作者:240094626 + * @创建日期:2017-2-21 + */ + private class ArrayListIterator implements Iterator{ + + /** + * @column:index + * @comment:当前位置下标 + */ + private int index; + + /** + * 无参构造,初始化迭代器的下标为0 + */ + public ArrayListIterator(){ + index = 0; + } + + @Override + public boolean hasNext() { + if(index < size){ + return true; + } + return false; + } + + @Override + public Object next() { + Object o = get(index++); + return o; + } + + } + +} + + diff --git a/group17/240094626/warm-up/src/com/coding/basic/impl/BinaryTree.java b/group17/240094626/warm-up/src/com/coding/basic/impl/BinaryTree.java new file mode 100644 index 0000000000..41ec919b27 --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/impl/BinaryTree.java @@ -0,0 +1,110 @@ +package com.coding.basic.impl; + + +/** + * 二叉树简单实现(key为int类型) + * @author 240094626 + * + */ +public class BinaryTree { + /**根结点,初始化为空*/ + private Node rootNode = null; + + + /** + * 根据key值插入数据data为空的新节点 + * @param key + * @return + */ + public Node insert(int key){ + return insert(key,null); + } + + /** + * 根据key值插入数据data为o的新节点 + * @param key + * @param o + * @return + */ + public Node insert(int key ,Object o){ + Node newNode = new Node(key, o); + if(rootNode == null){ + rootNode = newNode; + return rootNode; + } + Node fatherNode = rootNode; + Node currentNode = rootNode; + while(currentNode != null){ + fatherNode = currentNode; + if(key < currentNode.key){ + currentNode = currentNode.left; + }else{ + currentNode = currentNode.right; + } + } + if(key < fatherNode.key){ + fatherNode.left = newNode; + }else{ + fatherNode.right = newNode; + } + size++; + return newNode; + } + + /** + * 根据key值查找结点 + * @param key + * @return + */ + public Node getNode(int key){ + return get(rootNode, key); + } + + /** + * 递归算法: 根据开始结点位置和key值查找节点 + * @param n + * @param key + * @return + */ + private Node get(Node n,int key){ + if(n == null){ + return null; + } + if(key < n.key){ + return get(n.left, key); + }else if(key > n.key){ + return get(n.left, key); + } + return n; + } + + + + + + + private static class Node{ + + int key; + Object data; + Node left; + Node right; + + public Node(int key, Object data) { + this.key = key; + this.data = data; + this.left = null; + this.right = null; + } + + @Override + public String toString() { + return "Node [key=" + key + ", data=" + data + "]"; + } + + + } + + + +} diff --git a/group17/240094626/warm-up/src/com/coding/basic/impl/LinkedList.java b/group17/240094626/warm-up/src/com/coding/basic/impl/LinkedList.java new file mode 100644 index 0000000000..d6284f9bec --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/impl/LinkedList.java @@ -0,0 +1,205 @@ +package com.coding.basic.impl; + +import java.util.NoSuchElementException; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +/** + * 双向链表简单实现 + * @author 240094626 + */ +public class LinkedList implements List { + /**头节点(空的)*/ + private Node header = new Node(null, null, null); + /**链表节点长度*/ + private int size = 0; + + + /** + * 无参构造函数,初始化header节点,前后均指向header节点,形成环形链表 + * 环形链表:为了使链表节点的开头是header,结尾也是header; + * 由于实现了List,那么链表就是有序的,根据下标查询时可借助环形特点双向查找,提升效率; + */ + public LinkedList() { + header.next = header.pre = header; + } + + + /** + * 将Object o 添加到 节点n之前 + * @param o + * @param n + */ + private void addBefore(Object o, Node n) { + Node newNode = new Node(o, n.pre, n); + newNode.next.pre = newNode; + newNode.pre.next = newNode; + size++; + } + + /** + * 根据下标位置查找结点 + * @param index + * @return + */ + private Node getNode(int index) { + if(index < 0 || index >= size){ + throw new IndexOutOfBoundsException("index:"+index); + } + // 查找从header开始 + Node n = header; + if(index <= (size >> 1)){ + // 往next方向找第index个节点 + for(int i=0; i <=index; i++){ + n = n.next; + } + }else{ + // 往pre方向找第size-index个节点 + for(int i=size-index; i >0; i--){ + n = n.pre; + } + } + return n; + } + + + /** + * 移除节点,从当前节点的前后节点间删除当前节点 + * @param n + * @return + */ + private Object remove(Node n){ + if(n == header){ + throw new NoSuchElementException("未找到节点"); + } + Object result = n.data; + n.pre.next = n.next; + n.next.pre = n.pre; + n.data = null; + size--; + return result; + } + + @Override + public void add(Object o) { + // 默认往header前添加 + addBefore(o,header); + } + + + @Override + public void add(int index, Object o) { + addBefore(o,index==size?header:getNode(index)); + } + + @Override + public Object get(int index) { + Node n = getNode(index); + return n.data; + } + + + @Override + public Object remove(int index) { + return remove(getNode(index)); + } + + + @Override + public int size() { + return size; + } + /** + * 环形链表结构,header.next就是第一个节点 + * @param o + */ + public void addFirst(Object o){ + addBefore(o, header.next); + } + /** + * 环形链表结构,header.pre就是最后一个节点 + * @param o + */ + public void addLast(Object o){ + addBefore(o, header); + } + public Object removeFirst(){ + return remove(header.next); + } + public Object removeLast(){ + return remove(header.pre); + } + + public Iterator iterator(){ + + return new LinkedListIterator(); + } + + + @Override + public String toString() { + Iterator it = iterator(); + StringBuilder sb = new StringBuilder(); + while(it.hasNext()){ + if(sb.length() > 0){ + sb.append(","); + } + sb.append(it.next()); + } + return "LinkedList {nodes=[" + sb + "], size=" + size + "}"; + } + + + private static class Node{ + Object data; + Node pre; + Node next; + + /** + * 链表节点,带参构造函数 + * @param data 节点内容 + * @param pre 上一个节点 + * @param next 下一个节点 + */ + public Node(Object data, Node pre, Node next) { + super(); + this.data = data; + this.pre = pre; + this.next = next; + } + + @Override + public String toString() { + return "Node {data=" + data + "}"; + } + + + + } + + private class LinkedListIterator implements Iterator{ + int index ; + + public LinkedListIterator() { + index = 0; + } + + @Override + public boolean hasNext() { + if(index < size){ + return true; + } + return false; + } + + @Override + public Object next() { + Node n = getNode(index++); + return n.data; + } + + } + + +} diff --git a/group17/240094626/warm-up/src/com/coding/basic/impl/Queue.java b/group17/240094626/warm-up/src/com/coding/basic/impl/Queue.java new file mode 100644 index 0000000000..42fae9217c --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/impl/Queue.java @@ -0,0 +1,73 @@ +package com.coding.basic.impl; + +import com.coding.basic.Iterator; + +/** + * 队列简单实现 + * @author 240094626 + * + */ +public class Queue { + /**队列元素容器对象*/ + LinkedList elementData = new LinkedList(); + + /** + * 入队列 + * @param o + */ + public void enQueue(Object o){ + elementData.add(o); + } + + /** + * 出队列:先进先出,故取出链表首个节点 + * @return + */ + public Object deQueue(){ + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + if(elementData.size() > 0 ){ + return false; + } + return true; + } + + public int size(){ + return elementData.size(); + } + + + @Override + public String toString() { + return "Queue {elementData=" + elementData + "}"; + } + + public Iterator iterator(){ + return new QueueIterator(); + } + + private class QueueIterator implements Iterator{ + + int index; + + public QueueIterator() { + index = 0; + } + + @Override + public boolean hasNext() { + if(index < elementData.size()){ + return true; + } + return false; + } + + @Override + public Object next() { + return elementData.get(index++); + } + + } +} diff --git a/group17/240094626/warm-up/src/com/coding/basic/impl/Stack.java b/group17/240094626/warm-up/src/com/coding/basic/impl/Stack.java new file mode 100644 index 0000000000..786071f0a1 --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/impl/Stack.java @@ -0,0 +1,86 @@ +package com.coding.basic.impl; + +import com.coding.basic.Iterator; + +/** + * 栈的简单实现 + * @author 240094626 + */ +public class Stack { + /**长度可变的元素容器*/ + private ArrayList elementData = new ArrayList(); + + /** + * 压入栈 + * @param o + */ + public void push(Object o){ + elementData.add(o); + } + + /** + * 出栈(末尾元素),并移除 + * @return Object + */ + public Object pop(){ + return elementData.remove(elementData.size()-1); + } + + /** + * 取出栈(末尾元素),不移除 + * @return Object + */ + public Object peek(){ + return elementData.get(elementData.size()-1); + } + + /** + * 判断栈是否为空 + * @return boolean + */ + public boolean isEmpty(){ + return elementData.size() == 0 ? true : false; + } + + /** + * 栈的长度,既是容器ArrayList的长度 + * @return int + */ + public int size(){ + return elementData.size(); + } + + + + @Override + public String toString() { + return "Stack {elementData=" + elementData + "}"; + } + + public Iterator iterator(){ + return new StackIterator(); + } + + private class StackIterator implements Iterator{ + int index; + + public StackIterator() { + index = 0; + } + + @Override + public boolean hasNext() { + if(index < elementData.size()){ + return true; + } + return false; + } + + @Override + public Object next() { + return elementData.get(index++); + } + + + } +} \ No newline at end of file diff --git a/group17/240094626/warm-up/src/com/coding/basic/test/ArrayListTest.java b/group17/240094626/warm-up/src/com/coding/basic/test/ArrayListTest.java new file mode 100644 index 0000000000..03419f7d0f --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/test/ArrayListTest.java @@ -0,0 +1,55 @@ +package com.coding.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.JUnitCore; +import org.junit.runner.Result; +import org.junit.runner.notification.Failure; + +import com.coding.basic.impl.ArrayList; + +/** + * ArrayList 简单测试 + * @author 240094626 + * + */ +public class ArrayListTest { + + + @Test + public void test() { + ArrayList list = new ArrayList(); + + System.out.println("******测试add(Object o ):添加第一个元素0******"); + list.add(0); + System.out.println("ArrayList print:"+list.toString()); + + System.out.println("******测试add(int index,Object o):添加第二个元素1******"); + list.add(1, 1); + System.out.println("ArrayList print:"+list.toString()); + + System.out.println("******测试remove(int index):删除第1个元素:0******"); + list.remove(0); + System.out.println("ArrayList print:"+list.toString()); + + System.out.println("******测试add(int Object o):添加第三个元素2******"); + list.add(2); + System.out.println("ArrayList print:"+list.toString()); + + + System.out.println("ArrayList size:"+list.size()); + + System.out.println("******测试get(int index):判断第1个元素是否为1******"); + assertEquals(1, list.get(0)); + } + + public static void main(String[] args) { + Result result = JUnitCore.runClasses(ArrayListTest.class); + for(Failure failure : result.getFailures()){ + System.out.println(failure.toString()); + } + System.out.println("test success!:"+result.wasSuccessful()); + } + +} diff --git a/group17/240094626/warm-up/src/com/coding/basic/test/LinkedListTest.java b/group17/240094626/warm-up/src/com/coding/basic/test/LinkedListTest.java new file mode 100644 index 0000000000..25c8ed80c8 --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/test/LinkedListTest.java @@ -0,0 +1,60 @@ +package com.coding.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.JUnitCore; +import org.junit.runner.Result; +import org.junit.runner.notification.Failure; + +import com.coding.basic.impl.LinkedList; + +/** + * LinkedList 简单测试 + * @author 240094626 + * + */ +public class LinkedListTest { + + @Test + public void test() { + LinkedList list = new LinkedList(); + + System.out.println("******测试add(Object o ):添加第一个元素0******"); + list.add(0); + System.out.println("LinkedList print:"+list.toString()); + System.out.println("******测试add(int index,Object o):添加第二个元素1******"); + list.add(1); + System.out.println("******测试addLast(Object o):往链表最后添加元素3******"); + list.addLast(3); + System.out.println("******测试addFirst(Object o):往链表最前面添加元素5******"); + list.addFirst(5); + System.out.println("LinkedList print:"+list.toString()); + + System.out.println("******测试remove(int index):删除第4个元素:index=3******"); + list.remove(3); + System.out.println("LinkedList print:"+list.toString()); + + System.out.println("******测试addFirst(int Object o):链表最前面添加素2******"); + list.addFirst(2); + System.out.println("LinkedList print:"+list.toString()); + + // 断言第一个元素为0 + assertEquals(2, list.get(0)); + + list.addLast(3); + list.addFirst(5); + System.out.println("LinkedList print:"+list.toString()); + // 断言最后一个元素为3 + assertEquals(3,list.get(list.size()-1)); + } + + public static void main(String[] args) { + Result result = JUnitCore.runClasses(LinkedListTest.class); + for(Failure failure : result.getFailures()){ + System.out.println(failure.toString()); + } + System.out.println("test success!:"+result.wasSuccessful()); + } + +} diff --git a/group17/240094626/warm-up/src/com/coding/basic/test/QueueTest.java b/group17/240094626/warm-up/src/com/coding/basic/test/QueueTest.java new file mode 100644 index 0000000000..6d653983bd --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/test/QueueTest.java @@ -0,0 +1,57 @@ +package com.coding.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.JUnitCore; +import org.junit.runner.Result; +import org.junit.runner.notification.Failure; + +import com.coding.basic.impl.Queue; + +/** + * Queue 简单测试 + * @author 240094626 + * + */ +public class QueueTest { + + @Test + public void test() { + Queue queue = new Queue(); + + System.out.println("******测试enQueue(Object o):入队列元素a,b,c******"); + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + System.out.println("queue:"+queue.toString()); + + // 断言队列不为空 + assertEquals(false,queue.isEmpty()); + + // 断言出队列是a + System.out.println("******测试deQueue(Object o):出队列元素a******"); + assertEquals("a",queue.deQueue()); + System.out.println("queue:"+queue.toString()); + + // 断言出队列是b + System.out.println("******测试deQueue(Object o):出队列元素b******"); + assertEquals("b",queue.deQueue()); + System.out.println("queue:"+queue.toString()); + + // 断言出队列是c + assertEquals("c",queue.deQueue()); + + + + + } + + public static void main(String[] args) { + Result result = JUnitCore.runClasses(QueueTest.class); + for(Failure failure : result.getFailures()){ + System.out.println(failure.toString()); + } + System.out.println("test success!:"+result.wasSuccessful()); + } +} diff --git a/group17/240094626/warm-up/src/com/coding/basic/test/StackTest.java b/group17/240094626/warm-up/src/com/coding/basic/test/StackTest.java new file mode 100644 index 0000000000..9b6c07b8f4 --- /dev/null +++ b/group17/240094626/warm-up/src/com/coding/basic/test/StackTest.java @@ -0,0 +1,71 @@ +package com.coding.basic.test; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.JUnitCore; +import org.junit.runner.Result; +import org.junit.runner.notification.Failure; + +import com.coding.basic.Iterator; +import com.coding.basic.impl.Stack; + +/** + * stack 简单测试 + * @author 240094626 + * + */ +public class StackTest { + + @Test + public void test() { + Stack stack = new Stack(); + System.out.println("******测试push(Object o):压入第一个元素0******"); + stack.push(0); + System.out.println("Stack print:"+stack.toString()); + + System.out.println("******测试push(Object o):压入第二个元素2******"); + stack.push(2); + System.out.println("Stack print:"+stack.toString()); + + System.out.println("******测试peek():从栈尾取出2,不删除******"); + stack.peek(); + System.out.println("Stack print:"+stack.toString()); + + System.out.println("******测试peek():再次从栈尾取出2,不删除******"); + // 断言出栈为2 + assertEquals(2,stack.peek()); + // 断言size为2 + assertEquals(2,stack.size()); + + System.out.println("******测试pop():末尾元素2出栈,并移除******"); + // 断言出栈为2 + assertEquals(2,stack.pop()); + System.out.println("Stack print:"+stack.toString()); + + // 断言不为空 + assertEquals(false,stack.isEmpty()); + // 断言size为1 + assertEquals(1,stack.size()); + // 添加3,5 两个元素 + stack.push(3); + stack.push(5); + System.out.println("Stack print:"+stack.toString()); + // 测试迭代器 + Iterator it = stack.iterator(); + int i = 1; + while(it.hasNext()){ + System.out.println("第"+i+"个元素:"+it.next()); + i++; + } + + } + public static void main(String[] args) { + Result result = JUnitCore.runClasses(StackTest.class); + for(Failure failure : result.getFailures()){ + System.out.println(failure.toString()); + } + System.out.println("test success!:"+result.wasSuccessful()); + } + +} diff --git a/group17/240094626/warm-up/src/com/litestruts/LoginAction.java b/group17/240094626/warm-up/src/com/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group17/240094626/warm-up/src/com/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group17/240094626/warm-up/src/com/litestruts/Struts.java b/group17/240094626/warm-up/src/com/litestruts/Struts.java new file mode 100644 index 0000000000..44e6398b80 --- /dev/null +++ b/group17/240094626/warm-up/src/com/litestruts/Struts.java @@ -0,0 +1,194 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import com.coderising.litestruts.exception.StrutsRunActionException; +import com.coderising.litestruts.exception.StrutsXMLLoaderException; + + + +/** + * 模拟Struts读取xml文件,解析ation,并执行exectue方法 + * @author 240094626 + * + */ +public class Struts { + /**单例对象*/ + private static Struts instance = null; + /**默认配置文件目录*/ + private static final String STRUTS_CONFIG_DIR = "src/com/coderising/litestruts/"; + /**默认配置文件名*/ + private static final String STRUTS_CONFIG_XML = "struts.xml"; + /**默认编码字符集*/ + private static final String ENCODE = "UTF-8"; + /**action文档节点名称*/ + private static final String DOC_ACTION = "action"; + /**result文档节点名称*/ + private static final String DOC_ACTION_RESULT = "result"; + + /** + * 单例实现,双check + * @return + */ + public static Struts getInstance(){ + if(instance == null){ + synchronized (Struts.class) { + if(instance == null){ + instance = new Struts(); + } + } + } + return instance; + } + + public View runAction(String actionName, Map parameters) throws StrutsRunActionException { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + View view = new View(); + try { + // 0. 读取配置文件struts.xml + Map actions = getActionByDom4J(); + + // 1. 找到LoginAction 反射实例化,setName 和setPassword + Action action = actions.get(actionName); + Class clz = Class.forName(action.clazz); + Object actionObj = clz.newInstance(); + Method m1 = clz.getDeclaredMethod("setName", String.class); + m1.setAccessible(true); + m1.invoke(actionObj, parameters.get("name")); + Method m2 = clz.getDeclaredMethod("setPassword", String.class); + m2.setAccessible(true); + m2.invoke(actionObj, parameters.get("password")); + + // 2.通过反射调用对象的exectue 方法 + Method mExectue = clz.getDeclaredMethod("execute", null); + String result = (String) mExectue.invoke(actionObj, null); + + // 3. 通过反射找到对象的所有getter方法,通过反射来调用, 把值和属性形成一个HashMap + Field[] fs = clz.getDeclaredFields(); + Map pMap = new HashMap(10); + for(Field f : fs){ + String methodName = "get"+toUpperCase(f.getName()); + Method m = clz.getDeclaredMethod(methodName, null); + m.setAccessible(true); + pMap.put(f.getName(), m.invoke(actionObj, null)); + } + view.setParameters(pMap); + // 4.根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + view.setJsp(action.results.get(result)); + System.out.println(view); + } catch (StrutsXMLLoaderException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new StrutsRunActionException("Action执行失败",e); + } + + + return view; + } + + + /** + * dom4j读xml + * @return + * @throws StrutsXMLLoaderException + */ + private Map getActionByDom4J() throws StrutsXMLLoaderException{ + return getActionByDom4J(STRUTS_CONFIG_DIR,STRUTS_CONFIG_XML,ENCODE); + } + /** + * dom4j读xml + * @param dir + * @param fileName + * @param encode + * @return + * @throws StrutsXMLLoaderException + */ + private Map getActionByDom4J(String dir,String fileName,String encode) throws StrutsXMLLoaderException { + File f = new File(dir); + if(!f.exists()){ + throw new StrutsXMLLoaderException("路径不存在:"+dir); + } + f = new File(f.getPath()+"\\"+fileName); + if(!f.exists()){ + throw new StrutsXMLLoaderException("路径:"+dir+"中文件不存在:"+fileName); + } + SAXReader saxReader = new SAXReader(); + saxReader.setEncoding(encode); + Map actions = new HashMap(10); + try { + Document document = saxReader.read(f); + Element root =document.getRootElement(); + Iterator it = root.elementIterator(DOC_ACTION); + while(it.hasNext()){ + Action action = new Action(); + Element element = it.next(); + action.name = element.attributeValue("name"); + action.clazz = element.attributeValue("class"); + Map results = new HashMap(10); + Iterator rIt = element.elementIterator(DOC_ACTION_RESULT); + while(rIt.hasNext()){ + Element rElement = rIt.next(); + results.put(rElement.attributeValue("name"), rElement.getText()); + } + action.results = results; + actions.put(action.name, action); + } + } catch (Exception e) { + throw new StrutsXMLLoaderException("xml文件解析失败",e); + } + + return actions; + } + + /** + * 首个字符大写 + * @param fieldName + * @return + */ + private String toUpperCase(String fieldName){ + return fieldName.substring(0,1).toUpperCase()+fieldName.substring(1); + } + + + + /** + * Action类 + */ + private static class Action{ + String name; + String clazz; + Map results; + } + + + +} diff --git a/group17/240094626/warm-up/src/com/litestruts/StrutsTest.java b/group17/240094626/warm-up/src/com/litestruts/StrutsTest.java new file mode 100644 index 0000000000..09b00c8c3b --- /dev/null +++ b/group17/240094626/warm-up/src/com/litestruts/StrutsTest.java @@ -0,0 +1,57 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +import com.coderising.litestruts.exception.StrutsRunActionException; + + + + + +public class StrutsTest { + Struts struts = Struts.getInstance(); + + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = null; + try { + view = struts.runAction(actionName,params); + } catch (StrutsRunActionException e) { + e.printStackTrace(); + } + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = null; + try { + view = struts.runAction(actionName,params); + } catch (StrutsRunActionException e) { + e.printStackTrace(); + } + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group17/240094626/warm-up/src/com/litestruts/View.java b/group17/240094626/warm-up/src/com/litestruts/View.java new file mode 100644 index 0000000000..880a7be260 --- /dev/null +++ b/group17/240094626/warm-up/src/com/litestruts/View.java @@ -0,0 +1,28 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } + @Override + public String toString() { + return "View [jsp=" + jsp + ", parameters=" + parameters + "]"; + } + +} diff --git a/group17/240094626/warm-up/src/com/litestruts/exception/StrutsRunActionException.java b/group17/240094626/warm-up/src/com/litestruts/exception/StrutsRunActionException.java new file mode 100644 index 0000000000..5c5a7b9006 --- /dev/null +++ b/group17/240094626/warm-up/src/com/litestruts/exception/StrutsRunActionException.java @@ -0,0 +1,59 @@ +package com.coderising.litestruts.exception; + +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; + +public class StrutsRunActionException extends Exception { + + private static final long serialVersionUID = -242506476923032524L; + private String message; + private String stackTrace; + private Throwable t; + public Throwable getCause() { + return this.t; + } + + public String toString() { + return getMessage(); + } + + public String getMessage() { + return this.message; + } + + public void printStackTrace() { + System.err.print(this.stackTrace); + } + + public void printStackTrace(PrintStream paramPrintStream) { + printStackTrace(new PrintWriter(paramPrintStream)); + } + + public void printStackTrace(PrintWriter paramPrintWriter) { + paramPrintWriter.print(this.stackTrace); + } + + public StrutsRunActionException(String paramString) { + super(paramString); + this.message = paramString; + this.stackTrace = paramString; + } + + public StrutsRunActionException(Throwable paramThrowable) { + super(paramThrowable.getMessage()); + this.t = paramThrowable; + StringWriter localStringWriter = new StringWriter(); + paramThrowable.printStackTrace(new PrintWriter(localStringWriter)); + this.stackTrace = localStringWriter.toString(); + } + + public StrutsRunActionException(String paramString, Throwable paramThrowable) { + super(paramString + "; nested exception is " + + paramThrowable.getMessage()); + this.t = paramThrowable; + StringWriter localStringWriter = new StringWriter(); + paramThrowable.printStackTrace(new PrintWriter(localStringWriter)); + this.stackTrace = localStringWriter.toString(); + } +} diff --git a/group17/240094626/warm-up/src/com/litestruts/exception/StrutsXMLLoaderException.java b/group17/240094626/warm-up/src/com/litestruts/exception/StrutsXMLLoaderException.java new file mode 100644 index 0000000000..4efb8b9152 --- /dev/null +++ b/group17/240094626/warm-up/src/com/litestruts/exception/StrutsXMLLoaderException.java @@ -0,0 +1,59 @@ +package com.coderising.litestruts.exception; + +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; + +public class StrutsXMLLoaderException extends Exception { + + private static final long serialVersionUID = 5481955299021871754L; + private String message; + private String stackTrace; + private Throwable t; + public Throwable getCause() { + return this.t; + } + + public String toString() { + return getMessage(); + } + + public String getMessage() { + return this.message; + } + + public void printStackTrace() { + System.err.print(this.stackTrace); + } + + public void printStackTrace(PrintStream paramPrintStream) { + printStackTrace(new PrintWriter(paramPrintStream)); + } + + public void printStackTrace(PrintWriter paramPrintWriter) { + paramPrintWriter.print(this.stackTrace); + } + + public StrutsXMLLoaderException(String paramString) { + super(paramString); + this.message = paramString; + this.stackTrace = paramString; + } + + public StrutsXMLLoaderException(Throwable paramThrowable) { + super(paramThrowable.getMessage()); + this.t = paramThrowable; + StringWriter localStringWriter = new StringWriter(); + paramThrowable.printStackTrace(new PrintWriter(localStringWriter)); + this.stackTrace = localStringWriter.toString(); + } + + public StrutsXMLLoaderException(String paramString, Throwable paramThrowable) { + super(paramString + "; nested exception is " + + paramThrowable.getMessage()); + this.t = paramThrowable; + StringWriter localStringWriter = new StringWriter(); + paramThrowable.printStackTrace(new PrintWriter(localStringWriter)); + this.stackTrace = localStringWriter.toString(); + } +} diff --git a/group17/240094626/warm-up/src/com/litestruts/struts.xml b/group17/240094626/warm-up/src/com/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group17/240094626/warm-up/src/com/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group17/240094626/work_0226/src/com/coderising/array/ArrayUtil.java b/group17/240094626/work_0226/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..214ecae3bb --- /dev/null +++ b/group17/240094626/work_0226/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,243 @@ +package com.coderising.array; + +import com.coding.basic.impl.ArrayList; +import com.coding.basic.impl.LinkedList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + for(int i=0; i < origin.length; i++){ + if(i >= origin.length-1-i){ + break; + } + int tmp = origin[i]; + origin[i] = origin[origin.length-i-1]; + origin[origin.length-i-1] = tmp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int size = 0, // 记录非0数量 + tmp = 0; // 需要比较的下一个位置 + for(int i=0; i < oldArray.length;){ + if(oldArray[i] == 0){ + int j=tmp==0?(i+1):tmp; + for(;j < oldArray.length; j++){ + if(oldArray[j] == 0){ + continue; + }else{ + oldArray[i] = oldArray[j]; + oldArray[j] = 0; + size++; + tmp = j+1; + i=j; + break; + } + } + }else{ + i++; + size++; + continue; + } + } + int a[] = new int[size]; + System.arraycopy(oldArray, 0, a, 0, size); + return a; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){ + int[] a3 = new int[array1.length+array2.length]; + int i = array1.length-1, + j = array2.length-1, + k = a3.length-1; + while(i >= 0 && j >= 0){ + if(array1[i] > array2[j]){ + a3[k--] = array1[i--]; + }else{ + a3[k--] = array2[j--]; + } + } + while(j >= 0){ + a3[k--] = array2[j--]; + } + while(i >= 0){ + a3[k--] = array1[i--]; + } + + return a3; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int a[] = new int[oldArray.length+size]; + System.arraycopy(oldArray, 0, a, 0, oldArray.length); + return a; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + if(max == 1){ + int[] a = {0}; + return a; + } + if(max == 2){ + int[] a = {0,1}; + return a; + } + if(max == 3){ + int[] a = {0,1,1,2}; + return a; + } + ArrayList list = new ArrayList(); + list.add(0); + list.add(1); + list.add(1); + list.add(2); + int size = 4; + for(int i = 3; i < max ; i++){ + if(i == ((int)list.get(size-1)+(int)list.get(size-2))){ + list.add(i); + size++; + } + } + int[] a = new int[size]; + for(int i = 0; i < size; i++){ + a[i] = (int) list.get(i); + } + return a; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if(max < 2){ + int[] a ={}; + return a; + } + if(max == 2){ + int[] a ={2}; + return a; + } + LinkedList list = new LinkedList(); + list.add(2); + for(int n = 3; n < max; n=n+2){ + int i=3; + boolean flag = true; + for(;i*i <= n;i=i+2){ + // 先排除偶数 + if(n%i == 0){ + flag = false; + break; + } + } + if(flag){ + list.add(n); + } + } + int[] a = new int[list.size()]; + for(int i = 0; i < list.size(); i++){ + a[i] = (int) list.get(i); + } + return a; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + if(max <= 6){ + int a[] = {}; + return a; + } + LinkedList list = new LinkedList(); + int p = 6,sum; + for(; p < max; p++){ + sum = 0; + for(int i=1; i < p % 2; i++){ + if(p % i == 0){ + sum += i; + } + } + if(sum == p){ + list.add(p); + } + } + int a[] = new int[list.size()]; + for(int i = 0; i < list.size(); i++){ + a[i] = (int) list.get(i); + } + return a; + + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + for(int i=0;i 0){ + s.append("-"); + } + s.append(a); + } + seperator = s.toString();*/ + return seperator; + } + +} diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/LoginAction.java b/group17/240094626/work_0226/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group17/240094626/work_0226/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/Struts.java b/group17/240094626/work_0226/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..44e6398b80 --- /dev/null +++ b/group17/240094626/work_0226/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,194 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import com.coderising.litestruts.exception.StrutsRunActionException; +import com.coderising.litestruts.exception.StrutsXMLLoaderException; + + + +/** + * 模拟Struts读取xml文件,解析ation,并执行exectue方法 + * @author 240094626 + * + */ +public class Struts { + /**单例对象*/ + private static Struts instance = null; + /**默认配置文件目录*/ + private static final String STRUTS_CONFIG_DIR = "src/com/coderising/litestruts/"; + /**默认配置文件名*/ + private static final String STRUTS_CONFIG_XML = "struts.xml"; + /**默认编码字符集*/ + private static final String ENCODE = "UTF-8"; + /**action文档节点名称*/ + private static final String DOC_ACTION = "action"; + /**result文档节点名称*/ + private static final String DOC_ACTION_RESULT = "result"; + + /** + * 单例实现,双check + * @return + */ + public static Struts getInstance(){ + if(instance == null){ + synchronized (Struts.class) { + if(instance == null){ + instance = new Struts(); + } + } + } + return instance; + } + + public View runAction(String actionName, Map parameters) throws StrutsRunActionException { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + View view = new View(); + try { + // 0. 读取配置文件struts.xml + Map actions = getActionByDom4J(); + + // 1. 找到LoginAction 反射实例化,setName 和setPassword + Action action = actions.get(actionName); + Class clz = Class.forName(action.clazz); + Object actionObj = clz.newInstance(); + Method m1 = clz.getDeclaredMethod("setName", String.class); + m1.setAccessible(true); + m1.invoke(actionObj, parameters.get("name")); + Method m2 = clz.getDeclaredMethod("setPassword", String.class); + m2.setAccessible(true); + m2.invoke(actionObj, parameters.get("password")); + + // 2.通过反射调用对象的exectue 方法 + Method mExectue = clz.getDeclaredMethod("execute", null); + String result = (String) mExectue.invoke(actionObj, null); + + // 3. 通过反射找到对象的所有getter方法,通过反射来调用, 把值和属性形成一个HashMap + Field[] fs = clz.getDeclaredFields(); + Map pMap = new HashMap(10); + for(Field f : fs){ + String methodName = "get"+toUpperCase(f.getName()); + Method m = clz.getDeclaredMethod(methodName, null); + m.setAccessible(true); + pMap.put(f.getName(), m.invoke(actionObj, null)); + } + view.setParameters(pMap); + // 4.根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + view.setJsp(action.results.get(result)); + System.out.println(view); + } catch (StrutsXMLLoaderException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new StrutsRunActionException("Action执行失败",e); + } + + + return view; + } + + + /** + * dom4j读xml + * @return + * @throws StrutsXMLLoaderException + */ + private Map getActionByDom4J() throws StrutsXMLLoaderException{ + return getActionByDom4J(STRUTS_CONFIG_DIR,STRUTS_CONFIG_XML,ENCODE); + } + /** + * dom4j读xml + * @param dir + * @param fileName + * @param encode + * @return + * @throws StrutsXMLLoaderException + */ + private Map getActionByDom4J(String dir,String fileName,String encode) throws StrutsXMLLoaderException { + File f = new File(dir); + if(!f.exists()){ + throw new StrutsXMLLoaderException("路径不存在:"+dir); + } + f = new File(f.getPath()+"\\"+fileName); + if(!f.exists()){ + throw new StrutsXMLLoaderException("路径:"+dir+"中文件不存在:"+fileName); + } + SAXReader saxReader = new SAXReader(); + saxReader.setEncoding(encode); + Map actions = new HashMap(10); + try { + Document document = saxReader.read(f); + Element root =document.getRootElement(); + Iterator it = root.elementIterator(DOC_ACTION); + while(it.hasNext()){ + Action action = new Action(); + Element element = it.next(); + action.name = element.attributeValue("name"); + action.clazz = element.attributeValue("class"); + Map results = new HashMap(10); + Iterator rIt = element.elementIterator(DOC_ACTION_RESULT); + while(rIt.hasNext()){ + Element rElement = rIt.next(); + results.put(rElement.attributeValue("name"), rElement.getText()); + } + action.results = results; + actions.put(action.name, action); + } + } catch (Exception e) { + throw new StrutsXMLLoaderException("xml文件解析失败",e); + } + + return actions; + } + + /** + * 首个字符大写 + * @param fieldName + * @return + */ + private String toUpperCase(String fieldName){ + return fieldName.substring(0,1).toUpperCase()+fieldName.substring(1); + } + + + + /** + * Action类 + */ + private static class Action{ + String name; + String clazz; + Map results; + } + + + +} diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/StrutsTest.java b/group17/240094626/work_0226/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..09b00c8c3b --- /dev/null +++ b/group17/240094626/work_0226/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,57 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +import com.coderising.litestruts.exception.StrutsRunActionException; + + + + + +public class StrutsTest { + Struts struts = Struts.getInstance(); + + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = null; + try { + view = struts.runAction(actionName,params); + } catch (StrutsRunActionException e) { + e.printStackTrace(); + } + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = null; + try { + view = struts.runAction(actionName,params); + } catch (StrutsRunActionException e) { + e.printStackTrace(); + } + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/View.java b/group17/240094626/work_0226/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..880a7be260 --- /dev/null +++ b/group17/240094626/work_0226/src/com/coderising/litestruts/View.java @@ -0,0 +1,28 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } + @Override + public String toString() { + return "View [jsp=" + jsp + ", parameters=" + parameters + "]"; + } + +} diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsRunActionException.java b/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsRunActionException.java new file mode 100644 index 0000000000..5c5a7b9006 --- /dev/null +++ b/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsRunActionException.java @@ -0,0 +1,59 @@ +package com.coderising.litestruts.exception; + +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; + +public class StrutsRunActionException extends Exception { + + private static final long serialVersionUID = -242506476923032524L; + private String message; + private String stackTrace; + private Throwable t; + public Throwable getCause() { + return this.t; + } + + public String toString() { + return getMessage(); + } + + public String getMessage() { + return this.message; + } + + public void printStackTrace() { + System.err.print(this.stackTrace); + } + + public void printStackTrace(PrintStream paramPrintStream) { + printStackTrace(new PrintWriter(paramPrintStream)); + } + + public void printStackTrace(PrintWriter paramPrintWriter) { + paramPrintWriter.print(this.stackTrace); + } + + public StrutsRunActionException(String paramString) { + super(paramString); + this.message = paramString; + this.stackTrace = paramString; + } + + public StrutsRunActionException(Throwable paramThrowable) { + super(paramThrowable.getMessage()); + this.t = paramThrowable; + StringWriter localStringWriter = new StringWriter(); + paramThrowable.printStackTrace(new PrintWriter(localStringWriter)); + this.stackTrace = localStringWriter.toString(); + } + + public StrutsRunActionException(String paramString, Throwable paramThrowable) { + super(paramString + "; nested exception is " + + paramThrowable.getMessage()); + this.t = paramThrowable; + StringWriter localStringWriter = new StringWriter(); + paramThrowable.printStackTrace(new PrintWriter(localStringWriter)); + this.stackTrace = localStringWriter.toString(); + } +} diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsXMLLoaderException.java b/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsXMLLoaderException.java new file mode 100644 index 0000000000..4efb8b9152 --- /dev/null +++ b/group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsXMLLoaderException.java @@ -0,0 +1,59 @@ +package com.coderising.litestruts.exception; + +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; + +public class StrutsXMLLoaderException extends Exception { + + private static final long serialVersionUID = 5481955299021871754L; + private String message; + private String stackTrace; + private Throwable t; + public Throwable getCause() { + return this.t; + } + + public String toString() { + return getMessage(); + } + + public String getMessage() { + return this.message; + } + + public void printStackTrace() { + System.err.print(this.stackTrace); + } + + public void printStackTrace(PrintStream paramPrintStream) { + printStackTrace(new PrintWriter(paramPrintStream)); + } + + public void printStackTrace(PrintWriter paramPrintWriter) { + paramPrintWriter.print(this.stackTrace); + } + + public StrutsXMLLoaderException(String paramString) { + super(paramString); + this.message = paramString; + this.stackTrace = paramString; + } + + public StrutsXMLLoaderException(Throwable paramThrowable) { + super(paramThrowable.getMessage()); + this.t = paramThrowable; + StringWriter localStringWriter = new StringWriter(); + paramThrowable.printStackTrace(new PrintWriter(localStringWriter)); + this.stackTrace = localStringWriter.toString(); + } + + public StrutsXMLLoaderException(String paramString, Throwable paramThrowable) { + super(paramString + "; nested exception is " + + paramThrowable.getMessage()); + this.t = paramThrowable; + StringWriter localStringWriter = new StringWriter(); + paramThrowable.printStackTrace(new PrintWriter(localStringWriter)); + this.stackTrace = localStringWriter.toString(); + } +} diff --git a/group17/240094626/work_0226/src/com/coderising/litestruts/struts.xml b/group17/240094626/work_0226/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group17/240094626/work_0226/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group17/51075907/HomeWork/.classpath b/group17/51075907/HomeWork/.classpath new file mode 100644 index 0000000000..10b13d9f7a --- /dev/null +++ b/group17/51075907/HomeWork/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group17/51075907/HomeWork/.project b/group17/51075907/HomeWork/.project new file mode 100644 index 0000000000..c27db84883 --- /dev/null +++ b/group17/51075907/HomeWork/.project @@ -0,0 +1,17 @@ + + + HomeWork + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group17/51075907/HomeWork/.settings/org.eclipse.jdt.core.prefs b/group17/51075907/HomeWork/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..43785549a2 --- /dev/null +++ b/group17/51075907/HomeWork/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.4 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning +org.eclipse.jdt.core.compiler.source=1.3 diff --git a/group17/51075907/HomeWork/src/day1_HomeWork/ArrayList.java b/group17/51075907/HomeWork/src/day1_HomeWork/ArrayList.java new file mode 100644 index 0000000000..5a164ce8ca --- /dev/null +++ b/group17/51075907/HomeWork/src/day1_HomeWork/ArrayList.java @@ -0,0 +1,75 @@ +package day1_HomeWork; + + + public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + //ռ䳬ǰС,֤ + public void ensureCapacity( int newCapacity) + { + if ( newCapacity < size) + return; + + Object [] old =elementData; + elementData =(Object []) new Object[newCapacity]; + for (int i=0; i index; i--) + elementData[i] =elementData [i-1]; + elementData[index]= o; + size ++; + + } + + public Object get(int index){ + if ( index<0 || index >=size()) + throw new ArrayIndexOutOfBoundsException(); + return elementData[index]; + } + + public Object remove(int index){ + Object remove_elementData=elementData[index]; + for ( int i=index;i size()) + throw new IndexOutOfBoundsException(); + + if (index < size()/2) + { + p=beginMarker.next; + for (int i =0;iindex;i--) + p=p.prev; + } + return p; + } + public Object remove(Node p){ + p.next.prev =p.prev; + p.prev.next=p.next; + int size; + size--; + int modCount; + modCount++; + return p.data; + } + + public int size(){ + return -1; + } + + public void addFirst(Node p,Object o){ + Node newNode= new Node (o,p.prev,p); + newNode.prev.next= newNode; + p.prev =newNode; + size++; + modCount++; + } + public void addLast(Object o){ + + } + public Object removeFirst(int index){ + return remove( get(index)); + } + public Object removeLast(){ + return null; + } + public java.util.Iterator iterator(){ + return new LinkedListIterator(); + } + + private class LinkedListIterator implements java.util.Iterator{ + private Node current=beginMarker.next; + private int expectedModCount=modCount; + private boolean okTORemove=false; + + public boolean haNext() + { + return current!= endMarker; + } + public Object next() + { + if (modCount !=expectedModCount) + throw new java.util.ConcurrentModificationException(); + if (!=hasNext()) + throw new java.util.NoSuchElementException(); + + + } + } + + + private static class Node{ + public Node(Object o, Node p, Node n) + { + data =o; next=n; prev=p; + } + public Object data; + public Node next; + public Node prev; + + } +} diff --git a/group17/51075907/HomeWork/src/day1_HomeWork/List.java b/group17/51075907/HomeWork/src/day1_HomeWork/List.java new file mode 100644 index 0000000000..4fce964dce --- /dev/null +++ b/group17/51075907/HomeWork/src/day1_HomeWork/List.java @@ -0,0 +1,9 @@ +package day1_HomeWork; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group17/51075907/HomeWork/src/day1_HomeWork/Queue.java b/group17/51075907/HomeWork/src/day1_HomeWork/Queue.java new file mode 100644 index 0000000000..9a0468c683 --- /dev/null +++ b/group17/51075907/HomeWork/src/day1_HomeWork/Queue.java @@ -0,0 +1,19 @@ +package day1_HomeWork; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group17/51075907/HomeWork/src/day1_HomeWork/Stack.java b/group17/51075907/HomeWork/src/day1_HomeWork/Stack.java new file mode 100644 index 0000000000..259c5f0910 --- /dev/null +++ b/group17/51075907/HomeWork/src/day1_HomeWork/Stack.java @@ -0,0 +1,23 @@ +package day1_HomeWork; + + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group17/516886559/ArrayList.java b/group17/516886559/ArrayList.java new file mode 100644 index 0000000000..75222aecce --- /dev/null +++ b/group17/516886559/ArrayList.java @@ -0,0 +1,103 @@ +package com.rd.p2p.common.util.liuxin; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[10]; + + public void add(E o){ + if(size >= elementData.length){ + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + elementData[size++] = o; + size++; + } + + public void add(int index, E o){ + if(index > size){ + throw new ArrayIndexOutOfBoundsException("插入索引数不能大于数列总长度 " + index + ">" + size); + } + if(size >= elementData.length){ + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + Object[] tempData = Arrays.copyOfRange(elementData, index, size); + elementData[index] = o; + for(int i = 1; i <= tempData.length; i++){ + elementData[i+index] = tempData[i-1]; + } + size++; + + } + + public Object get(int index){ + if(index >= size){ + throw new ArrayIndexOutOfBoundsException("取出数组索引不能大于等于数组总长度 " + index + ">=" + size); + } + return elementData[index]; + } + + public Object remove(int index){ + if(index >= size){ + throw new ArrayIndexOutOfBoundsException("移除索引数不能大于等于数列总长度 " + index + ">=" + size); + } + Object data = get(index); + Object[] tempData = Arrays.copyOfRange(elementData, index+1, size); + for(int i = 0; i < tempData.length; i++){ + elementData[index+i] = tempData[i]; + } + elementData[size - 1] = null; + size--; + return data; + } + + public int size(){ + return size; + } + + @Override + public String toString() { + for (Object object : elementData) { + System.out.println(object); + } + return null; + } + + //迭代器 + public Iterator iterator(){ + return new Iterator() { + + private int index = 0; + + @Override + public Object next() { + if(index >= size){ + throw new ArrayIndexOutOfBoundsException("取出数组索引不能大于等于数组总长度 " + index + ">=" + size); + } + return get(index++); + } + + @Override + public boolean hasNext() { + if(size > index){ + return true; + }else{ + return false; + } + } + }; + } + + public static void main(String[] args) { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(3,3); + Iterator in = list.iterator(); + while(in.hasNext()){ + System.out.println(in.next()); + } + } +} \ No newline at end of file diff --git a/group17/516886559/BinaryTreeNode.java b/group17/516886559/BinaryTreeNode.java new file mode 100644 index 0000000000..75c17d1198 --- /dev/null +++ b/group17/516886559/BinaryTreeNode.java @@ -0,0 +1,68 @@ +package com.rd.p2p.common.util.liuxin; + +/** + * 用Integer易于比较和插入 + * @author jhn + * time:2017年2月24日 + */ +public class BinaryTreeNode { + + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(){ + + } + + public BinaryTreeNode(Integer integer){ + this.data = integer; + } + + public Integer getData() { + return data; + } + public void setData(Integer data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Integer o){ + if(data == null){ + data = o; + return this; + } + BinaryTreeNode node = new BinaryTreeNode(o); + BinaryTreeNode tempBinaryTreeNode = this; + boolean begin = true; + while(begin){ + if(o < data){ + tempBinaryTreeNode = tempBinaryTreeNode.getLeft(); + if(tempBinaryTreeNode.getLeft() == null){ + tempBinaryTreeNode.setLeft(node); + begin = false;; + } + }else{ + tempBinaryTreeNode = tempBinaryTreeNode.getRight(); + if(tempBinaryTreeNode.getRight() == null){ + tempBinaryTreeNode.setRight(node); + begin = false;; + } + } + + } + return node; + } + +} diff --git a/group17/516886559/Iterator.java b/group17/516886559/Iterator.java new file mode 100644 index 0000000000..d29475ed43 --- /dev/null +++ b/group17/516886559/Iterator.java @@ -0,0 +1,7 @@ +package com.rd.p2p.common.util.liuxin; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group17/516886559/LinkedList.java b/group17/516886559/LinkedList.java new file mode 100644 index 0000000000..1b0345de7d --- /dev/null +++ b/group17/516886559/LinkedList.java @@ -0,0 +1,150 @@ +package com.rd.p2p.common.util.liuxin; + +public class LinkedList implements List { + + private Node head; + + private int size; + + public void add(E o){ + if(size == 0){ + head = new Node(); + head.data = o; + }else{ + Node node = new Node(); + node.data = o; + getNode(size-1).next = node; + } + size ++; + } + + public void add(int index , E o){ + Node node = new Node(); + node.data = o; + if(index == 0){ + node.next = head; + head = node; + }else{ + Node indexNode = getNode(index - 1); + indexNode.next = node; + if(index < size){ + node.next = getNode(index); + } + } + size ++; + } + + public Object get(int index){ + return getNode(index).data; + } + + public Object remove(int index){ + if(index > size - 1){ + throw new ArrayIndexOutOfBoundsException("移除索引超出数组索引边界 " + index + ">" + (size - 1)); + } + if(index < 0){ + throw new ArrayIndexOutOfBoundsException("索引不能为负数"); + } + Node returnNode = null; + if(index == 0){ + returnNode = head; + if(head.next != null){ + head = head.next; + }else{ + head = null; + } + }else{ + returnNode = getNode(index); + if(returnNode.next != null){ + Node preNode = getNode(index-1); + Node nextNode = getNode(index+1); + preNode.next = nextNode; + } + } + size--; + return returnNode.data; + } + + public int size(){ + return size; + } + + public void addFirst(E o){ + add(0,o); + } + + public void addLast(E o){ + add(size-1,o); + } + + public Object removeFirst(){ + return remove(0); + } + + public Object removeLast(){ + return remove(size - 1); + } + + private Node getNode(int index){ + if(index > size - 1){ + throw new ArrayIndexOutOfBoundsException("查询索引超出数组索引边界 " + index + ">" + (size - 1)); + } + if(index < 0){ + throw new ArrayIndexOutOfBoundsException("索引不能为负数"); + } + Node tempNode = head; + if(index == 0){ + tempNode = head; + }else{ + for(int i = 0; i < index; i++){ + tempNode = tempNode.next; + } + } + return tempNode; + } + + private static class Node{ + Object data; + Node next; + } + + @Override + public String toString() { + for (int i = 0; i < size; i++) { + System.out.println(get(i)); + } + return null; + } + + //迭代器 + public Iterator iterator(){ + return new Iterator() { + private int index = 0; + + @Override + public Object next() { + if(index >= size){ + throw new ArrayIndexOutOfBoundsException("取出数组索引不能大于等于数组总长度 " + index + ">=" + size); + } + return get(index++); + } + + @Override + public boolean hasNext() { + if(size > index){ + return true; + }else{ + return false; + } + } + }; + } + + public static void main(String[] args) { + LinkedList list = new LinkedList(); + list.add(1); + list.add(2); + list.add(3); + list.toString(); + } +} diff --git a/group17/516886559/List.java b/group17/516886559/List.java new file mode 100644 index 0000000000..fd6e7883ba --- /dev/null +++ b/group17/516886559/List.java @@ -0,0 +1,9 @@ +package com.rd.p2p.common.util.liuxin; + +public interface List { + public void add(E o); + public void add(int index, E o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group17/516886559/Queue.java b/group17/516886559/Queue.java new file mode 100644 index 0000000000..d077a71a32 --- /dev/null +++ b/group17/516886559/Queue.java @@ -0,0 +1,30 @@ +package com.rd.p2p.common.util.liuxin; + +public class Queue { + + ArrayList arrayList = new ArrayList(); + + public void enQueue(T o){ + arrayList.add(o); + } + + public T deQueue(){ + if(arrayList.size() > 0){ + @SuppressWarnings("unchecked") + T t = (T) arrayList.get(0); + arrayList.remove(0); + return t; + }else{ + return null; + } + } + + public boolean isEmpty(){ + return arrayList.size() == 0 ? true : false; + } + + public int size(){ + return arrayList.size(); + } +} + diff --git a/group17/516886559/Stack.java b/group17/516886559/Stack.java new file mode 100644 index 0000000000..53ffc21e09 --- /dev/null +++ b/group17/516886559/Stack.java @@ -0,0 +1,52 @@ +package com.rd.p2p.common.util.liuxin; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(T o){ + elementData.add(o); + } + + public T pop(){ + if(elementData.size() > 0){ + @SuppressWarnings("unchecked") + T obj = (T)elementData.get(elementData.size()-1); + elementData.remove(elementData.size()-1); + return obj; + }else{ + return null; + } + } + + @SuppressWarnings("unchecked") + public T peek(){ + if(elementData.size() > 0){ + return (T)elementData.get(elementData.size()-1); + }else{ + return null; + } + } + public boolean isEmpty(){ + return elementData.size() == 0 ? true : false; + } + public int size(){ + return elementData.size(); + } + + public static void main(String[] args) { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + + System.out.println(stack.pop()); + System.out.println(stack.peek()); + System.out.println(stack.peek()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.peek()); + } +} + diff --git a/group17/785396327/2.26/binarytree/BinaryTree.java b/group17/785396327/2.26/binarytree/BinaryTree.java new file mode 100644 index 0000000000..bf5a6b639c --- /dev/null +++ b/group17/785396327/2.26/binarytree/BinaryTree.java @@ -0,0 +1,55 @@ +package binarytree; + +/** + * Created by william on 2017/2/16. + */ +public class BinaryTree { + private Node root; + + class Node { + private Node left; + private Node right; + private Comparable data; + + public Node(Node left, Node right, Comparable data) { + this.left = left; + this.right = right; + this.data = data; + } + + private void add(Comparable data) { + if (this.data.compareTo(data) >= 0) + if (this.left == null) + this.left = new Node(null, null, data); + else + left.add(data); + else if (this.data.compareTo(data) < 0) + if (this.right == null) + this.right = new Node(null, null, data); + else + this.right.add(data); + } + + public Comparable getData() { + return this.data; + } + + public Node getLeft() { + return this.left; + } + + public Node getRight() { + return this.right; + } + } + + public void add(Comparable data) { + if (this.root == null) + root = new Node(null, null, data); + else this.root.add(data); + } + + public void printByType(SearchType type) { + type.printByType(this.root); + } +} diff --git a/group17/785396327/2.26/binarytree/DLRSearchType.java b/group17/785396327/2.26/binarytree/DLRSearchType.java new file mode 100644 index 0000000000..3d1adbbdc7 --- /dev/null +++ b/group17/785396327/2.26/binarytree/DLRSearchType.java @@ -0,0 +1,16 @@ +package binarytree; + +/** + * Created by william on 2017/2/18. + */ +public class DLRSearchType implements SearchType { + + @Override + public void printByType(BinaryTree.Node root) { + if (root != null) { + System.out.print(root.getData()+" "); + printByType(root.getLeft()); + printByType(root.getRight()); + } + } +} diff --git a/group17/785396327/2.26/binarytree/LDRSearchType.java b/group17/785396327/2.26/binarytree/LDRSearchType.java new file mode 100644 index 0000000000..da18dbc1b9 --- /dev/null +++ b/group17/785396327/2.26/binarytree/LDRSearchType.java @@ -0,0 +1,15 @@ +package binarytree; + +/** + * Created by william on 2017/2/18. + */ +public class LDRSearchType implements SearchType { + @Override + public void printByType(BinaryTree.Node root) { + if (root != null) { + printByType(root.getLeft()); + System.out.print(root.getData() + " "); + printByType(root.getRight()); + } + } +} diff --git a/group17/785396327/2.26/binarytree/LFSearchType.java b/group17/785396327/2.26/binarytree/LFSearchType.java new file mode 100644 index 0000000000..5f908664c9 --- /dev/null +++ b/group17/785396327/2.26/binarytree/LFSearchType.java @@ -0,0 +1,27 @@ +package binarytree; + +import java.util.LinkedList; + +/** + * Created by william on 2017/2/18. + */ +public class LFSearchType implements SearchType { + private LinkedList queue = new LinkedList(); + + @Override + public void printByType(BinaryTree.Node root) { + if (root == null) + return; + queue.offer(root); + while (!queue.isEmpty()) { + BinaryTree.Node curNode = queue.poll(); + System.out.print(curNode.getData() + " "); + if (curNode.getLeft() != null) + queue.offer(curNode.getLeft()); + if (curNode.getRight() != null) + queue.offer(curNode.getRight()); + } + + } + +} diff --git a/group17/785396327/2.26/binarytree/LRDSearchType.java b/group17/785396327/2.26/binarytree/LRDSearchType.java new file mode 100644 index 0000000000..250645e6df --- /dev/null +++ b/group17/785396327/2.26/binarytree/LRDSearchType.java @@ -0,0 +1,15 @@ +package binarytree; + +/** + * Created by william on 2017/2/18. + */ +public class LRDSearchType implements SearchType { + @Override + public void printByType(BinaryTree.Node root) { + if (root != null) { + printByType(root.getLeft()); + printByType(root.getRight()); + System.out.print(root.getData() + " "); + } + } +} diff --git a/group17/785396327/2.26/binarytree/SearchType.java b/group17/785396327/2.26/binarytree/SearchType.java new file mode 100644 index 0000000000..606124a781 --- /dev/null +++ b/group17/785396327/2.26/binarytree/SearchType.java @@ -0,0 +1,9 @@ +package binarytree; + +/** + * Created by william on 2017/2/18. + */ +public interface SearchType { + + void printByType(T root); +} diff --git a/group17/785396327/2.26/list/ArrayList.java b/group17/785396327/2.26/list/ArrayList.java new file mode 100644 index 0000000000..119079f7ce --- /dev/null +++ b/group17/785396327/2.26/list/ArrayList.java @@ -0,0 +1,153 @@ +package list; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +/** + * Created by william on 2017/2/25. + */ +public class ArrayList implements List { + private static final int DEFAULT_CAPACITY = 10; + private int size; + private Object[] elementData; + + public ArrayList() { + elementData = new Object[DEFAULT_CAPACITY]; + } + + public ArrayList(int initialCapacity) { + if (initialCapacity < 0) + throw new RuntimeException("非法初始化大小参数!"); + elementData = new Object[initialCapacity]; + } + + public ArrayList(T[] array) { + if (array == null) + throw new NullPointerException(); + elementData = array; + } + + public boolean add(T ele) { + grow(size); + elementData[size++] = ele; + return true; + } + + public T get(int index) { + checkBounds(index); + return (T) elementData[index]; + } + + public T remove(int index) { + checkBounds(index); + T removeEle = (T) elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index); + size--; + return removeEle; + } + + public boolean add(int index, T ele) { + checkBounds(index); + grow(size++); + //将原本数组从待插入的index截取,将原本index后的有效值,复制到原本数组index+1之后 + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = ele; + return true; + } + + + @Override + public boolean remove(T ele) { + int index; + if ((index = indexOf(ele)) == -1) + return false; + remove(index); + return true; + } + + private void checkBounds(int index) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); + } + + public int size() { + return size; + } + + private void grow(int miniCapacity) { + if (miniCapacity >= elementData.length) { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + (oldCapacity >> 1) > Integer.MAX_VALUE ? Integer.MAX_VALUE : oldCapacity + (oldCapacity >> 1); + if (newCapacity - miniCapacity < 0) + newCapacity = miniCapacity > Integer.MAX_VALUE ? Integer.MAX_VALUE : miniCapacity; + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean contains(T ele) { + return indexOf(ele) != -1; + } + + public int indexOf(T ele) { + for (int i = 0; i < size; i++) { + if ((ele == null && elementData[i] == null) || (ele.equals(elementData[i]))) + return i; + } + return -1; + } + + @Override + public boolean addAll(List l) { + Object[] eles = l.toArray(); + grow(eles.length + size); + System.arraycopy(eles, 0, elementData, size, eles.length); + return true; + } + + @Override + public Object[] toArray() { + return Arrays.copyOf(elementData, size); + } + + + public Iterator iterator() { + return new Itr(); + } + + private class Itr implements Iterator { + int cursor;//待遍历元素的下标 + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public T next() { + if (cursor >= size) + throw new NoSuchElementException(); + return (T) elementData[cursor++]; + } + + @Override + public void remove() { + if (cursor >= size) + throw new NoSuchElementException(); + ArrayList.this.remove(cursor--); + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("[ "); + for (Object ele : elementData) { + sb.append(ele).append(" "); + } + return sb.append("]").toString(); + } +} diff --git a/group17/785396327/2.26/list/Iterator.java b/group17/785396327/2.26/list/Iterator.java new file mode 100644 index 0000000000..0df87c6cf1 --- /dev/null +++ b/group17/785396327/2.26/list/Iterator.java @@ -0,0 +1,13 @@ +package list; + +/** + * Created by IBM on 2017/2/25. + */ +public interface Iterator { + + boolean hasNext(); + + T next(); + + void remove(); +} diff --git a/group17/785396327/2.26/list/LinkedList.java b/group17/785396327/2.26/list/LinkedList.java new file mode 100644 index 0000000000..a55f723ecb --- /dev/null +++ b/group17/785396327/2.26/list/LinkedList.java @@ -0,0 +1,173 @@ +package list; + +/** + * Created by william on 2017/2/25. + */ +public class LinkedList implements List { + private int size; + private Node first; + private Node last; + + private static class Node { + Node next; + Node prev; + T data; + + Node(Node prev, Node next, T data) { + this.prev = prev; + this.next = next; + this.data = data; + } + } + + @Override + public int size() { + return this.size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean contains(T ele) { + Node head = first; + while (head != null) { + if ((ele == null && head.data == null) || (ele.equals(head.data))) + return true; + head = head.next; + } + return false; + } + + @Override + public boolean add(T ele) { + if (first == null) + first = last = new Node(null, null, ele); + else { + //新添加节点的上一个节点是原来链表的最后一个节点 + Node addNode = new Node(last, null, ele); + //原来链表的最后一个节点的下一个节点需要指向新添加的节点 + last.next = addNode; + //更新最后一个节点为新添加的节点 + last = addNode; + } + size++; + return true; + } + + @Override + public boolean add(int index, T ele) { + checkBounds(index, true); + if (index == size) add(ele); + else { + Node head = first; + for (int i = 0; i < size; i++) { + if (i == index - 1)//得到要插入位置的前一个节点 + head.next = new Node(head, head.next, ele); + else + head = head.next; + } + } + size++; + return true; + } + + @Override + public boolean remove(T ele) { + if (!contains(ele)) + return false; + Node head = first; + Node prev = head.prev; + while (head != null) { + if ((ele == null && ele == head.data) || ele.equals(head.data)) { + prev.next = head.next; + size--; + return true; + } + prev = head; + head = head.next; + } + return false; + } + + @Override + public T remove(int index) { + checkBounds(index, false); + T removeEle = get(index); + remove(removeEle); + return removeEle; + } + + @Override + public T get(int index) { + checkBounds(index, false); + if (index > (size >> 1)) { + //索引位置大于1/2size,从后往前 + Node tail = last; + for (int i = size - 1; i >= 0; i--) { + if (i == index) + return (T) tail.data; + else + tail = tail.prev; + } + } else { + //从前往后 + Node head = first; + for (int i = 0; i < size; i++) { + if (i == index) + return (T) head.data; + else + head = head.next; + } + } + return null; + } + + @Override + public int indexOf(T ele) { + if (first == null) return -1; + Node head = first; + for (int i = 0; i < size; i++) { + if ((ele == null && ele == head.data) || ele.equals(head.data)) + return i; + head = head.next; + } + return -1; + } + + @Override + public boolean addAll(List l) { + return false; + } + + @Override + public Object[] toArray() { + return new Object[0]; + } + + /** + * 指定位置查找元素和插入元素到指定位置IndexOutofBounds的判断标准不一样 + * + * @param index + * @param isInsert + */ + private void checkBounds(int index, boolean isInsert) { + if (isInsert && (index < 0 || index > size))//允许插入到最后一个元素之后,不能排除= + throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); + if (index < 0 || index >= size)//查询从0 --- size-1 + throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("[ "); + Node head = first; + while (head != null) { + sb.append(head.data + " "); + head = head.next; + } + return sb.append("]").toString(); + } +} diff --git a/group17/785396327/2.26/list/List.java b/group17/785396327/2.26/list/List.java new file mode 100644 index 0000000000..e03b4cfa7c --- /dev/null +++ b/group17/785396327/2.26/list/List.java @@ -0,0 +1,30 @@ +package list; + +/** + * Created by william on 2017/2/25. + */ +public interface List { + + int size(); + + boolean isEmpty(); + + boolean contains(T ele); + + boolean add(T ele); + + boolean add(int index, T ele); + + boolean remove(T ele); + + T remove(int index); + + T get(int index); + + int indexOf(T ele); + + boolean addAll(List l); + + Object[] toArray(); + +} diff --git a/group17/785396327/2.26/queue/Queue.java b/group17/785396327/2.26/queue/Queue.java new file mode 100644 index 0000000000..62404a951e --- /dev/null +++ b/group17/785396327/2.26/queue/Queue.java @@ -0,0 +1,43 @@ +package queue; + +import list.LinkedList; + +import java.util.NoSuchElementException; + +/** + * Created by william on 2017/2/25. + */ +public class Queue extends LinkedList { + + public boolean add(T ele) { + return add(ele); + } + + public T element() { + if (size() == 0) + throw new NoSuchElementException("队列中没有元素!"); + return get(0); + } + + public boolean offer(T ele) { + return add(ele); + } + + public T peek() { + if (size() == 0) + return null; + return get(0); + } + + public T poll() { + if (size() == 0) + return null; + return remove(0); + } + + public T remove() { + if (size() == 0) + throw new NoSuchElementException("队列中没有元素!"); + return remove(0); + } +} diff --git a/group17/785396327/2.26/stack/Stack.java b/group17/785396327/2.26/stack/Stack.java new file mode 100644 index 0000000000..58efd9c0c3 --- /dev/null +++ b/group17/785396327/2.26/stack/Stack.java @@ -0,0 +1,31 @@ +package stack; + +import list.ArrayList; + +import java.util.EmptyStackException; + +/** + * Created by william on 2017/2/25. + */ +public class Stack extends ArrayList { + + public boolean empty() { + return isEmpty(); + } + + public T peek() { + if (size() == 0) + throw new EmptyStackException(); + return (T) get(0); + } + + public T pop() { + if (size() == 0) + throw new EmptyStackException(); + return (T) remove(0); + } + + public void push(T ele) { + add(0, ele); + } +} diff --git a/group17/785396327/3.5/array/ArrayUtils.java b/group17/785396327/3.5/array/ArrayUtils.java new file mode 100644 index 0000000000..c98aec55dd --- /dev/null +++ b/group17/785396327/3.5/array/ArrayUtils.java @@ -0,0 +1,112 @@ +package array; + +import list.ArrayList; +import list.List; + +import java.util.Arrays; +import java.util.InputMismatchException; +import java.util.NoSuchElementException; + + +/** + * Created by william on 2017/2/27. + */ +public class ArrayUtils { + + public static void reserveArray(int[] src) { + int begin = 0; + int end = src.length - 1; + while (begin < end) { + swap(src, begin++, end--); + } + } + + public static int[] removeZero(int[] oldArray) { + List newResult = new ArrayList(); + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) + newResult.add(oldArray[i]); + } + + return toIntArray(newResult); + } + + public static int[] merge(int[] array1, int[] array2) { + int[] temp = new int[array1.length + array2.length]; + System.arraycopy(array1, 0, temp, 0, array1.length); + System.arraycopy(array2, 0, temp, array1.length, array2.length); + Arrays.sort(temp); + List result = new ArrayList(); + for (int ele : temp) { + if (!result.contains(ele)) + result.add(ele); + } + return toIntArray(result); + } + + public static int[] grow(int[] oldArray, int size) { + if (size <= 0) + throw new NoSuchElementException(); + int[] result = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, result, 0, oldArray.length); + return result; + } + + public static int[] fibonacci(int max) { + if (max <= 1) + return new int[0]; + List fList = new ArrayList(); + fList.add(1); + fList.add(1); + int last = fList.size() - 1; + while (fList.get(last) < max) { + fList.add(fList.get(last) + fList.get(last - 1)); + last++; + } + return toIntArray(fList); + } + + public static int[] getPrimes(int max) { + List result = new ArrayList(); + for (int i = 0; i < max; i++) { + if (i % 2 == 1) + result.add(i); + } + return toIntArray(result); + } + + public static int[] getPerfectNumbers(int max) { + List result = new ArrayList(); + for (int i = 1; i <= max; i++) { + int sum = 0; + for (int j = 1; j < i / 2 + 1; j++) { + if (i % j == 0) + sum += j; + } + if (i == sum) + result.add(i); + } + return toIntArray(result); + } + + private static int[] toIntArray(List src) { + int[] result = new int[src.size()]; + for (int i = 0; i < src.size(); i++) { + result[i] = src.get(i); + } + return result; + } + + public static String join(int[] array, String seperator) { + String value = Arrays.toString(array).replaceAll(", ", seperator == null ? "-" : seperator); + return value.substring(1, value.length() - 1); + } + + + private static void swap(int[] array, int i, int j) { + array[i] ^= array[j]; + array[j] ^= array[i]; + array[i] ^= array[j]; + } + +} diff --git a/group17/785396327/3.5/array/ArrayUtilsTest.java b/group17/785396327/3.5/array/ArrayUtilsTest.java new file mode 100644 index 0000000000..276e840b44 --- /dev/null +++ b/group17/785396327/3.5/array/ArrayUtilsTest.java @@ -0,0 +1,86 @@ +package array; + +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +/** + * Created by william on 2017/2/27. + */ +public class ArrayUtilsTest { + int[] array; + private static final int RANGE = 9; + private static final int BOUNDS = 10; + private static Random random = new Random(); + + + @Before + public void setUp() { + array = randomArray(RANGE); + } + + private int[] randomArray(int range) { + int[] array = new int[range]; + for (int i = 0; i < range; i++) { + array[i] = random.nextInt(BOUNDS); + } + return array; + } + + @Test + public void reverseArrayTest() { + System.out.println(Arrays.toString(array)); + ArrayUtils.reserveArray(array); + System.out.println(Arrays.toString(array)); + } + + @Test + public void removeZeroTest() { + System.out.println(Arrays.toString(array)); + int[] newArray = ArrayUtils.removeZero(array); + System.out.println(Arrays.toString(newArray)); + } + + @Test + public void mergeTest() { + System.out.println(Arrays.toString(array)); + int[] array2 = {2, 5, 1, 6, 8}; + int[] merge = ArrayUtils.merge(array, array2); + System.out.println(Arrays.toString(merge)); + } + + @Test + public void growTest() { + System.out.println(Arrays.toString(array)); + int[] result = ArrayUtils.grow(array, 4); + System.out.println(Arrays.toString(result)); + } + + @Test + public void getPrimesTest() { + int[] primes = ArrayUtils.getPrimes(54); + System.out.println(Arrays.toString(primes)); + } + + @Test + public void getPerfectNumbersTest() { + int[] perfectNumbers = ArrayUtils.getPerfectNumbers(100000); + System.out.println(Arrays.toString(perfectNumbers)); + } + + @Test + public void joinTest() { + String value = ArrayUtils.join(array, "-"); + System.out.println(value); + } + + @Test + public void fibonacciTest() { + System.out.println(Arrays.toString(ArrayUtils.fibonacci(34))); + } + +} diff --git a/group17/785396327/3.5/struts/LoginAction.java b/group17/785396327/3.5/struts/LoginAction.java new file mode 100644 index 0000000000..3fc624ff90 --- /dev/null +++ b/group17/785396327/3.5/struts/LoginAction.java @@ -0,0 +1,39 @@ +package struts; + +/** + * Created by IBM on 2017/3/4. + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group17/785396327/3.5/struts/LoginActionTest.java b/group17/785396327/3.5/struts/LoginActionTest.java new file mode 100644 index 0000000000..a2ce2379a5 --- /dev/null +++ b/group17/785396327/3.5/struts/LoginActionTest.java @@ -0,0 +1,36 @@ +package struts; + +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.junit.Assert; +import org.junit.Test; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by IBM on 2017/3/4. + */ +public class LoginActionTest { + + @Test + public void fun1() throws DocumentException { + InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("struts/struts.xml"); + SAXReader reader = new SAXReader(); + Element rootElement = reader.read(resourceAsStream).getRootElement(); + Element selectedElement = (Element) rootElement.selectSingleNode("//action[@name='login']"); + System.out.println(selectedElement.attributeValue("class")); + + } + + @Test + public void fun2() { + Map parameters = new HashMap(); + parameters.put("name", "test"); + parameters.put("password", "1234"); + View view = Struts.runAction("login", parameters); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + } +} diff --git a/group17/785396327/3.5/struts/Struts.java b/group17/785396327/3.5/struts/Struts.java new file mode 100644 index 0000000000..609c493852 --- /dev/null +++ b/group17/785396327/3.5/struts/Struts.java @@ -0,0 +1,88 @@ +package struts; + +import org.dom4j.Element; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by william on 2017/3/4. + */ +public class Struts { + + + public static View runAction(String actionName, Map parameters) { + Element root = StrutsUtils.getRoot("struts/struts.xml"); + View view = new View(); + if (root != null) { + Element selectedEle = (Element) root.selectSingleNode("//action[@name='" + actionName + "']"); + if (selectedEle != null) { + + Class clazz = genClass(selectedEle.attributeValue("class")); + Object target = setValue(parameters, clazz); + + String result; + try { + result = (String) clazz.getMethod("execute").invoke(target); + } catch (Exception e) { + throw new RuntimeException("invoke execute have some error", e); + } + + Map response = getValue(clazz, target); + view.setParameters(response); + Element selectedResult = (Element) root.selectSingleNode("//action[@name='" + actionName + "']//result[@name='" + result + "']"); + view.setJsp(selectedResult == null ? null : selectedResult.getText()); + } + } + return view; + } + + + private static Class genClass(String className) { + Class clazz = null; + try { + clazz = Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return clazz; + } + + private static Object setValue(Map parameters, Class clazz) { + try { + Object target = clazz.newInstance(); + if (!StrutsUtils.isEmpty(parameters)) { + for (Map.Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + if (!StrutsUtils.isEmpty(key)) { + String setterName = new StringBuilder("set").append(key.substring(0, 1).toUpperCase()).append(key.substring(1)).toString(); + clazz.getMethod(setterName, String.class).invoke(target, entry.getValue()); + } + } + } + return target; + } catch (Exception e) { + throw new RuntimeException("create class instance have some error ", e); + } + } + + private static Map getValue(Class clazz, Object target) { + Map resultsMap = new HashMap(); + Method[] methods = clazz.getMethods(); + for (Method method : methods) { + String fieldName = method.getName(); + if (fieldName.startsWith("get") && !fieldName.equals("getClass")) { + try { + Object value = method.invoke(target); + resultsMap.put(new StringBuilder(fieldName.substring(3, 4)).append(fieldName.substring(4)).toString(), value); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return resultsMap; + } + + +} diff --git a/group17/785396327/3.5/struts/StrutsUtils.java b/group17/785396327/3.5/struts/StrutsUtils.java new file mode 100644 index 0000000000..dfe5fe614f --- /dev/null +++ b/group17/785396327/3.5/struts/StrutsUtils.java @@ -0,0 +1,30 @@ +package struts; + +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.InputStream; + +/** + * Created by IBM on 2017/3/4. + */ +public class StrutsUtils { + + public static Element getRoot(String filePath) { + try { + InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath); + SAXReader saxReader = new SAXReader(); + return saxReader.read(resourceAsStream).getRootElement(); + } catch (DocumentException e) { + throw new RuntimeException("初始化文件异常", e); + } + } + + public static boolean isEmpty(Object obj) { + if (obj instanceof String) + return obj == null || obj.equals(""); + else + return obj == null; + } +} diff --git a/group17/785396327/3.5/struts/View.java b/group17/785396327/3.5/struts/View.java new file mode 100644 index 0000000000..a02a5d1216 --- /dev/null +++ b/group17/785396327/3.5/struts/View.java @@ -0,0 +1,26 @@ +package struts; + +import java.util.Map; + +/** + * Created by IBM on 2017/3/4. + */ +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group17/785396327/3.5/struts/struts.xml b/group17/785396327/3.5/struts/struts.xml new file mode 100644 index 0000000000..0c69b730f3 --- /dev/null +++ b/group17/785396327/3.5/struts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group17/82427129/.gitignore b/group17/82427129/.gitignore new file mode 100644 index 0000000000..1eb8f0a53f --- /dev/null +++ b/group17/82427129/.gitignore @@ -0,0 +1,16 @@ + +/.metadata/ + +/RemoteSystemsTempFiles/ + + + +/JavaUtil/.settings/ + +/JavaUtil/target/ + + + +.classpath + +.project diff --git a/group17/82427129/JavaUtil/pom.xml b/group17/82427129/JavaUtil/pom.xml new file mode 100644 index 0000000000..fb857bcd00 --- /dev/null +++ b/group17/82427129/JavaUtil/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + com.coding.basic + JavaUtil + 0.0.1-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.7 + 1.7 + + + + + + + junit + junit + 4.7 + test + + + dom4j + dom4j + 1.6.1 + + + \ No newline at end of file diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/array/ArrayUtil.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..0863147d8c --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/array/ArrayUtil.java @@ -0,0 +1,343 @@ +package com.coderising.array; + +import java.util.Arrays; + +import com.coding.basic.ArrayList; +import com.coding.basic.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public static int[] reverseArray(int[] origin){ + int length = origin.length; + if(length <= 1) + return origin; + + int[] newArray = new int[length]; + for (int i = 0; i < length; i++) { + newArray[i] = origin[length-i-1]; + } + return newArray; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray){ + int length = oldArray.length; + if(length == 0) + return oldArray; + + int[] newArray = new int[length]; + int oi = 0; + int ni = 0; + while(oi < length){ + if(oldArray[oi] == 0){ + oi++; + }else{ + newArray[ni++] = oldArray[oi++]; + } + } + if(ni == 0) + return null;//输入的数组全部都是0时 + if(ni == length) + return newArray;//输入的数组不含0时,不需要截取 + + return Arrays.copyOf(newArray, ni); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2){//时间复杂度O(n) + int length1 = array1.length; + int length2 = array2.length; + if(length1 == 0 ||(length1 == 0 && length2 ==0)){ + return array2; + } + if(length2 == 0){ + return array1; + } + + int i1 = 0;//始终指向array1中剩余的最小元素 + int i2 = 0;//始终指向array2中剩余的最小元素 + ArrayList stack = new ArrayList();//“过去的”最小值放入栈中 + + while (i1 < length1 || i2 < length2){//判定,只要还有一个数组中有未入栈元素 + if(i1 == length1){//判定,array1元素都已经入栈 + stack.add(array2[i2++]); + continue; + } + if(i2 == length2){//判定,array2元素都已经入栈 + stack.add(array1[i1++]); + continue; + } + + int comRes = compare(array1[i1], array2[i2]); + if(comRes > 0){ + stack.add(array2[i2++]); + }else if(comRes <0){ + stack.add(array1[i1++]); + }else{ + stack.add(array1[i1]); + i1++; + i2++; + } + } + + int[] result = new int[stack.size()]; + for (int i = 0; i < stack.size(); i++) { + result[i] = (int) stack.get(i); + } + return result; + } + /** + * when i < j returns -1; + * when i = j returns 0; + * when i > j returns 1; + * @param i + * @param j + * @return + */ + private static int compare(int i, int j){ + if(i < j){ + return -1; + }else if(i == j){ + return 0; + }else{ + return 1; + } + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length+size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + if(max <= 1) + return new int[0]; + + ArrayList l = new ArrayList(); + for (int i = 0; max>fibonacciNum(i); i++) { + l.add(fibonacciNum(i)); + } + + int[] result = new int[l.size()]; + for (int i = 0; i < l.size(); i++) { + result[i] = (int) l.get(i); + } + return result; + } + /** + * 私有方法 + * 根据 斐波那契数列 + * 通过下标获取数列元素 + * + * 例如 [1,1,2,3,5,8,13,...] fibonacciNum(1) = 1,fibonacciNum(4) = 3 + * @param index 下标 + * @return 斐波那契数列元素 + */ + private static int fibonacciNum(int index){ + if(index < 0 ) + throw new IndexOutOfBoundsException("下标越界,index>=0"); + + if(index == 0||index == 1) + return 1; + return fibonacciNum(index-1)+fibonacciNum(index-2); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public static int[] getPrimes(int max){ + if(max<2) + return new int[0]; + + ArrayList list = new ArrayList(); + for (int i = 0; i < max; i++) { + if(isPrimeNum(i)) + list.add(i); + } + + int[] result = new int[list.size()]; + for (int i = 0; i < result.length; i++) { + result[i] = (int) list.get(i); + } + return result; + } + /** + * 判断一个整数是否是质数 + * @param num + * @return + */ + private static boolean isPrimeNum(int num){ + if(num < 2)//质数都是正数,并且大于等于2 + return false; + + for (int i = 2; i <= Math.sqrt(num); i++) { + if(num % i ==0){ + return false; + } + } + return true; + + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max){ + ArrayList list = new ArrayList(); + for (int i = 6; i < max; i++) { + if(isPerfectNumber(i)) + list.add(i); + } + + int[] result = new int[list.size()]; + for (int i = 0; i < result.length; i++) { + result[i] = (int) list.get(i); + } + return result; + } + /** + * 判断一个整数是否是完数 + * + * 因为所有的完数都是三角形数,所有我们通过遍历三角形数判断,如果是三角形数,再判断是否所有因子的积为这个整数 + * @param num + * @return + */ + private static boolean isPerfectNumber(int num){ + if(num < 6)// the first perfect number is 6 + return false; + if(!isEndWith6or8(num))//perfect number is only end with 6 or 8 + return false; + + /*if(!isTriangularNumber(num)) + return false;*/ + + List list = new ArrayList(); + + double sqr = Math.sqrt(num); + list.add(1); + for (int i = 2; i <= sqr; i++) { + if(num % i == 0){ + list.add(num/i); + list.add(i); + } + if(i == sqr){ + list.add(i); + break; + } + } + int sum = 0; + for (int i = 0; i < list.size(); i++) { + Integer in = (Integer) list.get(i); + sum += in; + } + if(sum == num) + return true; + else + return false; + } + + private static boolean isEndWith6or8(int num){ + if(num == 6) + return true; + + Integer integer = new Integer(num); + String string = integer.toString(); + String lastIndex = string.substring(string.length()-1); + if(lastIndex.equals("6") || lastIndex.equals("8")) + return true; + else + return false; + } + private static boolean isTriangularNumber(int num){ + if(num < 1 ) + return false; + + int i = 0; + while(triangularNumber(i)<=num){ + if(triangularNumber(i)==num) + return true; + i++; + } + + return false; + } + /** + * 获取三角形数,从数列中获取。 + * [1,3,6,10,...] 下标从0开始,例如triangularNumber(0) = 1,triangularNumber(1) = 3,triangularNumber(2)=6 + * @param index + * @return + */ + private static int triangularNumber(int index){ + if(index < 0) + throw new IndexOutOfBoundsException("下标越界,index>=0"); + if(index == 0) + return 1; + return triangularNumber(index-1)+index+1; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator){ + if(array == null) + return null; + if(array.length == 0) + return ""; + + String result = String.valueOf(array[0]); + for (int i = 1; i < array.length; i++) { + result += seperator + array[i]; + } + return result; + } + + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/LoginAction.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/Struts.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..eb57a106ef --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/Struts.java @@ -0,0 +1,149 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + + private static SAXReader reader = new SAXReader(); + private static Document document; + private static Element root; + private static List actionList; + static{ + try { + document = reader.read(new File("src/main/resources/liteStruts.xml")); + } catch (DocumentException e) { + e.printStackTrace(); + } + root = document.getRootElement(); + actionList = root.elements("action"); + } + + /* + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + */ + public static View runAction(String actionName, Map parameters) { + + if(actionName == null || actionName.equals("")){ + System.out.println("请求名为空,错误!"); + return null; + } + + View view = new View(); + + String className = null; + try { + Map actionInfo = getActionInfo(actionName); + + className = actionInfo.get("className"); + Class actionClass = Class.forName(className); + Object obj =actionClass.newInstance(); + for(Map.Entry entry : parameters.entrySet()){ + Method setMethod = actionClass.getDeclaredMethod(("set"+toUpperCaseFirstLetter(entry.getKey())), String.class); + setMethod.invoke(obj, entry.getValue()); + } + Method execute = actionClass.getDeclaredMethod("execute"); + String msg = (String) execute.invoke(obj); + view.setJsp(actionInfo.get(msg)); + + Method[] m = actionClass.getMethods(); + Map map = new HashMap(); + for (Method method : m) { + String methodName = method.getName(); + if(methodName.startsWith("get") + && !methodName.endsWith("Class") + && method.getParameterTypes().length == 0){ + map.put(toSubString_LowerCaseFirstLetter(methodName), method.invoke(obj)); + } + } + view.setParameters(map); + + return view; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } + + return null; + } + private static Map getActionInfo(String actionName){ + + HashMap hashMap = new HashMap(); + + for (Element action : actionList) { + Attribute attr = action.attribute("name"); + if(actionName.equals(attr.getStringValue())){ + Attribute attrClass = action.attribute("class"); + String className = attrClass.getStringValue(); + hashMap.put("className", className); + + @SuppressWarnings("unchecked") + List resultList = action.elements("result"); + for (Element result : resultList) { + Attribute attrResult = result.attribute("name"); + hashMap.put(attrResult.getStringValue(), result.getText()); + } + break; + } + } + return hashMap; + } + + /** + * return a String upcased the first letter + * @param param + * @return + */ + private static String toUpperCaseFirstLetter(String param){ + if(param == null || param.length() == 0) + return ""; + if(param.length() == 1) + return param.substring(0, 1).toUpperCase(); + + return param.substring(0, 1).toUpperCase()+param.substring(1); + } + private static String toSubString_LowerCaseFirstLetter(String param){ + if(!param.startsWith("get")) + return null; + int length = param.length(); + if(length < 4) + return ""; + + param = param.substring(3); + return param.substring(0, 1).toLowerCase()+param.substring(1); + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/View.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..9bf15ab8de --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..e75b9f3634 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java @@ -0,0 +1,114 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData; + + private static Object[] EMPTY_ELEMENTDATA = {}; + + private static int INITIALCAPACITY = 10; + + public ArrayList(){ + elementData = EMPTY_ELEMENTDATA; + } + + public ArrayList(int initialCapacity){ + elementData = new Object[INITIALCAPACITY]; + } + + public void add(Object o){ + ensureCapacity(size+1); + elementData[size++] = o; + } + + public void add(int index, Object o){ + rangeCheckForAdd(index); + + ensureCapacity(size+1); + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + } + + public Object set(int index, Object o){ + elementIndexCheck(index); + + Object oldValue = elementData[index]; + elementData[index] = o; + return oldValue; + } + + public E get(int index){ + elementIndexCheck(index); + return elementData(index); + } + + @SuppressWarnings("unchecked") + E elementData(int index){ + return (E) elementData[index]; + } + + public E remove(int index){ + elementIndexCheck(index); + E oldValue = elementData(index); + int movedLength = size - index - 1; + if(movedLength > 0)//当要删除最后一个元素时,不需要移动数组,只需要把最后一个元素置null + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + elementData[--size] = null; + return oldValue; + } + /** + * range check, + * permit the range [0,size] + * @param index + */ + private void rangeCheckForAdd(int index){ + if( index > size || index<0 ){ + throw new IndexOutOfBoundsException(outofIndex(index)); + } + } + /** + * element's index check, + * permit the index [0,size) + * @param index + */ + private void elementIndexCheck(int index){ + if( index >= size || index < 0){ + throw new IndexOutOfBoundsException(outofIndex(index)); + } + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + + private void ensureCapacity(int minCapacity){ + if(elementData == EMPTY_ELEMENTDATA){ + minCapacity = Math.max(minCapacity, INITIALCAPACITY);//针对addall首次增加的数量就比INITIALCAPACITY多 + } + if(minCapacity - elementData.length > 0){ + grow(minCapacity); + } + } + + private void grow(int minCapcity){ + int oldCapacity = elementData.length; + int newCapcity = oldCapacity + (oldCapacity>>1); + if(newCapcity - minCapcity < 0){ + newCapcity = minCapcity; + } + elementData = Arrays.copyOf(elementData, newCapcity); + } + + private String outofIndex(int index){ + return "Index: "+index+", Size: "+size; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/BinaryTreeNode.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..f9934963e7 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java @@ -0,0 +1,189 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + private int size = 0; + + private Node first; + + private Node last; + + public void add(E o){ + add(size,o); + } + public void add(int index , E o){ + rangeCheck(index); + + if(index == size){ + linkLast(o); + }else{ + linkBefore(o, indexOf(index)); + } + } + private void linkBefore(E o ,Node succ){ + final Node prev = succ.prev; + final Node newNode = new Node(prev, o, succ); + succ.prev = newNode; + if(prev == null){ + first = newNode; + }else{ + prev.next = newNode; + } + size++; + } + private void linkLast(E o){ + final Node succ = last; + final Node newNode = new Node(succ, o, null); + last = newNode; + if(succ == null){ + first = newNode; + }else{ + succ.next = newNode; + } + size++; + } + /** + * range check, + * permit the range [0,size] + * @param index + */ + private void rangeCheck(int index) { + if(index > size|| index < 0 ) + throw new IndexOutOfBoundsException("Size"+size+":index"+index); + } + /** + * element's index check, + * permit the index [0,size) + * @param index + */ + private void elementIndexCheck(int index){ + if(index >=size||index < 0) + throw new IndexOutOfBoundsException("Size"+size+":index"+index); + } + /** + * + * @param index + * @return + */ + private Node indexOf(int index){ + if(index < (this.size>>1) ){ + Node x = first; + for (int i = 0; i < index; i++) { + x = x.next; + } + return x; + }else{ + Node x = last; + for (int i = this.size-1; i > index; i--) { + x = x.prev; + } + return x; + } + } + + public E get(int index){ + elementIndexCheck(index); + + return indexOf(index).data; + } + public E remove(int index){ + elementIndexCheck(index); + + if(index == 0){ + return removeFirst(); + }else if(index == size) { + return removeLast(); + }else{ + return unlinkNode(indexOf(index)); + } + } + + private E unlinkNode(Node node) { + final Node next = node.next; + final Node prev = node.prev; + final E element = node.data; + if(next == null){ + last = node; + }else{ + next.prev = node; + node.next = next; + } + if(prev == null){ + first = node; + }else{ + prev.next = node; + node.prev = prev; + } + size--; + node.data = null; + + return element; + } + public int size(){ + return size; + } + + public void addFirst(E o){ + linkBefore(o, first); + } + + public void addLast(E o){ + linkLast(o); + } + + public E removeFirst(){ + if(first == null) + throw new NoSuchElementException("first is null"); + + E oldData = first.data; + final Node next = first.next; + first.data = null; + first.next = null;//GC + first = next; + + if(next == null){ + last = null; + }else{ + next.prev = null; + } + size--; + + return oldData; + } + + public E removeLast(){ + if(last == null) + throw new NoSuchElementException("last is null"); + + E oldData = last.data; + final Node prev = last.prev; + last.prev = null; + last.data = null;//GC + last = prev; + + if(prev == null){ + first = null; + }else{ + prev.next = null; + } + size--; + + return oldData; + } + + public Iterator iterator(){ + return null; + } + + private static class Node{ + E data; + Node next; + Node prev; + Node(Node prev,E data,Node next){ + this.data = data; + this.next = next; + this.prev = prev; + } + } +} \ No newline at end of file diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java new file mode 100644 index 0000000000..8b16cc0263 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java @@ -0,0 +1,25 @@ +package com.coding.basic; + +/** + * 代码进行了多次重构,按照JDK源码的思路进行编写,
+ *
+ * 重点1:rangeCheck和elementIndexCheck 完全管理了所有的Index的检测工作,这一点就 省去了其他地方关于下标是否越界的检测
+ *
+ * 重点2:arrayList的elementData(int i)以及LinkedList的node(int i)方法通过重构统一了通过下标获取元素的操作
+ * + * @author Walker + * + * @param + */ +public interface List { + + void add(E o); + + void add(int index, E o); + + Object get(int index); + + Object remove(int index); + + int size(); +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Queue.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Queue.java new file mode 100644 index 0000000000..b54ff5f56b --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Queue.java @@ -0,0 +1,21 @@ +package com.coding.basic; + +public class Queue { + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.addLast(o); + } + + public Object deQueue(){ + return elementData.removeLast(); + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java new file mode 100644 index 0000000000..7c00e1950c --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + int length = size(); + Object lastData = peek(); + elementData.remove(length - 1); + + return lastData; + } + + public Object peek(){ + if(size()<=0) + throw new EmptyStackException(); + + return elementData.get(size()-1); + } + public boolean isEmpty(){ + return size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group17/82427129/JavaUtil/src/main/resources/liteStruts.xml b/group17/82427129/JavaUtil/src/main/resources/liteStruts.xml new file mode 100644 index 0000000000..6f23f0a83d --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/resources/liteStruts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group17/82427129/JavaUtil/src/test/java/com/coderising/array/ArrayUtilTest.java b/group17/82427129/JavaUtil/src/test/java/com/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..55f75f4047 --- /dev/null +++ b/group17/82427129/JavaUtil/src/test/java/com/coderising/array/ArrayUtilTest.java @@ -0,0 +1,80 @@ +package com.coderising.array; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverseArray() { + int[] a = {7, 9 , 30, 3}; + int[] ra = {3, 30, 9,7}; + int[] reverseArray = ArrayUtil.reverseArray(a); + Assert.assertArrayEquals(ra, reverseArray); + } + + @Test + public void testRemoveZero() { + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5}; + Assert.assertArrayEquals(newArr, ArrayUtil.removeZero(oldArr)); + } + + @Test + public void testMerge() { + int[] a1 = {3,5,7,8}; + int[] a2 = {4,5,6,7}; + int[] a3 = {3,4,5,6,7,8}; + Assert.assertArrayEquals(a3, ArrayUtil.merge(a1, a2)); + } + + @Test + public void testGrow() { + int[] oldArray = {2,3,6}; + int[] newArray = {2,3,6,0,0,0,0}; + Assert.assertArrayEquals(newArray, ArrayUtil.grow(oldArray, 4)); + } + + @Test + public void testFibonacci() { + int max = 15; + int[] fibonacci = ArrayUtil.fibonacci(max); + int[] f = {1,1,2,3,5,8,13}; + Assert.assertArrayEquals(f, fibonacci); + } + + @Test + public void testGetPrimes() { + int max = 23; + int[] primes = ArrayUtil.getPrimes(max); + int[] expecteds = {2,3,5,7,11,13,17,19}; + Assert.assertArrayEquals(expecteds, primes); + } + + @Test + public void testGetPerfectNumbers() { + int max = 8129; + int[] perfectNumbers = ArrayUtil.getPerfectNumbers(max); + int[] expected = {6,28,496,8128}; + Assert.assertArrayEquals(expected, perfectNumbers); + } + + @Test + public void testJoin() { + int[] array = {3,8,9}; + String sep = "-"; + String join = ArrayUtil.join(array, sep); + Assert.assertEquals("3-8-9", join); + } + +} diff --git a/group17/82427129/JavaUtil/src/test/java/com/coderising/litestruts/StrutsTest.java b/group17/82427129/JavaUtil/src/test/java/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group17/82427129/JavaUtil/src/test/java/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/ArrayListTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..9e6cc7c98e --- /dev/null +++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/ArrayListTest.java @@ -0,0 +1,64 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ArrayListTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testArrayList() { + fail("Not yet implemented"); + } + + @Test + public void testArrayListInt() { + fail("Not yet implemented"); + } + + @Test + public void testAddObject() { + fail("Not yet implemented"); + } + + @Test + public void testAddIntObject() { + fail("Not yet implemented"); + } + + @Test + public void testSet() { + fail("Not yet implemented"); + } + + @Test + public void testGet() { + fail("Not yet implemented"); + } + + @Test + public void testRemove() { + fail("Not yet implemented"); + } + + @Test + public void testSize() { + fail("Not yet implemented"); + } + + @Test + public void testIterator() { + fail("Not yet implemented"); + } + +} diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/LinkedListTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..f8dd1280e1 --- /dev/null +++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/LinkedListTest.java @@ -0,0 +1,81 @@ +package com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class LinkedListTest { + private LinkedList list; + + @Before + public void setUp() throws Exception { + list = new LinkedList(); + } + + @After + public void tearDown() throws Exception { + list = null; + } + + @Test + public void testAddObject() { + list.add(100); + Assert.assertEquals(1, list.size()); + list.add(100); + Assert.assertEquals(2, list.size()); + list.add(100); + Assert.assertEquals(3, list.size()); + } + + @Test + public void testAddIntObject() { + for (int i = 0; i < 5; i++) { + list.add(i, i); + } + Assert.assertEquals(5, list.size()); + } + + @Test + public void testGet() { + + } + + @Test + public void testRemove() { + fail("Not yet implemented"); + } + + @Test + public void testSize() { + fail("Not yet implemented"); + } + + @Test + public void testAddFirst() { + fail("Not yet implemented"); + } + + @Test + public void testAddLast() { + fail("Not yet implemented"); + } + + @Test + public void testRemoveFirst() { + fail("Not yet implemented"); + } + + @Test + public void testRemoveLast() { + fail("Not yet implemented"); + } + + @Test + public void testIterator() { + fail("Not yet implemented"); + } + +} diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/Test.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/Test.java new file mode 100644 index 0000000000..d1b4b9935a --- /dev/null +++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/Test.java @@ -0,0 +1,14 @@ +package com.coding.basic; + +public class Test { + public static void main(String[] args) { + System.out.println(new A().e == new A().e); + } +} +class A{ + public A() { + e = E; + } + Object[] e; + static Object[] E = {}; +} diff --git a/group17/865797761/.classpath b/group17/865797761/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group17/865797761/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group17/865797761/.gitignore b/group17/865797761/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group17/865797761/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group17/865797761/.project b/group17/865797761/.project new file mode 100644 index 0000000000..a78673e93c --- /dev/null +++ b/group17/865797761/.project @@ -0,0 +1,17 @@ + + + 865797761 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group17/865797761/.settings/org.eclipse.jdt.core.prefs b/group17/865797761/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group17/865797761/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group17/865797761/src/Collection/ArrayList.java b/group17/865797761/src/Collection/ArrayList.java new file mode 100644 index 0000000000..2e9b68d0ea --- /dev/null +++ b/group17/865797761/src/Collection/ArrayList.java @@ -0,0 +1,135 @@ +package Collection ; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +/** + Created by william on 2017/2/25. + */ +public class ArrayList implements List { + private static final int DEFAULT_CAPACITY = 10; + private int size; + private Object[] elementData; + + public ArrayList() { + elementData = new Object[DEFAULT_CAPACITY]; + } + + public ArrayList(int initialCapacity) { + if (initialCapacity < 0) + throw new RuntimeException("ǷʼС!"); + elementData = new Object[initialCapacity]; + } + + public boolean add(T ele) { + grow(); + elementData[size] = ele; + size++; + return true; + } + + public T get(int index) { + checkBounds(index); + return (T) elementData[index]; + } + + public T remove(int index) { + checkBounds(index); + T removeEle = (T) elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index); + size--; + return removeEle; + } + + public boolean add(int index, T ele) { + checkBounds(index); + size++;//ЧԪȼӣ֤ȼgrowǰЧ + grow(); + //ԭӴindexȡԭindexЧֵƵԭindex+1֮ + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = ele; + return true; + } + + @Override + public boolean remove(T ele) { + int index; + if ((index = indexOf(ele)) == -1) + return false; + remove(index); + return true; + } + + private void checkBounds(int index) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); + } + + public int size() { + return size; + } + + private void grow() { + if (size >= elementData.length) { + int curLen = elementData.length; + int newLen = curLen + (curLen >> 1) > Integer.MAX_VALUE ? Integer.MAX_VALUE : curLen + (curLen >> 1); + elementData = Arrays.copyOf(elementData, newLen); + } + } + + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean contains(T ele) { + return indexOf(ele) != -1; + } + + public int indexOf(T ele) { + for (int i = 0; i < size; i++) { + if (ele == null) + if (null == elementData[i]) + return i; + else if (ele.equals(elementData[i])) + return i; + } + return -1; + } + + public Iterator iterator() { + return new Itr(); + } + + private class Itr implements Iterator { + int cursor;//Ԫص± + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public T next() { + if (cursor >= size) + throw new NoSuchElementException(); + return (T) elementData[cursor++]; + } + + @Override + public void remove() { + if (cursor >= size) + throw new NoSuchElementException(); + ArrayList.this.remove(cursor--); + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("[ "); + for (Object ele : elementData) { + sb.append(ele).append(" "); + } + return sb.append("]").toString(); + } +} \ No newline at end of file diff --git a/group17/865797761/src/Collection/Iterable.java b/group17/865797761/src/Collection/Iterable.java new file mode 100644 index 0000000000..04955e1b6e --- /dev/null +++ b/group17/865797761/src/Collection/Iterable.java @@ -0,0 +1,6 @@ +package Collection; + +// +public interface Iterable { + Iterator iterator(); +} \ No newline at end of file diff --git a/group17/865797761/src/Collection/Iterator.java b/group17/865797761/src/Collection/Iterator.java new file mode 100644 index 0000000000..5ff4bbaf79 --- /dev/null +++ b/group17/865797761/src/Collection/Iterator.java @@ -0,0 +1,7 @@ +package Collection; + +public interface Iterator { + public boolean hasNext(); + + public E next(); +} \ No newline at end of file diff --git a/group17/865797761/src/Collection/List.java b/group17/865797761/src/Collection/List.java new file mode 100644 index 0000000000..eeef249f88 --- /dev/null +++ b/group17/865797761/src/Collection/List.java @@ -0,0 +1,14 @@ +package Collection; + +// +public interface List { + public void add(E o); + + public void add(int index, E o); + + public E get(int index); + + public E remove(int index); + + public int size(); +} \ No newline at end of file diff --git a/group17/865797761/src/Collection/MyArrayList.java b/group17/865797761/src/Collection/MyArrayList.java new file mode 100644 index 0000000000..50e2c24d01 --- /dev/null +++ b/group17/865797761/src/Collection/MyArrayList.java @@ -0,0 +1,110 @@ +package Collection; + +import java.util.Arrays; + +public class MyArrayList implements List, Iterable { + private Object[] elementData; + private static final int DEFAULT_SIZE = 10; + private int size; + + public MyArrayList() { + this(DEFAULT_SIZE); + } + + public MyArrayList(int initSize) { + if (initSize < 0) { + throw new IllegalArgumentException(initSize + " < 0"); + } + if (initSize == 0) { + elementData = new Object[DEFAULT_SIZE]; + } + else { + elementData = new Object[initSize]; + } + size = 0; + } + + public void add(E o) { + growIfNeed(); + elementData[size++] = o; + } + + public void add(int index, E o) { + if (index < 0 || index > size) { + throw new IllegalArgumentException("index:" + index); + } + growIfNeed(); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + @SuppressWarnings("unchecked") + public E get(int index) { + rangeCheck(index); + return (E) elementData[index]; + } + + public E remove(int index) { + rangeCheck(index); + E target = get(index); + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return target; + } + + public int size() { + return size; + } + + private void rangeCheck(int index) { + if (index >= size) { + throw new NoSuchElementException("index:" + index); + } + } + + private void growIfNeed() { + if (size == elementData.length) + grow(); + } + + private void grow() { + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + + @Override + public Iterator iterator() { + return new ArrayIterator<>(); + } + + private class ArrayIterator implements Iterator { + private int currentPos = 0; + + @Override + public boolean hasNext() { + return currentPos < size; + } + + @SuppressWarnings("unchecked") + @Override + public E next() { + rangeCheck(currentPos); + return (E) elementData[currentPos++]; + } + + } + + @Override + public String toString() { + return Arrays.toString(Arrays.copyOf(elementData, size)); + } + +} + +class NoSuchElementException extends RuntimeException { + + public NoSuchElementException(String string) { + super(string); + } + +} \ No newline at end of file diff --git a/group17/865797761/src/Collection/MyLinkedList.java b/group17/865797761/src/Collection/MyLinkedList.java new file mode 100644 index 0000000000..cf7495ab4e --- /dev/null +++ b/group17/865797761/src/Collection/MyLinkedList.java @@ -0,0 +1,144 @@ +package Collection; + +public class MyLinkedList implements List, Iterable { + private Node head; + private int size; + + public MyLinkedList() { + size = 0; + } + + public void add(E o) { + if (head == null) + addFirst(o); + else + addLast(o); + } + + public void addFirst(E o) { + Node oldFirst = head; + head = new Node<>(o, oldFirst); + size++; + } + + public void addLast(E o) { + if (head == null) { + addFirst(o); + } + else { + Node oldLast = movePtrTo(size - 1); + oldLast.next = new Node<>(o, null); + size++; + } + + } + + public void add(int index, E o) { + if (index > size || index < 0) { + throw new IllegalArgumentException("index:" + index); + } + if (index == 0) { + addFirst(o); + return; + } + Node temp = movePtrTo(index - 1); + Node oldNext = temp.next; + Node newNext = new Node<>(o, oldNext); + temp.next = newNext; + size++; + } + + public E remove(int index) { + rangeCheck(index); + E data; + if (index == 0) { + data = head.data; + head = head.next; + } + else { + Node pre = movePtrTo(index - 1); + Node target = pre.next; + pre.next = target.next; + data = target.data; + } + size--; + return data; + } + + public E get(int index) { + rangeCheck(index); + return movePtrTo(index).data; + } + + public int size() { + return size; + } + + private Node movePtrTo(int index) { + Node resultNode = head; + for (int i = 0; i < index; i++) { + resultNode = resultNode.next; + } + return resultNode; + } + + private void rangeCheck(int index) { + if (index >= size) { + throw new NoSuchElementException("index:" + index); + } + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder('['); + Node temp = head; + while (temp != null) { + stringBuilder.append(String.valueOf(temp.toString()) + ","); + temp = temp.next; + } + stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length()); + stringBuilder.append(']'); + return stringBuilder.toString(); + } + + private static class Node { + private T data; + private Node next; + + public Node(T data, Node next) { + this.data = data; + this.next = next; + } + + @Override + public String toString() { + return data.toString(); + } + } + + @Override + public Iterator iterator() { + return new ListIterator(); + } + + private class ListIterator implements Iterator { + Node currentNode; + + public ListIterator() { + currentNode = head; + } + + @Override + public boolean hasNext() { + return currentNode.next != null; + } + + @Override + public E next() { + Node temp = currentNode; + currentNode = currentNode.next; + return temp.data; + } + + } +} diff --git a/group17/865797761/src/Collection/MyQueue.java b/group17/865797761/src/Collection/MyQueue.java new file mode 100644 index 0000000000..f24535e6be --- /dev/null +++ b/group17/865797761/src/Collection/MyQueue.java @@ -0,0 +1,34 @@ +package Collection; + +public class MyQueue { + private MyLinkedList elementData = new MyLinkedList<>(); + + public void enQueue(T o) { + elementData.addLast(o); + } + + public T deQueue() { + if (!isEmpty()) { + return elementData.remove(0); + } + throw new QueueIsEmptyException(); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} + +class QueueIsEmptyException extends RuntimeException { + public QueueIsEmptyException() { + super(); + } + + public QueueIsEmptyException(String string) { + super(string); + } +} \ No newline at end of file diff --git a/group17/876385982/.classpath b/group17/876385982/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group17/876385982/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group17/876385982/.gitignore b/group17/876385982/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group17/876385982/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group17/876385982/.project b/group17/876385982/.project new file mode 100644 index 0000000000..4062c6c28f --- /dev/null +++ b/group17/876385982/.project @@ -0,0 +1,17 @@ + + + 876385982 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group17/876385982/src/test/Test.java b/group17/876385982/src/test/Test.java new file mode 100644 index 0000000000..b023a3ea07 --- /dev/null +++ b/group17/876385982/src/test/Test.java @@ -0,0 +1,10 @@ +package test; + +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + System.out.println("Test!"); + } + +} diff --git a/group17/article/20170226-20170305.md b/group17/article/20170226-20170305.md new file mode 100644 index 0000000000..77e9b85142 --- /dev/null +++ b/group17/article/20170226-20170305.md @@ -0,0 +1,56 @@ +# 自由写作 + +## 须知 +--- + +交作业时请在QQ 号后面填上各自的文章链接, 比如: + +51075907 http://m.blog.csdn.net/article/details?id=57083764 + +## 文章 +--- + +1204187480 + +102228177 + +876385982 + +785396327 + +1059107701 + +240094626 + +82427129 + +296910598 + +1264835468 http://www.jianshu.com/p/634ca8cdd6e3 + +516886559 + +1282579502 https://www.evernote.com/shard/s413/sh/142601dd-edc3-4e37-871e-37a7489d7634/a092bf080e1aefbaeab96d34edac8cf0 + +614982500 + +865797761 + +1540186032 + +176653813 + +116665530 + +51075907 + +1158154002 + +345450234 + +919764878 + +1368331120 + +517970312 + diff --git a/group17/article/template.md b/group17/article/template.md new file mode 100644 index 0000000000..d92ffef426 --- /dev/null +++ b/group17/article/template.md @@ -0,0 +1,56 @@ +# XXXX + +## 须知 +--- + +交作业时请在QQ 号后面填上各自的文章链接, 比如: + +51075907 http://m.blog.csdn.net/article/details?id=57083764 + +## 文章 +--- + +1204187480 + +102228177 + +876385982 + +785396327 + +1059107701 + +240094626 + +82427129 + +296910598 + +1264835468 + +516886559 + +1282579502 + +614982500 + +865797761 + +1540186032 + +176653813 + +116665530 + +51075907 + +1158154002 + +345450234 + +919764878 + +1368331120 + +517970312 + diff --git "a/group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md" "b/group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md" new file mode 100644 index 0000000000..df34ed9d6d --- /dev/null +++ "b/group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md" @@ -0,0 +1,56 @@ +# 写一篇文章介绍cpu, 内存, 磁盘, 指令以及他们之间的关系 + +## 须知 +--- + +交作业时请在QQ 号后面填上各自的文章链接, 比如: + +51075907 http://m.blog.csdn.net/article/details?id=57083764 + +## 文章 +--- + +1204187480 + +102228177 http://note.youdao.com/noteshare?id=74a51e7f93461dfb77c69a1cf4755624&sub=004F10FA5D2046ABAA060F19C0D2A18F + http://note.youdao.com/noteshare?id=6d117ad0ead79eafee2a5308c00d6a3a + +876385982 http://www.totoro-fly.com/?p=59 + +785396327 + +1059107701 + +240094626 http://note.youdao.com/noteshare?id=d129c169ed611f6099b96e8e0f3f5c51 + +82427129 http://blog.csdn.net/walk_er/article/details/57406278 ;http://blog.csdn.net/walk_er/article/details/60475450 + +296910598 + +1264835468 http://www.jianshu.com/p/191d731ec00a + +516886559 + +1282579502 (文章1)https://www.evernote.com/shard/s413/sh/3af5f6a4-a580-4a49-b63c-90f5b178aca4/7cf052e3789c862e38d6d6b3cce1ceed (文章2)https://www.evernote.com/shard/s413/sh/142601dd-edc3-4e37-871e-37a7489d7634/a092bf080e1aefbaeab96d34edac8cf0 + +614982500 + +865797761 + +1540186032 http://blog.csdn.net/mpx_xb/article/details/56679603 + +176653813 + +116665530 + +51075907 http://m.blog.csdn.net/article/details?id=57083764 + +1158154002 http://blog.csdn.net/shengren12/article/details/57400858 + +345450234 + +919764878 + +1368331120 + +517970312 diff --git a/group17/count/homework.md b/group17/count/homework.md new file mode 100644 index 0000000000..c37e964c5e --- /dev/null +++ b/group17/count/homework.md @@ -0,0 +1,21 @@ +# 作业统计 + +## 须知 +--- + +日期下面的链接是每次作业的统计, 大家作业完成后点击链接即可进入文档页面填写. + +## 文档 +--- + +### 20170219-20170226 + +[文章统计](https://github.com/luoziyihao/coding2017/blob/master/group17/article/%E5%86%99%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E4%BB%8B%E7%BB%8Dcpu%2C%20%E5%86%85%E5%AD%98%2C%20%E7%A3%81%E7%9B%98%2C%20%E6%8C%87%E4%BB%A4%E4%BB%A5%E5%8F%8A%E4%BB%96%E4%BB%AC%E4%B9%8B%E9%97%B4%E7%9A%84%E5%85%B3%E7%B3%BB_20170226.md) + +[作业统计](https://shimo.im/sheet/LQaZ3eVFgZYh8c1X/「第17组作业完成情况_2017...0226」) + +### 20170226-20170205 + +[文章统计](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170226-20170305.md) + +[作业统计](https://shimo.im/sheet/8T7YWAlIJpg6apn6/「第17组作业完成情况_2017...0305」) diff --git a/group17/group17.md b/group17/group17.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group17/group17.md @@ -0,0 +1 @@ + diff --git a/group18/1049843090/.classpath b/group18/1049843090/.classpath new file mode 100644 index 0000000000..68a547a96e --- /dev/null +++ b/group18/1049843090/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/group18/1049843090/.gitignore b/group18/1049843090/.gitignore new file mode 100644 index 0000000000..117a0b15d5 --- /dev/null +++ b/group18/1049843090/.gitignore @@ -0,0 +1,7 @@ +*.idea +*.iml +*.eml +.settings/ +target/ +build/ +out/ \ No newline at end of file diff --git a/group18/1049843090/.project b/group18/1049843090/.project new file mode 100644 index 0000000000..978233664c --- /dev/null +++ b/group18/1049843090/.project @@ -0,0 +1,15 @@ + + + 1049843090 + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group18/1049843090/src/com/coderising/array/ArrayUtil.java b/group18/1049843090/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..23e5bd2215 --- /dev/null +++ b/group18/1049843090/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,197 @@ +package com.coderising.array; + + +import com.coding.basic.Queue; +import com.coding.basic.Stack; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if (isEmptyOrNull(origin)) { + return; + } + //solution 1 move element + //for (int i = 0; i <= origin.length >> 2; i++) { + // int temp = origin[i]; + // origin[i] = origin[origin.length - 1 - i]; + // origin[origin.length - 1 - i] = temp; + //} + + //solution 2 use Stack + Stack stack = new Stack<>(); + for (int i : origin) { + stack.push(i); + } + for (int i = 0; i < origin.length; i++) { + origin[i]=stack.pop(); + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + if (isEmptyOrNull(oldArray)) { + return null; + } + //solution 1 use Queue OR Stack + //Queue queue = new Queue<>(); + //for (int i : oldArray) { + // if (i != 0) { + // queue.enQueue(i); + // } + //} + //int[] newArray = new int[queue.size()]; + //for (int i = 0; i < newArray.length; i++) { + // newArray[i] = queue.deQueue(); + //} + //return newArray; + + + //solution 2 use Array + int[] tempArray = new int[oldArray.length]; + int index = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + tempArray[index++] = oldArray[i]; + } + } + int[] newArray = new int[index]; + System.arraycopy(tempArray,0,newArray,0,index); + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + + return null; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + if (isEmptyOrNull(oldArray)) { + return null; + } + int[] newArray = new int[oldArray.length + size]; + //solution 1 use System.arraycopy + //System.arraycopy(oldArray,0,newArray,0, oldArray.length); + + //solution 2 use loop + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator 分隔符 + * @return + */ + public String join(int[] array, String seperator) { + if (isEmptyOrNull(array)) { + return ""; + } + if (array.length < 2) { + return array[0] + ""; + } + StringBuffer stringBuffer = new StringBuffer(); + for (int i = 0; i < array.length - 1; i++) { + stringBuffer.append(array[i] + seperator); + } + stringBuffer.append(array[array.length - 1]); + return stringBuffer.toString(); + } + + /** + * 检查数组是否为空或者为null + * + * @param array + * @return + */ + private boolean isEmptyOrNull(int[] array) { + if (array == null || array.length == 0) { + return true; + } + return false; + } + + public static void main(String[] args) { + int[] a = {7,9,5}; + ArrayUtil arrayUtil = new ArrayUtil(); + arrayUtil.reverseArray(a); + for (int i : a) { + System.out.println(i); + } + } + +} \ No newline at end of file diff --git a/group18/1049843090/src/com/coding/basic/ArrayList.java b/group18/1049843090/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..f6b3007a7d --- /dev/null +++ b/group18/1049843090/src/com/coding/basic/ArrayList.java @@ -0,0 +1,148 @@ +package com.coding.basic; + +import java.util.Arrays; + +/** + * A Simple ArrayList + */ +public class ArrayList implements List { + + /** + * 当前list的元素个数 + */ + private int size; + + /** + * 默认数组大小 + */ + private static final int DEFAULT_CAPACITY = 10; + + /** + * 存储元素的数组 + */ + private Object[] elementData; + + /** + * 追加一个元素 + * + * @param e + */ + public void add(E e) { + grow(); + elementData[size++] = e; + } + + private void grow() { + if (elementData.length == size) { + elementData = Arrays.copyOf(elementData, size + 10); + } + } + + /** + * 插入一个元素到指定位置 + * + * @param index + * @param e + */ + public void add(int index, E e) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("下标越界"); + } + grow(); + int movedNum = size - index; + if (movedNum > 0) { + System.arraycopy(elementData, index, elementData, index + 1, movedNum); + } + elementData[index] = e; + size++; + } + + /** + * 获取指定位置的元素 + * + * @param index + * @return + */ + public E get(int index) { + checkIndex(index); + return getElement(index); + } + + + /** + * 删除指定位置的元素 + * + * @param index + * @return + */ + public E remove(int index) { + checkIndex(index); + E delEle = getElement(index); + int movedNum = size - index - 1;//是不是最后一个元素 + if (movedNum > 0) { + System.arraycopy(elementData, index + 1, elementData, index, movedNum); + } + elementData[--size] = null; + return delEle; + } + + private void checkIndex(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("下标越界"); + } + } + + private E getElement(int index) { + return (E) elementData[index]; + } + + /** + * list中元素的个数 + * + * @return + */ + public int size() { + return this.size; + } + + + public ArrayList() { + this.elementData = new Object[DEFAULT_CAPACITY]; + } + + public Iterator iterator() { + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + + private int cursor;//游标 + + private int lastRet = -1;//可被删除元素下标 + + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public E next() { + int i = cursor; + cursor++; + return (E) elementData[lastRet = i]; + } + + @Override + public void remove() { + if (lastRet < 0) { + throw new IllegalStateException(); + } + cursor = lastRet;//游标等于当前删除元素的下标 或者 cursor--; + ArrayList.this.remove(lastRet); + lastRet = -1;//重置可删元素下标 + + } + } + +} \ No newline at end of file diff --git a/group18/1049843090/src/com/coding/basic/BinaryTree.java b/group18/1049843090/src/com/coding/basic/BinaryTree.java new file mode 100644 index 0000000000..7f476b1d74 --- /dev/null +++ b/group18/1049843090/src/com/coding/basic/BinaryTree.java @@ -0,0 +1,95 @@ +package com.coding.basic; + + +/** + * + */ +public class BinaryTree { + + private Node root; + + public boolean insert(int data) { + Node newNode = new Node(data); + if (root == null) { + root = newNode; + return true; + } + + return add(data); + //return add(root,new Node(data)); + } + + private boolean add(Node currentNode,Node newNode) { + if (currentNode.data == newNode.data) { + return false; + } + if (currentNode.data < newNode.data) { + if (currentNode.right == null) { + currentNode.right = newNode; + return true; + } else { + return add(currentNode.right, newNode); + } + } + if (currentNode.left == null) { + currentNode.left = newNode; + return true; + } else { + return add(currentNode.left, newNode); + } + } + + private boolean add(int data) { + Node newNode = new Node(data); + boolean result = false; + Node cursorNode = root; + Node parentNode = null; + while (true) { + parentNode = cursorNode; + if (cursorNode.data == data) { + break; + } + if (cursorNode.data < data) { + cursorNode = cursorNode.right; + if (cursorNode == null) { + parentNode.right = newNode; + result = true; + break; + } + } else { + cursorNode = cursorNode.left; + if (cursorNode == null) { + parentNode.left = newNode; + result = true; + break; + } + } + } + return result; + } + + + private static class Node { + int data; + Node left, right; + + public Node(int data) { + this.data = data; + this.left = null; + this.right = null; + } + } + + public static void main(String[] args) { + BinaryTree binaryTree = new BinaryTree(); + binaryTree.insert(5); + binaryTree.insert(6); + binaryTree.insert(4); + binaryTree.insert(8); + binaryTree.insert(7); + binaryTree.insert(3); + + System.out.println("finsh"); + } + +} diff --git a/group18/1049843090/src/com/coding/basic/BinaryTreeNode.java b/group18/1049843090/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..20f90e9239 --- /dev/null +++ b/group18/1049843090/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,53 @@ +package com.coding.basic; + +/** + * Binary Tree + */ +public class BinaryTreeNode { + + /** + * 节点数据 + */ + private Object data; + /** + * 左节点 + */ + private BinaryTreeNode left; + /** + * 右节点 + */ + private BinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + return null; + } + + public BinaryTreeNode(Object o){ + this.setData(o); + } + +} \ No newline at end of file diff --git a/group18/1049843090/src/com/coding/basic/Iterator.java b/group18/1049843090/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..f4938a46c7 --- /dev/null +++ b/group18/1049843090/src/com/coding/basic/Iterator.java @@ -0,0 +1,26 @@ +package com.coding.basic; + +/** + * Iterator + */ +public interface Iterator { + + /** + * 可迭代对象是否还有值 + * + * @return + */ + boolean hasNext(); + + /** + * 返回迭代对象的下一个元素 + * + * @return + */ + E next(); + + /** + * 移除当前元素 + */ + void remove(); +} \ No newline at end of file diff --git a/group18/1049843090/src/com/coding/basic/LinkedList.java b/group18/1049843090/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..7b4a378301 --- /dev/null +++ b/group18/1049843090/src/com/coding/basic/LinkedList.java @@ -0,0 +1,238 @@ +package com.coding.basic; + +import java.util.NoSuchElementException; + +/** + * A Simple LinkedList + * + * @param element + */ +public class LinkedList implements List { + /** + * 链表head + */ + private Node head; + + + /** + * 链表中元素的个数 + */ + private int size; + + + /** + * 追加一个元素到链表尾 + * + * @param e + */ + public void add(E e) { + Node newNode = new Node(e, null); + if (this.head == null) { + this.head = newNode; + } else { + Node end = index(size - 1); + end.next = newNode; + } + size++; + } + + /** + * 插入一个元素到链表指定位置 + * + * @param index + * @param e + */ + public void add(int index, E e) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("下标越界"); + } + if (index == 0) { + addFirst(e); + } else if (index == size) { + addLast(e); + } else { + Node indexNode = index(index); + Node next = indexNode.next; + Node newNode = new Node(e, next); + index(index - 1).next = newNode; + indexNode = null; + size++; + } + } + + /** + * 获取指定位置的元素 + * + * @param index + * @return + */ + public E get(int index) { + checkIndex(index); + return index(index).data; + } + + private void checkIndex(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("下标越界"); + } + } + + /** + * 移除指定位置的元素 + * + * @param index + * @return + */ + public E remove(int index) { + checkIndex(index); + if (index == 0) { + return removeFirst(); + } else if (index == (size - 1)) { + return removeLast(); + } else { + Node delNode = index(index); + E e = delNode.data; + Node prev = index(index - 1); + prev.next = index(index + 1); + delNode = null; + size--; + return e; + } + } + + /** + * 当前链表的元素个数 + * + * @return + */ + public int size() { + return this.size; + } + + /** + * 添加到链表的头 + * + * @param e + */ + public void addFirst(E e) { + Node newNode = new Node(e, null); + if (this.head != null) { + newNode.next = this.head; + } + this.head = newNode; + size++; + } + + /** + * 添加到链表的尾 + * + * @param e + */ + public void addLast(E e) { + Node newNode = new Node(e, null); + if (this.head == null) { + this.head = newNode; + } else { + Node end = index(size - 1); + end.next = newNode; + } + size++; + } + + /** + * 获取指定位置的节点 + * + * @param index + * @return + */ + private Node index(int index) { + Node node = this.head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node; + } + + /** + * 删除链表第一个元素 + * + * @return + */ + public E removeFirst() { + if (head == null) { + throw new NoSuchElementException(); + } + E e = head.data; + head = head.next; + size--; + return e; + } + + /** + * 删除链表最后一个元素 + * + * @return + */ + public E removeLast() { + if (head == null) { + throw new NoSuchElementException(); + } + Node end = index(size - 1); + E e = end.data; + end = null; + end = index(size - 2); + end.next = null; + size--; + return e; + } + + /** + * 节点数据 + * + * @param + */ + private static class Node { + //当前节点存储的数据 + E data; + //下一个节点 + Node next; + + public Node(E data, Node next) { + this.data = data; + this.next = next; + } + } + + public Iterator iterator(){ + return new LinkedListIterator<>(); + } + + private class LinkedListIterator implements Iterator{ + + private int cursor;//游标 + + private int lastRet = -1;//可被删除元素下标 + + @Override + public boolean hasNext() { + return cursor!=size; + } + + @Override + public E next() { + int i = cursor; + cursor++; + return (E) LinkedList.this.get(lastRet=i); + } + + @Override + public void remove() { + if(lastRet<0){ + throw new IllegalStateException(); + } + cursor = lastRet; + LinkedList.this.remove(lastRet); + lastRet = -1; + } + } +} \ No newline at end of file diff --git a/group18/1049843090/src/com/coding/basic/List.java b/group18/1049843090/src/com/coding/basic/List.java new file mode 100644 index 0000000000..962fcf4b77 --- /dev/null +++ b/group18/1049843090/src/com/coding/basic/List.java @@ -0,0 +1,46 @@ +package com.coding.basic; + +/** + * A Simple List Interface + */ +public interface List { + + /** + * 追加一个元素 + * + * @param e + */ + void add(E e); + + /** + * 插入一个元素到指定位置 + * + * @param index + * @param e + */ + void add(int index, E e); + + /** + * 获取指定位置元素 + * + * @param index + * @return + */ + E get(int index); + + /** + * 移除指定位置元素 + * + * @param index + * @return + */ + E remove(int index); + + + /** + * 当前List中元素的个数 + * + * @return + */ + int size(); +} \ No newline at end of file diff --git a/group18/1049843090/src/com/coding/basic/Queue.java b/group18/1049843090/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..94759f0b5b --- /dev/null +++ b/group18/1049843090/src/com/coding/basic/Queue.java @@ -0,0 +1,58 @@ +package com.coding.basic; + +/** + * A Simple Queue + */ +public class Queue { + + private LinkedList elementData; + + /** + * 入列 + * + * @param e + */ + public void enQueue(E e) { + elementData.addLast(e); + } + + /** + * 出列 + * + * @return + */ + public E deQueue() { + return elementData.removeFirst(); + } + + /** + * 查看第一个元素 + * + * @return + */ + public E peek() { + return elementData.size()==0?null:elementData.get(0); + } + + /** + * 队列是否有元素 + * + * @return + */ + public boolean isEmpty() { + return elementData.size() == 0; + } + + /** + * 队列中元素个数 + * + * @return + */ + public int size() { + return elementData.size(); + } + + public Queue() { + elementData = new LinkedList(); + } +} \ No newline at end of file diff --git a/group18/1049843090/src/com/coding/basic/Stack.java b/group18/1049843090/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..61561f1450 --- /dev/null +++ b/group18/1049843090/src/com/coding/basic/Stack.java @@ -0,0 +1,62 @@ +package com.coding.basic; + +import java.util.EmptyStackException; + +/** + * A Simple Stack + */ +public class Stack { + private ArrayList elementData; + + /** + * 压入栈顶 + * + * @param e + */ + public void push(E e) { + elementData.add(e); + } + + /** + * 取出栈顶元素 + * + * @return + */ + public E pop() { + return elementData.remove(elementData.size() - 1); + } + + /** + * 查看栈顶元素 + * + * @return + */ + public E peek() { + if(isEmpty()){ + throw new EmptyStackException(); + } + return elementData.get(elementData.size() - 1); + } + + /** + * 栈内是否有元素 + * + * @return + */ + public boolean isEmpty() { + return elementData.size() == 0; + } + + /** + * 栈顶内元素个数 + * + * @return + */ + public int size() { + return elementData.size(); + } + + public Stack() { + elementData = new ArrayList(); + } +} \ No newline at end of file diff --git a/group18/1049843090/test/com/coding/basic/ArrayListTest.java b/group18/1049843090/test/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..25b2a018df --- /dev/null +++ b/group18/1049843090/test/com/coding/basic/ArrayListTest.java @@ -0,0 +1,89 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * ArrayList Test + */ +public class ArrayListTest { + + ArrayList list; + + @Before + public void setUp() throws Exception { + list = new ArrayList<>(); + + } + + @After + public void tearDown() throws Exception { + list = null; + } + + @Test + public void add() throws Exception { + list.add("first"); + assertEquals("first", list.get(0)); + } + + @Test + public void add1() throws Exception { + list.add(0, "first"); + assertEquals("插入第一条", "first", list.get(0)); + list.add(0, "insert"); + assertEquals("插入第二条", "insert", list.get(0)); + list.add(2, "position_2"); + assertEquals("position_2", list.get(2)); + assertEquals(3, list.size()); + } + + @Test + public void get() throws Exception { + list.add("first"); + list.add("second"); + list.add("third"); + assertEquals("first", list.get(0)); + assertEquals("second", list.get(1)); + assertEquals("third", list.get(2)); + + } + + @Test + public void remove() throws Exception { + list.add("first"); + list.add("second"); + list.add("third"); + list.add("fourth"); + assertEquals("first", list.remove(0)); + assertEquals(3, list.size()); + assertEquals("third", list.remove(1)); + assertEquals("fourth", list.remove(1)); + assertEquals(1, list.size()); + + } + + @Test + public void size() throws Exception { + list.add("first"); + assertEquals(1,list.size()); + list.add("second"); + assertEquals( 2,list.size()); + } + + + @Test + public void iterator() throws Exception { + Iterator iterator = list.iterator(); + assertEquals(false,iterator.hasNext()); + list.add("A"); + assertEquals(true,iterator.hasNext()); + assertEquals("A",iterator.next()); + iterator.remove(); + assertEquals(0,list.size()); + } + +} \ No newline at end of file diff --git a/group18/1049843090/test/com/coding/basic/LinkedListTest.java b/group18/1049843090/test/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..fb962287d3 --- /dev/null +++ b/group18/1049843090/test/com/coding/basic/LinkedListTest.java @@ -0,0 +1,129 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * LinkedList Test + */ +public class LinkedListTest { + + LinkedList linkedList; + + @Before + public void setUp() throws Exception { + linkedList = new LinkedList<>(); + } + + @After + public void tearDown() throws Exception { + linkedList = null; + } + + @Test + public void add() throws Exception { + linkedList.add("first"); + linkedList.add("second"); + assertEquals(2, linkedList.size()); + + } + + @Test + public void add1() throws Exception { + linkedList.add(0, "first"); + linkedList.add(1, "second"); + assertEquals("first", linkedList.get(0)); + assertEquals("second", linkedList.get(1)); + assertEquals(2, linkedList.size()); + } + + @Test + public void get() throws Exception { + linkedList.add(0, "first"); + linkedList.add(1, "second"); + linkedList.add("third"); + assertEquals("first", linkedList.get(0)); + assertEquals("second", linkedList.get(1)); + assertEquals("third", linkedList.get(2)); + } + + @Test + public void remove() throws Exception { + linkedList.add(0, "first"); + linkedList.add(1, "second"); + linkedList.add("third"); + linkedList.add("fourth"); + assertEquals("first", linkedList.remove(0)); + assertEquals("third", linkedList.remove(1)); + assertEquals("fourth", linkedList.remove(1)); + assertEquals(1, linkedList.size()); + + } + + @Test + public void size() throws Exception { + linkedList.add(0, "first"); + linkedList.add(1, "second"); + linkedList.add("third"); + linkedList.add("fourth"); + assertEquals(4, linkedList.size()); + } + + @Test + public void addFirst() throws Exception { + linkedList.add("first"); + linkedList.add("second"); + linkedList.addFirst("first first"); + assertEquals("first first", linkedList.get(0)); + + } + + @Test + public void addLast() throws Exception { + linkedList.add("first"); + linkedList.add("second"); + linkedList.addLast("last"); + assertEquals("last", linkedList.get(2)); + } + + @Test + public void removeFirst() throws Exception { + linkedList.add("first"); + linkedList.add("second"); + linkedList.add("third"); + assertEquals("first", linkedList.removeFirst()); + assertEquals("second", linkedList.removeFirst()); + assertEquals(1, linkedList.size()); + assertEquals("third", linkedList.get(0)); + assertEquals("third", linkedList.removeFirst()); + assertEquals(0, linkedList.size()); + + } + + @Test + public void removeLast() throws Exception { + linkedList.add("first"); + linkedList.add("second"); + linkedList.add("third"); + assertEquals("third", linkedList.removeLast()); + assertEquals("second", linkedList.removeLast()); + assertEquals("first", linkedList.removeLast()); + assertEquals(0, linkedList.size()); + + } + + @Test + public void iterator() throws Exception { + Iterator iterator = linkedList.iterator(); + assertEquals(false,iterator.hasNext()); + linkedList.add("A"); + assertEquals(true,iterator.hasNext()); + assertEquals("A",iterator.next()); + iterator.remove(); + assertEquals(0,linkedList.size()); + } + +} \ No newline at end of file diff --git a/group18/1049843090/test/com/coding/basic/QueueTest.java b/group18/1049843090/test/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..2652d1e214 --- /dev/null +++ b/group18/1049843090/test/com/coding/basic/QueueTest.java @@ -0,0 +1,61 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Queue Test + */ +public class QueueTest { + + Queue queue; + + @Before + public void setUp() throws Exception { + queue = new Queue<>(); + } + + @After + public void tearDown() throws Exception { + queue = null; + } + + @Test + public void enQueue() throws Exception { + queue.enQueue("A"); + assertEquals("A",queue.deQueue()); + } + + @Test + public void peek() throws Exception { + assertEquals(null,queue.peek()); + queue.enQueue("A"); + assertEquals("A",queue.peek()); + } + + @Test + public void deQueue() throws Exception { + queue.enQueue("A"); + queue.enQueue("B"); + assertEquals("A",queue.deQueue()); + + } + + @Test + public void isEmpty() throws Exception { + assertEquals(true,queue.isEmpty()); + queue.enQueue("A"); + assertEquals(false,queue.isEmpty()); + } + + @Test + public void size() throws Exception { + queue.enQueue("A"); + queue.enQueue("B"); + assertEquals(2,queue.size()); + } + +} \ No newline at end of file diff --git a/group18/1049843090/test/com/coding/basic/StackTest.java b/group18/1049843090/test/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..e2587ba7f2 --- /dev/null +++ b/group18/1049843090/test/com/coding/basic/StackTest.java @@ -0,0 +1,67 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Stack Test + */ +public class StackTest { + Stack stack; + @Before + public void setUp() throws Exception { + stack = new Stack<>(); + } + + @After + public void tearDown() throws Exception { + stack = null; + } + + @Test + public void push() throws Exception { + stack.push("A"); + assertEquals("A",stack.pop()); + } + + @Test + public void pop() throws Exception { + stack.push("A"); + stack.push("B"); + stack.push("C"); + assertEquals("C",stack.pop()); + assertEquals("B",stack.pop()); + assertEquals("A",stack.pop()); + assertEquals(0,stack.size()); + + + } + + @Test + public void peek() throws Exception { + stack.push("A"); + stack.push("B"); + stack.push("C"); + assertEquals("C",stack.peek()); + + } + + @Test + public void isEmpty() throws Exception { + assertEquals(true,stack.isEmpty()); + stack.push("A"); + assertEquals(false,stack.isEmpty()); + } + + @Test + public void size() throws Exception { + stack.push("A"); + stack.push("B"); + stack.push("C"); + assertEquals(3,stack.size()); + } + +} \ No newline at end of file diff --git a/group18/1057617027/.classpath b/group18/1057617027/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group18/1057617027/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group18/1057617027/.gitignore b/group18/1057617027/.gitignore new file mode 100644 index 0000000000..5e56e040ec --- /dev/null +++ b/group18/1057617027/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/group18/1057617027/.project b/group18/1057617027/.project new file mode 100644 index 0000000000..26e782bfca --- /dev/null +++ b/group18/1057617027/.project @@ -0,0 +1,17 @@ + + + 1057617027Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group18/1057617027/src/com/coding/basic/ArrayList.java b/group18/1057617027/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..792562d5f8 --- /dev/null +++ b/group18/1057617027/src/com/coding/basic/ArrayList.java @@ -0,0 +1,77 @@ +package com.coding.basic; + + +@SuppressWarnings("rawtypes") +public class ArrayList implements List{ + + private int size = 0; + + private Object[] elementData = new Object[100]; + public void kuorong(int size){ + if(size>elementData.length){ + Object[] elementDataTemp = new Object[size*2]; + System.arraycopy(elementData, 0, elementDataTemp, 0, elementData.length); + elementData = elementDataTemp; + } + } + public void add(Object o){ + kuorong(size); + elementData[size] = o; + ++size; + } + public void add(int index, Object o){ + if(index>size||index<0) + throw new IndexOutOfBoundsException("ȷindexֵ"+size+"ҲС0"); + kuorong(++size); + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + } + + public Object get(int index){ + + return elementData[index]; + } + + public Object remove(int index){ + if(index>size||index<0) + throw new IndexOutOfBoundsException("ȷindexֵ"+size+"ҲС0"); + + System.arraycopy(elementData, index+1, elementData, index, size-index); + size--; + return elementData; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + + return new myiterator(); + } + public class myiterator implements Iterator{ + private int nextIndex; + public boolean hasNext(){ + return nextIndex!=size; + } + public Object next(){ + return elementData[nextIndex++]; + } + + } + public static void main(String[] args) { + ArrayList al = new ArrayList(); + + al.add(1); + al.add(2); + al.add(3); + al.add(4); + al.add(2,5); + al.remove(2); + for(int i= 0;i<5;i++){ + System.out.println(al.get(i));} + System.out.println(al.size()); + + } + +} diff --git a/group18/1057617027/src/com/coding/basic/BinaryTreeNode.java b/group18/1057617027/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..acb0afb807 --- /dev/null +++ b/group18/1057617027/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,73 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode head; + private BinaryTreeNode node; + BinaryTreeNode(Object data,BinaryTreeNode left,BinaryTreeNode right){ + this.data = data; + this.left = left; + this.right = right; + } + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + if(node==null){ + node = new BinaryTreeNode(o, null, null); + }else{ + if(Integer.parseInt(String.valueOf(o))<=Integer.parseInt(String.valueOf(node.data))){ + node.left = insert(node.left,o ); + node = node.left; + }else{ + node.right = insert(node.right,o); + node = node.right; + } + } + return node; + } + public BinaryTreeNode insert(BinaryTreeNode node,Object o){ + if(node==null){ + node = new BinaryTreeNode(o, null, null); + }else{ + if(Integer.parseInt(String.valueOf(o))<=Integer.parseInt(String.valueOf(node.data))){ + node.left = insert(node.left,o ); + node.left =node; + }else{ + node.right = insert(node.right,o ); + node.right =node; + } + } + return node; + } +public static void main(String[] args){ + BinaryTreeNode node = new BinaryTreeNode(null, null, null); + + System.out.println(node.insert(6).data); + System.out.println(node.insert(5).data); + System.out.println(node.insert(11).data); + System.out.println(node.insert(7).data); + System.out.println(node.insert(2).data); + System.out.println(node); + +} +} \ No newline at end of file diff --git a/group18/1057617027/src/com/coding/basic/Iterator.java b/group18/1057617027/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..08f070e09c --- /dev/null +++ b/group18/1057617027/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); +} diff --git a/group18/1057617027/src/com/coding/basic/LinkedList.java b/group18/1057617027/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..fa9673a7cd --- /dev/null +++ b/group18/1057617027/src/com/coding/basic/LinkedList.java @@ -0,0 +1,145 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head = new Node(null,null); + private Node last; + private int size; + private static class Node{ + Object data; + Node next; + Node(Object data,Node next){ + this.data = data; + this.next = next; + } + } + public void add(Object o){ + if(size==0){ + Node node = new Node(o,null); + head = node; + last = node; + size++; + }else{ + Node node = new Node(o,null); + last.next = node; + last = node; + size++; + } + + } + public void add(int index , Object o){ + if(index>size){ + System.out.println(""+index+"ڵǰ"+size); + } + Node n = head; + Node n1 = head; + for(int i=0;i size || index <0) + { + return false; + } + + //Ԫ + for (int i = 0; i < size; i++) { + if(o.equals(elementData[i])) + { + //ƶԪصĸ + int nMove = size -index -1; + if(nMove > 0){ + System.arraycopy(elementData, index, elementData, index+1,nMove); + elementData[index] = null; + } + else { + return false; + } + } + } + + return true; + } + + //Ԫ + //ֵ:Ƿӳɹ + public boolean Add(Object obj) + { + if (null == obj) { + throw new IllegalArgumentException("invalid Argument!"); + } + //array + ensureCapacityInternal(size + 1); + + //βԪ = ֵ + elementData[size++] = obj; + + return true; + } + + public void clear() + { + //elementDataԪָNULL,ʹջ + for (int i = 0; i < elementData.length; i++) { + elementData[i] = null; + } + + //arrayԪظ + size = 0; + } + + //ƳarrayеԪ + public boolean remove(Object obj) + { + //elementData,Ԫ + for (int index = 0; index < size; index++) { + if(obj.equals(elementData[index]))//Ƿ + { + fastRemove(index); + return true; + } + } + return false; + } + + private void fastRemove(int index) { + //ƶԪصĸ + int numMoved = size - index - 1; + if (numMoved > 0) + //indexԴǰƶ + System.arraycopy(elementData, index+1, elementData, index,numMoved); + elementData[--size] = null; + } + + //ԪܴС + public int size() { + return size; + } + + public Object get(int index) { + //У + if(index > size || index < 0) + throw new IllegalArgumentException(); + + return elementData[index]; + } + + //漰ݿռ,ʱȲ + private void ensureCapacityInternal(int minCapacity) { + //,ǰ޷ʱ,Ƿ񳬹˵ǰij + System.out.println("element data length is "+elementData.length); + if(minCapacity - elementData.length > 0) + { + //Ϊǰ1.5 + int oldCapacity = elementData.length; + int newCapacity = oldCapacity *3/2; + + //ڲ,elementDataԪؿ + elementData = Arrays.copyOf(elementData, newCapacity); + } + } +} diff --git a/group18/1078285863/javaStudy/src/simpleLinkedList/SimpleLinkedList.java b/group18/1078285863/javaStudy/src/simpleLinkedList/SimpleLinkedList.java new file mode 100644 index 0000000000..0f11532723 --- /dev/null +++ b/group18/1078285863/javaStudy/src/simpleLinkedList/SimpleLinkedList.java @@ -0,0 +1,197 @@ +package simpleLinkedList; + +import java.util.Iterator; +import java.util.LinkedList; + +import javax.sound.sampled.Line; + +public class SimpleLinkedList { + //LinkedList + private int size = 0; + private Node head = null; + private Node tail = null; + + private static class Node{ + Object data; + Node next;//ָһԪ + Node prev; //ָǰһԪ + } + + public void add(Object o){ + addLast(o); + } + public void add(int index , Object o){ + //ҵindexλõԪ + Node tmp = null; + for (int i = 0; i < index; i++) { + tmp = tmp.next; + } + + Node pre = tmp.prev; + Node next = tmp.next; + + if (null == pre) { + addFirst(o); //ͷ + } + else if(null == next){ + addLast(o); //β + } + else { + add(o); + } + } + public Object get(int index){ + if (index > size || index <0) { + throw new IllegalArgumentException(); + } + + Node temp = null; + for(int i=0;i queueList = new LinkedList(); + public void enQueue(Object o){ + queueList.add(o); + } + + public Object deQueue(){ + return queueList.removeFirst(); + } + + public boolean isEmpty(){ + return queueList.isEmpty(); + } + + public int size(){ + return queueList.size(); + } +} \ No newline at end of file diff --git a/group18/1078285863/javaStudy/src/simpleStack/SimpleStack.java b/group18/1078285863/javaStudy/src/simpleStack/SimpleStack.java new file mode 100644 index 0000000000..bfbea7b1db --- /dev/null +++ b/group18/1078285863/javaStudy/src/simpleStack/SimpleStack.java @@ -0,0 +1,44 @@ +package simpleStack; + +import java.util.ArrayList; + +public class SimpleStack { +private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + //ж϶ǷΪ + Object obj = peek(); + if(obj != null) + { + elementData.remove(obj); + return obj; + } + else { + return null; + } + } + + public Object peek(){ + if(elementData.isEmpty()){ + return null; + } + else { + int lastIndex = elementData.size() -1; + Object obj = elementData.get(lastIndex); + return obj; + } + + } + public boolean isEmpty(){ + boolean bEmpty = false; + bEmpty = elementData.isEmpty()?true:false; + return bEmpty; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group18/1159828430/20170219/.classpath b/group18/1159828430/20170219/.classpath new file mode 100644 index 0000000000..33920011cf --- /dev/null +++ b/group18/1159828430/20170219/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group18/1159828430/20170219/.gitignore b/group18/1159828430/20170219/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group18/1159828430/20170219/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group18/1159828430/20170219/.project b/group18/1159828430/20170219/.project new file mode 100644 index 0000000000..93c92379ce --- /dev/null +++ b/group18/1159828430/20170219/.project @@ -0,0 +1,17 @@ + + + 20170219 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group18/1159828430/20170219/src/com/coding/basic/ArrayList.java b/group18/1159828430/20170219/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..8c68e721c2 --- /dev/null +++ b/group18/1159828430/20170219/src/com/coding/basic/ArrayList.java @@ -0,0 +1,184 @@ + +package com.coding.basic; + +import java.util.Arrays; + +/** + * @author Hipple + * @Time:2017年2月20日 下午8:53:31 + * @version 1.0 + */ +public class ArrayList implements List { + + //元素数量 + private int size = 0; + + //默认容量 + private final int defaultCapacity = 10; + + //存储元素的容器 + private static Object[] elementData; + + //无参构造器 + public ArrayList(){ + elementData = new Object[defaultCapacity]; + } + + //指定容量的构造器 + public ArrayList(int capacity){ + if (capacity < 0) { + //非法参数 + throw new IllegalArgumentException("Illegal Capacity: "+ capacity); + } + elementData = new Object[capacity]; + } + + //添加元素 + public boolean add(Object o){ + ensureCapacityInternal(size + 1); + elementData[size++] = o; + return true; + } + + //添加元素到指定位置 + public void add(int index, Object o){ + rangeCheck(index); + //将当前位置及后续元素后移一位 + ensureCapacityInternal(size + 1); + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + } + + //根据下表获取值 + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + + //删除元素 + public Object remove(int index){ + rangeCheck(index); + Object oldValue = elementData[index]; + int numMoved = size - index - 1; + if (numMoved > 0) { + //要删除的元素不是最后一个时,将当前元素及后续元素左移一位 + System.arraycopy(elementData, index+1, elementData, index, numMoved); + } + elementData[--size] = null;//自动回收 + return oldValue; + } + + //删除元素 + public boolean remove(Object o) { + // 由于ArrayList中允许存放null,因此下面通过两种情况来分别处理。 + if (o == null) { + for (int index = 0; index < size; index++){ + if (elementData[index] == null) { + fastRemove(index); + return true; + } + } + } else { + for (int index = 0; index < size; index++){ + if (o.equals(elementData[index])) { + fastRemove(index); + return true; + } + } + } + return false; + } + + //返回现有元素数量 + public int size(){ + return size; + } + + //是否为空 + public boolean isEmpty(){ + return size == 0; + } + + //迭代器 + public Iterator iterator(){ + return new ArrayListIterator(this); + } + + //动态增加ArrayList大小 + private void ensureCapacityInternal(int minCapacity) { + //当前数组无法再存放时将数组长度增加至原长度的1.5倍 + if (minCapacity - elementData.length > 0) { + int newCapacity = (elementData.length * 3)/2; + elementData = Arrays.copyOf(elementData, newCapacity); + } + + } + + //检查是否下标越界 + private void rangeCheck(int index){ + if (index < 0 || index > this.size) { + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); + } + } + + //删除元素,与remove的 差别就是没有下标检查 + private void fastRemove(int index) { + int numMoved = size - index - 1; + if (numMoved > 0){ + System.arraycopy(elementData, index + 1, elementData, index, numMoved); + } + elementData[--size] = null; + } + + private class ArrayListIterator implements Iterator{ + private ArrayList list = null; + private int cursor = 0; + private int lastRet = -1; + + public ArrayListIterator(ArrayList list){ + this.list = list; + } + @Override + public boolean hasNext() { + return cursor != list.size; + } + + @Override + public Object next() { + lastRet = cursor; + Object o = list.get(lastRet); + cursor ++; + return o; + } + @Override + public void remove() { + list.remove(lastRet); + cursor = lastRet; + lastRet = -1; + } + + } + +} +class testArrayList{ + public static void main(String[] args) { + ArrayList arrayList = new ArrayList(); + for (int i = 0; i < 10; i++) { + arrayList.add(i+1); + } + arrayList.add(5,15); + arrayList.remove(11); + Iterator it = arrayList.iterator(); + while(it.hasNext()) { + Integer o = (Integer)it.next(); + if(o == 8){ + it.remove(); + } + } + for (int i = 0; i < arrayList.size(); i++) { + System.out.println("value is "+arrayList.get(i)); + } + + } +} diff --git a/group18/1159828430/20170219/src/com/coding/basic/Iterator.java b/group18/1159828430/20170219/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..d568c74334 --- /dev/null +++ b/group18/1159828430/20170219/src/com/coding/basic/Iterator.java @@ -0,0 +1,12 @@ + +package com.coding.basic; +/** + * @author Hipple + * @Time:2017年2月20日 下午8:56:05 + * @version 1.0 + */ +public interface Iterator { + public boolean hasNext(); + public Object next(); + public void remove(); + diff --git a/group18/1159828430/20170219/src/com/coding/basic/LinkedList.java b/group18/1159828430/20170219/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..4586f0549d --- /dev/null +++ b/group18/1159828430/20170219/src/com/coding/basic/LinkedList.java @@ -0,0 +1,274 @@ +package com.coding.basic; + +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + +/** + * @author Hipple + * @Time:2017年2月21日 下午8:00:21 + * @version 1.0 + */ +public class LinkedList implements List { + + //头结点 + private Node first; + + //尾结点 + private Node last; + + //元素数量 + private int size = 0; + + //无参构造器 + public LinkedList(){ + } + + public boolean add(Object o){ + linkLast(o); + return true; + } + + public void add(int index , Object o){ + checkPositionIndex(index); + if (index == size) { + linkLast(o); + } else { + linkBefore(o, node(index)); + } + } + + public Object remove(int index){ + checkElementIndex(index); + return unlink(node(index)); + } + + public Object get(int index){ + checkElementIndex(index); + return node(index).data; + } + + public void addFirst(Object o){ + linkFirst(o); + } + + public void addLast(Object o){ + linkLast(o); + } + + public Object removeFirst(){ + final Node f = first; + if (f == null) { + throw new NoSuchElementException(); + } + return unlinkFirst(f); + } + + public Object removeLast(){ + final Node l = last; + if (l == null) { + throw new NoSuchElementException(); + } + return unlinkLast(l); + } + + public int size(){ + return size; + } + + //检查是否为空 + public boolean isEmpty(){ + return size == 0; + } + + //获取头节点 + public Object getFirst() { + final Node f = first; + if (f == null) + throw new NoSuchElementException(); + return f.data; + } + + public Iterator iterator(){ + return new LinkedListIterator(); + } + + //头部增加节点 + private void linkFirst(Object data){ + final Node f = first;//f存储老的头部节点待用 + final Node newNode = new Node(null, data, first);//后项指针指向first,前项指针null + first = newNode;//将新节点变为头部节点 + if (f == null) {//头节点为null则代表链表为空,那么新节点也是既是头结点也是尾结点 + last = newNode; + } else {//老的头部节点前项指针指向新节点 + f.previous = newNode; + } + size++; + } + + //尾部增加节点 + private void linkLast(Object data){ + final Node l = last;//l存储老的尾部节点待用 + final Node newNode = new Node(last, data, null);//前项指针指向last,后项指针null + last = newNode;//将新节点变为尾部节点 + if (l == null) {//尾节点为null则代表链表为空,那么新节点也是既是头结点也是尾结点 + first = newNode; + } else {//老的尾部节点后项指针指向新节点 + l.next = newNode; + } + size++; + } + + //指定index插入节点 + private void linkBefore(Object o, Node oldNode){ + final Node pred = oldNode.previous; + final Node newNode = new Node(pred, o, oldNode); + oldNode.previous = newNode;//旧节点前项指针指向新节点 + if (pred == null) {//pred为null代表oldNode为头节点 + first = newNode; + } else { + pred.next = newNode; + } + size++; + + } + + //删除头部节点并返回节点值 + private Object unlinkFirst(Node f){ + final Object element = f.data;//保存头节点的值 + final Node next = f.next; + f.data = null;//GC自动回收 + f.next = null; + first = next;//将头节点的下一节点变为头节点 + if (next == null) {//如果next为空,则代表f同时为尾节点,此时整个链表为空 + last = null; + } else { + next.previous = null; + } + size--; + return element; + } + + //删除尾部节点并返回该节点的值 + private Object unlinkLast(Node l){ + final Object element = l.data;//保存尾节点的值 + final Node prev = l.previous; + l.previous = null; + l.data = null;//GC自动回收 + last = prev;//将尾节点的上一节点变为尾节点 + if (prev == null) {//如果prev为空,则代表l同时为头节点,此时整个链表为空 + first = null; + } else { + prev.next = null; + } + size--; + return element; + } + + //删除指定节点 + private Object unlink(Node x){ + final Object element = x.data; + final Node prev = x.previous; + final Node next = x.next; + if (prev == null) {//prev为空代表要删除的是头节点 + unlinkFirst(x); + } else {//prev后项指针指向next + prev.next = next; + x.previous = null; + } + if (next == null) {//next为空代表要删除的是尾节点 + unlinkLast(x); + } else {//next前项指针指向prev + next.previous = prev; + x.next = null; + } + x.data = null; + size--; + return element; + } + + //查找结点 + private Node node(int index){ + if (index < (size>>1)) {//判断循环方向 + Node x = first; + for (int i = 0; i < index; i++) { + x = x.next; + } + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) { + x = x.previous; + } + return x; + } + } + + //检查下标是否合法 + private void checkElementIndex(int index){ + if (!isElementIndex(index)) { + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); + } + } + + private void checkPositionIndex(int index){ + if (!isPositionIndex(index)) { + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); + } + } + + //检查该参数是否为现有元素的索引。 + private boolean isElementIndex(int index) { + return index >= 0 && index < size; + } + + //检查参数是否是迭代器或添加操作的有效位置的索引 + private boolean isPositionIndex(int index) { + return index >= 0 && index <= size; + } + + //迭代器 + private class LinkedListIterator implements Iterator{ + private Node lastReturned = null; + private Node next; + private int nextIndex; + + public boolean hasNext() { + return nextIndex < size; + } + + public Object next() { + if (!hasNext()) + throw new NoSuchElementException(); + + lastReturned = next; + next = next.next; + nextIndex++; + return lastReturned.data; + } + + public void remove() { + if (lastReturned == null) + throw new IllegalStateException(); + + Node lastNext = lastReturned.next; + unlink(lastReturned); + if (next == lastReturned) + next = lastNext; + else + nextIndex--; + lastReturned = null; + } + } + + //节点对象 + private static class Node{ + Object data; + Node next; + Node previous; + Node(Node previous, Object data, Node next) { + this.data = data; + this.next = next; + this.previous = previous; + } + } +} \ No newline at end of file diff --git a/group18/1159828430/20170219/src/com/coding/basic/List.java b/group18/1159828430/20170219/src/com/coding/basic/List.java new file mode 100644 index 0000000000..78674d202d --- /dev/null +++ b/group18/1159828430/20170219/src/com/coding/basic/List.java @@ -0,0 +1,13 @@ +package com.coding.basic; +/** + * @author Hipple + * @Time:2017年2月20日 下午8:52:08 + * @version 1.0 + */ +public interface List { + public boolean add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group18/1159828430/20170219/src/com/coding/basic/Queue.java b/group18/1159828430/20170219/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..a5de938d6d --- /dev/null +++ b/group18/1159828430/20170219/src/com/coding/basic/Queue.java @@ -0,0 +1,31 @@ +package com.coding.basic; +/** + * @author Hipple + * @Time:2017年2月23日 下午11:00:00 + * @version 1.0 + */ + +public class Queue { + private LinkedList elementData = new LinkedList(); + + public Queue(){ + + } + + public void enQueue(Object o){ + elementData.addLast(o); + } + + public Object deQueue(){ + elementData.getFirst(); + return null; + } + + public boolean isEmpty(){ + return elementData.isEmpty(); + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group18/1159828430/20170219/src/com/coding/basic/Stack.java b/group18/1159828430/20170219/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..eae2f6637d --- /dev/null +++ b/group18/1159828430/20170219/src/com/coding/basic/Stack.java @@ -0,0 +1,57 @@ +package com.coding.basic; + +import java.util.EmptyStackException; + +/** + * @author Hipple + * @Time:2017年2月23日 下午10:59:39 + * @version 1.0 + */ +public class Stack { + private ArrayList elementData = new ArrayList(); + + public Stack(){ + + } + + //入栈 + public void push(Object o){ + elementData.add(o); + } + + //出栈 + public Object pop(){ + if (elementData.isEmpty()) { + throw new EmptyStackException(); + } + final Object o = peek(); + elementData.remove(o);//重新写根据对象remove + return o; + } + + public Object peek(){ + if (elementData.isEmpty()) { + throw new EmptyStackException(); + } + final Object o = elementData.get(elementData.size()-1); + return o; + } + public boolean isEmpty(){ + return size() == 0; + } + public int size(){ + return elementData.size(); + } +} +class TestStack { + public static void main(String[] args){ + Stack myStack=new Stack(); + myStack.push("a"); + myStack.push(2); + myStack.push("123"); + myStack.push("ahu"); + while(!myStack.isEmpty()){ + System.out.println(myStack.pop()); + } + } +} diff --git a/group18/1159828430/README.md b/group18/1159828430/README.md new file mode 100644 index 0000000000..8ff2ffc95e --- /dev/null +++ b/group18/1159828430/README.md @@ -0,0 +1,2 @@ +# 2017编程提高群 +这里是1159828430 大连—书生 的代码提交区 diff --git a/group18/1787597051/.classpath b/group18/1787597051/.classpath new file mode 100644 index 0000000000..fb565a588d --- /dev/null +++ b/group18/1787597051/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group18/1787597051/.gitignore b/group18/1787597051/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group18/1787597051/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group18/1787597051/.project b/group18/1787597051/.project new file mode 100644 index 0000000000..2abc06efd7 --- /dev/null +++ b/group18/1787597051/.project @@ -0,0 +1,17 @@ + + + 1787597051 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group18/1787597051/.settings/org.eclipse.jdt.core.prefs b/group18/1787597051/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group18/1787597051/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group18/1787597051/src/com/coding/basic/BinaryTreeNode.java b/group18/1787597051/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group18/1787597051/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group18/1787597051/src/com/coding/basic/MyArrayList.java b/group18/1787597051/src/com/coding/basic/MyArrayList.java new file mode 100644 index 0000000000..77b14150c1 --- /dev/null +++ b/group18/1787597051/src/com/coding/basic/MyArrayList.java @@ -0,0 +1,75 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class MyArrayList implements MyList { + private final int GROW = 4; + private int size = 0; + + private Object[] elementData = new Object[4]; + + public void add(Object o) { + if (size > elementData.length - 1) { + elementData = Arrays.copyOf(elementData, elementData.length + GROW); + elementData[size] = o; + } else { + elementData[size] = o; + } + size++; + } + + public void add(int index, Object o) { + Object[] target = new Object[elementData.length - index]; + for (int x = index, y = 0; x < elementData.length; x++, y++) { + target[y] = elementData[x]; + } + elementData = Arrays.copyOf(elementData, elementData.length + 1); + size = index; + // elementData[index] = o; + elementData[size] = o; + size++; + for (int y = 0; y < target.length; y++) { + // add(target[y]); + elementData[size] = target[y]; + size++; + } + } + + public Object get(int index) { + return elementData[index]; + } + + public Object remove(int index) { + Object removeData = elementData[index]; + elementData[index] = null; + Object[] target = Arrays.copyOfRange(elementData, index + 1, elementData.length); + for (int x = index, y = 0; y < target.length; y++, x++) { + elementData[x] = target[y]; + } + size--; + return removeData; + } + + public int size() { + return size; + } + + public MyIteratorImpl iterator() { + return new MyIteratorImpl(); + } + + private class MyIteratorImpl implements MyIterator { + int index; + + public boolean hasNext() { + return index != size; + } + + public Object next() { + int i = index; + index = i + 1; + return elementData[i]; + } + + } +} diff --git a/group18/1787597051/src/com/coding/basic/MyIterator.java b/group18/1787597051/src/com/coding/basic/MyIterator.java new file mode 100644 index 0000000000..59af236aab --- /dev/null +++ b/group18/1787597051/src/com/coding/basic/MyIterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface MyIterator { + public abstract boolean hasNext(); + public abstract Object next(); +} diff --git a/group18/1787597051/src/com/coding/basic/MyLinkedList.java b/group18/1787597051/src/com/coding/basic/MyLinkedList.java new file mode 100644 index 0000000000..862a0b9f38 --- /dev/null +++ b/group18/1787597051/src/com/coding/basic/MyLinkedList.java @@ -0,0 +1,125 @@ +package com.coding.basic; + +public class MyLinkedList implements MyList { + private int size; + private Node head; + + public MyLinkedList() { + head = new Node(); + head.data = "ͷ"; + head.next = null; + } + + public void add(Object o) { + Node p = head; + while (p.next != null) { + p = p.next; + } + Node p3 = new Node(); + p3.data = o; + p.next = p3; + size++; + } + + public void add(int index, Object o) { + int num = 0; + Node p = head; + while (p.next != null) { + if (num == index) { + Node p2 = new Node(); + p2.data = o; + p2.next = p.next; + p.next = p2; + size++; + } + p = p.next; + num++; + } + } + + public Object get(int index) { + int num = 0; + Node p = head.next; + while (p != null) { + if (num == index) { + return p.data; + } + p = p.next; + num++; + } + return null; + } + + public Object remove(int index) { + int num = 0; + Node p = head; + while (p.next != null) { + if (num == index) { + Node p2 = p.next; + p.next = p.next.next; + size--; + return p2.data; + } + p = p.next; + num++; + } + return null; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node p = new Node(); + p.data = o; + p.next = head.next; + head.next = p; + size++; + } + + public void addLast(Object o) { + Node p = head; + while (p.next != null) { + p = p.next; + } + Node p2 = new Node(); + p2.data = o; + p.next = p2; + size++; + } + + public Object removeFirst() { + Node p = head; + if (p.next != null) { + Node p2 = head.next; + p.next = p.next.next; + size--; + return p2.data; + } + return null; + } + + public Object removeLast() { + Node p = head; + if (p.next != null) { + while (p.next.next != null) { + p = p.next; + } + Node p2 = new Node(); + p2 = p.next; + p.next = null; + size--; + return p2.data; + } + return null; + } + /* + * public Iterator iterator(){ return null; } + */ + + private static class Node { + Object data; + Node next; + } +} diff --git a/group18/1787597051/src/com/coding/basic/MyList.java b/group18/1787597051/src/com/coding/basic/MyList.java new file mode 100644 index 0000000000..afb20940ea --- /dev/null +++ b/group18/1787597051/src/com/coding/basic/MyList.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface MyList { + public abstract void add(Object o); + public abstract void add(int index, Object o); + public abstract Object get(int index); + public abstract Object remove(int index); + public abstract int size(); +} diff --git a/group18/1787597051/src/com/coding/basic/MyQueue.java b/group18/1787597051/src/com/coding/basic/MyQueue.java new file mode 100644 index 0000000000..3161f6b4e9 --- /dev/null +++ b/group18/1787597051/src/com/coding/basic/MyQueue.java @@ -0,0 +1,25 @@ +package com.coding.basic; + +public class MyQueue { + private int size; + MyLinkedList mll = new MyLinkedList(); + public MyQueue() { + } + public void enQueue(Object o){ + mll.add(o); + size++; + } + + public Object deQueue(){ + size--; + return mll.removeFirst(); + } + + public boolean isEmpty(){ + return size == 0; + } + + public int size(){ + return size; + } +} diff --git a/group18/1787597051/src/com/coding/basic/MyStack.java b/group18/1787597051/src/com/coding/basic/MyStack.java new file mode 100644 index 0000000000..36c9aaffa5 --- /dev/null +++ b/group18/1787597051/src/com/coding/basic/MyStack.java @@ -0,0 +1,33 @@ +package com.coding.basic; + +public class MyStack { + private MyArrayList elementData = new MyArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + if (elementData.size() > 0) { + Object data = elementData.get(elementData.size() - 1); + elementData.remove(elementData.size() - 1); + return data; + } + return null; + } + + public Object peek() { + if (elementData.size() > 0) { + return elementData.get(elementData.size() - 1); + } + return null; + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group18/542330964/.classpath b/group18/542330964/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group18/542330964/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group18/542330964/.gitignore b/group18/542330964/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group18/542330964/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group18/542330964/.project b/group18/542330964/.project new file mode 100644 index 0000000000..3a99e1d0ad --- /dev/null +++ b/group18/542330964/.project @@ -0,0 +1,17 @@ + + + 542330964learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group18/542330964/src/basicstruct/ArrayList.java b/group18/542330964/src/basicstruct/ArrayList.java new file mode 100644 index 0000000000..b56c61c4d1 --- /dev/null +++ b/group18/542330964/src/basicstruct/ArrayList.java @@ -0,0 +1,80 @@ +package basicstruct; + + + +public class ArrayList implements List{ + + private int size = 0; + + private Object[] elementData ; + + private static final int DEFAULT_CAPACITY = 10; + + public ArrayList() { + elementData=new Object [DEFAULT_CAPACITY]; + } + + public ArrayList(int initialCapacity) { + if(initialCapacity>=0){ + elementData=new Object[initialCapacity]; + }else { + throw new IllegalArgumentException("initialCapacity"+ + initialCapacity+"不能为负数"); + } + } + + public void add(Object o){ + ensureCapacity(); + elementData[size++] = o; + } + public void add(int index, Object o){ + if(index<0||index>size){ + throw new ArrayIndexOutOfBoundsException("index:"+index); + } + ensureCapacity(); + System.arraycopy(elementData, index, elementData, index + 1,size - index); + elementData[index] = o; + size++; + } + + private void rangeCheck(int index) { + if(index<0||index>=size){ + throw new ArrayIndexOutOfBoundsException("index:"+index); + } + } + private void ensureCapacity() { + if(size == elementData.length) { + Object[] newArray = new Object[size * 2 + 1]; + System.arraycopy(elementData, 0, newArray, 0, elementData.length); + elementData = newArray; + } + } + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + + public Object remove(int index){ + rangeCheck(index); + Object movedValue = elementData[index]; + //被删除元素后的元素数目 + int numMoved = size - index - 1; + //后面有元素 + if (numMoved > 0){ + System.arraycopy(elementData, index+1, elementData, index,numMoved); + } + //恰为最后一个元素 + size--; + elementData[size] = null; //垃圾回收 + return movedValue; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group18/542330964/src/basicstruct/BinaryTreeNode.java b/group18/542330964/src/basicstruct/BinaryTreeNode.java new file mode 100644 index 0000000000..5fba822d2f --- /dev/null +++ b/group18/542330964/src/basicstruct/BinaryTreeNode.java @@ -0,0 +1,31 @@ +package basicstruct; +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} \ No newline at end of file diff --git a/group18/542330964/src/basicstruct/Iterator.java b/group18/542330964/src/basicstruct/Iterator.java new file mode 100644 index 0000000000..f7a094dd14 --- /dev/null +++ b/group18/542330964/src/basicstruct/Iterator.java @@ -0,0 +1,8 @@ +package basicstruct; + +public interface Iterator { + public boolean hasNext(); + + public Object next(); + +} \ No newline at end of file diff --git a/group18/542330964/src/basicstruct/LinkedList.java b/group18/542330964/src/basicstruct/LinkedList.java new file mode 100644 index 0000000000..b124e9f8b9 --- /dev/null +++ b/group18/542330964/src/basicstruct/LinkedList.java @@ -0,0 +1,175 @@ +package basicstruct; + +import java.util.NoSuchElementException; + + +public class LinkedList implements List { + + private Node head; + + private Node tail; + + private int size=0; + + public void add(Object o){ + addLast(o); + } + public void add(int index , Object o){ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("index: "+index); + } + if (index == size) { + addLast(o); + } else { + Node temp = node(index); + final Node pred = temp.previous; + final Node newNode = new Node(o, temp, pred); + temp.previous = newNode; + if (pred == null){ + head = newNode; + } + else{ + pred.next = newNode; + } + size++; + } + } + + public Node node(int index) { + //二分法查找 + if (index < (size >> 1)) { + Node temp = head; + for (int i = 0; i < index; i++){ + temp = temp.next; + } + return temp; + } else { + Node temp = tail; + for (int i = size - 1; i > index; i--){ + temp = temp.previous; + } + return temp; + } + } + + public Object get(int index){ + if (index < 0 || index >=size) { + throw new IndexOutOfBoundsException("index: "+index); + } + return node(index).data; + } + + public Object remove(int index){ + if (index < 0 || index >=size) { + throw new IndexOutOfBoundsException("index: "+index); + } + return deleteElement(node(index)); + } + + private Object deleteElement(Node node) { + Object element = node.data; + Node next = node.next; + Node prev = node.previous; + if (prev == null) { + head = next; + }else{ + prev.next = next; + node.previous = null; + } + if(next == null) { + tail = prev; + }else { + next.previous = prev; + node.next = null; + } + node.data = null; + size--; + return element; + } + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node h = head; + Node newNode = new Node(o, h, null); + head = newNode; + if (h == null){ + tail = newNode; + }else{ + h.previous = newNode; + } + size++; + } + + public void addLast(Object o){ + Node t = tail; + Node node = new Node(o, null, t); + tail = node; + if (t == null) { + head = node; + } else { + t.next = node; + } + size++; + } + + public Object removeFirst(){ + final Node h = head; + if (h == null) { + throw new NoSuchElementException("No such element"); + } + final Object element = h.data; + final Node next = h.next; + h.data = null; + h.next = null; + head = next; + if (next == null) { + tail = null; + } else { + next.previous = null; + } + size--; + return element; + } + + public Object removeLast(){ + Node t = tail; + if (t == null){ + throw new NoSuchElementException("No such element"); + } + final Object element = t.data; + final Node prev = t.previous; + t.data = null; + t.previous = null; + tail = prev; + if (prev == null) { + head = null; + } else { + prev.next = null; + } + size--; + return element; + } + public boolean isEmpty(){ + return size==0; + } + public Iterator iterator(){ + return null; + } + + private static class Node{ + Object data; + Node next; + Node previous; + public Node() { + super(); + } + public Node(Object data, Node next, Node previous) { + super(); + this.data = data; + this.next = next; + this.previous = previous; + } + } +} \ No newline at end of file diff --git a/group18/542330964/src/basicstruct/List.java b/group18/542330964/src/basicstruct/List.java new file mode 100644 index 0000000000..abe8ec3613 --- /dev/null +++ b/group18/542330964/src/basicstruct/List.java @@ -0,0 +1,13 @@ +package basicstruct; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} \ No newline at end of file diff --git a/group18/542330964/src/basicstruct/Queue.java b/group18/542330964/src/basicstruct/Queue.java new file mode 100644 index 0000000000..5cb8ff6f12 --- /dev/null +++ b/group18/542330964/src/basicstruct/Queue.java @@ -0,0 +1,22 @@ +package basicstruct; + +public class Queue { + + private LinkedList queue = new LinkedList(); + //进队列 + public void enQueue(Object o) { + queue.addLast(o); + } + //出队列 + public Object deQueue() { + return queue.removeFirst(); + } + + public int size() { + return queue.size(); + } + + public boolean isEmpty() { + return queue.isEmpty(); + } +} \ No newline at end of file diff --git a/group18/542330964/src/basicstruct/Stack.java b/group18/542330964/src/basicstruct/Stack.java new file mode 100644 index 0000000000..41f32af82f --- /dev/null +++ b/group18/542330964/src/basicstruct/Stack.java @@ -0,0 +1,24 @@ +package basicstruct; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + //删除栈顶的值 + public Object pop(){ + return elementData.remove(elementData.size()-1); + } + //获取栈顶的值 + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.size()==0; + } + public int size(){ + return elementData.size(); + } +} \ No newline at end of file diff --git a/group18/542330964/src/junittest/ArraylistTest.java b/group18/542330964/src/junittest/ArraylistTest.java new file mode 100644 index 0000000000..bfaa41a4b0 --- /dev/null +++ b/group18/542330964/src/junittest/ArraylistTest.java @@ -0,0 +1,52 @@ +package junittest; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import basicstruct.ArrayList; + +public class ArraylistTest { + + + ArrayList list = new ArrayList(); + @Before + public void setUp() throws Exception { + list.add(1); + list.add(1,"boy next door"); + list.add(222); + list.add("333"); + list.add(4,"444"); + list.add(1232); + list.add("555"); + } + + + @Test + public void testAdd() { + System.out.println(list.get(0)); + System.out.println(list.get(3)); + System.out.println(list.get(5)); + } + + @Test + public void testGet() { + fail("Not yet implemented"); + } + + @Test + public void testRemove() { + list.remove(0); + list.remove(5); + System.out.println(list.get(0)); + System.out.println(list.size()); +// System.out.println(list.get(5)); + } + + @Test + public void testSize() { + System.out.println(list.size()); + } + +} diff --git a/group18/542330964/src/junittest/LinkedListTest.java b/group18/542330964/src/junittest/LinkedListTest.java new file mode 100644 index 0000000000..8572b7a524 --- /dev/null +++ b/group18/542330964/src/junittest/LinkedListTest.java @@ -0,0 +1,65 @@ +package junittest; + +import java.util.Date; + +import org.junit.Before; +import org.junit.Test; + +import basicstruct.LinkedList; + +public class LinkedListTest { + + LinkedList l = new LinkedList(); + @Before + public void setUp() throws Exception { + l.add(1); + l.add("2"); + l.add(new Date()); + l.add(22); + l.add(33); + l.add(1, 3); + } + + @Test + public void testAddObject() { + System.out.println(l.get(1)); + System.out.println(l.get(3)); + System.out.println(l.get(200)); + } + + @Test + public void testRemove() { + l.remove(1); + System.out.println(l.get(1)); + } + + @Test + public void testSize() { + System.out.println(l.size()); + } + + @Test + public void testAddFirst() { + l.addFirst(0); + System.out.println(l.get(0)); + } + + @Test + public void testAddLast() { + l.addLast(999); + System.out.println(l.get(l.size()-1)); + } + + @Test + public void testRemoveFirst() { + l.removeFirst(); + System.out.println(l.get(0)); + } + + @Test + public void testRemoveLast() { + l.removeLast(); + System.out.println(l.get(l.size()-1)); + } + +} diff --git a/group18/542330964/src/junittest/QueueTest.java b/group18/542330964/src/junittest/QueueTest.java new file mode 100644 index 0000000000..a3488563e1 --- /dev/null +++ b/group18/542330964/src/junittest/QueueTest.java @@ -0,0 +1,33 @@ +package junittest; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import basicstruct.Queue; + +public class QueueTest { + + Queue q = new Queue(); + @Before + public void setUp() throws Exception { + q.enQueue(11); + q.enQueue(22); + q.enQueue(33); + q.enQueue(44); + q.enQueue(55); + } + + @Test + public void testDeQueue() { + q.deQueue(); + System.out.println(q.size()); + } + + @Test + public void testIsEmpty() { + System.out.println(q.isEmpty()); + } + +} diff --git a/group18/542330964/src/junittest/StackTest.java b/group18/542330964/src/junittest/StackTest.java new file mode 100644 index 0000000000..96372bb957 --- /dev/null +++ b/group18/542330964/src/junittest/StackTest.java @@ -0,0 +1,39 @@ +package junittest; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import basicstruct.Stack; + +public class StackTest { + + Stack s= new Stack(); + @Before + public void setUp() throws Exception { + s.push(11); + s.push(22); + s.push(33); + s.push("44"); + s.push(55); + } + + @Test + public void testPop() { + System.out.println(s.peek()); + s.pop(); + System.out.println(s.peek()); + } + + @Test + public void testIsEmpty() { + System.out.println(s.isEmpty()); + } + + @Test + public void testSize() { + System.out.println(s.size()); + } + +} diff --git a/group18/564673292/com/coding/basic/ArrayList.java b/group18/564673292/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..4bb16148b7 --- /dev/null +++ b/group18/564673292/com/coding/basic/ArrayList.java @@ -0,0 +1,92 @@ +package com.coding.basic; + +public class ArrayList implements List, Iterable{ + private E[] array; + private int lastIndex; + private int length; + //Constructor + @SuppressWarnings("unchecked") + public ArrayList(){ + length = 10; + array = (E[])new Object[length]; + lastIndex = 0; + } + + public void add(E object){ + if(lastIndex == length){ + this.grow(); + } + array[lastIndex] = object; + lastIndex++; + } + + @SuppressWarnings("unchecked") + private void grow(){ + E[] tempArray = (E[])new Object[length + 10]; + System.arraycopy(array, 0, tempArray, 0, length); + array = tempArray; + length = length + 10; + } + + public void insert(int index, E o) { + if(index > lastIndex - 1) throw new IndexOutOfBoundsException(); + for (int i = lastIndex; i > index; i--) { + array[i] = array[i - 1]; + } + array[index] = o; + length++; + } + + public E get(int index) { + if(index > lastIndex - 1) throw new IndexOutOfBoundsException(); + return array[index]; + } + + public E remove(int index){ + if(index > lastIndex - 1) throw new IndexOutOfBoundsException(); + E removed = array[index]; + for (int i = index; i < lastIndex - 1; i++) { + array[i] = array[i + 1]; + } + lastIndex--; + array[lastIndex] = null; + return removed; + } + + public int size(){ + return lastIndex; + } + + public Iterator iterator(){ + return new Itr(this); + } + + private class Itr implements Iterator{ + private int itrCurIndex; + private ArrayList arrayList; + // constructor + public Itr(ArrayList arrayList){ + this.arrayList = arrayList; + itrCurIndex = -1; + } + + public boolean hasNext(){ + return (itrCurIndex + 1) > lastIndex - 1 ? false: true; + } + + @SuppressWarnings("unchecked") + public E next(){ + if(this.hasNext()){ + return (E)this.arrayList.get(++itrCurIndex); + }else{ + itrCurIndex = -1; + return null; + } + } + + @SuppressWarnings("unchecked") + public E remove(){ + return (E)this.arrayList.remove(itrCurIndex); + } + } +} \ No newline at end of file diff --git a/group18/564673292/com/coding/basic/BinaryTreeNode.java b/group18/564673292/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..713e8e4409 --- /dev/null +++ b/group18/564673292/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,72 @@ +// This is a node in a customized binaryTree. The tree have 2 extra features comparing to general binary trees. +// 1. The data of each node are in number class. +// 2. The left child node has a smaller number data than root node, and the right child node has a larger number data that root node. + +package com.coding.basic; + +public class BinaryTreeNode { + + private E data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + // constructor + public BinaryTreeNode(E data){ + this.data = data; + } + + public E getData() { + return this.data; + } + + public void setData(E data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return this.left; + } + + public boolean setLeft(BinaryTreeNode left) { + if(this.compareWithRoot(left.data) >= 0 || this.left != null){ + System.err.println("The left node data should be smaller than root node."); + return false; + }else{ + this.left = left; + return true; + } + } + + public BinaryTreeNode getRight() { + return this.right; + } + + public boolean setRight(BinaryTreeNode right) { + if(this.compareWithRoot(right.data) <= 0 || this.right != null) { + System.err.println("The right node data should be larger than root node."); + + return false; + }else{ + this.right = right; + return true; + } + } + + private int compareWithRoot(E o){ + return (Integer)o - (Integer)this.getData(); + } + + @SuppressWarnings("unchecked") + public void insert(E o){ + BinaryTreeNode newNode = new BinaryTreeNode(o); + if(!this.setLeft(newNode)){ + if(!this.setRight(newNode)){ + if(this.left.getData() == o){ + this.right.insert(o); + }else{ + this.left.insert(o); + } + } + } + } +} \ No newline at end of file diff --git a/group18/564673292/com/coding/basic/Iterable.java b/group18/564673292/com/coding/basic/Iterable.java new file mode 100644 index 0000000000..e80308012a --- /dev/null +++ b/group18/564673292/com/coding/basic/Iterable.java @@ -0,0 +1,5 @@ +package com.coding.basic; + +public interface Iterable{ + public Iterator iterator(); +} \ No newline at end of file diff --git a/group18/564673292/com/coding/basic/Iterator.java b/group18/564673292/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..27d475265e --- /dev/null +++ b/group18/564673292/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public E next(); + public E remove(); +} \ No newline at end of file diff --git a/group18/564673292/com/coding/basic/LinkedList.java b/group18/564673292/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..19b12d12da --- /dev/null +++ b/group18/564673292/com/coding/basic/LinkedList.java @@ -0,0 +1,123 @@ +package com.coding.basic; + +public class LinkedList implements List, Iterable { + + private Node head; + private Node last; + private int length; + + private class Node{ + public E data; + public Node next; + + // constructor + private Node(E o, Node n){ + data = o; + next = n; + } + } + + // constructor + public LinkedList(){ + head = new Node(null, null); + last = head; + length = 0; + } + + public void add(E o){ + Node newNode = new Node(o, null); + last.next = newNode; + last = newNode; + length++; + } + + public void insert(int index , E o){ + if(index > length - 1) throw new IndexOutOfBoundsException(); + Node prevNode = this.getNode(index - 1); + Node nextNode = this.getNode(index); + Node nodeToInsert = new Node(o,nextNode); + prevNode.next = nodeToInsert; + length++; + } + + private Node getNode(int index){ + int count = 0; + Node currentNode = head; + while(currentNode.next != null && count <= index){ + currentNode = currentNode.next; + count++; + } + return currentNode; + } + + public E get(int index){ + if(index > length - 1) throw new IndexOutOfBoundsException(); + Node nodeAtIndex = this.getNode(index); + return nodeAtIndex.data; + } + + public E remove(int index){ + if(index > length - 1) throw new IndexOutOfBoundsException(); + Node nodeToRemove = this.getNode(index); + Node prevNode = this.getNode(index - 1); + Node nextNode = this.getNode(index + 1); + prevNode.next = nextNode; + E removedData = nodeToRemove.data; + nodeToRemove = null; + length--; + return removedData; + } + + public int size(){ + return length; + } + + public void addFirst(E o){ + this.insert(0, o); + } + public void addLast(E o){ + this.add(o); + + } + public E removeFirst(){ + return this.remove(0); + } + public E removeLast(){ + return this.remove(length - 1); + } + + public Iterator iterator(){ + return new Itr(this); + } + + private class Itr implements Iterator{ + private int itrCurIndex; + private Node currentNode; + private LinkedList linkedList; + + public Itr(LinkedList linkedList){ + itrCurIndex = -1; + currentNode = head; + this.linkedList = linkedList; + } + + public boolean hasNext(){ + return (itrCurIndex + 1) > length - 1 ? false: true; + } + + @SuppressWarnings("unchecked") + public E next(){ + if(this.hasNext()){ + return (E)this.linkedList.get(++itrCurIndex); + }else{ + itrCurIndex = -1; + return null; + } + } + + @SuppressWarnings("unchecked") + public E remove(){ + return (E)this.linkedList.remove(itrCurIndex); + } + } +} \ No newline at end of file diff --git a/group18/564673292/com/coding/basic/List.java b/group18/564673292/com/coding/basic/List.java new file mode 100644 index 0000000000..04a7ac992e --- /dev/null +++ b/group18/564673292/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(E o); + public void insert(int index, E o); + public E get(int index); + public E remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group18/564673292/com/coding/basic/Queue.java b/group18/564673292/com/coding/basic/Queue.java new file mode 100644 index 0000000000..b40f06afc8 --- /dev/null +++ b/group18/564673292/com/coding/basic/Queue.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +public class Queue { + private LinkedList linkedList; + + // constructor + public Queue(){ + linkedList = new LinkedList(); + } + + public void enQueue(E o){ + linkedList.addLast(o); + } + + public E deQueue(){ + return linkedList.removeFirst(); + } + + public E peek(){ + return linkedList.get(0); + } + + public boolean isEmpty(){ + return linkedList.size() == 0 ? true : false; + } + + public int size(){ + return linkedList.size(); + } +} \ No newline at end of file diff --git a/group18/564673292/com/coding/basic/Stack.java b/group18/564673292/com/coding/basic/Stack.java new file mode 100644 index 0000000000..b1b129fc40 --- /dev/null +++ b/group18/564673292/com/coding/basic/Stack.java @@ -0,0 +1,50 @@ +package com.coding.basic; + +public class Stack{ + private ArrayList arrayList; + + // constructor + public Stack(){ + arrayList = new ArrayList(); + } + + public void push(E o){ + arrayList.add(o); + } + + public E pop(){ + return arrayList.remove(arrayList.size() - 1); + } + + public E peek(){ + return arrayList.get(arrayList.size() - 1); + } + + public boolean isEmpty(){ + return arrayList.size() == 0 ? true: false; + } + + public int size(){ + return arrayList.size(); + } + + // public Iterator iterator(){ + // return new Itr(); + // } + + // private class Itr implements Iterator{ + // Iterator arrayListItr = arrayList.iterator(); + // public boolean hasNext(){ + // return arrayListItr.hasNext(); + // } + + // public E next(){ + // return arrayListItr.next(); + // } + + // @Override // Stack iterator can only remove the last element + // public E remove(){ + // return arrayList.pop(); + // } + // } +} \ No newline at end of file diff --git a/group18/744888802/dataStructure/pom.xml b/group18/744888802/dataStructure/pom.xml new file mode 100644 index 0000000000..3b262d6184 --- /dev/null +++ b/group18/744888802/dataStructure/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + dataStructure + dataStructure + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + + + + + + + \ No newline at end of file diff --git a/group18/744888802/dataStructure/src/main/java/com/coding/basic/ArrayList.java b/group18/744888802/dataStructure/src/main/java/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..728edc3500 --- /dev/null +++ b/group18/744888802/dataStructure/src/main/java/com/coding/basic/ArrayList.java @@ -0,0 +1,109 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + //每次增加的长度 + private Integer addArrayLength = 10; + //初始 数组长度 + private Object[] elementData = new Object[10]; + + public void add(Object o){ + if(size < elementData.length) + { + elementData[size]=o; + }else{ + //扩容数组 + grow(); + elementData[size] = 0; + } + size++; + + } + public void add(int index, Object o){ + if(index>size) + { + throw new RuntimeException("ArrayIndexOutOfBoundsException"); + } + + //截取索引开始到原数组结尾 组成一个新的数组 + Object [] tempObjs = Arrays.copyOfRange(elementData,index,elementData.length); + //覆盖原有索引位置的对象 + elementData[index] = o; + //数组扩容 + elementData = Arrays.copyOf(elementData,elementData.length+1); + + //将临时生成的数组合并回原数组 + System.arraycopy(tempObjs,0,elementData,index+1,tempObjs.length); + size++; + } + + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + + if(index>size) + { + throw new RuntimeException("ArrayIndexOutOfBoundsException"); + } + + Object o = elementData[index]; + + //截取索引开始到原数组结尾 组成一个新的数组 + Object [] tempObjs = Arrays.copyOfRange(elementData,index+1,elementData.length); + elementData = Arrays.copyOf(elementData,elementData.length-1); + //将临时生成的数组合并回原数组 + System.arraycopy(tempObjs,0,elementData,index,tempObjs.length); + size--; + + return o; + } + + public int size(){ + return this.size; + } + + public Iterator iterator(){ + ArratListIterator arratListIterator = new ArratListIterator(this); + + return arratListIterator; + } + + private void grow(){ + elementData = Arrays.copyOf(elementData,elementData.length+addArrayLength); + } + + class ArratListIterator implements Iterator{ + + ArrayList arrayList = new ArrayList(); + + int index = 0; + + ArratListIterator(ArrayList arrayList){ + + this.arrayList = arrayList; + index = arrayList.size; + } + + @Override + public boolean hasNext() { + if(index == 0) + { + return false; + } + return true; + } + + @Override + public Object next() { + return this.arrayList.get(--index); + } + } + +} diff --git a/group18/744888802/dataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java b/group18/744888802/dataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..8fc6e03297 --- /dev/null +++ b/group18/744888802/dataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,84 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + + BinaryTreeNode binaryTreeNode = new BinaryTreeNode(); + binaryTreeNode.data = o; + + add(this, binaryTreeNode); + return this; + } + + private void add(BinaryTreeNode binaryTreeNodeOld, BinaryTreeNode binaryTreeNodeNew) { + if (binaryTreeNodeOld.data == null) { + binaryTreeNodeOld.data = binaryTreeNodeNew.data; + return; + } + + + if (binaryTreeNodeOld.left == null) { + binaryTreeNodeOld.left = binaryTreeNodeNew; + return; + } + if (binaryTreeNodeOld.right == null) { + if (comparator(binaryTreeNodeNew, binaryTreeNodeOld.left)){ + binaryTreeNodeOld.right = binaryTreeNodeNew; + }else{ + binaryTreeNodeOld.right = binaryTreeNodeOld.left; + binaryTreeNodeOld.left = binaryTreeNodeNew; + } + return; + } + + if(comparator(binaryTreeNodeOld.left, binaryTreeNodeNew)) + { + add(binaryTreeNodeOld.left,binaryTreeNodeNew); + return; + } + + if(comparator(binaryTreeNodeOld.right, binaryTreeNodeNew)){ + add(binaryTreeNodeOld.right,binaryTreeNodeNew); + return; + }else{ + binaryTreeNodeNew.left = binaryTreeNodeOld.right; + binaryTreeNodeOld.right = binaryTreeNodeNew; + } + + + + + } + + private boolean comparator(BinaryTreeNode binaryTreeNode1, BinaryTreeNode binaryTreeNode2) { + if ((Integer) binaryTreeNode1.getData() > (Integer) binaryTreeNode2.getData()) { + return true; + } + return false; + } + +} diff --git a/group18/744888802/dataStructure/src/main/java/com/coding/basic/Iterator.java b/group18/744888802/dataStructure/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group18/744888802/dataStructure/src/main/java/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group18/744888802/dataStructure/src/main/java/com/coding/basic/LinkedList.java b/group18/744888802/dataStructure/src/main/java/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..098246a4bb --- /dev/null +++ b/group18/744888802/dataStructure/src/main/java/com/coding/basic/LinkedList.java @@ -0,0 +1,237 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private Node last; + + private int size = 0; + + public void add(Object o){ + addLast(o); + + } + public void add(int index , Object o){ + + Node node = new Node(); + node.data = o; + if(size == 0) + { + throw new NullPointerException(" linked list is null"); + } + if(index == 0) + { + node.next=head; + head = node; + } + Node nodeNow = head; + for(int i=1;i=size) + { + throw new IndexOutOfBoundsException(" this index too big by this list"); + } + + Node nodeNow = head; + for(int i=0;i=size) + { + throw new IndexOutOfBoundsException(" this index too big by this list"); + } + if(size == 0) + { + throw new NullPointerException("linked list is null"); + } + if(index == 0) + { + if(size == 1) + { + size = 0; + return head.data; + } + Object o = head.data; + head.next = null; + + head = head.next; + return o; + + } + Node result = null; + + + Node beforeNode = head; + Node nextNode = head.next; + for(int i=1;i elementData.length){ + elementData = Arrays.copyOf(elementData, elementData.length*2); + } + elementData[size-1] = o; + + } + public void add(int index, Object o){ + Object[] tmp = new Object[elementData.length]; + + if(index<0 || index >elementData.length-1){ + return; + } + if(++size > elementData.length){ + elementData = Arrays.copyOf(elementData, elementData.length*2); + tmp = new Object[elementData.length]; + } + System.arraycopy(elementData, 0, tmp, 0, index); + System.arraycopy(elementData, index, tmp, index+1, size-index); + tmp[index] = o; + elementData=tmp; + + } + + public Object get(int index){ + if(index<0 || index >elementData.length-1){ + return null; + } + return elementData[index]; + } + + public Object remove(int index){ + Object o=null; + o = elementData[index]; + if(--size%5 == 0){ + elementData = Arrays.copyOf(elementData, elementData.length/2); + }else if(index == size-1){ + elementData[index] = null; + }else if(index == size-1){ + + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + } + + return o; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayIterator(this); + } + +} + + + + + + + + + + + + + + + + + + + diff --git a/group18/784140710/week01/src/com/coding/basic/BinaryTree.java b/group18/784140710/week01/src/com/coding/basic/BinaryTree.java new file mode 100644 index 0000000000..01b7a90a43 --- /dev/null +++ b/group18/784140710/week01/src/com/coding/basic/BinaryTree.java @@ -0,0 +1,65 @@ +package com.coding.basic; + + +public class BinaryTree { + + private BinaryTreeNode root; + + public void insert(Integer o){ + BinaryTreeNode node = new BinaryTreeNode(o); + if(root == null){ + root = node; + }else{ + BinaryTreeNode current = root; + BinaryTreeNode parent; + + while(true){ + parent = current; + if(onode.getData()){ + node = node.getRight(); + }else{ + return node; + } + } + + return null; + } + + +} + + + + + + + + + + + + diff --git a/group18/784140710/week01/src/com/coding/basic/BinaryTreeNode.java b/group18/784140710/week01/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..15cbb94d28 --- /dev/null +++ b/group18/784140710/week01/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,66 @@ +package com.coding.basic; + + +public class BinaryTreeNode { + + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Integer data){ + this.data = data; + } + + public Integer getData() { + return data; + } + public void setData(Integer data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/group18/784140710/week01/src/com/coding/basic/Iterator.java b/group18/784140710/week01/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group18/784140710/week01/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group18/784140710/week01/src/com/coding/basic/LinkedList.java b/group18/784140710/week01/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..eb0b6fbeae --- /dev/null +++ b/group18/784140710/week01/src/com/coding/basic/LinkedList.java @@ -0,0 +1,114 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size = 0; + + public void add(Object o){ + ++size; + Node node = new Node(o); + + if(head == null){ + head = node; + return; + } + Node tmp = new Node(o); + tmp = head; + while(tmp.next!=null){ + tmp = tmp.next; + } + tmp.next = node; + } + public void add(int index , Object o){ + ++size; + Node node = new Node(o); + Node tmp = new Node(o); + tmp = head; + int i =0; + while(tmp.next!=null && i 本人对于CPU、内存、硬盘以及指令等一系列计算机核心组件理解甚浅。并且对其也不是很来感,不过身为一名软件专业学生以及未来的程序猿,还是硬着头皮研究研究。以下是对其学习的一个总结吧算是,有什么不正确的地方还请指出,不喜勿喷。 + +相信大家都知道计算机是由控制器、运算器、存储器、输入设备、输出设备五大部分组成。控制器 + 运算器组成了CPU,存储器即内存,当然硬盘也属于存储器,不过硬盘和内存存储形式有所不同,详细见下。 + +说明:点击以下标题查看维基百科详解 + +### [CPU](https://zh.wikipedia.org/wiki/%E4%B8%AD%E5%A4%AE%E5%A4%84%E7%90%86%E5%99%A8) + +CPU即中央处理器(Central Processing Unit)。 + +它是计算机的主要设备之一,可以是说是计算机最重要的组成部分。常听到有人说CPU是"计算机的大脑",但我觉得这句话是不完全正确的。为什么这么说呢,CPU没有存储能力,只有为数不多的寄存器能临时存储一点东西,人可是有存储能力的,像最强大脑上有些人更拥有超强的记忆力。所以在存储能力这方面来讲,我觉得把CPU比作”大脑“的说法不太正确。就像刘欣前辈在其公号上讲解[CPU](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513017&idx=1&sn=5550ee714abd36d0b580713f673e670b&scene=21#wechat_redirect)说的那样,"上帝为你关闭了一扇门,就一定会为你打开一扇窗",CPU虽然“脑容量”很小,但是它拥有超强的运算力。拿内存和硬盘来说,CPU比内存要快100倍,比硬盘快1000多万倍。这种运算速度可是人望尘莫及的了。所以在运算力这方面讲,又可以把CPU比作“超强的大脑”。 + +它负责处理、运算计算机内部的所有数据。 + +### [内存](https://zh.wikipedia.org/wiki/%E9%9A%8F%E6%9C%BA%E5%AD%98%E5%8F%96%E5%AD%98%E5%82%A8%E5%99%A8) + +内存即RAM,随机存取存储器(Random Access Memory)。 + +内存是计算机的主存,主存(Main memory)即电脑内部最重要的存储器,是与CPU直接交换数据的内部存储器。它用来加载各种各样的数据和程序以供CPU直接运行与运用。它是可以随时读写的,并且速度也很快,仅仅比CPU慢100倍。它通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。通俗点说,内存就是用来临时存储数据,用来给CPU提供CPU要处理的东西。但是内存不会长期保存数据,只是临时存储,程序和数据处理完后就释放空间。 + +### [硬盘](https://zh.wikipedia.org/wiki/%E7%A1%AC%E7%9B%98) + +硬盘即HDD(Hard Disk Drive)。 + +硬盘是计算机上使用坚硬的旋转盘片为基础的非挥发性存储设备,它在平整的磁性表面存储和检索数字数据,信息通过离磁性表面很近的磁头,由电磁流来改变极性方式被电磁流写到磁盘上,信息可以通过相反的方式读取,例如读头经过纪录数据的上方时磁场导致线圈中电气信号的改变。硬盘的读写是采用随机存取的方式,因此可以以任意顺序读取硬盘中的数据。以上来自维基百科。各种专业名词,我相信你已经看厌倦了快。说白了,硬盘就是存东西的,长期存,也就是具有记忆力。不像CPU和内存,“一觉醒来就忘了以前的事情”,所有的数据全都清空。硬盘会长期存储数据,只要是不人为删除,不出现硬件故障,东西就不会丢。 + +### [指令](https://zh.wikipedia.org/wiki/%E6%8C%87%E4%BB%A4) + +指令,怎么说呢,指令就是任何可执行程序的元素的表述。指令一般会包含一个操作码和零到多个操作数。操作码指定了要进行什么样的操作。操作数可能指定了参与操作的寄存器、内存地址或立即数,它可能还会包含寻址方式,寻址方式确定操作数的含义。说白了,指令就是CPU的命令,CPU通过寄存器中的指令来进行数据的操作。 + +另外,指令一般有四种:加载、存储、操作和跳转。 + +### 它们之间的关系 + +CPU从内存或缓存中取出指令,放入指令寄存器,并对指令译码进行分解,进而对数据进行处理。这么说吧,计算机中所有的程序运行都是在内存中进行的,因此内存对计算机性能的影响非常大。数据由传输速度较慢的硬盘通过内存传送到CPU进行处理。不过内存是带电存储的(断电数据就会消失),而且容量十分有限,所以要长时间储存程序或数据就需要使用硬盘。 + +所以计算机处理数据大概就通过以上几个部分:数据(硬盘)——>内存——>CPU——>CPU通过指令处理数据 \ No newline at end of file diff --git a/group18/935542673/Blog/README.md b/group18/935542673/Blog/README.md new file mode 100644 index 0000000000..0533a45f85 --- /dev/null +++ b/group18/935542673/Blog/README.md @@ -0,0 +1,4 @@ +## 2017编程提高社群博客 + +2017.2.25 [CPU,内存,硬盘,指令以及它们之间的关系](https://github.com/china-kook/coding2017/blob/master/group18/935542673/Blog/CPU%EF%BC%8C%E5%86%85%E5%AD%98%EF%BC%8C%E7%A1%AC%E7%9B%98%EF%BC%8C%E6%8C%87%E4%BB%A4%E4%BB%A5%E5%8F%8A%E5%AE%83%E4%BB%AC%E4%B9%8B%E9%97%B4%E7%9A%84%E5%85%B3%E7%B3%BB.md) + diff --git a/group18/935542673/Coding/20170219/.classpath b/group18/935542673/Coding/20170219/.classpath new file mode 100644 index 0000000000..63024e81ef --- /dev/null +++ b/group18/935542673/Coding/20170219/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group18/935542673/Coding/20170219/.gitignore b/group18/935542673/Coding/20170219/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group18/935542673/Coding/20170219/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group18/935542673/Coding/20170219/.project b/group18/935542673/Coding/20170219/.project new file mode 100644 index 0000000000..8b11575db2 --- /dev/null +++ b/group18/935542673/Coding/20170219/.project @@ -0,0 +1,17 @@ + + + Coding + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group18/935542673/Coding/20170219/README.md b/group18/935542673/Coding/20170219/README.md new file mode 100644 index 0000000000..a001a83d24 --- /dev/null +++ b/group18/935542673/Coding/20170219/README.md @@ -0,0 +1,83 @@ +## 2017编程提高社群作业:实现基本的数据结构(2017.2.19) + +#### [所有基本数据结构实现类及接口](https://github.com/china-kook/coding2017/tree/master/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure) + +1. 实现了ArrayList、LinkedList、Queue(依靠LinkedList实现)、Stack(依靠ArrayList实现) + + 1.1 ArrayList实现了以下方法: + + ``` + (1)add(Object): 添加元素到集合; + (2)add(int, Object): 添加元素到集合的指定位置; + (3)size(): 返回集合的大小,类型为 int; + (4)isEmpty(): 判断集合是否为空,类型为 boolean; + (5)get(int): 获取集合指定位置的元素; + (6)remove(int): 删除指定位置的对象; + (7)remove(Object): 删除指定的对象; + (8)set(int, Object): 更改集合中指定位置的元素,并返回原来的对象; + (9)iterator(): 返回一个迭代器的实现类。 + ``` + + 1.2 LinkedList实现以下方法: + + ``` + (1)addFirst(Object): 在链表头部插入新的元素; + (2)addLast(Object): 在链表尾部插入新的元素; + (3)add(Object): 在链表中插入新的元素; + (4)add(int, Object): 在链表指定位置插入新的元素; + (5)size(): 返回链表的大小,类型为 int; + (6)isEmpty(): 判断链表是否为空,类型为 boolean; + (7)getFirst(): 获取链表头部的元素; + (8)getLast(): 获取链表尾部的元素; + (9)get(int): 获取链表指定位置的元素; + (10)set(int, Object): 更改链表中指定位置的元素,并返回原来的对象。 + (11)removeFirst(): 删除链表头部的元素; + (12)removeLast(int): 删除链表尾部的元素; + (13)remove(Object): 删除指定元素; + (14)remove(int): 删除指定位置的元素; + (15)iterator(): 返回一个迭代器的实现类。 + ``` + + 1.3 Queue实现了以下方法: + + ``` + (1)enQueue(Object): 入队操作; + (2)deQueue(): 出队操作; + (3)size(): 返回队列的长度; + (4)isEmpty(): 判断队列是否为空。 + ``` + + 1.4 Stack实现了以下方法: + + ``` + (1)push(Object):入栈操作; + (2)pop():出栈操作; + (3)getTop():获取栈顶元素; + (4)isEmpty():判断栈是否为空; + (5)size():获取栈的深度。 + ``` + ​ + +2. 实现了BinarySearchTree、Iterator接口 + + 2.1 BinarySearchTree实现了以下方法: + + ``` + (1)insert(int):插入操作; + (2)find(int):查找操作; + (3)delete(int):删除操作; + (4)inorderTraverse(Node):遍历操作,采用中序遍历。 + ``` + + 2.2 Iterator定义了以下方法: + + ``` + (1)hasNext():判断是否有元素没有被遍历; + (2)next():返回游标当前位置的元素并将游标移动到下一个位置; + (3)remove():删除游标左边的元素,在执行完 next 之后该操作只能执行一次。 + ``` + ​ + + #### [所有基本数据结构测试类](https://github.com/china-kook/coding2017/tree/master/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure) + + 说明:由于作业以实现基本的数据结构为主,则在实现单元测试时,只对正常情况进行了测试,一些异常情况并进行编写测试用例。 diff --git a/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyArrayListTest.java b/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyArrayListTest.java new file mode 100644 index 0000000000..f8bb390595 --- /dev/null +++ b/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyArrayListTest.java @@ -0,0 +1,92 @@ +package com.ikook.basic_data_structure; + +import static org.junit.Assert.*; + +import java.util.Date; + +import org.junit.Before; +import org.junit.Test; + +/** + * 此单元测试只测试了正常情况,一些异常情况没有测试。 + * @author ikook + */ +public class MyArrayListTest { + + private MyArrayList list; + + @Before + public void setUp() { + list = new MyArrayList(); + list.add("111"); + list.add("222"); + list.add(33); + list.add("444"); + list.add(new Date()); + list.add("666"); + list.add("777"); + list.add("888"); + list.add("999"); + } + + @Test + public void testAdd() { + //测试add(Object obj)方法 + list.add(100); + assertEquals(10, list.size()); + + //测试add(int index, Object obj)方法 + list.add(3, 444); + assertEquals(444, list.get(3)); + + assertEquals("444", list.get(4)); + assertEquals(11, list.size()); + } + + @Test + public void testIsEmpty() { + + assertEquals(false, list.isEmpty()); + } + + @Test + public void testGet() { + assertEquals("111", list.get(0)); + assertEquals(new Date(), list.get(4)); + } + + @Test + public void testRemove() { + + // 测试remove(int index)方法 + assertEquals(33, list.remove(2)); + assertEquals("444", list.get(2)); + + // 测试remove(Object obj)方法 + assertEquals(true, list.remove("222")); + assertEquals("444", list.get(1)); + } + + @Test + public void testSet() { + assertEquals(33, list.set(2, "333")); + assertEquals("333", list.get(2)); + } + + @Test + public void testIterator() { + int i = 0; + for(MyIterator iter = list.iterator(); iter.hasNext();) { + Object str = (Object) iter.next(); + assertEquals(list.get(i++), str); + } + + int j = list.size(); + for(MyIterator iter = list.iterator(); iter.hasNext();) { + iter.next(); + iter.remove(); + assertEquals( --j , list.size()); + } + } + +} diff --git a/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyBinarySearchTreeTest.java b/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyBinarySearchTreeTest.java new file mode 100644 index 0000000000..59e1ad3797 --- /dev/null +++ b/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyBinarySearchTreeTest.java @@ -0,0 +1,64 @@ +package com.ikook.basic_data_structure; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +/** + * 此单元测试只测试了正常情况,一些异常情况没有测试。 + * @author ikook + */ +public class MyBinarySearchTreeTest { + + private MyBinarySearchTree tree; + + @Before + public void setUp() { + tree = new MyBinarySearchTree(); + + tree.insert(3); + tree.insert(8); + } + + @SuppressWarnings("static-access") + @Test + public void testInsert() { + tree.insert(1); + tree.insert(4); + tree.insert(6); + tree.insert(2); + tree.insert(10); + tree.insert(9); + + assertEquals("1 2 3 4 6 8 9 10 ", tree.inorderTraverse(tree.root)); + } + + @Test + public void testFind() { + tree.insert(1); + tree.insert(4); + tree.insert(6); + tree.insert(2); + tree.insert(10); + tree.insert(9); + + assertEquals(false, tree.find(5)); + assertEquals(true, tree.find(10)); + } + + @SuppressWarnings("static-access") + @Test + public void testDelete() { + tree.insert(1); + tree.insert(4); + tree.insert(6); + tree.insert(2); + tree.insert(10); + tree.insert(9); + + assertEquals(false, tree.delete(5)); + assertEquals(true, tree.delete(4)); + assertEquals("1 2 3 6 8 9 10 ", tree.inorderTraverse(tree.root)); + } +} diff --git a/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyLinkedListTest.java b/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyLinkedListTest.java new file mode 100644 index 0000000000..d479408183 --- /dev/null +++ b/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyLinkedListTest.java @@ -0,0 +1,131 @@ +package com.ikook.basic_data_structure; + +import static org.junit.Assert.*; + +import java.util.Date; + +import org.junit.Before; +import org.junit.Test; + +/** + * 此单元测试只测试了正常情况,一些异常情况没有测试。 + * @author ikook + */ +public class MyLinkedListTest { + + private MyLinkedList list; + + @Before + public void setUp() { + list = new MyLinkedList(); + list.add("111"); + list.add(222); + list.add("333"); + } + + @Test + public void testAddFirst() { + list.addFirst(444); + assertEquals(4, list.size()); + assertEquals(444, list.get(0)); + assertEquals(444, list.getFirst()); + + } + + @Test + public void testAddLast() { + list.addLast("444"); + assertEquals(4, list.size()); + assertEquals("444", list.getLast()); + assertEquals("444", list.get(3)); + } + + @Test + public void testAddObject() { + list.add(new Date()); + assertEquals(new Date(), list.get(3)); + } + + @Test + public void testAddIntObject() { + list.add(1, "222"); + assertEquals("222", list.get(1)); + assertEquals(4, list.size()); + } + + @Test + public void testSize() { + assertEquals(3, list.size()); + } + + @Test + public void testIsEmpty() { + assertEquals(false, list.isEmpty()); + + MyLinkedList list = new MyLinkedList(); + assertEquals(true, list.isEmpty()); + } + + @Test + public void testGetFirst() { + assertEquals("111", list.getFirst()); + } + + @Test + public void testGetLast() { + assertEquals("333", list.getLast()); + } + + @Test + public void testGet() { + assertEquals(222, list.get(1)); + } + + @Test + public void testSet() { + assertEquals(222, list.set(1, new Date())); + assertEquals(new Date(), list.get(1)); + } + + @Test + public void testRemoveFirst() { + assertEquals("111", list.removeFirst()); + assertEquals(222, list.getFirst()); + } + + @Test + public void testRemoveLast() { + assertEquals("333", list.removeLast()); + assertEquals(222, list.getLast()); + } + + @Test + public void testRemoveObject() { + assertEquals(true, list.remove((Integer) 222)); + assertEquals("333", list.get(1)); + } + + @Test + public void testRemoveInt() { + assertEquals(222, list.remove(1)); + assertEquals("333", list.get(1)); + + } + + @Test + public void testIterator() { + int i = 0; + for(MyIterator iter = list.iterator(); iter.hasNext();) { + Object str = (Object) iter.next(); + assertEquals(list.get(i++), str); + } + + int j = list.size(); + for(MyIterator iter = list.iterator(); iter.hasNext();) { + iter.next(); + iter.remove(); + assertEquals( --j , list.size()); + } + } + +} diff --git a/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyQueueTest.java b/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyQueueTest.java new file mode 100644 index 0000000000..8fb8ba825f --- /dev/null +++ b/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyQueueTest.java @@ -0,0 +1,54 @@ +package com.ikook.basic_data_structure; + +import static org.junit.Assert.*; + +import java.util.Date; + +import org.junit.Before; +import org.junit.Test; + +/** + * 此单元测试只测试了正常情况,一些异常情况没有测试。 + * @author ikook + */ +public class MyQueueTest { + + private MyQueue queue; + + @Before + public void setUp() { + queue = new MyQueue(); + + queue.enQueue(111); + queue.enQueue("222"); + queue.enQueue(new Date()); + } + + @Test + public void testEnQueue() { + queue.enQueue(444); + assertEquals(4, queue.size()); + } + + @Test + public void testDeQueue() { + assertEquals(111, queue.deQueue()); + } + + @Test + public void testSize() { + assertEquals(3, queue.size()); + + MyQueue queue = new MyQueue(); + assertEquals(0, queue.size()); + } + + @Test + public void testIsEmpty() { + assertEquals(false, queue.isEmpty()); + + MyQueue queue = new MyQueue(); + assertEquals(true, queue.isEmpty()); + } + +} diff --git a/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyStackTest.java b/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyStackTest.java new file mode 100644 index 0000000000..fe1084e343 --- /dev/null +++ b/group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyStackTest.java @@ -0,0 +1,55 @@ +package com.ikook.basic_data_structure; + +import static org.junit.Assert.*; + +import java.util.Date; + +import org.junit.Before; +import org.junit.Test; + +/** + * 此单元测试只测试了正常情况,一些异常情况没有测试。 + * @author ikook + */ +public class MyStackTest { + + private MyStack stack; + + @Before + public void setUp() { + stack = new MyStack(); + stack.push(111); + stack.push("222"); + stack.push(333); + stack.push(new Date()); + stack.push("555"); + } + + @Test + public void testPush() { + stack.push(93554); + assertEquals(6, stack.size()); + } + + @Test + public void testPop() { + assertEquals("555", stack.pop()); + assertEquals(4, stack.size()); + + assertEquals(new Date(), stack.pop()); + } + + @Test + public void testGetTop() { + assertEquals("555", stack.getTop()); + } + + @Test + public void testIsEmpty() { + assertEquals(false, stack.isEmpty()); + + MyStack stack = new MyStack(); + assertEquals(true, stack.isEmpty()); + } + +} diff --git a/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyArrayList.java b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyArrayList.java new file mode 100644 index 0000000000..79ec2865c3 --- /dev/null +++ b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyArrayList.java @@ -0,0 +1,213 @@ +package com.ikook.basic_data_structure; + +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + +/** + * @author ikook; QQ号码: 935542673 + */ +public class MyArrayList implements MyList{ + + private Object[] elementData; + + private int size; + + /** + * 使Object[]的长度默认为10; + */ + public MyArrayList() { + this(10); + } + + /** + * 在构造函数中初始化集合的长度 + * @param initialCapacity + */ + public MyArrayList(int initialCapacity) { + if(initialCapacity < 0) { + try { + throw new Exception(); + } catch (Exception e) { + e.printStackTrace(); + } + } + this.elementData = new Object[initialCapacity]; + } + + /** + * 在集合中添加元素 + * @param obj + */ + public void add(Object obj) { + + ensureCapacity(); + elementData[size++] = obj; + + } + + /** + * 添加元素到集合的指定位置 + * @param index + * @param obj + */ + public void add(int index, Object obj) { + if (index > size || index < 0) + throw new IndexOutOfBoundsException("索引越界异常"); + + ensureCapacity(); + + System.arraycopy(elementData, index, elementData, index + 1, size-index); + elementData[index] = obj; + size++; + } + + /** + * 返回集合的长度 + * @return + */ + public int size() { + return size; + } + + /** + * 判断集合是非为空 + * @return + */ + public boolean isEmpty() { + return size == 0; + } + + /** + * 获取集合指定位置的元素 + * @param index + * @return + */ + public Object get(int index) { + rangeCheck(index); + return elementData[index]; + } + + /** + * 删除指定位置的对象 + * @param index + */ + public Object remove(int index) { + + rangeCheck(index); + + Object oldValue = elementData[index]; + + int numMoved = size - index - 1; + if (numMoved > 0){ + System.arraycopy(elementData, index+1, elementData, index, + numMoved); + } + elementData[--size] = null; + + return oldValue; + } + + /** + * 删除指定的对象(Object 对象) + * @param obj + */ + public boolean remove(Object obj){ + for(int i = 0; i < size; i++) { + if(get(i).equals(obj)) { + remove(i); + return true; + } + } + return false; + } + + /** + * 更改集合中指定位置的元素,并返回原来的对象 + * @param index + * @param obj + * @return + */ + public Object set(int index, Object obj) { + rangeCheck(index); + + Object oldValue = elementData[index]; + elementData[index] = obj; + + return oldValue; + } + + /** + * 集合扩容封装类 + */ + private void ensureCapacity() { + if(size == elementData.length) { + Object[] newArray = new Object[size * 2 + 1]; + System.arraycopy(elementData, 0, newArray, 0, elementData.length); + elementData = newArray; + } + } + + /** + * 判断集合范围是否越界的封装类 + * @param index + */ + private void rangeCheck(int index) { + if(index < 0 || index >= size) { + throw new IndexOutOfBoundsException("索引越界异常"); + } + } + + /** + * 返回一个迭代器的实现 + * @return + */ + public MyIterator iterator() { + return new Iter(); + } + + /** + * 迭代器的实现类 + * @author ikook + */ + private class Iter implements MyIterator { + + int cursor; // 返回下一个元素的索引 + int lastRet = -1; // 返回最后一个元素的索引(始终指向刚遍历完的元素),如果没有元素了,则为 -1 + + @Override + public boolean hasNext() { + return cursor != size; // cursor 等于 size 则集合遍历完。 + } + + @Override + public Object next() { + + try{ + int i = cursor; + Object next = get(i); + lastRet = i; + cursor = i + 1; + return next; + } catch (IndexOutOfBoundsException e) { + throw new NoSuchElementException("没有找到指定的元素, 迭代器遍历失败"); + } + + } + + @Override + public void remove() { + if (lastRet < 0) { + throw new IllegalStateException("非法状态异常,删除失败"); + } + + try{ + MyArrayList.this.remove(lastRet); + cursor = lastRet; + lastRet = -1; + } catch (IndexOutOfBoundsException e) { + throw new ConcurrentModificationException("竞争者改变异常,删除失败"); + } + } + + } +} \ No newline at end of file diff --git a/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyBinarySearchTree.java b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyBinarySearchTree.java new file mode 100644 index 0000000000..d30be18a7a --- /dev/null +++ b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyBinarySearchTree.java @@ -0,0 +1,200 @@ +package com.ikook.basic_data_structure; + +/** + * @author ikook; QQ号码: 935542673 + */ +public class MyBinarySearchTree { + + public static Node root; + + public MyBinarySearchTree() { + root = null; + } + + /** + * 插入操作 + * @param id + */ + public void insert(int id) { + Node newNode = new Node(id); + if (root == null) { + root = newNode; + return; + } + Node current = root; //当前节点 + Node parent = null; //父节点,即上一个节点 + while (true) { + parent = current; + if (id < current.data) { + current = current.left; + if (current == null) { + parent.left = newNode; + return; + } + } else { + current = current.right; + if (current == null) { + parent.right = newNode; + return; + } + } + } + } + + /** + * 查找操作 + * @param id + * @return + */ + public boolean find(int id) { + Node current = root; + while (current != null) { + if (current.data == id) { + return true; + } else if (current.data > id) { + current = current.left; + } else { + current = current.right; + } + } + return false; + } + + /** + * 删除操作 + * @param id + * @return + */ + public boolean delete(int id) { + if (root == null) // 根节点为空,则树为空,返回false。 + return false; + else { + Node parent = root; + Node current = root; + boolean isLeftChild = false; // 是否在左子树,默认为false:即不在。 + // 找到删除点以及是否在左子树 + while (current.data != id) { + parent = current; + if (current.data > id) { + isLeftChild = true; + current = current.left; + } else { + isLeftChild = false; + current = current.right; + } + if (current == null) { + return false; + } + } + + // 如果删除节点的左节点为空,右节点也为空。 + if (current.left == null && current.right == null) { + if (current == root) { + root = null; + } + if (isLeftChild == true) { + parent.left = null; + } else { + parent.right = null; + } + } + // 如果删除节点只有一个子节点,则该节点为左节点或者右节点。 + else if (current.right == null) { + if (current == root) { + root = current.left; + } else if (isLeftChild) { + parent.left = current.left; + } else { + parent.right = current.left; + } + } else if (current.left == null) { + if (current == root) { + root = current.right; + } else if (isLeftChild) { + parent.left = current.right; + } else { + parent.right = current.right; + } + } + // 如果删除节点左节点右节点都不为空。 + else if (current.left != null && current.right != null) { + + // 寻找删除节点的后继者:这说明已经发现最小元素在右子树中 + Node successor = getSuccessor(current); + if (current == root) { + root = successor; + } else if (isLeftChild) { + parent.left = successor; + } else { + parent.right = successor; + } + successor.left = current.left; + } + return true; + } + } + + /** + * 获取删除节点的后继者:删除节点的后继者是在其右节点树中最小的节点 + * @param deleleNode + * @return + */ + private Node getSuccessor(Node deleleNode) { + Node successsor = null; + Node successsorParent = null; + Node current = deleleNode.right; + while (current != null) { + successsorParent = successsor; + successsor = current; + current = current.left; + } + // 检查后继者是否有右节点 + // 如果有右节点树,则将其添加到successorParent(后继者父节点)的左节点。 + if (successsor != deleleNode.right) { + successsorParent.left = successsor.right; + successsor.right = deleleNode.right; + } + return successsor; + } + + /** + * 显示二叉树 + * @param root + * @param sb + */ + private void display(Node root, StringBuilder sb) { + if (root != null) { + display(root.left, sb); + sb.append(root.data + " "); + display(root.right, sb); + } + } + + /** + * 中序遍历:左子树->根节点->右子树 + * @param root + * @return + */ + public String inorderTraverse(Node root) { + StringBuilder sb = new StringBuilder(); + this.display(root, sb); + return sb.toString(); + } +} + +/** + * 用于表示节点 + * @author ikook + */ +class Node { + + int data; + Node left; + Node right; + + public Node(int data) { + this.data = data; + left = null; + right = null; + } +} \ No newline at end of file diff --git a/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyIterator.java b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyIterator.java new file mode 100644 index 0000000000..1fe7a69fcb --- /dev/null +++ b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyIterator.java @@ -0,0 +1,14 @@ +package com.ikook.basic_data_structure; + +/** + * @author ikook QQ号码: 935542673 + */ +public interface MyIterator { + + public boolean hasNext(); // 判断是否有元素没有被遍历 + + public Object next(); // 返回游标当前位置的元素并将游标移动到下一个位置 + + public void remove(); // 删除游标左边的元素,在执行完 next 之后该操作只能执行一次 + +} diff --git a/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyLinkedList.java b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyLinkedList.java new file mode 100644 index 0000000000..a255657911 --- /dev/null +++ b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyLinkedList.java @@ -0,0 +1,359 @@ +package com.ikook.basic_data_structure; + +import java.util.NoSuchElementException; + +/** + * @author ikook; QQ号码: 935542673 + */ +public class MyLinkedList implements MyList{ + + private Node first; + private Node last; + private int size; + + /** + * 在链表的头部插入新的元素 + * @param obj + */ + public void addFirst(Object obj) { + final Node f = first; + final Node newNode = new Node(null, obj, f); + first = newNode; + if (f == null) + last = newNode; + else + f.previous = newNode; + size++; + } + + /** + * 在链表尾部插入新的元素 + * @param obj + */ + public void addLast(Object obj) { + final Node l = last; + final Node newNode = new Node(l, obj, null); + last = newNode; + if (l == null) + first = newNode; + else + l.next = newNode; + size++; + } + + /** + * 在链表中插入新的元素 + * @param obj + */ + public void add(Object obj) { + addLast(obj); + } + + /** + * 在指定位置插入新的元素 + * @param index + * @param obj + */ + public void add(int index, Object obj) { + if (!(index >= 0 && index <= size)) { + throw new IndexOutOfBoundsException("索引位置越界"); + } + + if (index == size) { + addLast(obj); + } else { + Node temp = node(index); + final Node pred = temp.previous; + final Node newNode = new Node(pred, obj, temp); + temp.previous = newNode; + if (pred == null) + first = newNode; + else + pred.next = newNode; + size++; + } + } + + /** + * 返回集合的size。 + * @return + */ + public int size() { + return size; + } + + /** + * 判断集合是非为空 + * @return + */ + public boolean isEmpty() { + return size == 0; + } + + /** + * 获取链表头部的元素 + * @return + */ + public Object getFirst() { + final Node f = first; + if (f == null) { + throw new NoSuchElementException("没有找到指定的元素"); + } + + return f.data; + } + + /** + * 获取链表尾部的元素 + * @return + */ + public Object getLast() { + final Node l = last; + if (l == null) { + throw new NoSuchElementException("没有找到指定的元素"); + } + + return l.data; + } + + /** + * 获取指定位置的元素 + * @param index + * @return + */ + public Object get(int index) { + rangeCheckElementIndex(index); + return node(index).data; + } + + /** + * 更改指定位置的元素 + * @param index + * @param element + * @return + */ + public Object set(int index, Object element) { + rangeCheckElementIndex(index); + Node temp = node(index); + Object oldValue = temp.data; + temp.data = element; + return oldValue; + } + + + /** + * 删除链表头部的元素 + * @return + */ + public Object removeFirst() { + final Node f = first; + if (f == null) { + throw new NoSuchElementException("没有找到指定的元素"); + } + + final Object element = f.data; + final Node next = f.next; + f.data = null; + f.next = null; + first = next; + if (next == null) { + last = null; + } else { + next.previous = null; + } + size--; + + return element; + } + + /** + * 删除链表尾部的元素 + * @return + */ + public Object removeLast() { + final Node l = last; + if (l == null){ + throw new NoSuchElementException("没有找到指定的元素"); + } + + final Object element = l.data; + final Node prev = l.previous; + l.data = null; + l.previous = null; + last = prev; + if (prev == null) { + first = null; + } else { + prev.next = null; + } + size--; + + return element; + } + + /** + * 删除指定元素 + * @param o + * @return + */ + public boolean remove(Object o) { + if (o == null) { + for (Node temp = first; temp != null; temp = temp.next) { + if (temp.data == null) { + deleteElement(temp); + return true; + } + } + } else { + for (Node temp = first; temp != null; temp = temp.next) { + if (o.equals(temp.data)) { + deleteElement(temp); + return true; + } + } + } + return false; + } + + /** + * 删除指定位置的元素 + * @param index + * @return + */ + public Object remove(int index) { + rangeCheckElementIndex(index); + return deleteElement(node(index)); + } + + /** + * 删除指定节点元素 + * @param temp + * @return + */ + private Object deleteElement(Node temp) { + final Object element = temp.data; + final Node next = temp.next; + final Node prev = temp.previous; + + if (prev == null) { + first = next; + } else { + prev.next = next; + temp.previous = null; + } + + if (next == null) { + last = prev; + } else { + next.previous = prev; + temp.next = null; + } + + temp.data = null; + size--; + + return element; + } + + /** + * 检查索引元素的范围 + * @param index + */ + private void rangeCheckElementIndex(int index) { + if (!(index >= 0 && index < size)) { + throw new IndexOutOfBoundsException("索引越界"); + } + } + + /** + * 返回指定索引位置的节点 + * @param index + * @return + */ + Node node(int index) { + if (index < (size >> 1)) { + Node temp = first; + for (int i = 0; i < index; i++) + temp = temp.next; + return temp; + } else { + Node temp = last; + for (int i = size - 1; i > index; i--) + temp = temp.previous; + return temp; + } + } + + /** + * 用于表示一个节点 + * @author ikook + */ + private static class Node { + Node previous; // 上一个节点 + Object data; + Node next; // 下一个节点 + + public Node(Node previous, Object data, Node next) { + this.previous = previous; + this.data = data; + this.next = next; + } + } + + /** + * 返回一个迭代器的实现类 + * @return + */ + public MyIterator iterator() { + return new LinkIter(); + } + + /** + * 迭代器的实现类 + * @author ikook + */ + private class LinkIter implements MyIterator { + private Node lastRet; //始终指向刚遍历完的节点 + private Node next; // 当前指向的节点 + private int nextIndex; //当前节点的索引值 + + LinkIter () { + next = node(0); + nextIndex = 0; + } + + @Override + public boolean hasNext() { + return nextIndex < size; + } + + @Override + public Object next() { + if(!hasNext()) { + throw new NoSuchElementException("没有找到指定的元素, 迭代器遍历失败"); + } + + lastRet = next; + next = next.next; + nextIndex++; + return lastRet.data; + } + + @Override + public void remove() { + if(lastRet == null) { + throw new IllegalStateException("非法状态异常,删除失败"); + } + + Node lastNext = lastRet.next; + deleteElement(lastRet); + if(next == lastRet) { + next = lastNext; + } else { + nextIndex--; + } + lastRet = null; + } + + } +} diff --git a/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyList.java b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyList.java new file mode 100644 index 0000000000..f1fa613d0e --- /dev/null +++ b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyList.java @@ -0,0 +1,22 @@ +package com.ikook.basic_data_structure; + +/** + * @author ikook QQ号码: 935542673 + */ +public interface MyList { + + public void add(Object o); + public void add(int index, Object o); + + public int size(); + + public boolean isEmpty(); + + public Object get(int index); + + public Object remove(int index); + public boolean remove(Object obj); + + public Object set(int index, Object obj); + +} diff --git a/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyQueue.java b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyQueue.java new file mode 100644 index 0000000000..824d7579c6 --- /dev/null +++ b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyQueue.java @@ -0,0 +1,42 @@ +package com.ikook.basic_data_structure; + +/** + * @author ikook; QQ号码: 935542673 + */ +public class MyQueue { + + private MyLinkedList queue = new MyLinkedList(); + + /** + * 入队操作 + * @param obj + */ + public void enQueue(Object obj) { + queue.addLast(obj); + } + + /** + * 出队操作 + * @return + */ + public Object deQueue() { + return queue.removeFirst(); + } + + /** + * 队列的长度 + * @return + */ + public int size() { + return queue.size(); + } + + /** + * 队列是否为空 + * @return + */ + public boolean isEmpty() { + return queue.isEmpty(); + } + +} diff --git a/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyStack.java b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyStack.java new file mode 100644 index 0000000000..0ad6c05910 --- /dev/null +++ b/group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyStack.java @@ -0,0 +1,73 @@ +package com.ikook.basic_data_structure; + +/** + * @author ikook; QQ号码: 935542673 + */ +public class MyStack { + + private MyArrayList elementDate = new MyArrayList(); + + /** + * 入栈操作 + * @param obj + */ + public void push(Object obj) { + elementDate.add(obj); + } + + /** + * 出栈操作 + * @return + */ + public Object pop() { + emptyExce(); + return elementDate.remove(topIndex()); + } + + /** + * 获取栈顶元素 + * @return + */ + public Object getTop() { + emptyExce(); + return elementDate.get(topIndex()); + } + + /** + * 判断栈是否为空 + * @return + */ + public boolean isEmpty() { + return size() == 0; + } + + /** + * 获取栈的深度 + * @return + */ + public int size() { + return elementDate.size(); + } + + /** + * 栈顶元素所在索引封装类 + * @return + */ + private int topIndex() { + return size() - 1; + } + + /** + * 队列为空异常处理封装类 + */ + private void emptyExce() { + if (isEmpty()) { + try { + throw new Exception("队列为空"); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/group18/935542673/Coding/README.md b/group18/935542673/Coding/README.md new file mode 100644 index 0000000000..77e4706a07 --- /dev/null +++ b/group18/935542673/Coding/README.md @@ -0,0 +1,3 @@ +## 2017编程提高社群Coding + +2017.2.19 [实现基本的数据结构](https://github.com/china-kook/coding2017/tree/master/group18/935542673/Coding/20170219) \ No newline at end of file diff --git "a/group18/935542673/Datum/\345\205\263\344\272\216 .metadata \347\233\256\345\275\225\345\222\214 .gitignore \344\275\277\347\224\250\347\232\204\351\227\256\351\242\230.docx" "b/group18/935542673/Datum/\345\205\263\344\272\216 .metadata \347\233\256\345\275\225\345\222\214 .gitignore \344\275\277\347\224\250\347\232\204\351\227\256\351\242\230.docx" new file mode 100644 index 0000000000000000000000000000000000000000..d169fd91bf6a6a0ade817eb981a37595454334b5 GIT binary patch literal 82125 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 literal 0 HcmV?d00001 diff --git a/group18/935542673/README.md b/group18/935542673/README.md new file mode 100644 index 0000000000..d98a632c03 --- /dev/null +++ b/group18/935542673/README.md @@ -0,0 +1,15 @@ +## 2017编程提高社群 + +群昵称:青岛-ikook + +QQ号码:935542673 + +------------------------------------------------------------------------------------------------------------------------------ + +**代码库结构说明:** + +[Blog](https://github.com/china-kook/coding2017/tree/master/group18/935542673/Blog) 目录为本人在社群中所编写的所有博客,可在 README.md 中直接点击某篇查看 + +[Coding](https://github.com/china-kook/coding2017/tree/master/group18/935542673/Coding) 目录为本人在社群中所编写的所有代码,可在 README.md 中直接点击查看 + +[Datum](https://github.com/china-kook/coding2017/tree/master/group18/935542673/Datum) 目录为本人在社群中产出的所有资料 \ No newline at end of file diff --git a/group18/group18.md b/group18/group18.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group18/group18.md @@ -0,0 +1 @@ + diff --git a/group19/1294642551/.gitignore b/group19/1294642551/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group19/1294642551/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group19/1294642551/readme.txt b/group19/1294642551/readme.txt new file mode 100644 index 0000000000..747e8550dc --- /dev/null +++ b/group19/1294642551/readme.txt @@ -0,0 +1 @@ +JaneZhou91's files \ No newline at end of file diff --git a/group19/1294642551/src/arrayTests/ArrayUtil.java b/group19/1294642551/src/arrayTests/ArrayUtil.java new file mode 100644 index 0000000000..a9f23394e9 --- /dev/null +++ b/group19/1294642551/src/arrayTests/ArrayUtil.java @@ -0,0 +1,270 @@ +package arrayTests; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.TreeSet; + +public class ArrayUtil { + + /** + * һa , Ըֵû + 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * @param origin + * @return + */ + public int[] reverseArray(int[] origin){ + + int len = origin.length; + int[] arr = new int[len]; + + for(int i = 0; i < len; i++) + { + arr[i] = origin[ len -1 - i]; + } + + return arr; + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + + ArrayList al = new ArrayList(); + + int len = oldArray.length; + for(int i = 0; i < len; i++) + { + if(oldArray[i] != 0) + { + al.add(oldArray[i]); + } + } + + int arrLen = al.size(); + int[] arr = new int[arrLen]; + for(int i = 0; i < arrLen; i++) + { + arr[i] = al.get(i); + } + + return arr; + + + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ + * a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + TreeSet tr = new TreeSet(); + for(int i = 0; i < array1.length; i++) + { + tr.add(array1[i]); + } + for(int j = 0; j < array2.length; j++) + { + tr.add(array2[j]); + } + + int arrLen = tr.size(); + int[] arr = new int[arrLen]; + int index = 0; + + Iterator it = tr.iterator(); + while(it.hasNext()) + { + arr[index] = (int) it.next(); + index++; + } + + return arr; + } + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ + * oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + + int len = oldArray.length; + int arrLen = len + size; + int[] arr = new int[arrLen]; + + for(int i = 0; i < arrLen; i++) + { + if (i < len) + arr[i] = oldArray[i]; + else + arr[i] = 0; + } + + return arr; + + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ + * 磬 max = 15 , 򷵻صӦΪ [11235813] + * max = 1, 򷵻ؿ [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + + ArrayList al = new ArrayList(); + int first = 1; + int second = 1; + int value = 0; + if(max >= 2) + { + al.add(first); + al.add(second); + } + do + { + value = first + second; + if(value < max) + { + al.add(value); + first = second; + second = value; + } + }while(value < max); + + int arrLen = al.size(); + int[] arr = new int[arrLen]; + for(int i = 0; i < arrLen; i++) + { + arr[i] = al.get(i); + } + + return arr; + + } + + /** + * Сڸֵmax + * max = 23, صΪ[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + + ArrayList al = new ArrayList(); + if(max > 2) + al.add(2); + + int value = 3; + while(value < max) + { + int flag = 1; + for(int i = 2; i < value; i++) + { + if(value % i == 0) + { + flag = 0; + break; + } + } + + if (flag == 1) + al.add(value); + + value++; + } + + int arrLen = al.size(); + int[] arr = new int[arrLen]; + for(int i = 0; i < arrLen; i++) + { + arr[i] = al.get(i); + } + + return arr; + + } + + /** + * ν ָǡõ֮ͣ6=1+2+3 + * һֵmax һ飬 Сmax + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + + ArrayList al = new ArrayList(); + for(int i = 1; i < max; i++) + { + if (isPerfectNumber(i)) + al.add(i); + } + + int arrLen = al.size(); + int[] arr = new int[arrLen]; + for(int i = 0; i < arrLen; i++) + { + arr[i] = al.get(i); + } + + return arr; + } + + public boolean isPerfectNumber(int number) + { + ArrayList al = new ArrayList(); + + for(int i = 1; i < number; i++) + { + if(number % i == 0) + al.add(i); + } + + int value = 0; + for(int j = 0; j < al.size(); j++) + { + value = value + al.get(j); + } + + return value == number; + } + + /** + * seperator array + * array= [3,8,9], seperator = "-" + * 򷵻ֵΪ"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + + String str = ""; + int len = array.length; + for(int i = 0; i < len-1; i++) + { + str = str + array[i] + seperator; + } + str = str + array[len-1]; + + return str; + } + + + +} diff --git a/group19/1294642551/src/data_Structures/ArrayList.java b/group19/1294642551/src/data_Structures/ArrayList.java new file mode 100644 index 0000000000..fe0a8c1557 --- /dev/null +++ b/group19/1294642551/src/data_Structures/ArrayList.java @@ -0,0 +1,57 @@ +package data_Structures; + + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + + public void add(Object o){ + + elementData[size] = o; + size++; + } + public void add(int index, Object o){ + + int temp = size; + while(temp > index) + { + elementData[temp] = elementData[temp-1]; + temp--; + } + + elementData[index] = o; + + size++; + + + } + + public Object get(int index){ + return elementData[index]; + } + + public Object remove(int index){ + + int temp = index; + while(temp < size-1) + { + elementData[temp] = elementData[temp+1]; + temp++; + } + size--; + + return elementData[index]; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group19/1294642551/src/data_Structures/LinkedList.java b/group19/1294642551/src/data_Structures/LinkedList.java new file mode 100644 index 0000000000..5a1efb6d71 --- /dev/null +++ b/group19/1294642551/src/data_Structures/LinkedList.java @@ -0,0 +1,125 @@ +package data_Structures; + + +public class LinkedList implements List { + + private Node head; + private int size; + + LinkedList() + { + size = 0; + } + + public void add(Object o){ + + Node newNode = new Node(o); + + if(head == null) + { + head = newNode; + } + else + { + Node tempNode = head; + while(tempNode.next != null) + { + tempNode = tempNode.next; + } + tempNode.next = newNode; + + } + + size++; + } + + public void add(int index , Object o){ + + Node newNode = new Node(o, getNode(index)); + getNode(index-1).next = newNode; + + size++; + + } + + public Node getNode(int index) + { + Node tempNode = head; + int i = 0; + while(i < index) + { + tempNode = tempNode.next; + i++; + } + + return tempNode; + } + + + + public Object get(int index){ + return getNode(index).data; + } + public Object remove(int index){ + + Node tempNode = getNode(index); + getNode(index - 1).next = getNode(index+1); + tempNode.next = null; + tempNode.data = null; + size--; + return getNode(index).data; + + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + + Node tempNode = head; + head = new Node(o); + head.next = tempNode; + + size++; + } + public void addLast(Object o){ + add(o); + + } + public Object removeFirst(){ + + Node tempNode = head; + head = getNode(1); + size--; + + return tempNode.data; + } + public Object removeLast(){ + getNode(size-1).next = null; + size--; + return getNode(size).data; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + Node(Object data, Node next ) + { + this.data = data; + this.next = next; + } + + Node(Object data) + { + this.data = data; + this.next = null; + } + + } +} diff --git a/group19/1294642551/src/data_Structures/List.java b/group19/1294642551/src/data_Structures/List.java new file mode 100644 index 0000000000..2b7b51d97f --- /dev/null +++ b/group19/1294642551/src/data_Structures/List.java @@ -0,0 +1,9 @@ +package data_Structures; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group19/1294642551/src/data_Structures/Queue.java b/group19/1294642551/src/data_Structures/Queue.java new file mode 100644 index 0000000000..0926e3a31c --- /dev/null +++ b/group19/1294642551/src/data_Structures/Queue.java @@ -0,0 +1,28 @@ +package data_Structures; + +public class Queue { + + private LinkedList ll; + + Queue() + { + ll = new LinkedList(); + } + + public void enQueue(Object o){ + ll.add(o);; + } + + public Object deQueue(){ + return ll.removeFirst(); + } + + public boolean isEmpty(){ + int size = ll.size(); + return (size == 0); + } + + public int size(){ + return ll.size(); + } +} diff --git a/group19/1294642551/src/data_Structures/Stack.java b/group19/1294642551/src/data_Structures/Stack.java new file mode 100644 index 0000000000..575e451451 --- /dev/null +++ b/group19/1294642551/src/data_Structures/Stack.java @@ -0,0 +1,29 @@ +package data_Structures; + +public class Stack { +// private ArrayList elementData = new ArrayList(); + + private LinkedList ll; + Stack() + { + ll = new LinkedList(); + } + + public void push(Object o){ + ll.addLast(o); + } + + public Object pop(){ + return ll.removeLast(); + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return ll.size()==0; + } + public int size(){ + return ll.size(); + } +} diff --git a/group19/1294642551/src/struts_Reflect/Struts.java b/group19/1294642551/src/struts_Reflect/Struts.java new file mode 100644 index 0000000000..1694cf369c --- /dev/null +++ b/group19/1294642551/src/struts_Reflect/Struts.java @@ -0,0 +1,142 @@ +package struts_Reflect; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) throws Exception { + + /* + + 0. ȡļstruts.xml + + 1. actionNameҵӦclass LoginAction, ͨʵ + parametersеݣösetter parametersе + ("name"="test" , "password"="1234") , + ǾӦõ setNamesetPassword + + 2. ͨöexectue ÷ֵ"success" + + 3. ͨҵgetter getMessage, + ͨã ֵγһHashMap , {"message": "¼ɹ"} , + ŵViewparameters + + 4. struts.xmlе ,Լexecuteķֵ ȷһjsp + ŵViewjspֶС + + * + */ + + //classNameַ + String className = null; + + //---------XMLļ--------------------------------------------------------------------------- + + // saxReader + SAXReader reader = new SAXReader(); + // ͨreadȡһļ תDocument + Document document = reader.read(new File("src/struts_Reflect/Struts.xml")); + //ȡڵԪض + Element root = document.getRootElement(); + //System.out.println("Root: " + root.getName()); + + // ȡԪnameֵΪloginclassԵֵ浽classNameС + for (Iterator iter = root.elementIterator(); iter.hasNext();) + { + Element e = (Element) iter.next(); + String name = e.attributeValue("name"); + + if(name.equals("login")) + { + className = e.attributeValue("class"); + } + + } + + //-----------ȡLoginActionʵ䷽--------------------------------------------------------- + + //ȡʵ + Class clazz = Class.forName("struts_Reflect.LoginAction"); + Object obj = clazz.newInstance(); + + //setName setPassword + Method mSetName = clazz.getMethod("setName", String.class); + Method mSetPassWord = clazz.getMethod("setPassword", String.class); + mSetName.invoke(obj, parameters.get("name")); + mSetPassWord.invoke(obj, parameters.get("password")); + + //excute + Method mExecute = clazz.getMethod("execute", null); + String result = (String) mExecute.invoke(obj, null); + System.out.println(result); + + //ҵgetterԺֵŵparameterMapС + Method[] methods = clazz.getDeclaredMethods(); +// HashMap paraMap = new HashMap(); + + ArrayList al = new ArrayList(); + al.add("name"); + al.add("password"); + al.add("message"); + String key = null; + String value = null; + Field field = null; + + for(int i = 0; i < al.size(); i++) + { + key = al.get(i); + field = clazz.getDeclaredField(key); + field.setAccessible(true); + value = (String) field.get(obj); + parameters.put(key, value); + System.out.println(key+"---"+value); + } + + + + View view = new View(); + view.setParameters(parameters); + + //----------JSPֶηŵView------------------------------------- + + //ȡΪactionԪؽڵ + Element actionE = root.element("action"); + + // ȡԪresultе + String rValue = null; + + for (Iterator iter = actionE.elementIterator(); iter.hasNext();) + { + Element e = (Element) iter.next(); + String name = e.attributeValue("name"); + + if(name.equals(result)) + { + rValue = e.getText(); + view.setJsp(rValue); + System.out.println(rValue); + } + + } + + return view; + + } + +} \ No newline at end of file diff --git a/group19/1294642551/test/arrayTests/ArrayUtilTest.java b/group19/1294642551/test/arrayTests/ArrayUtilTest.java new file mode 100644 index 0000000000..d20c9a6c46 --- /dev/null +++ b/group19/1294642551/test/arrayTests/ArrayUtilTest.java @@ -0,0 +1,101 @@ +package arrayTests; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Test; + +public class ArrayUtilTest { + + @Test + public void testReverseArray() { + ArrayUtil au = new ArrayUtil(); + int[] origin = {7, 9, 30, 3, 4}; + int[] expecteds ={4, 3, 30, 9, 7}; + int[] actuals = au.reverseArray(origin); + + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testRemoveZero() { + ArrayUtil au = new ArrayUtil(); + int[] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] expecteds = {1,3,4,5,6,6,5,4,7,6,7,5}; + int[] actuals = au.removeZero(oldArray); + + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testMerge() { + + ArrayUtil au = new ArrayUtil(); + int[] a1 = {3, 5, 7,8}; + int[] a2 = {4, 5, 6,7}; + int[] expecteds = {3,4,5,6,7,8}; + int[] actuals = au.merge(a1, a2); + + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testGrow() { + + ArrayUtil au = new ArrayUtil(); + int[] oldArray = {2,3,6}; + int size = 3; + int[] expecteds = {2,3,6,0,0,0}; + int[] actuals = au.grow(oldArray, size); + + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testFibonacci() { + + ArrayUtil au = new ArrayUtil(); + int max = 15; + int[] expecteds = {1, 1, 2, 3, 5, 8, 13}; + int[] actuals = au.fibonacci(max); + + Assert.assertArrayEquals(expecteds, actuals); + } + + + + @Test + public void testGetPrimes() { + ArrayUtil au = new ArrayUtil(); + int max = 23; + int[] expecteds = {2,3,5,7,11,13,17,19}; + int[] actuals = au.getPrimes(max); + + Assert.assertArrayEquals(expecteds, actuals); + + } + + @Test + public void testGetPerfectNumbers() { + + ArrayUtil au = new ArrayUtil(); + int max = 30; + int[] expecteds = {6, 28}; + int[] actuals = au.getPerfectNumbers(max); + + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testJoin() { + + ArrayUtil au = new ArrayUtil(); + int[] array = {3, 8, 9}; + String seperator = "-"; + String expecteds = "3-8-9"; + String actuals = au.join(array, seperator); + + Assert.assertEquals(expecteds, actuals); + } + +} diff --git a/group19/1592562638/.gitignore b/group19/1592562638/.gitignore new file mode 100644 index 0000000000..0aca6d5fe8 --- /dev/null +++ b/group19/1592562638/.gitignore @@ -0,0 +1,9 @@ +/bin/ +*.class +*.settings +*.project +*.classpath +*/.settings +*.iml +/.idea +/**/target/**/* \ No newline at end of file diff --git a/group19/1592562638/src/ArrayList_self.java b/group19/1592562638/src/ArrayList_self.java new file mode 100644 index 0000000000..a6607a0861 --- /dev/null +++ b/group19/1592562638/src/ArrayList_self.java @@ -0,0 +1,126 @@ +/*ƣ + * ԭļƣ + * Ҫ㣺 + * 1. ʵֻݽṹࣺArrayList + + */ +public class ArrayList_self implements KIList { + /***ʼС***/ + private final static int INIT_CAPACITY=12; + private Object[] mList=null; + + /***ǰ***/ + private int mCurrentCapacity=0; + /***Ԫظ***/ + private int mSize=0; + + public ArrayList_self(){ + mList=new Object[INIT_CAPACITY]; + mCurrentCapacity=INIT_CAPACITY; + } + + /** + * һԪصArrayListβ + * @param item + * */ + @Override + public void add(T item) { + // TODO Auto-generated method stub + if(mSize==mCurrentCapacity){ + expansion();// + } + mList[mSize]=item; + mSize++; + } + + /** + * һԪصָλãӲλüԪƶһλ + * @param index Ҫλ + * @param item + * */ + @Override + public void add(int index, T item) { + // TODO Auto-generated method stub + if (index<0 || index>=mSize) {//indexС0index >= 鵱ǰС + throw new IndexOutOfBoundsException();//׳Խ쳣 + } + if(mSize==mCurrentCapacity){ + expansion();// + } + Object[] newList=new Object[mCurrentCapacity]; + System.arraycopy(mList, 0, newList, 0, index); + System.arraycopy(mList, index, newList, index+1, mSize-index); + newList[index]=item; + mList=newList; + mSize++; + } + /** + * ƳָλõԪأԪǰƶһλ + * @param index + * */ + @Override + public T remove(int index) { + // TODO Auto-generated method stub + if(index<0 || index>=mSize){ + throw new IndexOutOfBoundsException(); + } + Object[] newList=new Object[mCurrentCapacity]; + System.arraycopy(mList, 0, newList, 0, index); + System.arraycopy(mList, index+1, newList, index, mSize - index); + + T tempT=(T) mList[index]; + mList=newList; + mSize--; + + return tempT; + } + /** + * ָλõԪ + * @param index + * @param item + * */ + @Override + public void set(int index, T item) { + // TODO Auto-generated method stub + if(index<0 || index>=mSize){ + throw new IndexOutOfBoundsException(); + } + mList[index]=item; + } + /** + * ȡָλõԪ + * @param index + * @return + * */ + @Override + public T get(int index) { + // TODO Auto-generated method stub + if(index<0 || index>=mSize){ + throw new IndexOutOfBoundsException(); + } + + return (T)mList[index]; + } + /** + * ȡǰij + * @return int + * */ + @Override + public int size() { + // TODO Auto-generated method stub + return mSize; + } + + /** + * ݣ mSize == mCurrentCapacity ʱ;ʱÿӵǰ50% + * */ + private void expansion() { + // TODO Auto-generated method stub + Object[] oldList=mList; + Object[] newList=new Object[mCurrentCapacity + (mCurrentCapacity >> 1)]; + System.arraycopy(oldList, 0, newList, 0, oldList.length); + mList=newList; + mCurrentCapacity=mCurrentCapacity + (mCurrentCapacity >> 1); + } + +} diff --git a/group19/1592562638/src/BinaryTreeNode_self.java b/group19/1592562638/src/BinaryTreeNode_self.java new file mode 100644 index 0000000000..ff9cbf08a3 --- /dev/null +++ b/group19/1592562638/src/BinaryTreeNode_self.java @@ -0,0 +1,71 @@ +/*ƣ + * ԭļƣ + * Ҫ㣺 + * 1. ʵֻݽṹࣺ + + */ +public class BinaryTreeNode_self { + private T data; + private BinaryTreeNode_self left; + private BinaryTreeNode_self right; + + //ȡڵ + public T getData(){ + return data; + } + + //ýڵ + public void setData(T item){ + this.data=item; + } + + //ȡڵ + public BinaryTreeNode_self getLeft(){ + return left; + } + + //ڵ + public void setLeft(BinaryTreeNode_self left){ + this.left=left; + } + + //ȡҽڵ + public BinaryTreeNode_self getRight(){ + return right; + } + + //ҽڵ + public void setRight(BinaryTreeNode_self right){ + this.right=right; + } + + //ӽڵ(֤ڵ<ڵ<ҽڵ) + public BinaryTreeNode_self insert(T item){ + Comparable co=(Comparable)item; + Comparable coData=(Comparable)data; + BinaryTreeNode_self result=null; + if(co.compareTo(data)>0){ + if(right==null){ + right=new BinaryTreeNode_self<>(); + right.data=item; + result=right; + return result; + } + else{ + right.insert(item); + } + } + else{ + if(left==null){ + left=new BinaryTreeNode_self<>(); + left.data=item; + result=left; + return result; + } + else{ + left.insert(item); + } + } + return result; + } +} diff --git a/group19/1592562638/src/CollectionTest.java b/group19/1592562638/src/CollectionTest.java new file mode 100644 index 0000000000..e5ac85bced --- /dev/null +++ b/group19/1592562638/src/CollectionTest.java @@ -0,0 +1,50 @@ +/*ƣ + * ԭļƣ + * Ҫ㣺 + * 1. ʵֻݽṹࣺArrayListLinkedListQueueStackTree + + */ +public class CollectionTest { + + public static void main(String[] args) { + // TODO Auto-generated method stub + //ArrayList + ArrayList_self arrayList1=new ArrayList_self(); + for(int i=0;i<15;i++){ + arrayList1.add(new Name("An"+i, "Array")); + if(i>6){ + arrayList1.set(i, new Name("Bo"+i, "Array")); + } + System.out.println(arrayList1.get(i)); + } + + //LinkedList + LinkedList_self linkedList1=new LinkedList_self(); + for(int i=0;i<8;i++){ + linkedList1.add(new Name("An"+i, "Linked")); + if(i>3){ + linkedList1.set(i, new Name("Bo"+i, "Linked")); + } + System.out.println(linkedList1.get(i)); + } + + //Stack + Stack_self stack1=new Stack_self(); + for(int i=0;i<6;i++){ + stack1.push(new Name("An"+i, "Stack")); + if(i>3){ + System.out.println(stack1.peek()); + } + } + + //Queue + Queue_self queue1=new Queue_self(); + for(int i=0;i<6;i++){ + queue1.enQueue(new Name("An"+i, "Queue")); + if(i>3){ + System.out.println(queue1.deQueue()); + } + } + } + +} diff --git a/group19/1592562638/src/KIList.java b/group19/1592562638/src/KIList.java new file mode 100644 index 0000000000..e278f3dec1 --- /dev/null +++ b/group19/1592562638/src/KIList.java @@ -0,0 +1,18 @@ +/*ƣ + * ԭļƣ + * Ҫ㣺 + * 1. ˳ӿ:ɾġ鹦 + + */ +public interface KIList { + public void add(T item); + public void add(int index, T item); + + public T remove(int index);//ֵɾԪ + + public void set(int index, T item); + + public T get(int index); + public int size(); + +} diff --git a/group19/1592562638/src/LinkedList_self.java b/group19/1592562638/src/LinkedList_self.java new file mode 100644 index 0000000000..2cdb9ceec9 --- /dev/null +++ b/group19/1592562638/src/LinkedList_self.java @@ -0,0 +1,199 @@ +/*ƣ + * ԭļƣ + * Ҫ㣺 + * 1. ʵֻݽṹࣺLinkedList + + */ +public class LinkedList_self implements KIList { + // һڲNode Node ʵĽڵ + public class Node { + public T data;// ڵ + public Node next;// ָһڵ + + // ޲ι + public Node() { + }; + + // ʼȫԹ + public Node(T data, Node next) { + this.data = data; + this.next = next; + } + } + + // ͷڵ + public Node header; + // βڵ + public Node tail; + // Ľڵ + public int size = 0; + + // + public LinkedList_self() { + header = null; + tail = null; + } + + // һָԪص + public LinkedList_self(T element) { + header = new Node(element, tail); + tail = header;// ֻһڵ㣬header tail ָýڵ + size++; + } + + /** + * һԪصArrayListβ + * @param item + */ + @Override + public void add(T item) { + // TODO Auto-generated method stub + // + if (header == null) { + header = new Node(item, tail); + tail = header; + } else { + // ½ڵ + Node newNode = new Node(item, null); + // βڵָ½ڵ + tail.next = newNode; + tail = newNode; + } + size++; + } + + /** + * һԪصָλãӲλüԪƶһλ + * + * @param index + * Ҫλ + * @param item + */ + @Override + public void add(int index, T item) { + // TODO Auto-generated method stub + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + // ǿ + if (header == null) { + add(item); + } else { + // indexΪ0ʱڱͷ + if (index == 0) { + addAtHeader(item); + } + else{ + //ȡǰýڵ + Node prev=getNodeByIndex(index-1); + //prevָ½ڵ㣬½ڵnextָprevnext + prev.next=new Node(item,prev.next); + size++; + } + } + } + + /** + * ƳָλõԪأԪǰƶһλ + * + * @param index + */ + @Override + public T remove(int index) { + // TODO Auto-generated method stub + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + Node del = null; + // ɾͷ + if (index == 0) { + del = header; + header = header.next; + } else { + // ȡɾڵǰýڵ + Node prev = getNodeByIndex(index - 1); + del = prev.next; + prev.next = del.next; + del.next = null; + } + size--; + return del.data; + } + + /** + * ָλõԪ + * + * @param index + * @param item + */ + @Override + public void set(int index, T item) { + // TODO Auto-generated method stub + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + // headerڵ㿪ʼ + Node current = header; + for (int i = 0; i < size && current != null; i++) { + if (i == index) { + current.data = item; + } + current = current.next; + } + } + + /** + * ȡָλõԪ + * + * @param index + * @return + */ + @Override + public T get(int index) { + // TODO Auto-generated method stub + return getNodeByIndex(index).data; + } + + /** + * ij + * + * @param item + */ + @Override + public int size() { + // TODO Auto-generated method stub + return size; + } + + // indexȡָλõĽڵ + private Node getNodeByIndex(int index) { + // TODO Auto-generated method stub + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + // headerڵ㿪ʼ + Node current = header; + for (int i = 0; i < size && current != null; i++) { + if (i == index) { + return current; + } + current = current.next; + } + return null; + } + + // ͷ巨Ϊ½ڵ + private void addAtHeader(T item) { + // TODO Auto-generated method stub + //½ڵ㣬½ڵnext ָheader + //½ڵΪheader + Node newNode=new Node(item,header); + header=newNode; + //ǰǿ + if(tail==null){ + tail=header; + } + size++; + } +} diff --git a/group19/1592562638/src/Name.java b/group19/1592562638/src/Name.java new file mode 100644 index 0000000000..53cd951cd7 --- /dev/null +++ b/group19/1592562638/src/Name.java @@ -0,0 +1,36 @@ + +public class Name implements Comparable { + private String firstName,lastName; + public Name(String firstName,String lastName){ + this.firstName=firstName; + this.lastName=lastName; + } + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + public String toString(){return firstName+" "+lastName;}//дtoString + + //дequalshashCode + public boolean equals(Name name){ + return (firstName.equals(name.firstName) && lastName.equals(name.lastName)); + } + public int hashCode(){ + return firstName.hashCode(); + } + + //дcompareTo + public int compareTo(Name o){ + int lastCmp=lastName.compareTo(o.lastName); + return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName)); + } + +} diff --git a/group19/1592562638/src/Queue_self.java b/group19/1592562638/src/Queue_self.java new file mode 100644 index 0000000000..7679c26a64 --- /dev/null +++ b/group19/1592562638/src/Queue_self.java @@ -0,0 +1,37 @@ +/*ƣ + * ԭļƣ + * Ҫ㣺 + * 1. ʵֻݽṹࣺQueue + + */ +public class Queue_self { + private LinkedList_self data; + private int size; + + //ʼ + public Queue_self(){ + data=new LinkedList_self(); + } + + // + public void enQueue(Object item){ + data.add((T)item); + size++; + } + + // + public T deQueue(){ + size--; + return data.remove(0); + } + + //ǷΪն + public boolean isEmpty(){ + return (size==0); + } + + //г + public int size(){ + return size; + } +} diff --git a/group19/1592562638/src/Stack_self.java b/group19/1592562638/src/Stack_self.java new file mode 100644 index 0000000000..5a89d9e0e9 --- /dev/null +++ b/group19/1592562638/src/Stack_self.java @@ -0,0 +1,42 @@ +/*ƣ + * ԭļƣ + * Ҫ㣺 + * 1. ʵֻݽṹࣺStack + + */ +public class Stack_self { + private ArrayList_self elementData=new ArrayList_self(); + private int size=0; + + //ջ + public void push(Object item){ + elementData.add((T)item); + size++; + } + + //ջ + public Object pop(){ + if(size>0){ + size--; + return elementData.remove(size); + } + else{ + return null; + } + } + + //ȡջԪ + public Object peek(){ + return elementData.get(size-1); + } + + //жǷΪ + public boolean isEmpty(){ + return (size==0); + } + + //size + public int size(){ + return size; + } +} diff --git a/group19/1592562638/src/com/coderising/action/LoginAction.java b/group19/1592562638/src/com/coderising/action/LoginAction.java new file mode 100644 index 0000000000..10879cc48f --- /dev/null +++ b/group19/1592562638/src/com/coderising/action/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.action; +/** + * һչʾ¼ҵ࣬ еû붼Ӳġ + * @author liuxin + * + */ + +public class LoginAction { + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group19/1592562638/src/com/coderising/action/LogoutAction.java b/group19/1592562638/src/com/coderising/action/LogoutAction.java new file mode 100644 index 0000000000..b17e569c06 --- /dev/null +++ b/group19/1592562638/src/com/coderising/action/LogoutAction.java @@ -0,0 +1,6 @@ +package com.coderising.action; + +public class LogoutAction { + LogoutAction(){ + } +} diff --git a/group19/1592562638/src/com/coderising/action/TestMain.java b/group19/1592562638/src/com/coderising/action/TestMain.java new file mode 100644 index 0000000000..779782607e --- /dev/null +++ b/group19/1592562638/src/com/coderising/action/TestMain.java @@ -0,0 +1,112 @@ +package com.coderising.action; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.JDOMException; +import org.jdom2.filter.Filters; +import org.jdom2.input.SAXBuilder; +import org.jdom2.xpath.XPathExpression; +import org.jdom2.xpath.XPathFactory; + +/* +0. ȡļstruts.xml + +1. actionNameҵӦclass LoginAction, ͨʵ +parametersеݣösetter parametersе +("name"="test" , "password"="1234") , +ǾӦõ setNamesetPassword + +2. ͨöexectue ÷ֵ"success" + +3. ͨҵgetter getMessage, +ͨã ֵγһHashMap , {"message": "¼ɹ"} , +ŵViewparameters + +4. struts.xmlе ,Լexecuteķֵ ȷһjsp +ŵViewjspֶС + +*/ +//ͨJDOMȡxmlļ +public class TestMain { + + private static String xmlSource=System.getProperty("user.dir")+"\\src\\com\\coderising\\action\\struts.xml"; + private static Map container = new HashMap();//ȡxmlnameַclass + private static Map containerStr = new HashMap();//ȡxmlnameclassַ + private static Map containerBak = new HashMap();//ȡgetter + + private static View view; + private static String resultStr; + private static LoginAction lAction; + + public static void main(String[] args) throws JDOMException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, InvocationTargetException { + // TODO Auto-generated method stub + + // + SAXBuilder builder=new SAXBuilder(); + //StringReader reader=new StringReader(System.getProperty("user.dir")+"\\src\\com\\second\\xml/struts.xml"); + + Document document=builder.build(xmlSource); + + XPathFactory xFactory=XPathFactory.instance(); + XPathExpression expr=xFactory.compile("//struts//action",Filters.element()); + + List links=expr.evaluate(document); + for(Element linkElement:links){ + String name=linkElement.getAttributeValue("name"); + String clazz=linkElement.getAttributeValue("class"); + //÷ʵ Ȼװ + Object o=Class.forName(clazz).newInstance(); + container.put(name,o); + containerStr.put(name, clazz); + + System.out.println("name: "+name+", class: "+clazz); + } + + /************** + 3.ͨҵgetter getMessage, + ͨã ֵγһHashMap , {"message": "¼ɹ"} , + ŵViewparameters + */ + if(container.containsKey("login")){ + lAction=(LoginAction)container.get("login"); + lAction.setName("test"); + lAction.setPassword("1234"); + + resultStr=lAction.execute();//ִexecute + System.out.println("name="+lAction.getName()+" password="+lAction.getPassword()+"->¼"+resultStr); + + Class clazz=Class.forName(containerStr.get("login")); + Method[] methods=clazz.getMethods(); + for(Method method:methods){ + String methodName=method.getName(); + //int indexTmp=methodName.indexOf("get"); + //if(indexTmp!=-1){ + if(methodName.startsWith("get")){ + //getķ + //String methodStr=methodName.substring(indexTmp+3); + String methodStr=methodName.substring(3); + System.out.println(methodStr); + + //System.out.println(method.invoke(lAction)); + + containerBak.put(methodName, (String)method.invoke(lAction)); + } + } + view.setParameters(containerBak);//浽view + } + + /************** + 4.struts.xmlе ,Լexecuteķֵ ȷһjsp + ŵViewjspֶ + */ + + } +} diff --git a/group19/1592562638/src/com/coderising/action/View.java b/group19/1592562638/src/com/coderising/action/View.java new file mode 100644 index 0000000000..2519e64703 --- /dev/null +++ b/group19/1592562638/src/com/coderising/action/View.java @@ -0,0 +1,22 @@ +package com.coderising.action; +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group19/1592562638/src/com/coderising/action/struts.xml b/group19/1592562638/src/com/coderising/action/struts.xml new file mode 100644 index 0000000000..dd598a3664 --- /dev/null +++ b/group19/1592562638/src/com/coderising/action/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git "a/group19/1592562638/\350\257\273\344\271\246\347\254\224\350\256\260/1\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206/\350\257\273\344\271\246\347\254\224\350\256\260_\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.pdf" "b/group19/1592562638/\350\257\273\344\271\246\347\254\224\350\256\260/1\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206/\350\257\273\344\271\246\347\254\224\350\256\260_\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..35e06b434a2fa68b67213357cc43050b0e75db95 GIT binary patch literal 710498 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Νm30tyAPA* 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�Zr{ExVSOhD`}LEhtXIlg>oK$G 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

R3yV~e-iQ- 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�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 LLY!3!xPvI%3bQ5{OI9MG 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 E3#4kyFoxgT2hI( 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 G} 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 S6KY{Q*FFWL2 zl9e%5-0u#}#Qo`w6%Uy)!#7>rO_NB?FE>&3kO8)R2a9X5C{^6$4;V)HtE*DUbUNiUwYRc7nt^a)_5`dS|?h+S2U3-3m-eWN(cbDsZ)y z9Pl;AP%t^?Id+}KbIU_nPGlg!5}Q~m1Z292Qh$IraZlfU2urK3vD){*XZ3{PE;q5t ztw=DA8{fp~I|*l8?_M8W#P_vcw1}g4YaNp~0CY2GMhk&{fw26KZU@eKZvDLLU|&a8 z4Dr&L_+q8PcW^hD?h3PC_x8b%Ig&vVrIGaLrqwN8I;liqjeu85Yt@(g>k;4QiS>F* zRby@RGbh68N9+}n@d6q-0Odql7_$R|k}=WSx~UqEg#9#Q8MF5|?&dQVUs)4A9~fQ& zX_aZNa%WZYN{!wZSf}nnhqIREWc_2+X(878o96VC8 z1Y}5^UXHs^z!BT7Nsw9D+I@G>T>$L-`BUdJfq!{WjsJ< zI~AdnDWp0t^-vG~&M z^jN5@sZlf0og3c$=&;&ktn#jF*;0_2s4|%jo0=sU+mc*8kY?@)qT50EUSkr!^g(X5 zS1Rp^tSzOrqqDO_rZWl1-J=)Df`0tsAs}q7XG4M15?_v%D^zX;>nh(ph zMdgCVN{5U3%15~hLuhE0d7aWedA?W#s1##bK^|xSP`Idi{WQf8Oey>>3+{kqwj+DXPjTMe9~{sDt}9i%1UWFTDwoKRDBF1>%*Fhp*i|h0+d{T-R=S=0@uq+A8op%GtRqXw3eYgCR zHtAZThy{MCGg!nIyNt%h-^W~{(p$Zno?e}&+fv?Wde?{fXj75UAQ<@o9A@-iwvoSV zB>x|dxbJ9h$+9BkiuHVCJ{Asg)Jb@Js!6z9#-}3kS7ro!)R=J>DTQ`+xtbFPju+O} z^LGqIw#o%axw@$l3$pJPpp06q^NGEmpDX2H1?yWDp#jyb{mlb03r7Ag2N6b-1`3gR%!n;tb;rj=*N`@X0{w zp@Vt)T##P4GV~7f2dU@9_c2r2KAKxIDA-#$VLN`NV~f(IqU&HK&CLEWW>H{Z8#!1w zyI{nfS+&qr87@-@dOrVWs;b{!sboYNDmF_HSY*Y4J3_+K`Z)G7%|JABw-Za)QAJrr zg*L>xJ_`ru$)nHkbv$wT`5G|%!At@-Ozma-Tw^UuVFnOsNChZhIu(G!IjRI86@Ct! zF##mmt-fNw(z+WUdQj6MBO(Hkg!t@j>MXo9ze5cyWJ%g1Yc zMlp(KXp#`F8`x#P_PS%BwGJDgzAM#bp|jnl~*%036zlZ!v#6tZDE?Q15>_N znue^pcc2fs8ci%MuYI6-i+gD1wi$qv$Rgi)BOx9 zutH&K76p*TTJW`Aka#m0$sTXPu3p5mrm*bp)TZ}=c8!LB@1Nk6nadysgQfK-@r;}s zY3>)u@U?#E)5ghzS_YdtY;$WAkB`%KnbOwpT!lExjTpU$l$f!D5g~Sfm6!_9FZ*m{ zxMrvfvpeQHKrVHwQ&BP>C`PffFemtHDhQRFii~263z`}~!u5%7`whb|39w&A$8-|n zY{lSX0g4{y%%zrgeROR{2S4E6N>Wto`3eM4)IgXQG^3eZ_p~QAC)V4htQzA9OzA=> z@8?YHt zbqS`jvW>XK(%7hw?fzW`+c)3VU&5HDmWS+bKIg00`qN@=Vo~leB;jsALC(?|Vx>{2 zJB80Ks^kD=v8SwQKEEfwGj9IwcHCUhUcVT}8YM=A)2gHcjl%Ks>m3sF5+mh%%{8~Z zOLz{W+3zdSx>CC1Nh{jl?$Dn$5{-5c>Zd-(Eh`Lfu+Mn#a>bvV=iu}!c2o83ghMhd z)0O~|@$qRfg2rT;B43{5XO_NEI)^`F=Xh{wu`SDRhb;|x%Jnw!;_6bI z@llbl@DE7}Raok#Uz2br&{D?D1Qq5AWwNmnsu z0!p@SwjLf7X+*po(NFw?<<7A&W@hzuR#`}lkZ)&ed!{BSW*7ax;MF;oRylByv2HO` zCycO11NItx>GxLw`A$X4FYH7mlD;gO{&;T5Z1!j$|Fe$09~7&IV>9T^F>Yho95Q@O zef&QyaZz;cZNZH8w`<-Xj`-N+RL_$$ z83B8+nt=>XWn*Ldmd+#)y0vQ0{^~@7jsNg6g5inXX9IzC@{w{#&y6Hh%V0NqUY|bf zBG>2J2lmwC(Vs3!1kdq{#kum52-bdQzxZ4Dyq1zWnzm(qpXT0nyc6}> z=J0?c=>03*Ta3i9MJ&PPA^$R`{L6In8)3xF(oKJp9pS#&(!^usdx4#)&wFO_WqgAsxbw~H-wzDe_!4f_O~ zd+!__f+c)bj6^&aJ6!rG2tm~fdiK{(#C#hllVj;X=$hWi(pv}i3sz#o#KmGed$Kh5 zi`(Z#WMRw3Tj-_=zu6CY&IJAgmGw>rc_~*55jE5tVTS`g#;cC#mFC`3vS`EV8tVQ!3 z{bDlViTtG-{)tPE50XSmgEHfl_kgTpUrC0ViY%nem9$M>B_Gt~tQ`Qd*-ED@_5H8o zHk;UeY+_7LzX`3>$fYvdSp^^##kLqnu_tvg4`)LZx}T61LW=07D679cXBz0p!5hwcwB;dfk#ZQF*u+catbNI5{@^DafC4F>b+Cz#H=ukWF&*UxjX| zfI^ha>_8rr49|-z!b5y;x)pT#CT; zX$e`)f-_({4M>@rp*xlqMe?RO?k~@K0jwB1vINJVsyW-cDg)CsH|=Ip?rW%ktk!%N z8L-vEZC3KcRT6M6C~!Ky<H8ACGU@dRSbxUjE;84gjVcxKyNzd53#0$V z+VbC7U2u5KfNZG0K<5XX=n#AUj`kA`KViTgSz>lWSz83iNBz_Qh`lurke1Y}kThtO zqwx0q-&^sQ)F3W<@QIET;LLsD6M-HrSq91_5_Jb&5H|w8Y&Bhv?4J*^D1U(}q~!sE zqUT5SKxJX8;A>nHV9P4VA!?!sLtLa6gD}TgK?f&<-O1>u8x=P}1wi3rz0Ig!AXXAd zbn7eNmle#PYM^*aRi9bWuZoe@ z-BorUCxi{wYG)i)4LR!{drF8dB?AtyA`%(wv=imLiy zO}+Vbv#)$d5+>ws^{J@IhBJ=oSrW6v^$j=R zse3CAH9O<8WkKSw0A4GAZkHLD!q0BXKq?>r=z&ZJZGqv;NSA?Yny?c^nSBH18}FTi z-+6=Ze}SMbnT8Pk%y{kF@om6ZPB*b2pGW}<{MHHH4&H8~1$+f;eSsHk*=eor*@#GpJvwZN9Y77_ z0_j9;{@GAj#`P?Er1d?yD#Ww^{=9|G&(LQwbV!GKn_9#G?XF+T#ZmL#&uh2wY&@jZ z`%w50J03docTKi|@LPzP8=`b2G=>sDPCbez4fN#*YPvXwv~Vi8vvpo%)*(Y+ux#rG z&M$tmII?bz8S6L42vQP9LxkOo5rq-#qrwl^M}_h|YTuXezJD1)c_LP7D;n4pm*8x= zf{3@wgu!I-W_8tNX7Ddu$yV^icle7ItQVZgBTwbw+2L>U7|cjd6rIhPPA6Yp z>qUg49>C{X`11zt1?M-nzUTQd?UK};Gr-AYuY)EhBMBUB%nO832BOqJZUk_%aKM?s zm&GIwV)=xBxjUH)Wg)>7xJiS4ls;uCkoNapZF2g*PlOFp1D;{kHkfnJzr*p8RHYAZ zPkEUNY0tow!B3hLfh`o7$9S6MeMP^+(Ah@g=ZM%$0&o`Uz^q2pav>$5M41pb<*h#l z)duU688J$b0aSy4F9Z+7aK^fg2+bgzpjKvCgK{8`yE8jCN7~$ZGGqwo1D)TK5sD7` zz21ILKX=!PC`uI5@migh+#| z{`gk;M=?CLL?d=!mw4U@upkreU!NbS$>1Y$L1f`)nWWjmkpZ$SeKX5Va<^I46YGg*)GxqVwa+kKZ8{=Nw;%t2f_&u<&S`}o5}rsDDS?V1Pvc8 zSOp;|7|t*rh#&ajA2|^!0je8nrfy>q>sxw+5RCVh z{wC9ME<768MFxMC{6}k&fQp%cxeX%$*yF{ZzyL^Xp{3RUs4S=>tt*?v+mP2C=MC9v zoUhBuiVz%Fe_s@}Y;(NB&^tCG;ybZuss=wII9sy@Fyufre6|aSd^2o_mTX`6Sr)0% z6{9~O6?DkZAZ-q^t0BG|7m!~dVqhfq3KH=Bg!HkEY^=f!a1%)t{RJ1W0kC!;91oEL z*z(>wsSE=vJwfamO__}dK`Ju>E(qbgEp+Q`VDSE!)7wsSXIP^Enp~r=-6si*>nGLt z(L5UZIMw`QU#&U*p#<&~+M^ZdB{=L+0#flT>uq3Pra#cLO(_R>9MRLNvBR1h>fU*) z={J2JogBZy=oGzabBJ`1WF2*t-t|V*AMNQRy-e=);4wFLt}{ylSq${MSV&B(Qhmrw z94Lymq`VF#1H)90afj!xoJi+Q=*j^*1X7EmJ%Y;tsXHe8mL8#WRlu<`lZ=qF$E$%G%Gm8hGq37sos z2OII0-^R$--rw@;hSy`_Ngtzqrzap-oreKV#5+ppB^{J>(H;zp{}lwWSLwU);Y4a; z36mj}YOlfjdwZ=CCv+dgf)>L`JJwyY6y2_T^i&WmK~!EMiMhpF;;)%b`?PjYdzMJD zE}qy3sFC{g9y&4`{>&@_O(vg$7*3f$`vboa1~SjaK}iniSmcE7gg`_4t^@J{UKOyA zp@`VR)o7ktax%;S1o-7XCz76*WuIXh1f*H?<31K>>DwqSIvHl9h~6Tab{r5BDxR~9 z2MLlv0n2WP9FV+)eG~eU#l%Cp3JklKE`jz()S|krd|3GVyiRS zRf<2~GH{{_Sl!AiWPXg>3AaWqw;J*4T_$ip zEE6F8N>azqo-754N`#OVYLkhf_Vm$IeIbBQqd(q`pbP9OFasgw)Rn^BD^NHZX89n? z1PmmuToW(5l81ON{#Kn}wn-ot3;Z&eTvQ~kfa^@}RSxiyNtmu#fggpMBrOBI;shV> zw!@WWm>>@^@xso^70IpyfOdkclwf8Nhd*NSZH8etqaBIKee&B%PU_G^qnX;@&0_&_m?u-muUWVuQ=LZh^f(k77%z9E z6S%94N)(-Ttg-L?9L32;@Ix;-NH`T28SHUhde&e1T(dm2LFhv#=^P~GS)iHmh3w6~ z(bG;5StKuWkQPt7&VGRu%n*fSAczzNUbuUfB6w{|63sk`5${KiIB-2EvcM&!yj46p(S5h|dJrSfgiw3Gju%vylbvnu6akd7-fooF|TQcu4;-yFsNZQLCBety&(S(fH z^k0^uG<`H;EQ=lXc|5?xy(g$2hk&4o&+gZIY3T_4(ksmb<&8fgOJGGEa` z!c$Pc1|~}8{ezfiV~k)z-O%j9p%E>#8Vm65#0YwjZ?i!FerUd}QQ?$Yy8yooor7i* z?*P=MH!0w*WHc3!$f14P5Ln$*VCa0%qwG#FX_}3Q1bvb+oz;3)c8_*o7Y0mRCC=S} z^$_mty|Ya=dX572OR_H3Bq`y%Q$RR~LQ~P8xL5E1I7{q~Y5T^Me`_nSp4)?3aDxrc zr0>X+iYjAfeYzSai)h37X`#mObnyOt0a7KYtE@Sc-Ea|%1z#?A`Fj@q1l2f!>C^dg zxp^NKT`6{$8KD`31$rqOz%=nX%Ryvbg~Qi_XaAK+lFNV)hBcaMB}9(+3O5~Bc0*PQ z@QB;*g8Q0SA_52#j%?^1Rp|PEs_gU{$HH7jUZAG+%3y&+&|@s9rwaT)$VkJ%Z@jy1 z7fT@0GxfYzU0T5ID8>&DuF8*VUoVoyJaMNXM!f;DZfy1aTU;dj=<#$APX%-Zo1({^ zm$!FRmrnvnR)J>n)eK-la%LjE)YsRrCfdc)**=c+4{nJ>-q`xT9-5tN(O` z6h+_13%rD~uP)3?t~7B2QQU#p4}JnkTI%rVJkO+kt^?mas6d={J}Q);P6e?*VD9JA z;>?R~Mqos_6b+y>w50$_!yuZn1hLmy^r?+@ypa~X4P0Y${W2Y(Z2#pe|3wM&a_!Gim0;Mlv_ zq8TQ}&)?*q&@-5~h->36x@Bf@Yd`~-TC#Rmx|!LvZVD2yYpTfFB=Hd#pta3+Ynx7f zq`1m>a-Ro_Mn2D}m2^_lhjx{@P(De~?_;(8>A90UU9L-B}sv9rDk;kmtEpcCF*0P)C=4ziC)>_;*OSTrDAycdS0 zLU#ps_9g-3ff?NCCuNP()p02BhAXq5)(9Vv0iFP~=h9A& z0P=F3hBWm=;Q^9q>UVIN=kq>4dEzVe6#5Xu^9)vy*vL`v)y07{{c{}-{yKk*xXzh3hIk@ZO5f9KjH zJU4up-SXCYVXsGlFbvu8VJS4HaYSrnUQXI>IJYt2!8QkZ!~{QOX#5DlYDupWicb?H z&de;8xy51wxIvj}|3ioA=HUQ8(vu?A7+aTwON~mjVl@hQ*f=hsW*3CDfZajWSpOmK zRO$4-vY~|~hX*KD|Be+bPDkTgU1jxgc{Np8jXkB-Pmw;m`(3dgsyndCKt|Jn>je-U zbjvx}&1d}NM zbsJtO_ApI)T;|}T?*$GB9pl~jh@O_$Rkg_H_N=myt=QgvisH=4D zV?^#5NnM0Y1|Dz$j3Pg|(<5$z%G%HT&ZqT-zd&A?avC*Fm7ixUsqgx_*DbjwmQU)v z2EBRCWHO`rzgTrTOewdTzdgs|NDjJ>ai+`df+aGQF0dRNZrf!rYi0SE%(*K_Ec+Jn z8ag&_pRT%O!h7CAp}+yQ`0%br`NiWkyvl96)=BL?gagcG7El@SVR|ts&VE4>zU1*+ zSxe`BD)|d5COsuPMqy=Htrp!nLO~oQlhB8FcgbXSy_q^km?i7dl$jMWlk7*pbGYvr zE@MO{23`hE1rNM;sb7f(Rl>9BkpcEhG|JJ3^8R;QTsZE{YpUpWuIJFwic53XmRmyu zSR~w&cYVsfzt~F)BFe~7pVU+__=0!%WouW1Gb;n&F{nTFtB~Oryw2$L_tC^Y(~;^% zU!mP$a&&lX|HXCxPdC%Qt{->$ypyR}c?522{{#}S)x)<;2{oszoX?NP%VEsUsSr8l zj73SV3XeGml_?zv-mA6i!KT0nzDG+j7(CPJWBnm}#ca6YMn|oA^jxKOiIBer>MS=| z(*eC5{0qeUY6Mem(cQcgFhpt}pa1ZDg!H-cNZuc{e>W&tYSmJUDGM=44qah-WQrTL zMncr>m29-5U$AOJDO7wX(GzRp?t73%p;2e+vCf{rf^FNa29*lFoZHf;e6PNR)sy@X z47~?2IGze{Oc_J^KAu1c=f_BjTJvnGlymxzkK7Tr_C(*4slljM5dEQXRI#P>M`MGS z{sHIxn+bD#w-6^tW;2M%aK5hE{Il)IS35x=>clm_EMqYlGUs8`)lH8XD#~FUW?7<*H+Tr3F3D{&U(TqF;JQ;bLFY`~OGm zg11x8!Y5r-c*EI}%?aobp7Z%{ckcOrtp2~jvitmW01{vGRZ@(hqFvcTY5U4@(bY&!ctKMT zJPQ<>={gKzDFd0wU?4&taRQR5$^Z~ztbzCnL>Ik)Nd6&4djl%G)%i%i`Zwg0&MOmPxgO z;h(sFfiQGX-1$I&n-*fB^W{3kT6HG@c}YdqwIA43I|c$_5P>kxJgH{&?;tuJBAvb* zip!{a9kf;g6zTtAxA<$@WE71TTHrP7Mw3-eI+!=rrkrXE@RrqwQ~-J(ufmupOBo0^ zLUN+R;sntsLh#?tN5_S){q;6C$I8mz965Lj)zvFgO&LoX+){q&tSBcH!fh8M{u=27 z>w7f<|0J9-*+Ihj_lB6tv088tBLo#?SuHKkC@}^Bp|TdCaYICJeS@SLhOBg;X~zAy zc@IB*HZV3-aI@bSqGT1=Tz%*q@HU~hmDxL$$orn(ew=EZ1dMowX3hWUiZ0TMIoHl$ zVOhmONFjWpwlFGOX`&Y7rTY)y&R;8qs^bOHP3f4d`}%yUX2E_vRHc6Qo@^&Us#$+# zK+4L@gMv(y<}qk1PN1*-+KUp@jwtiH4M=;v9|1=U4$Hq?dFX25aRFG<2g=;=PY=oa z*)V$k`whSrm9 zdO3`+l-c~hx?KMDF4M#?3GBh7f!EdbT;N2h?_1M)ly^0ZQv=y3i-DywG`G{Z-z>yj;GqR!u`~ zs`h^GvK%*FQqIdQJ8Uc=jD3$!Wp)==)QK{Mo{S3}lx>}<8zE;X`_K?3N%ic`86TX1 z)WZua)sU(rN4SmQrwuxB)`K_6oieD?raWqWGs41YCw@X?wC|_t{?{)LSQ`n=xipqQ z81=NYc$63iXZlHYkIZ({BVvyDUe?{~fRGt&+ zfXOekN8+u~ew1ox!qG&vXoE)#KWbFGNHu6t>h=cJ)n)Un_rH=zsgr)o}Moq8}`r!$HyoC4QiO ztV(%Y5faIsu@F4$yP#sqd-2Jt*qFioTAA;&)Q7EDiLGrLtYHsR9ix!J?kkHG`LByc zI|HH@DW4kR4JMm$<2pE~3F*>kQDnkayl2K>n(a!Y8t)S?>NK!pbZ76(Th`e_nz-fH zQ^ekq85NGZP}Ohau!pwOo)_MC+Q1vgpJY z1W8rR7))3p(xA=wj&RYaK$|4v@S9ZucJ6Q{Ig-v1pRk(d`z-|JdxLMP?DU$3eoWU} zI;KjeMc63qQo`1;LL08q&+}?(<5f6RAcsvHe;wg;?Uk0k|d^W zFP0n2*&ofv272iZ*ryL{{zIT9_xlMzvL=!=18gI#gUlaCRvPw9O9_0AzhFCRGGZIojiSXbFd=CG2_#7f~jB6Uez zB%e>cx|(@bnRRhu6+Vy6&r>m`>v6AT=6O>~)~RN#n&QPRKYiOb#5yVFx8{bVdq=wpk)$Uy=?=DT;ZvyYwqs4;IQe31d$zCfhUpXuTL zEeJv%?+c__v+el(s7YjCC4Uygy}ZVZ=64OfzN2_H%lF2U z6--SFU0z$=ay-d!emAgjFc&ws()&o0Kjutn5+|~iO)+zUr+@&P7r;xTzS3?pd~;kQ z;)=g#a?>8+LB7UcIbZ{Y9>1uoWz6rDy3qW>l$*uD&*x)JHLO8e?UrxIkiqMF;A}T) zYBJmTs>mLbcX)HI79%;hnad!_6=;J+;Ht`j(=w57L!o)O@$3MAn;KAI*W=Da^?mA$ zc(%r<_r8sP^q>~6Ivr7(`2Cv-XY!pe4r%iIg>Ry)FYDZTTxTShORwravl~h!4zBu2 z*1VFv=~ANQ?|Z4kc%>)O?ohU3bG6hww-@*(={(cWXpYV3r@h#n%dj7@{TO1ex-V9P zB#?AeK<@x<0ewJUKSY?Qq=Az*cQ;WjDHJIueD4_X%*Pb1ir2lRe2QqJ<83N2iKri z#(g>0dENb-s?mfx&ce%k)l}kQbI?@FiZU#3vM`dzaTj+=mjz5W03#;VczX0dWyt#% zUi6RbdF86BvS38T`E%^AY!AC1i0N=0iZRdq<{FApZHA)@9_FF9gJygECeL$7!__3d z+Z?`18pn&@-t@5Pq{zfLB}IY6&!{-(%23+{C+w%Mv=iGp-|NH%`C`=sJTCnMCM)yN z+>LiA>yxdMRG)wfF&7Xtrj4s1r#S>)B3(T{vL4&N+mzxtAh>YHlMW9%F}a^5#U3c= zWrQ2|^~K$T&15SV_YVs~b-TllCXxhuOsEkA>mTG4X^0; z^>Ka_xPfaIFa+?16sLFL$3{O&NOss>| zYzy^3A8mQN9^xXSRF!e&-N2S&KDCWC#LOJvZhT8oh{c-u+}n>SXL!1ApILwI^R-mK zlM0%{(`Jh|=8bN{3{qQ@qj)qH#d|(!5q|7MyEC2>%e!fMUV`ONZUvTk5H_rQU$Olm zlcK#g_<;AtTDPx9$%0&-%7v;yr&?JZrRxch@XEzWtM3`JeO@)9E~b#T)H9Whqo&cf z#GOKBHqZHckD@aM@yh+RB$xCUZA5rt@rtUK3su*E1a_kVpJkLIr89Q)TfDV+UzhQq zJ4lEe(gofHVmaoE2u8!c%G@PJGH)e4a^NFj{-80(4YZOK8l__R0)uAn}lq*p$218DE%`fAXsou(uxr(t2m+^hHpscH4N@)@< z7BEhU#iFRgAi5cK7EF-S-v)@!%mB4042b2(KSD%J4ZWX1QMnAVm&?8vR4(&mfm7$qn)#+` zP&Q4j{cgFt;e5YJ<$IM|pl+!6nmJZcFZcUnoNf{QWmbc`(W~|uwW(@&+SR;wC!?dO za@^k>yv)VJ#w2wCC?RkP+Oe-v8=VBoT6~^W_Hmqu5iWc&6lFXE$$$w}6R2%cuW&AE zsXse-TUjwkRoDusj#}Gv_G*}?uX=EM=TA!M->FNrx2bKF@cpW#N)u)t)Xvh4E1*a! z%a(Jjl(>3()l@?{_>dZZ~Y zOj;e^Z_AAxom+I}1pr%3MBIM8L$b=uns~=j{xi3kF^xhWClqJuN3k)fC$eb%{UR4s zNeN&kpgx|Iw+Fx>tJ;MnB#+w6Oir_wiU!x3pYa{gbU*EjD}0*9enMMb1rR^<#UGGj zZfCJ^yn85A6xfyCCS5Hl_yrQ>J<6k#|kp>cq0zBu?-oSMdw?4GEyr1m2CcLzExd9+*5FP(Y zcZB}M>HTlI?r)o(3CVB;Sp=GW_fkLAC%Mz3aGpckXjWAsRWZZ)`-4t~wA1n{U@Y6= z<^ZnibgLW)&`93{!uWI1)THqsu*D1@SbqJZ9i|R{MAHAGbxJ56UKX_9`3mZ`Y2Y!{ z^q4H;M`TzYh-~(JSn+pH0bCd0t^7x+-*s&bl>sJj7KoiH1Fzbv8sloAGzq^^uESWI zjY(2v;ccP+tQ-DiDZ&R~fnNG*kNw{#_peF*|MM~M*Bl9R@dKUXV9cUA%5OKpB_D>o+(R|_jQ;1)$ENB7@{N36ns ze5WYD`smNQ6opv@9{u^52&;g|?=u-0eg%lTl8(E%yA@DKN$1f+R^acS-)OozS?E}~ z8}n;EQRLUPg1GamH~>HW_|Jp=1Vp+|h; z0;a6|@<5Y-#=5Zz3jMB{U&+{XV?&#+HyH^(8{PH^dPpmv`Ev&Sa z9s||un!j=bZqadf^{{aNv*$o%GBSS~rQbFGHA;%MZ``e1`4!&)y?SD0;bdvW|IEtK z+T8|dfPl#FVt)-XBs0a>A%>%#9NqTqm$}R^Zn=KGSEuV}MLbrTSfd~|^=-b3E1Wmk zZp-i1R|=onohwT(@sh}_4E=CS(|xWXea<#yasBhW@CY1m?F0OIV`c`Ntqpn=ZuOC6 z2V8F+Lw^PMdZTvN$iO#O$LEC_?J{k@F2QCyx!^WG)ZxbILVcm*w#HJ#b#otq`r#S; z`dU)#5sFORq*3uha^)BJ$r+pm^@)EOOY#PBeZz!S3-oshyhL$`AAN8)3VKhWcyW<2 z5dmIWiMua^ziHp8F5HzLl0EVZVgUB2W!j=ItSZcEV4%}s)l=aPaOSZPx!*rCqI^fCK;&j%G{0?U1heBfYFb>0eI zCz{eR-{nE}R;xPIwo27_zkmb9hGa7Vl2KorUI!;tFLbs8$X_Zi@dHHl_8U-!JK5P|$Kmj(<(1p4t!6 zY4!@Gl{;Ky!sH5D7@IUCja>C_srtXXW)#Lsw8wq=P(+Q%mQC2=m5@I{RL*w}^IPC= zM<1B(hb(uo(U44sp6i#Sy#MavN zLR{t|Iay9tvDY%8SZk$Sygkl`Y^(?{LD6i1gkJAMY2(P}Sf`|20VG-ahys^{8Thp& zHGZOaFh<#|AiP$}|6vKugyb1U=fn0&}ta_kJAZq%J zJeepT>2Rj*#{>0QvJH6I$^=!RC5*H#gtVZJ^adoqnfKMY;|Ii?wd^fCLROb25T=sv zSVr|l(kcRdBWS04Z6*bX1Xd~?*D-^~#`LVEASNxIN0=#IjaGKOp+jtmOUp)2ux5P2 zRer=)RE2`U>;U{Q9F^$W45E^cvqQKs%px)k9lk52Npmr|7XDH#q-C)rH)LTReYenN@`u#kbl-ib zAy!n+EAOwqSW$ICYA1Qp4i_llU#AT;FHt@c$@}P!@#0OvTXv?Ft|I6 zQopd{_parEZ^t!w&|6yrjh+T!#Wi`+f!3olE(Bj0b0xIYr)b9pv$1Z?a238wGG=C~ zNZk_sYQsfzbz0V0d}3tYyp0_}Nfj@*;KnneH=3l!RAQ%Y7vlHcPERzk?4t?YnQfEB zJPB2Lr5LQLdx7G%*XOcqGrDpIrUu1hCQ1x_NVRJw%9NIX2yKF_GEc^<*|3cvMb$dd z4|_);Qs_+LN<4)sXG67C4_kf$qhA9=Kbx82;nA)EfL}=-I zICu_yRvQa`2=0ih#Sp4K$ZY0f}sQ0C$a8^}&wU_WEx=nddO(LgM(s41H zXYt0lNBPkBg;;KK3b?X)Sryqcu#=5z>5F@QOb@aNKT0;y4?V7Ju9L^3QYP%0ZQ1=e zXaCyk_QnzIfzLpiUVpK)xq$)&We#%*dpc*uSY~7{gd$F8>npd`6<&79){8iF<&>H+ zoF=)-Jog{Fs#SrU4fAVc-Osj0)o zXG0Cv*c1}xLR-0V2;=z#k}Hgs(2;->R5D^mB3lfLoif+pOVrDDRAU!8J!K%J^&_f6l; z6KWHV$NVt-2A=Zz!6t>St)Ed5+NW$sWw@IkOu=J{)nm%K=_Afa!TlYd^N!1c;mON% z(e;gZ>RGz~O|Gcnpc~ycP+DbKXh6!Tm|QX8xEf`0)f9V64-Y<_Yfs5I!S?IkBSQNH zTZ!9>XWwVXux(Vb@(0*2FgX)(L)K|(&_-juo-|kV9ry-c(YqN`Kd5shPVgAG%p}=u z!?T!f+HN%TjsAL@P0eR+Fr2ittTr{a$~N1wd@}Y08rSwb6mu*=d$iZp@y4f6h)Edv zbgTZ!wv$Oj#|z5TcB3$3TFAFTr82l>T;219 zK`c-Vx@qqD-s%uaJPf=62mGy{+$wwr8f4J9D&%oJg~88x6JS&qskggbWX_oC#73bS ztop`oHVP=+Ep4Bv^T^gZA$FEne!cP*YR?}vPV6KqSTtc&Uv5CAy!?i^aiu)@-To{4=l=WGV=d1>z?5P*Q|)B;r1sO};!8MK;}u zi69N~DA^ZfYxzy-4{0Ghs+%-uGc;~Z3p_JTcJjQOP@?IJ-gT@FEbMcW;YY()c9{*# zc8@BuU8Db0Es8X3{BaN@b|yGPMsREN5k697z?J>v{+7&;wEun=F60-PeR)vP$F8y5 z3bD70rfHEj%fr|)HR;Qrk6wLGrS6HZ0bZbH@XL8=i+4m^N)Bj#?v|j@-hHj`b;+I7 zKCmB^EpJZ2uKh*^OE+Vl6ewu9tmb$`A3Z!T@=FPi5A1tSz%3*dReEon^67+sh8214 z!=;dgAP-$kRUN$ny{V++u$-dHqu%*fI*e`a4?E)Dw!Ed^?bjzO$yI+;jC2y3ZQt^r zQOPAh+BHcuN03dM1ou-y$3_==S$Ma)HTjz4d#Iwix2sAvs8Q_{anoL-jp^8z@zq@k zb(oqolys1PU8C(N~bgQLoY;9)p8!G>SYB^t%1AqUY0pCB+_Wvc|%k?+l`@7|T zPUZg^__Dv|V*fYbtFvTJ#Eb67`xE@VM3f-|$HEg18cL@!xmYxyo_!LIm(EmL=@MPQ zEjjGTFHCP_!@!f>cErZYjc@BUryx~>mJmtj^63fcoO6p732Iv#_%`=*=D_u4Q(V+x z?%GY%ZQFz)se2e}99k5bh&|d#(b`R$@?%MP`Dd$zcP@Tjwco|f$`2n$kxKEOMMI|N z^)wgH2qoQ~Q%<}tA+)aVAGcwI+DdrS@Ob3|zq7r^fun%7{XREz@NhdCg%arA%?I81 zWrqj4GyR#9%-2Nt4{c^d0GOq#an7Nski;b7G(I}B8hX${vDqM`|jG?~ubDONDF0zqzl=G8W-waT?d9D!G2_`-{XvFk`0L~`8F@_#W!MDt1oe!c=^=TBrs-mTES*Il(==bntW%y>+xpg1Mnb-(rZ=-@ zO2RJvP|P*|eFnQ22wmiMlNz`BifzNt%`}tDJc*r>Ce~anBhw^uvg^A;`dFfVHGDCp z_8>1DEzC;)0a7-C!Zo50y@ZOoR>Le&JSRR`z2QJMl9oE;la{K*R&?Q8TzR0WMC{KS z9B!di21yVdik!*(<-}Uf4Su{Hr%Z`fJ?smv z(A-G(wBXjPyB%r1l;_#a$AERxJsBlSBDZYV2^mISFk*IJ zh`jG=O{h_U#h!EQiq|Eg{dOh-M&$}Z|Tlq`F&q!+A!7keenyi-A;vtbrK|8drRj!q0 zz7>>_iNr#M7Yr)`Wd7AT__t1tPysO0n57s)qGTxgYiUa_8rY9je5%>FjOYhHd_qk_2nZ8TPA<22h~!$0`9X~DI{cU;_V5nV5nOTc6{vhtUantoOR}4$`sg}7l{uIK1i;} zZ*MxGSB5>Ed=x?3s81D3&vRl(54nK~jz+^xp{6J+i!T((;0t||!-X+P=VK!6I%&rQ zXQ95Xy`OTO6G?i~jJimpI7K%#xa+p4hF!12L#h@5yT>~(|G9Gi(NO!xA}ZuzB5Ibq z0v~bo{+31HDI6prcRC*K*RAin z#am73^+gSy&0JARzS8Mi>=Ek^sF{VgP~E=@g63WEY8_lt#OHlilPN#0E++VdZ>C0I zo?@tkO=5~`fgd=6r(zz(d4!yu|1H%*3wTU_*yr$4tDeE6OAZL)IDeoKNYRG%rDy$A z##I+xT8Z(;3&=fU#esAjV-^S<*BdCE201Ccc*QqKC(=*+1Wr9Sb{<(Xan0MzoOVt5 zwT-YN(qtZWiPr&JYBk2!LkUwVaU>FTYK!-*{I5j{aVkyB#%ej=7?^>dRfY5n93`0G z*T^kiq(<8>RX(-4tWo$py4`vKsrr5uN-@u9*ieI+|Fy65+r9axf&ar-`n|)?s^(_w z`kM?;cXl)TKL%$zAX*p$pXSS9U&?Qko5 z3sy}ldog<#tG|wazvYdYi;1(9qpO26IVazrPL-9ji>rj?d*B2ItHS$#yk_U%2HtP# zYUu(H3T%JS41aS;e!urW_4q#;|AV6Vqr3lQ7lCbi3t)GjgH_h`y{(mrn7xIq895uP zn2X78!h?^K6QBnEe9g?x$Hyx1-ciQP%EHo>oQIv0Rm|PukDih9u(7c!zW4m|fR~Hw zk6)_!=Z##zHLZWViG!OB;1$g5G=O*fagX>PGzK#}2M77@_Q`oTIDfYc&=|j`2=K7X zIDU`%AN0w;Fc81J$G?sGA0FmkAJrdz=ARQs&IA0~fAoNxgAHIvY#p4{9N(Lm{Ri*C zDsJWK^482*!okkb!Tyi2v;M=udn2L#4_-qSU{;(R9ey(%@RZ`UJvgdUXH=ZV&Or!> zxOn&kgw!;&bo2~d+&sK|ula#zMM_#mR!&X*orb2CwvLIZnYo3fm9>kjo4bdnmv``o zkkGL3h{(jGT6_EY2L^|RN4`$a%+Ad(eE+ey zzOlKry|cTwe{ggn z4MV{Wiz%i8_udKX6-OXEws=B*Z4Uw^r|KDwvGWunE)~~0_4)6i{V}rte*+8p-x}Fp z1N)D0ErO7tAb<}K3Iikpx_$VafhVUU2h#bMR6NW`Mx+5!s>ZX<)TRY=Md5uOs<(kH zHANpUzrU&@Gs{CcU}$b>;`wwqu1t~4mt3<{e}U@9P?S>(bG%bzkCAkQ$sibWtHovg z7PJD%DS4t4D><3qthfw-2p{qcbb^Z#AkOTUT`&VKRT^@8%;h%Mh ze%I811{4w@{u%X3Pj5vB`rFliJ%CJ1P5f^f`d{425Y6A1?cqV4-I#B~J*zi@?83X5_K-hf^%TmXzKlS!uET(=c#3I%vMB}YDCc>#KZzLCz zXXSRLPED*pGKc7xW1dW2fZXNq2nmqV^F=<2gjZ^Yd(U8_uWvCrwJGslVQ-IuW>vL) zo9zHikBv0Fbbg+URXb-%`J<&pzs3URAal0FQn<--uOQ?w6(}Ky4Gp#f?gg_NEefZT ze>I1hR04C{UhTajho-wzmP@4ixl$l=#jVPr28x5Nx-wm}el0Ga{*a*Q`54G+Jm1O+ z%o{bHWWnXGSzbhChtu}v3vbSPq$z5aX)MIJjdDM3 zlNa(RzQ)@ssd4@${Baa_jZV5rRs++=DO=#0}_vq4*{a&2BSFhF7n819Z3=$BJ9Qx z^!fbfQJ3N|D+f3C)Kt@bVRa4uZ_I*NQdG&t2(lD`{W zsbap_$G8TRLyAFL1jl>cl+Rc{nAOK79q=UZn>defl<8e?CW#_XQCZcK2x~K&)q6BX zWUQ*n_sT^V;BF;M?&dJceTvjNd8KWfV8BbDArUWK%FX;�xbu^}ied**8f4lI;bl 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

J3RR&ZNl=S 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
@pf+Oq=z>;jSjouxE@; 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

G-XxE^33~< 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�leo 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
D*5g(x6v++id3lw$3}sKS6&#RiOfY3e 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�i3f4Qka~)rSKGn3JV&Ic?N95zmEt77i8B4DreD% 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

HiYp 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 z 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[j]){ + int temp = temint[i]; + int p = index[i]; + temint[i] = temint[j]; + index[i] = index[j]; + temint[j] = temp; + index[j] = p; + } + } + } + + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] res = new int[oldArray.length+size]; + System.arraycopy(oldArray, 0,res,0,oldArray.length); + return res; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + int[] a = new int[max]; + int[] retf = null; + if (max < 3) { + retf =new int[]{1,1}; + } else if (max >= 3) { + a[0] = a[1] = 1; + for (int i = 2; i < max; i++) { + a[i] = a[i - 1] + a[i - 2]; + if(a[i]>max){ + break; + } + } + retf = removeZero(a); + } + return retf; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max) { + int[] prime = new int[max]; + int sum = 0; + for (int i = 2; i <= max; i++) {// 从2开始是因为,1既不是素数也不是合数 + boolean sign = true; + for (int j = 2; j < i; j++) { + if (i % j == 0) {// 能被除了1和自己整除的数肯定不是素数,因此只要有一个就可以跳过循环 + sign = false; + continue; + } + } + if (sign) { + prime[i] = i; + } + } + int[] retf = null; + retf = removeZero(prime); + return retf; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuffer sbf = new StringBuffer(""); + for(int i=0;i parameters) throws Exception{ + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + new XmlService().readDocument(); //读取xml。把xml信息存入map + + String clsName = readxml(actionName,"class");//获取action对应class对象 + Class c1 = Class.forName(clsName); + Object obj = c1.newInstance(); + //action属性赋值 + Iterator iter = parameters.keySet().iterator(); + while (iter.hasNext()) { + String key = iter.next(); + String namval = parameters.get((String) key); + Method m = c1.getMethod("set" + key.substring(0, 1).toUpperCase() + + key.substring(1), String.class); + m.invoke(obj, namval); + } + + String result = ""; + Method mt=c1.getMethod("execute");//调用执行方法 + result = (String) mt.invoke(obj); + View view = new View(); + view.setJsp(readxml(actionName,result)); + return view; + } + /** + * 读取Map中xml信息 + * @param name + * @param attr + * @return + */ + public static String readxml(String name,String attr){ + + Map xmlMap = XmlService.map; + + return (String) xmlMap.get(name+attr); + } + + +} diff --git a/group19/2558178127/src/com/coderising/litestruts/StrutsTest.java b/group19/2558178127/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..4c53999823 --- /dev/null +++ b/group19/2558178127/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,53 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws Exception{ + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + public static void main(String [] args)throws Exception{ + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + System.out.println(view.getJsp()); + } + @Test + public void testLoginActionFailed() throws Exception{ + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group19/2558178127/src/com/coderising/litestruts/View.java b/group19/2558178127/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group19/2558178127/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group19/2558178127/src/com/coderising/litestruts/struts.xml b/group19/2558178127/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..dd598a3664 --- /dev/null +++ b/group19/2558178127/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group19/2558178127/src/com/coderising/litestruts/xml/read/XmlService.java b/group19/2558178127/src/com/coderising/litestruts/xml/read/XmlService.java new file mode 100644 index 0000000000..6e8bcbd3b3 --- /dev/null +++ b/group19/2558178127/src/com/coderising/litestruts/xml/read/XmlService.java @@ -0,0 +1,88 @@ +package com.coderising.litestruts.xml.read; + + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class XmlService { + + private File file; + + public static Map map = new HashMap(); + + public XmlService() { + file = new File("E:/2017learn/coding2017/group19/2558178127/src/com/coderising/litestruts/struts.xml"); + + } + + public Document getDocument() { + SAXReader reader = new SAXReader(); + + Document document = null; + + try { + document = reader.read(file); + } catch (Exception e) { + + e.printStackTrace(); + } + return document; + } + + //读取xml + public void readDocument() { + + List sonElementList = getDocument().getRootElement().elements(); + + Element root = getDocument().getRootElement(); + getElement(sonElementList); + System.out.println(map); + } + + private List list = new ArrayList(); + + private void getElement(List sonElemetList) { + for (Element sonElement : sonElemetList) { + if (sonElement.elements().size() != 0) { + getNodes(sonElement,list); + getElement(sonElement.elements()); + }else{ + getNodes(sonElement,list); + System.out.println(sonElement.getName() + ":"+ sonElement.getText()); + } + + + } + } + + public void getNodes(Element node,List pname){ + //当前节点的名称、文本内容和属性 + System.out.println("当前节点名称:"+node.getName());//当前节点名称 + System.out.println("当前节点的内容:"+node.getTextTrim());//当前节点内容 + List listAttr=node.attributes();//当前节点的所有属性的list + String classValue=""; + for(Attribute attr:listAttr){//遍历当前节点的所有属性 + String name=attr.getName();//属性名称 + String value=attr.getValue();//属性的值 + System.out.println("属性名称:"+name+"属性值:"+value); + if("login".equals(value) || "logout".equals(value)){ + pname.add(0,value); + }else{ + map.put(pname.get(0)+value, node.getTextTrim()); + } + if("class".equals(name)&&pname!=null){ + classValue=value; + map.put(pname.get(0)+"class", value); + } +// + } + } +} diff --git a/group19/2558178127/src/com/coding/basic/ArrayList.java b/group19/2558178127/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..283e211156 --- /dev/null +++ b/group19/2558178127/src/com/coding/basic/ArrayList.java @@ -0,0 +1,99 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + private static final int DEFAULT_SIZE = 100 ; + private Object[] elements = new Object[DEFAULT_SIZE]; + private int capacity = size; + + public void add(Object o) { + addSize(size); + this.elements[size] = o; + this.size++; + } + + public void add(int index, Object o) { + checkIndex(index); + for (int i = index; i < elements.length; i++) { + if (i + 1 < elements.length) { + elements[i] = elements[i + 1]; + } + } + size--; + } + + public Object get(int index) { + checkIndex(index); + return this.elements[index]; + } + + public Object remove(int index) { + checkIndex(index); + Object o = elements[index];; + for (int i = index; i < elements.length; i++) { + + if (i + 1 < elements.length) { + elements[i] = elements[i + 1]; + } + } + size--; + return o; + } + + public int size() { + return this.size; + } + + public Iterator iterator() { + return new IteratorImpl(); + } + + /** + * жǷԽ + */ + private void checkIndex(int index) { + if (index > size || index < 0) { + throw new RuntimeException("Խ"); + } + } + + /** + * ȷǰӡ + */ + private void addSize(int index) { + if (index > size && size< elements.length-1) { + this.capacity = this.size + this.DEFAULT_SIZE; + Object[] newElemets = new Object[this.capacity]; + + System.arraycopy(elements,0,newElemets,0,elements.length); + + this.elements = newElemets; + } + } + + class IteratorImpl implements Iterator { + + private int curi = 0; + + @Override + public boolean hasNext() { + boolean bn = false; + if (curi < size) { + bn = true; + } + return bn; + } + + @Override + public Object next() { + if (!hasNext()) { + return null; + } + curi++; + return elements[curi]; + } + + } + +} diff --git a/group19/2558178127/src/com/coding/basic/Iterator.java b/group19/2558178127/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group19/2558178127/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group19/2558178127/src/com/coding/basic/LinkedList.java b/group19/2558178127/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..14a3cf2233 --- /dev/null +++ b/group19/2558178127/src/com/coding/basic/LinkedList.java @@ -0,0 +1,140 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size; + //ͷԪ + private Node first; + //βԪ + private Node end; + + private int modcount; + + public void add(Object o){ + add(size(), o); + } + public void add(int index , Object o){ + addBefore(getNode(index),0); + } + public Object get(int index){ + return getNode(index).data; + } + + public Object remove(int index) { + Node n = getNode(index); + n.prev.next = n.next; + n.next.prev = n.prev; + size--; + modcount++; + return n.data; + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + Node node = getNode(0); + node.data = o; + node.next = head; + head = node; + size++; + modcount++; + } + public void addLast(Object o){ + add(size(), o); + } + public Object removeFirst(){ + return remove(head.next); + } + public Object removeLast(){ + return remove(head.prev); + } + public Iterator iterator(){ + return new LinkedListIterator(); + } + + //ִ + private void addBefore (Node p, Object o) { + Node newNode = new Node(o, p.prev, p); + newNode.prev.next = newNode; + p.prev = newNode; + modcount++; + } + + //ҽڵ + private Node getNode(int idx) { + Node p; + + if(idx <0 || idx > size()) { + throw new IndexOutOfBoundsException(); + } + + if(idx < size()/2) { + p = first.next; + for (int i = 0;i < idx;i++) { + p = p.next; + } + }else { + p = end; + for (int i = size();i>idx;i--) { + p = p.prev; + } + } + return p; + } + + public boolean remove(Object o) { + if (o==null) { + for (Node e = head.next; e != head; e = e.next) { + if (e.data==null) { + remove(e); + return true; + } + } + } else { + for (Node e = head.next; e != head; e = e.next) { + if (o.equals(e.data)) { + remove(e); + return true; + } + } + } + return false; + } + + + private static class Node { + Object data; + Node next; + Node prev; + + public Node(Object data, Node next, Node prev) { + this.data = data; + this.prev = prev; + this.next = next; + } + } + + private class LinkedListIterator implements Iterator { + + private Node current = first.next; + private int expectedModCount = modcount; + private boolean okToRemove = false; + + @Override + public boolean hasNext() { + return current != end; + } + + @Override + public Object next() { + Object nextData = current.data; + current = current.next; + okToRemove = true; + return nextData; + } + + } +} diff --git a/group19/2558178127/src/com/coding/basic/List.java b/group19/2558178127/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group19/2558178127/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group19/2558178127/src/com/coding/basic/Queue.java b/group19/2558178127/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..559412afa2 --- /dev/null +++ b/group19/2558178127/src/com/coding/basic/Queue.java @@ -0,0 +1,24 @@ +package com.coding.basic; + +public class Queue { + private LinkedList list = new LinkedList(); + private int size = 0; + + public void enQueue(Object o){ + size++; + list.addLast(o); + } + + public Object deQueue(){ + size--; + return list.removeFirst(); + } + + public boolean isEmpty(){ + return size>0; + } + + public int size(){ + return size; + } +} diff --git a/group19/2558178127/src/com/coding/basic/Stack.java b/group19/2558178127/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..e89c488f4b --- /dev/null +++ b/group19/2558178127/src/com/coding/basic/Stack.java @@ -0,0 +1,31 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size; + + public void push(Object o){ + elementData.add(o); + size++; + } + + public Object pop(){ + if(size>0){ + size--; + return elementData.remove(size); + } + return null; + } + + public Object peek(){ + if(size>0) + elementData.get(size-1); + return null; + } + public boolean isEmpty(){ + return size>0; + } + public int size(){ + return size; + } +} diff --git a/group19/376248270/0-20170215-20170226/README.md b/group19/376248270/0-20170215-20170226/README.md new file mode 100644 index 0000000000..6a92672f18 --- /dev/null +++ b/group19/376248270/0-20170215-20170226/README.md @@ -0,0 +1,11 @@ +### 0x00 (Deadline: 2017-02-26) +#### 1. 实现基本的数据结构 +- [x] ArrayList +- [] LinkedList +- [] Queue +- [] Stack +- [] BinaryTree(可选) +- [] Interor(可选) + +#### 2. 文章 +- [x] [建议写一篇有关CPU、内存、硬盘、指令的文章](http://bosschow.github.io/2017/02/24/recursion-and-tail-recursion/) diff --git a/group19/376248270/0-20170215-20170226/arraylist/ArrayList.java b/group19/376248270/0-20170215-20170226/arraylist/ArrayList.java new file mode 100644 index 0000000000..8b4a30c5ff --- /dev/null +++ b/group19/376248270/0-20170215-20170226/arraylist/ArrayList.java @@ -0,0 +1,97 @@ +package arraylist; +import java.util.Arrays; + +import base.List; + +public class ArrayList implements List { + public static void main(String[] args) { + ArrayList arr = new ArrayList(); + System.out.println(arr.size()); + arr.add("ele1"); + arr.add("ele2"); + + for (int i = 0; i < arr.size(); i++) { + System.out.println((String)arr.get(i)); + } + + System.out.println("============"); + arr.remove(0); + + for (int i = 0; i < arr.size(); i++) { + System.out.println((String)arr.get(i)); + } + } + + // 初始容量 + static final int DEFAULT_INITIAL_CAPACITY = 10; + + // 数组扩展速度 + static final int INCRE_SPEED = 2; + + // 元素数组 + private Object[] elementData = new Object[DEFAULT_INITIAL_CAPACITY]; + + // 元素数量 + private int size = 0; + + /** + * 添加元素到指定位置 + */ + public void add(int index, Object obj) { + add(elementData[size-1]); + for (int i = size - 1; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + elementData[index] = obj; + } + + /** + * 删除指定位置的元素 + */ + public Object remove(int index) { + Object result = elementData[index]; + + while (index < size) { + elementData[index] = elementData[index + 1]; + index++; + } + size--; + return result; + } + + /** + * 获取指定位置的元素 + */ + public Object get(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException("Index: "+index); + } + return elementData[index]; + } + + /** + * 获取当前元素数量 + */ + public int size() { + return size; + } + + /** + * 添加元素到尾部 + */ + public void add(Object obj) { + elementData[size++] = obj; + if (size == elementData.length) { + resize(); + } + + } + + /** + * 元素数组自动扩展 + */ + private void resize() { + elementData = Arrays.copyOf(elementData, elementData.length * INCRE_SPEED); + } + +} diff --git a/group19/376248270/0-20170215-20170226/arraylist/ArrayListTest.java b/group19/376248270/0-20170215-20170226/arraylist/ArrayListTest.java new file mode 100644 index 0000000000..c48142416e --- /dev/null +++ b/group19/376248270/0-20170215-20170226/arraylist/ArrayListTest.java @@ -0,0 +1,57 @@ +package arraylist; + +import org.junit.Before; +import org.junit.Test; + +public class ArrayListTest { + ArrayList arr = null; + + @Before + public void setup() { + arr = new ArrayList(); + } + + @Test + public void testAdd() { + arr.add("ele-1"); + arr.add("ele-2"); + printArrayList(); + arr.add(0, "ele-0"); + printArrayList(); + } + + @Test + public void testGet() { + arr.add("ele-1"); + arr.add("ele-2"); + printArrayList(); + arr.remove(0); + printArrayList(); + System.out.println((String)arr.get(1)); + } + + @Test + public void testRemove() { + + for (int i = 0; i < 10; i++) { + arr.add("ele-"+i); + } + + printArrayList(); + arr.remove(1); + System.out.println("After Remove"); + printArrayList(); + } + + /** + * 打印ArrayList + * @param arr + */ + private void printArrayList() { + System.out.print("["); + for (int i = 0; i < arr.size(); i++) { + System.out.print((String)arr.get(i) + ", "); + } + System.out.println("]"); + } +} diff --git a/group19/376248270/0-20170215-20170226/base/List.java b/group19/376248270/0-20170215-20170226/base/List.java new file mode 100644 index 0000000000..8ca593dec2 --- /dev/null +++ b/group19/376248270/0-20170215-20170226/base/List.java @@ -0,0 +1,8 @@ +package base; +public interface List { + public void add(Object obj); + public int size(); + public Object get(int index); + public Object remove(int index); + public void add(int index, Object obj); +} diff --git a/group19/376248270/0-20170215-20170226/linkedlist/LinkedList.java b/group19/376248270/0-20170215-20170226/linkedlist/LinkedList.java new file mode 100644 index 0000000000..da357f7164 --- /dev/null +++ b/group19/376248270/0-20170215-20170226/linkedlist/LinkedList.java @@ -0,0 +1,25 @@ +package linkedlist; + +public class LinkedList implements List { + private Node head; + + private int size; + + public void add(Object obj) { + Node current = new + } + + /** + * 获取元素数量 + */ + public int size() { + return size; + } + + private static class Node { + + Object data; + Node next; + + } +} diff --git a/group19/376248270/1-20170226-20170305/README.md b/group19/376248270/1-20170226-20170305/README.md new file mode 100644 index 0000000000..1bbe089b52 --- /dev/null +++ b/group19/376248270/1-20170226-20170305/README.md @@ -0,0 +1,8 @@ +### 0x01 (Deadline: 2017-03-05) + +#### 1. coding +- [x] 实现简单的类似与Struts的操作,需要通过Junit测试。 +- [x] 实现ArrayUtil + +#### 2. 文章 +- [x] [写一篇文章,自主定题目](http://bosschow.github.io/2017/03/05/get-prime-number-1/) diff --git a/group19/376248270/1-20170226-20170305/array/ArrayUtil.java b/group19/376248270/1-20170226-20170305/array/ArrayUtil.java new file mode 100644 index 0000000000..a64eb8da05 --- /dev/null +++ b/group19/376248270/1-20170226-20170305/array/ArrayUtil.java @@ -0,0 +1,231 @@ +package array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Stack; + +public class ArrayUtil { + + public static void main(String[] args) { + int[] origin = new int[]{1, 2, 3, 4}; + System.out.println(Arrays.toString(getPrimes(23))); + } + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果: a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + /** + * 1. 通过双指针实现反转 + * @param origin + * @return + */ + public static int[] reverseArray_1(int[] origin){ + int i = 0; + int j = origin.length - 1; + for (;i < j;) { + int swap = origin[i]; + origin[i] = origin[j]; + origin[j] = swap; + i++; + j--; + } + + return origin; + } + + /** + * 2. 通过栈后进先出的特点实现反转 + * @param origin + * @return + */ + public static int[] reverseArray_2(int[] origin) { + Stack stack = new Stack<>(); + + for (int num : origin) { + stack.push(num); + } + for (int i = 0; i < origin.length; i++) { + origin[i] = stack.pop(); + } + return origin; + } + + /** + * 3. 通过反序遍历实现反转 + * @param origin + * @return + */ + public static int[] reverseArray_3(int[] origin) { + int[] result = new int[origin.length]; + for (int i = origin.length - 1; i >= 0; i--) { + result[origin.length - i - 1] = origin[i]; + } + return result; + } + + /** + * 现在有如下的一个数组:int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public static int[] removeZero_1(int[] oldArray){ + List list = new ArrayList<>(); + for (int num : oldArray) { + if (num != 0) { + list.add(num); + } + } + + int[] result = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + result[i] = list.get(i); + } + return result; + } + + /** + * 通过双指针实现 + * @param oldArray + * @return + */ + public static int[] removeZero_2(int[] oldArray) { + int j = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + oldArray[j++] = oldArray[i]; + } + } + + return Arrays.copyOf(oldArray, j); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int [] oldArray, int size){ + return Arrays.copyOf(oldArray, oldArray.length + size); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + + List list = new ArrayList<>(); + int current = 0; + for (int i = 0; i < max; i++) { + if (i <= 1) { + current = 1; + } else { + current = list.get(i - 1) + list.get(i - 2); + } + if (current >= max) break; + list.add(current); + } + + int[] result = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + result[i] = list.get(i); + } + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * 写了一篇文章:http://bosschow.github.io/2017/03/05/get-prime-number-1/ + * @param max + * @return + */ + public static int[] getPrimes(int max){ + List list = new ArrayList<>(); + + for (int i = 2; i < max; i++) { + boolean isPrime = true; + for (Integer primeNum : list) { + if (primeNum <= Math.sqrt(i)) { + if (i % primeNum == 0) { + isPrime = false; + break; + } + } else { + break; + } + } + + if (isPrime) { + list.add(i); + } + } + + int[] result = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + result[i] = list.get(i); + } + + return result; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator){ + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < array.length; i++) { + if (i == array.length - 1) { + stringBuilder.append(array[i]); + } else { + stringBuilder.append(array[i] + seperator); + } + } + + return stringBuilder.toString(); + } + + +} diff --git a/group19/376248270/1-20170226-20170305/com/coderising/action/LoginAction.java b/group19/376248270/1-20170226-20170305/com/coderising/action/LoginAction.java new file mode 100644 index 0000000000..5496d8084d --- /dev/null +++ b/group19/376248270/1-20170226-20170305/com/coderising/action/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.action; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group19/376248270/1-20170226-20170305/struts/Struts.java b/group19/376248270/1-20170226-20170305/struts/Struts.java new file mode 100644 index 0000000000..c431672037 --- /dev/null +++ b/group19/376248270/1-20170226-20170305/struts/Struts.java @@ -0,0 +1,245 @@ +package struts; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class Struts { + + private static final String CONFIG_FILE = "struts/struts.xml"; + private static final String SETTER_METHOD_PREFIX = "set"; + private static final String GETTER_METHOD_PREFIX = "get"; + + private static Map actionList; + + static { + System.out.println("Loading struts config file: " + CONFIG_FILE); + actionList = parseConfigFile(CONFIG_FILE); + System.out.println("Load struts config success!"); + } + + /** + * 自测 + * @param args + */ + public static void main(String[] args) { + Map map = new HashMap<>(); + map.put("name", "test"); + map.put("password", "1234"); + runAction("login", map); + } + + /** + * 运行指定action + * @param actionName + */ + public static View runAction(String actionName, Map parameters) { + Action action = getActionByName(actionName); + View view = new View(); + + try { + Class cls = Class.forName(action.getClassName()); + Object actionInstance = cls.newInstance(); + + // 设置参数 + setParameters(cls, actionInstance, parameters); + + // 执行execute方法 + String executeResult = execute(cls, actionInstance); + + // 获取属性 + String[] attributes = new String[]{"message"}; + Map results = getAttributes(cls, actionInstance, attributes); + + // 获取JSP + String resultJsp = getResultJSP(action, executeResult); + + // 组装视图 + view.setJsp(resultJsp); + view.setParameters(results); + } catch (Exception e) { + e.printStackTrace(); + } + + return view; + } + + /** + * 获取需要返回的JSP名称 + * @param action + * @param executeResult + * @return + */ + private static String getResultJSP(Action action, String executeResult) { + Map resultMap = action.getResultMap(); + String resultJSP = ""; + + if (resultMap.containsKey(executeResult)) { + resultJSP = resultMap.get(executeResult); + } + return resultJSP; + } + + /** + * 执行action的execute方法 + * @param cls + * @param instance + * @return + */ + private static String execute(Class cls, Object instance) { + String result = null; + try { + Method method = cls.getMethod("execute"); + result = (String) method.invoke(instance); + } catch(Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 通过getter方法获取实例属性 + * @param cls + * @param instance + * @param parameterName + * @return + */ + private static Map getAttributes(Class cls, Object instance, String[] attributes) { + Map result = new HashMap<>(); + + try { + for (String attr : attributes) { + String methodName = GETTER_METHOD_PREFIX + capitalizeFirstLetter(attr); + Method method = cls.getMethod(methodName); + String returnValue = (String)method.invoke(instance); + result.put(attr, returnValue); + } + } catch(Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 为action实例设置属性 + * @param cls + * @param instance + * @param parameters + */ + private static void setParameters(Class cls, Object instance, Map parameters) { + for (String name : parameters.keySet()) { + String methodName = SETTER_METHOD_PREFIX + capitalizeFirstLetter(name); + try { + Method method = cls.getMethod(methodName, String.class); + method.invoke(instance, parameters.get(name)); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * 将传入的字符串首字母大写 + * @param inputString + * @return + */ + private static String capitalizeFirstLetter(String inputString) { + if (inputString == null || inputString.length() == 0) { + return inputString; + } + + return inputString.substring(0, 1).toUpperCase() + inputString.substring(1); + } + + /** + * 解析struts配置文件 + * @param configFile + * @return + */ + private static Map parseConfigFile(String configFile) { + Map parseResult = new HashMap<>(); + + try { + File inputFile = new File(configFile); + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(inputFile); + NodeList nList = doc.getElementsByTagName("action"); + + for (int i = 0; i < nList.getLength(); i++) { + Action action = new Action(); + Map resultList = new HashMap<>(); + String actionName = ""; + + Node nNode = nList.item(i); + + if (nNode.getNodeType() == Node.ELEMENT_NODE) { + Element eElement = (Element)nNode; + actionName = eElement.getAttribute("name"); + String className = eElement.getAttribute("class"); + + action.setName(actionName); + action.setClassName(className); + + NodeList nodeList = eElement.getElementsByTagName("result"); + for (int j = 0; j < nodeList.getLength(); j++) { + String resultName = ((Element)nodeList.item(j)).getAttribute("name"); + String resultValue = ((Element)nodeList.item(j)).getTextContent(); + resultList.put(resultName, resultValue); + } + action.setResultMap(resultList); + } + + parseResult.put(actionName, action); + } + } catch(Exception e) { + e.printStackTrace(); + } + + return parseResult; + } + + /** + * 返回指定的action + * @param actionName + * @return + */ + private static Action getActionByName(String actionName) { + return actionList.get(actionName); + } + + private static class Action { + String name; + String className; + Map resultMap; + + public String getName() { + return name; + } + public String getClassName() { + return className; + } + public Map getResultMap() { + return resultMap; + } + public void setName(String name) { + this.name = name; + } + public void setClassName(String className) { + this.className = className; + } + public void setResultMap(Map resultList) { + this.resultMap = resultList; + } + } + +} diff --git a/group19/376248270/1-20170226-20170305/struts/StrutsTest.java b/group19/376248270/1-20170226-20170305/struts/StrutsTest.java new file mode 100644 index 0000000000..3a4d69ee20 --- /dev/null +++ b/group19/376248270/1-20170226-20170305/struts/StrutsTest.java @@ -0,0 +1,43 @@ +package struts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group19/376248270/1-20170226-20170305/struts/View.java b/group19/376248270/1-20170226-20170305/struts/View.java new file mode 100644 index 0000000000..4e006ba71e --- /dev/null +++ b/group19/376248270/1-20170226-20170305/struts/View.java @@ -0,0 +1,23 @@ +package struts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group19/376248270/1-20170226-20170305/struts/struts.xml b/group19/376248270/1-20170226-20170305/struts/struts.xml new file mode 100644 index 0000000000..dd598a3664 --- /dev/null +++ b/group19/376248270/1-20170226-20170305/struts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group19/376248270/README.md b/group19/376248270/README.md new file mode 100644 index 0000000000..e7b15ad6f0 --- /dev/null +++ b/group19/376248270/README.md @@ -0,0 +1,3 @@ +### Profile +- nickname: kian +- QQ: 376248270 diff --git a/group19/398129523/ArrayList b/group19/398129523/ArrayList new file mode 100644 index 0000000000..4557672f10 --- /dev/null +++ b/group19/398129523/ArrayList @@ -0,0 +1,88 @@ +package com.coding.work; + +import java.util.Arrays; +import java.util.Iterator; + + +public class ArrayList { + private Object[] elementData; + private int size; + + + public ArrayList(int init) { + // TODO Auto-generated constructor stub + if (init <= 0) { + throw new IllegalArgumentException(); + } + this.elementData = new Object[init]; + } + + public ArrayList(){ + this(10); //调用重载的构造函数 + } + + public void changeCapacity(int curCapacity) { + int oldCapacity = elementData.length; + if(curCapacity > oldCapacity){ + Object[] oldData = elementData; + int newCapacity = oldCapacity + oldCapacity >> 1; //右移一位除以2,相当于扩 扩大到1.5倍 + if (newCapacity elementData.length - 1) { + changeCapacity(index + 1); + } + elementData[index] = e; + size++; + return true; + } + + @SuppressWarnings("unchecked") + public E get(int index) { + if (index <= size - 1) { + return (E) elementData[index]; + + }else { + return null; + } + } + + @SuppressWarnings("unchecked") + public E remove(int index) { + if (index >= 0 && index <= size - 1) { + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return (E) elementData[index]; + } + else { + return null; + } + } + + + + public int size() { + return size;//全局变量 + } + + //不会实现 + public Iterator iterator() { + return null; + + } + +} diff --git a/group19/398129523/LinkedList b/group19/398129523/LinkedList new file mode 100644 index 0000000000..8cf3803e2b --- /dev/null +++ b/group19/398129523/LinkedList @@ -0,0 +1,46 @@ +package com.coding.work; + +public class LinkedList{ + private int size; + + private static class Node { + Object data; + Node next; + } + private Node head = new Node(); + private Node lastNode; + + public LinkedList(){ + head.next = null; + head.data = null; + lastNode = head; + } + + public void add(Object o) { + Node curnode = new Node(); + curnode.data = o; + curnode.next = null; + if (head.next == null) { + head.next = curnode; + lastNode = curnode; + size++; + }else { + lastNode.next = curnode; + size++; + } + + + } + public void add(int index , Object o) { + if (index > size - 1) { + for(int i = size - 1; i <= index; i++){ + Node curnode = new Node(); + lastNode.next = curnode; + lastNode = curnode; + } + lastNode.data = o; + } + + } + +} diff --git a/group19/398129523/Queue b/group19/398129523/Queue new file mode 100644 index 0000000000..e98ef838f4 --- /dev/null +++ b/group19/398129523/Queue @@ -0,0 +1,38 @@ +package com.coding.work; + +import java.util.NoSuchElementException; + + + +public class Queue { + private Object[] elementdate; + private int size; + private int index; + + public void enQueue(Object o) { + if(o == null){ + throw new IllegalArgumentException(); + } + elementdate[index++] = o; + size = index + 1; + } + + public Object deQueue(){ + if (size == 0) { + throw new NoSuchElementException(); + }else{ + Object out = elementdate[0]; + System.arraycopy(elementdate, 1, elementdate, 0, size - 1); + return out; + } + } + + public boolean isEmpty(){ + + return size == 0; + } + + public int size() { + return size; + } +} diff --git a/group19/398129523/Stack b/group19/398129523/Stack new file mode 100644 index 0000000000..6d4d44dab9 --- /dev/null +++ b/group19/398129523/Stack @@ -0,0 +1,36 @@ +package com.coding.work; + +import java.util.NoSuchElementException; + +public class Stack { + private Object[] elementdata; + private int size; + private int index; + + public void push(Object o) { + if (o == null) { + throw new IllegalArgumentException(); + + } + size = index + 1; + elementdata[index++] = o; + } + + public Object pop() { + if (size == 0) { + throw new NoSuchElementException(); + } + size --; + return elementdata[index--]; + } + + @SuppressWarnings("unused") + private boolean isEmpty() { + return size == 0; + } + + private int size() { + return size; + } + +} diff --git a/group19/527220084/xukai_coding/.gitignore b/group19/527220084/xukai_coding/.gitignore new file mode 100644 index 0000000000..a269ef720f --- /dev/null +++ b/group19/527220084/xukai_coding/.gitignore @@ -0,0 +1,19 @@ +*target +*.classpath +*.project +*.settings +*iml +.idea +*gen-* + +*.class + +.metadata +.recommenders + +#macOS +.DS_Store + +rebel.* +.rebel.* + diff --git a/group19/527220084/xukai_coding/coding-common/pom.xml b/group19/527220084/xukai_coding/coding-common/pom.xml new file mode 100644 index 0000000000..023093e4d7 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/pom.xml @@ -0,0 +1,109 @@ + + + + xukai.coding + org.xukai.coding + 1.0-SNAPSHOT + + 4.0.0 + jar + coding.common + + + + junit + junit + + + commons-beanutils + commons-beanutils + 1.8.0 + + + org.apache.commons + commons-compress + 1.8.1 + + + commons-lang + commons-lang + + + commons-logging + commons-logging + 1.2 + + + org.apache.commons + commons-lang3 + + + commons-io + commons-io + + + com.google.guava + guava + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + + + org.slf4j + jcl-over-slf4j + + + + + + + + + com.google.code.findbugs + jsr305 + 3.0.1 + + + cglib + cglib + + + joda-time + joda-time + + + dom4j + dom4j + + + jaxen + jaxen + + + + + + + + + javax.servlet + javax.servlet-api + + + org.springframework + spring-web + + + com.alibaba + fastjson + + + + \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/array/ArrayUtil.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..3edaebe9ef --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/array/ArrayUtil.java @@ -0,0 +1,306 @@ +package org.xukai.coderising.array; + +import org.junit.Test; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + for (int i = 0; i < origin.length; i++) { + if (i == origin.length/2) { + break; + } + swap(origin,i,origin.length - 1 -i); + } + } + private void swap(int[] array,int a,int b){ + array[a] = array[a] + array[b]; + array[b] = array[a] - array[b]; + array[a] = array[a] - array[b]; + } + + @Test + public void testReverseArray() { + int[] test = new int[]{7, 9, 30,-11, 3, 4}; + reverseArray(test); + for (int i = 0; i < test.length; i++) { + System.out.println(test[i]); + } + } + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int nullIndex = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + nullIndex ++; + } + } + int[] newArray = new int[nullIndex]; + nullIndex = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[nullIndex] = oldArray[i]; + nullIndex++; + } + } + return newArray; + } + @Test + public void removeZero() { + int[] test = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] newArray = removeZero(test); + for (int i = 0; i < newArray.length; i++) { + System.out.println(newArray[i]); + } + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int index_a = 0; + int index_b = 0; + int[] array = new int[array1.length + array2.length]; + int i = 0 ; + while(index_a < array1.length && index_b < array2.length){ + if (array1[index_a] < array2[index_b]) { + array[i] = array1[index_a]; + index_a++; + i++; + } else if(array1[index_a] > array2[index_b]) { + array[i] = array2[index_b]; + index_b++; + i++; + } else { + array[i] = array1[index_a]; + i++; + index_a++; + index_b++; + } + } + if (index_a == array1.length) { + for (int j = index_b; j < array2.length; j++) { + array[i] = array2[j]; + i++; + } + } else { + for (int j = index_a; j < array1.length; j++) { + array[i] = array1[j]; + i++; + } + } + int[] result = new int[i]; + System.arraycopy(array,0,result,0,i); + return result; + } + + @Test + public void testMerge() { + int[] test1 = new int[]{2,3, 5, 7,8}; + int[] test2 = new int[]{4, 5, 6,7,8,21,33}; + int[] newArray = merge(test1,test2); + for (int i = 0; i < newArray.length; i++) { + System.out.println(newArray[i]); + } + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray,0,newArray,0,oldArray.length); + + + return newArray; + } + + @Test + public void testGrow() { + int[] test1 = new int[]{2,3, 5, 7,8}; + int[] newArray = grow(test1, 5); + for (int i = 0; i < newArray.length; i++) { + System.out.println(newArray[i]); + } + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if (max <= 1) { + return new int[0]; + } + int index_a = 1; + int index_b = 1; + int temp = 0; + int count = 2; + while ((temp = index_a + index_b) < max) { + index_a = index_b; + index_b = temp; + count++; + } + int[] newArray = new int[count]; + for (int i = count-1; i > -1 ; i--) { + newArray[i] = index_b; + temp = index_b - index_a; + index_b = index_a; + index_a = temp; + } + return newArray; + } + + @Test + public void testfibonacci() { + int[] newArray = fibonacci(15); + for (int i = 0; i < newArray.length; i++) { + System.out.println(newArray[i]); + } + } + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int[] container = new int[5]; + int count = 0; + for (int i = 3; i < max; i++) { + if (isShusu(i)) { + if (count == container.length) { + container = grow(container,container.length << 1); + } + container[count] = i; + count++; + } + + } + int[] array = new int[count]; + System.arraycopy(container,0,array,0,count); + return array; + } + @Test + public void testGetPrimes() { + int[] newArray = getPrimes(4); + for (int i = 0; i < newArray.length; i++) { + System.out.println(newArray[i]); + } + } + private boolean isShusu(int num){ + int sqrt = 1; + while (sqrt * sqrt < num){ + sqrt++; + } + for (int i = 2; i < sqrt; i++) { + if (num % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int[] container = new int[5]; + int count = 0; + for (int i = 1; i < max; i++) { + if (isWanshu(i)) { + if (count == container.length) { + container = grow(container,container.length << 1); + } + container[count] = i; + count++; + } + + } + int[] array = new int[count]; + System.arraycopy(container,0,array,0,count); + return array; + } + @Test + public void testGetPerfectNumbers() { + int[] newArray = getPerfectNumbers(29); + for (int i = 0; i < newArray.length; i++) { + System.out.println(newArray[i]); + } +// isWanshu(6); + } + private boolean isWanshu(int num){ + int sqrt = 1; + while (sqrt * sqrt < num){ + sqrt++; + } + int sum = 1; + for (int i = 2; i < sqrt; i++) { + if (num % i == 0 ) { + sum = sum + i + (num/i); + } + } + if (sum == num) { + return true; + } + return false; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param + * @return + */ + public String join(int[] array, String seperator){ + String result = ""; + + for (int i = 0; i < array.length; i++) { + if (i != 0) { + result = result + seperator; + } + result = result + array[i]; + } + + return result; + } + @Test + public void testJoin() { + int[] test = {1, 5, 8, 4}; + String seperator = "-"; + String join = join(test, seperator); + System.out.println(join); + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Action.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Action.java new file mode 100644 index 0000000000..3a354754a4 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Action.java @@ -0,0 +1,41 @@ +package org.xukai.coderising.litestruts; + +import java.util.Map; + +/** + * @author xukai + * @desc + * @date 2017-02-27-下午 2:59 + */ +public class Action { + + private String name; + + private Class aClass; + + private Map resultMapping; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Class getaClass() { + return aClass; + } + + public void setaClass(Class aClass) { + this.aClass = aClass; + } + + public Map getResultMapping() { + return resultMapping; + } + + public void setResultMapping(Map resultMapping) { + this.resultMapping = resultMapping; + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/BusinessException.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/BusinessException.java new file mode 100644 index 0000000000..29a74ec3be --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/BusinessException.java @@ -0,0 +1,29 @@ +package org.xukai.coderising.litestruts; + +/** + * 业务逻辑异常 + */ +public class BusinessException extends Exception { + + private static final long serialVersionUID = 1L; + + public BusinessException() { + + } + + public BusinessException(String message) { + super(message); + + } + + public BusinessException(Throwable cause) { + super(cause); + + } + + public BusinessException(String message, Throwable cause) { + super(message, cause); + + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LoginAction.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..2681d32a1c --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package org.xukai.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LogoutAction.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LogoutAction.java new file mode 100644 index 0000000000..a40fe43dc4 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LogoutAction.java @@ -0,0 +1,39 @@ +package org.xukai.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LogoutAction { + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Struts.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..524b0634e8 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Struts.java @@ -0,0 +1,133 @@ +package org.xukai.coderising.litestruts; + +import org.apache.commons.lang.StringUtils; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.xukai.coderising.util.ReflectUtil; +import org.xukai.coderising.util.XmlParseHelper; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + + +public class Struts { + + private static final ConcurrentHashMap action= new ConcurrentHashMap(); + + private static String strutsPath = Thread.currentThread().getContextClassLoader().getResource("struts.xml").getPath().substring(1); + + private static List actions; + + static { + try { + actions = initalStruts(); + System.out.println(actions.size()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static View runAction(String actionName, Map parameters) { + if (actionName != null && !actionName.equals("")) { + for(Action action : actions){ + //根据请求参数定位到需要执行的action + if (action.getName().equals(actionName)) { + Class cls = action.getaClass(); + View view = new View(); + try { + //创建action实例 + Object obj = ReflectUtil.newInstance(cls); + for(Map.Entry entry : parameters.entrySet()){ + ReflectUtil.setValue(obj,entry.getKey(),entry.getValue()); + } + Method method = ReflectUtil.getMethod(cls,"execute"); + if (method != null) { + //执行execute方法 + Object result = ReflectUtil.invokeMethod(obj, method); + if (result instanceof String) { + Map mapping = action.getResultMapping(); + //根据映射关系将值放入 + view.setJsp(mapping.get(result)); + List gets = ReflectUtil.getMethodBeginWith(cls, "get"); + HashMap models = new HashMap<>(); + for(Method getMethod : gets){ + //调用所有getter方法 + Object getFieldResult = ReflectUtil.invokeMethod(obj, getMethod); + if (result instanceof String) { + String getFieldName = StringUtils.lowerCase((String) getMethod.getName()).substring(3); + models.put(getFieldName,(String) getFieldResult); + } + } + view.setParameters(models); + } + } + } catch (Exception e) { + e.printStackTrace(); + view.setJsp("500"); + } + return view; + } + } + } + //请求的参数不正确或者没有对应实例返回404 + View view = new View(); + view.setJsp("404"); + return view; + } + + private static List initalStruts() throws ClassNotFoundException, DocumentException { + SAXReader sr = new SAXReader();//获取读取方式 + + Document doc = sr.read(strutsPath); + XmlParseHelper helper = new XmlParseHelper(doc); + List actions = helper.getNodeByPath("//action"); + ArrayList actionsList = new ArrayList<>(); + for (Element action : actions){ + Action obj = new Action(); + String nameAttr = helper.getNodeAttrValue(action, "name"); + String classAttr = helper.getNodeAttrValue(action, "class"); + obj.setName(nameAttr); + obj.setaClass(Class.forName(classAttr)); + List results = helper.getChildNodeByName(action, "result"); + HashMap map = new HashMap<>(); + for (Element result : results){ + String resultNameAttr = helper.getNodeAttrValue(result, "name"); + String resultValue = helper.getNodeValue(result); + map.put(resultNameAttr,resultValue); + } + obj.setResultMapping(map); + actionsList.add(obj); + } + + return actionsList; + } + + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/StrutsTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..53bf155c33 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/StrutsTest.java @@ -0,0 +1,81 @@ +package org.xukai.coderising.litestruts; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.junit.Assert; +import org.junit.Test; +import org.xukai.coderising.util.XmlParseHelper; + + +public class StrutsTest { + + private String strutsPath = Thread.currentThread().getContextClassLoader().getResource("struts.xml").getPath() + .substring(1); + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + + @Test + public void testInital() throws ClassNotFoundException { + SAXReader sr = new SAXReader();//获取读取方式 + try { + Document doc = sr.read(strutsPath); + XmlParseHelper helper = new XmlParseHelper(doc); + List actions = helper.getNodeByPath("//action"); + ArrayList actionsList = new ArrayList<>(); + for (Element action : actions){ + Action obj = new Action(); + String nameAttr = helper.getNodeAttrValue(action, "name"); + String classAttr = helper.getNodeAttrValue(action, "class"); + obj.setName(nameAttr); + obj.setaClass(Class.forName(classAttr)); + List results = helper.getChildNodeByName(action, "result"); + for (Element result : results){ + String resultNameAttr = helper.getNodeAttrValue(result, "name"); + String resultValue = helper.getNodeValue(result); + HashMap map = new HashMap<>(); + map.put("name",resultNameAttr); + map.put("viewPath",resultValue); + obj.setResultMapping(map); + } + actionsList.add(obj); + } + + } catch (DocumentException e) { + e.printStackTrace(); + } + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/View.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/View.java new file mode 100644 index 0000000000..4ce909e87c --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package org.xukai.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/ReflectUtil.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/ReflectUtil.java new file mode 100644 index 0000000000..7bca0d6506 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/ReflectUtil.java @@ -0,0 +1,148 @@ +package org.xukai.coderising.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * @author xukai + * @desc + * @date 2017-02-27-下午 4:19 + */ +public class ReflectUtil { + + private static final Logger logger = LoggerFactory.getLogger(ReflectUtil.class); + + public static Object newInstance(Class cls){ + Object instance = null; + try { + instance = cls.newInstance(); + } catch (Exception e) { + logger.error("new instance failure",e); + throw new RuntimeException(e); + } + return instance; + } + + + public static Object invokeMethod(Object obj, Method method,Object... args){ + Object result = null; + try { + method.setAccessible(true); + result = method.invoke(obj, args); + } catch (Exception e) { + logger.error("invoke method failure",e); + throw new RuntimeException(e); + } + return result; + } + + public static Method getMethod(Class cls, String methodName){ + Method result = null; + try { + Method[] methods = cls.getDeclaredMethods(); + for(Method method : methods){ + if (method.getName().equals(methodName)) { + result = method; + } + } + } catch (Exception e) { + logger.error("get method failure",e); + throw new RuntimeException(e); + } + return result; + } + + public static List getMethodBeginWith(Class cls, String methodName){ + ArrayList methodsList = new ArrayList<>(); + try { + Method[] methods = cls.getDeclaredMethods(); + for(Method method : methods){ + if (method.getName().startsWith(methodName)) { + methodsList.add(method); + } + } + } catch (Exception e) { + logger.error("get methods failure",e); + throw new RuntimeException(e); + } + return methodsList; + } + + public static void setField(Object obj, Field field, Object values){ + try { + field.setAccessible(true); + field.set(obj,values); + } catch (Exception e) { + logger.error("set field failure",e); + throw new RuntimeException(e); + } + } + + /** + * 通过反射取对象指定字段(属性)的值 + * @param target 目标对象 + * @param fieldName 字段的名字 + * @throws RuntimeException 如果取不到对象指定字段的值则抛出异常 + * @return 字段的值 + */ + public static Object getValue(Object target, String fieldName) { + Class clazz = target.getClass(); + String[] fs = fieldName.split("\\."); + + try { + for(int i = 0; i < fs.length - 1; i++) { + Field f = clazz.getDeclaredField(fs[i]); + f.setAccessible(true); + target = f.get(target); + clazz = target.getClass(); + } + + Field f = clazz.getDeclaredField(fs[fs.length - 1]); + f.setAccessible(true); + return f.get(target); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 通过反射给对象的指定字段赋值 + * @param target 目标对象 + * @param fieldName 字段的名称 + * @param value 值 + */ + public static void setValue(Object target, String fieldName, Object value) { + Class clazz = target.getClass(); + String[] fs = fieldName.split("\\."); + try { + for(int i = 0; i < fs.length - 1; i++) { + Field f = clazz.getDeclaredField(fs[i]); + f.setAccessible(true); + Object val = f.get(target); + if(val == null) { + Constructor c = f.getType().getDeclaredConstructor(); + c.setAccessible(true); + val = c.newInstance(); + f.set(target, val); + } + target = val; + clazz = target.getClass(); + } + + Field f = clazz.getDeclaredField(fs[fs.length - 1]); + f.setAccessible(true); + f.set(target, value); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/XmlParseHelper.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/XmlParseHelper.java new file mode 100644 index 0000000000..71b200aff8 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/XmlParseHelper.java @@ -0,0 +1,44 @@ +package org.xukai.coderising.util; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.xpath.DefaultXPath; + +import java.util.List; + +/** + * @author xukai + * @desc + * @date 2017-02-27-下午 2:28 + */ +public class XmlParseHelper { + + private Document doc; + + private DefaultXPath xPath; + + public XmlParseHelper(Document doc) { + if (doc == null) { + throw new RuntimeException("构造xml解析器出错"); + } + this.doc = doc; + } + + public List getNodeByPath(String path){ + xPath = new DefaultXPath(path); + return xPath.selectNodes(doc); + } + + public List getChildNodeByName(Element parentNode,String childNodeName){ + xPath = new DefaultXPath("./" + childNodeName); + return xPath.selectNodes(parentNode); + } + + public String getNodeAttrValue(Element node,String attrName){ + return node.attributeValue(attrName); + } + + public String getNodeValue(Element node){ + return node.getTextTrim(); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/ArrayList.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/ArrayList.java new file mode 100644 index 0000000000..0a8601c8ee --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/ArrayList.java @@ -0,0 +1,102 @@ +package org.xukai.common; + + + +public class ArrayList implements List { + + private int size = 0; + + private static final int DEFAULT_CAPICITY = 10; + + public ArrayList() { + elementData = new Object[DEFAULT_CAPICITY]; + } + + public ArrayList(int size) { + elementData = new Object[size]; + } + + private Object[] elementData ; + + public void add(Object o){ + elementData[size] = o; + size++; + } + public void add(int index, Object o){ + if (index < 0 || index > size ) { + throw new ArrayIndexOutOfBoundsException(); + } else { + if (isNeedResize(index)) { + elementData = grown(elementData, Math.max(elementData.length << 1, index + 1)); + } + if(index < size){ + System.arraycopy(elementData,index,elementData,index+1,size-index); + } + elementData[index] = o; + } + size++; + } + + + + public Object get(int index){ + if (index > size-1 || index < 0) { + throw new ArrayIndexOutOfBoundsException(); + } + return elementData[index]; + } + + public Object remove(int index){ + if (index > size-1 || index < 0) { + throw new ArrayIndexOutOfBoundsException(); + } + Object result = elementData[index]; + size--; + System.arraycopy(elementData,index+1,elementData,index,size-index); + return result; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + class ArrayListIterator implements Iterator { + + private int pos = -1; + + @Override + public boolean hasNext() { + return pos < size - 1; + } + + @Override + public Object next() { + pos++; + return elementData[pos]; + } + } + + public void display(){ + System.out.print("["); + Iterator iterator = iterator(); + while (iterator.hasNext()){ + System.out.print(" " + iterator.next()); + } + System.out.print(" ]"); + } + + private boolean isNeedResize(int index){ + return index > elementData.length-1 || size > elementData.length-1; + } + + private Object[] grown(Object[] src,int capacity){ + Object[] des = new Object[capacity]; + System.arraycopy(elementData,0,des,0,elementData.length); + return des; + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/BinaryTreeNode.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/BinaryTreeNode.java new file mode 100644 index 0000000000..2ff876cac5 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/BinaryTreeNode.java @@ -0,0 +1,53 @@ +package org.xukai.common; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Comparable o){ + if (data == null) { + data = o; + return this; + } else { + BinaryTreeNode node = new BinaryTreeNode(); + node.data = o; + if (o.compareTo(data) < 0) { + if (left == null) { + left = node; + return node; + } else { + return left.insert(o); + } + } else { + if (right == null) { + right = node; + return node; + } else { + return right.insert(o); + } + } + } + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Iterator.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Iterator.java new file mode 100644 index 0000000000..d81ade6ba5 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Iterator.java @@ -0,0 +1,7 @@ +package org.xukai.common; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/LinkedList.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/LinkedList.java new file mode 100644 index 0000000000..cb1585cecf --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/LinkedList.java @@ -0,0 +1,163 @@ +package org.xukai.common; + +public class LinkedList implements List { + + private Node head; + + private int size = 0; + + public void add(Object o){ + Node node = new Node(); + node.data = o; + if (head == null) { + head = node; + } else { + Node next = head.next; + if (next == null) { + head.next = node; + } else { + while (next.next != null){ + next = next.next; + } + next.next = node; + } + } + size++; + } + + public void add(int index , Object o){ + if (index < 0 || index > size ) { + throw new ArrayIndexOutOfBoundsException(); + } else { + size++; + Node node = new Node(); + node.data = o; + if (index == 0) { + node.next = head; + head = node; + return; + } + int pos = 1; + Node next = head; + //index 2 + while(index > pos){ + next = next.next; + pos++; + } + node.next = next.next; + next.next = node; + } + } + public Object get(int index){ + if (index < 0 || index > size ) { + throw new ArrayIndexOutOfBoundsException(); + } else { + if (index == 0) { + return head.data; + } + int pos = 1; + Node next = head; + //index 2 + while(index > pos){ + next = next.next; + pos++; + } + return next.data; + } + } + + public Object remove(int index){ + if (index < 0 || index > size - 1 ) { + throw new ArrayIndexOutOfBoundsException(); + } else { + if (index == 0) { + Node result = head; + head = head.next; + return result.data; + } + int pos = 1; + Node next = head; + //index 1 + while(index > pos){ + next = next.next; + pos++; + } + Node result = next.next; + next.next = next.next.next; + size--; + return result.data; + } + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node node = new Node(); + node.data = o; + node.next = head; + head = node; + size++; + } + + public void addLast(Object o){ + add(o); + } + + public Object removeFirst(){ + Node result = head; + head = head.next; + size--; + return result.data; + } + + public Object removeLast(){ + return remove(size-1); + } + + public Iterator iterator(){ + return new LinkedListIterator(); + } + + class LinkedListIterator implements Iterator { + + private Node currentNode ; + + @Override + public boolean hasNext() { + if (currentNode == null) { + if (head != null) { + return true; + } else { + return false; + } + } + return currentNode.next != null; + } + + @Override + public Object next() { + if (currentNode == null) { + currentNode = head; + return currentNode.data; + } + currentNode = currentNode.next; + return currentNode.data; + } + } + + public void display(){ + System.out.print("["); + Iterator iterator = iterator(); + while (iterator.hasNext()){ + System.out.print(" " + iterator.next()); + } + System.out.print(" ]"); + } + + private static class Node{ + Object data; + Node next; + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/List.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/List.java new file mode 100644 index 0000000000..ab5dcb4178 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/List.java @@ -0,0 +1,9 @@ +package org.xukai.common; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Queue.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Queue.java new file mode 100644 index 0000000000..ad77cee9ae --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Queue.java @@ -0,0 +1,27 @@ +package org.xukai.common; + +import java.util.NoSuchElementException; + +public class Queue { + + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + if (isEmpty()) { + throw new NoSuchElementException(); + } + return elementData.removeFirst(); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Stack.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Stack.java new file mode 100644 index 0000000000..de705e1fec --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Stack.java @@ -0,0 +1,34 @@ +package org.xukai.common; + +import java.util.EmptyStackException; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (isEmpty()) { + throw new EmptyStackException(); + } + return elementData.remove(elementData.size()-1); + } + + public Object peek(){ + if (isEmpty()) { + throw new EmptyStackException(); + } + return elementData.get(elementData.size()-1); + } + + public boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/resources/struts.xml b/group19/527220084/xukai_coding/coding-common/src/main/resources/struts.xml new file mode 100644 index 0000000000..248d8bf7a5 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp> + /jsp/error.jsp> + + \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/ArrayListTest.java b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/ArrayListTest.java new file mode 100644 index 0000000000..b14feb5ab4 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/ArrayListTest.java @@ -0,0 +1,70 @@ +package org.xukai.common; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * @author xukai + * @desc + * @date 2017-02-20-下午 2:02 + */ +public class ArrayListTest { + + @Test + public void testAdd() throws Exception { + ArrayList list = new ArrayList(); + list.add("0"); + list.add("1"); + list.add("2"); + list.add("3"); + list.add("4"); + Assert.assertTrue(list.size() == 5); + list.add(0,"3"); + Assert.assertTrue(list.get(0).equals("3")); + Assert.assertTrue(list.size() == 6); + list.remove(5); + Assert.assertTrue(list.size() == 5); + list.display(); + } + + @Test + public void testAdd1() throws Exception { + + } + + @Test + public void testGet() throws Exception { + + } + + @Test + public void testRemove() throws Exception { + + } + + @Test + public void testSize() throws Exception { + + } + + @Test + public void testIterator() throws Exception { + ArrayList list = new ArrayList(); + list.add("0"); + list.add("1"); + list.add("2"); + list.add("3"); + list.add("4"); + Iterator iterator = list.iterator(); + while (iterator.hasNext()){ + System.out.println(iterator.next()); + } + } + + @Test + public void testDisplay() throws Exception { + + } +} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/BinaryTreeNodeTest.java b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..cc85baaa97 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/BinaryTreeNodeTest.java @@ -0,0 +1,28 @@ +package org.xukai.common; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * @author xukai + * @desc + * @date 2017-02-20-下午 5:02 + */ +public class BinaryTreeNodeTest { + + + @Test + public void testInsert() throws Exception { + BinaryTreeNode node = new BinaryTreeNode(); + node.insert(5); + node.insert(9); + node.insert(3); + node.insert(7); + node.insert(2); + node.insert(8); + node.insert(4); + node.insert(6); + node.insert(1); + } +} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/LinkedListTest.java b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/LinkedListTest.java new file mode 100644 index 0000000000..d31e3a70ec --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/LinkedListTest.java @@ -0,0 +1,91 @@ +package org.xukai.common; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * @author xukai + * @desc + * @date 2017-02-20-下午 3:54 + */ +public class LinkedListTest { + + @Test + public void testAdd() throws Exception { + LinkedList list = new LinkedList(); + list.add("0"); + list.add("1"); + list.add("2"); + list.add("3"); + list.add("4"); + Assert.assertTrue(list.size() == 5); + list.add(0,"000"); + Assert.assertTrue( (list.get(0)).equals("000")); + Assert.assertTrue(list.size() == 6); + list.addFirst("111"); + Assert.assertTrue(list.get(0).equals("111")); + list.remove(5); + Assert.assertTrue(list.size() == 6); + list.addLast("111"); + Assert.assertTrue(list.size() == 7); + list.removeFirst(); + Assert.assertTrue(list.size() == 6); + list.removeLast(); + Assert.assertTrue(list.size() == 5); + list.remove(4); + Assert.assertTrue(list.size() == 4); + list.display(); + } + + @Test + public void testAdd1() throws Exception { + + } + + @Test + public void testGet() throws Exception { + + } + + @Test + public void testRemove() throws Exception { + + } + + @Test + public void testSize() throws Exception { + + } + + @Test + public void testAddFirst() throws Exception { + + } + + @Test + public void testAddLast() throws Exception { + + } + + @Test + public void testRemoveFirst() throws Exception { + + } + + @Test + public void testRemoveLast() throws Exception { + + } + + @Test + public void testIterator() throws Exception { + + } + + @Test + public void testDisplay() throws Exception { + + } +} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/QueueTest.java b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/QueueTest.java new file mode 100644 index 0000000000..fa1a6e9f2c --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/QueueTest.java @@ -0,0 +1,46 @@ +package org.xukai.common; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * @author xukai + * @desc + * @date 2017-02-20-下午 4:36 + */ +public class QueueTest { + + @Test + public void testEnQueue() throws Exception { + Queue queue = new Queue(); + Assert.assertTrue(queue.isEmpty()); + queue.enQueue("0"); + queue.enQueue("1"); + queue.enQueue("2"); + queue.enQueue("3"); + Assert.assertTrue(!queue.isEmpty()); + Assert.assertTrue(queue.deQueue().equals("0")); + Assert.assertTrue(queue.deQueue().equals("1")); + Assert.assertTrue(queue.size() == 2); + queue.deQueue(); + queue.deQueue(); + Assert.assertTrue(queue.isEmpty()); + } + + @Test + public void testDeQueue() throws Exception { + + } + + @Test + public void testIsEmpty() throws Exception { + + } + + @Test + public void testSize() throws Exception { + + } +} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/StackTest.java b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/StackTest.java new file mode 100644 index 0000000000..69fc9dee6e --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/StackTest.java @@ -0,0 +1,52 @@ +package org.xukai.common; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * @author xukai + * @desc + * @date 2017-02-20-下午 4:20 + */ +public class StackTest { + + @Test + public void testPush() throws Exception { + Stack stack = new Stack(); + Assert.assertTrue(stack.isEmpty()); + stack.push("0"); + stack.push("1"); + stack.push("2"); + stack.push("3"); + Assert.assertTrue(!stack.isEmpty()); + Assert.assertTrue(stack.peek().equals("3")); + Assert.assertTrue(stack.pop().equals("3")); + Assert.assertTrue(stack.size() == 3); + stack.pop(); + stack.pop(); + stack.pop(); + Assert.assertTrue(stack.isEmpty()); + } + + @Test + public void testPop() throws Exception { + + } + + @Test + public void testPeek() throws Exception { + + } + + @Test + public void testIsEmpty() throws Exception { + + } + + @Test + public void testSize() throws Exception { + + } +} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/pom.xml b/group19/527220084/xukai_coding/pom.xml new file mode 100644 index 0000000000..fc66b7c29c --- /dev/null +++ b/group19/527220084/xukai_coding/pom.xml @@ -0,0 +1,429 @@ + + + 4.0.0 + + org.xukai.coding + xukai.coding + pom + 1.0-SNAPSHOT + + coding-common + + + + UTF-8 + 3.15.0-GA + 3.7.0.Final + 4.1.6.RELEASE + 2.6 + 3.4 + 1.7 + 2.3.21 + 3.2.8 + 1.2.2 + 5.1.29 + + 1.3 + 17.0 + 1.0.11 + 4.11 + 2.1.1 + 2.1.2 + 3.4.5 + 1.1.38 + 2.2.2 + 1.2-GUAHAO + 1.1.1 + 2.3.2 + 2.4.4 + 1.9 + 2.9.6 + 1.8 + 10.2.0.4.0 + 2.2.1 + 1.7.2 + 1.3 + 1.6.6 + 1.6.6 + 3.1 + 4.0 + 2.8.0 + 1.1.1 + 1.6.1 + + + + + + + org.slf4j + jcl-over-slf4j + ${jcl-over-slf4j.version} + + + + cglib + cglib + ${cglib.version} + + + org.quartz-scheduler + quartz + ${quartz.version} + + + org.apache.zookeeper + zookeeper + ${zookeeper.version} + + + com.github.sgroschupf + zkclient + 0.1 + + + org.springframework + spring-org.xukai.core.org.xukai.core.aop + ${spring.version} + + + org.springframework + spring-aspects + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + org.springframework + spring-orm + ${spring.version} + + + org.springframework + spring-websocket + ${spring.version} + + + org.springframework + spring-messaging + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-expression + ${spring.version} + + + + + + + + org.springframework + spring-oxm + ${spring.version} + + + org.springframework + spring-test + ${spring.version} + + + org.aspectj + aspectjweaver + ${aspectj.version} + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + + + com.google.guava + guava + ${guava.version} + + + org.mybatis + mybatis-spring + ${mybatis.spring.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-log4j12.version} + + + org.mybatis + mybatis + ${mybatis.version} + + + + mysql + mysql-connector-java + ${mysql.java.version} + + + com.oracle + ojdbc14 + ${oracle.version} + + + org.apache.velocity + velocity + ${velocity.version} + + + org.freemarker + freemarker + ${freemarker.version} + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + commons-lang + commons-lang + ${commons.lang.version} + + + org.apache.commons + commons-lang3 + ${commons.lang3.version} + + + commons-dbcp + commons-dbcp + ${commons.dbcp.version} + + + com.google.code.kaptcha + kaptcha + ${kaptcha.version} + + + com.alibaba + druid + ${druid.version} + + + org.slf4j + slf4j-api + 1.7.7 + + + org.apache.velocity + velocity-tools + 2.0 + + + log4j + log4j + 1.2.16 + + + dom4j + dom4j + ${dom4j.version} + + + javax.servlet + servlet-api + 2.5 + + + commons-codec + commons-codec + ${commons.codec} + + + commons-io + commons-io + 1.4 + + + javax.servlet + javax.servlet-api + 3.0.1 + + + junit + junit + ${junit.version} + + + org.apache.maven.plugins + maven-resources-plugin + 2.4.3 + + + com.alibaba + fastjson + ${fastjson.version} + + + com.greenline.common + greenline-common-util + ${greenline.common.util} + + + joda-time + joda-time + ${v.joda.time.version} + + + + javax.servlet + jsp-api + 2.0 + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + + redis.clients + jedis + ${jedis.version}} + + + jaxen + jaxen + ${jaxen.version} + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${v.p.mvn.compiler} + + ${project.ud.jdk} + ${project.ud.jdk} + UTF-8 + + ${project.build.sourceDirectory} + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8 + + true + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8 + + utf-8 + utf-8 + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.3 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + true + + + + + + + \ No newline at end of file diff --git "a/group19/604322962/cpu\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.txt" "b/group19/604322962/cpu\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.txt" new file mode 100644 index 0000000000..f20b27f7b0 --- /dev/null +++ "b/group19/604322962/cpu\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.txt" @@ -0,0 +1,3 @@ + 指令就是计算机直接用来控制计算机运行的代码,我们编写的java代码,在实际运行时也会被计算机在底层转化为各式各样的指令。 + 而cpu就是负责读取并解释这些指令的设备,cpu主要由几大部分组长,包括运算器、控制器和寄存器,控制器负责把指令、数据读取寄存器,运算器负责运算寄存器中的数据。但由于内存容量有限,成本高,并且断电之后里面的一切数据都会丢失,导致内存并不能作为我们永久存储程序的地方,而硬盘的价格便宜、容量大、断电后仍能保存数据,就可以作为我们长期存储程序和其他数据的地方。当我们需要运行某一个程序的时候,就从硬盘中将对应的数据读取到内存中,然后CPU再从内存中读取执行。 + cpu如果直接读取硬盘数据,由于硬盘的速度比内存慢了太多,会导致计算机运算能力严重降低。 diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..3f2fa618c5 --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java @@ -0,0 +1,53 @@ +package main.java.com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + private static final int GORW_CAPACITY = 10; + public void add(Object o){ + if (sizeelementData.length) + throw new IndexOutOfBoundsException(); + } + +} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..2701270b5d --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package main.java.com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..86643482fb --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package main.java.com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..1d8b56ede4 --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java @@ -0,0 +1,143 @@ +package main.java.com.coding.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + private int size; + private Node tail; + public void add(Object obj){ + linkLast(obj); + } + + public void add(int index , Object obj){ + if (index<0 || index>size) + throw new IndexOutOfBoundsException(); + else { + if (index == size) + linkLast(obj); + else { + Node node = linkIndex(index);//获取指定index的Node + Node pred = node.prev; + Node newNode = new Node(node.prev,obj,node); + node.prev = newNode; + if (pred==null) + head = newNode; + else + node.prev.next = newNode;//原链表指定节点前一个的节点的next指向新节点 + size++; + } + } + } + public Object get(int index){ + return linkIndex(index); + } + public Object remove(int index){ + Node node = linkIndex(index);//获取指定index的Node + Node prev = node.prev; + Node next = node.next; + if (prev==null) { + //此时删除的节点为头节点 + head = next; + } else { + prev.next = next; + node.prev = null; + } + if (next==null) { + //此时删除节点为尾节点 + tail = prev; + } else { + next.prev = prev; + node.next = null; + } + node.data = null; + size--; + return node; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node newNode = new Node(null,o, head); + if (head == null) { + head = newNode; + } else { + newNode.next = head; + } + size++; + } + public void addLast(Object o){ + Node newNode = new Node(head,o, null); + if (head == null) { + head = newNode; + } else { + newNode.next = head; + } + size++; + } + public Object removeFirst(){ + if (head == null) { + throw new NoSuchElementException(); + } else { + Node next = head.next; + Object obj = head.data; + head.next = null; + head.data = null; + head = next; + if (next == null) { + tail = null; + } else { + next.prev = null; + } + size--; + return obj; + } + } + public Object removeLast(){ + tail = tail.prev; + head.next = null; + head.data = null; + return tail; + } + public Iterator iterator(){ + return null; + } + + /** + * 尾部添加一个节点 + * @param obj + */ + private void linkLast(Object obj){ + Node newNode = new Node(tail,obj, null); + if (tail == null) { + head = newNode; + tail = newNode; + } else + tail.next = newNode; + size++; + } + /** + * 获取指定index索引的Node节点 + * @param index + * @return + */ + private Node linkIndex(int index){ + Node n = head; + for (int i=0;i results; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getActionClass() { + return actionClass; + } + public void setActionClass(String actionClass) { + this.actionClass = actionClass; + } + public Map getResults() { + return results; + } + public void setResults(Map results) { + this.results = results; + } + +} diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/Struts.java b/group19/709960951/CodeLearning/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..536a6be705 --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,91 @@ +package com.coderising.litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + StrutsManager sm=StrutsManager.getInstance(); + StructsAction actionConfig=sm.getAction(actionName); + Class actionClz; + try { + actionClz = Class.forName(actionConfig.getActionClass()); + Object actionObj=actionClz.newInstance(); + //设置参数值 + for(String key:parameters.keySet()) + { + if(key!=null && key.length()>0) + { + String value=parameters.get(key); + String methodName="set"+key.substring(0, 1).toUpperCase()+key.substring(1); + Method method=actionClz.getMethod(methodName, String.class); + method.invoke(actionObj, value); + } + } + //执行 + Method executeMethod=actionClz.getMethod("execute"); + String result=(String)executeMethod.invoke(actionObj); + + //生成View对象 + View view=new View(); + String jsp=actionConfig.getResults().get(result); + view.setJsp(jsp); + //设置View的parameters + Map vParams=new HashMap<>(); + for(Method method:actionClz.getMethods()) + { + String methodName=method.getName(); + if(methodName.startsWith("get")) + { + Object paramValue=method.invoke(actionObj); + String paramKey=methodName.substring(3, 4).toLowerCase()+methodName.substring(4); + vParams.put(paramKey, paramValue); + } + } + view.setParameters(vParams); + return view; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return new View(); + } + +} diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsManager.java b/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsManager.java new file mode 100644 index 0000000000..1af4b38bdc --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsManager.java @@ -0,0 +1,93 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + +public class StrutsManager { + private static StrutsManager instance; + private Map actions; + private StrutsManager(){} + public static StrutsManager getInstance() + { + if(instance==null) + { + synchronized (StrutsManager.class) { + if(instance==null) + { + instance=new StrutsManager(); + instance.readStrutsXml(); + } + + } + } + return instance; + } + + /** + * 读取struts配置文件 + */ + private void readStrutsXml() { + actions = new HashMap<>(); + String path = StrutsManager.class.getResource("struts.xml").getFile(); + SAXReader reader = new SAXReader(); + Document doc; + try { + doc = reader.read(new File(path)); + Element root = doc.getRootElement(); + //遍历action节点 + for(Iterator childIter=root.elementIterator("action");childIter.hasNext();) + { + StructsAction action=new StructsAction(); + Element ele=(Element)childIter.next(); + String name=ele.attributeValue("name"); + String className=ele.attributeValue("class"); + //System.out.println(name+":"+className); + action.setName(name); + action.setActionClass(className); + Map results=new HashMap<>(); + //遍历result节点 + for(Iterator resultIter=ele.elementIterator("result");resultIter.hasNext();) + { + Element resultEle=(Element)resultIter.next(); + String resultName=resultEle.attributeValue("name"); + String resultUrl=resultEle.getText(); + results.put(resultName, resultUrl); + //System.out.println(resultName+":"+resultUrl); + } + action.setResults(results); + actions.put(action.getName(), action); + } + } catch (DocumentException e) { + e.printStackTrace(); + } + } + + public StructsAction getAction(String name) + { + return actions.get(name); + } + + public static void main(String[] argv) { + + StrutsManager instance=StrutsManager.getInstance(); + StructsAction actionObj=instance.getAction("login"); + System.out.println(actionObj.getName()); + System.out.println(actionObj.getActionClass()); + System.out.println(actionObj.getResults().get("success")); + System.out.println(actionObj.getResults().get("fail")); + try { + Class.forName("com.coderising.litestruts.LoginAction"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } +} diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsTest.java b/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/View.java b/group19/709960951/CodeLearning/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group19/709960951/CodeLearning/src/com/coderising/litestruts/struts.xml b/group19/709960951/CodeLearning/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/ArrayList.java b/group19/709960951/CodeLearning/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..9fa2bb7b02 --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coding/basic/ArrayList.java @@ -0,0 +1,109 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + private static final int INI_SIZE = 100; + private static final int EXTENDED_SIZE = 100; // 每次扩容的大小 + private int size = 0; + private Object[] elements = new Object[INI_SIZE]; + + @Override + public void add(int index, Object o) { + if (size < 1) { + index = 0; + } else { + if (index < 0) { + index = 0; + } + if (index > size - 1) { + index = size - 1; + } + } + + ensureCapacity(); + for (int i = size - 1; i >= index; i--) { + elements[i + 1] = elements[i]; + } + elements[index] = o; + size++; + } + + @Override + public void add(Object o) { + ensureCapacity(); + elements[size] = o; + size++; + } + + @Override + public Object get(int index) { + if (size < 1 || index < 0 || index > size - 1) { + throw new IndexOutOfBoundsException(); + } + return elements[index]; + } + + @Override + public Object remove(int index) { + if (size < 1 || index < 0 || index > size - 1) { + throw new IndexOutOfBoundsException(); + } + Object object = elements[index]; + for (int i = index; i < size - 1; i++) { + elements[i] = elements[i + 1]; + } + elements[size - 1] = null; + size--; + adjustCapacity(); // 调整数组至合适大小 + return object; + } + + @Override + public int size() { + return size; + } + + // 底层数组最多有2*EXTENDED_SIZE个多余空间 + private void adjustCapacity() { + if ((size + 2 * EXTENDED_SIZE) < elements.length) { + elements = Arrays.copyOf(elements, size + 2 * EXTENDED_SIZE); + } + } + + // 每次添加元素时,检查底层数组的长度,保证存储空间 + private void ensureCapacity() { + if (size == elements.length) { + elements = Arrays.copyOf(elements, elements.length + EXTENDED_SIZE); + } + } + + public Iterator iterator() { + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + + private int curIndex = 0; + + @Override + public boolean hasNext() { + if (size > 0 && curIndex < size) { + return true; + } + return false; + } + + @Override + public Object next() { + if (!hasNext()) { + throw new IndexOutOfBoundsException(); + } + Object object = elements[curIndex]; + curIndex++; + return object; + } + + } + +} diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/Iterator.java b/group19/709960951/CodeLearning/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..b8c8e0ce6a --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + boolean hasNext(); + Object next(); +} diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/LinkedList.java b/group19/709960951/CodeLearning/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..40374287c2 --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coding/basic/LinkedList.java @@ -0,0 +1,183 @@ +package com.coding.basic; + +public class LinkedList implements List { + private static class Node { + Object data; + Node next; + } + + private int size = 0; // 初始化size=0 + private Node head = null; + + @Override + public void add(Object o) { + Node node = new Node(); + node.data = o; + node.next = null; + if (head == null) { + head = node; + } else { + Node tail = head; + while (tail.next != null) { + tail = tail.next; + } + tail.next = node; + } + size++; + } + + @Override + public void add(int index, Object o) { + if (size < 1) { + index = 0; + } else { + if (index < 0) { + index = 0; + } + if (index > size - 1) { + index = size - 1; + } + } + Node p = null;// 插入位置的前一节点 + Node q = head; + while (index > 0) { + p = q; + q = q.next; + index--; + } + Node node = new Node(); + node.data = o; + node.next = null; + if (p == null) { + node.next = head; + head = node; + } else { + node.next = p.next; + p.next = node; + } + size++; + } + + @Override + public Object get(int index) { + if (index < 0 || index > size - 1) { + throw new IndexOutOfBoundsException(); + } + Node p = head; + while (index > 0) { + p = p.next; + index--; + } + return p.data; + } + + @Override + public Object remove(int index) { + if (index < 0 || index > size - 1) { + throw new IndexOutOfBoundsException(); + } + Node removeObj; + Node p = null; + Node q = head; + while (index > 0) { + p = q; + q = q.next; + index--; + } + if (p == null) { + removeObj = head; + head = head.next; + } else { + removeObj = p.next; + p.next = removeObj.next; + } + size--; + return removeObj.data; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object o) { + Node node = new Node(); + node.data = o; + + node.next = head; + + head = node; + size++; + } + + public void addLast(Object o) { + Node node = new Node(); + node.data = o; + + if (head == null) { + head = node; + } else { + Node p = head; + while (p.next != null) { + p = p.next; + } + p.next = node; + } + size++; + } + + public Object removeFirst() { + if (size < 1) { + throw new IndexOutOfBoundsException(); + } + Node removeObj = head; + head = head.next; + size--; + return removeObj.data; + } + + public Object removeLast() { + if (size < 1) { + throw new IndexOutOfBoundsException(); + } + Node removeObj; + if (head.next == null) { + removeObj = head; + head = null; + } else { + Node p = head; + while (p.next.next != null) { + p = p.next; + } + removeObj = p.next; + p.next = null; + } + size--; + return removeObj.data; + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator { + + Node curNode = head; + + @Override + public boolean hasNext() { + return curNode != null; + } + + @Override + public Object next() { + if (!hasNext()) { + throw new IndexOutOfBoundsException(); + } + Object object = curNode.data; + curNode = curNode.next; + return object; + } + + } +} diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/List.java b/group19/709960951/CodeLearning/src/com/coding/basic/List.java new file mode 100644 index 0000000000..e2f9e34aed --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coding/basic/List.java @@ -0,0 +1,13 @@ +package com.coding.basic; + +public interface List { + void add(Object o); + + void add(int index, Object o); + + Object get(int index); + + Object remove(int index); + + int size(); +} diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/Queue.java b/group19/709960951/CodeLearning/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..8ef14734c7 --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coding/basic/Queue.java @@ -0,0 +1,26 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList list = new LinkedList(); + + public void enQueue(Object o) { + list.addFirst(o); + } + + public Object deQueue() { + if (isEmpty()) { + throw new IndexOutOfBoundsException(); + } + Object object = list.removeLast(); + return object; + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } +} diff --git a/group19/709960951/CodeLearning/src/com/coding/basic/Stack.java b/group19/709960951/CodeLearning/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..046ce549f1 --- /dev/null +++ b/group19/709960951/CodeLearning/src/com/coding/basic/Stack.java @@ -0,0 +1,35 @@ +package com.coding.basic; + + +public class Stack { + + private ArrayList list=new ArrayList(); + public void push(Object o) + { + list.add(o); + } + public Object pop() + { + if(isEmpty()) + { + throw new IndexOutOfBoundsException(); + } + return list.remove(list.size()-1); + } + public Object peak() + { + if(isEmpty()) + { + throw new IndexOutOfBoundsException(); + } + return list.get(list.size()-1); + } + + public boolean isEmpty() { + return list.size()==0; + } + + public int size() { + return list.size(); + } +} diff --git a/group19/972815123/.classpath b/group19/972815123/.classpath new file mode 100644 index 0000000000..fceb4801b5 --- /dev/null +++ b/group19/972815123/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group19/972815123/.project b/group19/972815123/.project new file mode 100644 index 0000000000..aec36208a6 --- /dev/null +++ b/group19/972815123/.project @@ -0,0 +1,17 @@ + + + Homework + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group19/972815123/.settings/org.eclipse.jdt.core.prefs b/group19/972815123/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group19/972815123/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group19/972815123/src/com/coderising/array/ArrayUtil.java b/group19/972815123/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..fca1de56e4 --- /dev/null +++ b/group19/972815123/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,221 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if(origin == null || origin.length <= 1){ + return; + } + int tem = 0; + for(int i = 0, len = origin.length; i < len/2; i ++){ + tem = origin[i]; + origin[i] = origin[len - i + 1]; + origin[len - i + 1] = tem; + } + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int withoutZeroSize = 0; + for(int i = 0, len = oldArray.length; i < len; i ++ ){ + if( oldArray[i] == 0){ + withoutZeroSize ++; + } + } + int[] newArray = new int[withoutZeroSize]; + int point = 1; + for(int i = 0 ,len = oldArray.length; i < len; i ++ ){ + if( oldArray[i] != 0){ + newArray[point] = oldArray[i]; + point ++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int point2 = 0; + int[] result = new int[array1.length + array2.length]; + int point1 = 0, len1 = array1.length; + while(point1 < len1){ + if(array1[point1] < array2[point2]){ + result[point1 + point2] = array1[point1]; + point1 ++; + }else{ + result[point1 + point2] = array2[point2]; + point2 ++; + } + } + + return result; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + for(int i = 0, len = oldArray.length; i < len; i ++){ + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int[] result = {1,1,2}; + int a1 = 1, a2 = 2; + if(max <= 1){ + return null; + }else if(max == 2){ + return result; + }else{ + result = grow(result, 10); + int index = 2; + while(result[index] > max){ + if(result.length < index + 2){ + result = grow(result, 10); + } + result[index + 1] = result[index -1] + result[index]; + index ++; + } + } + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int[] temArr = null; + if(max < 2){ + return null; + }else if (max == 2){ + int[] re = {2}; + return re; + }else{ + temArr = new int[max/2]; + temArr[0] = 2; + int index = 1; + for(int i = 3; i < max ; i= i+2){ + boolean flag = true; + int isql = (int) Math.sqrt(i); + for(int j = 3; j < isql; j++){ + if(i % j == 0){ + flag = false; + } + } + if(flag){ + temArr[index] = i; + index ++; + } + } + } + temArr = this.removeZero(temArr); + return temArr; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int[] result = new int[10]; + int index = 0; + if(max < 6){ + return null; + }else{ + } + for (int n = 6; n <= max ; n ++){ + int[] allPrimeFactore = getPrimeFactors(n); + int sum = 0; + for(int i = 0, len = allPrimeFactore.length; i < len; i ++){ + sum += allPrimeFactore[i]; + } + if(sum == n){ + if(result.length < index + 1){ + result = this.grow(result, 1); + } + result[index] = n; + index ++; + } + + } + return removeZero(result); + } + + private int[] getPrimeFactors(int n){ + int[] allPrimes = getPrimes(n); + int[] result = new int[allPrimes.length]; + int index = 0; + for(int i = 0, len = allPrimes.length; i < len; i ++){ + int devide = n; + while(devide % allPrimes[i] == 0){ + devide = devide / allPrimes[i]; + result[index] = allPrimes[i]; + index ++; + } + } + return this.removeZero(result); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuffer sb = new StringBuffer(); + for(int i = 0, len = array.length; i < len; i ++){ + if(i != 0){ + sb.append(seperator); + } + sb.append(array[i]); + } + return sb.toString(); + } + + +} diff --git a/group19/972815123/src/com/coderising/litestruts/LoginAction.java b/group19/972815123/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..22f70d59e8 --- /dev/null +++ b/group19/972815123/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,45 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + System.out.println("execute"); + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + System.out.println("successful"); + + return "success"; + } + System.out.println("failed"); + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + System.out.println("***name***"); + } + public void setPassword(String password){ + System.out.println("***pswd***"); + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group19/972815123/src/com/coderising/litestruts/Main.java b/group19/972815123/src/com/coderising/litestruts/Main.java new file mode 100644 index 0000000000..66f3e67edd --- /dev/null +++ b/group19/972815123/src/com/coderising/litestruts/Main.java @@ -0,0 +1,9 @@ +package com.coderising.litestruts; + +public class Main { + + public static void main(String[] args) { + Struts.runAction(null, null); + } + +} diff --git a/group19/972815123/src/com/coderising/litestruts/Struts.java b/group19/972815123/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..7d908282b6 --- /dev/null +++ b/group19/972815123/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,155 @@ +package com.coderising.litestruts; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.coding.basic.Iterator; + + + +public class Struts { + private static String url = "C:\\Users\\alioc\\workspace\\Homework\\src\\com\\coderising\\litestruts\\struts.xml"; + private static int SET = 1; + private static int GET = -1; + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + public static View runAction(String actionName, Map parameters) { + HashMap> xml = parseStrutsXml(url); + HashMap login = xml.get("login"); + String loginClassName = login.get("class"); + System.out.println(loginClassName); + + ClassLoader loader = ClassLoader.getSystemClassLoader(); + try { + Class clazz = Class.forName(loginClassName); + Object obj = clazz.newInstance(); + java.util.Iterator iter = parameters.keySet().iterator(); + while(iter.hasNext()){ + String key = iter.next(); + String val = parameters.get(key); + Method method = clazz.getDeclaredMethod(getEncapsulateMethodName(SET, key), String.class); + method.invoke(obj, val); + } + Method executeMethod = clazz.getDeclaredMethod("execute"); + String logResult = (String) executeMethod.invoke(obj); + if("success".equals(logResult)){ + View view = new View(); + view.setJsp(login.get("success")); + + Method getMessageMethod = clazz.getDeclaredMethod(getEncapsulateMethodName(GET, "message")); + String message = (String) getMessageMethod.invoke(obj); + +// Field messageField = clazz.getDeclaredField("message"); +// messageField.setAccessible(true); +// String message = (String) messageField.get(clazz); + Map map = new HashMap<>(); + map.put("message", message); + view.setParameters(map); + + return view; + } + } catch (Exception e) { + e.printStackTrace(); + } + + + + + + + return null; + } + + private static HashMap> parseStrutsXml(String url){ + + HashMap> result = new HashMap>(); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + try { + DocumentBuilder builder = dbf.newDocumentBuilder(); + InputStream is = new FileInputStream(url); + Document doc = builder.parse(is); + Element root = doc.getDocumentElement(); + + NodeList actionNodes = root.getChildNodes(); + for(int i = 0; i < actionNodes.getLength(); i ++){ + Node actionNode = actionNodes.item(i); + if(actionNode.getNodeType() == Node.ELEMENT_NODE){ + if(actionNode.getAttributes() != null){ + HashMap action = new HashMap<>(); + String name = actionNode.getAttributes().getNamedItem("name").getNodeValue(); + String clazz = actionNode.getAttributes().getNamedItem("class").getNodeValue(); + result.put(name, action); + action.put("class", clazz); + + + NodeList resultNodes = actionNode.getChildNodes(); + + for(int j = 0; j < resultNodes.getLength(); j ++){ + Node resultNode = resultNodes.item(j); + if(resultNode.getNodeType() == Node.ELEMENT_NODE){ + String fieldName = resultNode.getAttributes().getNamedItem("name").getNodeValue(); + String fieldValue = resultNode.getTextContent(); + action.put(fieldName, fieldValue); + } + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + System.out.println("--------------------"); + System.out.println(result); + return result; + } + + private static String getEncapsulateMethodName(int type, String methodName){ + StringBuffer sb = new StringBuffer(); + if(type < 0){ + sb.append("get"); + }else{ + sb.append("set"); + } + sb.append(methodName.substring(0, 1).toUpperCase()); + sb.append(methodName.substring(1)); + return sb.toString(); + } +} diff --git a/group19/972815123/src/com/coderising/litestruts/StrutsTest.java b/group19/972815123/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..561885ccaf --- /dev/null +++ b/group19/972815123/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,44 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + System.out.println(view.getJsp()); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group19/972815123/src/com/coderising/litestruts/View.java b/group19/972815123/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group19/972815123/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group19/972815123/src/com/coderising/litestruts/struts.xml b/group19/972815123/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/group19/972815123/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group19/972815123/src/com/coding/basic/ArrayList.java b/group19/972815123/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..3e8afb1ffc --- /dev/null +++ b/group19/972815123/src/com/coding/basic/ArrayList.java @@ -0,0 +1,106 @@ +package com.coding.basic; + +public class ArrayList implements List, Iterator { + + private int size; + private Object[] data; + public ArrayList() { + data = new Object[10]; + } + + @Override + public void add(Object o) { + size = size(); + if(data.length <= size){ + grow(); + } + data[size] = o; + size++; + } + + /* (non-Javadoc) + * @see dataStructure.List#add(java.lang.Object, int) + * 在第index元素前插入元素 + */ + @Override + public void add(int index, Object o){ + if (index >= size()){ + return; + } + size = size(); + if(data.length <= size){ + grow(); + } + for(int i = size , len = size - index; i < len; i -- ){ + data[i] = data[i -1]; + } + data[index] = o; + size++; + } + + @Override + public Object get(int index) { + return data[index]; + } + + @Override + public int size() { + return size; + } + + @Override + public Object remove(int index) { + if (index >= size()){ + return null; + }else{ + Object o = data[index]; + for(int i = index; i < size; i ++){ + data[i] = data[i + 1]; + } + data[size] = null; + size--; + return o; + } + + } + + private void grow(){ + size = size(); + int length = 0; + if(size < 10000){ + length = size * 2; + }else{ + length = (int)(size * 1.5); + } + size = length; + + Object[] temData = new Object[length]; + for(int i = 0, j = data.length; i < j; i ++){ + temData[i] = data[i]; + } + data = temData; + } + + private int index = 0; + @Override + public boolean hasNext() { + return index < size; + } + + @Override + public Object next() { + index++; + return data[index - 1]; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("["); + for(int i = 0; i < size; i++){ + sb.append(data[i].toString() + ","); + } + sb.append("]"); + return sb.toString(); + } + +} diff --git a/group19/972815123/src/com/coding/basic/BinaryTreeNode.java b/group19/972815123/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d6518342d4 --- /dev/null +++ b/group19/972815123/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,52 @@ +package com.coding.basic; + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + Comparable co = (Comparable)o; + Comparable coData = (Comparable)data; + BinaryTreeNode result = null; + if(co.compareTo(data) > 0){ + if(null == right){ + right = new BinaryTreeNode(); + right.data = o; + result = right; + return right; + }else{ + right.insert(o); + } + }else{ + if(null == left){ + left = new BinaryTreeNode(); + left.data = o; + result = left; + return left; + }else{ + left.insert(o); + } + } + return result; + } +} diff --git a/group19/972815123/src/com/coding/basic/Iterator.java b/group19/972815123/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e7cbd474ec --- /dev/null +++ b/group19/972815123/src/com/coding/basic/Iterator.java @@ -0,0 +1,6 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group19/972815123/src/com/coding/basic/LinkedList.java b/group19/972815123/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..04de763349 --- /dev/null +++ b/group19/972815123/src/com/coding/basic/LinkedList.java @@ -0,0 +1,134 @@ +package com.coding.basic; + +public class LinkedList implements List,Iterator { + + private Node head; + private Node last; + private int size = 0; + + public LinkedList() { + head = new Node(); + } + + @Override + public void add(Object o) { + Node newNode = new Node(); + Node last = head; + while(last.next != null){ + last = last.next; + } + last.next = newNode; + newNode.prev = last; + last = newNode; + size++; + } + + @Override + public void add(int index, Object o) { + Node newNode = new Node(); + Node indexNode = head ; + int i = 0; + while(i == index){ + indexNode = indexNode.next; + i++; + } + Node indexNextNode = indexNode.next; + indexNode.next = newNode; + newNode.prev = indexNode; + newNode.next = indexNextNode; + indexNextNode.prev = newNode; + size ++; + } + + @Override + public Object get(int index) { + Node indexNode = head; + int i = 0; + while(i == index){ + indexNode = indexNode.next; + i++; + } + return indexNode; + } + + @Override + public int size() { + return size; + } + + @Override + public Object remove(int index) { + Node indexNode = head ; + int i = 0; + while(i == index){ + + indexNode = indexNode.next; + i++; + } + Object o = indexNode.prev; + Node indexNextNode = indexNode.next; + Node indexPrevNode = indexNode.prev; + + indexNextNode.prev = indexPrevNode; + indexPrevNode.next = indexNextNode; + + indexNode.next = null; + indexNode.prev = null; + size--; + return o; + } + + public void addFirst(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = head; + head.prev = newNode; + head = newNode; + size ++; + } + public void addLast(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.prev = last; + last.next = newNode; + last = newNode; + size ++; + } + public Object removeFirst(){ + Node ret = head; + head = head.next; + head.prev = null; + size--; + return ret; + } + public Object removeLast(){ + Node ret = last; + last = last.prev; + last.next = null; + size--; + return ret; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + Node prev; + } + + private Node index = head; + @Override + public boolean hasNext() { + return index != null; + } + + @Override + public Object next() { + Node tem = index; + index = index.next; + return tem; + } +} diff --git a/group19/972815123/src/com/coding/basic/List.java b/group19/972815123/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group19/972815123/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group19/972815123/src/com/coding/basic/MainTest.java b/group19/972815123/src/com/coding/basic/MainTest.java new file mode 100644 index 0000000000..504e2759e8 --- /dev/null +++ b/group19/972815123/src/com/coding/basic/MainTest.java @@ -0,0 +1,21 @@ +package com.coding.basic; + +public class MainTest { + + public static void main(String[] args) { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add("this is the fifth"); + System.out.println(list); + System.out.println(list.size()); + System.out.println(list.get(3)); + + while(list.hasNext()){ + System.out.println(list.next()); + } + } + +} diff --git a/group19/972815123/src/com/coding/basic/Queue.java b/group19/972815123/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..6f03f6052b --- /dev/null +++ b/group19/972815123/src/com/coding/basic/Queue.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Queue { + private LinkedList data; + private int size; + + public Queue(){ + data = new LinkedList(); + } + + public void enQueue(Object o){ + data.addLast(o); + size++; + } + + public Object deQueue(){ + size --; + return data.removeFirst(); + } + + public boolean isEmpty(){ + return size == 0; + } + + public int size(){ + return size; + } +} diff --git a/group19/972815123/src/com/coding/basic/Stack.java b/group19/972815123/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..fcfda97a71 --- /dev/null +++ b/group19/972815123/src/com/coding/basic/Stack.java @@ -0,0 +1,31 @@ +package com.coding.basic; + +public class Stack { + +private ArrayList elementData = new ArrayList(); +private int size = 0; + + public void push(Object o){ + elementData.add(o); + size ++; + } + + public Object pop(){ + if(size > 0){ + size--; + return elementData.remove(size); + }else{ + return null; + } + } + + public Object peek(){ + return elementData.get(size); + } + public boolean isEmpty(){ + return size == 0; + } + public int size(){ + return size; + } +} diff --git a/group19/972815123/test.txt b/group19/972815123/test.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/group19/976180558/.gitignore b/group19/976180558/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group19/976180558/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group19/976180558/src/com/coding/basic/ArrayList.java b/group19/976180558/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..1f185736f9 --- /dev/null +++ b/group19/976180558/src/com/coding/basic/ArrayList.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group19/976180558/src/com/coding/basic/BinaryTreeNode.java b/group19/976180558/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group19/976180558/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group19/976180558/src/com/coding/basic/Iterator.java b/group19/976180558/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group19/976180558/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group19/976180558/src/com/coding/basic/LinkedList.java b/group19/976180558/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..e2c4e5e795 --- /dev/null +++ b/group19/976180558/src/com/coding/basic/LinkedList.java @@ -0,0 +1,46 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group19/976180558/src/com/coding/basic/List.java b/group19/976180558/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group19/976180558/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group19/976180558/src/com/coding/basic/Queue.java b/group19/976180558/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group19/976180558/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group19/976180558/src/com/coding/basic/Stack.java b/group19/976180558/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group19/976180558/src/com/coding/basic/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group19/group19.md b/group19/group19.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group19/group19.md @@ -0,0 +1 @@ + diff --git a/group20/.gitignore b/group20/.gitignore new file mode 100644 index 0000000000..389e717ef0 --- /dev/null +++ b/group20/.gitignore @@ -0,0 +1,43 @@ +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +target/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Intellij +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/dictionaries +.idea/libraries +.idea + +# Project generated files +.project +.settings +.classpath +.com +.metadata + +# Mac file +.DS_Store + +# Do not ignore .jar file +!*.jar diff --git a/group20/1040154728/1040154728Learning/src/ArrayList.java b/group20/1040154728/1040154728Learning/src/ArrayList.java new file mode 100644 index 0000000000..1b2b6c56cc --- /dev/null +++ b/group20/1040154728/1040154728Learning/src/ArrayList.java @@ -0,0 +1,46 @@ +public class ArrayList implements List { + //private fields + private int size = 0; + private Object[] elementData = new Object[100]; + //check if list is empty + public boolean isEmpty() { + return size == 0; + } + + public void add(Object o){ + elementData[size++] = o; + } + public void add(int index, T o){ + /* Not familiar with array copy, copied from GitMori */ + System.arraycopy(elementData, index, elementData, + index + 1, size-index); + elementData[index] = o; + size++; + } + + public T get(int index){ + return (T) elementData[index]; + } + + public T remove(int index){ + T t = this.get(index); + int position = size - index - 1; //why ? + if (position > 0){ + System.arraycopy(elementData, index+1, elementData, + index, position); + } + elementData[--size] = null; + return t; + } + + public int size(){ + return size; + } + + //?? + public Iterator iterator(){ + return null; + } + + +} diff --git a/group20/1040154728/1040154728Learning/src/BinaryTreeNode.java b/group20/1040154728/1040154728Learning/src/BinaryTreeNode.java new file mode 100644 index 0000000000..e0d2141b51 --- /dev/null +++ b/group20/1040154728/1040154728Learning/src/BinaryTreeNode.java @@ -0,0 +1,28 @@ +public class BinaryTreeNode { + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private int size; + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + + +} diff --git a/group20/1040154728/1040154728Learning/src/Iterator.java b/group20/1040154728/1040154728Learning/src/Iterator.java new file mode 100644 index 0000000000..9c6eb7e6fb --- /dev/null +++ b/group20/1040154728/1040154728Learning/src/Iterator.java @@ -0,0 +1,5 @@ +public interface Iterator { + public boolean hasNext(); + public T next(); + +} diff --git a/group20/1040154728/1040154728Learning/src/LinkedList.java b/group20/1040154728/1040154728Learning/src/LinkedList.java new file mode 100644 index 0000000000..3d811f7f83 --- /dev/null +++ b/group20/1040154728/1040154728Learning/src/LinkedList.java @@ -0,0 +1,110 @@ +public class LinkedList implements List { + + private Node head; + private Node tail; + private int size; + + public void add(T o){ + Node node = new Node(o); + if(head == null) + { + head = node; + } + else + { + tail.next = node; + } + tail = node; + tail.next = null; + size++; + + } + public void add(int index , T o){ + Node node = new Node(o); + Node temp = head; + Node tempTemp = null; + for(int i = 0; i <= index; i++) + { + temp = temp.next; + } + tempTemp = temp.next; + temp.next = node; + node.next = tempTemp; + size++; + } + public T get(int index){ + Node temp = head; + for(int i = 0; i <= index; i++) + { + temp = temp.next; + } + return (T)temp.data; + } + public T remove(int index){ + if(index == 0){ + T o = (T) removeFirst(); + return o; + } + Node temp = head; + Node tempTemp = null; + for(int i = 0; i <= index; i++) + { + temp = temp.next; + } + T o = (T) temp.next.data; + tempTemp = temp.next.next; + temp.next = null; + temp.next = tempTemp; + size--; + return o; + } + + public int size(){ + return size; + } + + @Override + public boolean isEmpty() { + return false; + } + + public void addFirst(T o){ + Node node = new Node(o); + node.next = head; + head = node; + size++; + } + public void addLast(T o){ + this.add(o); + } + public T removeFirst(){ + T o = (T) head.data; + head = head.next; + size--; + return o; + } + public Object removeLast(){ + Node temp = head; + for(int i = 0; i <= size; i++) + { + temp = temp.next; + } + temp.next = null; + T o = (T) tail.data; + tail = temp; + size--; + return o; + } + public Iterator iterator(){ + return null; + } + + + private class Node{ + T data; + Node next; + + public Node(T o) { + } + } +} diff --git a/group20/1040154728/1040154728Learning/src/List.java b/group20/1040154728/1040154728Learning/src/List.java new file mode 100644 index 0000000000..addaec468d --- /dev/null +++ b/group20/1040154728/1040154728Learning/src/List.java @@ -0,0 +1,8 @@ +public interface List { + public void add(T object); + public void add(int index, T object); + public T get(int index); + public T remove(int index); + public int size(); + boolean isEmpty(); +} diff --git a/group20/1040154728/1040154728Learning/src/Queue.java b/group20/1040154728/1040154728Learning/src/Queue.java new file mode 100644 index 0000000000..2da64b2b3c --- /dev/null +++ b/group20/1040154728/1040154728Learning/src/Queue.java @@ -0,0 +1,22 @@ +public class Queue { + + private LinkedList element = new LinkedList(); + + + + public void enQueue(T o){ + element.addLast(o); + } + + public T deQueue(){ + return element.removeFirst(); + } + + public boolean isEmpty(){ + return element.isEmpty(); + } + + public int size(){ + return element.size(); + } +} diff --git a/group20/1040154728/1040154728Learning/src/Stack.java b/group20/1040154728/1040154728Learning/src/Stack.java new file mode 100644 index 0000000000..9f7b2c7bfa --- /dev/null +++ b/group20/1040154728/1040154728Learning/src/Stack.java @@ -0,0 +1,21 @@ +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + return elementData.remove(elementData.size() -1); + } + + public Object peek(){ + return elementData.get(elementData.size()-1); + } + public boolean isEmpty(){ + return elementData.isEmpty(); + } + public int size(){ + return elementData.size(); + } +} diff --git a/group20/1040154728/1040154728Learning/src/honoka.md b/group20/1040154728/1040154728Learning/src/honoka.md new file mode 100644 index 0000000000..ff92a7f300 --- /dev/null +++ b/group20/1040154728/1040154728Learning/src/honoka.md @@ -0,0 +1,5 @@ +##Honoka's blog link is down below. + +https://honokabiu.github.io/ + +Super simple... diff --git a/group20/1107837739/1107837739Learning/lib/dom4j-1.6.1.jar b/group20/1107837739/1107837739Learning/lib/dom4j-1.6.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..c8c4dbb92d6c23a7fbb2813eb721eb4cce91750c GIT binary patch literal 313898 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

a?e$crQ2PudcD?KhOHk6*?qoM}>WkID zid<8zmySw68P~XGk-Tv~IR7WW-iJ6BTv$`tiqMUBv&%qxd8e0xP*4xNu`LPgQQAY^ zEo9$mxs8mqa;Az}C+Nflc+f#3L(}@ua^q3C(Yg+ptvL*cK)kX0!d&x8Dz5i)epa-O zDOr59tH9)}C#bpAQsG*qzL6E)4$@ZsPZ1^~mMAJ9g1H@>sODag29~0aaaLlZFmnZr z7XOoF4n0Xz03$n)TB93B{aB)6(ORI4lvR?8Xd?$yJ&ft1>Jzl7*h-riQGAy|!J$|n zTCwzV@OFvmldD>%j7@YEZmQH{hi2g=R+C$HBXjj%mA#Z2iJY3Q7U9q0Bzi3{r*A6O zro%oEbC1SV&iy#;ITx+Dm!2ZrM!ReArMip`&RRjmSk>Ev>P@9o9VrV9v!cJA>wr}T ztghB-KhN$e&Om|*&&phb#!Sp-FlpuWTJw>YsLJYLMd{*Oag~JanfN>r>lhqPmu?eu zg23xkO^zv9xsd;2EN5N?*2XG^J{kDIE4f){=#9K46j@zu&*|@0#tAEHrfM(WWlQTm zF1kNCe`I3|^zdQ4rt|IvRT4~YeT#bfVcD_heLDB~F=!ce&U7DNBM!i`R?7fj!i?3 zlYrgcJ1-qLifLU(l-TdBVb+c%QR#L3#>F%&8~x3??fPQ#4I34!;4jAvM}ItoEgRB^ zSrAV;ZbNYR2e>82bi(>q`8J$WgM@eL!{{OaC%C0^zbA4N_cUJ7n9Q3k+gTRzS(D3S zv7Ip7+lOUZ;T?=unn($pGeQo4xD@{pV|UH3-X{K|wfsA5Z#@Xf*+NQ7i6Yl%kxSyJ zbqUlK6Vw*DIfA71m0MbRR*4XgOv(?pgrRMfg78XqaUm`X!w~??&ahB|>b0IH9_H+d zq}T)|x>Ri4Fh4e&MG83^t`Ah$i4|l#mi$O_8vE)Xu52j~&{rZVR`I%e=Y{=}i?)CaN zY96yY&z_15%8HC`-OLGF4&I*+Zu}YYqy@>I@;`DsJ<^K5NST{zD@da%NV+y{$)${1 zrI7{U&gHd)@-i18RB7iCiVEZP=*9!3~pe$lz#d+mVX4h?i_QoVyPIJ^&$;BgIe_ud(TV|b8iy2?g;=UTt02y%GICF3dgb!#)72C!!(HF zzr!V5N&5J%S&BP4%(5ZyXrI3-yKpJj1M@wIrf*H}=4hC+ZA1PSVeb@XSrlz)X4sKo z+qP}n_6ggL4BNJC+qP|HAj5XYty|r7tNW|l5Bq7q%`?|NW2}ikemjJ~nH$H9dSIct z=@+{w@m2V68|j7vw{_pAJ>tL#9AuU@<4$y4JMP3L5bAYE!t>!Pu+S+rq_Lj}!8_z( zZ`~Uw$~P&liD2wKf@eVF8A5Ccd3!+4!R-T$`l6GL`0PE-TQE~T9mhnyJ-mewynz$- zp({vhtZxi&fZnj%>vHs8=QmPQIfI%!eZyRs7wZSBDHenAQuH&@s{Xo!kg)VKwzO`U zUVlPQ_lPsL!B>(uT2p%vYj;u3UHGxTZVz5adj>gB9*{!Ml@C}qJvCRXY;N5^=NeDb zaE&L)e@F(uQ=0PD7Bears@B1*c1mPe2J;Y8hu9n`JAFs2*bRy^!-O;HnGi!+5H(1n zfbeuIt`qbPhys6NIC4Hz!vezi@s8upB&gvUCM^JJ%TO42=5Nr55tZUU?^ws4vm;{d z3FEekZvo$vEpL(iRa!m`t>Z1f zm>rYl8;qYtWh@?13yxWul7Pb@IHg5MgqWKRkOXn=n^J;S&ddBj#YA-c1MH6B#{7q| z^cX)FEkOt-+?Hq@qC*|Ujc%*hk7>S|fs^uqQdL_*UM8P9A#YvKRioGdU7=&~w5bAx8x5n_} zsvQlvjdV&5JXjjxzF=~4vOzQDG@YAPHyIhT%rt1Fw2IUx5mubCuA+NJi!x{$6)?04 z;7H2S;B(!#$nbN^F6qRK$6vBfm-&<)e;As9eD#`BOX!5zv={%-dqFPugRuBe<5E8- zU*{*=KxAB!N%N4ZJ5fxsJ-X% zs+GEt$NLUs{L!h-qm>PujRVizUE8kSO{cJoCvKF8=V|yQnt#TgeE(QxM%Wb?4u?rH zW3UVOir(UJk;b~-#2jq1ENb)wMo>j*-c}r`n`n$yN;lwWVQRw=1V%`=Bvj&znx>aZ zU;WukL8)a@^9(K}Z7UwT#c$y5A@C1VBuI-0iVlJ1PKJg^hKlwc5KRouJb}(Wi4<(o zKv_^?Oj8RZY?5*}kH!$Q3QpY^W^58fStL`eAYp`3q7a(D0TM!U4ph0gHobE!M@^wq zB@A2sN9>(Eel!Yc6EXyD+zM-q>q}Y*>WNFrWSj-pwrO65Zm2b0VxsD} zymKrsRXRb>4C!HQA3j>2EcM9|2?_)uO+XlX2v2q6g>y%vcG+$0PD?}*ekh4dE+AlB zu8=hEFd(ivAfG5gx*P%Z18^tELN1q-DPSHpfexc|u1S--7=|T{dadgNUJ_BlfG+|% zOk%)E;FQL|t?Sm6!oW2pBR9iO7rIc;BW9lQo8!Ng-8h7BPh^lwEt#X}Zm20gKuA{K z^O=dk^74#eqbC-<-*B7%_^j)HlLOraQL!UAgt6b(`e1&+0|rUABIB+IL2x-jaH7 z-il;$Ts@?E{cTUC{OfQN`^6MxRsYvQs@kvvw^~urx%Y9!$_*~j^aONFYCt;-E8U24 zr#D1-equ;!rD5LnFV;WzA=^u9!PAzZ#rL;NR%nxb7mlZ&);FH;4|sV-^%-K}1kuP= z<^kq~XGXX$dbwzV=l1HDh_&z)NnM=B@<%0-R(txUABvJX#59fNYBNO-jG@T|Xm@#X z&jv1p5?b!t(M5zV^_v}a9*WIz?`W!4c=M8Sv981(M>5py@y@X;k~>I;rxqNZ8)z40 z)#S#E3~1!7r+I=0-W2vAT|UIHZ&oa#-r1&Mk$cj{|#k;fUTOij=!UjzJa{D}n%8iwsMsXVg zi%O&P6#MLVQo-$p>Ai?O^qHmlsT)weAxr#9C|RvC|1D1~<%uOVz>GLJnS374GvENI z@d&Hvj&W?eZNOzM`2CkwD<*XJ!N|~)vEY!%BXLZbI>jS6BBb-Q3Ts;J@_}O-OvPPq z-=X5Y5PUdhQh!0#tPp(B1kN?4sy}Ni$nSXB^#P>4>aNe4ROrKmTC5C4)I0az0hSKM zDxuz29C+l#K6~~}W~P1mmQ3=2+EC=Cc|}{cS|q-*#FnJu(LQ?krE_yzDA#bebLeTo z`^{HgTW-g&Tye;BSYBW}HHM-Il~Gv~O#qh#BzgtXF}$PG&*eCs=y}OF9mCq4TW06f>m9slhQnGrT))?td$93;Xt8!5{S8W z3XD7|Ekzq^+Nwc4wjkaKfv*_r0pd`I4~sNTp7OAuj%(}!(Jg2;+@H!JGF!N1YxUJUI7|zWRD$e8QE6WM&>*>!f5h=~m|wn;nwm*Y#GoeueJgCLI7JHN zcavbX41!z2dWduwTC5MAe8g?rx>?n(I|F=cfB^pt*?+k zg{npnB53Q!6Q&rTQOazIsc1|S$;D|lMkYBV-&-?HY2?2Yq4z8bb5&}vD8Lxv=e;PV zNYGc@h}QW9E^h7gQ=>5x!JT$uhZ)ct+lpwQn4czi>b_l(g9xpNw~l(Hz_1(vs%*))8i#Xf@6!>LPD z@XDDZO>&ckbtif7vW3wZiF8ZO9U|BQna%#r)ofw5^U!CmQ`ZY2bFS0E&*s9(1v5eh z8cg;DO0I=uzs3=^2{^$$7OgcZnaMY@C)*lC$5p0HmnKQ8{c0-)l zThpjkgDzBJI%JXnIg|orM8m8xp^^dX><@g)WBRfizyDXKA<9$5y~R(B(f6lE=Kr_T zP}JQRVDD^UXZt^yjEb`I|G{J&RYw#=1m*vI-cNvmJ&QqC7G9!=9QUrIuA!{8XtUgV z96l7t--i$IrVYXv9wPf`vp3n9YI?tYeS+V^*yJp#!%Kz($pmkK6s7ec&B}RbzT4W2 zR0h^Xg0`9cxhx6Hu@_1oIU*D~5oxC~N2FrC5afYcM7-+z2ioHZF&&6UxcqcQVz{nU z(*-T=bLJ+xYglCB!G;aha_9kF5|F|=!I8hPkZ4H^BE9A&1`B1B77 zRSv?I-Mubh{`XoRPq-|^-=C5&3e>M(WdCig?}thRFn0dWA1hf!+G$e-gEzsZJY|`r z%>`T8e31>5Unq$MVS@{FqlplnjEzIq++%7i1}VwmUla`pU^>@eGK6+&E~yWe{|_s* zFRXn{)!2Y*$zgEK)hFIx?%l&3{_oez-@jm9bOt$~sZvmneGJSa@8j6C!yR#;K$^AA8!Nm22oI9gXNR&+a;lj3M_)AZBD2Cc8KRewC;I~deP z{8?IPiWR2~6tZq)j1_xS!nSL9tor3=$(bvT^ni1&Cnu;z4X%buYn>1}VBL1(Dk4aN ztdo|oV`HQE-hJFwD>HjAD<(K)7jeLDOmAYI#b3r>AYHa(0Yxv(G<(e zbd%S-HDg4qxl8j_SW*H2&WwbJ{GQT@R^-E&h@0YGfXl`upDI;`G_G7~PiqPuWTqm( z?&b#4#Fx{PzK6+wzD@!m8+O zG`eA>U}DY7+W;*pDAVwY%8A1(0(D;q4hZmSSzg;Vi7E9$6dpLzoFDGe+G(nXh)AU) zrte~KL~t2(LUj7P$?R|;$=Fn@m(*!>(GsiPIOlM&nnt^4L&PfQ?3Wq^$Vj!#Sv~NM zGUi6uUbOv*M1A_Xdhm0Wn92M_hH@%w&cr>z-MH0m8T%RDUyMT3 zebF&d>t-*JO@H3Aw62^IoC zc?HlB%JPy!T4f=9M%;%_8{-X4ddIyx{2Rt2{9rcw2B2|0u@F96p!5|smmX4&L5vC9OkUeAiHjr zb_>OO19b*W;s-1`BFA678ZSU5BK_O^Yze@FwVub<$VaPr{x|8jLqg!e5ydsx1AAua zo&Gq!a5uKJ7b@RKyR$WsQ&#{4#eh2^$}%XP#57JWgr0Z>z4p{!26U z@(*>k`{;2L9s1X=LX4lWjsNabp#(5A`M;Sh+3FVd+RLb4HOCr}`Uj*ipxpg2mm+!r zf06`{MoAnXF|sg>$PrQoBJciDD3YirND67?6@zsMz@V6)0fT9^(#S3Z;6iHW(~4@F#E>s_oXO7;YI@L&$D0D+ybJs= zl7v;a!&Qh@3mNz~dS`p)V@Mb3FJrnxu{PbPRGvznIiOiT!;>0q{`J|CGn-t?ITrWu zmCI<^D(4izd-v%)-?D|l_p^#*P}QdHq6XSa z)%drYjY=YBaOI*XnsVPB&_-vX0a-5Ullgmf?8)9aiQm6fO!oU=#ZuGdZn zQ5FPLSc7tw^1h@6&+Mj5Plmw=>{HG;dS-c}2Q?1Mr3MbWtte8Q5D>b`{oSsvnR3_} zdF!0*55DBXW<2RLj=fq$%cI_yi0t%HEuBEp8|Cq7nknuja21}rEs;r`g!A*ca`S$V z$|z%4&%_P#?oja>459NRt?AU(PR-Sw#f7bK5p08pn)J$j;bn0b{46Mh|kfQwTZ@QZS|AO%7$#LXD?q z2%+*wJ5$l*>Q<|1a4P#dEyIsos!WV)aQvD6t<*4a^GDnakTa8H) zB+Z88*v_=pn_9*P7;#efA<%rotiVo~(Q<}^f+cxmb2CTQlE&DIM-n7q$ZvEIX0*zYr3G~*#d^HthJByfH@ud`YrslqUiK^p&`LvrdvUG^F&f*rpOyJT*Rne z8xhn>_|v4g@dmYol9%OA6{8DjM2f~-CXKO#A>5wQk7Ax;H6ftfwiH+|I9L$aw9}4U zR=nO}G@31+fIfF-<-Kv@u|ap=gv(O2f)el9ic{|9Q*<)#&RA@#q$Mwfp0FUMbbh>J ziXX;`7xu-JWI3VGk(NY9Slok@L{+qmWka7KA`7_(wdBUmlV7+A0=jc@&3maaPK%Js z9cwY^(!>*^>Zw=xmwII06Y1V9dniCRQA4BG9Jmy-8JWWeIFj69WD+cI5=v2tL4-rs z`ta|*W6kdcL}BNFyX5@mni*}^;O{-+A0t^;8NpsuFOUbpio+jaxzz`4 ze1H9c$I@p=6NsucdscKIGjMR{C<`9n^Kf(UZv7g$8OJ_Gzc=#V!7r*DmVG zyV|T)=Ny5H`T}hadfBbfu$|c^uRnkANtQ!-s8~OA!z-I^QSr*_G?isGD)~{OT8uDY z!SM*A#GwuuGu*QnM$F(2v2@<^4QS{?Zcz+*WHEl;V94T-N12(z9dem^28S>jys5Vp zIssFYA)pEa*_27)^Y3?_8P-k*d2rh9^<0YTsJS|!tqMGw6UQ(*hL!`-(y2>7H$yey zPckQ`Rtq&(8tfdu0(|pFeX!{VsCx+O-ILl!LX-zTdx`AMQ%yGxfc&lbcN_sj zm*0QMymv(jS2Os#rjVs=73vBu;GMJoGr-hW(!Q4p#`c@VzD6BDuL*nt1jh`xJN^Tu za<7t>J?g{24F=e^q$B0oTgCAkjB<|@@DtDL{VTqR4|x;Y)5qo|kmn(rIC{pFLZ--^|?t(T#1{c#SA&)PRC73x~d-$V_Q|F~Q0hcwfBTJN`L{B3Cd zB|ZC5D`Q?eG%EAL#MOj)*SjF#KIwd?qezZ_v;576!sWs5cj1%WHF|mUwrGW8_WtI1 z!I3dq-_%CVl4N=Q_YUtDKEY7tMlqFrjuBQR=c%gdT7eLTf}yqg@>>4M0hMZCRmD9( ze8%cVvbO&(PsnxV)n7)IZSTO?eCOseLkdszPFnBg%~j(oZD$>T$s))~u>?m%Z`Ro~v z0Z&HLjf3co^ZxJuvKi<8SA$KQ)ZVi!f>Vwm!d9rgM< zc?-G+H%s_N2p+WGvmlou*(Ik_Je|UjUG4YXB- z&H(rSX~v_KHf@m^QE<$hEEbZA{DV^TC|VO}!cb@Pe(a_ap(Qn#=y@S~TEo0)t0Ruc zcQ`~`S)BVG$P2PyoJ5%9-F~##?0XI_cvVLh~{f#sIzN6-(5Hdzf+V>I!qatGS z?;KJ@jl}kTw)c9K)N$Lg`U`p%;^7@O@%LN!R^qyblH(lWxP<1~Fa z6N6}L1_5Z(AAB>B>08b@{)ipx%4M77Zn(lq84ZvW_J_09GkDthG}h~$^Ui)9Il--9 zR=ceIbg4}+WFyTe&F+PgW-M&x!?NuFUMx(Cuy(_z0}ZuwgML*{Qnp-bw>;5 z|HqK2y*sHKWBT@3H*|8+v;zss#(^rVAZQ?n&;ddD3lM-2Vo1=Ou1~MqADFV|@KU4G zyZ7!FS3feHFQvO~IA@g?Dob)1T{iKb%536)Ab%{YeS?ku{hV3fW}d78HEXzjt(krA znSJ-(P4)Y}Sx5iHwx11&$5Mx83MvUgScK)kO-57)8x)^1Qv{ovoMJO4gQ?&yF~YQv zjh2X-h|Em9iIT-`bZQCm+^MLLeXE zAvLvVloP(U4w)0V_X??}0GaD#z3Pa<23P912*qqnK3$Y9k?G+^l{-mxmtyR6Q*cZo z7BQXZIVlHL$WvK&+wm(@EC!F#f9y+wD%GX>zDB6)&9r;ag~rLVPkUT;pO4$BvlBIC zD717+d@3kg`UP>Du|k1AF0&3LBlNP$rHCQBDGS+@X)wNJUuR+}D&t|chhO75r}-Xw zyLme`0qz(YwyAi59K;CC!b@rY3QJSva1OIcrgcw)dzAE4V&j6+`U?{Q8qQ zX^DaAzvr9BFZ-G2W!Fm{kR^m+dstlC-orHK^`s`UOPXv{B|KcqFd$}kKfV!D1GbFj znP~TPdMT~5tV78}UgqhItcT+5xEYi?vop)@*Cf`%jdp9k0CdiriK9E6?E(-is0Gu1 zjixx%qNh;7nX%{%HM};_8y=YzXS1eG&QuK0m;SJmUTJ_t@NNB*?)HDfv!)IX;k)c& zj$q^fxQ&9TlZF?zFqq&?bXO6hwJ=`jaBQBL1{-BqUX9Ya{SmnaYahxGy{cG4Zr7nY zpm2L7`}n*KbZDU+MTF<+AiF|ur_>Dr`R-K#?WCLL^O51 zzj}FtQo+1R>E6e^;W|b9#ff)-6(Tqq;j9+p72C?&HmKn zcq~2Yh?-k(^PJb_`Cr~>%$Ay`i6221;Bo!Gnh4f^L|BLwBay-vTL)U5ZSBxPX5|?g(s;bX&p-n6l;hx|V zAqfX)7C9b1bD~U^>!n$SEM}NS9J9JSs0AH_FN1`5Jk)DtI=?+3K~JoW zPr#u~L=xk@PG6ZP3}m@Zi>jUt$x0cnDiC8qBUH)(_r6{$U5A=E8mS@rk~GHCJW!QHk-W9%`U>Woq!`Q>e)5frZz=x~B;W4!J?Ap}qxxwi4K{9W$8GMNhV9(7 z*0wfX^qI!CJL0LnQiG2zHgm%^XOI@xX;1$zkJ?8ej?Hgrm=at7O?TJu^}%9e^w!gT z@p>q7luuGtZb0zuFBc2`K#G~T4Sn^(xCpkaeUvY97WsLMV1tr{A5X^-Zh~y!=Jssvr2;`7<5AHMEFs z#WXcz9O;jNNi+wcpvMQ0vW`EE8grDRXoX!%#^qwRrWxEqv)bE!gE_kRx9c9oi~_SO z#@EBwJY#4Jj&Dz5gpn0^xY z=fH3JI+5AXtb$oSYE&z*zmdEiZMxBl@wyrHp}TU%t9I%m_QGxX43d+$%N)pG7vOjF z`i|`J#k~B9-td7qa^sLkb?8e*yVRzh%yx3ADmu>3{UPP5-8@k4mhT9!n~Z*_k2zTi z6jH!<1@(2#>4@)F*gV%kJ^x~QV7DsBE!h+&w)wA+^M`smrt*Sy_p>f~31V@a?IgdWpn>Wh|2#+vj5|-oc;emQ_~9?IXOET8aw|dvHHKzs^$Bo27d}#t3}}> z=8@>LJ4?dqvp<~3-$+{d3-6mQ%WxJ%o!Z}%iF^IOZwiN|H!@3mAOzyZCnPSC5@x%`W-wI9RGM8RFFpAKkdp>0l(%TsGji;PmU=P7 zIcil}k+v|#6NZtw^*d`&Ypt_e4#c?ZG+#T1ymrFp zo(n2J!2Xwl{SPr>4hSu#_^JEN{&$PO|7XZV0H%gNo4`fg|35)1PSmwS5=05v^$-3b zjVvu}T>ox9E=0BJ8Z3iT4J2Ha7?iccITa|?G#$S(_|Vof?7D$?DU336WnVKeHs6}g z;biujxzFKDe0{xm|NSeJf^%&sC6J{BcP)OM@x(tmlnsxuC|8>F5hg^a-ea8qzG70f zcVnSP8*LyU}0@X)rM}hkmdhmQwvNve7k+a2Nfp`og7cQ^EhFLfU4XKE?E!vE?jcjUg6{ zi@{`^i-lVV2@0$6c!Ir-5lP=7p^vsf?!`DbKs}z=juCpuW(!JCb84T?5S9-A5GzP} z!911v-I%1*5L;!~6mm0SfQ*4V1k(=hnPS5L-RK{ss?B^F;lDSG6&APAt(Q3Mm;3v&LiPuI%h4x*-r6~R zrBrz<_#IEiM#lF7@}W4w4YJTtCF-5d?e(1FG`rQ<$nWd>4!_4(1q;g~K^z?F=s}X2 zpfdrk2B(4<)$%vwfW)MXWpgKg7`Jm+d+Yp;;2%Ve6|Mt6LeHa6$Vi=QHsM8N%}wwo z+WQtJWQb7XY;60neXH4JaL?sa8P#rc@Zvg(hyn5~_dc_=&RU66&B{hZLHNSMPTPRp z2U_+IX{k0JpCfNJl{y<;;DnxU6(uyS>)o z6xwRtG<#FonQ0MtR^-$;w)p-mDCAUGlX$kek(;C5YST3SMnLH@x($~=0|{W+lxUbq z*E;a3J0u`UvNJ$Miji=*B2Co;goSl#F{89pJxN|^O0_3IRZTv=OhrEaqv{u!Xd#d% zdd7~h7QcX6t3&Xev@k|Q8+ci^_2iNqo7~(Nmu=LB2Ffva_Z?WcyzyO<%y|qEODGtz zP)KGQDu|p|zj*!LW*aidO2Hljnm2kRv3+(0a)Xwf7&o?*nCT<(>6`X&9YYn?Z{lK8 zI&Avk7=c)54}5A9%;$rkQ$<32iLudM$Z;xlq_$cHY867ohi4Hm_4u#<^4a{4)CJdB zQ^)`Li@|aIZ?4x*Uhux0J14@#>KR*O70Sc1H@-zqyk`)M4 zC5;3GbRkQo%xW+IaEa=IjzU_4s(?fUt${{!p|#r6@zmg|y9&L_`P`lE!JMw}b@ja1 z<+khdlf+l;rMv7rJ~#QizZf+1Y#>>JBm&@t?nIe`u7Gsgcm@!zNa9I&@XqDfg3f?q zCH6yAY?}|&GD68p@5^9?oBqDyz9d+L(e$_-Nt5@uzb>TH>%J@`=er%MJ)0mDg!&)C z#$Wp56_i5Mpm(=5vg^NL6x0&FdF0hfxJ7<>&+dN#ZJi(c^NCOhjvx2%^t>d9^k9tn z1isvIv|>y>6Y_kyw_;2@Be$7h=*u1XliwyKZWsLV3b_Y>>WkfVDt_3q@W(hr*7JDa z)V9QRj(QD&GBRq)ASHTmiiV^e_!BWMBMjrEO*~tKq+R)+5p9ED55o#iIY(;B+*^a| z4ouRs4&nHwWzw94D{mR`6>9CF!K9;?dJ^bnneH`*aAapjZW+}Re&A6c19-}}XsNb{ z_JB~NUpy%9ZPN*sJ&}nvDfYlzpl-bAK+L)lW zc8=u6T+`n=paXYkg|J0^zB$(O?V1%n+RhCMDBmV)@j7*cKHTgV#$y-?9Iuo9=Nw5U z%tAhBTOaA+N7bsebwDWmPcFpgz_8VQi1w*%SkH8iPnc(7(mP81rHwG>rce2xwkz}f z)v*sj-g8g$Hi6J!7K2sV&b)s^3kA zo}okiA1Hr@||8T%j?&wY0zwUze(_m*C`>%u>F*sJU0dHVpQ$L|yk z|Mt_k^(9Eq_Z%(v_8wE_xcBvrQ@_U`#CJTe=U`N)k@W(0wKh^=c@JCb}54VE8b~BU0d9A*`0ow8sXh5*)*V~)G zPdmP*@+yMR7=_-I{u#c?ajhnox!C%hfQLE9bd|ocu9~*$IejHG0W1YwZ8hFeZ3WGJ z>MI28?P_Ss>goz?#XZCYNWUQId_K#fs-AXZkt3zhl_B}GN~;iSifQpO7FW<|mXZ zk%Dq(SzUvUUM>c11w~8}k0W2fK$~-EArcT00?ej?yj+M`*p-^9DoD_Br#D7LeZ)K~ z(r#Vp-^d63ly{qyG)t;@Wwo^c6lFj12uK>R-oXWdF{FA+KL)BoTt{${1f}Y_7NWim zMNQ z+=R8S0ChhIClp%leihEHI|nGdD?NH#C8R9tlreiFoZ;@2bv=M{XI}IsUci(K zL0&@_uM9?YW#z_5s6~~STonjzw5M9Hb) znZAKc7kzBm9RP#m-ONE-$8_^BZ*DMXO3~7*r630gE@YVu|H5KTex^&V3hO=(SM`lx z(rIpyX^KRKf<{kK0k5ELG@-(V<9G!Oza{a|g36 zX7F*+3KtO)oUs&ju_(VI3lvX6Ysz7$K-IAN_|DBw(h$S50@Bje9GZeC?J^*cTN;O#(_4q4qdhj1;0pl!VKwlBt(lS`Up(VEEKTfhq)wOC8aK&?s z{#OUg*^^7^$N)+5yD@ph)o`QET03A3=EG1%*<(bPMl!PZNnyCJ3MJ_S<^p-+Kxym> zNxbnFTz|PqD9?{$>vq~Qiz7s{Q8EK2vtOji7LV0>=A2Y_0CFt&^*2%}7$hq9?A*hn zraOSYV{*|(T_L70QD>35mSzo_QgO`Sc27f{+&)<-t%P z`X)t-2-P|_o}bXlqb;>UI8^i9hJmrsd$Lk(in@#`` zBIV|fWV+Q})q6z@6^JiD?xcp#D!**s#UL* z#)U}#I&%bH)Kw!iA?7{WMOQ?}gTVJ%AXi(?-GI?Bhv;G(x%sdphOIsxkyv;u0X~DU zo|;i1ImJUA`hY9RkmSx|4J5Ku%~OvjI1y@e`#Wp@qEO;**Mt-q4V-gnd6$2dbXBAT z6Z)k0mK0F+jhF$FZ91Dg7u1N1L_Csp^Y4?E*gz-8EgW7FmnU4|OyH57Vnj-#-@^`< zJY}YaXpp&$$b)9)iHsxxF1o4&T2d?yBxo21=*k}vE+H?|C=iU9+~SEWH~`+DkVs)3 zGa_9Qdn;i59R^Y(w9Bpe^TP1$y3TN3hD_^a#&kdA`!s9(Cng61{jRn3Arlr^>re|a zxq)%A5`zj#u&bgzNxJDDo zU!Hx!yqUcVv#>{xvzTz5rP6nX5b1%@4<=n=M&!ZtMAW7?fcOd%wk4t{o8HCItj{N9 z7p)Gt-SR5Cl6f~o{*%%|7dB*9b|sfg;Jv{XR+5)rpN#94T^E011@N!q8%`;D)zy`fl+jkr8u`qKr*! znv{)d6)qTCND{u01Z9jX$@%b$@lKmMl=VjYmXml_Fwl~`NnH>_qUGD@%)bLoiC~xI zl*y3*_6!n8Q&U`2Pz6jRYUs(C0#U{d%5ndfTreHZ{gfAXB z3(xGm%P7wneP+sbQc0VXhts|wa6*&UuY;{Kri>hvhv(i6aVC69=}=A#QKxs`yW1%l z3#Q+paOTPisw>m={YHTPx*qSLM4wRpSz}KrpBf3p5MXEu=}4(hQkg)OZP%&U8_ljF zR}HB$bzP|=EoTK}^8_+A6-u1RVkV);l``MGg>-am7*J$Z!VcYDh0-geF_B!zuJ%wmj6Xq`^wR9 z2vhM-$wO|@nT$sYyrK!W?oKUjB%nCfgIxrC)&uyouSrSR^c48 ziTh))e~*0T$G9qe**jE_Y`48_i*e{b0FN#TQ)JErqdoM@J0wX)lV|Wd@c#1&tn*g$ ziIxZu!v*?bh_G`tG1^R!gdaiAvxFs^`8V{eMw(2Bcyl)U{X^rWCU|eA7ICxb_b26r9$Mr!R zo;h%zxYSt+flPHd<+U<`Xf$hwts8yxA2L}?wz5u#`N`TkDY7Yj28W^bS=Ku8sc1k% zwiG5TAEEN0I;FVuZdA>DYmM`?xi=>WS9FC)ezuE7hk=)3OQEL>W9{6#Ur(*lzLUw<|Kqv z)rA<)Rg@Jq_4oD}Rr&BgE;K$v0de;a9Sr+_u@jbn@~!0N_tjGTf^fKfz26DabK;h{ z7h?z|;Fmn5%4(??D)ZHF*UN`BELiXnwG*t&HtO5`NLJaXX#`uu0VgyP994w_Y^7p` z6=@iJ?#FLVN&fq*Iw0JZVq{0gt688Q(T*gvG>gUeW^x)VE(6{~_TB*AL2AN6VKq-n zgK2lij$@mMPyo^R`gA_H`o%a-&~LprJVBK~vsX$+Ac$)|zX|&V#gud;6xEGeGfqa2 z{;t8S?XMm?Or>fQLQ4@eJY!a8_st|y4J}7m1634t+k#qGq->l<3(PNWw2GPJYH>Pi zmG9aW_ay8L6HWz}fGg-M!F&N9Z1HfID&(~EdVT+>uij;JTyZq5=!U%XaG8Wps2JME zODCl9HUPfOWKMCFfZ{mp*Tc}Oq6S*5;{!Tvy}b1})Z9b@W@K-~#~=Q&m{Cm$_-Ci% zP8WI);tcJIbN_mB$fyt(dpV!JvzTd2!3M;Z@PkAu)saIxwgHd)%6wDRxMi0yMIUs; z@AQB-u7Q>mt(jk65=5LT+HF(#O_9}Gn&$0g7XELZ-%5C6A<+G)_RP4z))3eqhz6X& zXyNR=(YM|YPDQsXVjFw+v5-5A-fgHJGO+j~n^*d8)Kp6rytl?9NIRPtoQ-FP8Mf`Y z^8P8fI~*hDYx90ui4xBXOHgW4>cHMj^Hgc%^VcpfcA{0Y(ML+~b=&7%yAjRCNApxR zr9;m4<(ad~Le14fJ!4m~sP6@1=Emv0z8$J_y#!GFgl^8Iz=`1X1}uZjI9@LdQ4`Lc+A@VKTn`q~7g>j;i>GKlsC>m+wH z80=YD*ygI*6exc_Xd~Q?$rs3fav8zj*PIaa1}fzuvg#6K$F(#MhJC5ZDm6*##_{Tg zfb%Tqug2vy6Ep^t%-ndyoE2^yDNWXNmw^a%X$z4VoZNpGLgi=gY5?_$6Jb5T__yl& zv3+lAZQwh@^D$W^;mxzUtHoAUM*{FO7CEPi0zsWcr|_!^7&S%XZbNx3UUt9U6!6J` z)jsg0l-k|b7DC#zXHK_ZYYoyaAZJ#+NOV#83@XHU4k@lB{^1%sp$_rI_HFaV zi(&>Y{Aj(LNA4^Dg0LMYS8c)qbea=T?!5XE6nvH4J|SSdQHf9FoYyNerF0pyCK>%~ zWX9S9b8A!@G&@y#mqS75I(xAGcz2-nny}PCfn{a;ARWS#$6~WO=_~ zpSt6L5|{blz?WPgoMVDYd;^`f{|?wH3Bi$9Pd(?s4qaGo0^ft;kokN%5aAim;elg$ ztbvhTffo?FvYq?OoM&o(2^#HHNTBTRSKxq$Vb5pM9}GXIOOz)+0*w7Yg7APZ;Ap!e z7uPPa*D~tg0qWd_!gC`IMm33L8+f25Zp2RuA9@IheM*5{7U|Em=b>_q3VJOCL8A_u zB5gxBh=oaL&r_W(p5E@!*|!FCWhxO7>JCRT*bENUgzrZ~+qSS01G5i?OwyuB=QBjLFlI?%uymBJV{|kFeVdv?v{JmZ zue?BhG(mo_VDq((5G?kmjclZ)%(Gp@G&@f(We}3`1J%ejrA$MwDp-k4X^pH~QIfzC zHBebiN2w}njBaX-E@0y&7d;hWDjmk#0I_dft;H2VHjor&uY}0d^~)08L``HzdW5en zNkn!n*27&vvb4fQYtP%HnGbG@&rYq3w@=T}xj_`w2bH$t`#)q4F|;FZ+><5-^F`9* zI{9$tBTrVbv-^=d&rI6|&~fKi(ob9a+X5Fj!v&&r?1;`uOFWR4y_ojM63YRlmW_Qb5V8cJndbz z9`=5kYs|Ig_y*7!2(>=L%`5lEAxQtQYcpq{)Z8J|t9|Al8`pqvS5_;m_f@#yorl=Y z%gij(x41Z*tpGk%JxQ+X*|(mc;yRd7T1Qzefbl0@XEGX(rfC8HJ+RsIhzO+J}wWG)D+Dwk789M zR{go_BnzhXCRhI0v!nJ?CNn)up$`3lLBFKn3^s(t02JI(KHQoWp3>LaCF$75tT9$5 zI4G$~!fB0E>J4M~GI!+oQuAQ6Nz5=u9m6J(Bxin#veq^cNlFsyVK(mngZJxK3R#A zG4%zk0(c~8Mitbn@j$nRnJjH3eUYl3=Ecmi57oaIiA`wF91%*ga4Lrlko(uu_p8_f zEZ70Qf1++KhO$r8kJEa>?U?WaHZ5OTL1BG!7-r;g;|Xm<_L0phdWP8!VcPY3CKL=T*b{>b6%>u?Q+$5>PHrzS^9>r>lc5i-bAt`@xE%Ic)z=Lr7{<(` zsU4EvS6J1u9jG;?az{@v@wj0(k2$HY@I?2CYHO%_hIxx}sPB7*g^n~}(ZJ25+9*0WGrm-%U!ZN!tsaH@1q!~t)-Jmdn6|FgF1it`woaf~ zvK7^$&9-cXY|`TnBDN0SuIxjgVe>U?(464-D?ilYtkSbJKkDQ(@0!1dD!&eSAm%>h z#@LTtzgS^V=AqIvOAwi9W$GHvk4L{U;@a8|QNN-fVdcDS7xC53v&0|Selh39+)wCJ zD*%V<%wgaBL$6!y3&CNbZ-n6$*|Q7Ysd{QyLIZ01Y;xE@ck70!7SuCiD&naA@+0f9FYOb?Ty-jr|%YakOOwub2Z&N!*kRP*8AdWd;w0^_0FjN`=%#CA9Ma7Q{2f7 z-2vwNx+i=e$M)D&T!Q64jpvXJnOk`;kbKCGA3_o)EK))grjEf|>oVS!E%`wyztT_T zvwD_ZF=-ufTawE_@0@slgQT!84`*@1CyyLl3;r(e=91z^bTEQV50=!2)w0%YdD6F zFPA7#D0uSr$juXxXa53>D7v4sQI7)KGeq350nj~Za^3Z%2IRm>}>nZ*oROK9s)G^nd7Odi*^TSMoToM9Nd0q55khP zq#wZjZv3eRJb*a;M@Y+&$~@*NpVq=&)9TEUqr#C|Lb7bE7i`+#qT5K#Y}Dup1%;mG zz&mDkAbJuYTpf3dXz|VIR2cBi9;%Nnsn6ccwKHO~Q%T;0!r%5rV4C{}3$(UDgd38E z2RD1mp8UzQ-^`ZmTCS~d*x;yh7}kI@dVCq|5_8A8>`*3a@K6xJ%)q+Z#=unarmkjr zUOLD;R!zxWAmUaYCYygeH6wY=5FaNZm)MkwUA- zfYz%Y4)P{dcyi$&U?WYm!)c&zcaZnmB)&)~l&acDnJ$aKwJcYveip+dFbxXrW({vx zp9WhbdBf(kS)e=o8F0DWf}f|)&uGQtObqC=%y$05dMkeWDGjmDt$aDqTuTy98`qRs z_K3b|im`0M6s$+E_P}mqap`daJmof+a|)6h6U{*q+v_v+f#{(~9_pu%cP->3{fUUj z(YAaL#%aCq&!`6$ehDh%i}lAnlkpzKDPIhWmA9FKw~rlAnvT0|?A7lNhZc!VE( zPEzD2KwFcQLoD!`+JZA3IS%Yn;Tiz3$bFEEt|4_WaYmw_b?-Ox(jjqy*46KC*^}>- z*2moojU`n7!c^}wdh&pmX<51~JN%M{cu+3$@UCSl2oXG^?sScrml&|Lw)JA3>FV5AXUeYnQTUi*ym8Mq(_n)bt0kGrt z9M@nSRAX_*BeOvXcebmKj?FsV2RPI@@$)ieoZalEv)9M&_IxwZ`=Km?Aq)rQ`~2yY!j6Vw1;k{1o2E-nJd|J zJC|Xmmle5EY@V{(B96M+Y#^;VVuiRAF-5O=fq{QH4GFY5%=~{$Xr+9+zGv{f30O34^0?rKGQdtD1$hI9!M>HPJo$^h#HZBD|@{9QivO5Fep^^1w_ za%zI?x*QFkaBMHEl%Z}kTWDH>(JDniMdP-H*H+;qV2{0*eXSdrup~Ex*|>^ zX|q6GaPZ+449QK9rja;i1=~Q640c5OjcWq zh#4+vSLF}qNcH55q`F4lr|Awxo5dU18L#4xc~T^OP4omsj>Niwy!pPN{0uUP)VRjF zp(VtqixJ$Hn=|NU2#@v{j@mac&h^xoMj?t;zG+YMdwMj8JwYVxIfC^m=>Lpd`%c#R7*T{gerDsM?XnZs zAZuNWokKc-%iP`5i^u$kvCEn`D6}NGl)Jd7$(lTFs~;&{ zc~#a73%&;jVJ=RSz-4ZO^ufSENl|mO!Vd(us6<+dLuthF336^V$`FHWMLHG3U$S9r zX1Kbv3wyj-pj?yjjuH2RAB}9?)Ls41jdZ>YT>~DC(C@@P15Axve;X5M=@3(RxOI<> zlctB(<|8PanHdwsW|<<4%lJXhkC=6t6ozAtq&(yJaU7B$J-hJZpC(YBBk{u&rdXcC z@neXlZl2R}L;EHs4ize*Rki55owHBrEh6om&B+D5P`&pN+mnjpnykXODm6__N*@$U zAJ|=oa?&K20?)4j^Qu^{d(Q9ZR#ibn3osn<`|$#){T4~;TS17=7MsIXU8jU|YyVPP zU5tz1>l%rIZJluK%T@JhFOOUdV#;-3Ys0F;_X%x$kQ(JgO zEN++Pm-ayssN|4jI4e!{LXD_U&L@NraABJ@WGqKJJq@da)VdwCKdw8mBVwE`Heldk z#suNVN=pBlf@VGw$~z{kP2z-~EJa~7!dipo4b8^s*2NUzA#53*c2NtFoOZ!AUt{ON zzcdHRbbBKVB#fcqD}|pIF>%QJK$R{cGqcn8g1b+LHw@H;IXF6F)?y6DnMbY|XQfU# zLP?Y?Zy5ZTj?n{*fOc zsvl|J0lIJqJWazgA@YKK%*Z$p_JTx8)7bmr#UY=#vTN$)C*H0=A~{sqEJ5?i-%W5; zxSXXJtFzYAZ|{uuz8t3CW!6u}43BpskNboqJKC4%GdG7QaLt%KaFmPW$<@J*D4E=K zfWsT3OHRx*=A$OOjW@RI$F6}A%jhZepfxzNld8$CCy7n}z5={9z#8ad2;SqxY;{QR zJ-G|a`=0F@$Uj!$T(tmJ?OmV1Vn)5G4p$+8biLF}$_{UuX%WQzhMij!$oMGgj-uaW zNTmNl$Vxtx+lCVCfD9ksFe>c^r<~+7D({|3TK^MW`q-rEl+2!sZRb}R)DBMcL(zGv zo2vDY@=8wA*$2g=mA1oe4K~YZ392LS$M&2=Wvr0IL9z}y=SKbVx6^1M=|W?D2dd}p zG=I+R2l~6(4Fkoy=X&cMBt?sZakF^l2p^M2uq3C5#TtU&&pbL0No-PLNl1Fx2qw`8 zWRJBSt(HWqmec3>IJ~VjM>Ff3z2O3%@$m+@T6XPsJA$(A0^MfT{kg1my96@-8a62X&5>LIuvJi`CL+k7$BC&mg> zeDOOcsD5~TN&9pYg-?MqO9;Y--O?!UR~W_nLdmBDkWu){GdN+OZbhZH>o7Fn!M>9! zL&5e;$neJ|BswaD|E?NAh@^&T;Z`t%x)|u;1h+4on-28N0sZh8a=CkfuQ(yA{_W7R zdaB%+vK;6em43@=Ivy~qtRM96R_&C@prpr-?3O_T3bh%Th=PO#se&GS5#R9-ET|8t|fnG`TO1>5_lL8!96*RU}`{)kxs z4ay@ne<%CJ{o{hJ`ic?AoByZUbQvVz0=gdQ*@wIO3%b)~%QXD~|7EK2s@Z$JY}Mnv zZFx>`>l36ujVNl3?bbth{PVO>?^%WzD*%)H(%qEa*EFEUP`o!f%DN{p)_(}ebL6F)_8%U|kof=wOOIfnDYka)rTCe`cJ6l)hncWg0F+>#Y-J04(Xz}c{&SrwBR;b%aMu*TsQ zwMi&xk9*5VQ?^(GF&9w5m$Dtk2tu-|u zWYf_OoEqxlAlj}#92Qt7_Lbm6`l>}7&}cch5wN57FU<=qu%_BSS(kdwb7%c5L>wz< zMg?n5616S?Hgd|8+L(xkbIQ9ejmGG&n&{k6JAZLwG65E}7E^e1u|b z%Y8Q>gN)M+O_oR!gMQUyelmq!y!|dJ>{qRClmj`>8fsdb;Fyz!?Kf(f(Qi^4DcAGk zn>M7^t>W5$#JBx1to)D&yB<{9DZG=Q6&YamswZ!p7KOOb9{#l0!M9xu@v=+_*673+ z=tQ`gx*+YQ!0w0gI326!N%;a>wtu} zqO99g@a(!b?yjE@{y}-~1Mc!g`7q>j2iWZ63+IpYZP4kO`UDf&p=4R4-4#RehX|wt zh_y3NeoYm2sh=?)3Xq0(N8H+9xaSX@*qI(&FzH}QKG#8R@17PzZXeEzYQ2+IX}bgy z_ar6`5tu|>jqBau*OFEJA+9>#IJ}O5_$mv<|A(!xS;fgSEvzs9!&IFj(LnxZT`>Kn^=X+NxZtJs*y}AB+V_{N$OLBu@h-4MY7RKVvIxG@aAb^ryarrZh3K>*t!X9({m+;j+t3ZD`ZXNkTlGpBwXMMKzYMKA<^(V*vGPl~E?>-=2p5GG@6)4-7! z&DSvs?CeTEQ!D8d06Y6DOd{sZQTggIz;}r2QAIFunyrDh6|S$lG5e2{^r{^Dh48d! z3*N8gZ5QIwAG_8r!f8GJN8tu|=RV&!{sp|&GthZ6`Ou0{| z_i52wnYn|${V?welLfsbxd0*7u4TY+wiW_cy0kpR7;8 zwtOefk38vsgHwm7t+9iDtyf$UZ^oaVKD24ipz=3s1-`v9K}$XhE_XCA+G%|Zn{R>- z{=!|COYJ+=cJPvh-nAMUdb*BLu{<)+_-%Cg{Bq|3YcdVI+EpZFQ&-^ z4~$*m-#4;2xpxBccLk!pV^uzmX>iX%{tFO}^al1=;Kn<)N z2A|e-t_?2jxJ!FN!XFudc~?drm*5u_evxBV1-m~kRq(~0Xx2}-<=)U_n(G|n9}$5C zJNs7aPnxwK&>7ZWBi5Ia{9{Ok_1dVgh_?>Iaw?;F`^S5GnLUsFK)s1+sT0^}*>cDGR^!fUp zMr&B6eTJT_`h0gS!*y6_JHFZ#$b@(K5Hfeb&qogblGL?fhX&cT+NNrdA^pLbAEXGTOq$RVvtJ=3+RVhSg={wPmRip39hx@4vj+?ZX`tLjNOP%lm9Zv zyYw#ZJ##6>ZY+wNkhChEwXa|=@AYS;uE42I{fv^gcLrEauFCy~ZPnuFnyZ~;PZT)w zJXQ_DFnMm@7;~H4T3lL((6V=RK0QTUqGtI?7oqk2h!GZ`2Tc9yhx!0O7=}jJqvb!7 z3}?*S@~DYlT4Fhee0IyfO_O6LF#OB-KX>`39$h2(3g5D2R(_q8);f5SOq!^V7qQN~VF(>_FyPrd{%C@Q#uUMpgKj<+S8jIx)vy?Ax zJO5=^U|jErAgCPwclm)+bAVuLaE}|S=ld7W`xEAGrBb6@{&>8HAokulaH{@!f(&07 zhhZNGSoC<7K!5M2GPYg}@JijN_EGyN%tD?<)+5>~qQTG%7DPhmLD_s2AD^X~W0VWW z?}33jQ!)Cfk3jX8tx&iC_TXMiu_i+_N)Sta;bef-PY~iEtUmrYw_3+*0Zn-aBx@CN zGW1Y5O3w@rV&qXo5j0kXdUuTA{Y!!2nvFuC>LaG)qq@W|tK=iFJGgTt|SFg8kK9s?j*=5DOQbs;h&`b>M7mJ{kCx3 z@)2yOb||=ogula3-jlSs2Bq5x)CV{}ssKfSX!a=vYHc}O52lK&s8oT-_MnX{FV?RQAF^Z&HDiW|9_ ziT{^{|MVdBXh&4tlSqxwPM$f9L_{FxOtS%_N@ zfH7r>(NRZ7PiZF~px-Bn7*>r#Ya&cm&8o_Een^+8a-N`RQ~g|7D7mmKn?CC4`}+Dg zfBXEJ*?c{zb^x{QS3_1WnF}$qoE&Dn0L)H50gwk*hbq;3FJ}4$o1Lut0>KGQ_lXUV zZjNA)*Kf!x$o+|vgQ$7=6Xzy=xqHnbhQWJ7;Jb@G7z!f6ojw?n;BL)6*SdHSRm3~y zWrBoUmE+;P5Iz}VzCz+-G7}pn4yct|Mr-{})Yn{`-2J)8XByr?0!+a>=t1QHq?6J* z`H~3GR{m0!-P_?@Fmk7Z5;LQ&dV(TXi~4~|GfRVGo={{HBuHaE-XI(yTP-?I^7=Cp z+gvs}TP>MJBMvo{)l(TdV%*tbFP5|VP@bkX+l@gku8UsY>Zj!246v$FH%MdW3R=k- zVb6L6!YPO7dz7wbOV*gis|?lrLkvjjqR$rd;I+RnF4zFw~A7%-z06T@y(h3&M;Y zCDg1eBaH@JIZVb+RZUySaB@`SD0{t^hkwB(xo>;cBue2ib)etT(J`KEYo{{Gu^zDS z8mEVaq&O74gAS75m!se-u}(N%47_wm66e47-4)c5<^u!>V zNW-sF11o_1Ar?4r=HN1#Li9GI@q0X=e_}jAnWDMl(Mjd^Qv(-B^#`X&^#`g$yL~RW z3CCtF;f+}+y*|4L9=F;FV&h+IfHq!;GTYUS`>jOFF|5ig@27FP6+UfVna?x&B z3F~7XtSv{!+1B>qSXDB&F@mxJ7%&koUzXjP; zTz*ElG^Eb;0+gmkKeA2J<>Ip`(Elk6$3d63vj{Pj==!yuq)n-(S5`Wy9U-3fTgHr# z3zH*pUq!KZLYJ29EFAOG{(1DwiEE-wlIzE5LF*JuwAvB}rjO{}qvJ;H-^bU#txl)1 z{-t2X$0$7qK=wt14!jB zow?KJ>Ux)mFJ_UKT-UAi7qmqUK-Y0DfA60g8lWVFb2N9-ALG}QsmT)d^YS7TuPiuh zvDfDM$F}1Pzm|~)H5U$DVFP)?SYv^?uB@AZbf@=x-P=kqR@g>Zmt=#?e|gT#VLIPU z{yY<`B(lIM;Le-`=ZxFlb=8U?!1u=`~RZ^wCatK?ufzCA16~Fh*Q+3R-eGC z&q;S{9U4NwrEwP65>QJi76&X%dcICwnCgqZJd1pApu44?LG|M1+Wr*Xp#P8Z*2{*eJLYC*UX>8obO?h*IbjDxRY6t z1h#^-T7p%YEY_L=)>>?T*91c~F%WC;;$(*yIU~0&*t6HPLf0so8|f@f3id#{!o@Bq z*Vm9S2qJEt#)~Y0x1CXjcty6HDH=h}G(!N}GJZNmYneaFh{=m~ldgDDkkM=r#qfi2 zT8pz%^M$MYr9A{-K)gn;hw(XvsBX9^HD{|PbSYZ0Dyf`xVX2kz z#*ia1_>e5C%Q&Q*HbakROxrq!4M&-FjXK3B+7D|82fe8>CdLfpzkkJ6oV~PqJJJ;x zA2xiDAO<0RW<>BbJ@tJ}J$-$7dHDe(EeXhp{5Ff(hPQH zm%L%=@YelygZxFmy(vutkRPmXfJi64i%b2nFPE+1wKXP6^({mwzz=Qy;NBc3G{8BZGON1xNcChxL7x$x6BJ`PPuYPP|d zHjcxVabKNa0|}nh(xXyVlO&syXa!P*cigSO)LisRHtIZ@Fyl+#+eQnR7%ty;WfXMh7d7 zSg%bQXk{cd+=v2XD6N`|sv2ljRTy=Ka*qAS-b@7mvwRm~ZSK)aUz`9u%0Vvv4nVCJ z?k<~Wd^JCHU;k%epp}BI?%i+ibm8Ai2!Zj#oGpF?XYew_G>_MPK%&-RUHLZbkp{FY zM`Hsd>bR;lTL@hf&4aO~nqG|dgQL8A%>D8DT7OE4(C*LU8V<)3 zH!~RGL^B^uT(w8DcA<;$_-D@p96T_eAH)B`uLEt=Ne-;{+K(k zKSr8Eqh&ivK}>sIi04>DpkM~0@VvdG*J_n|EwLTsjv`g*+lul*SS+O1XuahJ=U_}G zs=IieK(V#BU+B-2y+G5L75!Z`U!C0$ZemC5^!O_nUn~V&f zrG~#|$lVlKhp+cMkN{}5N18FSX0Bz@I%hGxSb~33c-84o2iC<-FH8IZ7dvRx`iI)Z zT5OU~CYF&*N#T>5OXYU99i8}^2r9y4;J>#sj%q#A`|)+urY&$XNEzUtW+%PQT6j8C z%Paf|%ivkJ10J2W`w>v%Fte_5)2mOLtsb-OCm#^TNn}DexW>rEDsg{TdyVibvI(&u zsNs1GbB+P}e4%nxJ6m~j(r;BcRW77SG1Zyw_g<0BE>akp`Y76l0lQW--YuS)u{E=D z@^`oF>ZSe+BR6N2-7yghn)*K~-`x~-Oh#&=^*!a6-O%%PqP5}-gT}YMLz`~7HD=4L z)Rgqp0@f1VI*6gWrSdK7qYrzhWqLI4i`UW{C!sHzk5=`Xw6K^QwERIImN!#1mIzk+ zzi==OpZfxk@pv<;`kuc9xN> z=h{ud^#2NPwEN*xz}B7Rg+>sAW1+D0n3<(qrwQY^jJ!gsPL>sv>~Q(mzK-rM%tqX3 z`@(sPay>{v{M_UESb#w~z*!IqGbHVY8RZs@D#XbR#~uyD$qoL2UCt84{2-<+nptEe z9zJIpUXFqzX+?Tb86!?+{=5#eZ_bUo#uCK}AT8`2RT7LIItSiq($ZCqb}1tmhd+_!a2=o~8d4E%A=%J2mtWWopXW89_dV*6lDA!;2s!eC z2bt)w3xtOY1-6?+9l8RGF*=xd0D#X6mpnadp~n+)W?GG^7Do%uWlc^%hy|Bl?m89U z<%LSaCsISD`bniu{FnCWl$i6c5$IXCx??kfG$Hej*4=~-^~BqNkf712)DS zkE9vY$uH$Qs9&S2LQTK%61=G#Wd=_w?<7Bzu3*Y-ia(udlKkqtvfgiiALR~UHj+2S zzWC?is0lI>HAIvu_u_^aW*e<4tYOqvi7?b3f%8JOPSpxzys_#EdWvU1M5o$G6!IdY zEiEB(@ z;n|ehsUa5G?^lo63Ph)!jB}57HVFDJ1M6w&)}kIPslIr}TS5*8!4Lb5+@Hm2-o$G5 z$Syq4I6KE7b3QI9`FtFMyV!mh!Svj3MBM#2fV?-s!1tMdTIe z;QPQwOtaX&2F~4!Vnk#m-h=*+XU=ZfIEGz4e8XOo(XY>p{ zqYk6dIglf)u8aDFt#Z@-1Mh!9asH#zzd4E3Q2$Q#s0V<6$o;pKj;xi7tE!iynS_;@ zt?B)RaDyhU78~-0z5ejln1(w1@TeCJ+mGpJdrnbC8U+ zdv$DIQtR@A_3;2ifyg9m%O~DUvPp}LF$><;f(~AD4hjU!AEIECV!xbb@Tmn z%!O4jI6?Y3GgfQ$JKy!?qZo@+3Kmm^4E{5EgB-_oBK>KG5;6j#Szet}! zO1sE+YxXrh&(si@A9>N9A%39bk|jKB;97yWTup&`746P-G+@uttXfrhJ>QJOAzEGB zIk$#;CC$EM4{&TH=bgBbvYTt~Wh6MCP049S3L#gsi;6V2U53G(X%ekiLzjbXPXA}( z!diK07gH{aRAS~G+ovphei=8~1qoL6Mzi;=0JOzv!B3s6mP z&ok9}qDtUsC9jWNX_f3c$j*{amR>JYkoe|EH26e6YO^4)B0r0=E%Cq zyz~J>#e*HmxKhLy{rbocyPSlLF*!2lm9U9?v}Luk`67PKJ^gUNmMdj=7p%y{o&W7? zQaCD-TY(c;QwVd>4jOncU?qi3pFp|qp0RgKqsaDqQnym6Sv<8_Wf6~Bq5LBXF1FBe z4Ioh0Pl)&2WUs7qw!+u+v2MdQN=v_C#ITHewfLkswwy8{?))oX+G^|7a?tERqHM7O zXVHwEPkbp%4?Q!HkFTay0v^E+x$guEk!Gy%TL!FMM!B+z9!(;e%ip+n1S(Nm4q{<; zhchMl!!{^7;!|O421x`(H~1EM>cjtB(joWN8j#9OPE>NlJ;%r$NbHw`q>a7FQ*%Tz zP^yQkrtno8@X}RuM9sk1jCi^^wL$Bx-Nk#Rba2%g(1U@WrvHrusj+$@Wztz5?69|i zrmt~L;Hxq4bnOQ#q_-je=6l@07r_^b<_9N1E!bYN2W|Z`$SYSEYHyn@w9nU(IKyH(={_TsB89w*{hN@wVIC%k;@L z>k;)r>a5(2RSEeT>+*0-eQ2-PB`1fK#CC!}ZotM6--UaIhJ5Y60h{npKTCuIriHyM}Y3rXI?Zh=gwxk$qzam4x+L{Io z>`~7d6o1*`NL1&VPgjbt17Tfc6JG6nQvh~K4kB4Y7tb0hM~b$ygA6HPLHXeGG**8` zh;D9il3OL-_<~8_v;#QZJeh>jti0sb1g}iQ)%l>eI3y`4P(6T1fd$<=JF>kUbIc** z>0Bg(*8=q`#kVf<{xnI?*VBGc1-2yNy7KeJzP=q2z5yl>T+KJ7SP7@#-*V1B#(Vc* z>>vtu1L>v=sRiKG2H3#s0!k3VbL7i>JJEaLS&DZZE^T6VaKBVsYX;!*j4)6^)d zw|ofSTle=-o*}DwF@OWch;v)S0I>FUV9yS|Y{{by1D>F6NU^tzs@HER1nJ_0T;yJy zRytX~j63gLaU_N}aXKlgAYq{3u~4KWAFcuos6w~gs`#+EqoQzRCku^b3TyS<%oL^e5vqbU zn1OEQLe;e-n}_}BBHPhvlnLThLAxMsnUTc6NT+mE{;ET`=ypTs6V6C0lEv3meVkRgs@=^Ov&ikUQM;4^^%6 zo>DW(2YuDsu$A~K6N(8c#Yp)ig<58xWB9I2^d)dl7E7gr#J}B7?=zR#U>%L&NKl-lhy|+;1)FD&5$6}d3c(RLl*)pxlrqJE*Bywk? zBIdl2ny6Da)Y?p$`RIf~c-SWl?KR=_M`LTkX_M-$2?c_2Hm&^xB3^XV&e-3vR97$; zA;J;u_(n)z9Zka(=^Wuem*krIQT|TuTBfQ#!9qkR8ia%Xg0wB}ot*fFrt76_F)dj?Bprcg3U*4qL6JhSz zlTILu{}7`dL!h1@klu?eN(DgjZbNXW-NWE?4U=OV1B^){^_{4aNn=wr5mlPW7+Q-I zHe>uzN5BXBhxSSMNeRbF_GvD#{u~5yM~@B5G#{(sV^H0c0^dx;CkaJ+LTqV6Sz?g} z>CrpzUWStX;XRmgY0QZkY8G2mYF1YNFK!R7CIWe%Qtpk)JPEt1GWr@kj&gZLIe0X;5B@evTcX-e6@8F@rgL3d_Ri2g9 zTv5=3p1VQNjKR>t*U{Wf=g*y$+Cjw^)44p~X>Pf9d58ami2T3|;k+?EGGhvnPsG|$ zfU|t2hbLjw`orCu4C8-{VPxi=S)!@+lhZT!>SJX{y3v4K>W6!cn?1OLX(;+8imhS4 z;1?z`ZPq!U(v4s=WP#!TUJx4?_9-N}_Ti1`22iw?;maMRTSpzMZaB{f5RCx)Q}MrY z!o>3^On9|Ln$X!G=F{1Re5m_0H&Io@=CSN%?H!56yUsxylFTAE$rMvD2RzOZQU~M>pe_(lw>L^lTdjfB2YK zdzCP87qq^Dfe4Zf9Qz?AMk0by-roCHskyQS!;Z4M*p$~%#Y>JSF{G!lJMc*Ae%CS& zdm-HjrP)3U7Itgxx-A1unR@7lUjjd4lxB5QxUUX2g&hskNK(|xBVW53=`fpMo)p>An^CA$ z06y8hfJpjN|D1%4@)o4ZkQu~c0;=v7BvXkT0bPk+UVD%tj*(m7)J7C5=^>gPh07RY zDl4y$W0K?Rv%{!On=tCr|thlVfl|l+!0B+Pls0_)}>H7A+-+2h|I! z2Uip~$z-0d%UWn}XS? zfKlcz$dq>t@)rk2oFy5}OK&&}Iz5Fwp1+PDdW)qP=26+D*|my(IgVvW=D5jBu{#5a zl4^}zgA_fu2NEk#`60@F?;iUv&^PbsChttLcYS*Cl0C9&@obp!dZi*0^uj_Xx}_&9 z@;0geUhAV-LcjhGEGC2paOi{eo9G$}0s{PRHLw5A+V`KA)LVWYhN>gW&pZ~#|9ZN7 zz>UNL%cy}YrGbUPp_H)1A}~scRpAtC!pt)m*_gxn^@gAqVVbB)XegK)L;CqWLOu=( ze(4r_d~8qlQjM@8emhqmy+Y1cn;mQxzq5G!j_vcGKl0x|4eQ%ihgbXppTol(s@`-2 zvBMp7o{^d22R(deL3h-at}3VA0RFonzVEZpYtP|PM3pPPU#rj)&*6WsqiFrAqzfwN zPvBOuDE+PWG^)l4y7pHD{XgQOzV1a7mfm#W`&34*{GOTK2Zo9KX0Za4CC$5XO8;+T8?cAr?+~@3fkgOg<&Ph{TFR95sFH@rG)C@G~c8#QsZ=oKO>8RrVU3>$Ot3OqYq0D9%NlH5@k#fyU zpj^O+xn;<c0^ zD&*mdX1zcl08mF;>-JG$u@tkr>`ir3e8xljs0cJBgJ?~s`3O(;yu?j{gCfu^L8t+oE8X(Vn?hKG; zG?xX)Gn-ojV2+*XKWTH1iRRzG(RUiSZ5J^j z|C|bmb|Ac+8=`0EHcxPj`aCYnV^1uLCscDFQpp(eyNB?%oJ#=+n9VH!1We|d00I_s zI}9TWe{}AHflS)>$zgO1-fP7g^xjLwEA-xaGxK#0D@ zHrE+=j3D!wSc)L)nMsUb!>LM)VAH8fOmF?EOiXX%sZC68!)XD)&t}d8;8$1wl>rpe zye|Pt2cB6F;mdwMuu}Xv&bU(i+blCE`q6&E_)Mdj!WzK=w(|$C;gQue2b)99VCyJ+ z)30>~Tg8(pcr}YlD3TfGCNMzDkhX=HUFhhnhh%I}FS?_n9o_7;ewI_}h8U))FD{1D zMi0W6P+_U1Bg3Vo{YIWaMx=#ZT4b!Mtie{rtg408K&C~yYf0TaA56AWObIhj$W0| z%0}wW89-7JO?@niSIjEdZ8)Bu?i(jM?!-CSu ze%V$-JKyGVH%j(DSbL}7T%%@fH@5M{wr$MVwr$(CZQHhO+r|uL>|`dHJFC_{_|~rd zAFQhX;Hj?Xw5vw-xO;S8_p-RN_if7(IC|k$mz7=88i?g8InkajUKB-2*mTq}29TkW z^wf5S4?JOgQ3>-s<6hE)cixg);GtyI0u7P`n7xz`%s)=Qyu{KU=4LUn$W{Or)UI}b zd!|(H)yU^GTnf&7x~{h6{O2@k4n}IkP7APqpo|M`EmnUEyN)h0^>Q$iGO58bSB#pG z*a63Gbk%U-)*Y!|HY$QDtL{hi(w0b*z`n+}v=l~+#UyEC)TM)@W=Dlv!qFbGx4_%V zdvu33ubd2PXgYDpm>@xa3#E>#wwC4~gQz6gypa2uttA=?)McB?%&AL_i;69Ewe|3*;xJ36N`Q2ni=`^;LT)K{Wtepg+)$&L zoMhV+kjnY@*i3=TNhTmTT5(VX-ANUiW%@13h~8@$-Sza{)zq{~M^Tf9Ohx{ zP4&bdX_?C_DKosxGAxlTE7mkpP3C)u*{yU;4bA%M+j^s?9N+A@ z2c?XU8Lh5ShBaO8#x_OGKni^GZ>22J%*X_Rv6ISQGB3CadF95y5l}_0w)5{|+ zr41%48&vye`^?}CKxffNRb>6~<)8fB+C6shUSR`q4`~}56v_5&16fuSlYfUdSaIAv zwh&D?#Xs%ePxI7}vu|phO_7FV=kuQgM6}c^ZOv|S9VHpjro3q&M(SIRI4CBebsx%= zfiI`#TYT$ucglszo+E#5RhCe`)O-$KK>A@Z)#Gl^J2=DuttvJeV+iw2&K{-7qo>0Z+&T*tMIwembHojQadHt_gkjA zE{htZmI$9DXqiCKA!Z_HlU=!7OHD@)t+I_PJ8jA+I!FM_DMH#M5p!)4rEIv`=v$ol z6dOg+=T(>8o5U5DJRBE_6^SQtyQ|&b*V1Utl>2+MEwe;>KU7LZ_P9}89AVCV0H26_ zNFUSGgGMa_RBCLko`U)uiC8lARbBJwhsdU|whiek+o-*^bCM5Y+z$*Y8ByC`IQk>awl(VM(yOPmeG$GR zeP!qN(O(V#q4qUq|1yc@QJ~ck76tQ5n?!nMo5acu3Nk_VMKsMeOiBnUH7p+6j}lAe zM{kVvRQ2bz-e%2VACKYO{2gE8HoBK`wlYkcXrdm%BOpgYoKZ8Oee7yd113Aj_B zeoy*2v|$^^2Fy6dBl(j-jdK{!L0DIpx|6^~0>Sc3qY^r?Mc!n+R!h)cv*^XA7`m~A z#x_oo7}4`3ExFPjTUE|EXqMG0E|IpZJ?l&#+=Zqo02lH47>;AGQ80WPCdJscQ4r?} z8metitX!jLUPj15Js!*&AUtxC{fn?HgLogH%(RaNJ~iwv^bBm9SbDxl+>bdt$F%DU!x*;~x45-iDkX4FL$XEIv7ccP+})`-c)aF!ut z8msaJhTy52fhxnKd|^|Er>=QsgYWpvsXXIUjn_H>Os-C`wIyMvSFUsjE4*s_4CM*x zWXq)e#9BE4aCRu7`n`2T>BuUyhEK=9gM1|{qpil@-!!vZF|{$PC$4jhe4`RuUqK_^ z(z)zbM~<(M%%yOU;Tks-*~Tf>K(fwNc3|AsLihX7M>)iXNgu5dYMflvnODe5+J|_U z6?D|)s+;E}Q_s^TBYh_;$9ZI9XLwA$U9`~%o5cMxg^Jc8Pa#oBL?*v*Ihov>1TBw#}r&AE=xLmH`-mFK|6l)W| zqq!W@J&bNh>Q34sj}AcicrD~uK_@jztlaQHjml@MNZ;YupN7e3N95*~QE_URYu_qb zTERT(*j53s0vw|jdbeIjXSa+3T0Mee*Nr(XH%wYSk$YR|#Ub~K3m6j|` zG|K9s*w&6ttDD7^XMc zD;es&qfAS(YQW#luDjI|2eoMV-yC_8T&gUcWg9G>p?IBLSbcSl5;{4Z6DqsiAOz0s zP`9lQCPCxqy;PihfwGKa5uF?g1&!^1-oTHN#?U(U5z)Ag$@$E8me@KiYWeNMx{KT3 zSQf?Flb9QCpnaxY*6wk4adfXV^08K4y0(85V z8e<2jDwB3Eib#sd!fR{UnsQz}Te=ovrO-)#Cnjr7x+!5H;|tkacZ!t@OE$ywOT~zf z(@HST<*!)lwp3g^b#KKuH?d1W$9^PxALSke$>ZAu9#zoWC{wgos7sNC1pr*NbL1a2 zn!}=^wKH|iR!@jq`wL$PG9*b!*-=BNK+^Y3APo>dzk8^1$ndqjr8Q>SGiGOf+SZfZ5@ zey}-iehZ;fdju~h^6oX>j_sl;g(f#}={BScCj}08DG$+_WdnSjHIGs&&(oZIIOw8S zkmTOWJsBl=HR}IuVQ-)LKK?X`h8+nl>xfW4ou7#q8p8P1FMhq)CsNe1%l~m_SHv+> zQoIGvch5Cc7nw4UqJUmK*zyLHRlRaw(s!lvI&0ReqMccdf)aqdjLa%&OyjO~Dl4^m&o`cXqoFk@mo)_%UrWiavI!Xn!liJY z$zJ(G2D3FK#b(4R0-e^^QdZE_($mteih&x=T$Y-tkkg`5tMqDZ%t&8v5}nTKj2tAD z!)bL(Q1mQGJymsWokDTqoGY`J3%Z)m(|lx?lT{-p^g{%5nh#r!3eV&+*R~`PS0r>_K~ikI#};an% z?YTR=ygc93gc##hMCQS)MgdbEVq+@=Ka2=oZh?1JN%f*OPH#_kZj!8*1`aPR6{SX# z9Khr9l@;n%A@1m78w~jpbS&0fse4uYPqAevF9MtW9FNN)noR zQn#XE%!oECI-YlWmU8wYNm7p5`cnl@m&s__#!tys@b+AQsfk+2ce0r|s?vciQzOF zfjpNYyY9+|R>JTpA zrnC0!!U(f^aLpj2$+4iJBl=5IG!9r@3!Op}OuRN7tA@-jT+`%dQ%tFoV_LW1mzT7r zPyeXKBpW~-Dji*{i9{tH^_4z#e#&<)=+?)9OfZ6(b0VyWFR@YA?ZR%B))Td~)j42l zGxPCOy=K0CtSG4HA}vwr7c!JGb+nYMbffR0;9NiGGyTly{M`%>joztkJf*$Fyznq# zlOMueT$$J;RZPBAZCg`Z=1qQu&8N3m+v*Mlih5tQ&E#06W)4`Xv=-++cA1KqS~7Cw zedhcfhfT51Mz5m+P~y{FY#^qs#v&hF_&ALq4`H-P`a>*Fp7e5Z|vyY>IHw-ky z>qmW@HuCzt4Q$Q<0xkkN5d*>a2DrN;`?6!i8L$Gf2Yq9AlnzXOyF63`f;cqvxjqsY znDpXR%?f(wol>FS?#ivAI>;LCl<@#dFFSO>2*$wzoqXMag80US;5F&f&P5lbYzDpx znK(5cUHCH~0E`e&=Rg<}T8KUC@O{!uav_~FAnp<(pBvGHBMI}eLtXhX(M6a$ ztrq%nz!z=3NZf;xyx1-TCE0R>&CrqgZB$N&)S>LIObPyUH~gLjjpv!#H4GJ-#v+4= zK?nX#iSenpqc&?ZFLJozOx+h$L z0=!{GgZHfIt_kH|FSxpe@N{v}BDr)FBX`|OoQ>meI`KT6K=d}n79{d=cFHS2yo^Dd z=VrE|f0%eL1&_I%^YBoz1mVk*JXweMYN=i0=$ksJf8ux+C7O#tlo~D1Kox0jsx81UcO$@Q@e~qH=7M6W`WljO2Z8ZXQXKQ4NFuib_7* zHv^kV3j#TaoB+FQh%ysUY)Gy$NXv5{*|Fp#9Ur5YeVTcAZXxWyJg9zWL!{=MR#1E|r;O9(5v;r^`KtffDb#M z<})sMnb5hiKR`x{!3{Mvf-8;mW|uz|SnMIXO|8rg9Am8%PYq z3e4O#NE>7b6Dv~(UTL#)6M^OQ{c~ywbDjh5@Mae<2akISg13gPpk^lCtpG_?F@A-= zIyBJZR!ps@E+E_u$^A>=1ccAyRe4Xv!7D<&Z!n=xVX1 z_BuTbE)J#jYs~_QpnieRYcdKR6_@ubV|CD{LL)$p4HWyyHgu|1q4YFye{utA9J~sY z?FMQ#tPXyKi-CI(6lUniwn3x?7WtF2L8Y+ChVBOA$v*US(``X*1%H{{Xcmc+-$AI` zGW=SxONs9fVXB}FLJlS;mBRx&=jg#JaJyNk_Hs=i4;Bq*`6baZR;w6Wd~+`N9v?)F zLeO5pE>!s_Ij03juDg6lS8d=js5#i&ity@iTR*@x7RuOP4X&mW;l&b1g73-Edd_a^ zAZMg_C0OHh@Wa1kIC@5yvYoyTX|u0cSqn$EpoEeSo6_5f2f@Fs}wE>;a0KGJWW>A>FUq z;A#WD9R&3OSewiJgL3&pt2cx?!60i#Af52wLoZxVj)uXG#2?HEZ{+){O9%A&z^n)Q zPEh-B?HkBWnEk-@8MueHsQ}qW%uV?kpJQok?%vCX1jc zCUC35JLNDA)1RJd9Nu-3>ATIb+6@ZqiHUwR`p$^``(n(qBkV6Wvit04NdS}M81+G8 z&P%$5`QcJTGg3zo(;uh=l_4FE#utdSz@BAKjbUWI#}l#%URP2KdQscg)@uG#P=v~> zJ_-wqW1?G=YjetL$gki$$it@A1)6hDAo^{Hbdm_7O|u0bq_A3W`LDX|+n#2>by=%~ z+J>~=6jx*hQ=S@gTj$UytDGQYDi30Cmdi<-FdCf0D%w*6tgXQ))<%t$5NnOBNpoX^ z+kw?UYhr9a+l3`Q?H1)AZ`*?|iEgu~vn-AFb53R@M&i(lJ!=!Gdi6RDupF9qm?`)b z9|t=h5=gJO7Z=7&q>6Y$CzFFROmg+^5)KY~4oJI5?8Jdu#f`c{GikgII=Rqh`3>@b zZR0R*G4th1k5zzp7f36UgE-tu8M*IK`KMjk)tm>NkBNaZZy|p80w>DNO7HEF2E|af zFdfrM_N8oVT`=g8)>!v-Znuxqm*sCb6@#mFa`+aY~_nN@7;rH}ENRnwWb(HT{as1P$<)eP1lfR%mT43?D zQjs1L=#%{+=a3+XZBP)}Bw8{qqaO@JAB6+Mbi`w7k!9t0t9R)OpArZ5bVs>s7G)QL z{ZY>jWBJ%zMflvGinc3OtQQF_EO!;sO49<=Aoq=CNIZ>MH%P8xZu?%%kgZi#$_P-5 zQ{)^{yLp+S*NGZOt&b)|xCk%nMLR`w_ua%BiO!Pqh*~R10 zEn^ABj+}HlLu`6OonfaFn|AnTC6yL1vyONA+Tpo4O8M`@%-4g~zX#PqC+p)K!+YiO#hPeY{ zfhC4iCI;vk!McYW;D$7=5V$s?@wR#mxNqPe8#!o)_!Z*53PAn}lZoH0W&lq!!pa>> zeEZ;nq#pv~?h;Ha{#EDzMGULu#Kj*=yhDo%OXpnjCqN9e=c@XIA1@}LaPaYP$l zAe0+Y^uSz~8LQ+3H#g)@GXhpSM()5hKgi@nWjNfzaX{D$b-wrG#U>avzBA1UCon+v ziyM7oNjspYC4&dw{h$*yvq657drz*)c;q z;2Wdeu}eAV6(id-*9m&X;W$7zhW1(Tz$akd8w`(?zekoA|I9XL*tx(8kM|@$KF;HM z3n_=nf657!_oN>$=X*VF&dYtvITQWtKBM#5LwgIt8o-!6d~4zY=rffcRsW{-ndODn z=a?VnnCZTwbLQ!@<&XQvm_P15lYgf>J@Q%;_!j7j8A9K2WwAZ_{(OQ1TvtX!&Jlm zl%^l%3Tgi^vCkQbzrMzo4gOuYH2A~Azv|0xe#f#-`7^}6{E{*LlwTtHUZ))Y$8`GP zU*Om#czkWbJ#!8QQ{1B{Que2bEk1Ib#mp4>vs+Lc}O#?)w9g6?R=42gPEP zI}0J@1;@E};zgzP0tvg2Nl$g5DkZa!`rG9x`K7D0=Pfd^I5ZjAd|2qlNuI+Z%y2E6txUbsPZ))kC$`yYw zGa7_Z#|viQ_DF9agA>ykFX2OKeK&$9wXnMOTQGBSFeZa&N+s|wo=TRXfiC#CJgK@INZ*@TQ98FB( zdJujxMk7pS9LI;{E)746fB*`&a#qUB$qjdI)(ymx%;Q4kT&%i)AQvL|!X;MS9?}b~ zo=CALtivPm!xJ15hn;Bdsb+4W+uQ!^G3C>krl%QzV948MKJo*?UZ*4)pO34T)7TeixO z!Wg3Mf)a9JQduN(fYF6HTRwH1Zsz8OuP$D0*vf@~og2t@klcAkFE`87YsfB!WsfAP zq-tGaVcz`9!_fxE-#XEf=lLAfQQ2N(thLBgd%m(C)866m>#VZ3a%sR3bS)KEJ(XMSTzoPYi_G0j1;p&=+9NM-A=V>YxPv$4Z)Q)QS(;Se1Z}D}Q;<@*j+iA= z?1P}0la<(&gz`{r3Eb(Tua5jSddRS9k?bXyc2t+VawK~t%d9`HlZ0SKGcdg+LZLJb zQV|iux_=X@7&WlFr|v52K>1}GI=}NLzwYz9*;^5CpHBF`Df#@0lUjVf!#LgN2Tl3$ zI{aO17BhlRjxD8+iXlKsKzrS7DXg3dY81!7#TjbXOYNJ@U8m=U+jJ3@*E+*E|Zk+cI+!sMUelX2G#7H0ssE2_u2 zT*C$Zxr}>rgPkFfZGewe2+S4&#X_$G`Yt5L;#WhY+rZZoP>(d?5XBSHrw}5^lJI$< zcmwPg{NDv*4?@1UO`rKf3P%*a(B^Z?m%{u()hF6K>G?zMm;Bq}vwKA^;QT_2ds#1N z|MK+7B6Z44z0%%uHtrC;a>*wM*>Vm`{$A12CwA4vU+2VL;dSM&=k`y)e4+%4%}-?g zUr}z0>qEl(R;J8}t;SSnmiA-CA^b)39Vb<=^qrSM(o(BXcMTNvJ&2Q!chN8WF%@ZU zd*~I%ewWHF>e>7k*iA#6nbDDQ+su%eikZRuw$nP!wI2-Rw~*&@zl7}jZl!+>3qIL% zhWG_rKJm=_{>ub%1gB)Eq74vhHT|#9b&~vX0h-<*uRD}BN?Uo(wn_h9UN+N; z^WL>s)*;5z>|(H6(?>N;t*{T#2kUd2aZYP1XGDsqat0R)RG+Y*in*Y#!KmP2SaLTA zW;pDU2=*un$tg!Vth7iKcV(*BlrB1{_dAIX31N8F#tLoI{cx9llc3v#pdPI?JFP>y z*h3YUXgRw8f7@r;g?<0~lpOGOpQYwCYTs+lzUyV*wpPUBg2Y#leLfxX8XP>r59gpi zfnn*8f(bMp<)T5)d=$aYFZFb1Kp ziT1{|MB-^7cCatI;q28j8Rxx@*7`J4un1M1f`cUqI;G~~!_v>wWM0X)ps&>yb#bpo zbcw;Oij_L1ubUC47fGAMpmb->z3rE^w{H~SbDg)+Y@F=nxEv;3z*cZ)RY#CVt4PFvZdVOaNQxT>*j{J z+tE6&gHUYqc7&NiW8JYGsIwx^QWr1thzH2jE5UdvEw}_;`3Is5D8Pi^Ix^tY zfeZH}&UW3C&>$BZ%rs)vAs-uXC5E&^J~pVvM2wGuzH7>Wx{Z*$%jAUf10*k^y=PFD z8U0cW5FSD1)R7r49+82I*3_W+eIVtCmPZmd7JG!bLk@G#ggkU6!qi7T^p>X)ksqb> zsYpAdTNINd!u5=XoJp?OW*&XoqK7Nr9)W6^&6(*Ih5l5j zA^9s(89YL@sG3vPB!XoW_{fGyDTf4Rw6jP`hgJ^7dc^Yx#WA!)WhHug6ws)~OS=|% zHtKbs)}iD>S%<10`De8L2;u^RW3r$_vn*2kgwe4Ym&Pt#c~s0Zrb9R_dbUY!r}TQz zNxWM83OHTIdw^^m-(j*5vg(A?U1d`8t76Gi=ixjlYEb5G%E?Bhl7Lg;_kkL{=RI2& zO1tA^`0XNgPq?(-HM^^$_`)PAh8D2Lj`RBV`>kHje4`+Dm2!FUek^{OrEIMU*&223 zf#R!&cl)4k1>KD8oRK6?rey|62yRO(+=DM@ zR|UbTa2$NYuCY28va>70EIWn8Hx2#Eg~p@lE{OIRCsN{o{*?=lnCy-&ojG@+SKvqct;aZ6@w!JeGZv z)8>M_-kI%~xzrld{Tg|M$FsakH7)Vn;E#3YUmaEk>!dg18<`8etcTZaXx@tSCeSl@ zbe7^_Y$e(vy3C)e%*Zx3e!jF~e%_?*FGrJHN3}sWm&ATefzoB~U2eb#-pv8NL;~(D zRxpvFXv*q6s;%m`SIyQ8^QYh!#xGO8N31`Y33z!Y52} zsCf=)u?E1KSm;xC@8GaTV4wEX5PM`_hW?t``>4DOs+;J4YTN|tPk(1E$2+~TOkM1Y zJYlBm@QsnJ%Q#N5DeE}RqNV37SLl6W{wr&GLmFtuV?n1N+vg0MNKMN9e6?8lG-1R| zRnw_&Ch2f@=~B&7$OpSlx_~%Au2w|+JG#bP{jT&PH^^_tiSt?&3A;^tfl5JFdt#eK zR(=Y^XbM3(EptxaOel>IROsZ-DS{9-d>Y88jt>@n!l*%w80PBav9r$orx?Q6cg3J4 z9y{h)F}QJ0GIS&}@>vdqbWVmBAQ@ti$rDH*DnEKNMq6gEp9Z1RwjIEs9rKcP2Pp2s zdGe01p%q&f(}^?bw?G3svEbCe2kB&nB%gM4D8WS}dr;7zr5MV5VBDa5EEEI`Ab4{6 zP?nF@PKqzGy;F9P6Ns*#khshC+@-PaCY^mc`V74zp|;&OJApy)c-nIO!(G@s#u+>- zk^G9P$7$FvgY(@N_YK7Qi=u9SHIaFc*j$*N1NwKW*sy??d~O;OSJZ)#|H5Z%oa~i_ zpT6^*Wy0an92Dz8`K{%Tsf(lbMf}5#T2x||f7B}+>WfVXV`r}R!^slXV#pW8rdXGd zzrO3x)_c;*$`f-S)yA*ws&G5IwVeD{<@p&V%gsv@&~bM^z(Ap1ov|6#C4ANgs*3!A z5tfR6A%rZJ2M0Lh`SR{%f>{WKilmsdSj&l{^c9^2VOP5uzp8sVyQ*M*=G9_2wF;&i zvQtebsZnG#Z0g9ccAQWy5A(yqi?>0Xa`{ zUb^|fv(wJIE?z|br&GJ5L)395W) z|Ml#L=-pmU0v`zHT$H)!w7fvk8*RW%gwbJAwMNGYHGsY|DpXAb^>O_8@ePEgW=^HJ zAL~VcL92x0Tec1CSXakv!2l8i8x-|C zs&qGSKDdL%O9>uccEH$Po1BFzY-;uhe}l@BePiNn6rjtjbZ6koxr$0;=5f+uej;*S zgf=5Lh@3d=tbK%->4g#|6XP<0sY42Ltv!98>;#%#j|(l9I$7#=fs*S84Hf6Tv+xqHY_4Cxh< zx3PF0x*OBWIC~x(9NU*+d=K-=zL^<$#*yFeTre)LWW6D^*IMXXaq00v=Js2q ziZ$ZvA9E|K_FKhqY!` zO7h)mfIhb!SFXfxeKB0rg2(@{N?;d1REeFl@q(>fAcypE!i)zz|N5VB2n{j=-d-Re zAR1sGAc>!7Y;Vi(19~(vG%{o`Gjw*ba<;c)a4>ZG0YLs(Yy2k$Qdw5Y(9KZD)X?rf zcMM6H{(HryG*;GbNB}N0KQM_^#R_3T6r%>q5p+tvR85GMGZ0lK%Oa!F3&*@*z8VMWNX?ekn{g zFH&9x9ZTOD-PV+sX?qlt5X%d9vBn@+cI`M@)Lxc-+^1ce@5l_CqhY4Qi(#&xF=r+z z(i8Px#+#~Us;o+FA(OrA?=(<&pQ7rhUC(y~&Eb77Dm2Prbpmh%AYy#G$!sG7Dssvz2T8J(?VwKh^9^`2m%PFl2wwV)kSpu;jY zegwmEQ*HEg+ooM?Lc*K0OiVq$L{Y}uL9+Ze<#Fa_X^T!)mXrsV^Y59=TOa4S%+0T_ zvvGMKk__m<`0!a${7|HUW28JnA`#|*NFZ{o&ll_74Za!1=8Q@E%AJK}-q}@JhOO+; zo=QN6>I$u^FiGX|C4y|3vNY@`UH)PRm%5=ml9m#OYqr7uD?5TZs-Y@EvnNaS8OqNr zq&{0mrm{J_9xeID8m3S4JAAC5=8CLsXG`i@O**e_La8fL{^1yQxd5wsEPoM+F>KO1H#bHgYs`0fnT$RBwyVdb#{9v(Qlai^gLJ>R?Qp~1uL zIBtsL(>X+WpUI=#iL6BMgrVuFibne`aNu$}Dy7u~dUSZ{)srdtDzqH>#P zW@SrF2}f&;u4Q9OjUc%y?s99o&8|Ya2hn1?TGeW@<_%mprjFq8xNCtz$7s)-0zGzG076GEI3a5y4-%`g4CyD5;kd8(Hmme3g7b zf3Yrvl=D&~<-@Vrn>|MMeK0&T`5ld!ASPgXUBXP>`w8b=;hd^g8#()K8QdxSg9`svJmkV0ZGVNnRiLx5hH*5 z2T=(yKM`*6XL~yY9*AQHsI%^J+_Yf*s)|VvH zFfZ_Rh;Z0~rVZ0MKP**_^baoxFk{}0WdGjz(l6ghN3db}EjiMKt2@B2pLPY|bWjb` zbcAjvbp`R9r-h(D9nj;QBqTNLkVFetrrWHf(UZl#MCcl(FY#ynth6-iCB`~r%4z%# zkd!?cAZhi3Q!yo>Z9a4qMidi7SF|J}cJvj2fg1ZO%C?dB#1+#`d%WlFGvyeJ=~j(Y zlEtG6Wu&4eXkpwUtm3Cr#3uk7TU+veLBS=}OazPq|NS59g#X3D`Mtm@rw<7PG=u>J zB=&#dEdReJR{h-_RTb@9FWamM&czg(XDX?Lu91>nwo-sfi4t6rP5~*WEZL1PH)RrR zi@J!ot|Eelp0X$?3WokvW&Zvx_{;;rKgDZ5+j2ro68;>~)6@B^_jd1={&u(Xd!3;l z*kULipLUE0+7WSz@nnqn+$Zf|n2`YCaqvKR2^5uzA?~0e1R2pJ#)~nGqVweE|Im^l z?ih=om*$X*!OBr+=n;QrNb>s*1ky9{mgj0z+9Pvb@32Yz-9c)|8bvStE-Yjj&MCaE zT1;CPMRdP{Tvb^4Xe+~t(Sw=b#Z?Sdn8@o=`6ER^MluUB8Jdr^ z2D62FCBKoWg}7XgQ3WkMKn^l)Z8%yg;nR<)pdke)&1_#O=pR_?iXAx2;NP%-< z_`pK?sTwXdH>=LAH0(pASo=(9%1;(CR;q5;<|2HcL&9$^!X-&y@1ASs(|c|^c|`A@mvlTo64vP z&r?a|xgy9e58JsITUp7`@3e`Z9jsrdn+nE`Y*t~Mu?~dCqc45Iq!f?VkSfVdKLBD0 zvCHdM$QzpnPjck3h{J_zqYU{5Li2L)8KkT-y}X{1aKoEf+5(>lORJuKX)Kg?eSz-H zrQIBceo^GKli-^lXpC&&o=C+u8VmPEE@#Ol-08Ofr0}+jDu&A?E{#2hAOUmLlyGIbp$T4myf>M!_p{PBo##jj9J__e&uZ99UkrI^x4@If;#M)22P4?WVjTW>`2234ZC zZZ=7GeKE~%0fq1TXGJmeK9q+fSOmv8G4gknA&<=b!{E^Q({CX9Qyme~D|_ga8d&=G z>Z+X=q{r4iB*)D3lW%~1$v3?*be+^j&|eb~MfuB7Of@vC@tR%j+u<3{< z#@nP@L{S$zfa7Gr*nG8<(i zg3H;F+5BL2iKTt>{G;3o9JS68Myr>*6hPbG$|if1bdQSS9lD!)MT;B&!i{64i?7K> zJ_zTErjz%L>a*r-w{@{usoEwr_W+ahaw-D?*o-l_X+x0TpQ^TR2N~c zPdwb?1zR?|sk*xHMzrV#OgQQDvjcHXpv>Pi4Jf8}%ga!tDa-$Y4%iwF>M6HTYwQiy z6~0+;2lEdw#YgL^pZaitv8|!ND@qz+TAx_+#|S0UG%zc~K?%)bHAKDMXhXau)RSvB zlWNE(ds!KVeG$g&k+N8L10XF=)I!hm>uV3lb&z2@y~>g1(5dMfV6@4O+mmFegnm1+ z^!hma3LkUkbRxlmi!A&wGPj}`wMM)d){0Wy?ly-t#IImDScZ)tY|(ZmoRXT+w|FYCn_W zb^<672Dj71o=AyLn~F!z;}4o`ZKn(pve@B~ZU@z}C%Yxx>8`p>t;i2(hwT%cDOt`G zDCM#jVCQa-SGX8qV%l)fb6iu zsiLGuPasfFs?e^y^oWpb0ZB4m=}nx9kb;V^oQiY@gURE37UfEWV>ZHm zi^hCO(hnj&(SK^BMx2x@|C$&cfoVII?}Uy*t`Nifq928#A>IT<(*-Qv_*bb&vhHVE z-Orr!u1AoY)*p1OADd4C%Tl@NxLYlrKD)ylN7{+nJWwn_*Ya6+SYrBO zrg-FSaR$9j-JR;r1ZsT1#kkBC8XCXbZYeE5YK!S3nFKYt{2u~-9r zk=z&m@g^~#vt1Bx67R_JSWSu}m;WXBpVx8Ed!E--ibd*wRl;3e?ABF+q9wc=-f5!2OFwj^)O3g^XY&tL_VfNPlUBPi*MryV#w zCZsHfiBV@q_N)k9-v1oU_Pn%)>w3{D<@2{=>2rykLiF6Y)cMTz>D+o*b~D4aELV(T zkI$0#FBH*CmBaWNRVkXDRC*SDOHY!8oZjc%<1fvS;oIajW}LPQfS~_pa-hVr?}yv0TS<3tD=e zjsz^-H~EewRd-#kyxZyG!V;oZmZpx^oyXkq+nmS0a&Oo9`F;=%zy#h4AvE|g1}y;N zpW)iU{bW1Vqbf*y!>L&74!vloGQN`R!}4bQrP=#=oX;on^dgmexG>SO+D^(p41?xt=i@lEPX9v9(k>vKpE( zD-RjuTme0W-?vqOuAa_Io&VPZAJi>%%;#aECIFys8F2I#n`3dXLL;v{;3oEG~k^9Tq#K zIldZ_v{-AsxS5F?u(ZD=4VrC~VBBd)Pwf>J zWj>-dt|rH?io*EI$tsm4Jc8&mCSYZ|J z&eb*h_)kqlJZQ9o@I!;5Sy*&934AJHgcjA2OJ=TrsQa(>nD4T@0RS%p`$75u`TrNga^j0q=)_(BxV_phmN)=KNgG; zv)&LFv?CUc0vV}EO_BIe799K^X7+;Vjgba8(6Sg({**)^o?jBv4GSbB!F13BlN)1r zb!F&G4?EUTh6R_Hra6DV{`s=F|3X#9)L|W$h?@iUFR&6K;Q6VB;i<)8+Y0Tqys}r{ zRB=x}=wyps6h16dtQraMs6{C+<1XBRcGJo}#k z@eJHZk;!2q@&}XKsAm;S;C%#GQlzpj&fJ;o(VMhj#l9|MAPgUj3lxqef632zh)aN$ zLa^G0(#5u%Jr(BVH?oa9=G*xN5$FIc#ie6biNPG4`CSkc$sw&?iGq%maCbx6TOHxQ zN7Cuh=Jbo2;1lc~p)R>M=Su6ei6wYOe{}#Gs9e4?0Xsy!GX_!q@}J%CVu(V}mXE8! z+rt^5F2r^I9rm3rNOwk)`Jv`?cc&|(py*b(UZurO$);POrv2dEwLe7?<=YPX4&I7V!X|N@n!^l^}<~c0LK}q44(8w)enpggk zHK|rUV!M8$g56Pd-C=p%aSgqp)Ei;cA6h?rLf9YiJRL$tC5$rq4U&DvO}~Mv-%*I& zV~pK%)EyC(-9fEqhFJa{!cBGzZY7!GZY1XV}ELJEp@YAwuu;C>r{ zr6s14!OTdYM@qsb>Xq}b5$cN2JK7~_ntbQpxJ$ev|wPa)N)nO>hZb zkxT}uH+wH9k-h#=+i?cx0-(*13B6pXjdt(wit%u_=B(y(7yX(!9w3 zrdSDE7&;05A4v16w#umLXnuBj8cnoFwcsUE)e)pf8%s*sl2WULwv526mKDqL9ET`r z^xbp6#}xfye-#iIgvcI$)U^Q zZ-D0En5a7>6k<-QW*oe`BIUrP{vEAueYqT{w#SkY8zIs%eMw2C#2KO|ZKEjz`pG_z ztKU(^l<*r-v(tDY>2CeJJ;o@4>w|*L`ifav&T1{6c53{dY@fJWb%TIC!v`xL5O4(g znB#zP@Pc(`!w~(o1Q{JsGr5*c?X_A?Amt{ke#x%Y%DoWZF)66U8TDICkP=0bz<2wX zwtFP+(bE~`#C$`h=o2$KbP(YT>J0K_f+?t)LWHD(hI}CET;tu&EHbih9>F2wS#oQo zt=eWz;6aRo-?l`xO-Msk%2u)(+C(zu`dqb~zAA~)E+Q{8eK;286_)yN3uZTyd@uCC zV8{4F0G4_m5RgbBb0wzwK)YXvn^A7%E@bzLJWH(~9y;px)&`3m0v(frmh^IoVaBetJ$?^*M!vd0P=t)RSTRW)r6h>QH<&Vl>Z| zbk=7c)WiVG8=Sa5Xtqy^%Jta{i7cZGb(N44qq!+$mIsUrzaa2HPlzNOhcbY4;@5^upYQTwfD`shFpY5h<> z^O*T=hDXS`{RadC=yfRQgv9~*bXn4vT#;D!pzY6H)-S*UViMV%b4fq1ha|=xqUk55 z5PIZA**8=LkbDwZeJ}`&{D%?pOM6MTV8!ebrD#N*d}gRb9SEccMJ1oO`)(CJ0=BUY z?j&A6iJnH79xau9qInsmJrHPkij`AVa@X`)Xc6%BIEW2|IiIUsCdYiVxY%i($!08$ zs}Z0#ACd2a6?C_-KA;|L-wyfVV%x8?|L|5mY790&`dQ!aKS@fw|7d+%={q_K|8J_& z|1_XY%0JAn0{oY(`I?Kyp+Q^NxJ>R*GrrCrLY-D{^}ayK{)4lpUl9|@jhX=;7@q*V z{L;e2b7(mq3d0;FmL&25($WhYj>SwnY^ElhJHB3DfO^0)PK$c{BlyAPdIstPq1?8X z=r9M-(UO}<&z_2#D-6N*Fi4!x(8A)x%+eNaz3|Ojog>;(^wPvtf1Af}xTY31wNBh^ zsdAjBaIz;NGSd)2tuXcu5-PD~}AfrX9=FW0w`g+!>k$Kf-lO~C7a^41K>YO_$= zkmb0H%H&LFt|}cMi#lwfJu+Of1-^&s#F{Tx+s-CKoptOwhkopG(8lA%ZEkj|mwl`6D~BtVZoqG2=kcCo zH>HhtBUY!!fM9k=Ox%Kr>W-m0B&RkU5ev)7EXNA7+My`GD1qYc#|4joX5$afdMlJ6 z7xEKHA_AG0RcOUMhJ|>=2g1HAptsSL*s_{huaxNt+ zUO+Jv|6nm3cj2}vi7}@vbaYkF-9D#NpvJum&yLipA4b8$)YNH}_ zFRF0}dBclH$vD!p67Xy*wF595SYlrV>J&IQbcPx41Jo--?V7C(qJ&ICDYwi2IsmE|t>*N(gZ7e?y! zcWAG0Es0woBq4N90Kp@C-}SrbB~5vZLYrz04&jFiCQ)OS5KZ6uI?*XWV<2yyMNgs- z93gQ*;I??B%-~w2>f6IEXRtlefms2cbjY}Ed1^pT&f@Q}2#QP4SJ1@eV3(w-$n(OM zs0FAFyNKu-pE$9^=dbo7fq0H*v0!2BaOI3Zgrs~^l~Zu@V;s{ga!oEE3E0}&wb?0AzwPUkG+8{ZZl|~Tw^>=R zjWqQLrN_Fg=_i0zI*Ml5gUm&|*Ib&vmTEiHT zOZwQRB%S!%Cq{q!0)IaDj9#Hqt@s5PbmOr@BT|gbq0b^1kNe&d{YRX@H}!#P#9DEC zBNc+*ED+^^5)cv)6d2Z_@4Z8wl9jSh=Ay$cX8i#gee@>*v;;JNM=a0u#YgF1n29XQ zMB|yD2NTkMFh!GuvtpENnT92621EXRdD@W)^Uzt@+&Q8*w24y|84ZmgbW$$^sBMpl z*|I|Lx%>-YfGK?f;qhCm$xWS>M|=i^vmzNW{0y@XJjMVMzn1;XM-Xr{LuBApq-jK$G zM!Jr}YHDc8(1L%g{)T8VIywzo3U!XU_?>%7-$m;*y!T{6*srx<%M#}5lHtWhoKeV- zo3!&L0qrS8`cIMzR%E0QDkxt2b_lcI6`MQWi4T@!jpjm44y0x3pJCmPq%mJH8j{4L zLG9)?SyZ@`i0fv)t^M}TeC^GSI(!&d#YCA3Rfp1qOd~KI*K0B2_rezc&7p!e#H=TKGQU}C z2G|(XpTdUQqeEnPb4wB2g<^JaA*nHm7NCnovmGdt7w#IMmX&iN8ZM|Ud9kRpMomG* zuueY5kZG?y{nw^QOC3Y3*s=hT4Me6{$jX&aI&gzYCSE@1^WkAVHzyfjNTE03$wkyR4mKXu zx|(s%Pgq`wIHr7~v>5W%I{@@{Y1R&lMMZC7i^tvVom)VT{|)w$>PEXWXuUffOPxS` zy5Opv-&hdE&qwMs8L&NQwhHhwe)bLUx13o3KN`d%$}FL6ynIiTsK*tN9ZnR_Gkj~5 zXgd__le;ZHB=e(tz_zE^7YL2Ph+i&Q%(CYyDX+`3yISq%KID36El({`4B6nFtjEcm zJyge)O+O}tM*vHgyA!BoGKHe+E!S6Jui6GfS2)gt)sU(c5w*DQ!}?rUR$?+NcCj)} zLCwNxzx&@{$*_z8o%EM?v(TU$5OZ%4^Y?VbXQH}K;k8zwwAKhAqXYB$J7iq=389BQ z+rd;Yu~fK`R6HOT*!u^*JN#Gs&<6{8#l&i4k_vKfoy2akGx|EuvFyK+uHhAMqtB){ z)SZzikEN)aoCx!dhcFFA=vAs~ihR+rE@WT*3Y>Kzopd)mg$?V7?$xbcGaZj7r*N@f z_8p>N5Ct7eWkN=w0jmgMn_~CQFNBF3N1<7yzOIAQN@xY>ZYd%bKpi5e5k=dA#eVvf zhY3a&z)|Q$Mw!h6%losa(ZccU;Eq}7q-VsJcARA^mxbrSReY6a1q~$L%9ru4qtba0 z9ac>ITaZukOP8M*?>6gI&60ECGfJ$NXa9-9(g`9E6#;+!0{rRH6#h|{_P@u5qOqf` zmCJuk!BEz;Mf@4rgOaC!3|aJfSa&(ZwKB|s6`esv-3pdbz>s#s(C_ZLr2GvM{tn_R z3L8ER;OoUR=4OhZDU47x^jb}GOuNsz&*Es<>Gpkv+{Lv3O}66+0Jbr*M`}@Q%@Pdj zJLO0w@#uE43N~;YB-@1cGEa*V^2{P=Bd|WRW#pz{^PKJ;qggxBwt;OuiQyh$9oc*g zw6qBWfTRA_@GN;0)I6UHO@bB5-+KTN>ZY)sgM8}f-#XBapf=5rjnTxpk}Q&og7|KF zKyUU<>!veHI`kGBS7_JX<5(8vPVPUqox)Za>=y^UhjV8rW@5{ai9U~iwitu6QQjLZB-09(T z;M~L9tK_+R>QgDq;}y()y&#Q7h%0@B@>z`dkOFw>UYZ??OvVufT?K01Q8;2gqk{1c ztXkzQ{P)iTdVOQ|ayPd~Hi0(=$NciZJ-djG8HJoqF-a1E=pCam)U9S=$O|5Pg|{eo zaEjOq=q113;XdGBNA)xVG;zgMk<1cpeW*9)79bfZ0Mf_32+Y4> z`~I@y3G|B{#k)*g=IPv96*4uEa-%D$Yw62WjF=gVsN#?=vcG#6t5pbUF(U zfa0-P41!v8>?OjjpqjDYle>G_lnA_;lhke<{dBv2=e_pKdEfkLcWQEc0PFy+EzJi0 z4CW3_U|KK~=7A0%t}qMJ6W)dglUG-mD6<$M)|B&>35>wNP()g`hOH3mti+0n?njZ6 zGBfYB57LCOv0(S{M@|(ECJt%>DvVIQ7MrdCdP`K$qp@j|S(;3}G-}+LN`cVv+M-Ii zFl0BZacXtVjMbiP45$S2`ib`(aD1uwtv^LW_|3`_h)o6;9;}rGwN+|QrfQ@l4;%F{ zZb2mEWvWFI_zqLlHKZ!<4m^#hGFr)HKvnZ4 z$h7BXhO{U%-!B;MIDXm&FeI#8qx2{Bb3}p3cr-Mo}3iV;ay|zq3p z74!4gNsH*nf}5zG-OjH74IPn%J6FKlp$#@s4c3hU!z9gSJ+SgU8K|b1vKBhQyZbNb zrTOmnE2@xW#27nfo^8k14-l25Q>R>h5c(ws5y`TNyeYKOqAtU0w$PRac>@QD=SU>2 zUh8Vebeogx)87z_NH(qKY383`PR~LMoheyCAiIDiPwU@TfN)kEBoY*9F#8h+JRH~q z_CAB__&3PD!HU2=IRw$}2y3_p)YCe(a5>r`FVO**pnf|F#+4%w%^qt2WK?@4cIi6M zsJ;%xb59KjZ#epO7J)uOQ;>wB?&Mg$O!g)CdfO56h~v=EBSJDY4p7Z)#@rMug?ikD^XXv6k%eEGnNXrE-Jg$*Tj? zEX>4(1Sns9DjvbU!UsvE<;5iB=d1h+MuzvCuzZKOim82w&kQke{yq>tUyPgsDC}}O zMkz`^6GnS<#40oVqNv8Exa|hwXTsMrlBNJ+*U-tL(M1{uXDriLAudNJCLuCMrvpR8 zp207ruPlw>`$-1~-F&be_&v`Du+Eu+=(>?x>;n=tfk@b|n6n|C;|n7kihY+oY&pv` z7AGVnM1cYKe9@&g)p{q&fmU&@_=RPiFG=4%3zJq3Mb(!wQpNB$u<_B=Ex>G!PsBZ3KQ`B zTcdDX-FXmpWKu=#Pe|8cG9Ti6_j(hjokznh|l2o)~M zAlro5XWAN9BEF>dg6?k;i>;?!3IG@&eVA&8;tOniZVvs@m4BH(;1A4tKS0j6#xMl? z&C(7fH$uu*U4;iIQ{Dj#jD|f{gy;N=-NngyaSr}OM-A4DoMQnYY+q zn(Fj*wm}m_lYON9>%~6WMir(xLI1`>3sGBwM`t`sV2XI2z*s-oQ0>4)F>*BsQ}6(E zGMU>{vP#}?dItXPKuiY3b$r?o>Js~)PQyHxsQiOGR_Sz6c1Zigk7`3|N?$@szT#`_ zGVj8wC-uO@{-_@xkYIBD6WYinR8Bs^s`Zg|#nRmjeYYpJe{T*lx;KN*f0_fTf12bj zY;2iTjOdwp>Hh$0aeT z1{N&Wi&0rvEJ-k#ST=BZ-^`X7CQl0^J;x=BgWr>Zz3LY0X=mxJ)!(dKh^kFdn_49# z?wu&}(xfnj4mjx^I4Xi^;482XTC*4Hiw`(?{wS}_&YKVXMhI1oR_@KAZ>pm4D;CNH zu}J9H1@@rY=ijwrm?b;YuB`&Yi4?Yx#Df|RFXC8(R*5fZB{Hwtw}fm*)lTd6aIbM6 zzowa-@&G_?e{!gnkDp5*6;TM|rgH^Kotw|TQ1*&~$NsESnv*$l4l!;vdusQe0XaW* z<}$X4*YMQl&#I@MCzO~?lOa(j4?0%#qtT$t&gOpzEW9xrClNY+BkIye@?x zYV{t~n;fJ(iGS~`WCNi^wT(eh+q!F{4ko6RFxi6lU9(Y5Pnd=zL)FeS#&5z*R@a{T zdxggD+-?V1LsQ(C3BshjGIv^W$ya1uWzLUIxsj+)P)JLJPDd$Lz79J3k^`IR)*P!{ zh)VOV9ypgU3Z*uKyiZkwmqkpzxA3} zn^&uhRw`O2{FXL_JS~7A`>qVu-Z?aE z-jlyuQ^+z4whCV{xQ;a=U2;{;KFT~hlyEIxA{{GR`~!|L)Ge@`!WfmiE2B1`l2B1k z1dv{P6m3en5A?MyB@Kmv$b(9mD7w-FVyW45u7{7`^qB50-vaxgXffVC4Ogm?P=F;25 z8=qd3lv?*id8R)C)t}sR;pE$g>3^QZH-|M_j}e=qT5hAI_F1bBKn>#>2%r-R8Km_B zJH7x7j<(64xeaU;hgTAH-Aj$?0>{t`ymQU;r=1k60vc%{(p;#n$+GM|D_GK zN%&j5A+jzQw_B0Vk3_D}7cL#>X+u{#EMZ%0^*c-6jpAgQ) zyr`!{gL)v#u}KorQP8Rylt&N_fD(WitXHmHL|C8?8q5;eTRvd2NtB|2Qb1{i!U5Az zM-k4zu|t)FBXPts>0goehsL=T?ttcp$GNcRjI3~( z6=j2^aaY3pgaSpbVwFJNay@8nNrNZ{&Fpm3%8DUgV*ppyqmudAvr>P<4l0_0zQdu1 zr!JoG_cTVm)sGi_B*f&yk8w+qOnl$v(E`V%u_&k23N~w&6UGH+dqT3R$_6?MPr`(( zRqlv0wI{p0u6c{qgtkPDW_dNrH4=EuG)&sO?gVQGQ~^-&f+e)knEBsH7|b=^fx5%? zQRI(`8g5bi`k_%&?yLjN3ozD<09v+-&MDdjoG}=PNh&1!N$F%p312zRi!erz23Amw za)uF*^zj%xJmwKCDpNWofUv=|CGu7eQ((TZ>s`YJ21_d-^JU&rr43HYn!P$>nSlqIl_?UN# zPLGcV0tgCs)eELZC1Ty7pv5GX(HYUb`3amPU1y2@i>>VHis6YP?c88pM6y@B7{q7M zwu<=f!TPah2TdTy+2r`teUZi{A?+HlfO*?G4x3Ng%FfEFUojjv(bnj!TTPAY#;pNF zU2UGy8L&-*T%kePT74MIE58vLWs+WgQ(m5#4KOv@cP6i3ydo?&Op|(~MISks4JjrY zf$TbQN1UkpB^bAu>Y+hV=Y|3w=WxDL z2T2xIQL3*Iq&>FPFELNZuKz`IXgFi%FqLSCW~{WdL z<;6h*tHi&2n{<5;*qij-mQjn6)m)u3dbTc%+#y9%r)rV4(x{B~I(%O2QxD4ZEbLjS zJ+a;YayL%1)C*@e;`b>|)9pv{Cxy>;^UDZcc~EN@M^00{Zkb{UDYxm$J;?!$K$TFd+?>haqo?X({TA={UUk!yeaq^2|0GNn>>Pw&5I`JUq~iqzFcpw`#xwf% zfr>80@Su^5=PC|DYv)_T(P0{;cf8wkwe&|~N4lEYYbS$rnlS%1pl+)h9_`_CC8!?> zc%A~Q#gBLsU}YDvdab`?d7@QEr@1>5(_i}ta-Qm!JzIb2(ey}I0DKrx=^0<>EI?pP zLfqg!kUT0|c^)2omaz2-qJU(E@K((1>&8|(^Sp1}Zj?=!jR-BW*;a9i7 zi_28GOOwBP$j=9a}gbQCvh4ZFfB(7 z7wvGC0dbE^_dMn~O>-Q_ls8x6&U;~e7A>hgDj44obgnX$iBUNs9mA4&T4mx-py-t& zEegB8=xIy+(E4ulnHS(lia-2|js)6c=kfygN6PGZL)6_6(NKs`l}N*%mUzq(4u=HO zDKKIb?E7ql2Ln@(hxkaTX@(Pp)Ya#!W3B`O$nPbkXWvE2ZZKX5;~XYeV*k2Pd%=ep z1~TgHyOPocoOHUA?Wl2F55R4EB^G2BZRULRNQ{qZ{NK-7h-fhVuYLK{QPAW`cj>=^ z#pW0Z_5NcRM*2pr?I|SnNkzB76Z;xhe~IB;kO1Go{UHE%u>^NLNx#V#zL=CgxE5Z) z7GBAa-q8FA2pXfl*J%#q(m5gJ&TsIMi?@JDIL9`oJl{HP<<$y(iq&|FcG;Zrun>O# z1h{(KeG%p^tn!D;QwT&Y%Cu?-Mk>R3kibi92~y=zyu4;V%$39SXpVKjd}2fJi3+&E zSA}_9U5=|$;F<=w{v;@~3?YF?301RxLH$3c=D#uu83st{n|_!{(jQeW&p%-(MckYm z^yM9F4UHWgZ5{rP5I2?wvY#J5Xy*kj3e`Vlc6dloSkaOM9eh=89~03))ukX*tl{Pt zuHfnxEf@uBFZxZjmU zQ(;-zR`=#)PCasn!@dI_ik^L#z=A`fOJDvLftcsULBUff?5_V_53=>4%fX*IF#Obm z{~y=mUxC{{HE}UFGXCF^Fxd3VLkIgR;nUDNonz?jh2=rTt?HEv6MF!VG0a5>`fqy* zH;Nga0(g`{nwH6T(683}zJD9NzMtHI==s?Pj)2P{hz3d!=zGIP@9;$ns>|$1+N>#S zp_ybP#|OQLu7Q|d5N28G)P4J65M z7&n;WN$xBjk4{H0wV5?@el8y4`Q3ax3-(`ZbrvopCWSo<0p^w5=Gx}*=EVr8>6f;J zoI?J4g{+OR2z7q0V)Y>W!wUU3ysE0y|yly>)DOG<6PFRBxC5kc9M_d;%WdQ%{2*%inK;no!Fg3nMsafbZ|tdC2bud2)#T0(8?0 zw~PG+5Td!nQ?M+pIl1STa=y`W^}JNoF0~Z$-F+|i3vRdBAJr&hE(C;^nv%YDFa*kr z{xw!fuTRyCwPu&e4jFm(E-XLN7y}JOtKS$zv#vj6X8a}7ADwq5#MIbJKme?JG~~pH zd&at_aCgE@AFBN(KeEP30IqwSMK|Hr8Dl5bUZjuKDC0)v>l0P?bVKVc+FwUY&^cQPpwJp&E({VjBdE5fTwMPzR zW4kTx&7oVGPq_i1d!hX~pZ4_X)C2u0;&}-p)C5rW^eUfcW>%=wnGBo9@*IQhXe!=Z z$sH!xQ;=qe7{i7JE8LsjYDZ5S*3qX^jtD6| zLxbB|ca|pDtdmZrkLvVFV~YCxW7l%;grj{9m9O)c1$3!V3J*IMo^0GPGBpk_2Px@@ zn~9AF^w(FbbEWF1?q0X3m8j!oW}N;hT&BrzGo#4J91Yu%OiAz%nRVNnKl!X1&hkO? zO%d+CVYBsly2$ceX7b6Di6Nl^sHs(g*mf<=HtuqX7^O$Ofzu6+UsQH$;@th0mf>{G zPF9ABtfb6^ys@XsChabMy%}p`nbIu<)Gy!tj@ceMy-O@r(ZD zj2&D=sotctx$JiH$et-w0U>;Sr#dbkjDmX1CA^t&9o$(g?(Yqnxp21~*oROH=r7SZ23V4vVaHCKBV>*6ap!9-m30N+T5yeeAQc<$(V=*TY=ISBBH(HY_+WnMzlH88Y8ktX&%a>bF-ew z00%w=GxARu3OL>V90nA&@$Zm(Ya+4rA%3#KOAy=Qw~LmO;}$Z2h7HSNy5^>BPtcqW zkBBc^^x1*qfdwAY43Ko&0mH>rzNHh>Xu0g^$K&?tW3~Zl%~)e1UK74W)9+5OLK?@Y zj}w{Sq!@IbyzK_?wuS{r#g^Z80eC5a$X#+`@5o2(V1<{+Ugzkbbk||x!S#8D&`Wc+ zQ}=(yR=CGEaU%}cXO?20lS{#l zn(0)~lRtn2HKqL|MgU5ZfFN_rx{($_NXN67WPvy&7Yuqe!X7K}-bc=4K6xi2eU8DeBXBMr0Q_zfq*608&gZ#Y$i6iras^)zKk5Ek za(UPbMtwAP&hoJ(SG>C1QfHgX_XgIOIQvFs#Y62Zg_ql;DLF3(u_0-uIix$WTo<)m zm+M>^cuCS&vmaIOJR*7#o$D+Hkwx-XJqYOnlRU2@Fl(ijO>gT+qXqn;dZU%hUnLV9 z{Q>yQ!{&epAyacG`!Hwjm`lE2tVZBB)@cej6PC<0e6;j_NYV2w*E_Du)b`-jYBu7N z#~*Lvq}m?M_OSPD-TR3p%_F^*!2+a{)8MH&7(kgi#WG%l))ad5u5M>0LgQq#MyyFkA+0)8Tou8@^;qgeT~ck6z;H!)S(JD$dy}( z&AtV9O}~=@gJEa=Kh7?>8T>wmZ9-%A*0XGw+xdJl(YZIkwnGv)#?3E&e%Ve2x9-F zyOFSQGB!1K_^(I!|4`0bUe@(i8~jk#@{K5#3CQWH))9ZqCPEYkLO>KRo=L6x`|C3# zShL1U;l9AS*}db=61;CgMg(sAR;FLXIKHlAdgTFSE+gq3f36UD`{p0_DR*c8HSG$k^xzrdv{Pn7U%N&$E~azc`G$46}lF z&1mbC&K|bf;ckfqAuNv(5^S4^Y`lL8(Lxa()lC;tA!%vptcKT7h z{TOma1)W=yq#qHfSkHB>si(vniya~qCMpayLCIdUUkv>q*fTS~3OA4|gVC;`m%%Pc zXXTy}P|ltsj4t{MVsUV%A7Cb|seG9GS7#E?c%I1O#-;WkJxb z=Gb?)D_D*>GjP6@Rx@u~nNj)Wnzw}x;q8yok1dFERd=<-< z)ofH90!9z|wnkC{@dhFb)iO+Jz|)`GN^I7QZG&M7B(FvdO9M>cU@#+aHsTw+%jASY9> z_cwuM0VJIu!*twV!-hA?l=H=j4du>?EvN73F7;p+k}c{W&L(@}9(clwP3;a4j4shN zDP#GTkd5w`38!&sS^3O8pjJZSq{~% zyWr^Sov|~fZm$p63TK<_)8a(RANqOxn4f#~qC3n{NQdAGP^*NBf! z?5`X7X`aTl8&l6ezwFRm7v(=*kFJ9SzIWZZ$%Ai@fva-95|Hsx@A|O0-T}B{CknM2 zO%d5}!*aYRfbk78HxkS)YVnc5Lj-1gOvzvY?TLJ;7EhKpeLa5FH=8LrVvrUywUuWq z1Aopn+x;4UDk0K^rLTFPbjpEn#CCO2qJX4mQ}C8TU4o*f-}NgRiQ_VhC$~j zPfrL5cqgG5Vj{KiPTre8aUB_&+QzaBCeZSuX)1NB407o;Bjwc(+t5-mf|b>8YXOvY z9Hf^bkW2yzdJ%(}0R=A8r?}H7eO=SgX$m(GT^NTj%s2qSxL=rkb{4xdA{oMcxQ})~ zPevu?Qf$f5aH7}Tg^tJ+GZ7%-iXXnRl}<5D6;?6)6N12327f(*k|^5WFhA+RBS2|A{86ZR&1(&yr8zuwFc8F%;U;)bcVEZfJ2*~TYPGE!O+e+vhk}leTyRAsoO*t+#R_ATq)gCm6rPDC zObBZuS%({2aV!8s5rLX${$6vt8MvFAxPXoOGoaNWKX);D1tseu$nOG~yj*Mx$-J5L z0yzQ(l&6?gCnr~FT`U3N312CsuAu})Hj{joEiTT2;T6v*hVdc+1!W~7gxZYnwY}ON zZw2ZHt*;?{+*~KCi_af^dA5I1Q9fs?`VT{o}BmxFnX=H^I zdlh>XA8+`1BCS@L1d60UBz=%J_@UP-eY*I&Y4~kE@At-XtQJ|?>wRQ%Fla!O6TX;a z$gLOJ}$E`2K-?8N)%jP%n6?N0E^^JK|iG?Y3`vVY{aOeR?$U01&G7=RM91?mN4hl0&k zeJ8o(dx)P&=~a0Oz{isfuu5nUfhr-Ypn&xgM3CUagAb&fbI>j_3nTtGH|Wk=I?TGh z=gGvKH~(n8^aC%`V>dPS);=c+xSBEID`A_0F7(13h#m{uUu2QXo!4dFZ+A!P$}^(I zJpvPp&ECCy3lT6E&orIDGV4731XAfM7GT%Q7PjtMLtHpsAhL1}OPt!8Ux@iyaIFPUNwB8%^!YgDU_U?fn@pizH)xY=B&Je_-yy_&A*O(Ad&9)(i&&^ zj? zfARDL|F~n3qy*@$yu$b>owU4IgMAB}xW2@U2J%FypSZrtaek+L@9*}Uf3U@E$0CEE zgy-`zkW!CdXGy>_kyOUeN38ghR(Q~W2M*-bw&cpPQ_sHge05BJ|H0Lx{dT%}=k)Ex zJO7~j5-rPSd)oxmy#_{F))sKTfVqad;B2{{waIJGv13`f_70Op6oh#8$3gfN!S;}(|*mFa2bfRGa|#m3qx6u=Dbro@F1H;9I{0429$P2wX_nd`y@$ijXw#ALBTl`D&$?D zOBY7zyrJV$;_(x2^)20)gANq1O^wYWKuf{!v0`c@E=|#M^&gvCW<1LhOjKi$hntb< z%@mj&Du*ORSCW=G?QdPC3MQ;?L=jV*ZQ_iTsLY^35sEr?4)IhFNG(7KCdOHvRNE2_ zSUd#6T@Qtcz=^A4%+=&WECeVnOS&k5i|13EeIP@SXEhN}sS^n+qlBaa> z+!Y)w3tjWnG||~rHcLKBL{0@2x0vJ4;6x-OOd`a4(Z#3OSY+;J=(F?C)>Nkzs8g#y@_(LLYu7f9-;C3R|Nag9N2z?7ga%v!(-TndUIX57x!d!YjX* zYR;Fi zR(0{4grHfXpWlO8@wYWH3*k1ek6v}>WF(-9$%=75!$ZodD~HLRX_k3JI*6VPr7=yy z>v&>t(iRWdoIzA((Nd+BqTdTvSpqizZBxEO+cgK#Eq`)~|FvY_L9z_P~lI;6Nd_m-e}b|bk6 zE$*p+M1H9AB{9|Sq7GFfaQf`HDcQl=#M`mACAukoBu8~y1zjp7Hk7ET&{2~I$-m)k zgj@Rf#=n`7v*6<-!EP*tsPV^4u73%IFEu%03|lV)Qc`*s?~NUA8g@OSr}d0D#QjnE zqb9a@dnX1Fr=wJCj0GuTyv8>W<{@_mAY{tM7DAhjQ*9j{{JHmZCodJD>p^PoslJVD zO%2B~fwPFh;L>-WD*KM@e>G4b|Ce}+hu1cP_4YWPvT@LT^Cf3)T~6SEBVK1YGrX-K zMRln%S-sgqe`wq%gM6Pv3VRNc+6?D!%s~Sp}P!*}|HiAEg(^p-D3AV1B8p5{>vkfVn z5=^~tj=VieGW5))ULo2^A7Dp97}9#g4eT;9=DPpo3irU%OwDW4?|Y}%6Tnp8hHWe4 z7B_O5Bucq6YluYW8eks`pu&kS+olp9Qw$bUZU;bFuet!tj4lpW&zRzlJ>(1aP)t@=PSDqm-aSC4H^KqcUOEN5eF8&dpSwt}Hq3zE@+NWgP!p6@+ zG(Kq$vLaUn&;+@AGwsB&#-w0~#Gwab<992)K|?Nn4jeIErWCldHZRHfyO6QtI_LRW z+40MKZjgpoUM>@DTu(HdlG(fHf*B{NAu$X$*jF1VXXScF6n@6IneHMEQRcNopd2yoM*qBJh%>>W7|ign}U|HiIGxnvs)vd)frJw z5&Rbs3%kf9)?*B=7(6!TZ81dahj$%o>iAb{u@Xu!iPJ(>sSA$@BY}h}D zY-6QZ6C4UMBO&s_EPHao6gi}eI+g-{C(m-17fS~08i@O1x}SDDFyqIfq^u}%N{jJ3 zfvWNW`L|ooYkgBMGx3d8szOHDu@HcSQ_d?d}sPRgNd?5fw?W-XTqXCh9bzmk!~^6*LUydMdYwN()p*O7X0H`z{WAkJVc? z&4}MHO@3zj=%*(!!XXnP+7&-jP;N>t2t#Bsdr&2L6RQSr{V2CcqleyM2(Q^zp(nc4vNMpgbeK-iIA$Yfh6tLSL7ji<3l^##qlu(l9lm%UsP~uq!NPiL@szH!3d(ricbPZz^FQ%pUnIc4!cvQ@%?p*P6C$8Wr+z|tp; zq0Nmu6#G+Mq*NMRynxv%N#xSftM4zb1@1{Z_!AgSBbcIuOtDW0?h7Pcgj1p$c~1uv zEOlz#p19=%QnHW~++GuabVSe?W}%{oAwV}bLGO2KH=%1#0)wvd#?l2yR0i~b#ZOs_ zx?p?es_x1WRjhXQ{AarvpUdveKp>jQFc|pfUuj2z#0Ij0JPc27K*&m;5)7yyM-)f1 zSF=H<_#|xCN4`>L(gvR+k{!yXFD+ED{a=*5V{m3&_wC&s+h)hMZQHhOqhs5)ZCh7t z+fF)3$2_^~yjAc2JawKrb${6V`?YFaYwk7Y7{5WL-biITRfB=(Crt?AxxsIdA1W)H{ z?E&o+HQx-eu7f4^MAwMAb|bPZT$N>T<_-FkrNiZ$a>5jPLO#q@mZj>3QhY#yeG<6v zKRh)Ay8cDzh!vat;P&qsB%2534t%`R?g+0m=c5b0jd-{eMqL7Xb4Tx7@Ds@+@_WRb z&HdSJ%>Vo6JwZ0)DJnno8S*RD2Q0%a&SY08#1+tz-RzEleqia2)gdH7tJuc9Y|SChOq;4H&ft|*DI&_28U^B=Se1z#rYF(z|0)|X?# zC7EYa8V>O7T^t9l1VqmBp%h0i_dbfGX+-x7XM-C&e z`PPLZkRw55hLs!hI;YS}C-FtzQsKwk3x}&{uSM58G%0=_JE~~3+!T`&e4|8PG8!rR zCeToGmV#?gj!)T&$6?=qTB0%KFcqiZR8lSj z;N!Q>Y2gD|w7B{6r?&AG_n;A5Yjs1*UQ$fqAK3d}R_ohFp5BHb8?%_HqXL#}iCL(~ z^DjzA66>21Pof z{R`ENGqOm}ilXH5JlBEF>2$DAJ=($!!E#ThBst7UO?ra%(sBaQuiHUo;J~?u4tV+V zwp4tA-`a`^s$vjk#{Qoj^CwY_r%ouT;=&J}S=r7@%5F7YT7(w4+ek#wSjbUh+qY-M z2RlAc0o+Y`^U3ZRUcwngA#7~z=ny` z64@oE2kj@>vcBX>Ee%@i0qKb)9$7ig2(trI1)t>U?=s3bv*w&;svbu^K*frAcNT7K z%}Pa~F)yK}HJn5{oW#+2L_gK^D}|{ho=Gxc=GpQ+iYEKMd5G!ta3M9`kn;f2(PG8Q z&77-D+DpMpCUM<{SH~PX)UPw#74whK_|%=MYi01AYN-YCVf9pl$;1Zhw5o9x(|oQY z>pae$V(EcmDvis}8iv9%uQoz&{1q8<2=r`?wpHa_MJ9Z=gy6Di z&P%I;w--LXpk30{M@C6^OMEoLt??38S~f&hN%^MCCa31)5u!Poxp>>9kv*!lXu&O& zJ!Mt~-L74I%yAA?BfoOT-Td7sR=X2?u&hzE+ZQ>v=~C|wv|8NiQtr-GE7R#x{GhE> z%su|QsP^oQQig6$xne0>voPPTJ8|U48in0dzgZ@;E3+=VU6nnl)uhoSn+cd&N3xwu zagzV*Bo6%@LJPVpgELoi!g>W~yW)D|c}3eJ&eezAWad%$NT^rPJ)&lAcUQc=;hp{n zsb?#7Qfa-`HI@R%v>|ejw87a`>{H6KqcHf4?i>QNS^EZ+Mn284qmX@-d~*(6K1#uy zX>40^`v*41p%;b4Koz%?BQ%ZCi_6=UA*Lvc{-PX(R_#|xbt9pb^lNTvLbOmO`*yTI zrBIqg*KC2}IKt01w;s%Lb56P@DbdO6lWnv-9z7JX+zNdj4NMMmkVKEK%z(L+O zRkNT_sn9kZ$Lx5@+mRpHlb_c^Cj+z1MygZnWIIsEoWI%E{cc)TTI9ue(Dh19PUpsW!t#MJ3{sThw=ot1&teK z0T=dh1I~c^N*hApY1`@Y@HZL^AuY@{n?M+q3OFQR9W&!{Ko=VD5sr^Hd!#x4lHL6tmPnn8sdp7IOMPKYtEL4g7_J! z9U`s!~cQY8X5`_p|rXf0g?X3!f){?Sf1> zfiXZ7#371futZ2$hnSjMcZ^BLf*EepC91S2o1`kMYUnElV^k_?Cad`RtE?4MMp8F8 z#_Ld?xW+Ql1J6koLtVT5Y2W$KJ?U&cN$vgp4#|(+17QF!OMwAHE54@*E7oNq)J#7v6n z93D&%Lh((4*4OmM9H7looB^4e8P&y3JCpo)AXft%n3z52#8b?>bS)YJ^O`-JEkB7I@!Rvy*-AbE!t+*m6gUiI!a(&!*f8tuYZ_@M$ z(3L305cC4H#PW$-DdVz1<>X^NK5Vow>O%>(p!lr>2MLY^w<`hZ zB^k(Wv8pWd6fuJI(;^L2=W4TS6bomv9$u~T3=@Gw<)$Qrdeyi2f?R&ra`Yf9sP7pR zR?S|eUkmHFK5y6NXADIf>0w@gThL+WLroko)HZU1UjG{w?~kKUEZzYC7H@y4;j{Fh zi#M&omuV3MD^xP~BYrME>|0%~nh}o&5>l*n`(j0qX@jnQk=+%~7M{(*m-- zVwI;1Mi>4J|-XKt!<)hdV=fYf%j3VBPtQk%nm&7P9q`09B6ehSHV z&I`z4WJ2Oh+cwRAxqV)jHnP*unduEXfgz&~&RQM@E)kQW(-@n0KHZ+^ITGpSWxX=q zVhM*|uZc%os?r!vh{@J)vhH(qc9W5M;PUu0T&eM9%21m{(W5q1Y>W~HwK1~PABw*L zJeOb%K0%t_Cfm=?ta%K*p!!(3fI$-r-o0M^x99c*q4Pz_0A8Hti)i2T)-7t11D`fV zp~f)j8EtD*)hoC@0;;^NUpK7!Uc$(FF#HY0D4U1+5yPr6K!zFv;vp*}RoG^~>*sK? zIDNsUpwy2O!tsRFZ32VxZYNARYKAMQT4koyX$LA4=7OIx+ANLN8|o!!+=0045!vhl zcnRhr5nQRGqs*8NV*r+vd(O4z1aI%*1Ye;@De70K$PXsCJ-n9}Sh+nnoRM7j>B0j- zWlcyYHc`dv{ERo9`#N&lINdh2NQd?jG8XAyyDesztev$3gJJ3WzVUd6-BZiw>o$wQ63aT2%;#_js%de z9|V64wAM#<&%FY>?%ZhFED7TRe$HHu{r(R)25_5aC(^fJEAiW~#r?15_{LW3|MkBLqm_XAC@uV&aTB$US`SWUIB9FOtf-otRpi`Nyj@J(2tM?u_2Y z>Rr93o3)&0l!s*?tcm`7*lS|liQkn6&XT{h?mC{?i9F#uA=mEFA4RDj&* z(fPckekTIMpclxk6O-)<4)iEm#s`WLM5lki50kB9fe2WXu?T)hyc|~DfM>aM0l^_u z-2gtF0(8A7lwn>J%M7+;A?*At&4+k(VT+35v#-uq_G$S3Igidl*hqBsF_@M(O51a$ zkACd4L@*&BBMm}Yo5DC|wwH~_82J{|Q6s5(e4Mh3iu8m|(9PLuq^b>(;`&6HHnIV_ z%ADC`RcQd0V}QqlTha>iEb6cUNJ6Z_HKVsCtV}n+qm}SwQ&)nhl`%o~yv1S|m3nH= zjZ;~&EFG@_m3j>EbR6NMpl_rsyO|alzbVnwTmCiWL1~w&es_Qxx=Q~=y4b9^pae0} z`GQEa=gE3ahrvjheTTWyX^-U>Nbp!52gb^ka{}qrqr6uBQp{Jqix5Fbo%?JZ{QSAX z794zV6_coTPbaPJiT6B;PI?+a&?dU{S3kAp&`MQO7klSW;!24%)v9KN*P}m4w)8SJ zv6L1ji*W@9E{bmLrlgYoM%GAUh+LR6#KpS*TwOfE)i}W`6l`m#(e%)KfGQ^@D_n*n z?-6W^s)GT1#%$HT3cT*%1?BelS#(diO0PCJI^b>(YUgpont{4FL$AQ?4*uuv48;I? z*(l+%p?TC7ow9IJ2uFP z5vz5-JVKP*^JNL=xjT2VEOAwljj$(sOp#}cIVJDIE*P(p!$RQ9++{yHVYS{q6=>(z z#{8W=G8P$K;=+;jcKbRN5ys@1+gF#-=&37Kdo78Q?!ukRgRxzezLbPe5Y1FM!l-m( z$w-OEOe4qJYW-OQQ(y@t37K0ip3xICD=PMxibIT-8EtzJ2`Cqq6Y&%L*;t+ftIbWL zks~hpR#VS>ljMTE_at4zS*OQIR})mq{W8)bPBJ4^g}#xIK|yIKnVQE$7ml%;*G1Qm zlj=u`2ZeO?=kh$-&&*JpEX<7pW~Tews>W@#0w|yH=C$mY`cf(zszg1|r3CKqB~&T_ z{N9q4JM2yv>^j8vEM%o%{7>2eZES8fPDc(Gkd`{NPe8q>K9CQZgbx)$(a6 zeX8Oz?UsmMN{ioiIs6)0!L9pZNq-YBNJ&9X6=#o;{4$$sReA-YR~~>VH#T*ju2R-1 z!B=p)*86$jbPsl+alG>b=^Sr{;dC!{rEt8<16Men8NqAaZjRutU2ed_cLX11)E(~N zu3tpjv!@1FO5oJTtgH5aXDylcVU;-JBDd$Pt@eG%V>{s2!;w1UD|v=#oS9C?#CrvJ zoRb&5@@$m|& z6EDw|j~(UbUuK1-hK;i z1e*sWWjhLf z(tVu*S(Ve5QT}O@CzBU@QaEd$@TDxrpeJ{OcrQg4%9PUZWWkR>aMu14;1S6PX>v`J z$7`u9ehNaaZ=V7BJ9Sy(plBVlY$Dev%ZC$hT4&9s&#$B?n z|HuzAbgf8M_~wwvet+c)|EpS~Bq#gdc+ScOcJuNmJa#COm_UQ&M(0^E6xI!v`=tV5 z6DcHEBhu#L@6Y7$s?=AC5o6CXzV-|b;ZpBEzq7u4iZhLc_6?;M-nO~ApEjNTblx1C zwEp>_yDtKSbw|03oF>HUU+P{`kXMk#591L%84@9bI)k~N!gSMa1QoLK-I=`DY|-o* zet^S&?)JYp1#DtN$k{>3i07{w%e!u|B9>aE z5S>3`i?@6%2;9&>eL_$2nF5_#C&6 zW!0X90ca()*kk}hBtGj02wL=7A?3cbG=W|N-H!>c{AY9F!POfU&`v#6iE^?3F>+>D#>1CX?zureyc zO@k8R%$xaU5k6A7w|9&EYYFcXn}QJrCa!ywk`mSeX6m^rnfLIZDql8biD_a91WwJM zFh{+lcw*8Gj7hf6EQ=$%3)Al0j={IdFg_E@ZaP}J$w!<=hRCsJfNKBuvnh$I`_R1E zoD3;e8M16uQ7h*In9C$qr_s1*(7X`PhOv6!1_Aa#8|s8qm==rZ`3xSw<{Oi6OY&6K z9jc`4i}zTPAaNa*ND*XwRPBfYLE+|B|JE-lw5K}Zc*oR1#$n6*O#pDh2mP)#L9duP z>`|)VOT6^?0_trf@;;G41-r{(!CmvOZ^nBJMz~tjhUuZupLE^KthFD*Fia`jM9I; zNwG?jyCz%ae0MeZ>Q}tozCTpBht&OBgkMx=)#ck+5+}W7GS|ipLjyKHZSkk&j1Gccz?;! z;@1#~c{p+7Z%ev&*4$N2+5Wko5_-J+!=y>R4s;i2c8F4xeBMke+b`ki1Vm6&g?iXoCwTB39pbvlzi-| zOTPjptJkX{u`qy{(o(A?;@o_Au^6g8!+`>qAA)u)ZUs04IF6cIR-oM(qsV_*tj?Gj zwR|1$TW69}KYfq2%e=T9VlQv9A?9s*N;>E5Kdiewxo|{lRv!+xmyh*AOB?+Bkzi0& zfLRtXS!wra4H^RIK5r?pX7iYmO1+HhKCwK|k_|2t8_mdz#mt(ime${ove^vgj8smS z=9|tsNjCCItKwvxh}*?eBz}v2d4Hf>1|@-N6KIHMi%`cikNhMrJ!?{~l24M}CX$Lb z%hap8v7q!|kg16UZZIy_8E%HT;k1>ii$y{$QIR!LsxEuLR{;aLaR(ey zzmB$ZWJ*_O-6)zs0%jBH)pLU}sX4L5+HS+*k(h~l4X)L5k(R%%jflJ57%2A8yhJ8R zs56mb1Udne{Lb~-16#CL+K}0^xhauJxXswucMbGPIeZ%suCsW7 zfe$sch32H0_Z5qpY@+pE*+zw@HfU9YqbScn)B}OFeIkFf<^?f#Dz&O%X%(hY=cH6f ztLC?s3KDCA!Myf(_mE-V(oZBHao9>m3Q0GgZ4ej_$V%j9UeZR50qG=YX`+-t?Yo)k zwR&f8@hC7#9Nl#9A%crNW!O;|E)k+uoU%V=7o+SVnk(0Rb<7Ej#~=kik&yjJ-^OC5 z!IxBk=bktd-PJ4cEALoxai9H5KJu;imy!*WWvRJ->_UT;LGy4}<>?|N!WcCi?t4q4 zr;lI&{$rpG@BxOui8Jtg-eR}`t>DDNd`4mcj;*gSn(9OLE;icY$HiuxRtkCh8r!E& zlEon#c$walsa)NBN-Y4CcGLhVXU9}_czWIt4Iq@lrc7u>uP&8=;$A^jOdR{0KcPDj z;#;u0+za00Dx&QFft?ZcW;s6H;1Xp;b@Kwa1TE<0Gy;2UYv#VVb@UR1L|iym(F(-_ z!8^hG2wF+Hygchl(aVMB!OAwZS^qh{someL$ifgd9{h_~UQn{0$9F{WssQ8=HK9Xb zsa+H4xd21~8x5A|EQ@%8kel~p>|d|f2c`CeK$W#4)Fr;0(6k<|q7X383BB`EE6mfB+wtr3nb?&ic3 z&y=8196~Cj6pK(jY2&A;Qz+I!m(r&NzBS=-#?lIEVG)QQh-)K@)F35@|vH1jvbyEvplnpTK(BJ)`IU*osmMo_DQQ?!?;Pr-_Rpi%g^ zw|Caea^F8@a)1AH$AwpR-tCBRyRrR2#!zC2gDjIa`w4OP8^pnGN9?&P2sL{4U0Jb>L zpbPM#eGk^>A7FOvKQIPTPSBOWwcLesa3dVY*~~YBThz0o!pOygXps20U3YCftsdiP zyrqjhKO?=`wXvkEP2kG;m)owAGB>bu65byd1rTb9Ot~xVM*C-i;BhJakI&1+;N9@1 zi$T{17vcwnZiSZwOaj^o&DP|fM+kDTM3JGSUJ!WY}}yCYkV$=Llai2NUhV&_`fC%&w4-^E5N zCE%ze@y2x^@_%l5ODYDs2U-gonBZ0LDKTXiR4Bb3kz60^ZOq=x-GZ+&y!!+i{W_quVQ z!Z#F;i0DHlIfMs$nqBq#1f0To6!sF+cjgReGBx&;zv{ZH;Uxt(q*zo>?$Hg3%lk zVoN_IfbKptNP>~Bdz4uA4Me3=sBD~vdF5C$Y6E~wdE05X-z+)H^{~nGJ zuQbq1b|sd@r91W5m7^oWds{r?41rS7Glw3PgnO_%s$+T#r=A?_C+8t*4TN++B%$P^+51Q{;z z3-%YMbPq9bV!DCpz=WcUjZb~G?TTvu7SfhvQu9_AD~7tTR-}%Nj*HdVLUl`T?59QiUW$trg2O?-I@os-^v;=$ z3nmLb{u4O^pXCn4hten;alH`m8lU$$hZR`vX@F8(p(epr^R3?0imRIlnS_MC^t@b8GnRts|gmEdq?!CNPD((Y3LCyje; z_}mxL;>G@7@LP{Te>Rq)gI<<*M7!{rFZP>W%I#(OaK6a$Kb$u?VA!AgeQ$z0;Bek$ z`$Vvn4&uXlEQ=A3MzAggAHu_!u&~ld%7n01pylS~Xy3Y0G#o=ff=sdUHuM^9(VglT z0jF#-^W(4L@*?O^e8&N?GfI;(=8)YR@InT=Su+G~mL7StcDCJ}%dJZqyT77FS_S#~ z9;?{lSn+qNfxW(XTT|JZcJ3O2zkl}k%;Mhz(2y0OB9{@Zlk-(oIZ8(GnU|eiY*`6q zwx@m`8?OX;Z})N1$sP3!Hw|;XD+I9Cjo2Q$pv9O^GZs#5poUdjR%t2GaX?$PxVL&u z0B`Gic?_9DWAvzdEY#G+kJfH<1+PIzOq6zL2Ij}&0HXmW=#MEG)~!pXs)<( z6@!Op@UZA#qC}!cwY8}?i$dH*CCS>Uv#V2HM7#ih({O5E1^d(LnMCbl%cL~*EXMDe z9L7!tOts9IxIBV`&9r{An$@p57WVR-M!Sfpi&+~anqidB+y-T4tOn8f`a;7vywxEl z4`1Ab1K5k)u&ZSlMN8ltg+JsO93r%$b&g?9TRxAYvfv6+lJAzXdnqv z21ZB#4o1}b@GXDigo*+%Ps)4z+@5S*g#xrq`mm!L(sIH`gG36&@D|Dlb`vRmgyp?) zK`M-)jqzYwbXcl7V-V z&>(}syeO&?2-t~>F_+l;Qb*4@sj;!_dy)QW^!sTyU`w>=GEP& zpOHb(>sc@hGWwK{1DuOinl1jyS+X5ct<$sWX3!H;GOt8TLgzk7Hp-{d-+ITW62#|03FZq2+APlI2LMEW~~~XO0=UVD{JM9C*eS z&=DTR2hBQXjweNA3@yot$#jT(-mG3Q&JaxFtdbZ=X-kDX2(4%@n7}tjy>)kRR--@O zN;eZG%omr)sb`uzKGe}lIC&WE=7pq*0a=WmWXV~brwx}Ypr_(g(i-WX zY|Vtf%gU=^@L^mrk6EgA)|6rCT!HG_u6JnzyL6^J6Dp^s$SdTfkuD3nSf-dLYb8Ql zRcI<3Y7z8;ZoJ+EMuY`reR4-St|qLhC|3&y79G|_8db)gOLw{`c(KO!$=_#gM&=lo zTt~(>E1Hwpw|GX0xHuTsYoi9FVp1fHlV5>Alzh`p(E7nR#PfhrTgNI30l3;3%7pH32V**S!c?g_Yi9N46DM(RgHcf6|V8tqrfum=lPOFBl}AI;IAxp1bl<-QlH|} zQ$IdP@bjuS(|$8@J`5;KVynr!?y@@bMbLMTpR@DnSWFHpn1_|~1NvG9&F&@^U5@W? zG#oSQLQuXm8T4*XqiPoOi*uW}=*ALfpwzUkJTY!M1b-#+yhMt+D-(f}63q<_=0co$ z`{#>#{E2dP+^;*#hRh1sa99JX=g%80+Y1`imyi08$!_DL=`X{ArO||h_tpZa?M(}m;Q2K_qDR5q-!AVgWTGj&?L6}z0M|83?g??V_X?W+j%Oa%gUH%1= zLEGb|n;1$@9(?5_!9mKy+2f8)pL~^Hv_t!$F)tN835}uV8f*yE1CZKY&%11`!EnF) zEB=_L13dV?joIxpn88+VkI@KjH0CnR88T)-BQ5|V4MJh&w6|{Akmxxxn017aMvQKf1=JIrwYUUgXv=~!d&@Xs1Ld}EQnKN zHJ5~JV9>%)JG0j(2?3p<*du;mZv0MXsFJwQ^Do5ky_r|FsiVAxiI`E;U;g*MsBpo^ ze(&5S-i(CBL7ndNT?2D_cl1yr&zvwjsw4apYmyi)zWgGP<=@3ck-^Jp5_7>F)0we3v>cDB6PUzI#_t za1&cU?3U-usuc5!Z_2ALEgJdz6m~T|SYEq{={EuExtv&vh zPP&D;NaYBx^HNiL09oWHt6B0nPmiYKb&9N;dM;i%r+)mJkJMpJ)qKTZ^aM3Yy~hw} zOl0&r0B2M=&mMkDk9MBy2bnzbnK6UrnbZj@?lP-C085bq9JL|pnQD>N$@L7pHA&%b z4JA=_Gw#M#wDDE!f0i}86OiwLV!vhXoE*oOP9OPlV!MoFJ0HIOl;#SlN--L> z6iIt9G7S!n`t;n5cX2Hm1BcKTFInbRFBuXbZ8Ut zb7X#OFc)BBt*?HuzVI!AK3ZD{LYqhnh>z-@I$;S>k;B(@;iFZVE^oWsjA(>z%bYk< zHm7l*1;ANr^F$Q{t^!ipib-0@-q!XUxkqFjOjFyke8{&#=i4g527YzFCBB1vS)_b5 z=`JggnkIWSJ-1~7Xq}34ghkI1)7tSVp>?kJIi}}*CmZ%4licU2VJ*51!`Fg9qQ;0> z#||IA;j2tyyP@Zf_eQo*82Z|l_{a5NsY3EGrdD@2W;IMqCqI~NN1TnM3-Tu=|BSFp z+3kzZ095d{&dM$C&8QBvK?6eGG(Os&>7{Z+@#hRpMxVtYU(M~;YXrY;fvsaVZKAcDS!g{>{myfZq88~W z8bC-)@*|GeB@r@KT4N>n&fi66QcZSTicm!t=^#%%#d~nR1$)OB_t?cD6=b1PhQ68R zhyzG^5J~!o$H4zA>L;fYyZ%xA3*oR6xPNn%FmbAmd~tvx$NAOA4Z@^0^6UkM{5T@- zNU~+I0erXh?UHR5g*Yw8<6bg5Ocr76LUP5U5doQ}c7sq{Bm^FfSH0B5V1m!61IKIK zV&bvng-|eHEimGesw&?*b?}gmC)|0>bKY~h3pW+#4{yjg+O*OYM9PCf`^L!XY+%4p zb!}bC^aWo?a$x64c2Oodb6qzuT9~TFAeuOb2rJj5HSM(+iviy{m|K(o-pqPZlZVSD zFlyii{w&Msm_tB{`d(8Lmseu;pN38;als7xA`S+t(e@gw&CT8HKFdWAmWs~BBjyM5 zVcJqDCI?zP%B@jJ-L{i&(OD6mF~p@~+N#Rtgu;fb?=Zj}CBM|7e6uD`Af+2(bWAx0$&a}DGh(Be*tRA^u#=9k$nWtGEB{nTBYIs%TebeBh5cj%*@y?Hu8|zv?cm zWnX3!;%{Q$--LY8#Sq)YJnpfN`*cnCf0WpG^T2Ni)N1hO9Nv?21_1ZW6Fjj@_ly+x zU~8v5k}4yKLg}&@jET-Bh$iGq%%T=0)FwR9DmD2y!vLE&HFR+&wvoDO%9B34qWWT5 zIAj4_Gvc052cd(lZol99DE9N%m&ID3#gjwM;UpQOC+q=12M|ap!D)mP{v;F$Na}`0 z)N6$G#K{U3KfXpsO~eWr(|J6&Hs)&BNqX4#Mas&bI@l|4^l`VWlZ8<`LcLgzb1A2F zeGn`Fbs0oeC9Uk8s*jfKts!164QhaH&ubkIzO3Oj*o2k7F41EaiEYg>t%)v|NvilR z(=jX4ZS=GiLNA(4tsO0D=$-mu?dRnVsn>dep~mjiH*71+f|~VEig1J8@WC8>Fg2~8 zGe|2p%{!gPIE=+&buS=xZ}fmC1vq{taW(^PJ1;_^H)7)(lT;y(G~pNR1?j*{DEd&k z-eKh^73Bc19uT%Un5MZSZ;ENbsN;RjjL?g*z-}B@w^_qY5h?pLN{6JBJq(&u0R}16 zcZ-G^RePAkXTeu84U*glwS`h+SQ#8Jsw0u2A^6Ed??8@Yf1gZ`r-Qr)OY-JzeTwu~ zp)opo&Ey*(sd_X=`*x-q?}=0ruAncU%c^BDeQs)ei@?}63F_8DGyMSGZ<1ih%adpkeWOCUwV!5X*&?;3-c)>U+ zP{L4ecu#qu$XRQ~pjtCjp-dl*C@fpTytZthAdNZ>>8@5o|A||%A<)JEaHPW z@AsN8TV1nh(@ES=&0c9=+xMNl)d5^O%%JD2p)6`8eTc&`;6v;*zZn9MTpJmah?*TH zEF$1xn0g>AH{rq!o9T(2d$$pz^SJTi=aFj~#Gsi+k)8Plq^MLPvi8dC^Y0?eZ)f3j zRi2)<%SJ(t^TWtAS%W7B4|2$JD_f8-`We%Hk4aV(c1swC4D&fK8f!WlRX97-{w*{U zRRTMCbXMLve%8U*IYsL)tx(|B2A@hv%*H|;|C)F zmYBp4C&(TW0>-Atr2N|FWa>)8G9B1I8GQ2HIPTHQ(Y8||1-+TKXs>{2Bzh>E$w!}W zbZ6a?!h)Y`MJd&T3?rbc6j9YhixP!(KGB!wliKFGW5IF~8R_vul`0KGU6ISrE*nl= z6wH3*2$+~3zzfuwsf$(6uwdbB3(Sxg1VGQ;s!Qqi@~OxL9v$B zV6$i`sUk@zJYZcL(O*V_oOci#>z4ZDF{yqB`aee)@^wzq?B4XH9*9IwHaykWyZdd>w&)p8PL3I)H=(J*0l3VD4zlCHW|0vkBHb z_&w;oNU2gurfjM8cto%TIK&lPM-;X+6JxcZ1wgBCGmR%8?lsSBUTrgvtJ&%B4h2S^=G$C#tv_3;!d+q#_@E=$n z3CgGG2@Z;{nZBu`t-`;xi^2m)VW`|8OIKf;0#a|GBGov~t)O%P*woW?v+6}A#wblh zc)u73g;L{D%h;+Csx>fm^z{gpM#Y#H#H}o75|$(%)ywrorY(jObfcn9za!ygXN~K! zyXHtvW-W9-%X>!cn!D2q zd*rT2%hr}iu8Rzg$4kOMG_^-`nZ}A5iqh7YMRl3pjcf&h5JFF?@sFpi4+Zr_kQLJ+ zjAC_gFqR!Xq_@kI(xkt#i|srwp5n0fL$3v}YLdG77sWR+cWM{aZ)KlnT=;x_tp-u`tpw1w=bG-_P}Uj<3T3^EFF_NV_T=xi?Ob+zmAoVy zB#C@3uj+IxeL{VBN>s_C$(9_$-6A1pxv)YaJ z+WfAvYw{^-L)|qxLasJwRhxBQXyNz3SwfDYNYd1rt2hxJ2Bc{DHc2vuaP}ljT z%Natz+sQC@pJJO-RT=#ebnzRj@27E%`D)geP=h_dyjscx^2=kC^g z6DB<}^_B+| zGbLnN)3glT2^(jL{)$Dvg(;2vc^D)S$BeKC-Cog0ECuPu-ez}i1Y9e&a6vYLs%mw{Y#pmj@J>em&XXh)4>WT#R<-n{RyK0H*suqcwv)&(C%zyJ9 zUftxynZl2X(uN`=Su#7Y>CqEp>_f&gqp^~%4UaCJaqcmv$;eg8;3`KoJs~8NyA*(N zj9i8OLcwZa%>gY{>Y=_%Y)<3pBxfh_Svn5@6<#8)`$Nb(j~~(T0HPm z4-hKAWSEQ4t%vg=4Dzjq1}2Os+@}W{{uRTuIVzYBA(J%WYA6mvX5JJi>Q+)OcIbhf zb0Q}lU*Q-g#zj$KFG{D+c9kUNWzH8VFSgx@5S-g^D#T`h^vJQaDu)JcUnjXWP3ht@ zU#-!_bGBDqi`9r1S|YL2f19?`oA+_gQ}qUk+lp(sqD@VT=``u}`9CJh{~*c{Clt=k zzmMbDZzT7>I+p*d2r5oMc90%L7*NbC&mW*tJ8N6FiZoPF0YZsF(bFgQij1^b261vhoJ*N0kN24ryOOukAQROV;^~33Sg@WHiydN&^8+KO>H3*A>EgZgUe+*?!77Y~%e>4s4CsggfbAJHE4G?}LDgR1` zOsWQQjALP9gz#&+I3YeRzIY=uDJD(*L1SdBZ|L_!6wLJ3*iawPf4B%nr&g)yzKb^g zchMI7H$O_r!TP_YY+n3tof7jHY35a+;<_zj6*ut_s=O3Kb+Q<_4J=K9It8yC>xT2j zmF=2!oia^C+3%nD=WHXG=>}Pda}u~0VXp#a?@U>HJNDdeY)MU!5C>6-=}v!mp1NlK zP4w8i4cIS8lFbvBD=NlrVFRd7S{$SxCTjdUK>W>(r_5V+4zC$1eg8Jrmvw`W}&drT9{TCFd)ar8?hPotX7X0t{#nIER^NxsMT z7u{3nGH%UHKCf!TF68FyrMeFssuJv-DwWiaI%F5A13NYGK()Y`N zu}T^oQRsxA=`|c;nF^xtkD`8Ph6#5|aqjdQ4PD)}*Yxa?cB#wJn7?*et)fAW4qV1v zO*)LXcS|xhkD$BIbi|-bSgGV;t}s*qZHWd)H}&Lk!SKXZWss|h9;6((O`I?i=hQ92 z5KJ9LM#5ynS8|H5n4FsWM$MdE4C+?e4U)twFdLyzU#H+8y;=XttV+gt*NcyvQZ&zm z>fjRgowirYoL+D2I1=y-(w*=#Ri&pjyG$rN6AJlZXO<1_Ag``g2i=L8u{;=(?|`d} zGO4c`rYNF`2Xe%R1?rTh19;M^?fcfP&KS9Br?sL^9uxq9i$K-{AeoYAE8gIt5o@c~ zg*~Bq{{p)9#xN)GF4Kop!*E@6q2{iEWOBBSdKDg{{|n?Iqx+4SI#`u;YtZWdF7|Pi zP`v#tAzNQ5YQ+q|Unb@htNz(A0Q`-STbyo@ns#hhhI_siSbVFCW|9EyWrWyZKhk3v zZ{?_2a}$W9Urx!+)06{yf60s5gXSCGkoqFK?NxNzV=5k9Q#qh( zjHvX-5(`{1>|urvjzGZu)B%csl{E{`x~ybiFalF2N?sYv|FW}5tXySm4|rUTVdPxW$F#)M zp<4A+gWWDMPOXc=HV+oPz?FOlv-P;Z_5M@sduuu?;>?s>1&hQv8zoDbEopKwFtHl3 z;0|T9m=0+T@aUK;!){cb1*N=2lJJT7Xo~?pEKKFb8A^4JdB5Ms#v!2VeungU#--b* zgK>xL5RImsGu!o@hfH)uKO;T`{=?aPjo`yHG72<0@^?s!upE6K6CmzNL95lsYO zW$Dx{iCRopi3%3IllYYfVUsA9P9epRO}w4iz0;@(dcQ683o?N#Tp3j7jp`ICsAu~} zwUNp!lrp!7y(Mfa7Y`l3HR?tg!A9@k0#J6Wkf!xPE-~V}sy5(p_wES)ioWcJ1 zA^pE7d&eNpqA1(5(q^TdS!vt0ZQHhO+qP|6|FmtJmCl;%>6wW4Iy&Y}N8E4s+dXm5 zS^MnYUh99f9XlHsSt&aj7@3Gzo7kAx{x`XwEoxfwzs*p-ze$YQ0FmMHGN>XHz=|?G zoBrg2MCSa^NFkn^!CSPfY+9Q$PX$JFMNB!9&ZUc$*X9(9f9Er1o+i?I zTM&FMrS-0*=uUU72?T|6EHd_I*PBkcPPzVdfck!ZY~BJ{_ir**&XX45dPUVE5F+7z zHYpAJBIz&+H%qvO`ndw^3&NxfFl}-6(sgaU;_<_{&xH8Wa*xLhpu~)EMi{>BwF4;) z!h%VmxH^c42rmYHF+&9*hYG_2%7bYSf}@wsALkf|1`&~r;+>gHDomA)%wa?h8S*U8 zkXQ=e!IzU=h)~&lpja{%5_^GSWOH_M3&QZEVq$}nER|s}G^LqpRxCztm;mldBt7bI z0-}SW0CElNGD4>US8pK7ieh^A=oTeC)-rM`9$BfBDck%_vn}l1C5>!MMk=Rf1xeC< z@sB5WNOPbPdyPJdQT84t*zCRs7~LKHdTB7qEdPCJ4MY9ZErXmYIjHsEP#FNIs5RPgG~%1`?7pN?|jY7Dbr-u zL(drUn@vkZ0L~Iq(zFd+Xh;ZRoWQY%vD&LRwM4cE57wl#wzl=A;PfWo`skIqnbGE& zp+x~;;n0>TZhrF1p(dv*{NkiMyY&Ejv{|g9yVa)_wI{XOUDTAkYT8O6myUqu$*?mx zw?UoQmYu8X8%Qm|NZR&TS($~2G8FgGE=Jo}H(@HY8Gki|>}Yyf)AE#hC%&V#Qu+Ywt4O*p*h<{MuNP zMX~9Irwe!@fy_kfZ)NC@wP-?oX?6FD4j)P>3!*hIA~ZhCiwjunHOv#k>!b3s0kiY0 zx`-dQa*zSsm*<=KLLLWgqD9z(hMXMlyYZ7o`(Ly*7i3UwiLy;qN_DfmR-lzl`}dn+ zC1Vl&Rq#eCqH(fkHo{jO-Bn^}a)@(i6k7DeODl~MN6f57#|e`q>49xFu!dW-V#QgR z@tH0=d0_;$f~~0FfkeRC}nK2*2LP&S42^G5E95yTiABXRhDvm*&v8cZ}e*-z*T_ zTR`~ZK&M+cy)zfvFBg217b9NJhfKXax!C3Hkvkc%t;S68J&xzlksm;+CoA40bsgMF zml3dor7oB*Otq)}+)VkOH2f*wmoq4oAKf9kZEDnMwg$^B)>cexnG&=mD>~91Qy_E2h>xcIzR+>pdA(I!ui8D7I*)4;jk&?}(?~A_&`JyeS0pQIbPsie z&lROnd?&B}H7!-Ccs~ zXpU4C1(m6kRzr+!g4E_cGxQ!BZz(mldD#=pwK=ghAp?{lgoJID*l!6UhV_t~HL!_Z zFQBdoJs8a#+~%1dTPTvr(;EfB)rP@Y6l#obU&27W*kNME_@Jnxn=42i&alA8_+F8!;wh2AZOU)JA1Z3rTPs zQppM_3KfAQoIKcKB@L$pse%4@eWHZgvED0!_hl4aZHdEvP@N6{|JZStivp2%L3!oD z-Btuk5j2ufjvo+GfXQvXy+x3~{r? z%cq=Z_I$B)@rxZg(MC`JEIjj9#Xax!hHb?iN9@1ZI&D_5mse{n0bL!1Z6=zvO7+mG z8m$-KqT5xOo2oIQrV<&NlPlV^)@veuH~y4Vh&hgxv3xZ0(k@R={4`CvEmz8o9dMTw zCY`D+hBKY2J-IyJmP2mZPPzxW<*7Ya_PPYzmnqf(z1d1FX;@ldU9Fa=+LklN-G#>| zG=hh{C9oftvO4;uUa?fZ(-o@9Q$xa0&|UnUUb(;tg;v*Bki@a_XyGY(ioe_ERlq@M zn-@PFK1h}WhJZ>J78yq)l`1rSi$s$iC@6`0Ty%(aJd`;Dre_pRuNs%_zdon{Qb7Je z1wpY~pOvPfF4=qA1ceT z<6Q~F&4Gi+0?@*5;|z6L9l2l}?XS&{C*{S+k%eTj9!6_i@s-3T@Qd zqDm`U`{nYZ(e$>jX^-Kb2cG{AX>je+OtPxrsP3V`^a7oXT@FUvE_4;sO>1~5{Buk4$z z(ccxo+TS+E#qyV0p^s_zCcWRzT32p{1%3fMTOeq2=2XHCvmesTu39wJ^3(X828`j# zI3f7hwd$^tQfI^QpDe3uD<|$xil*4dx`i4lzozV3T-jUlcW939?qYgQEB@8TI(yUE zliT-1Im4JA^%>hRjAyj2AGzDGo!u2FkDc3E#D=VDwS9Tt-NC#3U6>3g&gKz$bBOV? zNB*oDKGlw8E5VxtVUI(kwO2djooeCZ;rt6B>}gybF?W0RrlO&H^g^vRCzjmy;qDaQ zT5&%_r5eU z=C(+1$tz}%;u8Bof^l=7A9@cV_n3+12&1N=S3vr>aITP?rOa8z_!*40bm(Fq;ZATu z^wohh0^S2VPi8c;gKOUM$1rGN9I{8?8XeN6%mFURAQVxzjP)YMC~U_`g-@WvNH=Uw zD|l$UAZXGPnt0LF4ZRJ^gaI9$6~=yq`~rrYkR(=Eg=1&v3kKB`yPB46p}Vj#zWw%W zW^-n-N_>mf(*5$0nyOu5RrCBryBWF-!r7V=RM{CYX)4EKDBM4USn zLHPpyd#@McWC(ol$wsK(AM-`TEe<^ghCxJJ42pxO5F4az98U#zKUNPBc84qLlg5Yl zvIoUYQHU1yc8P=}w_lFExxGeY2$t(wq{APcv2yV3*#<3tjIk}qHBLB(#zD7 zybrqjN`kaI1OV=(+e4M@rQBly;?uWh5k6Efq8ZZk(;`NyQfoF(TPRt2A@7{8BRhBo zkyKPmdfuGMD;4f0+vqB-(c{QpvXbm>>y=P)_L0#i3o4?RuVGAX6FIy{Rj!tj2~DAm zVef4f7M^#doFMm`WyBTLQ#Mmqb6m7d$yLzAElso6V|0k8vLoNCH9$0+?B{3R0mwUD zBGI$|$z1WbH;**a)Rsr+b?#2TVu zaN-SZC1LTX+7|WZPLXi^&#K?FZkOO>Qg_+Bz}iMNT3nC4L5{@u`kSBX8dtJ75vhe_ zQm&{g5-)^t<+#O*XdXdEv)R7d7e?SApcYp=3tMVr9j!6nOP#~dI zl_yK&MPW-G5V2&;5O*{atH>-R9Hy^=+LzhB9UDZOYJp>wa zSjUQviPvock~JRmT#1}ld0UEQ-4r|T&u0&SIG2f{wpz4MH@S|e3K}(zSiGyskJ(h= zDZrIK$6--ahCqFXO&!{u45^B2&a)t{WV_(Zn*^1XVnixhzs~bGk^g&>e=R7~P#c_@ zbKk-i(aN8W5AG=(p+!B|{S=^8j!Dj{mX^9;tI)(2y&jX9%D$F<6^SK5!m*SbK7t}x z+x7G*3i6+=#1) z$4Us_vp}P#_}1zYb~*Kn_ykK!D=`5%gbT5Db4tWO`mEaJgFeDEjl=cORWeM#H)9~i zkxIM5@x`l%Kg1KO5ojPa zs17xGef|gcB-f}s($hG6qYejr9-M#zTHWDy_I0B|G9WfG(qXERaC(cwcZA$@BDN`= zCzcXhbWhUHL%|jDFx_ZKV~ZjRa|(AN3rUnAEQwKQj>>Cxzc!yr=j`bS&3(qrP1Q>W z2>R!!j4?_2JL&W{*dkQAe!=`<8jzWxq6F}M{DBd`Oa#oZfOZ3~Bu#4U48Wsm^$p_h zs*`yd#o4Lx#*n#OQN{d$zYY+h`5kq}svp%i2w@tXU;%-KSX5T8QCC<(Eg^;@%mI`6 zt4~i>jc%|n+Ns;W2{_hs0`$=2f*N41oc@x%6SY}h>zS5}D_gk@g?R{1lUX9w(3ReP zmMB{Q<{XP{)vSh4{JxG5pmUUcXJy&l4&$e`(_T zGw~e?a)r-6{vBh`RJX&=G2$4uE(GjB9G`c&KZ4YXC?gzEOrmf!JzP{f@rw z5rYypUCgQ=?ApG@M^QPwWPz;?u2qjJ%RR+A$ht8k^4$}CZLHxx`om2VwkH_M{fWj^ z_ObBXmB1=opY6W<3Gor%X`JV0rGC@7GxqXk`zrgulTeCls%pmfh_a$StM7F701qHw zIVxGU{jiivDVzMF^)xP+Y)V9z2WLs!IYLEtE}pmS;c_Q)nCx9p`v~X|C($vZS=g^H z)}Kdqu6|0<2wZafTZA&1_NUPb*vTaAk?4Z+s-*y4Oou$^cnQDEodGUg(k zFX*}!k#$_Z`1a>sVXENt@aZq8z#TD|AI7q>J=Gmbh)=SjQ}mu+YCo53eXqZ7HzWud zeR!IExG{o~0&kGo`OO!nD8;>5_@sP-ZVAzG$((FNIq4nOJ;s3C-7&(ZmFZx*#J%%| zbYxjl-cH_uR`EVT9_`_#Fvmm_%$iU#K>EOExZ&z%dgEAP%Hn3)>OUTm*u)%EsV0gW zBF;ct&xekNY~K#PztHE&9aBJ#8PzXS`qdKpv!VU@nTkCBb(*W@@tt++r#8I%k!F1V zliE<(!sfqIWU4aO*di$3qxYVN&zug~d9FeMiHaA^GC8RW&9de~-~FQ!(5{M#`SlK? zGo_a2rdPx>2r^N_1CNi> zUUt16w^{e!4=--JAnY+BaI=MaLsl4&`aij(p(1>R2hX0}1p{I2>14u>rIE#i$kg0#iYwF98^ZSur}sz%T9PuZ>!oz}bnXOW{Iur*YX0k?*=|s)gThMA~=ZS5O-{j%u0DG5BIDnpU zdGzya<2!gXQ*u+I1;6Tz zY`XE9RPoR#jbtG!n+biY+=jEmJi*K+*P-Y<>#-XRKQH%Bdz%v*G5cHrhI*ht3yiGo zkMDvqNgFxDK2}GL&3+2r%5o_JTlC5_L*#TodZES4dn~ zpmU{yN&9`iK5)+5v3(nFDwblhlL#YKZp$J@XP%T+ab)7um`%*}f4;WiK6*&XMwGT9 ze!gLJohme*e;n@LTSQ&?(18)`GIbla)&~MMVFmhcKR zl08Lx9KBJmc;UF+6EyQcLD(g0bQ$`k7IKc_AT<)2%5nlNKtp7!`+q-T?XWB*zzXRZ z%->a7$#a(*Uf_bR?q@+)Rh9ecyQi?cvZ1HoMp?~ac%lqpL$8cNg1N1Q2s(P;22`+` zpuY1IB1Kb#J}{xU&dU1=>tpf?B@Bg{FvCa*y#c{dnWOv#MxgmaST8?i_NqGf6mq8{ z=015>Q^;|`_DN-~Au9e!p$Dg z>5f*(9s%hN%(I8@Q!L({iwZj%x^+kOJ3z*pX9MVA=<~t?ux6BK$i~}}3@KkhT-XKv zqyN%cTdx zFhVdqoRR3FHsn-CP8WIi2wB`?m3UNott@J=8hZ*~k)d?N{;g2qeuRVHPBYwsMk@YW z=-l^&@V_^TG8%;YkAI9t{2~9R_3Y2a>Evu+^WO}^_Ndq>X^EitvJ$T!A?KIKL-jWQ zltsI>DpbhvXc9#+6#5cHuc~ZmQteMC;C8m0DRf^a(td(pa9{a{urh1l7h zVnk5RYxcvit8JgZ*=DmIGwaiOe*Ye*`~j~U{q&?Hj>t;jMCq(^K`+Fnu)_{22blq& zrf}VH93URrY2+BMzwjlu#PiMb@$n^+iEXhkhK&=4x`zXY3;74{GXox|we~b8ESF@C zIaO3tPAV_35hvq&lg|2RKJgmJAxpoWc;j!t+@nufMqS7utMDJdq=eQ3&|{ zA}J#$ockQzw)#Th9i_498^&9Ys@XoJNOrKo->LP5ZgUVROdR}y;tV-LX74zpoRsM# zyb}h~UM2OfCJ7cM_~m`gFcgbo;~mub7&qR6WF! zQO$k2B0x)XGm5q$K6*$t1;j8|f#_tJm6qfb8lAEP494-i&EH?5C8P5!g1@id?hJ57{@g+99yjs9^0I%HxU{^k zBEy{);piPr9;w}7bG5br0rqWI{IEvHAiE;99#laM0BRC{nCD@xDz7OfBv6BUuS; zo)`Cnl&S(!Xgep}Zd|9yf@?19&u2XBqU&Znyc+}o1rrksWi!M12mBA@AJp?!Rtw4z z;q}zp|833ubJOL;*7xu0k?Ge^J5q4?tl(TdUcdIQH^ldbfoQzK6ksjd#`)43g#g8tczG9Q{7v?wYme434$gwtadidqXUTM;%kCT9>EdM4ZCMrTFY5(y9wo&>gRuc74(M^8RiXUgiS zi`uNx(cfy5_R3573+_c_kAmiF#pOXu6R)f#rP!kD+%~z(Oc5{*2Uc^x>nmkMIi2lN zSeD1=-jBR$@i#p*0%I^x&sD{!Dws{^5mjj5(mzpJ8!9xmmZ}W8TuwxqW!~=dGgc>=Cm7PpNoX_|R9YW-)H#F} z@+M{#gLM&^F}3ryZj1R$;3`Gt_w>NtKjj+v#geot-+}T#zJhMOx-g{&b7BqE;Taf^ zVu2{Rct5tHuE!=Nh6qptX9{gS%BM+MEfq_$G4>TOps08BZn_&JS&q@pQzTXBtm_=b8JjRZ<(vW5)xRwigqX4fOgPxS@rq4ukh!e;38LxK}6OK@j0RF<$J) zhYS$JxN)BCr-mF5$hfng>?emT5X`ux-P4W3>8Yslog2WB(h!BA%LoZ%t}qBcU{naX z1%{kn@sNMh%e5xdwIuxmX3YJEf%R%lPCe=y_>V*QWcM!dUzhQ5Ci;$0YMoNj1Y-!Z z_Y*?%=zCXQAp_}XEND<$1lAA8+?AoX_&FuKMS0g@t z&pS!g5+5R8IpXjp_EQ_#BsUNPDYbvULG89g_`4D2Un-|iX%}^!LMEXBVy6=Eyr}9U znPllNvFqzUkw4l`st3Hryq4`gf99VBIi=me%IovwIp5(q?Q_C7G=HzbES`rL6d~Lr zUBeTF!RYpH4r4<>81@a^dhJP#rh?~AzmpCJ9VB?2VX%|OPQ4Ozg_w<`H1ZKD+5ey0G+jiqd5k*-W7^9w|vX&0n9V>W^MNIYOqFEJ>1 zWrt|~+QPK_ib&qT6G|db8kOOtF+{v;o*CF}pL`gZrA}JUQL=flI3`g!uXs&*$(Zy( zG@dV9&kMJ5pWXSAJ~8xfLY*A5_F%rV(C-O5$7>p$K{6b^FZBOi7{YW1SepN!zWzTW zMhyRl9sU1JbpDwvvj6F{{^!n~qA(!|B7jmo)7vp-9*BOAjEc)m6$lfFETRmIw;P?a zX0U*3%ITXnFT_89a91?UW<(z!6mRQprJ^R_=hNp0ye3rR&rIn-+>kh88Q??`Rmm@V zK9~5nxLM6SEf zgtWn&bBJ7Sr37&g;LgqcT!yknbn&?ApWu$2zbz^{>&gX&W@4JyQmUBKHxb7_mQXog?wZd0`Vgg$(Hh z#G9Hz*7}K34edRewZMJ<7Y_G74q~kaTu81TJx>bp>lfAkY1w`pDy2=_O&tGo!Aev# zlzs~!-Vg#w3*Ys_+=6WHHQ>1inm2;Ng~r7HBH>j}Vuu3BT3?!}2J@SS@bl+`zRrM^ zkR&pppxgEJ@!nos#Pq%L`GEh0U|@p53p>OZAl$1=!0!ke>roIN3Ed(Zlukl#9mqdP zr@~8TLbbyMOG)f|fFCd)d*76&Gih~+7f_(`&&OhWHNw9-S!>D*bs92Y;A&FxZxJbo z_)6o*ayKcI&Tigno^vMv4bh{A9%qXM3%Gm58iOyq-Y6BanAF2{)GnzKcJ zRkP$aXNsj%=%CHKc;mQDn2I@zK9di2=EsM3U0r`gxJ2p3lMs2wK|wvwyF=3?(N!<1 zB=8??@)iArj;dXVC3umJ1iI?cEarNJ)4xTT$~K)GJLz^^3=hps^J@FXZroLd9Pp?g zfgq`+0?H$Hw2y*$kk>Q&V|x0^BS^8fAge`ak(_pj|&DhBo_X{Rn$q4{}eR$Qe^L+jy|poc--?d6)6b*Y=Hmx3Cxe zJgfPoMsIe<(#?<_k}ZI6V$;(-0OlU`+tZ9xnZMV3_608z_XFAY?WF4IznFKH8;UA3 z{6O&h(Z7Dt{r~+31r413A4$C31EH@nvcmdVz5aaV1WafzC;<#qQP4Jr1lc1*z7Wih z93D(u3JF@6-^oSZFgZ8CqOV6M89&5Xes|Yu;fHnSt^hI* z!D86axqt^JwH(64;?ToWI5!WaT-?OsAuA6dw(mk|8MWtz04>j-^V!M8zN2#v56_(f z^fM6;H{sk^&8Nhm8|NSyI>05>!&9Y9-NfZ3eE3d0kJn;poAIF?fb&-Usn!90%P#@D z@r>uN>*hiaLF36MiZ{N5&zU|EkG}gLR%9&t@Ka9J>Fm$@+D|@;62##d69n1fDVoo| zex%yIH7z;ULy3^y{3^VU&@Sgz*6q=`*ZOPU@i|16Z*tD31gUT9IeM6H$*%E%o5%YQ zku9;BKR(eoT402rQ!s6`KYfS^jFv74Rwth$(2F*EE94|2p^U3yuJ~cXvwlY;yGDNO zR1MW;begrV80qDNQXtI*zzW0znu|z*xmoy+7&Dp-PIW0Zb;6N8%{BqWM5=g$uoA?j zFcVsC}=0;%(jpk-y49&(yVGhlL_52PRuJwEZ2|4EknKOJOZDAFT zDjP@OP3ze}G%`Z#p`R9P{RqESwsn+1Dh4%6 z%42AKV-&0wY|0_FX~cf;Yr#+`LN2H4R=g@yw>VUMM)A6rJAN`1YPsfB~?z@V=}vI1BM2aHqX2i%cp^upi>2N)=p z$Xq0}6r`(dtYxy@NT5h|(g53I6r`!F!HuwnAYF!DDqvWHu`Jk07$`4WM1v$lgahWG z@u6cu+SXh^)mK))Rh6MYK>3A{yAo$0v3db4iczXb63T@!Od6Nh?V*0(X-sw;gFAJO zzH&?n4fWL6B#!0?twVEnjblEDc4p!_TO(bIlY@+{jJ-@>K=z*oCdjgX%?Jk|4bAkC z{y;Jf{TOx@Ffogl*AncZZinOKy;XkiM23LJd6C?q6dH5t5Pjl^83IO9q5)R2*!Tcw z*Z#V9QkfVi6HbGT!{RfsjYh+g^qj&nb=?{4R-8D|nDXZ0Gh44eI1oHh-E3tUVWWy< zHu$#SfRX%Y$r>#jC!d;0m`qTMXX>?{_{=__(0F{zNX%Dfq^V+;E9EKF?Ie%OTlKvP z93;tUdU!lBo1VSM&QekI)RZs~I4!I`NX$N%DPkgv#?NY^E^`-Gm4IiGHVU2iYv~-Z z382&+zg~`;=fKnb*B#is5U|CswXP&Z2^SRPnaU3%_L$UV(+PC%8y&!@a@)iQd5+Rjp+~BB8LYt^r(>5JX z1Cb2X!MT)g)1@9=*+yUHEUrQ8mI6m!$1KNFDtrt-JuyuQh&xjypKXz$(`eyP>t8T` zd`vxZc!4Vs;AU-AwGB!sConTmwb;SbPI*Yjlxj?6I8C$PN#ve@uDG|Z7)qrXr%3G4 z-^a9JLh%D8;Sk{%(I`;_%GvrHtQJp8FNzi)xEf?c6C|-A=W`V>5U|}56zpmxTPokD z&40?Occtw+ zs1-?P#s?y^lrCI}HWX{@g!;o=Sd!GG3MI_zw`tpq{p zC7HAxUZP_?I9O0<6yi2LNpZujE_O>ID4vv4(j0!dAl+hhO>)r|#-BYoKX6cX>t@KE z+J38po0tFk2|-Hh6^63H0D(5pZmws1Xp)qC|1u*b&q@l-8B$w@?~1~bkpe$K`S?|X z-o8`n+3{_$0AadvmRbDow8u%yM%^N10nAjjGYWipNxwdr9G;2zu?nF$avtU6wCUIS zi3xQ=9+?b#L#uZpIP!KwIKm~mLLn61Me&F=k*GMe7z?o|*|EFPOH-=og{oi}+u!EQ zjRb|uIf$`jHJW3qbHVYn0rK-n6rAY9Y=ejR!NJe$YG5|~1lhU;dt>cU5@p;BfXcyF z>ZhjzuZ4BNLqX&7d@e^ju|@`k%V*+{3FJO1F0Daby);j;GEYjVlu??=wqfJ@ojD9% z^tWoxvZa2Av5++GclU0fmh0 zyJYGas?1*UI38hz72t~P6wTxbG2a>DRVzxU3Ls7G`4G-A+)7yM;xUSdda8b;tHDWv z7!u^k6N+_YOgSpU_Uoy1!jfauKg^NrtgduXoCp(#kSfPdN`Jy{>bLy_e2GW(5=qMZ zGeS&8ez33-QvwxI`YlwKsa9d<@FXM{>TiAto?rg$P%51`E zfSnkah6{8 z?iC^P9GPClTU~HbH4GiajTIHbX%mm=?nsRMT;T8(Q`7QjTxKcAsby3G#4W|8k(7=j zf+%QO{*;v+ULsEKkA*9Z6A=UtO^HXAc~*a?$aF$3+|bEM3b`YRtz9e6E6(x?p$xBH z30Ps&l9-MY&NdHId*sl_IUSuV3pQPVGj!LdZ$6ihLa?kNKME2_O|=aN#*d?M5H5(& zO6gL=&XZ1by)UUB+&u&?RGZ|I4--}3Tvq^@C8L&)({=s+39cH4iC7#yKx8QvC44VC za`1M+lVTZ1h#(1UA?59KE&J?VK#VDzPbEL9(oe|2D}-N4nBGkCv^06j+F)Z5)+slF zMA$cA1&B*k*jAS`b}6{MF|WLpX?&dHGgA{sI#37Om4J%PjhBA|JP9|%(}KnBa{G8G4XW5^Y=h>F$CCj<{QbhP2z)OGPjI5*u~FE-j#rj1T9)q%1&+#F78M;$|9aJh^w z5A?Q91y7+W=whEPWHMj@Dkq8xFs5W*AtoR<7I5~pCa$FD%uB>-GmV2bMq|JVozy*U zD}jo$R&mo5Ds85!3P^Ghkhn%XMc@-4dbS)KD@)~!o3u1fASnu0<=erLb>L~RT8hM{ z?=D4^bd=Pp-qY0!!J-8H-}I_FNOeomQoCH znTt-*Ik~!9SULl?F0dqFoV@%(M3I3CKE>f9qHH)tN~7qgaaE6s+UO=!vWN(P`CaKG zp|Yi?tC-nD+&JFEPxDYbB7da7Aa02%E&}jwQ9)2v&ciS&wxr3Q*2_j{jA=~)NH@52 zc}%IId0FrVfI; z8hrKgGcTP_pWCsxwhsQ&LRb&g7{kS66VMx;GWff<4bdO(e;#s<-%2XEdDKSOy>g>W z?y2Yh6rT*TeQPz}J#6U`X%C-ZmKSh*9=?dHQ|6gYyQeA=vdiw5r59fWw+beEiFVr` zP}woT!S_{qrCg-;S-NX=XEWVF>>RNlZfLrvOC)Bzx>avao2&U)uWijOy!vghEt=Ev z3a>+^gZp*ay%4v;<_L#lZ2plCT3o*r%n&YZN4d}B`;@1-q95Q3(bM?O^?)mx>@qL6 z+2X{5IAtgaAq`W6k4dL);^6IbH;;O!9s@rKv%VVgH*!PdO>z1;D> zyn>7)=5bGkd8@^lI89+one|ROU~S=hmCX_;A*Gdv3fThH?Rz>(9;mKhbsV2baohzn z+ZKN7GVe*T_lj^h8R8?~%2&W2mjfz77Z(o>O9)UJ0MC&y`>(v4D(j-O9Y!9?7pl*) zKCpR%-fQ06(_;NyoI5N>I)~j>m2NgeV>#Z<$A@CP8xv}4-q(QDq&LpoIJ(#IqeB|r z(mO&i?x@Gh2N!s~q}NQq*oQaD-8}<-iMO~3)#0HQuc|%ATeXV!^~{4^H-b#9;FbXK zw77ULHU&a`A#;xqL;gYB>f44isp4@(2X{++S<+EO33p59&|ylE`|%D$(aojs_G(Ng zg2?um$oA^vjh3AN#7Skio&3#nZOny^HwbM!>G7)TiSCa+B`zarUc43BfR&m2u`)Be zIh<_d*^M3_*6-!ZaVbjn@B^>fQ)GQL5jTu&9+o_Lp;WDJnggq10JWmWIW+{G857p- z@74{gP?saL&KI^WR{jjqJW#X@p`w7(D*sbkTH7Alxz8y%rg{-_$+5B{`qdBwz7LKS z4UH9=WzKF}FyEfya>SbHuY;3)TUyZ`WNLsgJ*tx&($kFiVU8r%m$rvTIRHdC($kFd zGQZxQH#0z(JHaP@>5xu)Qn6Oz9$edB$WfGtfHFe9JO?YfQk?R?%jP>>QQ{tk{V>t-_w^I z7nH4gS+aXyJ4^AXK`0|*5lBTXlC2^uQoA9Hl%hcC6-`vDINV-2%n_;HM%f_2LDH3Z znB{aB&N23(zL&)UBFN0bu)whH*b;k>2)~LUc=hi0Ft?GZhZrQ(AoaIGp%Kkg+z@1T zhO={csphQEHoL~W$o8PMu%Z*n+9Z#_PEZR;kE*8a{7d&^tEjj)nCQ+uFdq6Mol#%C}zz*01aCchLUq zm5-lM-Z$6BCEpqwz8NZd^~{x*_*j+kArtf-m*d?Zu>0T3goT|b`RKDxH^i2Lxa1L?3XIQ&mUgA^rWfRv5{KoeF=egHaU1hQl11K@a#H2La|CiMNL&h* zmr_>b5j5p^&J`ug039Jz<@hN|ew_*6b2ZHIu8vk-7Ld5bu$;m|=K@#~a*mg?^X8nA zMrS0xgPY6&yu}gD(WP@`%qhG@8HF6v$Tb$N=3-7FVwq%}bDxs<6rG}<+`B%7h2fr# z4bzX|A(NXRIyzgI-6TY5hr8qg)7z2kY*hd>_Uz>r;M8Pw6ZiSxFCuaX_+z4ggfi6Q z0uUNe^vJ*EIzH8}Q-1DpxBIG^-n%|$sx*cLMCs0+%D+>0hfn=lA{1>4sZD?D?Mc-| zoU*^hpEWN$UvjSzyJFNbC4hX@nZMj~l^k+}-!R>X#s%ko#OF36^dNga#!yeZe9Vb? zlJxD?l=PLE(3^uDn3Fg;qavSEGZ!yoh*{BR%#0{=@=-!+oU%v6X+{O*7zs%S=r^SE=<9nI7AH z9!Nfn_9`kJCFI{~3FeNtF?fi$Ag(n@2_36q7qa3(Xz#qCj>@EQwvl*DCo4tBS z^U(cs?MWXDYqCq)1D)(Pbev1Z@bj0gSZKukdp|hF5@;@Tjf7- zs_UwbfW0|qk04qc;zB!$%2mQ;Q1;XNQRsvS_t^^p)P4 zt{|jzIro*`*tXvGmEPI5=3{ijA4aJ=u0UX>!XA#1?z-CO+YG0hHJi^lZh{Lm!pJd7 zN8I-JoT@-;{#|2%PTF|IbPg|F#*;qLFpZNtXv~1$Xu*fJz@sh=A4|7{ zM!({4)f9kt+Iv+&sDvZNGju=Sg!B6g=63FpU6gJQ+Y_meNjmEZn&XMG zD`s_#rhCSA56%_CP6^*L41E5BIeXs=)<<{|v)7E#`*i+PSy*pQ@jY{<(C&=;JvV0< zK@va8U9vfp<#v~wGl{GjoU83C+IluW&TS0q+~SAWzxsPbtav(pLzbIs8I1{82fH!z zwh{n)4Y`HIi#us?gR^?6^EPAhlQm-VpyRuC8<(JQ=%#eoh&p$_IFkjk0$SI@H1>-E zCI&zd176tk#w@FaqDNzgP+pTpd-cs~v3`Sev@OJbh#9qo^_=MqmGx-h#w5M$Cu5jr zTPGL2=tV!;Rv?#=XeDH}gxUlCT%)R3&~fl8$HtOHS~@s7Po?7Mktz1J+SiKyQAtlw z}G7p6vnbLcb=HXLvwNQib4 zfu=>2X^<^83^I=eh`?x*$qus4BX5deU!mGK7wb}frpXV zMc%NJdhR*R|K1IE_NMYYB%2Qte0cG zAp8MT8B*UP?o(iJxx*fq!*64${*m7n(>6pAJo~YjjpaAvGr6j`a2P7Wnu$G3hwAAG zujYApwY)1Ct*lPmUC25A%;FYnVq7P^7_I1HEMEyt=}$~WYmQbNZi?ZK;z_mWhJkE` zbvX09$*x)X_?x)`Ex-Cs)t)GfWRn-cyvBfUiMk}-GGk(k_gf z;IgnG%RMi#2-I*d6}>O@+e8m?Q?7?dWkfjB~Ri)k1un{q~^RXs}E0SJ18GdTjLL0LO`*$`wU z%1`+IpJLv>w8lRY#^09@G&N(DqqJ4k%BBoWa&#y0!y<`5(BLewV(!uBqHE%`VHyQl z212p(xbxl|M5I%+tF};=Y6hXTgXmDX_b+;Jx)+wzl58Xl);IE4N%6L!(_S&XsZ+~X zTA7qBd1a|FH9fR54&?caCKj$$33ywDp#?6_fw?AA9Tc{l@A@ni0#%7W0!5S;pX#kW zJ}78KHjLroIiT;w8+^O+9JVg!(EA@U{xr{f%Kfw= zT1bos$YQh4ct!r$S99&c$5(T~0^6H~QVG?i7G=+j+$Lqul-yVsDw-wN-D%vN!QI{6-D%w2-Q5P)#$ov* zb}x3XHliZ3PUKxxMMhS>?>Wye4@!Sh*l3c>!k1XTS{q!a08*v1c1j=T{>Ev-w0GhL%#Oqb%Rnf~4~mPkAE zQv?=#jt3js$e8UI(SOb=k$w#<3>;Z@}Im0fx zH(K$wt%tl12sCvc;Lj%`kCMt((>pl57;d!G!!4H%$c8=}?0`4JIXC3i9ydL6sYSPEq_{ zcLR!Xq`IgP12p*(9n@1OHDQN)h;^DBRP-peVG#p7h6!$J+EiO;Y7xi-E;o6t8u(~D zgTs6DH({Lr@nbxOO+T0Eg_aDYyan2}HraxLt_Ifkw)aSHAdlZDyD$YJat0XokZ&r) z_FU=y`&zEu5Q# z>2zt1G-(=N)-awz+%qkNDGBzVk zK`p=M#4*?CW=xh+P^OGIp4;4_|CR9CA+`|3jZUUZYzYY+$cCU3nbmU8HJLvV67$i9 zd0um07L;3vCGM50d;TKmyd12xEBICPZPpe^NY33F{AXS`UFebtJmKQabJZ#nxA^$t z$}#XdVt_Q&ix5NdqC(+RNoqbaq%{cvxdZ0PJJ-iZCS%?G1;+# zs@%1^=AL4@OScRbj>~xWMK!%3)?I}S+O*3hcO*xyYts}cOAzA70{tDF?%o<@l9Tp- zC$Xw9cW0ImGh2woLk|nbnMBo68RRiTaAP2*nH9J<8mWW#XJqhVlGlEG9cCE?vO^U# zS)^9V4m(+sAJujpm^;?~;lU7H^U5qUF{(-qfNvCCsXR1@XvSW)e0G!8@;B1_&c7s; zh;Q270Vd7M;ia3o>3o}t^hE7ZTL>eo&co3ynv#MS+d+EH!;!XRb)h0)VuDelnXI*= zGgVY81L4a%7hFnp@sZ#fqT8+h7jw3EVqPvGRpc8VDLe^B#~}%=BwG;V+165eEXghj z4M1g&s1`0p2P&%AEe^t0qbn!4mO3{Dejk0r-N#sQsYIyY285NXyn9o+y!H_%ah5P= z=euq?-3#R`6{?PYM#u2-%N-kW5mh|5&UkLti_#Tl)_%aQe=PgzJ_cTV0N~%3zSh&W z8qF7sD~}XSQW(C|LmXZF#mR`AxsKMdAS?#9o4vvx4Ezox_P^Y3P<(Fp{_{E<6yQ7> zvf@+K zFbPtzPKuFEGKiW30IwQf40vmn6s4vn-yc@#!oZD|w8}86U)JdLIiSrx$_x-&v;18* zY*C#R^0CG}lmpKs)&6t8DS|2CecH>KRBoPLD9?pTs!>+Gz}j>Jl*x2#sa>K&V`W_t zIzJ}b(JUL-bdewD5+E^agI=~Ko1f&;U|z9F&27meie;U0QnpF&0dx)ZTO(vrZls_Z3?N+OrdDlI904CA@GoN3EBPql8bd_Oz@h5peB=O&mBv7N+HO@3%2MC&NtY} zRJOLEYPGQ*W2J%}0iZ59` zhSWtED>_YQd}5kb7`jCt@b8Y#AqpEf0VXE8XEkMu&wfb}cOLit9y;EF!jf%ufC4ym z*rI=8x0oxiCK!yUV{?;gD6yiC> z9b+!PT9BO5$_BaGEX{IT!d{l>dqUs&*0Jg|tk&u~O|A8pt?45 zFdCV=jt4Dt9+B`@2ya`^k;l)hdrqg>v)m9}Ebj*o?9%07?9T7x{|qJ;(dq}P zrS6R@=ap-9}(n{v+oVEyKBVUI*Ds+n9MuJT7! zJNoNzS5=M+Rdr5jbi;u`yE3uZgR}_Q)B?$`06F4xT-~?H4h0eH^Z|d_*}MD_H(i^2 z+0TrGwg0(7Re&Y8Enxdi+`)<#Ag{5|+xTKGyjaj^5IjrUW7WZqTSW8KvY&GJ-oVh&#*GONst*rsXd=N#=pT_{=)qE^4% zTcrgMAOA(%#Ae4}-IKZLF!Z#05O*y_TsQb|!*&Kbbw)zGFqaoFsF7Us8Ujay&$?0# zzQ2smKip)zATi(w%%KELOy1C$P$ra$i&&(V1bcRp&6PRm#G71}8N7oZrxWl)voYKl zAWlWSnN@c?o3m9Vs|!X>o4RyIc^@pYyTTuCXqSc;f1UwT?SX0b$9WAt{2pgm`n6q1 z{SWX=LVDAY>)1_!T#LvXCG}_gg~_qvGZIawJmF$A)`TKPoi)LyOf;PL#c*mFoA!&6 z5uZjinsRz|?eFi93$5`QScPCDnYcFG6mk+M)~0YO_uO%JC9ep^VM7`+(}neCTX_X2$<5{EussUqy|6*--QQDvu-L-l4gcW);d>$UFO$eXfN> zl0lpYoS5}+aqe#;Nc2vAziewlvpx!N!7Dy%k1g8v^YTX4TFE;1xilPK8^1Ios@}b4 zfB!~(AFxuk9l~=j!dWR0dVJr{nJ?hKd@pV<wAgT#3`W@hw75jU^<&;ET1m9lTp(P_<`@H?AkezzRi3!YQ+2YJ=} zb}`}$Pot!7O!b^VZq-XjqsZrqt0Qn$MWd>}VFHm=Zjz2-R~xq`Q;Q#S_6JwXfJ3&4 zoUwE=k%P+9lFn}W_xKaTrZwW3=qV+7B@tiE^D0C9-U!yPGh8b|KJ)s=bVr=yk(5rO zBzJQ*8NXvN89g0y%hf*F!-!K?mH2hZE8;R-l_d{`U1F?-tCSK~yde$kMRa1A^M%MaUSeO%>N!oF>W!T-lWZ<=;20PBbNBG#@}Sb2^+JL&YKG%MkbU7 z&BkluS(kRsCVSvqly=971w?^a7fvJ!BITrr95sk^AMTm{;@L-+#I)N7m&8o7Tuae4 z7HvIgawapYo?Fi{%ER|BjL-L-rJ_l}m$7NSYH|h@duY1Fw10?}hzB^$e6f22UABcs zN7SW+#R!x{Nw|yLD|A%v#%Ehl-IG+5)p_b4tYD`RrVJVav}4)JRjUN!+bPKxqt?@O zeBPk1xH4~d*~x;RxN_=lhSI&uf?KInf2F{y1Zi5MBXO zKX!n&5v^3Dy}D84u=~(&ZA0VwHaP?5tZ-ly&Wgc=v2#{X=a3aX=lt>k}m!)46wx>v+6t>N)iWeFG8*WKC z__?yoh(&b%nNIZ>_ooUVZS#pm_dIm+h1?rqvwNd%H1*RN8LA^pwr4_(ijrWWH-LPC zA;(EE^sB>(h#a>|w}%Rkq^X-*@n0NL<=k$?J&Od^^|nSw8RFp$y0C{6SfO(iY_wvu z;PK$}+nOP4N0~+PtYCw8(DvongT0@6S7NrKJSDJUBseZ9hTZ<6Mu{XE^GcKr8E}uf zrLN(|JdOE`sDaJAOnm92R@Yz0w)k(C0dBpIFz{0bOnP zM^Rid?X`729P}Q!@9&rOQr-^+d8p;T*!Rp-%cUbXC{5tbD(RS{5{+W>HSZR95T~+- z>$oeF1&1!at;AK4OclO+$BC6zOzYOd?$;Opnqi&-C6M1xpzUpF!DlRjnPLu|n zZ6q#<&j@cVL)aoPP>)^WWlA83l6H9;+(V`Eq|_buP1dmz6`I-E_xb{jMc(E9%#{kK zjmb8)Z~cs@XWBglYl-I2rFA&@DlE}$sm`VC8ZjOjunWrw z^ZG1tLm7xv^HzUKQll)2(_}PE;j(Pli%d*exW{FR9!wqAteSHxCK5_FtR!2~s?2Lv z(=XZ9XABzX-p8%P88R&HlUK9(S$JkROvPUY&t--u>HQ~cNc6!d&J)=rTjy2hk5UUJ zfwSh{O<0CsUR(TU4k?SHW844R6^RnjgD*x%n>Ru48c&gh_`!G1hG z!~S|4YTRBa8qtFg%Vr9=ytzD@(G7y&PM$%$#FIbNF4S`HY#F)A>TuNJS+uo|+fMIr z%u*mU8nWPpv1jTBGk%c@BEd|I`Q8YT=DrY-Gls%H+Ur^P90pPlLkqplmiUElIyLs2 z+FVG0veldFH1Df9-_akfH$LmS=-%~$+~__b_Okwl5aj*{1uBKE63J0W`%?2HlDwS@#y)#l`n7Vkscqkg6@GqY<`^c?|a zXF7C$XRM>kS^XhELMBblzzo7Bl$#0vDK``JD>HZUSEl}W&Q*bkG7&*KwakCcuG)i; zeDBHPvx-+Xw4FP7{Z`!Chy`OpBG-iJ^1iL9r}aj01~mFG_O5!*sj3kjQW>NgCkD`W^M_Z*+QuW?nGU42 zYI|}-Qf^pB^#wJ8K=e-Iy26&Re-#cm15t{$2?kJSn>+-NWGf-cIS<2=p!gHX~eqpmP($M zQ|tPntuY`7cK41Is_JCBvhYddnY?q4GS6)xoK0_YJNtFKCt3roNQ~jmz)xuRfGjYq z4R0i$fU2h%J*qfvFnD;PXTnuU3$Yn@Sexmb&1X0nPdLXK_erM4xuJo{VvR`L%*n4u2I31q67E*SLzuRni zgj%JWm;Pcu1puO}@pK=LCX%Rfpfv4z`a|Z)EW4s&kjx8DL%RBpMe#XL|o{(vN;AKNB|570c)&0DNPUCdsB{5HSEK)4aBW zUO{)He!;kW8faC)a$8BSZsjZpcyb1o&#(APy`pjdt}m zRERjQ5bpcN2Tu1U_IDbtS`NM3P>Us*3_vX~j+t9fUalr;FQ z?pu4M)rQ3(qXg}M(Gm%CC@(LNZiolK&)=B5Lt61uPkr!diMsc33FmiZk+Ifzsb5nj zu9lgSG7ze%5uk{7hJX6C2k=?K#kIZZ~Kd>c~&~m77I|vnzaP- z>FDdoWKeI8$u`t&3r*#!raP96ZL_;?+X3tWoyEF#!^03QgGshZ5fzlRf$8=^OsnCli z&+$*)tXGzlQDGI)f}nqG6Y}b*Id$W2nNZId?GrV#Q!kjEl~>p?UBfD8+o>k+f8Cd2 zQf=RdE^l4Y)qQhE$P-r~q^%)otkKS_;PI^RGS0tMHxg)DhbY(#KS$cAjhb6M>KuVb zco?+z+b5z33sR_4sDKLvhfc+27ddvCT^#Ks!A&r(gU#S^bUlut5!f>PuXUAaaIcps zyb&O(WOT5g#$~Vl(%j%Mn`w_)+v|Giz{vH@nN zmJbDaJ>aI0?+3#wj@u?-xa+wArz!F<1(?#yBxdLej6HW=hh96ZxI!pT1^&T3nk{j0 zF1awDEdzNjGgezNL+ME^+f*`(@5xP9E1xIq37xdc@{iV&JqtLUcXtkI?48P&1$(tk zOx*|sc0Y`AHosoRbSs6S`q2VJuZA0gfWzh z@o`5?fqi#!7YJ<^q8U=CowYv&@(+DQ20sx})y-69%{LVrD0pI=&6sF;avq9NCNJh^ zSLwwB+J8V^9AaDMgpGpXGA(O_ySy=zSIvxqya}i3riXD~NuUcKo=UvGXux=O1)Xuu z$EfG^pMINQ)AJ^V{s6GRO{q6mc709H9XN^8P%lXBqQVGuWl#Hba&tj0eG_f9nDO(#Sn=8Zsu$ggJ?!X9oF%_O?$%KQZh2b z7mF%TiBDRQVq4?DJ%+q!*}U+lX(4xwf_6AY^m_I_aX4|zs3>T%wy2BK!s=>xg1_r_ zgzycApMB2ua~n@`5!4CCzXZziJUe?r#_r*sic6gQ-xqp{wXx%Gldo%g=&3d0=Eh}c zxHB^56`SbF)T<-p=H}b}zR=Jx3=R=83qSvu#|O4e1JN)a7|m_M2bW=OdI$3LXIE{^ z9@Z<_+(inNdAG3hxmsD*JFd}gMxt@IsP%bES-?AzbJKQ_F4%Kn`6Cv3b=bV){g-T= zKyezFA`$2-1qC)!vGkQQThp6)2B$R6euUd!1KY+vf^8bRi*&%QUr1X%g4$2nm^Fc! z?(>|J(07(j<4-Bu)$aLMFwwoiU$57fz6J)gZa1(=+~sPDtdNNw5Z%V-eE(>e--iEq zzqmcITv2`Z2zR<`>Y*>_GTYm^l7M4ddF^HBGwbM{!|LDk-_#^!j3~gItU2rt1nlqd zfF3bUls|WZ_}nn3xq7+u(9nI@xDo>gf+Cr?=8i&jcCXuur1&AiV8(XHqB`|4#G>O8v}~L4*vT z0JK4H?I&4$iHa4dE?a1fnp2kAK zub+`Z?>(HXa5DOe@_$}?jGbU*gmQXRjDHk=VQ!$wp-c?{`s_zga)Tm%?rz+SL<~^% z1zi!otDj<@yg5mDI)M0UZq`HF`g-={MX~9(j6)!r^{L*DCuN^2Pv4`)udWtVFZsy5 z*P(K+X;Gu2SK*^qlA~9PiAS%aSJWd<;=6aJBTuHg&ctUQ=sRz!J8!N#Z>U=c8b#Ed zRth^L01Uv$dq?|?)Q+(EtHlr8!_D3jvC_D-f7}B-2cfv`$22Bp?AXPSG0nF+p_WA- zdc7BKc}m+ob*KCsr}SB>SRKztq%C2>SdIpHe_5zn% zM|CO%a4|Ud(|i6?;tHZkE0g9~miBp)_Sv`ophkaGFKo$=4xv`9?x4otZzmGz6LA8> zvXQ1fj|+@V51$`gb6duZojyf2>_%`3WXpb355W^-EsP%2W#6NpH!FW_PB9FU0$^v0 za&-EU%-4_M8BEy2m(R_|-y|S`AYM5R+PHbSMg1+V$m>dh5l?O@r_m`d{UsqVt zc2(m(Zp%d&N`ta>;Q2~0J#6UiJG!4Y*4ApO1U_Z+f!JhiH09|*FaNZ6oRc^3XhALN z4p+4YTPA{DIp1$Yk~f&32V!tg1WZP~hyFf6LGGy`gzB;U=QIBIi4StG8wbVLSnw_F z`wbTKz&19@XAgnjKIaJv5*LI#C$6p&LdTx^!X&JM0EI+UgHpt6a zxXgG_c)BJ?_m-pRVVi(Ly(z+s_Y_i&7ebD2!S%Et4o%FF;@3r%*vTHN5D^6|jvSmA z_ax(}hq;FL zoR3!lJ#bn*k(y0h?~Az1Dv2-5NnOq)Q!?-O9aiX4bryo8H2AEpPgWRrcOGBgv3_N)Ty{J zQ1WAm>9)x=!6KF@?>q1@-oe<_R#hN_i#A@JC&N6UZ%k)sBZo}o9pjKZ zXI;57iZfl(=dzdW(N=^+&$!(4@Y0D0@S0c5f*dA?8K3z)(HNu%VSQx#w{>-UG_R;7 zp`WVG#lgJ5#o;7P1w^*g6c>dz@M>`ya)zVIVYAZf$k4@sxd|Nc7T9Y-O2T7v;=B<< zM5#~&DffGRb+zP9Th5gq_)ZU7c%k3flM?}-T0>)Gy|f31!D!0@2J6%B$IkLAmsd?Q zt{ z3r6G+ZAD!yIdQ+lzb}FOKLX`TM1Kj6FR}7JGq+y??_)>~QRCCh)l%Zx)zVJ2W3Of3 zf{nxUiMHx!2*H6w)7vOGWFra(th$QcUGvreF=c^(9P#TI{l8u+LpRQ>i^jz7?U8=g zIBneHv+G=FkeNx?hn0QC$F#;=W~9qpDSj^yl@9cUF4#%XQJZceQQ%(70j#=iHi4p8m4Pqg=cvVG9UBT z^|=dHx*&x$O&Qc}xl33%5dK=v6c-J;OKqKW*FJa2Mt{vJ86ZBkxM{tMbenPqysbZ{ zJWaaG;k)Y2I30^tMLVig9CzfiIp{8Ga@JT>WpXrCPibiq9TQk*-ubbwJ}YEg;wxi+ zeQ7Jkwx3YMOZ(ckpFy(f|1P>~5udj{;4#!szHW);DOE4J?SAer+DIq6;rD+H&2C7L zU&HqsTUPL+9_Qe;uR$w>rJ+LC1k9m8N2t;8XP1R_E7-!i?Tr+BiUOb9Ys{eUxYAv( ze#v`K^AWLq{)$uPDZ4+A=xc!ewBwX=^ci%a@Zbp}AXLL05%_z2V@Qf{Nc}2~BX-B? zdYrw+E9mT4*39RjAVOJ6%4D9aI`c=)2cd)d*QX8Q?1qhSALEqf75qekGVHooxsne=k$RM}yQ>EpOa z30P{U21-;`imNVNJFr&HX2ES#GKUOJb#UfqSMMPt=p_&Dh`&nsea0HtV39;2)U1YX z2}lMrUc#kjnX15kTQo!LMLE|eSb$#=RbnJ8>xDkSL@4mBWeSE)VB%dtNAsU#Bux!h z4wz(OSV0}^1*qd#g*5d>ub`X<()ef9v8_OHK(!mn*Ww}lXy4D%N9IL44=d<(>cBV; ziV5hv5v@h;LIe-i^!gb8cuhdV7jzDQEOWm$wj{#;qvJ1PF2NWu1RXM0xFey7f-frV zzh6qr8Atz9E?+tz;ot3!N*l8qoDN#15RZSu$&vm7f1OiANku$ zqy%R3ec&sWb)dztqdkr@q*LS&nog*CiFVfMkt=2`YGeI}4)S`O?93Mio03DQJDw*A zAE{8Z*}}p_YY}mhru(mg|MfB-Ku`DV?Jy^Qrm16ShspM;KABzPYvXB05%jXH5NJnu_ugIWUwb9Lb9Z2O zpfEr!?>FrXJ~6g_CxT+=b?ue?xLTg?tQv4W@X!idS0BtS%vyVS)wET%*Xm@yHMI01 zT2;Z{_Q(iF9@4Ez3Tsug{?8_#cnjKmB{mDd%7?EG6}$zG$% zDIv9zbDrC%N_pIG+Z>%+;_I7uUunyrlO7T}Y=3s@{H>Bz@}ox3>sl&!h0dI?1Jl}n zxz51aXvoH_w3FC!_yB=OpXCI%sPX3Ha#F`wt>&RE{Sq`VBV=`V(AK#&^`}=WUt4kn z$noE&f7S93x@~pB(w~>UBiTYy8B3B*{njuiKj#dIPb_m1EZXubn0@|Ta4AKhyKnJC zan*-XFSG4&1{RXxaAdoEe`;eO-u}gVsuwaftBkyKD-}OV(pL~iq|_#=t!R-=l&yMN z8yddV*Wa$xQ$=#ksi@Q+uDkL+&;@>**) z3)F2g&pyrT#M|*F+TvpywRI{cJ{q2_v}03mOo7yf;8%@+f_myti526AlmL(V#CaSy zk32GuJF7NiXrbVocTQh+(=$?>-;ev+m*<1Mo~sH-d#5{)R+J$t3WWM1T#+#T$h%Zs z{6tQ^v1!F!uGq4Nt?;+5y#_@Cx4?C=txdiUorA}An`iG^K4hJm;;i+L{|Eg=(`7&s z^@T{`#{Bk;<^LmnLdnFy*u+8E=*x!uf0AI5)PPPZix?j^rty;W9E?K#fob{@7=6Eq zNn%I>S&9tJ9ARe`|uM2U*<4++gj0mSwgl=2q1e77KRv`$scXdEw@iOIou_DU2eUQ8#v! zZJHu-z(Nj8Da7A0h!u0w<(YF?jGok*`+Q}X4Z||2b+sCxvT93b3`CPrFP6Msplr+l zjiw6nu(l2)A1*Wd;w(`{lxZc$;xJiKoceFoBI0i2@Q5W964W!DPV)k2SDlWGR#R3n zL(}=5WO|la%+v6Cvto#5ro_;Zmd$^152Eq7)VTdObQpQ&g)|Eop7wFjaZ5XS;nc#Hmiw+p)Xca zrfkqenzLMuX1P7g^OQs_$VY4CTwZjKX*anr&K@xc3ohs{UqVXn2dvGJuQ39fn=uxg zG@z9sv6PtfGJb~ydU8^y7+rqzh+R(Q%5-m(cDJjnC6ckF!oE0LCJ41GmyLmDYd(P$ z#7MEQxyjvHL_@f!po5A4&45h;EQaXvP;85B%{PtAeG!)Q$V$%4tTvb(ZkB;$a>VNe zNf}3IFgXINN?Elo^u03;7FFS7LfP=Ih^!*uWqWsux$~%4@QFfUr8mO~YYge)ej+Xn zw#*bzz1bZh7Lt=RaM1$Vp_NS?j3~MPOQ+LlECc+kPkul~6_lI_6Jh=Zkl@`DYO2p? z&(18&4{-UTWZ^z0iR7d~L}HXK!!a6KHjtir4Esoh$W%P)Tlf|e0@xL~IBL|% zTb(eB1PN3y$yEgChN(jP{KaB>qR$0F<_I_WrCith$r~2I2(Vtm$>EgtN|~CaYtJiW z0tD*O%;Npj>_Y@SCVS5Oi;;gpauftOyY!iE2BMRL9ZOm}&I_oO3qX@HZr7xc0z-HZ zU<%xDlG)N#yl_m#)Ux_~bWxy1J!L#?+oa3@Vh0svwRk&>0NYGZ3-42!U(UWYWBT!46ibDR7-51}s*kCV8WhWdb&0@uf!zGrgfa7iw4EO-%vc(XtyhKW zt2tLe#plEc0=e>0a+v=w02FB~v?`-)3N@8WTuM4Y!M`A)2JLv|CPr^WDk-4Je;8o^ z2|)lYDb%KEYKXgt1hq*slrVM96!q4cZ7^v*Y}DdFmP!f~m-|oGk7qiV436uhOx`@Q zi$bZ@gB$MFOe~83(7571tR|ECz9UwwP6?8IYAC5>1PONn7dkXD`ymF7Ro}{Y*_Z>a zG6nxBnj4L9<`*yBl~wpT7~iEY^(FsAar4A}A3PSc5=CVaH&EB%^YrV2As&%nmBbL@>!T9a|GyI9ThnPgLH*2KP4iZXixgp6PTL` zyvCHAoNGrcKZU}>JK0BOX{Ygi}M=Guzd$s)+^j>v0CAARTp~_DDjN)WiXZO z_8MJ36bR1$rnP!|m@*9O`$&0Ip?}CGS&6;7dPuFr+JFa|<7jY0$l_V2X4iA1NHi?tqj%agxPOhvFy;A+*vr*gbaD?VUb4-Qz=D|>BSk; zyn=y-+8AVmS|~ySpEkYL5;r@9JxEslatMZ4o`i!JZyJwWAscvUrKpBjRo=;kT8V@X zKL!3&(1cOPu-Ml3KcSdKfU#Z|G0P7$RzQ6h@CVAEl#2jeN}a5J{;Lh|kqPXr%Q>V> zpKaJ%Ubm-?gy{=}dnEK7X_=!M{qL7zu$K-8908p!xvJA0{?_T5)F#_=EoaNMDcIuw*|HjQ|TYmRYR1$xa6P?NwCH2`cPN$-O-| zGCsSIU0;PkUFEu*!o!}E((=5LRfSk=!TPS{c-OWpq3IdH)ylWuSiqbT83tzlLwK8a z4qFDa!T?}gilteafeEIyi<(cU?b=mRXzA=?D9I{DqeE3o@u6zanvxZJO|X=%8~?h} zzppa`;tp^B7OArdqS_1y@gA14_tryhOe=_E6x~gc0(fOHpm;?a)ZA$Z2tyD zq55AL ztmdV3DHZj0E~6f>^VheD@g|&x%=k<=q3edssX2>MH7&7U*fW7{QQg66wvRcq*Il&W z<0qap#i9=rkr5|E+i88m_ffv{r|hafuHlQjs(|2SHxbT38IOK0LY5K1Ik3k0f7GTr zrGVqrZ{wYZok~fT`o&f8(wkYyKe4j2m~E-fg4x!axgx}S+1HiaNUqSeOoE;-S)DpX zAg{719-*@~(BdmM+9yXl*Hwi^jOyC@U0QQ6jREik$>&43@ZLqX$i-1cim%uZ6yDUo zREGH2S9zl6T%eSohZI~^E-77Qoj6M)B$+7LkbU|S9$Ge@t|Y)$8r2_yz3*}PFAa{) zsnJDpBU-7rI(m@RkMm8n1W1^REC*dA&&Zns;XyX8SoPxxbA z(L6a-wY*-vdB@{Oo*7zj9ZO>3{-?!F?lSyp* zQ5@d3Dhjzlay;MM4O6Nduv#gE=y#&Nx{5ZvdY(QK>fW)WAG@i#J{8nI4KIyjr8~DfaEXSC;fDF2$#WRPkiXj6^eIs=e z4%*3b&(&eO!NOCOd~=)DCfWla;l!c?quzXpggXfzE1{TPGoQ7RtHhS6Dj9yCe^^Fu z81aN^QpT~CkD#j8Vka`;tSes)P;_-hd8!+9JUe zKFIe_Vb(N`l(`)U@J1EB*Msl>9m^R@dVD%T{O#L_;J0sd{~x>i|7%}A>EW)gB6{nq z>e~HiN}gcs&=L3>?UGbxWboI28$V|BIniulW#avQIOv;_{J=u~Gw`a7f`S%D)*e1a z{9V+qX4pqZr$)zCM{W7;RjcMfeOX7%XYqYYCKzSl{oTj+jigI$v!<=B{Zx5T^=gtu zfZqZC8{D-iMW(Qw5LZ6@5wRn&_-Dm&nfXX?zn`4DD;ML}Pt7eV4TJqHD#Nhn z@1&mZKD;LS`S|I-+ZV}J1(m_S$ECxKWs*_|Z#B~W{?*43=eX;nhVhv+q;%Z77!aM) zl=;Lrbr(WQbot#fOMp#4c8o9DsZk=@sR1B*>}dCR20bOHc$3l&goKpc+uom$@P`d? zx6D#VxO5Dnx6ESTsHDn$1pKQWSbFRTG{nq5-f5`$ zYp+oaR7hp}Ht40C@g8_>h42Z#qFa8EQ;%Xuv(X_dPyiS76k9EVP$0ya@XxTKiZ`s+ zyVEyBn!7P!*(OAq;r}>+0SUO}8MwfTUv^BwR;4Dg`kL0c)gHy&{C|6r(Ur|4S1T2R zo}tF2OQy85-Uf|jqLr6}HfOwW7`@beCS&j*Ka{#Iv>au79DNF1>Oxc&!pwq|R zlbpYUriQ3}H@$q7tE|?uNK};Z{$OisE~@7o*Hl#9tG(O-o&xezdxwHM*glH&bE#}S zRx8s?R6l})1<|Z!E3DP$WnSg}nSLj8fQrWW?pq3?5_EVd$Mv26ZHTEs77($xa@xaf z$xgX=L%UjLMn?sJG)g>}6YL*TK=dbWSMAnaY%MP8P;^O3q@@DrM9~0#K>il4u(Yy? zMN@(CcXIq;k#$&j)<7A`8rkHq9zIyAU63d|^_!=U#dD!NBmIqTFzTTYa_@Y0)6{~> zSd-AIoJ7&V2UU<}tp0_KD#%H{ly6#-IA@060;)2cTxbnMgMG^pBt@IW`M$VlLidmq z)tDL9I2)hS7&cf|$!Tim`t!iqfhm88sBqNKKkNLs-lfr4)6hhk5+(Dh2AFISp2mQYlDT+sKBeziv=}Q$%;GY9V59JaaEGJH*371EhlrR^+&C*RNCcNynYxQC zIr+;HbG(T*ndA2+&+-Brj5S>wZQ3E6o`<)!PSya29L2@5MxV8>HPYhJVcGKmyM}64 z2l~jkf;$d5L;s=4k4e?04yx@o$!O+LtzybiEz%6OdJTp$4@oF84BA*|b1NGq8VhqI z$q^_>)hNWpM)D;Rcg^3f5$N+IC7HyprXyXJlB#HjKNpu^Fge&~b`DC5Qr0^gpHdmc zN73Um8Vh-J8e-9j;(6dCM~S(_Lyw~1k+V%a6X~n8$aKmjLFiKARW^kc^GYSc?!1Uv zHA7#mtOS^>Ra5dy2Y%4u-c#l2f{T_QKz>8`Vh*bof~=}cxos&p!Nu^LVsNZQR9eu* z@*xUQiM|Hh5(p)U?^KUgS(vj3T{4v}b|>9YilRjV>F*%oz=UMhmU9JZUF>Oxfob**N$g?C-PBsUo%}fWJ_R zbGbrLEFHxOK0x~z8M@ye-8dZY>=Z&ZZ*2$~m3$Em!#>E)4bLoFFm!=u<6|Y&@CfO^YaME~1 zc^I0M5^f~#33zyC5FgMuDOCyjh-E8rs;FFvl;<=*%0_A^JEvTrhF8kDUsH?qMJKA6 z!y!}?zexnSF5$M0MOD;I^?0~bj7GH%MPV5v z;00hi^jBP`X?X1 z>8JbY-M*Q*p*jGhI2R>xSVj=_-L7!?~%o*@|Nm$KAFTrFD%fET-luYg1iSfu!)%-(}N*S>w3>Q2Y1q zdQ0dU$Bcf*FI!>kdlr^IQVc$r!Q`(22k;hVi}<36RLUi?>1vu?Uf@EIiSjXh4!g6` za|cLyy4Xfq*@We2mai0FzF0FUQIZn?trCb#4MShoAZyksLop`o=iuKEM{DEt?SiPF}vjwNO2o{;=E+IN;Z=H2s~Km8uO}e)zvy0c=7Hl z@u+D76^10^;TH~3Sz7kWz-nJ>PJ!@}qr!;yCTG-d)cg5ATqZh;C1jKO3k zOa#*({z9Kp?zyfF6{Xp?>BU1$0928)LzP7*p-ehex$4*DN=0|WsZ};-)6#q>_rAJ3 zui5jmafZ}3iKEe|-9|d{1$BJ--OBPJY`9$fBSpU&k$m3gP{UihqINYxWheRAlJYh^ z^X-%hPkBL{s(+f2RgygxzyHpsc%xkZtc8?PN%C^dC4B1nzN#Rr52sFh3Cdv7h*U_dCYIPWKCr6hR%$`$9271PlE_2r8^?W}?lP1Z4F&{9g|jJ^Ni{;`fnSB9;R#< zVNPWfN=Q_cw=kkorXY?s1EN$$_4J3$EgO~1nQl2D4#mQVus9~rpQFoD?x_CiQmeB8 z{-pzyx6fh%q}F1`?Vjs9$GoU?COM)eoOBZjwc`ds63Eht##oh#9@ngV=!cT(n%;{UdHi$WY4sc*k9%y~PX2R^g^oOEB+g!H7-uUS zf9t!2&T$%S9V3lpcIybQJ&KZ4vPuJ=JifM!qodNBrn=c=!1fGh)a5^ZAMCk9<9pvX zp%G5FEdt{MqQ}*XeT@D3(d&KpJVwzYn`_eyf0?Vh^nCyG1vuRG7D@frGUSdljD0WN z)4O}sPX2B3;Ck8OL`E=z1>}`QmTs6s%rWEr!Xs5QqIGRuy8$0<^@;d}LUA^|vi$zE z8#f7UZ1zz04XY}jtSxED-S7E%mnMCYa$&ktVu`Ci+fg$y)rW;O&p%F~V#NTb;;ADf z@0bd_X)<-jaI^E04J;M|!u1n|^^b7%wxsU!WC!voXipqy*DWabws~7Rf&QI=HQvUr zM#k?Hqc+pAgIoV;y$7A&!)l!J`I<;WXGgWc zM%6!UjxV=B#s`I5c>Cd**so|q$ZXsf>m`nS*cbvdEc2p2xdsO(BB{Af$hK5A$E!TN zu(@ivm(zoaHHX`j{>l5LQ!0~5%`zoaV=7I_UJCuQ&uPS5|pp}Ai8ykLFr)1GL)V| z*1Nk&KzFKj=dyW&Wi@pdqJC)?b17kRMOq*i#k~E)x0H3D zV_e~n&q}O`J!{T*5K&Lz+$Gz#W$bAw2O>?hLW}@hZ<4bVY1fz-?PenTtjZV7C~`Aj0a*KIjS&yZe_vS({8%X^Yzf0h6YOCXS)DeSNQ*X| z@uHtd9JU#s1$q9`|5}Z%T5)N!OM{m!D(=z7`N6z(kM>>mU$sMId)OXoS&S^z|r$Te}m9K0l# zD^y;Yw(gL0_F(MNuvPO%<&ec`H>Fl_)lTX%L|+MkmUog6B*m5s1f_vIMHm{SNxtsV zRp8AAehjc)pL}uZ0i#97s`;ZIE>mDSFYkSY(ToB4%;K?;c-|&?1*wCAybtm9D-m4y=&-Maz*EsMQ%XN>B0Pd@Q z{{~z!B=ErP8C4F|nTYj)eAEYHEf~)*jCUs(Y9|b-8`;1M&FscGc2J8MbQd804v})B zCvS`yc0S&9CsPpN5~ zTRtG!fV3L$wf* zu2y1CYvcoi4VJAMfw(8@Iv~-d`&Ly?%;mj$eF z+z)#{%|PP7y1+=LlimH8*M#R}&}S*Jy-6riz)4&kUdRoH8FQ}*!T?tszuzQI^fgY& zvsDqoE(g{(*(v+pZ{3d^hZ10J*PjqK{j7Ch`M%VSD8#mL<7&nfU~)0Y6gT+Hb-?|( z?FHM%_8I%dyfYYx_XQv(`1O^(&XJFF6#8aZAJX`sT`4A6Av>rb*nsMRhACD~TyO@@ zWg-NBRSe)t=l_F@8SE)S@Dh|kcgs2P;A_U3_OmgQC>Uu?A(g~Ns9!+b=Fry&Kvd{< z*N?oXC60R-Q8#EUrxc9X~`$7&gvUP z*AwEBaUoEtj5Kc0SSNEQCO+IaYTPU^%I}wP#=e37@-SIUxq&{otg`HrQ0LaU&Z#51oMF%Y16D{#L(9+yt*CGLap+p zup$!4(HmA~;XkSsW1n98tm~XxLLX4lKDB_^Cj;@r;5OH^q=f#{wqb1nQ;5M*yAzlY z6ZQSx6F>%L8-c}?uTCS~Bc{i%qS39Id&r7bZZs;zud&gs+bcdnIsGw`%R9Z%Em*QZ z+lF67&eVt|j@kx%EkAW6rG@p8#3Z=BRA4$9<4m>LQ^&|6O#RY-1wN0m659KP^jSc~ z=J5Qf-*qU%p&J77rhADZSD0z;#iS>{x-h-^%F|+ujYlN+OVR!P_|`v_CTAyu^etTS zAL6cKsY#DRUxj;&4vlq`vZysWC%L$SnhCX_L72Sh6t-TS0J1 zzic{O3j?8Mlf1Qw!2VCwb&hJ}EqU3kk=FqaP85&i1C6Q-Em@YNRqU=*l^RdEg>rcn zlD+|bswDD&Gie@Ll;$zhg$21ek_F2+N=B!4TMT@d&-Qq2m@}E`rluyDgc*Z<`8uZ~r zyqSZK#9--vQQFZ!tT9`g56Z}qr*d-YRK;7H^|%nJt4Gwt{hRP^FO1*V(5}moQd=UI z#ZTrf1*F#TY6B5W{vd(vbG|R*Sx&!I9LJJ6$IV@zis8<4@D>#^gyq zVKj@%cUqNC45%lcPt~)n(cJvxl+VrD$J3UcqDI|=qX6Mp7Z7$wzo6uY{Z;BmC_ z-L_YyH;7=HNg5HSu?<-RH!4qp2VBDed(^&Z zyoI=c-7`!1lc*4`Vn-)$yl4!?hiut^mN{FBp2_sfhcji01Des&)dZbBWZI5sYv%8u zLo3K*y@V679s+U`rBke8#b~BcmRoI!poO%udW8J~`b46dYH<_m`-)xA#|ncK)y!j8o#sur5Nxq7W#`8qM1*-o()P(oj#jd>BVEPA zqYeC2x+XIFshvm4qaz?=_U@35wSUyZK#Y; zM$LY77v+#6%Pnzffl6>2`ghLJn7oJlfUJo1T@|HQDyDWw_PACmj?XQxyZ{G&Kq8=+?u!q5U_I{Wp^RHx|H? zGvEmpXNoAI;6esxG%uL;qRlN@5Rq-Yi8(?5`JTqV&YVdU(HAy*ZPE$X7qZr>4z1Uy zNdLgSJ!ZpqZSw|S_MXT%FkI|{38Qp3!fFlrhM#i1&Iu{s2{hjsvGL)SIe|?APc4+SNde7g+5c(C?o|qC(%YF@ZtRt@e1JD(Lk{@y0mG?K*u9%+)QGn>HD~jng02n3 zDzpiVMCoTLDq^U)V5F%pmX|l@!!b|dq^k+UYzSGN63>iNrZDBCxgeVC3k}UdkqIeN zaGD>3K45g9#E;Cb0Qi^65TWg!wmvN%xyuXoq73-K+y@eWr^-EG)gR+W)h&56m;Y?{ zoIM*9c-H~bjiBbmV|nMjmM}Xy?+2=Q2;UIOL?zEOur|q|Fa$u>P=p>-bNiB^YLE}`-e%iLOn@z z6Cqk;mhh*!b~4;J>^wtRtFFj%^UMhcDp-vPEh;oTpF}+2n`b!jd(NLe;Fd_=^Y_(; z`GEez>Lx4uOdv+?@PhicQjlu2>mm&GA?}zlnND9gzZs_Y$j`f2-n-bCa%t;eKcdii zeh9T^-MjFA%rSK#Jl&9V&rsz@86uHJB8Cm9jK^94$zEKCz12i5efZ56_xhAwh?;k- z_KaOP=;uqP<(Kf)OAHMepl2^oa=+jH?4XI;@(#tl+t!GNcJ6zJW1easkSRfPC z{o9xskuXzWBEO~3-&=6*9O5C-0GQF+h#UTZO#U+P$rn`p;e-X78|K=hggwM}oShls zVZwKot=WVF)BrHz1M1thcW1wJp`h8@vK!3L-Dj#myxqUEl0W+h7RJB&zY5QbVK|_H z`*k<8FAFl#8okA86ioFMn%Y&}vX;l!;(qtJk&eA$WiwWXCMBrem|hhM%cf2K9-&TY z{vLh~UsL_Mm2l1*H z%3J7yt0ePuxXpD5XlZ>|<&p1Sq*PCDblpycQ{2*#Xglv8`Amc}7{atWJ>IK>$t3!A z@6vm|cCj#;TdV`!c9d)d1^xk<63KgE7(da5?uArUK3EA=>iUI0c@J;7P9tB@b7pr* zsr|6i@1Be?zu@imt_P_;LG=fPLeHN^o$$Xx<4gJ$8Xjmb{^pDDeGxp~GVOtWViEw2 z7E%8p@{jbDn4J;d=zR)w4}8hYJTpE2`T`-o4;(yxm*O5)DqsZJ25YD@=GJzaLI*2@ zLzD}PcMS{T00hMWqRzz;98es#XiRT^qDHL3An%Z&Iaf&o_{3$44>QG-1L3b!DMx1_ zt1eZ#I!!f}elT!t90zE)1hr8_DfQH4z&oHG1XDc16jY#LuSo zA<@Ef34A+T{-gO(?3ORvc5!`Mm{|FyTxunOUmff8)|I5Zs$g^@lod6Z1xR2G z40mlF%#)AWu{UTRvC5ldOSj0IWEnBfn`ByG?HXUbIO}Y(k?f&*g&P5jbejvsPL`l5 zj>+4@^#9X$0?lJef`A@kTsRh7Val9C-B_TH5F|kcogT?wj{2g^1ouY;AtDh66knWF zpH>pUVTxggS!7a16Kr70uth&I5Ms(tfP%i?o(Z88IewFx2^NT=w$H(WxPwA@6Q7Ah z90R|{#sc1p#Afa3H44@MA{8CRt;hgiZNR~fqHNb^7`ALc zU_!+PVw&W;P+ z4*!+Fooeg2C5{np#ML$~kW2OB$0}Hf4DEKf9IZX9UDHlu&B2cy1zjJx9vw&EP=ngF zLvVStFbN6_1X$32-AYv{DFko8pH(6~bJ(Y(G<{a@bFy6j=CD1!f6V3wf@X?uMEE*? z%kP8az%n3fVe~QEshF9Z4EnLlVHseSAi;vd`wRP%g=y*;>dBN*A|W&(O@oS|Z3Ws* z3ML=B8?6TDbZ~MMftHgAdaeOWNWAS;76rSs8um=rQyE*8oR@o@U8RL;Ggc!=@M4~E zX_ZQ_bETm`S!YfA-_+Y~;0u9`FQXTT6nI_&Y9Ng6v`J$(n9&JNQ`zeTe7^k}=5%_$?57DykpPPsS@vz^jE+=Z}T zZcS?!WCy*H77fl{`*jQ`ZOY(9SeAYx*h6y{8bIwChs%YqE2x$dj{Hz1m-Q3u`mI9) zFJQtpe_ZV<%=PR!vx;mj9(f(4E5w?0w& zMFd>6GK+i2PZj(n+od08h-W{}2+su0z|Y9f(9hV;;LqsK@Xz?ppwFmfukU_u6_`gP z=gNA}uGg3+B#Vw4Qof~LXt@ZFi%>?S5@@=JkLSwDQhL(zR32s~ccpC=9SX=^X>7J| zu94M8q2g!M>(Fj4TKd;DzW%O$abJ0(`g_C42sF?KytM}-J0lVw@Cr&G<`=~?;U3vC z?CUWc_)5MewS2{LyiZv7HGOVsbNP5fH}RuwS9LJNz<+`L_bCBAPDgU?JG?pcdrDyZ zA4oA}6BkztF-HeC3op0-N^e%XR9bXG2?+4D<(k|ixGw)wZh%`={tOlgH!>6o0wro1 zN!(cz``yAaV0n#r9{2)74-!X57s`5;!oBY7G-;!JKDzRG+H##W*fi?v3xH;hz{WK% zC}a7>XZLq)%feM@#2@w^jmVrtY*zVM zEbHY&r?WL2#XB;G3;FSyfa@%kkN-c%6#o!JLe@y}PM6Q^hAXXRU`=Lpb}qeW=#V zhuB)TYv)cdLS?SjDRuVro_nYi3JuC;U^h0c@y$~aYpdU^OC?02e;X>idFvK=on3G9 zGb8wMRPNfui2NWb)z)E*Ws zPPr6FMj{GmCbi(+oo)yY*pf0tcCkms73WeEULam_JfI4ub4W@t6;W0#l@gx`+zd$h zLMhgXL?6lG1RFotEkLwrt2kbre`JoJ&SHuT$(o7`;Q>=~DN5qTdA%hmTbQJYxTHz| znx&d}zY=x#cpXBgCqpfP7;=iOp_aiHF#lqq5X2DG)%5AO!I1MtrjbN}Dx~OyVOxMp z#s7FrSz=q3_+FhrSB-h1pvAytUD1RJ?$^JN7j(2vP75VXl*ZG_zW;iFeQ`|O%^{sG zQ8QO`rmafcf2H+l?7_${yly94-W6pbxf3W)l=cm$I6NuS5x&hC+AbXuRWr2}DonWI z+I8+*2hn&3|L?T{n{!R5PXq!IsQJIF4VUlYu(bKFWb+!+ncG5E*@X53@Ng@ z8-(jbL|9c}c@)@C;Y5(+o5z;*t;946d{3_LGwJ5m5?#F(ton^tkY?SuDhL`uWj*Ce zO?&^9ry|`N-4YF3jZe0xot}=abqf5K_lMCuw&SU(EH*34nH*Ooq`><(XplWGi$b`3 zvzm+mH>Omx+@TgjClf-hRXGG7k?j6;L;VOuecRNvL&#}6B<}(yPC5RF$@-zlq4FWD zE8RK($yOrl)1GA1Z*`nle2Tm(fHGrW9l(ikR*f`c@?HaH_z03NcK=QkbHv#@X()!$ zA>Au#NRIMT7-)eONOLPi_leV1?(VVcoDWQ+`$Pz=1!{P;4B4u`LmJZGX3#kd z+oQErc@cif0{_wN{OU`8#*gBX?Un&fqd6wEiw)Z998;e4Fdawv)ZYnrXm1&# zYUp<2STL^#d^NV>?CGusdg!hOcdOcouhnh?{Dg<0Z+{I%sQcj%Cp|-Benmo45+y&E z4~!)%{S7lApOSjYhO6dg*RC zqUx%ip?Yb*6;Qh)o)n)3!=ASSQD4fp{_ny-A&qwwq2%X==r4d0MF8DxWc1g_m-M^* z@a!#o)R)Gs+~0kCdmN@Yw@8lrvGFg#s{Dt{a4^NSxL@aaUP~PJ4QV5Tcq|JDymo%8zs>G?D!I&K4r%h)QPVo_~PBbmS z&O@v6idySI2`nC)YimGr=Hc~!!6x@d}fk7l##uJ(^aVH7!6hQ`|lh1zqC)w!tETv zR<*Nw!__~~g%ZoZv;QSCTGT9)x4KEh*v?Q@vPz|}*e?^?Q$0VpGQ?{6tu>s_f|1<`J%U+>7Xu9(bP<9T*~W^e*Cj5N zAk4|IV}%zB(0xRsnksa*DIu7K0p}Z#qM78gY`OVk8=tFyt>$vR?-W_evJ=GSX(sF# z4<)96`5@$-KW@iJzR*09m5C}aheq}L2OT2BgLEhsDIOBXT5)LRxp4=LIf8!aYFdPD z_RoXvM2y|tAWZ{eB>Q>>1~wd8`!-Eoo<^-7g;IoZwcX475j*C*8j50%?q*z3rBjC% zilcdJxZc#Y{x(WCeSF7PW>ZBys3sDIRw3>+`B#!+i6&oAmZ8k$O{8lj2ndcfV#O)( z&U>#&pE`F2(<=54TwKtjL-q0x%sDRu zcw3+rJqtI=%7=WXt1O>d6+7V zA3?9O0=mSN?u?BQPcL4^N;RR<UG>q+* zyTYvprHb0-@~A3e%gc7b=bXZzr71r@2%OgW3Q-eWK8Lz(I5 zsaCNjS$>E9CJe9f)OuM$;8jy>>tX(cg&w=}{u+1TH6ul?`quBph2uRQC<>0q=UOdgwB|Rv zIES*Fngd}5yJiMCri3e^;GGMp7}2mtF@NsOB8A~ukBV~7m|*_%Nn{wMp)PNG$OpNM1Szlf6dWWGSjC}CMO zVCZmcit2j~OI_j7B}NlF!J}g`@TX)qm0(Xhy4)?iLtkqMxC(LD(jzCYV%?(cB@wiT zyY^~atIDN)kTQA}IdKY)cYP()Lc2ra1?nr$1KQ8MIVnqqVJ4lens1#PGfvcq{h~Fq zrClp80!eLy{gg=;#;WrR{e(}7y}5^+L9TQ8^&0ATKA=wYdDa6IZNT)AV{v=ZoeW&k$x$hvyDLmU-a$CL?PjC(=EP0;W#inC(~qeK(1||?#m424ZJe}3 zhkwCuElUkrn?<7|+F$mE{)VaY1EvF|ou-&;P9-Nai!frwg+9k{pijje&=$CZe0IDG zC5K8?qs3zHtb-jhu`OW2Z1j>aHHgd%BNiJmIB8?fl;r<;1^-Z&_y}@eZZ0`-#ea|_ zO9#S^_^|fMvZv75ma!w3%uJUDO$}VH5l^isliPP%x@zV?7f3Rw53ay{;1`C;i4K&O zQ++bzB?E1U{^8Oq;`JPnrvGKy`qY~I6Z=?#p=eEDIBeB%&qFO2twS1(G3z=C4-42> z)mvf3k{r*2N9;OM2(8hJ#?HE;jA4W=GOOxP;c0L1T^i}o88LojsI4L=x4u5h*jg^g z^3F0K%+5HojoT`8GDrkz4Cz9slXbUgu{+_(^3bNy8IP9ujUg z7s1?V_9!1kQF5h1K3{W0o!*;^q6Kg!;fAub@I0)d9G8cN2`Xk`oqXIck^ zagq*<3R)tGWsJJy3fk;vRW%>lp7GKJ?(3hj#0#|x8PD`O`je&msRyY6s;9f_K@`jW zsig?YCkQU88?w^wT#~%XP{~NCBB_cVt~TNk@y%CJG^^+A+ioOr%#KVhQT(g4R<*Ys z1teN(E~x|Atf3f6q6;#PlbjIgdFt2<3x8$vQ~qu;jL8a?TZLy_k1I8Nmb9 z&A6FSmT*}23&`NN7a4@ykYx`Xs+NWd9_lr$Ii{toqWabQc>3YLtW^JQc$JnO(vg?2 z%Bo4aYH=_wrm{?|UxyycEOP~6$yJ^(vvSN$et}cLl2zf zZiieqRCFXQ$-2T{z8=9PNCTgEe1eY#2&R#`|nNb}}OEFUED>%W#(EW&o9u1ky6 zxu?JI2vB@ao^iP-7N0iV8HWa{j}3K{^Bq3w*~EO^Zr>@9$+%*iCwEa7am!ezzF$el z+Irdk3U+|D9#ymotLYZF#Pk3@(ZK2M^7d+A$QNGDBlR>WIj(VCP zKQqeniRya3+DJ)L2k^evAcNW5djiqF&^rgOpL_c8&W0Q!&O%cqbCZcGJ{kt_Ty(R= zs21kEjs)5}WnP1maGs8z_Vm{=sn3u8yntEQ8LlQs0_!lkwol`jNNlbjF4t_l-Nr0) z!=)lNc*+`Pb&QOC>SuXq7v^JcNvZ9>vuix@jMRwOf37MVo4K#vw&=aEh|3evIa5`4qt>O+6qyVW00pD}a{h*v&Z z*z^9OvLHRlk+AE@O>rr`uSx7?K9dQR9dJMXeqT!Psa8VX|2Oc9=ona-nm!`fFsWq* zTX)L$ZW2u`Ewb*&e@>8id{JA!A%`ZYsj3jRt-Jf{Dpq~f9aJ{SM2X#Q~5zu=T zmakm6x3CYMqz%bq1?|PCw;`d++n@8ic8B)a@g`JEGTl?wdF}m=F`^vGb|bGCMy8-2-}G6>c{o_Ttn7jiM4Oqj zV+7`9Mq3W(o$~4}^eyhU5(r4+{q(fzkQ)&MP7tDTPVWJ2*Y@PNJ z=_|Ztk1#l9hz7prL)HoEtERv)q1Ym`_L;Rs9QAq@-i;y5NP3A;_@*biP0;y4Bt5FoGQDv)9W~ospt5Fy!soEy9;v%!u zCbQ-uv)CrH>LRn8BEcP%S=S|M?z5Np&RG>ErzPqQcaAP*C<%M!aR{oBJum#5VdF+b zjG;YW&P3u6T25vTs71TIP#pQTAapZjJ8(*tOcQWwo}etnJ#%X2N!V20pmml^GjIz< z<63l@gaLm1Oq7rpPUU?FEN+m-D4ZNqPecz8b4(U(YfnUX5OeIA+I?69a#Lj+&m&%t z#yA{?#x6;opj#GgJ8*9n?FB`4UZ}DS12X~;op`lqXINE)$N|+Z+eGy8Xpt5~hL`~t zeC>U4z0;f#y0Ypjv-%MzMOUygz92SJr&7cmOz=L$r6Cey@D`Ri`)}J)Tl+sdun@WZ z>nz$<;D{{N%|WF&p>}_GppMssxuH<;BS-!WL#^<&w39;N+Z(GP%(MhukM8l~bMM;x z#O4ly&+V5`+ynO1^FU>+-IPGRgX8y3{R*@m6k^>YX0sFLb$E-K_vnaol|Xx6q#nYWw7bezI4*_GBDX>N!IK>6?C;UKI6AlBg2_Bac>2`&2xnW3*Ji0p@2Fw>QF zAkBg5wZD8#C@(@5O@yBJ1E#DY9ll#$Lg?>f7?a|-j`2EO>a2(onQumX6yHF7?!G^P7rkn6` zqg9)$nHoW`V39p?d!Vr@sKB|4yr?1=VmM;*%DLlxR1+Km zoyg#xqjXNJBL3Sh2{hIsMRHEtQ(pBW_^TT}Xu!b@zy#>8dUG%QGb1?a#FFZA7-6Z^ zBslLR9_>If%RBeZ+4I4_H^~1p`wtPT)7LD?ms`;V8+dz_#XW2gowD6@3-P3yb5%Ql zzHP$b;W&c!q`^JtkDhlJzc2qZ=+*d!n{yO^F1MXewhlHk?R1b6i@?B@9AC0mzyWoU z08aDGieK1q@P4V?NnTc)453 zi{*~Vv7jU{95bGO%Kq47(5YR5KPA&yF*QjjG&!kw3YI>~GKt)EqMoe`fxP69-45b! zDN3=YZ8Aw&DTXGwLt3;*{6vT}*dfy2!)r*Q@N!U060e5u* z`-^|h3*}!bIg}z^wqT8YV-7bp&X6sglC>sFTe_*W-msnFFNXjA3bLhqG2u)YTEJ85 ze}f-t>KV`XHbVI4=vXM?T4!0hE7gWN&~Wk6tlB=e6v%y>vVrd(b^#Sp_dD5?4HlVvVqjo z1(;_8->~?`o?^1K&{j)yJakPemsI)bmHl3vNG!?sz-EzffRi4VfAo2MACXQDCK)$H z?yP3F$E96iY&0M3$T~gs2=Y=5Ob6LuW~O&c0sc>eR~j$u%J?ll_x==&F{X{ ztqZSq;TiiJ&xADLh+D9Nx@jou!ffmPJm%mkIKO@{!*Bs`wjjK{7}o)i%$Q7}rrnV% zkEYtf^Q~}!F#n#(BY{fB#9Wxw;*J9*!z_fnae>>n`Y{K{LA`w~qWgIi{65_JTxc)Uouv$=5cMTSne$@-z8l-2^7$m;?Me=YI z%zKs4W`%asZ|IeH9#Ij{e{%Ef{unXkOtb@?Kw>^n)aC@;_8x@zj$$3#Bd{ZF9Z1o{ z8N0=Ne&1o4`A>xNk(0Z5I<+-DNGe8vCofb+o%J0jD|N?h)Po z<`C4YP~Xrb+x<(wEXayu~ zSpcse65cK3T|D-_svj(45y2sxA7<;mtrKA{?9+i>Glb(Hsb56*k-&uOr%2wN;1LUP zVwoSr*GR%X+j}biA&k!r+g;);Eigc&^_BAV#+Cu#=!8Wyye>N6vJX%TgH}Sv%OmwM zQGOV4FGQ}z_IEBCW99#=dLrTMO^}|r+_h(;9mH1tcOYOc!S9$Ndg>`89BVHB3W06jzL_51^O|2Zvp<3oDcuD9p5J4GP3>o`J#)jKwKW)daE&w@ zMh`ZwE?h^<@ZTNCg#K|`vB7&q>l%EdVk|PyS$XNh5<&Ymma`sX6h&kgeYmAo>P8MF zYYrUAPXAC!%{^i)xZ!CEpjbdyhe*aSc;@sF!U$Lp!c_}-L}NppO)=!LicBiULb6Q3 zQlr7NX{i8sEU+_ZqhdXoaHuSZy5bED#`iX)K7(Fn16y;Zl&XH)?!7(xc?t04;gWG_ zjInr3g`#vD#xy+wky%@%di>f00M#4X;=Qoe;87H)13MD~XYGQf3#1#>ZoK9c|GPAe z;t+wGpY%_$%)Tyhd8<=-t8sZrma{ZP$B0eG3TNYa#?9Rpt=-clv!(iA@QXir7JsemqpkbB~+U5GIR#FOli$EdmWkl zlx4hk65qYNKFe_PcsM;z-k2-uwn3npu48mrL2}u3po_!>Iy4jYf98r+H6hRrl>ZpT zq%eSzI8RGGg^M_BLKr`&c=~yBXEdpuylcV0+28%n`CQ((7nCKbj^lxjz;tq*t$*?8 z?Df))_$dKOKDzBw0q;rZpW^gHTrLW@PmO9 z$FPjV%B1JqNWp>ezhOtqy!6Nu$o2l~Mv#)3!45mLNUQxjr9GKy;OwShUf)Q@`&KPg z41?fT*~XrlVs?UE$PNUNO-NwdKp>6KCxg!7aZ)MMFGHZHOIr+0rUAmiFeQ@0o89D% zj2r$d84~f(tmeU36k}u%x(ZAWm#9Zoa-&OaW=?c`m%-L|&NJ5+g%0_scO&@j` zin}m2qWbIq>r+21o27JqGaO8i|Ff5;nzy~Fqn)~mshtIdgoB%l_kV&MxhZ-|OTrkV zUrlYIv@WRX<{}cQ4oM!j;rikx5{scH;Ne3z?0WEejho4>I8W!#i0q6w904Fg(Vk}A zf;h7X^g8ZlLm93!Q#o1pd|z4KpC7kuAP3sY4agmu&4bD;(Q0rb>cz%zW>Kfz%m;uR ztiQ3*P2AL)v-FwDPC=yT8uY_|rsjIuXRe*9ram}qX^{j1?XwF?hKf{4+b>y}e~Y-w z@*gT*grka?mh>kwYMN;w{l!)7_2nw+bI_)_r$M7#DMVLiFno;e9;?wH z8a`Lq)5GVF-I~))#^LgAxImixP#0i3croOkWG<+~u-n`@0PV04-3YqYe(-yGwJbRa zXBBJ4=kD&F5>tvjPpN1>jIzu@!$j89BG1?uPc;bqQJR&C60)EDS*H30i!Il)RAS8L zwpEoUd}1ffAwh`vk-1b)EC5%^E^ii|8~}|XgUvAoOb$nK`^g> z9DBTYe~0Vypx=bebC+;KLGMYx6&-&6!XL8pu#l~39TNg3aL+Rjvz?TuM?0rwTb2)1 zETguNQOHK#DdVBqfcf zl-Nlrxhd^Psup7UpduSH|GTna*_fmJ=_o72JYr7t5z-%+VLeD+`HIK8(?6v5x_!+Y z^~5cT+r)?ItbP}Hf|JCGi-_tgDmh9kJ7Jw!m>Me%Z8IKNI1`wlIb>6MNIZ?^rbn1s zpZ3FgY0fAUx*+jGxXh2DL@woZ@K(mb_gW}pL0HtIlXpJ~9iP|u-kwIOPlnlsnja`Qof)Aw2yrnHIO6a>dW@%X~ ziu14oEF3k9@%Hv*i>J+ImweQ9XEC3!3VnU9Ozb%Kw8r3(3f!h9DdHhw22@tSPK)e=Q>t$LO+RDAS+@17? zzzl9=>eP>T(I?^fo!1QCyvw|lo0k=@r}5{MA0J83>FCaldCJXGoRgwdv{ANaFk}OQz^n&yQpYJ3=aQi#0DSVx#r|pel{U~Q!~NHSQuxq@ z+^{ArfXg0p0in6}@$aG@q{E?=+Kgy{henUaGXINyHWKAQw*!+mBKJ{AF-~X%hxz|u z>>YzMiN5vGi6^!-v29~w+x8pVnAmS@CllMYF|lpi&dsmxseA6Z|GHJ@!|v|&p{u%k z*R%Ipz1FiH1T}7(qdPWuc=(D@D!%hrLyDvsGGT9M&y21)TjK- z0n8gRhnLuJhRC}Oi#W#PD`_n_`?S8dI^UM{J1 z<_G`a6F>H#@!@bBcCN^ShMwF7q?`dT2u?v=YDK|~vmvl*VXlrrg=-_+6x)6%AJ#!s z#CcqR_Ki>Si*pz#=_U6XXc>|>`2%dsq#B)xfJ;0>y2HdidMV<_V`dyd4&-ME+s*1~ zozX7Pc2UAXqsdd4KEVxHV(ht+Yc|fT5w7DmzqFj=51s>TQzR-AdFP>T_)5$&cOQs` ztwudAQ))2~MLKGwfAS?=J7}TaTv$JPq57A6`8bPwq&SE#K(OAC(ozV?_l04pVk$Ov zG8;v)iUlGU+?Zlzix?mbY5xAF+l>L887gp^lM|S;mMs!HRz!)bxaWfh#7VI?cPgRA zY4Zf}BG%IsKkmz*d?1|&JHg=q@S-u{?-d%Y&ksrK=VPg?BMm;>F>fwdPkiq|C~#2v zz3DWRxF#*$G6N0(XM(1c8S1E zWa9j({fDJE@_aISuI+4Y#7lb}pX!pHXjMg|Aw0|#Ad(Rg#*U6`Lrv^yhde_kD#F1N#(YX9^81!& zq_cZUQQme>8X^=NRW(C#gDQV>w8dbE3xvIer)+rPotek6jiw8i?TgJlR; zwAi=vG3n;9WHU9*#^Bf!ua;A!f}AY|rj>L>=V{yzR!X|u|j z9I7IkZYTmiH=F`Jgh=^zG@vz+csDrG2ps~}hmz>VK?@R#wlYnQ>G@dx`55t;nACuk ziT_P;$fc;TQY%0)R6?E(`fp1a{nq509T3H=_%0le&PlknxI?*<(OIvXmfb(mYhIq@-MST&~b{F(U^;+8+C2j zh1O}@i-`hBVvWaRj*ct2M{2L^#iXf*kVJ22BDL10{`e9d_C+I_v?*P#vbcP$Rdm-C zqmm=pxGk6kI^oEFX*OJUj;Y=jB9ARjOS>RLp&th1t0Svk;QrJ-Kob9h zS!%l!h}`NEV(PyM$ss)K)UnNGRprG^tTDqBCOyA-9RL%><{*B2Z1)9P8~LNmb5hV- zH1bHLy0p~BUx);m>xkw0Vq}(|WY+#sQ%&t~Vk&5kBWmC)S{r+(TN(*; zr+VYB0Uy5&-#=ciu?{p&nS@I;>x0i|%(#5P&*w=Yt*@Pb3DsLq4?uPL8FPdtpFIz* zz0_#D#bTzJT|u{y6R$BFm?MBWJyR8w=JL6pf@{#AIc0DkBH-M4v%(yTZ>=E!A!f1h z5_B=_jUHKfQM6|JjGxRn!9r_39r!a5*@(OpihCxHl#LIbx0MX5L{%g`Cm&xchdge7L5r5#UOzGHJQgbU>ykui4$y>%V}C6h|Mu?m`JsPyl`A@W|{QqF>zamZ*ZRI&Zw9n+^zwkmeI)C%?bs7$46@*kG zD20(TbHc@$jvPW8T? z{VBFYyRo^@6yddg{bl3eu|k~C(-y;XJW41IGR!aO9e+w}JatKf+C};P*Jtri5qLzzc-W|hN?dPzlsI+rjm8ivI*t3-5A<>kokQ?;%4Zim}O7#Cf9C zaHO5(2>kKmXZ?NSl?)OYe=ybggFyz`i=py}=n+4YR5DkVo?Kz&loc2&Mo8x%m65y? zY&cLYYKGo}#I>k|dULYrivI;3Lyu7sleQy~!wEV62?HXHan5AqZonDBK;j1F8>A|= zNM-)KN{yTjaiH5y>2q1nbqZz|)}oxYRf6vGXOCbSGt9hae33`Gy--6Q3g9%lMIRd{ zarO!E#QN*06!CME2jpge;eUc;_z91A9{k6Tgl~Nnw*L)C932fk{ttYpX)EKJV)?Q| zub9;1Nn5JhlpYEGLDQ-YNyb1TO$@*Rr^%;30hLbJaCVyuT>60CoG%BmB*RwQTk}RK zciI=RWSzM0M86|kEgY>O!6}e2CU|eXb-oc~Kh<0{$9%os5dGm_SFlIJEC@5!pe2D3 zyHP_k#!|m#Cnp{W^HHKrG08-aDIRdtv@aq_MSkPy8)=8x{LLO>&PW5ki8-Db<$+B& z(n6faWR4lpWU8@wevwa<=VB?_omYI@))=`opytU%X_oy?WMJfD53$D zg+0{he4)D^@gyEvZ~Yn+$zInUmb*`#c~NBvYXk!1L82hFKm z-P_aB)21trI5Uu3Aew2f9gWOvc`x!cxN@h<$gz>ZrZ_FMuzfx^jjH!42uJSQ+vdX@_s<45f;-D3y z3N36fdPNyyZP6~y?SO64t%ne%ibjnonyOAH2`dVh=7FF_R?#5)) zo0<$yQre0fGEEv%=dxFgn9+CzmR?~IiW~(u;>=GUmvYWMF&Bf^)wzkg#1qf{OO3qa z+7!8^t1e5c8X)(1-$bsg+XM9S6 zP1Ge2uPm-LucxNZ@iE3(bVcQtkZcBQmhlcdlr*hEI_NUCIa{(*OOmLIPMIgD_r$f< zuiT`Q%zoJS5H6T-LL!ic@I291P2XeiYrLsUeSW%crDc18(K)tDp>O4=Eum8>e!<-G zH;@2a69@o;3akU)6@SuK?2$trpX~sG*nbKPc+EaSRT0RqLWr=eE6z`z^CMKtQdyMgB$+bNbN|Q^nwz z#mOs%|J!s6M1mG=m3NF9)ic;?pN6>jEGE^Sgx12mZp;jgc;;^SYL0*myqEM zQ0xpa%pHR9@B=jlJT9@7;6x506amfq&*UQLf>$Dixt; z(Z)%^&fTYoz@-?@Ss^;qpsk5+kcK4c_sJSbqBQ5eNt^29&~bW}+Z#xy}VW$Gf; ziIP;)FdkkD_W;92>$W5AX1YLJ9f1R1g{SWnafbkr@!A05 z-`v_&s6x%H%5&1}Papqul7y&QDgJJ%H{sQ8adHH?jlgHb`qx=GwvS0hPTJ+7WNPyF z4^?Y6QF{ptg{QIGv12RY8)7l*<5$zKR-Ih!3wKGpiwu@E7PGA1aF50z;+2KxvcU9v zvOjf)lhfGtvkU^s3Zg%rr$y65f1^0T(fD!1akR5J6ZO_SR!g$n`$g^bl)$nWXuQgn ziN05${5vcgqxBi(#8T0UkP+Qt7v>B8TQ+l&di`@j<&%K+D{N$@k1yX%!S-iVe(0lK z*)M3SX?c`R=dlL*ycnb)T^KM@UWrbz#^ArDxG;1q^YF$&u7EP-q)d%Zj4>C9Sg{+V zdEvlhiSvJd3|UR0JO4kF(?sjL@T2cJH-`T4L->C;@BcmDVur@fc8(sT|AU5FsB!^Z z6G7ucHQyt3nX`EXp@XF}rIK`QUJ-6@APp+=pHAGMWmQ#p17o_8t3v?dmsnwhO#C92XN-QRLk_<9f<$J(}!zep|`;QMIcFGwi?;4aXl}A0Od} z}15$*-!Ye#7-!isQv%ejlticH{C6Opmp7fu>1kxWbpQkgnPABK&uV$+eWe{B!A0l_7@PbL{P3EwQQF z9yskg{c*$1G>LvkQF+cn7&6I3_;Gt0ICCdM8Imotu%&Z8q8E5+*5N>){pB6-#Ab4_ zbtM_*gzx9jhEL#p8C!+~g6^tfe_fDr0$W^0h4tBEt_083H3Ea{%g9BHbvdV}CPJ}> z&4oSV#fFMMb@`4nc#)(%=N`Ibh&jQr89qN)11Tn-V-J_6x9yy4|bxjE<) zAv{&=xg4IPOYvEJlkq)VWX1r8v$bxNn2jya)HJN?;!UM~7~?{dXl>*uEJCW)VO)9y zE<_o*>OBKJNCrFkGR!{~4^SlyU!IYX0k^PTo}@}1gRhkDJWjyVR)RY_?xdJXqm&+! zFkH&@Ns!P!{3-2GRIl41D>qP%DO&?$)Nu4Qmvoem6f%&d`DVG=?4Ax zi)vF}&3AX7i~Hb9PaENAZ|}=6g+y=T7G7;@LWQx=-}AFjvzHrH_r-BBta8{us=es2 zsINE@fQId~>e8n?x_umd3EYOUgNf-0AUR2G1}j0#gX9HtHHgD6T8-uQ29Iw_dB9&- zVB2U1+9>#79yzg(FigNbppb+V#!6fPmPXv5+w+*?*ngN16&o!OL0;+I96DW%uB&fIJq8-rrr*x%X-z_7JxkoL`Y3j-}UF zrwp*$Yb@J^(9au;7qi4ReDRNtSZNv}o6#a&m||s-BW9$`m}2CZaZki?FVK!8g4E+g ztryrO%>Ed}xkR0aBzacI)3Muj#Cd0^#}(yc#4V^Nr;t_P+k}8D>n<37R4e(os2zsC zu8TRwgOO+i3bUa%cBP|!;;&Rds%KBb6T9i63iEJ?;1!tbW?WP^UAJn?10 zhQjRRN7Yi)Y@^D7tAY7DKKi>Mu&_#%nxJMKogpLCh(bj;Ay|8q8arPf+(GJsv@MX$G$`Tx0n5&W)|<~w=iPNKYkzt{VzjNW!e8@8Tr3M(G72?Z>H|;*F>h1+m$Ul z5<4`K;9pb;VG09E9ME2a669Djop^ZgS(!W-b`epKc1RwWS^-#aBvJ3z>lK{?|T; zhdZIR?<273FSoV00yhD`tF!0Q*AE$=7oDUog%}3a^6CzI_|K(i{j=w2YTvV9_UA0j z?qNbB1H#V|g0INloNM!k=fUW1&pa@Kh~BN##1=4yLu4jCXbwpR=be|>qJ(i-+brj* zUon<9m2!Icgz8sJO#1~ISz0HY+QVFBWiD`oint3oThcd)xq7HBmgT-{4o;TU1d@8p z+@~eV6j?w;)vQkEin7yu%JwpGj)&taf?C_tonYG2Qe}oL&$Gme&DZ03^J!ta0~W9=~ogD+)~9e z5s1U(r>M?j^MEMNDJ3i1vpk2yi=rC>?l?#1^zC4X2}2D*ic;~a402Bk6xl^Ugq(7x zg4A3`qBuppvqf9_G91SV_dgTKX)4Qq_4AbVe5|2|o)+1jnNm&*_AlI7Man(D?*LVD z5ZvgVlqC_O+;rE|!m6~3fH){8Rfk$RGJ*-UL8YuQXX>R=VR-j8xg>7Y(%LeYvKc@) zHNDFmb5`z@PbK} zr_SHGLGDWRL3nPP`4f~Z`h^qbEc&Grn87j{mo};5a+fx-;qv)9%kPxEr%pM+Qt9x+ zsY9UWdIF~eP+7;R6k}d6x2GL5>a?eubn6>#m*N2whqvvv2mr4w@+g|fmTl0H* z92>XK98|0>r?i#eRROOhY$7&;~GN*g;W=Xl`2>koCaJ`0K- zvpqYi2?$GuLoL$@ONWQKee&muxqXUG1(r@=8}}JpUZsk^PVXD#wvGo*czS@5|*vonK`!b7AKpPK1wzPle}#r7>-FkK3+~`^qD+bf2A(%Olm= zEGi>8bsJ`a^)YYSB&J34=~qwlv*=e@3Pj^QofTq$r!$g#z!_2V=F<-iUFR85_2%QE z$V=M=JH+PWQ5mF8=NWCx(YE6~3?Jlm%>&bgUekr2U72-t2BvC~xnq2TChDdoXwho&1 zO0p;K1_z`5FJwAvL}+?jkGv{+ zmC)V5Pyz>87Kr+MmTHjuT_YHjfcu0_J|FH6lRdxF!te2!Zy@ASqE2Re=-znRZO&qu zq>D#OH9IsVC0&+Uteb9|g_}x9yJL0< ziVIudmqPzgQ!}7@5}^m(DR~S&Ha1ocwlJuZ8Oz}jpRWoFPybs2&iJ*(6rvYKbdXR~ zk!!p;@TIXOQ(YG&Q%6}>QTg8~5?o@LgGZ(yI;>b8g_2SSf5OGOxXyC(`Ytt_vAmGP z*T)Pior7}$E7f8C8Nppc|EkrHln6n>MD0Z#uxcyuC!`;pOfX#H!RB^WZx}0=eLHJF|pGaT6Tm-7hhc&(&!(?OAo{N{4oe(~hTsh-(0i z7&8)dF|1kKVISFQqwO3WTbv(i9*^srv8X~4fVdo{#gYjhe)Xf2TJF-;;9<0+XC&yvypc^;L9?xVyYQ ze@%U<&C1p zQLoo%nS(R{EQjb)Dtac@KBhd)gEx@~iHC638Tq8wHw%i3TL;>@5empK|DPNAlZt7E z6qNh_jAb=dWkn%y3;O8A;5G*-AWMDC=GbhRmMKEQ^7uQFAKygUunsZ$eResSrYV@g zGtw{V6sU5rsKi#i8)j3A?~?~>+> zpriU2p-j3(j`A~!$~=Svh#6kxJVWF&X^Y+l;M&$H%p#Q6jntGKn_L{YznBA!R&3HA zdz?WF(pR-ZhhKcsZ<+a-v?m-QTdmnzx6Y^24@+0Fs5Lm`QBje_K9QaJxG6!;bKtIt zRagyA`aG4}@SFB5Iv}i?$c=)z#5An0T%5>xVsFA<8VK{Y;{FB8;c&ksJ;$& zBoo-04db(T(J#}9GVaikEfmhY#IP1DyT${aq>oj!K#X^a#kIU*v#*MG4xr>{lubx^ zCt62q*W75*tJNTnPEPP>{_Bu7lm!F>c33!DJiZp+_*a|A`YF_A>6rf4^Yi%jGYiJ+~(}~9q2LIAlgn`2rmb8e^$ctA111rC!?ET_qHWx z_SR|ZfG_})32SLYw9S9zas6@qd$Wb-)nY1p=bAFVfi}eD|rbZ^2M%6DP zxe~`EuP17W%yg_ED<*Yj&7!NzGy>%>=O`ZqbCWi_jXIef^R>k|!1ueu6=O@SkEEaL z5DEL%yq{}4&lO{!=8ZEvt<_`jPZg^PVs>q!bP5O;SA#!>(HO9-Y@2+Z!(JDuna>VU zaXEvAy33o~%EYrgJNkY{L{k@GJO4dbXYnP-G3`wsr6=SMoO-<$Rb40^)I`ns?muu! z4jf_VZ@-Y_2^kq_Ur2nthUe{>sB%SNgC3nhw3S)2!qZ88YuMkfNdD`agnjISrPR+{ zrrI6Ja5tdhDL(iuP->h@Nk@T&O+)j7nnb*|jI*YhS3+tWjh2;0A0cIc<=dPf9wEh| z?Qam@65z#r$EsKgr(B{5jc2%Tw=VZe-U!%ao#uDywk!5%{G`m-yKT6Fx0cDsfqW@cVGW7(#)xqutc(Cy9P?YUW%qliCVY=;?AO6lMv=C7Bcn zIVRN<*34M`_VJe`5E2{;uF)t#UZ-4Pr;@U|X3y0jYk6Rk#?HZEa5TxkuFR;(tO#Mx zxA3KU2ZXSzir{NEv_&tiRm0R%2?46Yngr9-2EZ!@Goa%IYrPvcVAoVP^|%8IQv}Tg zJ2plWm@qaT<&tVH#P1O3_^xM+qxO^UGG?M5djY60q=8)`&_8JUFuL2Cu2`LBB$bMm zW>^R3Z)Tb-$3;zxU!dmZ+&0PMse6RiSyd0zTSEOFE8^8>wPj~Tj#YjYXU8*AsWkY; z8XwR5Ogm=ss=%Y9gVa`ey zSu$(Tm7;nXiAjWF7E5uFAbn%HoU~M4_RQG|V8fTO_0lrChwH%YzgOf#E@2Hbw?Tcf z0t?_cZni2v_bM~F<-W7?(AXR7@Yu`uc!eEKzs3Y6eP9CF9vSegT<2>)8DedbUqsA1 z)+lUMVlw9U%pR62ngneo#$o(nTxyJ0NNW(iCR&!cNR`y+qzr5`Q9>;L1r~|vE-!?~ zEdYCEe%k!1ACp!&x7`o7Q#>hnR>0kxr&V23%5My(<0rtq5dfBgB3$?tcqIPehcVGXK;%8kxUiceINoIBel+MPD7^%?XUB?u@w;nhcvE9J2iP5U%k z6bpBp%_Wy8>jlM)a&ghE3{8atA*yGhlO}T#*Ym5=CG168u~zCugJ?yKG4>K+hOtE7 zgq2*z&F1S4n%*G|s*@ER|Cmg;isdpFSCmbR1mU)VLWI=zmVpKtr=O4VCMhSH0qj-I z+1I>-`25%VK%GFt6_vUyg)948ES1dO^(MrkN}$9)t5;Wxb8YQIr5qr33|iwBshf1JG!vyy2H}m{2vOk{G(0n% zY2(CsWA(&1%R+TnGTJ;d=E_*HIL}AkU^D{a=wHl(Uei2dDWG_k6+hLE&0m1I-c#-v*?Qez99!0WlU1J#9IC71r1y4lwL ziL4rPYFJ%`M;t9pRdfv`IGzpo0>htbCCw-^xa|%i0s@t`Qn%p7_Ubt7TY8&Sin>W}y z^aV+~`T&jmXq(9MyUH4J-)bVxsU7Yt*rr zDofx}^XV)!nDZqgrDHWJPU)B{1Gjxf7~K(0+#=ZD8Hhe?@tefLbejU^P%yRxb389D zDzzepYFa%7oub?6F-NTu`OK98QR?EZ9Z~9|-vyB>lPO`5DwjrgBXDg-1m68j?i>nV zi}sL{;6J+C<_5ZTe=KZJ`A!}*m;Opc$Ti-=|KsBZ_HPx$h)06nQpec_>dEIl%|81S zlvJSoww|XUBzqdX4|af5ajqwH<2#cOv9pV_~q`W~^>{HW#1``J#M zi4RX0jWNEPU$1G~{u)0jL!iRSgR9!}{?U3R`Rb9W z58oj&I6#r|#>Z2;3h(}H(49`E!|AKc-RXQ^1p0Kz#JA`23Deyx6p{vYP80o>o;}Um zqdyL+K?Sb-JwEg0nNDfH$RtvB?W;XmwLR|Zcll>e*18KhoQ z6u(~@dVih$?6b^&4DiKPL+sB2aea-sGk+Gx0-G1&NH8+ti;Bp_vQaE~x{#dY=7V2q zg#{kj`tr!mY&65lDe$$VrKDM^wg1^TwH--MB1LV)XIwO>^ve{$r8A70a(d3waL;c{ zXIHqIx{<%mF_9&rCy{(QTI?6u^NR3O;*;5gO+X8L5~|p}MH|d&+h9!kR+H?va>cUD zZ|m5~ITBbA*hsD68i4zf`J$Snwo2$|H%QKhuVs@1WU0<(#*b6AUMS@gq;u1(S^G83 zRsTa@_`n18s&vYN^wNYlya-SZ?ws}ZTJ=$mUk6COB7_;(WlA?9j?DG7X2w%vi(-3n zHuFWS)fYIe&CxdV?NqRoW@J`VICe>T#uwiN@kNubTjbw;Kzu==((#^)BmeqUsX~<}3G^51x$LoxK84k7NHUL-#PfQc=1E1XATD69_v@9kV*XvP z2BZ^8MQ@?5AiXsr4_$??fga*kYK#(CvHk7SWW<{cfztph?(wKWTI?fk z`5|S9uhK6n(@HQI3=h{JZ3v}<0JSaU4qIhtR|CCaPv^PgX^qHXz|n#X)g$W;x;{2( z0_&B_tpn1$$7K(t2jjL|dClSd<8pA=0M{3M?M8Xof2&uH7rb2}FmwdbixQilz}Y>s z&XDlmA3voZ+4(T;>B;@|&P2T8jn|+X2n=(s?!g59ANQmkQVji8_ja6ugniw|-Pdh` zoRmh}vT;AI!fdaruzq|YQ}lQlfp##+g&>L$c~fHaQ{=;RA({88?@~X@t;1|Z+FTd7 zKJY!KMl^Jj?cYqtOkfjuoJOfBW)Iks-+n@Uaby0P z9ALE}dYl_`__Gt+9r8$vDv)f*WijEwp|*W;9@I-;D^g@Y=C_dMo27Wm*jzP8T>;7P z;()QZjWSL3M^7hWyrmdJ!B+Ej8f(H zY@yJlS_s+U<_@gN|KPYY3TX|4-?66#*?8xi4wl>rsvt1$j0m!0F#l+)AnydP3#Uxg zs8#ewx~~T#MPfQl=~ZR|mi8dSm;$1S)B%>oEGmMjEt{5k~2VDE{(*Ih8uaZkd&syj; zh&_cntLM`wuF(Qj1?sNJr}qvQ{4r9}FXg072;o%b>fq$dkVUZMIFl;T*Mbj< z$c$O)jbI1Lx01A%<*u)=wGA}_!|!EH6MCwQ(5EP8@c9cCK3QbV<#AQl>VbbRRz967 znmo!bTE%BwqrZ5|ZFm-3FX9^bw*358Ft!wI7Kcy>*M#nDowY

81D3K2aR*6=vs*Ttymj%bLJFU{f(7WN%I;8?nBjItLs+v z4A|=KLwMR=6J1>HkG!gb2wW7+5{-VQF_@Z9Dx$*)=Pwe}bh976A0DZn7NC9on23}}HNlJ2|{ z#>I}*X1&6Aur!RglfySPAWpd$6g_Ga!F-$$*@LCm)N+B%9>q^=a-liyDM!6&C9WP> z%W#kVT&X}O2fWFCNq6d{!#(27RMlN?c6|uzSeP3axLq}!KTq4j-l@&hTwI#E}* z^hc<)gI|W&8Cj0Eh7c}8Qm5gntl;GUw8d$69pQR=Y~0lY6@MBFuByLIH*jqz>T@pc z7#l$Ixes@Qiyo&FWS!p(yD#_TdV)E-!S`TQs02C;?=3=jp($ZE?rEw1>XE( zcZO{3oh0qC1zcboZ)-b;Y1W;_wT#E^-?A9IE{!AdE{oXS5Ch-R$ok-Tv1`KR%X?Ia zkouU+Gb_D#7Fa;|QocC;K7A@*EN`VwnKic89vO!ul}5x4hqrYVa7>M8ZtQk9BB!Kh z8r+ctPsA@gVSFtXkxio@;CPXuwor^|n1%Y?ZQ<@F+B%iBvOm3CJqZ{zuk2a` zQ4Az8dN034*bEh!wAZaY-c|$LJ4uKOz1nKqsAb+Q2-$VS z=?Vwg+{?DX)Olm#r`zN-kkG1^m4T5J+r%m_7WlNa`5_7iTW7xvLcsFchEENMm-qJzvAUFz;_;A zGeFuzNOPyS(!C7fdgh=U@G^wngfib_Z$UcSVP5ZTAIY-kxD4?0Mk46lxR&?+sW%Y1 z(kt*S%29Bw?;Vi!E}*!reB57L%fcV%bM1jQLeB%HKcM3cUA#AbeyVSn(nXlE4dQxV zU0)y&ma?;UzP>rAeIuX|bG2jq%&+Vh_GQNL1>zf_zia+X;wu-XAB)-jSMHgO=gp1^ z-tRBmJK@3hlrzkyln}4T!ZU7`tRU{s6K>+R1m{&T0?*WrhM3(GQ>ol$syP1QrhC{% zOxsghlw*yVq_!}SdDU-f7jdL#7+_wxqDaq(?*T(yxo%m;XAnP;xJfbHJq$9e7!d0o z9ugMFs^TqkvP*+Q?_0F@SB}I4FFJ8}nsOyUY+T5>VE0$Jr?nxI~dWn2FKF>eqLT(t!s>jq{rST+EGg&GyhPw84_uikq=|QuUf(wj(}gyFanwQ7jKimM<1S_ zyYcAY4x?}ZysJX%eSB8aVqSwkLv^$e-RGBe+Z$PzM|bkmbI^%33vh_ynS|rmgy)Eq z@C$k;X1YfT>~kUavXDycEOG39G~i!n)*%6g5QMopkA7n;6TA0Pbz1B#fDkzw7lG2T zp@7{qfO5}D9ZQ!R{LF$bII$ina)R@ZVh?qz``WX?a2Pd0PC@euR;<$iFSv0X%&$=n zxIr!kce~!=xiD1sCQzxC%~D>GLIoQzPo5F$?gOZ=;{(3(pquVR4pm zr0|3+^#gK9 z%ocN3K%n5n0dITcw3c86_)T0^(|-ACuza+kUkqPoP5tU-&+uPDRvCwGmY+8Bshhk1 zVtpQ2W1qMxA_R~8a~r24Ce73Ie*_*2kL0>AMvQAVAUmF*q{^lAl{$0L{-wzcs0vDQ zMz1Ka+J;#LZ=PfrpZ|8-wr_)q zDfV*Uy>cL*1ACN%fE4=vxh}R@PHJm~kwW`#H@;9)r;asJy2uPVbA+e1ySA&LkI9{( z9SUj^oOYzr#=w}?x^PfupR5K78<9b2dp#V?m^3Z17Ul(D2 zH`w!0#bd8TVCskr<`$T67FZ12>aJax3eEP*A@y!*C?%bhUPOu{k865 z?~?|UfC2t{tjjgYVsDHllz<`rdz8yH>|!rNOdG=D_x)w~<4}GIP^kTH_E^t`(pb-I zEZ5p*+inv*SDH|MCiw5+F4yLZz4{tZex~^E@M_ROY{ET*!UQh(>o+`D&oenaJux^; z*LxU@3N2g#cY+<)!s5taKBBa6$dyFW1HG&>khj5vVIVdTKINbI!wT^f>=RqE)ZY^UR-j-aCLk(-QQG4$mfWuMV zFWNO|uxL1$<4H*d5|AZmon5Rj078rz~dJh@nXjm`Y) zyN~=HaH!~{TrA+lF36xSG;BgA*o2L6)yV;5ye!qUG0e0v)l_w?jyhB^AGB`pgi%wa zSEd#`VnB&gmp1Ugh-=)MY}^`MheoX*e^+LiXfnWO*Ls;@u}8>(z?*V1lwmOVI#9!W z#HDJ~PP|Hh+wo&2?konVLOgv4PgNge>gJhEbO#?E1k^mv0kqLpq9lgG4f_orN zatEEZ-Imz4borX$TzYuz9<^T(${@92@NS3g`i&IGtdqJU=a{yYpyRcZZXt<$l%J^^ zR$C8Mbo>x<5`Wb{OC}&v7JjL*L`a<2x28d5L|b^>BtnH_l81{DS{^0&THusAW6#|F zzV-HX^fmg5vqNMJ`Ft*1p=*(pzF&WceS)ZSIFmTmF)a44=otz3Ff zn68&MR&Hmx8^-rKn4|)bcd70+PX+e_w7f355>4u5^%m-9A;)Wl*6uDz#07KiHLYT- z_S?!uuw1FM&F_o`SO~-EJD405ts}hn)vq*j5cFz^E<30WY``vW@yci5=gll--Gtpp z+)!5FhQ1j%$F~z4$jw_C+L!rP*JwAF0%Y|gYwq0gA~6;JrsAkZELQB(J8MEYSJJUX zuv91Ftn1FAT(XmtAExqMeTkcicQ&CP{N*Cp`1DOC)zTE3y%lCk#+)VTMCyW;Zgpp{ z`$zCc%?Ot?!t;3Y?39ck$k&Ji4&BS3VHtLBuz*qYJuCQy6MTSQgEreB=3ZWdE<5O9 z7to@`J5F%I)gsS}*ggPzo}?FGK0tFG_t;OdtNNV7`KRp}lRRRnHuRYT0mE(=>jpy( z{c79#h8`pA%OKpHuzWDoz3TbrQh3ab)D6`pHGhBmz)_2~_jhwhzZT>$0R%ojxp2&m-h!bE+KwO`FQy;9S=dd#GH}QTM91G$T;Q3 zN5}L_;?yW12YV|p4yu#a}^Lf1Dqh{+%a)*oni$4m3m#*$o9(GMDh;|0k(l_nuO zG&BxzAQnv^M{wdm4-!mm*PA(l9ciys@s&O>Iud4<_?{|mg=cGF#eMGq7_KZ^EqSOh zdS?-GQv2xmz8in50!wOs4TixoilMvaGKg-3{q$M&ug$YqaJMTID;r)s)oQM_rq-j*08Q6+=Bl#Gb5?U=8PSYv*^nyY*HqV%|%$s?P`= z?^ort+9u@aEdmzp6E>U@k6? z(o(hG9E`g3wL-{%2x%GE!9l9H&oUxFkY$kgV06Q1xV#{DuV@uh zs=Y8|i$WIQp5ts3;qx*6oeo}-R4&*gH>C=}^N{*Wa+T3X>&ZgeBXv9g+5x3=t7k!X z6$-osIVNisN?%9l$9|8NAdwrxA<*fu(5 z$M((M-}%ltd*6HN?o+jD{=cf;cg$yuIiBBx)z@iQzX>vNNaB#Q38OJOvP1sDxk>f~ z^fcyOC&LevEruzEMz<>__1aXX-1;TbF{lQ)&+xl}7UE-K6TUA= zpcpcSkSRMg{3Bv>miIUQSK`Av-SFwgWPw{6-CB_ZGS*nC3>KRVhQj&HGK=YTXb|PS z^^%uA&_dhBqSvxs!Mc!afFkT{YgVgNbZ!B;@W^`0TANLaGOMPaG)2XO%?fwD7*>np zCEXo{g-PP!X>haIrf+EO2P?DkJ|NwPZhxtL3^Z;8Fd2LU#%|5iD0~f*KB3ia5wqxg z1EX#HYnKsQEI<(~y7-nzdCM)YGmZjUSvh{yoL*-i`HN&=cmrU`E%^VI3>oQHqroo& zj7!i%xd1p>^*dcRHO8x<%8?2V_!y?|ygyq$UHgf|I_Akg zh_O%W(N8BL?qM_UCoGC|Y3DakPlwn~A?74I0Y#OlR5V8RDoEKVhYss@=ohMDUNzsL zQJ=x_KU*cesOFo+Tcytner^ohG73toCmky5{@&;q59A9C3hivNUktrfO?m)xUENo z^{Z)M=R5kL0B&hD4?!LP2F+{)-at#wLRi^6&x9{d%HboY36aO-B;u246ejb@u)vN*92 zO}M|bGyU`}DB@?ym8;mpxvdf{{n(?$tvy)9GLa(cMjZ$xD!dg9;(t;Gqg>=4Z+flaYu9bH^y!N+W84$97o=hks0nnhcg z!GH>(Of#w(gejrwT%q+p#NH)ZWpIoZ5P&8QHi%{+@Kb}xrr{ufFzMpiVt6aCx-eztyXZQ$RdIDO{km9Eg)T05J}ZQGHj|~eOgGv>j75H{(R@7J!?!80B6vGON}_dAo9Xa|?oQn> zDfIhM6#ArYI4I{q6FTUZRm?;*x`j{<+a3+uE`#Ni%5*?)KB_ww*BL?N#wJpeLev^g zr5na;}E&T583>K>GZ^O zaA`iu*B7@j9am{S(;UdRV)v+nP=D;1#w{?Og|JX(+gUhCs#5VpC z=~OQspJd*fn2&v_U1*ECe2HJPih1b_-1WR@*=v4Z)H8FCJ=`&qh@sroC{qaQll1Gu z{kJ;&^a7tNqfWOew*5BuN#*u1rahDEtW>utmVFPmMe+79Hb<@TN>hKwpG)a`8!PI1 z)|zzhl!)Ai#zz#H(g zmHzLcbq$B$NBz|zZ@A26`yKWR?KX|K82=Zlzwe!cU?5BX@9=ducO6I=t8-t&>%55H;+`;#JI;+qVVr< zgA=&84x8)f-q>m&ybmv-__{n0=T;)PIu_3ft`K4$VGA4UoU-<_WtFtYu=I6c?d1VC zMA01kfH6X}c);7-{hfqMwON&CHH4|Qtco{S$>WQzgTLsUC*-xz=|7S2uA(^>DQEe_ z`2xqsl*hY~qxUcbZ60ZDLj@_MLi%%*fWSN!d*wid?lfkrV`z_NhE2|0va3sRnovvM zb7%h@!c4!aid~#c>=F%HYmM6E77Z_xP0CfCNJ`wj~n{KMS%QB5#W^bJb*^UdVr`%g@6F7~#T#=`dYHveDtMpbPE6d}~l5WN-~4Z&++ zASFRVn9+bTNU?Baxmj>z8Nyd~-4aHVPVJ|FRNp;@>mdvy;BfL`bKj(!Npu*ix|Gly zE@$rJw;rzJzrVh2UTFNVXirCpYmISHu*qFX9asXX@X$+GzWYBJ3GkPn%#GM~)@=iE z@pgz#E9kIyVjGo!&3IG2BlTd2UAvujb;4g#{cgWo@k8{~)?;~RkT&Vq_P|2!3tUW} z{fG>YI4~0?w$X`xq8HPs7g}jOpLhLLEb2U2+g#g8l71^RVBU-e5;<#T5LsWIED_F0 zSyorL#&CPVZ^gZ|)3!d;H4OcVc`n#f90mAlqXeTBYX}URrP(Ft)Ladbp85D9u{3EE zIkc#IsJ-8!v4~t*W|YyP^$(0HNU_^O;A*&P<|ZgcNyMNrfn4 zK5NrzCF+p!<>3%BL+zjkai+q%aw@ClwxhH#De zJc<0-4ocX$y9BU6q286a4@=3Ji-@zymlA2vmd8Z2%`y=R8N?_v6y~B4J(ko zVRfO7Xe&%1b7^-Tcu!#}9;tIU=ZsQn1o@P;xm}`v;dY=C>NzAisea>;9}ofHUhOeS zW+CxhLUzFoW7(k@k&S`Y7)HA|Mc*h+-fq}pCuS9X(x%vbg8naa)<2Gahs60!>i5wv zf&ITZ{!-u3qUNSfLjT|)h}fH$8vmC+t65!31yuv}lfLm@c7eLU7#Bk)&IGYZ42~KE z+aw$jodh&crVb0+!lr|Qk1xW6C46l~_7&}x@B7_E?T?J>?uhIYwHxf$y^|5Y2%)U#UDp?0ic})70cs<6 z5j*iB7d>hFaZ}YHFrBJFG9C5nlwUDaZ3P7YK-Uiu>HS-2acLB4S=sT6qyS5_jai&y zBdRnd2Q_~>#Kx>FdrmBs9Z~(^>?ODjY>r_#@A=Ue7Os^!=Mr-zE_+YU&Z}uaI{pYp zsch}mT@()9Wl*{ljHou<$gKi&kn#fwuwgmI>a01}k)Y4d&HIpO$IOf~eh%YR5^y;u zedUl3OBxEq_De1P*0se7LC;Wdh!FJF(;lq-jQoudmSTjMnKUe4(`a+~b=A`Wjs~+1 zi9I-7meJso-5F#>0xx9FCUr*A0XUs;i_|{EFam8|NXvy&;l6Q#l+N0nx5zCcQGEN6OwAl*s^LXbTI*v$GYTCJ=EVA5hM2j9 zNr0j5?UdtiEx3;+vZ@IqJrY4nMLrG^sMod4l&U82iv(t10JO<*{Jzt&`Oh`W!Z&q0 z9is&ohGRLSUWTs>zTJbt_@{P5`%l`1CWvAPI4`BjzPTOZ${kxc{4^bX5&RWUYI?op zxZkdD&ShwvZ7sj&96+|Pk8WZ@+-`E3?t4NI98~&4vH5?GK-*b9gKh!4($tfmLJKcl zQ`tc;R%NlnZ(B5#f>FJbw8zQ66eo~{$u5pn! zGjIdMW8<>X$;Ye4n*F@7H-@+K4NMy}uNH|Vu*FF?=GTKPBx~(wgVtHoXMiBF+H#>t zk2#l$TkvgNruxyRhJ^3TnkbT|&^c zxp&$~#Usjtj#!>-1)}CR0>RBvMSt#^IYF&JjCQLb5O=CJdd`hAkBC$;oZRHab~rHA zCQ%$;2|4Ch6k)I+dt+T@03H>gCq}(V(~m=+efzLxN~vN$cNR4@3>d|k(2V_XcjBKA zu2N)340#P&a)b6FhhNcP7GoB|bOu}1ZEbH?xr@3fZukR#hsA4}gR~)%4NySaBd;Ix z{WAh}Tyckqny!tT5|ssFc5q{iP^a32w@70K`ojq)X+=&)$p0SGq1iUgOH$Df&;-*L zgEUbCOOsQe6VwE(r`c_-e zBt-OrJOG%L| zIPCWhh&fwCgoFta*5Aj0&t?uvV>?ziir`Tovw}WjLc5&#N54G)*!vcVRCyE zMm|P@dE}|ayzMb44R<3e&BC!~2g*tcrWKd`00s1x9$=7;&ty_^;)B z{cq&ee^mSzyKx(bZ^2{pe{xuEk6f4HT9!xwoG$DrLfDCHi(Fq?CDOcJ zrJ>eEUkSwLeK?xhA7Vl|6FO~k`@Qzh{b!ha*Rj;Wiim;Qx^m<;we_&(9vI8c!+Oc~ zkmBocumXMdu)6n;l1y=v-Z7-M!BN%envY3B(Z@%!CZWax^{P&?>%)XR3k+e~RCb$9bEXL&2gzEM@QnJ}ob#mCe3VB+Zn>j9VEXkm=bIl0U=d%sevuMstv9Pf z!02E{Gwn(A9lOx?pJNa&d~o%y^-eZq^f;(^9>vX%HlQUlEfl1_GGugSphwU{ce7HU zccX2n+gJlqMIMH@Xn%D4BV(1mjY@>o?}rQiHy{c5a%YrY?zd%NuE&EwgZR<#_sW3b z^bs=YR#zZz@~na1Xxq|(0?KYmPYRcX#&a33A(I8!t+$W-4R0sB0p}tqPHA-{pjbm} zo6NHe+Pk5%<*vzJP{t3&eskr?-~V*k6&Ab52X+@+rXh?uDs%CaI|^})oY`H%AZoRB z!#f6xHt!9lY6YTBAm4h%#d-09@DNYsb}RQ^#Y?|*>1*EiG0y)MFaHtb?4R0Q*51zi z|E*lKRZt~RKQp=~FBypgtaaqB0|v$DD~%Mj7>RUX+X9dRgjhLgL15uoGPktEoD^h@ zE?X)7Te~d(t9Dswgs~A7tQsHqnajU%oK@TF{CfZX`83n}gEQz#l{Zj@I)M{!_y@RJ zR{sQ1R`OjOZU|ae0dWvgJ10f4MlmaO=pFU2Lq0CXO-6ttm%egdWmy9L2qRH(5^H)= zLcS67f)iI^pK3iw>2F*!G#zyVsx%bH^qP}P`yFNXoh)YRgbr-R9Xch(=LIJO*tnPg0C_^=D;l5O>7&ap2cu=l zc57?q;UqD&U(bMb$$P1;9-0m^!q*p;mva=w)IuoSO-e%KJ$J*ya1B8uNQLweHm$bN2*+tZ`6ueeq-K7NOLmqRo1=|B6e)$Z2%b1sn$T67w^41|%ARsfB=ct9uvU_r zkm*0felMmw&?5dZ&}oQkxDN*N-->NX^1?vS)5|Mr6x4Pf&1&hUg>1VRu%&U#ekRbu z#3#?ATL{^ZsV#NoU}O2Klj5w1*g>p?Sx&kQz5vvDh9_iY26kA@DG7YiV6YCTD%6|Uc5%%PO;mbyQbe(x&DWU z(fy~0k@D|oeohee2wl8pvV&Z#%4USi-BE$d9b5Hs6d5>v7Vb~Q?)m*KVftHvC31@T zEmx!YfRho9gR%|z+=8P;$fii^m;Ev9Rl{vtmDVFF_+U#=u5ffZqJgJy&K0UmQk3#( zAe#oya`TdLJ#7+YYn8fKwE52cvrNgRsy5Ou(q%fk)ahageC9BK206mgL)jboT7Ef^ zzsy&EjaI<|eDw&CY1%VH?1r04QEs82^mTc0yihg{n|MTo6iVSTcVh-Sa)L|<76zY~ zmNot`l-3*yHV771=vQR0FFLPMpRij_%GCQbAEa&y+FS22)mY7$_tD)K*V#^X4&jr{ z2o_becCN}7)+d;kP1Kt_8FP8Lyf&8nQbP@24v3zsT9e0@eI^16q+H!0!|<**_x` zGm+J9AzPKzxKctrr&q9Jf=KeU%Oa`c9qe=jS%CxyELa__Sbwb(`V3%1QVU8H$isJN&bW&xD!%Xi%iqA#JEXwU-+TcFL zq>FQX)eZvz%1`oA#aW4HV>Ng?k}~*)i(KL!O>;5YC1C#x?gwgx1{r`7$|Nl?Fh#`sQf9n@Sw6JiZ z3_)y3+Wu$94q3<1pQ$#j&(AoY$p0MI%zRSruTiB8WBd-?Zg=K++8k+j>-GM+2m5w_ z;~p?x=J^#wLqTB4a;N>~!&!i*jXI{}#bIGL1M6_nR4_TA@efWQSmMPxiKvpSr9L0C zOaj!WiuaG8>)~u&9 zO4g0W2F>MTt5;WMSWquXH+?iERJ0JcBIUk*r@Y5;tol8e7&6H&f4al#bza#mDq*-a z>}}TY7h+_S`>+h@?W|p1YU0ZhxnzNno_?nwnhWF3osjX-H(!@_CqG((9^Y8W;FCA- zqyVQz@TwL!Zed|317X6}*kLX2+XcF1(JX54YSSq6+f8-eM8u#*kryFYlrgfId?$M@ z`({eL*n6)4Z8<_4bNBXGko#q#6mOq`L?pXP>GAsL29=kGB8CvY%q1^%o_Uy;Ua4aW z;)Lb$FM7?j+S$9mfiCYG1;Sjtg`BsT+1#|Y#~b3Bh)Yi21Cb1u=&E5r)DE^C&IyLx zlktga=lEC9+$)pdmFk4b1m*=dIGnP8-440Rw|oiG=3Vf>ByW&2xsL9mtiNhH!)4PH zd@|RpjWO^QUGXnJDq0sB?<7C0|2OpU2PX2}%=gGq=9{f1@SltxU0v+mES*eE6pXA) zja~lzEC(z0f3wvPy;T;57o{H{c(tKx@QcN+=T-7UpFuJ?p>UR~Y}nD?Ecxz1UX_Yf zV9=oV40pOc?6+YXx2idQF&2`P|1Dg9albzBK z6Bd)2;j7JmKkMY;moK@N^J1jjHZy_!doms=u$*~poEG<>=OJC z@h&um|F2gb9*+PT=9@)U_|3EZW(oZ;wzp;YCPEt-8W}Q}89KXIIosPYIR8&{ErYPB znZ1+gzj30K7Zkra(csF$lwj)tl+fFf6UC@V3_7Y6l$s|ZSZ2RuW&8{*vsrg`3I%ox z1$H7CL1Lykzd6w{=SAO~Xz;g$zm1JE>(;fdPClQnuXuvMG}r-YRuUMO7AJ#EQI}TN z#^S~<3P+cf?u0A|YLiy8j1<;KYP6%VD%AMp?p1r?f*NB^HZ1nNjajNp=0{+!%AH64 zSTmWy7tgOT#_5^cp<4crQQf+XTizqcnsz#DspDu*dxH}hS}Z-LDVtl$^@z1>;k737 z*6C+XKmEV$fDgk?vaRmohI_o%0Pc2UZnNoX!Y1;C%E~PA%{t*c+iCjM%K*QbFgr-f zu|0D06X`WDYg=CiYp!!M_8HmO74rd7z8V^-p{;tEghjDJI)Jv=2%zEaumsN@Z=-o! z%Ac%I%ks=j%G|9wizhRR9IR;_-ha$Ys9bCgByr$#!4F@f8xisE@+sWSJohH!-5aj) zVA)2pBVK3SmR}j_+S5Asd!tlw)=#{o{@>#J)t~J;Jw|CMRF^zlRMh94=V&=`+ODuW z|3pP=4hF@9MJ2db7;Dn!8cOB0_UF&u;4)ZPIp3a!8EHuf(8vE8V4-GQo@7FT{H*p9 zd?yZ~&Syc?AKT+!N@VLMo3$q`Jbs7nvDLz6E`Zybsc+b0^+o$0jE;S==wKbep@7N- z#Foq=4HIo^&_O!mm1{pa%0XeZGE0EGbp2M#vL|Y+R|%WZJ0;Au)te8k{Pj;zG~yqj zj9=XiFMO3~J;o9iSbY9hkmEc507XY<=S6ENP3H)H0DVEN3#jpkhC#XrlKF5jj6woW zx_RIkn=VRA{DTx7D+c>tq-cMk5F-3o&EOe`%fvFMpN{}5>xU`xq?fd_sSpKTlv%=eIKjZ#S5!eZ=rd{^EO`f#XNO+UYRuxL;b&^^9`c=>nmf4y4i z<7E^Q-*3{%?=I>;q2LNznv0qmTiP1h{LAQ9TLa~L^eZpPY=Vh~R90S{>Is7ZwJ3vD z7O_j5=9dw+q!()F*FOd;M;>wSWA7{cb|9mn|LS)EP&x&n$P4jy_9&UK$b}M{7zoqH}x$NSgIl`8=MeSmWJBW#4W3@+(o67d9p+VP-4Y*Rp zC68o9m~ARD#bmm=!?mJrro5dyd5A!FQI)qA^=(jZ`_~uYJyA;E5N2h@YTSM)q}#RDO`G z)zAICt*79t{IitUaw$tOLT)BE;Kg2QAirip=KOR#nPV8Pp<7Qk+phZr`{yBh^m&;R zJxorkgpaG@c!~_*iN4y2M4ncxpO@Q)Vyp8kU{zHsRr`XQT|R;CWCW}UvWU7f-9Y? zG|(IHrloXO7=hs^9XnG8dwjt ztX7^^V%#hRxc_ej)#6Z&}gH={JDJUQTV z=>2rPLE3P(iq$T$mJiTyv2$@kv&{}ek7Tp;l~A8Ur&b3}~c1O1slDbq_-MEX0wI8kNh0 z1(Xr@xKXiK6I6y>)p2`FklbB&5X$73zJa`fL-ChBfcGA3q7497hr}^|d z>RnS8FXLJNb<%G zVu7}rz%4Gfs{++D+fW3MT6$K+u?_Y<1N{&?Imf1Rb4u0ku+YtSRTSSr^(}QQNeF>e zP-dBb#9TL0gP(aZ0D$e`z#$p^IC$jflLxj79ZB88M5GC(&k3VD({Gqa9Gv+wdD{gM2O_0?b zWeAK?6;I8-fQj-58|pg2APj4Y?UIpHqc`z76b>O4P&d6DuGqk=Flj*ln9z8syFw`Q zia64az22NzeVgsAqalZP#JgUC_yYRZ%B+2c>^}C*CrACyEA#)D)Ba0k{-g4b%4|ot zMruP7rdhtc3}7RgBUHBmDu*`e|FJAu{dkN_Z|JyIoEc4Q`xVFEZ0~&v(!`>4E?cT_ zA^TM(-|NL8NbVv+?7dP?8->lMfE?wLJ&08?&{dl z&j7a9q76mcN(wf8EVFGi?erJRdU$+FE7>4_uf09u-j-RTD7Vurb!1C0rC4BZYJ5IV z&}Q`Kg@I-sS#l4}Y{fG$#BB>rX+d7RxUM z9;F*wN7}fw#$py8Q@U|ifCoBf0}8p`NLEuo1w%SI({z>Rk^uuoBhXonbg}UA?Whwd zd}t1OwL#DB?K78$cROh+@P;!DIBkx(sfAteGrC(_7}-RrqMhormKufPSX(g{&yl;e z^8Cgj6*@Nh=*0qqb?Jd74UMdQKYb^+GjPA6qd{fn?iW*;QM{t~(wqDQ6#~$) z0F4J3r%81@pE66MEEPpr+#x0q7INt{HbS|{d>e!9plC1@itE{+K;y;j8h1I`-)hP^ z;rw0p24ml;RdA}Zpl!qsR;{>}2jmswlO(+A4i?r}3b0ja&)9$J5TCf95c(ihEt83AYi zX^apcKd;^>ZZ55eLFvKQpg}0QLh9fCsKvqA9H3+OH(UI9*ingJs^$N=m0MUXzku*u zRV==^k>K8i5A#NH{oBk;sdRp$*_-w|!g0(6Q$4DpBvAo@R9rkKWPJ^4|HJlB@jm+G}Uv~eT#h6;@ zJC+fmxiJD2q^=MWL>nb`DqrIvNoQb3@4!-Aw|>6$J5-}+QP7cd;l9jwkV(ZK_LiA1EW8#sY=KASM%}D5xk{T_awRUEw%_Dk_=~Vdl4|s=HzaRSPRq5C2QD=j|#vSP@rx6 z!uNE2pca-CMv&x!4d^Xlu9#G(FFGQx#xxii9u{X)W_Ux##$SLWq`IjY(=F|NV?dC) z{2T?|P%kP`&(lmY3XRy_U?DUznK=c`13CSO^xjNwLr=fM+VBj63SGR6LGBG*7$1S) zt`oqk{T`LP!mb-9Crz^_5bqg12zI2qO&T5&!bN?pq{pX1Ji`|gktqTmjCjgFfNU9N zJ-(>mKLTplbd@v7TP7oM~`p5|+3aW*^JetCb`g81RxR=xkD!}Y#THXp;Ad%9460IXdv z$w*MFREI%|scf$yhTEl-GDH=&5))|_mm!L_)&>R^ef+b+vR!_RTI(nQO`InGDm@>M z6Et_tpX>6i#@54F$e7?-QP#BC1j4N zS)Eo+kbeGt51-TpVh7Cxl@=M@8iRkv+nucAt>v0tB<>#=H66pC_=e6Up6(NkfCj$9 z(GuJb?^-WXHIQfvWhSc~>Y8#)7RDGTv=um6Bk5r+#@PTIaJvF2s|DpvWX$K@H`6?z zP*7|idMfRv)PbqMAzfYDh;GgvF1}6`DF2*~=8O;Rmcl7un0s^QueszNUv{Vxb_V~x z-Br($y$&#nsNvsZOU+@?7hg};8$FVJn-u2c7eR?RzZxU|9&Xp(ujFy*^|}09ab*zq z-={;E;7Idq$i|@%{z;5avi7oxyUtYu@3#=7FRceQ-2>{nEi^u`nXUu2a?lPJwxVhk zSE6cE2R4;7d<29WK81iZb&VP=#*$qeM)y-qiKXa3U{_S!BTy8rnL#mE2|H1ZvNq2& ziF$G6C3g0iK$%5);DcH@9Eh&kbnzRe!d%_$C(o(CS!lA@w5%Wese@A6<4x2h_zcmi zR04uaF_JhtCtj5efRNvZ_0@{G$EDxHt;vs!rH%!T=ei_tm`>$-HI+vg^@>BU=7g3r zt4q#ajG1cQi+cU(~GE4%>5~EOc`Y{7}JB#VoxrkTK zkax*B)_wM$u(j=-bWvfg|w~=|d&sb9$0iv0W9z>Hzl;+>(u5-NH;1(EO-e_o2OsSF0>-~Bac}=3OjYveB8TFa-6PS_xN$_D zdKMijmHI2FkB1>5rW9OmBui-6Y5K=OPG(1P`o6?ivDf|Yq#PCp+!oU&ly@1YY5M1DS_0c8Vll>%S=BU< zrM;6>OW)j7Md_Pfp6F|#aIu-cuJziWPLy_tK9v@1B&LCCH*_$; z#%!HfVa>Rr^u!(qT&b|`M(SyV)5wO&pDN3#=a%CXwK!@nv*7t7k2F0J1QzjdQO{a7 zJ5^l$;XNlmEtWwV;{+`_S*!1~VN}%u0p#`SpmorDIc$*?xskNo<4es(<=^?PWRlBS zq)AW{8z^>&zCgW|ak`eaPhXgs!v5r}@|r#Z#d^%YoEvtw>NfLQHDSW(7s4~>(x0fw z7S38tG1%zs$4Hc`Lbfc_m}(4x6G=6dfT(TYRNC@?&oRPPgvH{>ug%vHqU-6c<$WONb50!L`nkI2aWAfrnV94P}LR;I3S^>&WLz3}8Gf581-$@5Ts{Ggj|y z#MpV(Xi+88uB^cQ$!wA9rdTCTELPBmX|gxtw{(ZAg<|- z%5mzY#aO?-MOPh~1NTleTd?okJRX+_oLL%+&J9nNW?2CR%ui&{U!~f(6{zq7yS7$b zLRk#W4p>0f-;J);m#3JQGRw3(Jen*^&r>g$57b1M41YM#F19aM5k!Y+a=XtM1=9?8 z7oA*<9UkH{!myTV;B~#Jt6{nnW+@GTKEvBGd8k|$EIMbEtmK}{)XLI&)3F3}zi&zA zgV*k;K??ts`n(*3a+Y@78c3YhmHfL)ffx(97zd{aY(lfWQxOchictq6Ujb5-FzM^4 z;BaNHEhwjM`32If#a7Hea+!3CSr0bo+n16wUqmbD?I#-HwWlPlE2tZ$0RC(uT3_@5 zdDebeiUv{sfruSna)Xt#{_L8ECvijmwb9`S?CnldcPninWl|gjpP&M&n9;=s@R)()&A?4Hr@%ei5jxH_*B6DKQRO4+o4E6Wc{@_l-1 z?xcA$|I<2u>-$rg{I^Wv`cGt%hl}a|K_eM{Z~7p5%WQPE-~xj+sR<#@ zp~n>xt5Fr8MjB-#Xa*?lg<7xe#h>dsyP@6WKEu36k(130K1-qaCOJMr7b7(bu3t{e zyB&9@b94&$dVfL_hEo{27!pTGZGNYGSz#_nf;-AgvKY0|8Ou&KGAkPfF(DP~#zb{8 zUowHZE;zC^4q}-(lT{X2h3G9tWB`_N-8SlFmv&p^r`JqYp^qH(hXVp2+$oKfgurEh z50V35+=~b!!vais&C<9;M5s>05kzKkn@Mfg#jI^;n?~1;#pdW-O`FsC2Nq9R$#+}Y zHp-|EQ5CX;A`Zf1S0~^euwJ_tUNQ_1Tt;+V8j>qytfsSYKN-=H6cxtO6PB~9sOV40 zMJhg;dEqnM#~2aqPwxV(&yUmrIvumqhIX*Wyq#;%i>)`&vPO6$hzd9#3cYbB(4JSn zOjK~@S0!kY&BUDzei7KjM#0}NPdY|G$b7whg_yJZBjmXe>Hq$QI3 z8c>pZ2i3xVdASS~N#?01mVgDVmTQI^HEYl{76wD@>GSe7BneeAEgv!c~vBWXiNCuVd zglIGfVST_MkoU&SQoLJJ@E9XV|8L0t`J)`^axlhHSN4?!Z{hE(e*j<1o|24}*MP(UY zLb`T65FCZE;4|5GzmF>K75`wQ-ZMFt>LGA+tx8w$)o~yuln|+>sh5PBb+b=9J(hgj z-L^9%Hui;8zSGFh8*TpHrK5b!CH2|W^-HMV6iol#7-HDFi??zoBH$Rb%dE!Yw7rQ4 z5li~moWyfEYmwqXQk(%$8u6l2WPvJ+%zzmzS)0S=q~e*+Az)gx51jL1Hr?b2YBgY6 z2uv@9VS&l)JnUfkbDpy3evFnXTI8iE2XBcgYzD1hB7-Rs__7gfVQ*jOx#bLjLLww_ zBK9U<=@%B9aby>VERpF%fdo-Fprf=~Z zGp{KpGQ(`wnyWH@DaI)3DGReF zmGzh=ZZp-nnX|3zx*ZyMEQ$M;w7y0ytvXNMC5vYZXsq@cw(5jE}Re&wum&6}s zDnOIvdL20BLzrE$x$?_`__Un}dYzjuxAv)wZ^BY0JGg8oj7Ia79hHU{4>#&Bt)cI{ zaWH+A8&{V&XIpx-Um`^c6V0YB$ z*CJp7$~VScf|2T+U>SDxvWK7_;Ssre=FoboH_llG+A&h5y@VF#)PPQWvoA}I5wU&- zwXUE_YM{`kETI%QM2=;gNAx3e~GYyXNh(F&^d2Biu7F(3A%;w4N zZre+JN#g`YPk-#<_vIU`321ylT2(;*1cVtAzJ5v9lP`h zy0u;44~reprz)0qbHS!IXu+59=;>lIQg^TY>arkBAc+<4d>q9^IDl#7HrIX1#_1)M zk=JTm%}w;esATYb+p?+-YhkjBX`-||Drp?9SKdz8Un!iK!g7*W!@2BEEn8-0_#5FM z{OF^mL0S#`00~<4>nci*Q}ro1 z(mriDddUb?X7cpxvN!JTwIvP>-U2zeqF4TOEN(l{P{p7bGqg{TH;(SV~CKT~sN#qW$UZ$fW6WMtrAZ*P6#U_*5N&&EVq zxCi%kFv9^=;Ui#V!(k}t@!TPGHywikg$g;J|6uNC@-Ckv8qn_xPJgW>4 zU_ds=d&VCiemO_Km3DnGBF$DmJ|R~iy#7AmpKQxqMjV<>dG*`7?HJKS3T63GA&AC> z$@S&+OgKvc>j6>9#wu7-QS%OpUO=7CxChSrW-FN%Tv|Abb_O!H;KB)yM4|P`yie78 z^>$|Kj4&GcQat>)cP*iqAJsI?*ZdtGwq`XPB0j=w1~9CfBc;{uh)<2w_;H!+WIQ-&Egv3*+sP(v*oQ6HL~@g(qVc}Chq^OZUw_&5c} z{-#PZNZn&rBeHwqc1N{|dW$x*pN;(JMJ9XYENg;k1+WRAJc zrJyY3xPh2Q-R`X2|9p&@X2uU|7p`&J$q1!50Km3y4+k>2jegK?8r^`m4DnWpv+q2{ znLBbl@SO6ejs75?3u0BtF)S;o&(?3_amW~(norKcn-_`cAY1uHz@_nVciez(mDR`Z z1N@5PNu89|&3I_-#&0*^J>nW32);j4p(n7Ea#K5341b)-iBu@E66R?bf;6C?eDQ6?sujg>wofYw=i`2PO>xo zmzTS`t_qGCrjNX2!&rl)OayYTbR->=SPH;~Oz7ROU=g)Ks(k5evLUN)FJWk^gj(Yh z{>zU;FUc{4n|uGhhUF93H+tV$URd&lcG^AOdHXKsu4m@WF{kn6JonERr~{gQ=E+b| zIB*1biL(33AnP{ET=0|1v)~j#Mp}PWcxD>Qb-aJ9oMxJ=a~g-kL>~pXG%!`IdTdq( z4cM@ZU7aCMPwQV=o}WwQ66X(jW-F#AO6_DKUS?BJcpM44vUS8;1%giFl^%0Vf*SO_ zq=*`x{@V!}i7?U8rdaA(rnwnC$~)Yj2_gzQtw}c)QZ8CQ5<`P_s>LX5!eb3#9_nlsvoA|1Al4AB3dzc1DefoFa7GVq2F;x#-n+LP z1JIlA+sT>n7>j4%cFx_znLe!+U5=s>?AdXlf3>t+v3-gvoFuGcXdnB}4iIQG8%{O* z_{r$+T)oY$BVFmeD%o^}{Vgh#IU!j-1jyCO8Iu|-nKKGkHslX#)B@~HFrOEHn^S6+?bHbV9g9UzahT~l zM!(#L0nrDz`_+QdOBAh`pe{~{|)9&>|-^Ce~m#&u=1$C2FA>yha`=Qtt@?ic!D& zfk)}=pLzqWK(*h?Rmz1?^OsOvGKODBqkj}zVJ=(lamX!hbsC#TQcvNb)JGV>Rfo(+ zJz>6d(Vu+}QZ@!7{2d&Lf$3mElz{vU65KI3LkXNGL@MgM44*Y#TZ!saZJ4I%o_l(s zG69^*)$$bBd!(6FGzip@{N#?=JW?+-p5zH4T|38}YR|tEjA_mJlH=|pr4sZQ_D&9C zZ|zxybg4T`%b#%@y(fe4~WJhKI4nlalE&mqKDfd0&nrP?pC3A+S! zM0@>;Ehn>YqdF(L#S@*yXKkhKG$v#SAW1b`zi~kn4eas-bpGuQeviOtaaDNI$vSoy z$?U!Rw}@!eDP-A)@BZ28KkT1HzU#&Rp@05wr;MF8dR(e9K_2n!?TIpyB0#lDEJ7|* zGeBrB)OPK6!i8O9=l|@V;|HIo1_yghx*F-g#OUIhSllkBvz#xDkKSfx^nZxP!{?zS z0*Mm7F$MoWjJ;EkrP~&*Ta~tL+qP}nwzHCzRcYI{ZF8n=+qQXg#ffv{?!Dtite5#Z zU;Z&h@4fZ*HH#l^j28f2zNu?Nwf>Tj)*tUJQ%mq7j8{_7Bh=UVK8}$j=^o& zl=Ohb)I}IpWy%9pYt@mn{S&!#P*Hv5V~WZ%x$64L6`0EQq{Hbt94jg#(&UMZZTTw- zdlXIe2wKkcEk)?bFWw}r`4Q6U%ftnZurpX3V`iDmWS&GFO>5s%Q3_gYNGRr)rko_)2^Jef z6&n4HoTW3g;Z)S}96HMmf{#CxP65`5)Bbvh(Ih;Bc_HLTNbXcbl!lN~93$3{f;7?+ zxyd`Tj_#a8vk|mD-lBcZG|V#kIWr_Kxo_<2HoRBL-%ed@XY$eYy*!Jej8V4PJ_Jtv zi_#qJGUYM00Td|x9FZAj{MsZd-QMZ5tVtCY-pZB9yiA(JOkO01U$4Y8NCer+%%GJk zlK%RevOz0{OAjoT!s6d&gP{m-WNS9k+r7uc&34*Kb5<+gpao*i6*zXksA+e3Q7 z@R}&w|I<&We)rR7%RiU-Flk$4^0&D}b#fKUYz4Z#I>J{UsV;Vd|MWoPPeAXfHjG0f zZ!sXC@bxJNKJl*l3%OaN_JKe938C(O_NzZ1v(tkG3O_IT@BRc*ZNQC>iV>3|&jEh# zyd>W67x4_9hl@{ukPJcQMSsW>(?K7ov~IbC((QqTK_F`WCj7K4%8mvuHQE`6_#rZg zw*XkgLo7k^QEWoGyda5XmW?A}U|Tf=)(8t8fE)e@fhUj4?T^UswO|kaciejK${MZx z_uGpJ@$WQ)f6kJ#smuSjtya~xpOZlOBy&BVXHA&xV_VU^Oil=D8#DDSNRXD!ML;SL zk>HVAmpt2DP26)hfnVmY`D2VP?i3S%nq~8!uVJFR)IyaFT!_imf3nc%D0_NMhCy(Aj|g+>=0(0*+i!s z)o}|EM%k2HqrUZs&E0=Zb~8*(+tTr*NIWb5pl4^(S&qX+E<>wfw+UmmT9`d=&+{|*Jlc9es?wPz zQT>J5&TC!2sXS73M+DqUXy$&{bZM(9d^T_1`qF?|=1E$92_7Z1V++qHsJDo^qYz3T zd9BIB4CAUW)M^HW$12!wwhs*xhFp$am@evOqesqrtuTk;t`}RpLfme<8HOk4E-pmX z9$`%@x}j?9csdJRcJq%Q^XXB1w=%k=}Z_;UoEGiyk>7@feX7!F(}~liF#o^iKKD96wVt9Qss% zahjI81@X2cGpRl;jxa@FXf!;d1kXHm4_cnSyg)}Dw(EW&OnJ+UQF9@A4zZhpKhcl@UGRWI9!#12Mfo0AqtmD&UNdtP5DF(g%?-&fH_ z4zKpJ-}pY7QhMMN2E}Q-=5Od#v{~-IoPHobE&4MF9|isJ$c7zXCE~;x6@-W?aeP$! zHQ$4_AVsyvhp`kEB{PUHhg)-y_po5LZu6u2BRNTw-`hPj@i zs1iu$>yo=BL%K=T4p+#}VRKap5|#>%KAWrmywwGjAkDzkIZ?T)*aZ&a>+`|rs8$)O3|B>1gY~|+^FoLcCO-YGV z^nMH~Ac`wLC_}0vo&yd1GzlEP4Wso=L8OJGwnxx^0Qy2Q1m82{6@1eUuOMtp#U6OC zN$0FAXI^@@_U!I1AMl#Lb%8uZG$@KpjJAaSn9%j^21b*9zNI{o#zvd{ege(t{h=^A zq%{hT0ABG|J=w(q|kHy@?qm^0ny1Y`n{Ib)nw2JQ~K*Tbf8otOX+W`s9pTL z_6<&~tHQl8 zgQ1m@3o7;(Hxeb+Y(n$9xh|^e!Urwerk;1xx%v+Ua>+ODcnt#mr-bfKx~F-3{s|g} z+vYS1aov#uM9L`93db@-;?@v`%Dl~jf1IMNT|68J$NY)XV?*YPr{d}tqT8lkIJmpikj!1HMtKHPdBMl@6x)-UHV_(|o zB~IBgXS`C68c(Td>$Kg#$yKp(W8c=XQkj!qDzh2oJw~!_HZDE8Q_pHm;W$DBfht z_JOlhQ(%f6!#>*3NAM~4vS{Oi;(}NA_G9ZmKir~Ev+dIFcjxB2hWl4NpN+lIKi{p5 zrJ<*()BiC#C#tSFVT&U08teXQ)EbJ5L<%j>1c{-q9iQl}gZzo;k3<+h%)uBGoXAtB z-nf{y5C)R<0*`lho+m}e0NSBAkbI5WlNxI;1ry}t(ex%GFaN~ZS-$o4eq;WldWRX> zSffUvKhL+2gvfoU2Ns$Uv@1M))Kgybin_c2h@auR$*T*6r-j)g1~!GJq#@+24?4V)-{NUSn8GzB#cd(mSqDSQg^Dx2Zf4E4*C#% z^Vi@lSuU((qjKGIKBhhQthv=Xli^xl#M6%i?cACQ?24~IoM6VKuvydf*M4l}Gve?k zvU5gikxQQ)0cDn}4h61r=??Cszv^APpfFv#)NyTZYpQCft&Y%Q&k$SLFcb_tg@G|> zHUy6|S~u9`YD;ihBzle2p0bH;#ZH$KK7`36Nh~Q&AysvTkh0dOBP-}06U4iKY9k%P z+m{{)Hl~hA6ZuM^))DC`_@W%7_vMEFs}jqGNaLA@io0}Bp)I)smPuHJqn?YMmc8D|w(w&_P)zl3}+Ra)-Wl5Zc5DGtt_%%`P_X$luGe_(|j_^0rL zqyYojvm+L8_4XgRo6%_f0JdULVgXH#+a&BA{V|KaI}bLeM8%Q1}PJLWesNnVmxMA|5=f zkGTt+%;*qDGG-!RSUC|6KSd?;R;G4zGizo#2CdWgx^XM;Z0j>BCVWcc&<;;5${Fm?5ywzzA$ zz0>kv6I1Mw4)%L|eoLExZO=?a^;G_7&cUue?IK6m>e=QL+9*jG!Vw*|8_d`J!x(l` zT|mWQo#^V33pwp4+JqvKX=fC>MrYloNf*Xu9TxY`(2kmiBi4^KhxJC~K>Jud6_`j!c-w zqMa|$S%t#}vIQ=d`KmD%LdoXZQc0jcAkjITk>-xbqOYHJU1^1DxrM*x%yEg8Gq3Ww z-uI%Ld*4ZZ{WSM>7JJW32eHTnG7WO>zRR@VnjD$>@_7RO3+7#AL~2C!Ye$a1ZMt%o z?*6$(+vjQ6v|8jU9)uU_5>8;?`!~@`n649QS4kurzKG;Xonaf015){eqVCll`2|zheC;7SDWI3OWHtN)xUb(5qQ#5$*a* zW(I%59*0G!DHa35_3^UU<11P+^iLa!?(!@r9aQ6$vgTMx(0JxPJt$r>bzIw#Nf;Bh{xo}fgZ7RF79ypI(}XM| zgN>C>Q5$H1a{+Uxu6Q2DBf*_%CndO)kwrW*7DqT9#Z&M>(Ygx=T`yzkP&HkmddfoN zQpT1Shdua!uX0-utbo(*$V(uSl)1E}bs#S9A(hK4GNC*d?g0vK_L?Dz%3TDI?=I83 zhn3Y64ly(vff#9vMv2R*)P*K(5-o7(ke2Xq$#Csg)^mWS;xg(i_)?zCf(p- zImgNU>8!3FBMK~Z*N`fweXM+4>O-)m7V| z6KVH#Xr{>u*g$e)3Zli%CuNO^oeLs9J2kk-lAdBqw2AFYuuO4IBRhftzbp8A+1jSF zojqoIxT(cwS$v=LAW2=UFREwkzAVFVu3aof&ty?xbm$u~Lfw7hWaaRi!HLs`?}ask zL^`j{po&{-_11k>MQ+Gx7Y6GDjy=g+w+4*|(yjg)D4X0)oX*Eh2Z9Br5S5!I4s#gH;ZMcE`B+Fr}n9mMGdsH;CT-GmsJ5yKISpnHA8+FQ5 z7?4a*{6y7M`4yd8<|K%RN#K+#f@ZJaYCn)gQ`S~^ZsqGB0H4vD2$b(GDHI+uTQ)zW z%1E_Bb*ig%(Xl?gUVEeO8p#AG^t3GWL4tOvuF4F|8c@~L;br?|oe7uEBMa8c7>Ki( z^vb^XdB-3XtJh#-`}EG#OB-O_Vd|`qD;AR9YHm?e51ZQNq8}U#mS~YLE2`F{!57wS z;Q>EA;LkG3(ML@mU<30=KTgm;lqWleK13L=Mjs>0zELgdWjgc(t=9pZgQez(DFvnW zp%u}EJuHX9zB4)y!>o^Q!5ErM2jp8EVjB`)U9GwQ7Iy$jcLdXRfNS0(Z`eb(8K~a> zgw1@$<-R5_d=JF!gVM}k9BU-qxEm3YKgvp9u_zli1?oV#0O6{ucxGf~lja()fi=Cz|pmxgD zhD2>wfbP6*Q3&WDy$-|pury8Z%k$OS00ZR?6xzDX0d<4)WqUm?juv1oJg^DNW07x+ zRKexBQ!pprxj_D1uXB2+zwK3V`~t?Rzw@eW=O*)ON~wx_J!!0kLZf5;s%n;r_Iz)L`KoG~2kEbw zmm?(U(1dCuDstIh_b=VfA5&ZJH(TAWuzxp7`fG5_jh-PU%bqP@xPtPBjYT+whb>Ty zG0-O?c5o)4%|#uEf_{*h7>Y9xgbRUidY}b%VDye);3S;x^q>ri-ZMqb4#@>ICwea6;V0ck_4p_g&{MoQ!D!l%N!Vwm;w#^ErqWYJV7!Pc zU-J+aw6^bJh+Uv{*1%t^&-WbRRi|2BiQ7p*k;9a0sy9H*nCuIQy;4Bfv|cT0mlq_+ z#8g2*Y4t18n`3(&MFs@L&jr&;A$10J*ukEP?6gtAwC$Nm3LfWu!%@)Ys8@Y{<#gNU zG@T#w7VA&fC)q`tz6DQVdOUq14Pi7=j2_aVMn>V?u(JhM8Z22&Fu(hmi|lHfXb8H@ zvsA?L{q9RS7^w4u9ee4Qioj~q{smJcdSa*sZR&TWH&dIYTuhRmvW$xr) zO)acL<*?WBv?l`B8EP2XUjW@Os{1_#RafpJ!!;r8JLhlP8_)`4Y^O)L zCy6m|U|l?Wn=Gfbtn<*X;=fkIM#*7Q*3UpylosCh$tBNuLG+=0$*kU>`U}^r-nxLf z=b$iqD|cLR7M&q%s;Zik$SbQB%JruJZ+u}YpPZfG6vZ22SpLBn zze?)DZmiiu(g%^;#TKZBS<bwQ+v7 z^VR_%$Wkmkl7K9&rZGW;$IIBwbkl z8q2M^1Sa=#Hg^^tYMaD6*>$wMXPV}9OC^~LFD}?-n~>~uM=haA={C3Js-L&0e5&~% z6{lH{mk5w`CIfdZAOAR;%M5?=O120{hvN>y(O`6&Rz~0X`A6?kV}a(r`SI1Ct6nFX zma$A7he~xk<_tc$#8#$lK@geN;|6AwHNIp-KJ~IC!%Q3MDA;P%jurnVa3p8gy|zNT zFpIH$8za-xvQ?@UvCp&CVp--sst^S&w2WAa4`IEpf|GRv@F!J}XKE@hxpp1C($gN-(TMAGvFqB^o;Vnq3{`=&yhAQ{QX60Bv>rarEp!>Vd zukF#{>UdGV$> zt2_9b;g9?_qS?M;P(9*XEoA0$#NM)By*m!_au^ejT0js3wEdcnvbnm=e9bcYGak%!lDXt9`iiUz*ZI^wUW&yMTkJPg z$>x9>*K2m=69R@*P~1*ITEu!U^40w4AKyYyX;iavdlRNP8l$9vOM?}-dWYXMtBy&> zEMvws0-{M~VTCPyN;>(2XEc4X_qW136n4sQOUFZ3jxc`?tGc&AKEr;#!;&X*@f5S% z?wR81DJXI5HI9~B5Sa05UqhrHVj1>tWL3+C(dq>QKRne$qDpOv9VW5E9}?^q(7V?Ze?kA}oT%XyqOa?F zPW1Y%PyDOBKUXIwQ#<4TB%ta#Bmc7+(6%Dm6dsr)1ca5SB%9+hmMozZzN`cr1R_a; z?^(Z+RiNG6o;d;Ldz1VO-f{ypnA)=)0YII6&d1qut}DouTrFkR+xPBx%R2hKS?zrL z#9#dh;(*70n$n|+>w)4zvkMI?&4r?aoKEkmGo+4{{~90)it9q z@1P85hJhTi4oot42CFxD(=IyTaxJ$@g)K+5Yx175x#=O?LB>lNyCB%k`fy*-Kl zsO!Q*u49BTcDRUvLTH{s!HGxT+L9-w9Xp-*8(3h(E(t|*#8GEBc^F> z<@dx^h1%%CW|P8d1D;lqwTEoI($@a3mS&P|*klp2iyJn26ws{z+!ugDL-{fsZu1c- zXUUa@xdsP?AXE&!We5a}g0Tb}&Sh0{CGF=g+7`wFv0AcGSi8WBzslPhvAdVeknitZ z{hkGvVFu7ZHl6Atet|GD8LqY%P@@voO-DT zR|R(dx-*Cs*v&C|=lXIOqa}I_3~w7eXr*%<-A6oQ3imjOfg!ZijYd81m&P)Dak<9D zSy!JP$`+da)(Yz8R=e`I=`?*ns`?u95Por5MJi#)4w_MC{P0tFD;1nai0uGW)2^LP zx6-7Wzu(2t)EQvqql0&9hgnqb&$SDLlQpTRD(}|#-mrEohuywz9fWO?X@TZ-CG{)i z!SIQeuV}~;h!JNHk)c5JW!f3Nm{pZ8a>&Abc0AyI9J=PHA!LUmvJ54PSTuh|mEebC z#tw*FToT87!Xd~6vpILj!9r^{LzWshhF4f=>ypB)mX@qFZa=qzTaG*eM@YO>h089B zq>WPl5z24W!%GB{u&$11_#DXV;TjFo>s%6M|LEcN6rIexg%q8MZ5G}sBi3;FkQyn7 zY$9prr~;@=9^vl#l~c5%)IJOF{0{%MD~5ZS;1TN{+0TMTcp=|ygSKIA0){> zUNIdd6HSJ$dC`-b@ok(#(kYmMr-uF1P<$~j=IXY5$5Fc`ZAEWlgim4z>@dMp&sIa>7=VIy6Dx#&))Fc|pZm^`lu(!x zlozDUCAX&)1}Mgo!m@*g;npKh(3?YR(X)G{m2Q(0W-DkU<=&ASda8)R{+-4mo&bh@* z)@Pp?)idqpi|n*IiE}n^aq4sc`EeWNO+c&exwhzJ{JlB(We<5yn@m>z_6VBR3#c)z*bYfl4%GYfu>q?#JGOSIJXhMo=xAg6aF)p{m zKaT5L8SAl_VXxIjD-4cJw&aICK+(qc{cvW{BD@h;)UGbsdFtk0r0b#*I-Y;ZR|)}} z5m=gQv(2o+LW8a0OX)y|27M8ntLmy{yL5?+@r+ZBRR(6&Vr>BX1mo@7=DSo|wIdCz zPiVevy}ndqxQ$&=miQ*q2YiARV}W5&_HrJ6U*@ZRUDk74Z)&s>oquLq!8b!`ZiF_} zEHwu1fs(?b`Bp>TbWx+u;F~J*2wG;7c@4q3H>P&dM(223eeO2G@eq9+e{zHd5!N}0 z%7OX~R$n=}_xyACLcC_K*gSNC!tpz+P^^rE$>RYb zMSQm0uhu*XY9QThtT9sScVUfVv4VMsBU<>!*@x4i!y}6QE2gNPjORRe{AGNFWV5t1 zSvI;NtKrCbwI*XolEqGc5N$qwnUdwBgA z#sDf<0%=>A8>6r0evN<&bi9UXh^vfYrrL;nR+vTO(Sx1{l&(pcNCaK1Gl5ugD46j* z+ooXwl&)YH46s1mj00@8!ibP3qyjwyMwYs@AdI>Rlu+!DU=xq8M*Wc;%HEohXo zqx;+!(0?9!;o0r`U*GS4?Dy{fztM{RIrRTKDz#Z z?HBcqqxmlG?t{DE4d3oFQc2l~2t49azkQB6Ti`?cv$k2UjpYMbQ7{LXL`4!d+kmxn`wYHh)#Ua0HA zZ!3#GG4V|%3Dtc5a$*+YnQRI}RrLlx-_!)a-@PGX;ww5};HzFUdg~05n|Q~O@(-j( zQ$4frDf=CMtyAySkNe0BB4Ub@ddu}5-Edg*5$-`Vbq%-c$6cF(vKy5|;OWO+tN!Fn zolMo@s)A+_+f7xGV2%S`{fj1L!RbtrEE(+N$tF4e;mOvZ#{6(RU#HsBNR}#>)(n*Z zV(kT*agi#>v>!?`=jq1BnqzLf`d1J~p9Fa+LN8LqQrCoQV#h=-$3>paa@L8(UGYnI zChHROlbCqbj@HEDBv)aoCj^h3ethH<(qAKYxl6H=b^N9cDb+@b8MMrnQF+T+OY)c2 zyINGN2F_PQYDubWQLsg|2|+f3gN;2o3MDr$Z;2@=+H#%;vt__)xDH!`{E;qVQGjx4 z1E@q#^k;wAW^F54#uClc!>E#Fx(geCdP(L`L#(VjV;lVfv!-``I;yl6FPAP z5;YcyLYlH4r@h~L#yKkoh}&3{4^;L z6>iX*y>B3bUbtDyUKO1-BEv<#BYE3FW`~k4ABq&<*vb4&sb+1LOsWX3oLaqOh{HL$p)u!r-+@s1GZ0SLr`;91DBnJDtjhiGx;Rc3l<+&ayOL->B zFAS2W+$gTn8+-~m%JTOVYXyqR%%C>;jV>zvwy2(u{D8F0HVXE0R~Y`bX`f@WS;;e@ zPr)ur`U@k!j~_FYUa!3BI}CsEZRVCSm5;AJ6pc+mHrN^a;_|Z52OW7*fPU#St6t(Y zHfr~Pb--!^NiJJ7miRL_YWEO6$-Ck}_BEHP5%$onInikemo&DzLcZrwQ(OSM$~)*E zQ;|Zhe^_w?B5n8e!^{* z&1F5K1{bFHZpXT1G4j@Azm8!2<>pDP&ABfC5_jWF{Q`EA6Bgg4!7PB^JQ7@(X({$F zS9Za!>p6vQOXPyh*Qw9Zj3OLj%q^wO*Mrx=(4wpA;`rQV4JY)W+BV$v-tEz5bs7!% z8hi?WhG!Rj{7A?^(&4hEG}FGny^?ELIt?AI>>?;>Y(-e9D4~LsRokKHXSn1m5@de` zq8K^}EMv7PeVinGV`H}h#v4@zF@c8#qI+>bNv*Wt>-c~0JRUT2&Y zpYu-8UJv9OnYH7E2p&i}n5Jy{Wm7>hUgW69_4)N>7Gx&)+I$j|W9&Q3c=9f3Y}|#H zGA+?s{lQiT<@ue`spwPZ*r`q~UQXI}9ALOk+WyDATPKLG61d2}8~=?2f# z%ZksZcwfhaD%-+BNiO^t0*GB+_YZly*DgB3v`c-@O(E({)O)&4Lm;CJ2ynZ?;xQw- zLEC#3+n*gvO6V@IozVpnD;@#+XfdO{Z9q7*Rj+dt&@E6DnALwEC($UkxqN4Vbi@_J zft12=V&nnNNKRXj398$wpTbwKluYLv|?uV>ID5FFVe^vHZi$}LRWw;oW} zU^+Hkf2Hhge|9leK(%y$LzNh9fPy}sY2^Mr1wxyZ>$F!??D+em@``N4@lmT)tBTu~ z8mi?s#67Cyi9wW3cheM9r_mI~j;Pwy2}!+~;%A{2oq?kOp)%{l$EHAv`idWSfVWwS$O)JnP>xb=|Nv$~1Dn$A}$AF}M_5xY` zX2+ON{VdCmNQoZRmJe}#E6*Z;Os@7_>^hi4M>wUvQJ2kQ-yTN3VNaz_Y2cP$YE&h$U%hs?!`bU{;7fUfT6su02` zM z2=5}ogp0?bL>r6X_!CAElaj@v6~`c&Gf?Rb(A{v=?cy)fenxig(w-xK4fq5{07p5k zA6WDWilaPn{@V5#Vu0fmyU8IA4#s)Asc}vC3JnYZG$u@Fy-u}8esWERGKEz})_nt` zL>&@kcPcn!Qhy;P*@yXS$gi~BG%?irQmAqS`r74g!B-jg-0$+ zB&dT7aP^V-NsS(;%nWHSOKXTK4CLo?sHKD%GDlWI7?ScFY4WF4}OlN%UDKcQoDtNz3j%b+j&$ zo$A2yJXKRB{e=I|Iwt5tRORfuc@g=pWw`%^I3Qy0YGm{O(FpUKr zReMHd-pDNFT|3WBpkxdhP2jlc?irfOr=cqh(yZN9Lk1|HaQY4h)QkKfmrk-x!nO`C z;hR*5cDYD-|}BQ8yc$vb2*nM{HHimh1wY+UQ6aKmHoOQKaLKR`G9-U*wkkc|{H(c9 z@s?!lMMZ{bSE03bQmW>NWw(&gU{c@qK;Sh+_gMa4I*I2aM( zp)SsDck+w?iHo00G*S^3?K*C#H$>h-%ivytI6o6Q2ZZ}Y!>a9;(p_X!Sh!XUOrI2= znzlk6Ch#>Q_V>3gP}s8i`ZV_V{HLu9u)P8=X}pfjg@HEPW){!7%QQ$Fl0ubb=k zE(ii=k#U*T+ps1b>!|tZop5gk3r|6USSwBcuq&-cDZMJo^Iki1?U3@dP5V2FQMe2QeY_QqZ+*zNs!Qx#x|9o%ZpQ9prw}X`!qjn1 zW?i;tGa{Dis}G>H;Fh>=EyN~=x74M{R(M5(rPM}v7=C|)|QW_fV4s6oO?gcN@y&qzkQdVxXagl+Y*^PE-c}AHiYf>teGxy z`kxQM4~<_UXR~m})^D$Fg`YlsK(LaujD_%?eu3b|`F56tU8`SRPqo-8f)?=y45mQNURw4)N56iA>FkibU4N{+kw z=YN4go53!l)4%a^>)&1}wtszx{7*NeCasJuj_@f)P}xxN*WfM&KQz>qCUgi$P6p=L z7m=e+Ba9a4=dG3`u}0l$qMQ2QB;!zqa%o;g`_w+6lA|gWyZV86;cPt;(lQx_z7{j@ z#@5ot++6ve&yPF$AI9!fdoXrE)8X1kc4HR35i;rAOlGkVhH!UAuIhuu5>T}SJ6REI zG*FKEAqfa41bp$|;TeI$5Va&VeCTvzKxU$S=s?T)T8TAehM9yV=~3mWoRbV)DfMAx zX2+Ve<)xq#j?Fk@D!6uM1@BpFR((|FuvwNAMHqb^S##lOjP@&{6Q&_Fc9zks3kUK# ztd7?qHo$XjrS0sPT6wjmL5rHy@(sA*Z6nGDMoDYZSiQ_Hv|5}K8jB%8kFKWW?WNo> zM|t8%5aXAxwYjO-R)dYM&VV_$&MLEO`?WUd>B8gMRC<%yQeY2!0crDQ_sNexkrU8h zrSpZwq%+wjL|gjd3>dFbP%&wF zJ*>?(&SmV}!{`Mv+ex*G^lD)*sP&f$6n4+N3wUyhDbuMn? zzXhNsciwXeW*^FV(8|8~2Gg9yJSZDV@h4)jm|}8^a`VL4>y^3$fCYAhqcCm+IeSDdEyzh(%|=n+&_O!(+S) zAvJJt7RFG3xepVT<2;-1^vWCA$4&(be8qvcC`3|ZSmzGmYcE~F{45zi@n?LXtDL#4 zG=rUR>=zN@{~bR0cZbG1BxFb+TO`|k>;CLJ`OGa2f7UMTKEmhV8BZhQ18%Fz+$+|E z`}eT`U*$eNQM7b}vejbCxgk`6FPBnUhxh&3j6fJXp5GY}!E_mzTj(~uR}3#}GgpB| zs6Z;XPazzixLzL>&L7{TglkHys_-+-FcFq&Cp|fdEByQKOGl4h2DAbx@F!W zckRud5sD?@2>&96X%%iz9I(il<0}p#V+^`_e^)|GO;s|J@eORNMNNfxelW@n-Q8 zkLc5VXg^V73upt-C{oZ07S+OYMZ;(n6q`qyY&L9+ektdC{)olQ#?kk#VeYz_1|JIE zl|jfvybr|8$}sf47X3oLX-_YrRj?TYZ1O&B-tBQ8c|Tolemx!O|7_T63p2YfcL%l? zWB9vAwJAgufqctL5lq#JF?EeKXl1<9*gb~r;P^9{h)j-V>IAakF|{o=GcyqE7@LQ0KH-?wWqb5*DT2m@3ZZ(eV^@>iE#yyP}=Tb>|fpe6(o>4(R z7V$$8ti{?r#TkaJuSYuGm7?32;wgJ|L|#YfqpnoC2d5iqfoAAsL#Kd`D~CEw!Gw?W ztDW9W#d%^DtIZJHcSZ~u8H$Wm%Ma<^gdliBXqCv!rE8=*ES&S{7~r=~XW0Jvm?3eX zNNT?&g}>#!!ioSEI;)m|F)Xv|+93Js(x52^(Oy;9?7cLYF6lBKLWk>AI}q3@!*qd< zy&-=VUHUChwpYCh9U}va+It|cC2=<-ui5+2apYzEaDHIjwIv&+WBP13rtxMxn$=&U zPMvto^yyD@$UUn7b#Fugqs)}lhJ#1WxHC-O$%U&0a{s}pScO{CA(LfljY*T_4pw4x z>ed^xJK|UK67Oi1+I3#bYK!H#G~U3GJf4#dx~9QhWBG1%m9z&nInTGWwFZ|(4@x>t z3|;F{)VD@&$#;6O;o&3MU{zj(v)^cR3%U&J$gO@W>Rmr|zs5$i#BuvHG)TNO{-W|R z8fubgTH!^BvruiNa#1BTQi~ji^X4{jouhW~!b1H~5%GJW-=!_VAOYk=^eCS+pcHqP`_DY)kX@i#3$)DyhmjuS~Gvgwn0%FAK6TqH`HX3_d{^8Ilo>VSDG{)D|2Ys@p#6!|8{_S!Aar-|XHPy5l&gjLs~Z`IJ(F9%=M z;Ilg*Y~>@nIY4ypF*uUkfVYJZg?7(eG#_gZUI`}Pxe?3A4;?d4zQ7LJeH$P+siWH(VFOt*X7u`bhoM=Mq2>)ITk-Wo7;hcZa*f1<-c%=?13$ z7M0NzaR^Fv*@J*|Nnn$`R};IXicM&YQY;Vl5*+l7bh;uUc6+V$J*Hpwene|}hxomD zw1Gsg8dd$KbMf|Hy)Lu?1t8{XZA?|5T|e|HqySTnIfz1mU-hEK;jr zBIpgY>mQ6}U5-ZjYO9T=Q+FPBvAD#4gZ|u_HZOv__l^II)sHYYt5paAD!Lf&EM`8+ zYJHk~e}4E5?q#Gou>h3Fo#jP2>dZQ{LaIBc5-qv(JLqa5Bc&%?Cg9i&7tUeXom%u- zAO~yzljBP~ee6CkeGAppW6`!6Wo`_q;@5nG@Jm9oV6(j^33NYL0Ll+nX50NRoYt zkLMYz4dCvuF0opI<$Q%39a#!sXtuk2S@1B139Pp<@UYxTYKLYgzJq;{YjlXg&*XtG zjt#JWB?T33hEr&ztS#c=h7H_Is5GS|{H7?g#eD27!xa-n!jOmg6gQm!wlkD*?PVfe zGNr%pa$~@6Budvt99ie1F zUXf!*#P^OnFBxz5(XcMc2F2aDlDtUjy^&xM4G94BX^ofJt<_FQ$?*3+XTnJH)6m*NF!GwsD0kQIr>~_ex!G_Hx9ikX=jQO zosr9w%8r|Hn01IIW|2_EquGSw#qUL?Zs0e-Ya2&KhvI|jVw&wq5OJpwZn^LTw!Q>z ze)Fc2T>scf#TYGY;BuMAEKOf7IzHmx>Y>38f6ee5t%JjU_u9TBPjx z;S{^b9RN7s{iP>tS16j7hLQEJzXj#Y9ceug8D*MZ zX8})X;0K#l8g9K6Mu%Nc3W81>>>?1xHb)J56=W4pI-Ct- zB#Yl$m*yq5-mA;KwGYNjQ8FnvKuC1q?^Th|S3W`|j-`qRW(&!?*J3UknSSUt*xC03 z^$R-Ck!v=QUT}tSbOVN_3MDR$H8c#!X)N0Pq(&zSBpgVa8JX8oS8i%p;&V}uquv*-EYU5E8yP~WAR^|;2@AMh z4MgvUSxdI|Wy(dbC`8GJLDEDSIPOkRyycm3anv)l$mxl~^3-Fj7~88;%dxQyRWUIl z;gt?Oj^rCPDp7O~SC<%Vl004tT-}vc4ytm9v%nvp?mlN}dmcunKIifcQ1axoU>F6S{96|fDgKh^_$52CegAN?JEJ+mxQvIeVU}G6jYMtQ!hzDtZ zGgTQfeWdmp;S`35xF_N=0!zQcwV8Acw+Xw=3wcFMnG4>D^k|eF@Ue{C1CGSkFOI}_ zScm;A(pM}2cAXk9brTqn&e2yhTSx$NQDt{sPo1Eq$lh>}S=K-ql#2~tt!Ev7O&VQ; ztj|c2#QCFSpp078NpS%=Se#0(_)V5{y(QqM1gr_wqOXh?qpa#UyS<5@|A!M_^?v{F zORxJ$Zqb6zvj`q8gimRHixakRxgs3gk`xPWYS{-ifIzgC7BNCVq4?gWo=z3cZx9O~$M~j_!hF6fg5}ySA=)9W$hp}^tvTW%|Rw+b@bkxUQ?Qq0Y4__cXW(Q{zXRs#Gai=0xg1%Na8D^L^+sxjZI5 z0w~#uoJ4yQ!ug|iYn|i6n||`006Xak0KYgu61I{*g@fn;jjPZQ!gm>A)j<5K2^hVL5St zNX$!Y4$j7$GVc_Y5yt5wtSVZkHcqeQp09a%{?g*M(Y1ScZ3<;O8po&n8z#+%m-dLL zyXt+V(g){@5`R_N0`|;w6M)9(k09N$Tml8z5;oEy>7Yw=1H=Q*J-wYZewa-y;x@b& zWP2#&+yjCSuwC5EJ=EV1HC|cH_{bSC$9*>T82BSM4ugmM-3bPqcVH%-#LZhs<7!%} zRfuT5p^zHDtzF*$peLkR`*w)#Y5-iy{nJ+4VbJnhuPWEH@2eN3#TS99m(LguA19_S zB9)KdScFv3-9Pr+C#?l!8R)_5oW{`N?q1=%C9txp0Lo?L+9wocJ9z{{DiX|4P10}n z*(QR7L%D^0H1*iL2-^&4HZh`fIPZp4lSIh&h`W1$*ZusyCj(zfZ2YQZR+_nM+Gtko zDa06p*HWCjhtzd}=i0A?`57szg;D1Z%!{n6mXN3I%oKrx)Jwh08oOZDc*oPJBrb^j z%sWO=bw~cyW*8{F6w3ro^pnUFE&d|J z!M2-%zl9L*Tl92$1A}o3k4X@D_KW;9=ITv%n*4|m0b90Y`e{JCnQAO|U<8I9HQ=AI zdug@o{iV`9tTUHeH+L#c^O0YiB?770ngva1TC-Y^Dj2>lhfj`O^H zA?_u>I(wTX%gAZJ+Grvrr17$*s(pI;=7%5q%po{2vuzvHtbUZPKbWrIy(Q!wrLF{{M9uYA*-dP~ z?O$G{V2R;P6>UcN)bDK@K*(a+HyAx4v*^}%+P$d7Ds4&}5}Rtn_9^P{D{1ad)Wk#a z;th0T4-1D;;bjdNe%H3uR9U`}xSNL>7u$ZSb7@1KfNx6(#yrZ0yn$8aX=>qt%gl3*w z2J278??7t)F^1m3DNE3);CFUlj)YRdHmRxFCDYu6o3clcB;F^$+PgP1a*)X`) z79UB~Z+&dSEIR$aWvKcE(P!WjJ9YA0erjv!^2!zJ#ahg27@5p;B0eBoO2t@63$2!j z8!=NG@H7C`(h8(7YbxR&h*Ie@!{Wuv_WXT){Q&^NEdjz&Y6g`H8!k#3M)33SN1}gz zdBYAL{REF5*Bx&6+QwmBATj!B7>6#ZRd$SWBB>x{tjYo5O= zynFMl#m4&W(4GR)309)~(A%F^*c!9a_@;&ut7nE)#x z2A)JhL4_Nxy10M#>sy&7kuCvyk(Vfv-BM#)` zw)pK{$D$BW$o1A07@tdhl8vK#6y(_Fi@G;gfd_Njuh)K zHnR9A#+$67ncp(nT+*iMLZ>E`PjI{#F#UBkLWq$W*igjyiD*Sh%@(f!E9Fwr zzQQfmCmAf_h}1l~W*0POsa+%ot5m-7^@Zz4-=t>J)7~GdpeB!ZDQp9Ou%aqlXxt}9 zhmOd1YeWe12wq$78F~c2P~F@Rf$}ZZVe7Jv8uz z!Ek6}q3@%?a9E9(+l_U-lj9>;Aq8w=IAB8;hUN8^RgYg9BJIU+#rUaM?lo&=@)_8i z>FS~XTq|)Q8N}XeJ@My2*vBLf)AlYef1cjItys;97XNV=8(x9+2ef9~!K6^sPH)o2 z=1_$B^B{64O8JMy*X-DlK_y z_3p}6uei7LO0#q_s}fVT%lXSAciZlZVJX`UL>1piAj`DhLS;GavwevB9lyksT64ze zwBG{2P^da&h_JGp{bK@j+IQ)bTor_&v(AV%X3<6hlpwL~u{DTCdwx$CN-eWu!MKUT zq=~R2DqYUkU%^%E*c&Q$l^Q(XdkYR{8GNKdwuv~$Rr(Oq+?KmFvHOe&?+!n2C;uX@ zx^BJgvTgV5>lU$&)L)6}j+h-MZgPpp#cjFO6St$El%%`LM+#0Uq9D0md7Kbp&PBz6 zI1=8DSJQrAeB+OG5f&P}rSY_{q{>Tz6_MGjrvglSbiQRK>q-b zR@WEy7{4u(M!Mu=533v&d(=~GYprd1i=}la8*}g$$@W(hN^;0|r8K9CkM+|PokBjx zlWC~ik5pA~_*3yX&WfrwW#ZnhB& z00;Z|V;dtivnYy+*&+fV5m+@8A4%W?nIFEp^Mi6<3%DAh`Y8@H=i)e-jP$rzfSJ8E zGW$vt)VcD233U9{%V?DtIk!zuyfcbVKu1=*;^hrbfOPFNQGrR<6aYE;>WH^p7rA?}e} zK#It@bzDvS>+ma2sB1&?lME^L_>u+AYc=mD8t>3Kz;m*ALQ}aLt&Z&3emcCZBr}g; zAd+MRo4&%}3PwGO=(I}gkuObIR%#cm08#_ty@Kk}1`^RFT#hN79jMAG@I#B*-e`yJ z_Llyl{u9XCgrOQci3w92zNP2RxIg+d4xnK)V_hgbN9qx(0a=nQJ!RpzK6q`MOwyeg zr21>r)l4unf_~!fT8PV&zv!ic#S@~Guz5!L6a7Vja}M!h*~X&TS+eeInUwjj5Mvbw z-}d46E=G{%?XP8iNjCxQmnz9 z*xwc9lYHe@4N?=Rh}ARwR7`dj(OsQpW=L+!_HW9hTtD~skqe?oj2G1gIMVl~iN@TJ z9JmJ`ilSKl0%X~EcJwvezMb0ox^jni`;vNxukz6anC)B1{JsW2)Qz{=9vyF?@L zh=A3%UR!NXfuX_MDn#-@m!mFDp&&gPYp6#R#q;R3t5flWyPuodT6A=UzO5>JIS;kx z8r_w`3UcFu3`e>+kfyCYt?^q}Oa?ab}qjQm;&@wZjN#K799vas8%e=Me z=n8v#RrtasxGF*SEI0AhaLXRI7u0%2;2Lvclu$A&^Ovd3N=6f}afY-&Iuc2~Vg_~1 zmf=Fp3gXL|cYdi%AB^^h^vFnvwJ-D}YWDX38h$>fsN3oWT!JYvF_Ms-IYGo~92=nrMU?nEc80!KC6knXKO zA3OOE|It351tq4+8S$arT)-a^@q08Wgq}pGFh=Z}V^Dk3_})0T_hCHg zFTexY0w1sOq1&+lU&&H0(ttWkFas_ldooc;us}>V_0S&~eOPxuY#sEFMOFNXuwk^R$jH`pLuX$W20fi^My%@QBuL(^T9FeGH}6k*+IFBYLX zLY}a<`#yo%dpJ;G--s@a53NEsRKaBU9;ku(oi>-trV%E>S_(lc}yh$RFA#bNbM6G(5*?h4!Z=lK7I93P*tbp_{VUvzf_7B>gvjsb(G@|b&j1% z%T>i%^R=WO3yyQIWmKJF!?7_E9DR0vH-Spc9p?akhTk2$wqx3P?N$CtED@9HtByy8 zt>R)by;UP;9R+0D&4GN^euof&IBZG7%fffONDPImds#0*O0Tt&Dn?#JTpHR;6kFdC zSPre?a_(1l{aD#gxAeABya%tUo<+b9o3;P~AwmP;E8d!kcifZ!vqs|;)W}AY8%M}! zehS~f@mA{0h0BhT%H+B%r>-x&vK+oBiblv~e-$ecPg;f*1E_gs)75nJyIN()jr;2_ z+RFWK2@n&{lw}^{HXX^0x8x_qKh}W?kjw!|;Fo_0bnPiiv<5rO5ExqwvI7+mZreR( z8+13^dm!ArVzF${xELwJ{(dpGD!K=xfTlU1BtUK7YNpIre_X5v=d!f3Z#q?--QAsw z2?0v`p?|fv>APRnK^n$=ikvLoK&G?4KAD1LJXA(Znm6jUZWW}LGjTR?-0$r+d%^R* z{r$&{aCBx~$|k!Sus@-9 z0*aP?pD`iLpaWD$1J_V+&fFo4L!BLvt^uhEf{<#nTPoulf@&J287608`YCi2)?fs# z3?oi0Wc%`waE@shi0pRWO_=O+0@RzCrfd_4?0p0|i-8aH*ldBo zm#iHrdpZ5H`~9itOe29A_XkJ8bFkRF)0M_7rp%W2FQxX8Qo*Xz5r3?t(!M||DL97G=3f>ve zJ6KsL{HXe>s>8s2qQ5wFfoQ{P^&|Tg>F~CWgK7fr3*eg2V8F`-e<`>M3(3DcBFhyh zvXak{7a_k$aU7mFZ^+8xMv)K;v>Cyi_q&@a%CI4p24ah&i^a#+3)3UjBDBpXq0#N> z0e30SGiUZgK=?BOLO=|5_|KJ?VRD_0>Jgy-&}pU;L=f#ZF=oR0?40Xn&{-59I#A<^ z`gav=H&?ViJGnk1`fVNgvzG*Z=rlp@AtaG4^-q#>XpOAM;aVB=eVO>%d2)Qj#uKdg zgBeEMKO8K&JIDin3eyc!?+O`yV>=FaW(N4JA6yNN*PQB%kU2zCWfEiZkC2|}IH$Xr zAf3b&OYAz|7Dh$PL~2e&4=H*E*p_I_OVk$@o!UZom;#=zu@5jz5DZBx5iqK>WGpT- zN4j7gd1f{a|L}e=QD&s07M$jpc-z_o!H*d^eu>olu&RdAu#Hu3REfk|S(}uo2lE|M zpifsc*EIXf%|ed0Qlr2Kogwd!$8sQ&s+=Av1l=XI^|Ft^R$+tLge`u<KdrQ4lrHl%tiEBz^k&hN_ehE6=qu2PxML#vU{M)bovKJHL~E)S%Wm^lCI!Z zyrOEAoJMQK!4r6-TqkXDnT^|5rx29l5v1yZxZwEwmVD4u4^6{! zE`_E)-bA&GN1X`*rv3@?gZ7wIjM*Z9!Utf}En>fvv#T1}xF+044-?us_C!@)y<>An ze-bsHaU2R-7RQAjG(mq#p(PbB3{g<)4%am?*+O%Z6Fs69tD2lsAbXZxZ_b73mu$_> zvraEpv*I{3b3Dg6qAXgrdrveT_o|o8rt0mWjIjJdG33zHll`IwA}r#ZEm!n|EE#KB z=OFjB(I7Y_d8-pt!*QwIR5>(?cb1gUW+o}Qxuc1`m!OQDEM#wa>O2b``uw2gfvtpLh)*){RywMzSe%;)nG|9N1p-$s z810zdE`IxAJMrZH3Fu=>P<$K1V7So^=$=dVyB7YumSwoXRctQ1CruNm&FBiw*T))( z>etuY*sFd>wm?sq$nBWZkv*N>p}rOcDg4+$%%>M#BP0MuBkL1wy=a$}Rue*51p9l2 zVocGZNcX&H+QZGbhxb*C+ZS-sWa3pBRD8}uSkVL$4=jemCfNZzdqKULkhf+ zRcbswSEtiGX?K^U-kPC$V^yy{y*6hs!RnxUh98%_L%dl$*d<{fBt7OHO_xww?HUxb z$hoy1q|3RIWwCN@PJ30w1xk~J%yauI+?E1Dd&1dYVZv2>S5m@#Cu3)$LbHMbdGSrM*m3lDBcKEq|FI zXU>bt1*;PxhtH4~%K_U6-$mXA*>81;Zz!ZHoMKJg;5xqG+IHJ=cwV~1^#P~>QRxKBosZ~T zA=$N~dCD(Gli}S}WYO6hJneiMBf?DK^3u!RFDy8y%Hi~=W-3_$vzrqz`9lgpLVN-${cLq zq}dG&L?!GP*_n-OC`7YM%q2%)dG8Oea-!H2XU#3B>}oIzoHrLI*p*{Kwq}Gb-@1_7 zcY?ZlOv_cnM8oQp#SDlaM=ug$6tEh7a49cMnX8N+z@^&{-ztIwyJgFrXU{1_*A$UY z6SAadEj>LlwUB7&SrU3n=oeR2iQKZaaLLAKzM>W@1Qy-zCzB7ZVrriHJl{T41W+TAn6L z-!_O?Cm>2ZalbMUI5eKPpTo||9wkRnh~CLL+9VZxgQT^GO^k3gxA+^T=A-JDCPN>K z{b0jT{f@XsK%N40d#GIHGTftH&C;;>Fi735kE8~raJ1C5Ql&8eW|itKAl-eAd1$>z z=bjqwvO~x$Cesi2bFIW~dmQ4}33)i77D5l4X51CHnm!@=3>Lh4)HSo4hio5d>+db` zR^06`X$e=2Ar8}|Tk0uMSD7KTjQCsbsgajoxMMG1RvB-qLv9UXXmPjT+=;e)Lnb-# zO^$UF5vqos(GgG)Lz@#W$m&Ua(y$mw^s=Qz^2XsJPQex-Mw)xkUVae>T?x0yT}gJS z97i?^epc@b@KG z)@0+^i|}n4i?Q>T!8d#i{Zf?#aZTpt1kvhQZ<9FWP!<8X-?U+U3W|8?d;F%OC+w45 z9!t_pWv%&Y#J*=vM43$?*J~aw95H>v%}Lg@FH(#BvJ9`Aj41dEV(|p3(==&4f!I=; zb&a`p_gA776ic=FxfU7%phAD>XIMSG5@{+8%AO-<;y;6mv_N?vq2MiwQE$*nJQH6vKbGIf#VxNtzL zmBhsz0qxW?7A0>Y`=XhF@>^E;M4G(AdbtAdv1n>K_IgTHtN>?>)V-~AnO4EPGcK#d zJaf-se9UOQk}$rE54*{}qtigJHFdBXiITylRUd1SI2;i2lz}D?zk(OJ1oYK5Z(0d; z))923EsgcdP_u0hV?_x+{KNyr7E%xWs#vLsMYmGc#1Xq9U#noEY)6o8lwL^6sBIdC7?rfx{3ZvCJKzU{rnaw0B?rT|sK-U*s}Q3L zNHhW+f5S4X5F9*tkSw^wF}kJfI>XD68Mq|+EpnTZ*_Q`(8mm+!4`H&z4mfpAT5Nm= zB?ptiz3rrk;tm|n44q%Bhb(MBtL^g{nw1?uzO{YB z30k5WN&Sd15yz2oL(!ZEJEYYS?nnW#B7e`OpfMH#H#e_YzV%r?x4m?MJds(<2)m#! zD<>{14?jx?kvb=po305j;<7~yqqzpKTQ1-;TI&Un?jwx(Bfyzh5B5GcV6s=c3Fv*5 zn3U4r8btusLWI9T7eKp@25-UGJXPU^NJK8+U_GwH>HrgQ!TGLSRMuIeO$}9j1e7Fg zh4U_;*(eZrBpn*bf+Agrn@K@KScq6Zur9r$UZi(ygVgrrVB7`DzY9K~C)Qyg;HeKu zjdBV^)*f)YgnitH_ogfbxgU;O{TXZ}+UNJbyDQiW_K|;ffieEWJw7pOBS$_%Lwh3! zhkx~0RzI^DBya1V)U!Bd-dti+sv_lniTZ}FMYz%iq}-x{G^D}iRHBW*!g1<)wSha9 zk0Tq~4EiZw0~5<`ry`!Q+tzeAc`(P99Z=_KuGVMHX}2jh7q{2z?eAYL(bY|biGlt8Cl3FH0C<^89 zT`{nGUA_c>-XW?e3Y7@8wN-^^wSLvg0~FF`nHf!LJ&cyxydM5x_uCCH=+!6d;NPVa2&gD&2ewtZ&R;W z#i<|lu|vW{lqn1O0hbwya}#|bOV|AVV5`molltvLH4j*$TM8> zEY;nnY=DBIf) zM6D;*&jRilVdU49Uq^U@ZB2Z`uhl4L?r3?&W6B`i7y7`ttf1+G)Z(62 zM=mN6JzBrT3=XxsM^T!n-v7KNI~jEtt(MImWh7z_YGPt^EMN^X(WUdat;7~}Gygux4jN(;tc#(y7xnmhS)%rKeQ+bp|P>lLbn zfd_Su4xMp)L!2FU1k!m@afeeIgE|NPW3AVVO1`b|k?g0J0((E(nCEoLZ%sm+t;dF$1 zipwB!*Eeiyj6mQiheTTW_(u|mL1KeKbO}sB*Dv!d3QNj$WFyCtYq^}TPdVVh#;>uy zaU`utOC4JF5+j8>#$AIvRbw%SgwqB`AiVhwk2003rQ9%v#!*Ikn^ikCRTGx zWIOw08`|6r4S&>xo0a?Ve{hDawFvI|e}*$pKYMYU|AE!xpX)=x#=zqLeTi5oAgZ8w zqr`0*snH6;;cMTB!!gQgl>5n3g$lth2$C*oC)Moq)%6f^wX(3G;`OM?L03;%FBHNtFKQ7LV`mSjM+D1v6vAn5e}HgYd4(12X}+L!MXh; zROb!YjBSkdMM>jtx5VR-s~8cmNC=Uo1P-k zQ6odGSo34Ma_Ja$xpBl&37B(5KjsQn*Qh=gkDMe-wJY6%vmYWuUy{(0Wa;%&pKPn? z^rotUjKGLz5@e$#c?T2 zXRfF5J57W65?VIjxMAVLr(%O8r_OTccKuQr5hTM>!xU27M2%E>#}-NvKUn?1RiiNc z3M$QYkHFv995o7lJ8H6Om$a?dS(?QERJ4GwrWP022Ok&vUHCp_-c6}>0%JM0QkyNH~l`;7i zP57uAmyD>)Esa^Q%Jg%a&41pw%Fo?BkF>k5CRdo3J#AXE2=r`PcEK?cncH$c7XmSp zEO=v;%8ZqQIRs;9o;NPjYzCEf3!?Nv}+>aO~^g<*fZKLH~_31Y9+5Uq>&De$Mv-auACNi z=P(<~IVKC(DO$V#(oqB_Q+vrb7lqNB;)f~q$zvx31uu)jV~Rk)VGILgD}jd`fF5rA&@K-QCr_)uL)a@r!9?33Wn zn)QU!Z^ZQI=#jqHW}pgFf>asYIwQL%LRQ*%| zlgMk~3Criwm0M<7N}pT?CoZwBgyx_<#J&sv5yjwuo%iUP5#)iAyr87pHJh?02Z;U{ zQgNey4L=a6SLKkU#2QLbwu(+Qaj*@vB>c@LKcYCzWi5_l67%NUx9+_J2Wn~J&qK(s z<$9iRxAE+Fdern6oe?~C>(Z}Kcqx>mq$SlaheZh=3ZOSJ`lv8TM z-PZN+3n9V72?1$s^z>syE*G>TQIb)awc~TYlXyN3nlPy$NQK%Ee}R98y=B@*3I48M zXLIPvNPRUv%6R>{zsK;^MsmawZjQ!DA=Biqjvhamw-u^VDLhfJldD=TK$Er862Wd$ zKnfraR)m5yjYbttQfUINLK^$ZGi#L|C09GjKo*9~y-v-=W(Cq&_e*`woBdOx9Ii3* z*O&gnRhkk1?}+mR*h2Jcy`yu%j_Z@6QLP~;Y(<C@J~@C zi$NKH3mWfsh5zSonuDc_^O$-Ai_<7?&a2JFN-EoWIJw{C9pMKA_VbmPdBlu>+Rwi> z8}$ZX;EW}U?j~QCh~4+d4abb6)pTZYFGl?omu(`!T20t*f8QW5!!Q+$4~GY2v6C1q z@mohzup91SB{qyS0ZFr4?%`q-qq5OOcm}4%{m@1)5eeY^%q}#vc(QNuu4&0nm#Re_ zX1Sl&K!!VEQ;k?{cH>Z|so>RV+UIGTZMTWn)$e=-5HUC}4L?W8pv8b5Moq?NZm{{@ zW$}vjb>p3qTmv8GdQ~<7etY)LY!7heL=iP{(Y)73V%_@q>*-N?IJvG=0?H#hOpp%=LU8|+LTFiFlR6mwntn%Emkt#g{Uh5jW} zqhLkjE~U9aWoDCDohy!rGFme(sx3S@o39BF`$@Y)`NCx_P0khM8BS&2OP~NfS#ACf zRf3jXUhDS1j~*E}lEUdvUH129&x-y(J9z&9v&FbG@!(^Q9@N0Z*}IU8tYtt-_#yv$$lt=H8;_(WXSAtD)Lb*?sjl)C1p94 z#I=9o*nX}02{XDL|H(D`0`>KJVT-I}#U8Q{Ej@wVg#zhgjd0Lsqe<$e9kb(;MIAgn z=YPnMZ7bNT3uo!0rB(D}3|30nb6Pfh% zuwId5Ap>L7XgX{lC5;&bMS20!;WL`6o7~cO9+`N?6hOBxi*Id+MW;0l@rXHf7^?6G z_+IQdwB_sZ(F=4muN&*Hjii7QI(z6#~{d~In1 z+o>vB`l8~2_ljeti~>pfK%z8;8^kI0QK;MmD?pnXI+RUmB_TG`=5{`hPe=mt7{*k}mT{DGOUNF;CMohsxuids$pl%hT6aZ}tQZ8J94wi| zLeg@1kJ*(B%k6K~=hRC|)MZACcMOXl| zOUX{5-{nPn5EjFGKn7xOPGz>1-ksf~IO4U#jH7M$piWucCJ`6*SL_osFm(B87Dki7 zFe2Qe8+5)M5kr-(xwenFI`wHPDw|Amf5!HvxgnIY^z~V~*CZB5xrJMW9?IW!LnN%w z!EXVRwdV=)SLt~Vs`El;8@hNqiHb&A(<6t-oz>52Gy|YF@&Mx{<=qr2^@AFJ0g9NK zAnE-8te{$Fx)^>H6Z=?$)mwE%**Y~&ep#5R#<_OO{wpYO1drB3tD(J!$a=1FbDXN) zg7v{YiOoZNFU!H@j3c8qlA5?^fKU0bw6?wrERcxMh2aRY@3u(7d=RwX0+@n zBTmj}Ds~}f%CvwBz&yV!JiZhGv#f{XgUW^BBwSgB-aX*2=e2NpO9COpJm8z`+-$~o z;^oYZ(+_h0_H(?1cfv8*X{JA^>u~#JtpK4CPC-(REQKW%p*Eo%vztT-L;%n}d7Qbz zi`_Lu7_Pr`z`rz95upV!B)~R=Xfa6nI&q-|7ZLo40-bqyTLQy1LLsA*z=Q)9Ev`hP zm`mk^hSoU1;$!gz0#&H{E%=C**@M-lZ}v*`Wz*4?q%U^M@_)bEfzj-e!tAk@YIj6B zuttuv`olAhH&D|*><<+CvGc_SCgfn4Gq zsq_Q8i}DJ^gJzuPrs8Ph4U0%a`c%`?qxLacm2tL;fl(lKm0ZK)U(ENet71M1;m62o zfgENHKWz^w^DW)nf*QvxgL?P31%6W_WU1~jH$mEW`VVBJ@OCf#tb46HaONKc2X^PO zyMx9Khi1jRNw|LDF>gh@T~99Yvy`>s7`a;&tkuQ>S~5t(4N&vXO*+ctA&WiahWvR( zh~$>sL9)yU4nV3h@ZEo+G}+Dp@jh>$&ovuZ-{WmbPwXbw(_iDjW1cL1A$7Y79r ztVeZ3%mh-7RRpBTmz2K(24+o>p{2+DTyj@#GomIbjWvw4-eqwO(mDD*EG_G1tUep( z%;q~{x;Jzd_2C^fuw?&+OZOQ}dcV_~NL`s~lqt)8`yXKQ=j91QPJ~~-P$~bjnoV5K zS&!dH@BfO#8&vbqRXj}m&P)}vHnvBM`}><3mJbQa4NhBF%9mdo4eGbpLFpc0YGCiE zWJ;>9Zeyi-#FDrdX2r`uNg)KO0GyDO(t@(p;+46E#o}3;)uy$@a+~sb*8L_&HD?;{ z>L$<8*7XnT=9r`UI^%xR?e;nb8-z9P}wdFuN z|Gft4)-Wi>*JO}n2Sq$A!|nBp7O{5>&&WOj^f%u5H|frI!f-a@huRjdMJQNAcgu~= ziy)4V)2_ltv#ih2!1hh6WH;Qv_TeoN0T>j4KIJN!u(KO0Q0x%CTw6Tj7#u?JA5H2p z!cAZnqtS57-MgR&VcF;idomea0^oESM{D$`xLH&5sMuJ%nA$rulA7B(eSc1A+dIcR z$X3SDFkr_#;dreN?$I#v)QpS0XCxAHBl^X`YlV!Gcrm|-?fHz7WU<_cZ6RsOM6ue4 zZ6ayPU>x^(BzcQ5}lci6YQS%)B?WKqQ2*YZx;_y|05C+xK31!q7xOzJa z!fkM0pqjR<}1l(Piq#Vq_ICTBWlp%#30cfxPUOUs8wP|nz@zsWNR;h7fFpIN*fW(I@@kPRwW zjjZ=>5s}Q*YraOg?9t>&B-9%j{$|5@`T684XUI;Tzik9mMCw@<4$Phy2&=hQ_HL_h zXsM>DatP|SNIalhXZ4qw=gz?kE)uzyQE!Bf5bq%4pyUsq1N)KZmEq>pKe8${z*|3S z0_95gEKeiD61J0Ft#eb%9lNQ3sM|B{S%`yCAbyf(W zPJT^)^u~I63r;Ky43Ui+97@u!M#S{V;n*tevWUf$aN}Bs9S@{2agw>`#>U=$8|8^(G|%@Go?MScm^g^ASZog zy$&SEk}a4WU&s>uE0jm>e+At@?3Y1l7*f1+ZDzvAv4$?a^Wf{^aA$6OE{#xel!szt zGJpyt8VpOm9+uyZ-#^P$)f8@}M99vCXXA^S4C7#@L<@JTO^8=e?y8EWjRxVif>PCD zs27z~gN@|g+B`Xq*-(ShIE-g~cA)yBC_vQ`Dq_;iTQeLlKShNr1z2v9#7J@k?~FDf z2yMXB$EZuqip8*?mbDz9JkUs<8VeiSxPXn05c)H4?LHFEmVM3aFTzxwP|V-zXAFju zwK#=K)4YV7;x!r;6)}nM7M5KgMeCJ*0vfJ-2~pKk8Oe3)FT{j|^89V_a)Yf~SVX&k zXteDRw_s}XL1ocWJ_Qrd=Nf!sryiDKuNriQN%E#Pp=3H~NJu(e36Ef6*C;+*7~zZm zqqIw2ce)^WY}&wIoY)|qzsPP<(8!)Cact*97io~c@79qs|Jop33^~$YdO#Y$TWoAT zI~x=#T*>Ynr&7#pzHHh#1>VRv%;2h=56!M6>Yd3>nxpWS-Dyn}51VFhm^~=0@dV+5 zc-EtyaxIL*u`RU8v_Yvj!Y)%5qq{1O#{jFx zU;?I@4yC#LIIP~CuXWN!l3+r0Sx*79vZ>5nFn{mgz+(aouCjUWyAvd)O?Td6?Pxqs zf#f1n-L3eRT^#ZX$-b`MK@V)KA^m&Br-+GR$yJ!smB7iqb31IFUI}(CK9(D<=Mx%Z zvNEd1v**ZNvE+%thcFsd^=8J=jVA!J9=Ro4Wt`qH+djOnq(eH{4F}^q4|XS1Eu4?*Lul+G z{WNtwchh`5+jL=!1YC?i)k-|j(yPdq9Hy|EE)go}bq)}qKrDoRF0Bj$&EhMu)2u1! zF0+y2(lUeFnl8$LVh0H;+J#*`F_9O54Oy3)&m8KRGHY;kl4osr9+Nbv+AudF%v5`Q z{p`PyeB*${J!ffaLB|U$l@{uq6~>!tOyveY=!F3%hQksfuVwTbF!~PDldAq{b@f&X z1uK@g$C5`ox_9BI~zJNWt{B@ zpNV1%$@)c)w9X7-O>+SY`TOaMlmVWQR~m`V9vSQo3mK^iGx0zE*FHk;eB2+7!TwZR zwl9>gBQ=lT=KFph)f#cC%J1KQiLSyV&&#Zq;x(C$nE8s5TwkI2>W7p();YDlLV=@o zXe$E`|2Fj3ZcbdfUU*3NHi(bT&xMolM$Ksh>HjLu#=Hiyul0(1XuLs?PgnVUr2O@j1|q;wfoQuY4e z-_~Yu0cL-Qm@teAM&h+ij&>wMtW2qJ1te8VecRw~fGiN#{_tMGA}vV5><{M;=yo^y zYsV$oU5B_Cbx3Q#0JG`FhJyOY4yC^O-2s6RANY);lWu6hhU%`d)zr z{07<>97iXbB1Ig9rFV*;M@dysrq}t`QzvIV1q^jiDmaNT8Fjv-ctk{GR~SX=dh;F! zn4yN|PI=0my{6TrBez3iItTJ|A6<`h@tw4hd9fI=QFo@{gOz6gLcrxKHjYlj2z|4iJTTp;|*GG=2jAo6T zCF2g1VGh>5oS(vrmjA0A-Y@~;_MlUEnPM175f|_>MfYGJBOc2@P={RW4zYr0I6ZFE zZVW08uW+sxPezbXr|s=K9KD)(XKu;LRz!t;$S!NBC4Xz23s5d5qEUi?D@5zzDN&HH zJCYkH-CS@Ymrj?Gs=PhiYaq!Ecc>gQF-9kDg6AgTVUt}{$w zNXP7^T}y+R>%OcH7MH_S1sW^Vh;69OYR2`28y7BTB*}F0CJpb{Lo4(8+0_^yb{#n+ zjk|fsZKIc4T5oH5C98FSGor#RY0zI)S@CE0*)e0TU7?&|6hAn$U`KYP=o&R;7sCmK zd1dUlvUI{5%z?fg@IDnQQDfp=u)24QCc@Cn-Sq;VxmRTG@oLq!kdHotx?)*)JrGDP zdlEdIW+2_RJPw2kbMHVud#9Zz2DyieTROL3?nn!LMW9FHc< zP$izLfXq4W)Iz%v;jvSjVqCYQ(M3)<;cR-0ybUpx*W2D@73cwM>)K)+pVuZfNjbyd zkWWrKL$e09W#Z1}IPC@7CTfFR)Rj6H^?>_EL}W_&yEx867~i%|z0*dO&g44wRZ4_0 zYav2u>7h1mz%VK4SmU>-E}g7Wsz(BTNlFa!-S~Y1zG>nyhMO3D-{poM10c<|ANE$K zKbzV_m*|!wy!{cS{T7=8?ocQBQA!8QGq2|%FS_W~g8J+f!R zWbd3EEb0$Ms2=8UJ})Y zL48`HO>_zbg9Cf+huq0gwmWBo#+^)2SUR)tykQ9H3@S7NtG*Y9zXX*!SuWMPoWA$j)Of~(kqUBGhxabcUH!UI zEN5Mra@tK@5?dzq1zBdtw;-OF8Evpl`oNkTpG`*C%Z}zJJB@g~(6l$k+AGHn5_*#q zhgP%)=dH0Wb`;lpgx(}MClzVyO_?y&`|X}wWa%F0Z}?xy&f93e8(n#%m*{dq0%}z)qwuij7@E zmv;>;hI!8h3y}M~+o8cuFdyct*hk;EMO}93U4Ha+BiC@4hX3|c>``wb}sFySve>H2hU6ys{ zPMZ!~+ZCI>jApJIsP%xCqDz8K>+>O7E4dwc51i}utwFHnmfO5bp^xb& z1aI4SWITJykA%(W^Gn%}Azsv+m53WP4+`FQN_S!Bf5b*jd6;LjEL3kbE}?yBG<&OZ37RCceli_bM+ST*5P_%*8CI$jmmF# z>;nbXiIN66xLe5S?K;d}q6*NP6Z;0x8*#=Sov1=g_C;~cUgpAeHG5_3qfx2`H1+nW zCb{7R?N}yu&4wFhsU77Y**8|DYis+imbxvz-OW+?GkT>y?PA`Q^YZU^4{U zcEa{wfnMr=BcR&jOtxt>HX4XnEu4uVH-B&84gxB2+7=s7gB`n$_m3q;l_f?Hjz^&N zIiX&1pswU$E~#@+houa}r&72&1uiu+J-Bu1L$nWBkdxKs-lrfRH*J7@!fUFb;rP1D z5HybE^307Nj0){?+eZt)6EQ8c;SgT%8f^q@j$>jGv<{v_Y^PQ zNBK~GwT~n5o{S~EGQIVFQNisB{!2qr*b@IMQypDIOi1EZ0Jw0MXggGxwvQAhP$mq4azB?SgYn=l|ae!zI6r?72dBf5j3doYVN;+>gDhnUUdlxluu z`5NU}r64#UKUr>^aPsIGqmdmKUWp?r)OBwsyj2h-Sy01jfvxpkCa?m+Er9@HSH|Pp zf22pbK=1QE96YsTWo3;4fBmxgku&~@fuN+4oUDM0fy4ie-cq)fLlS`ZZl-g&d_<Flwlm}YFFUYp*2aP%N)J9kSxdIx{Ore9pZ5(Ri$P&Dg z+#+N~L~SB>8dAbEP?B7y91;71l%>P&QsYe|9TyO30y7kbm z#a!jAqaSuU`Xzr?est|?77=SGwuYhCL>;49`|Cn!PCQ9cY2})w~uXvDn3t3)jqHN zN@G@bx#-gQOS3D1P#dY78{n%QB2tQ-#z=Y?n7U~yM@K+TjH#0Ii}%R93Ys|&!`WUo@LAKfPD0J|SF z=!Gc71SVpt0ig#Xnc4vMCuBT+)TvZ3R1uzdqUU`41^6a4Cq~xo5K%3V10gy|McEE= zbu3E9Rfu|BD(s_2WJ(@DF6Tf6ZNKbHg8S zoWcJ)EwV^u-FaOYd2?YUxjd8=ZGO0me_+W*P+60f#2o4Y@ocd!4;CU%9(~n@QwODx8o@K1o&W6B5LN`8b{;OMlZSQVyMW?$&^WuJ8H8uUKEe}L03`v1asdxo>>~8zw zWF+y=N_5UatN>Q*WDBU|@mz_uX+F??Yc116#CF34dIhiMZ=YXEMCH{kdwOY)xVxBELIdfPT<}63<P?E2+1nrwPE161PsB$Wz$HO+`?Y7bN*zr{h~w;BKucVcwS7KpyvNJx7Q^0Jh9c7D*qV4kaZ6{;Lh>bI9FoNgaQQ-I|dy$^Vg)=2uT+0=XF#tAOO9epkR z6{f6hl1{vaN7!U~6w^qQbs^vtJjA0`H7tas8SDikDhB#SAxaF?Re8S-0Qc|9DnRz^ z%L)ETIhrWxtUQ&!!5GjiOieghdE&JjJw zbQZiF?ik_$O}-tNP6!}dd)^^z+xs?jmyc<^|EbZdlPlu({v-v)A9vh;f>8Naa`-PR zRD&NN)4#p4lA=2x`}yHTu3y4y1mV90u+%IqK}4hx>X2Ct5@9S=S#Mv>QN4ZfNNlKu zFR;-~uKd~@@n+U>df{c@Sm6E$zW!Dj4*cVSo0b);8N`@qNVGsLD?_N*Jl;p8#Q^mo zauZkJMjfMQmSz=%H;iq(J$NU|MVy?%6I0xUlE=#{);W_Xp$G?40_0eWAeZR8&9%Mt zV@Wzw1s>qTc<2(iY)dWp9+ilo^o^7+h>skLmIN-6m`Tf(G!t$)a|xpSAJ4?3b07xh zXR#msLCf&}!-V4*tT>IUM08`zwu^QvwmS(r>ZZY2;xz+>S}c_DAztuDyP!HHm%baWOTb(boxuK9RqhS1))?y4#J0x?roC5racs7%CP9J_FKNs}65TaOs zZdc5@Et|J+CRAOxmot4fQRy!=)$E4=o~{jd^B*bL@y`wwKdD$UpOo9p6oON;0jasa z$Cqu$`KP@kMFZE{3gS3&RZgiuy=Hj5YI0^j=y6`!=(XME5ape@L34Oq2V1lloK4Nt zf?Q2W%{&DJ4n90%)$v!CB)QDS13gZ#O#&V+SnU0FmmDsTS3sSES7$`QM$_Br+W;c6 z`nuIpgE7K+iHnk%U(~T>Z1p5V52|+0hj}?W9q6{Spw0IsOiFJFB%C&o(m&q5)d)kRS^g)vStGeVEYN-t(7~M0;-a1h;WKAH9VmjkS-E#YnljmJ4Ot16g51ssK$a zLaXGcrL?vTeopiPY3wl7uBV_D zXB8QE-+r{;*?0u+2+IbF@0BemYmbGa=Y0R|WXWiW*JTaf-5PAl29a`$K7nUTijh` z%;PmalU~o8ZO>fWJjWY9b&Q$ss|GowId}Vt5br%Q0lvqDnUiDhHR+z41^my&kS!mF zdnp^;!y~ng4>Y!(qoba-S3J7U;GCYrBcHZc9JZP~gad?rIpcg^J?srfhZzup{!1j> z-NWn|q7QFPLO|TS7jq0G4N}P0970^$qp*lx`IlC;{%_DWibD!x?xGDUN>{-mHR`8u zO5B>GTg)2uJrpS(!?c`q47Je14ef!crj14SLCEax_zV?p2OPEvp8RQ|<(D#{z>h_W zvpj^kUPnwI!z#1AEza!LEu!>S;{ZKvI-8xiDBd~=tEU2UKS7ZKu|`OTm|>&+I3oXL zxX59$^!~X~aaZCEW?b3gXp;T9pED()`ZtZ~W@`yoPopH({@Ax=%DPm~B!mbtLZNFS{??_^z%vnn!k=Zor%9Dy;OH%*Bd8d*>;A?1YkDT(l5>tgkZGT)f7 zI~SVEQ6hxZiKRpaDOu=oGa$%bLYDX`LX^*{7A+=}73&&dQ+-1G(UvK#Q$QKC zlpcK7&?f$KHf(oyqVI~R1b6t=vMFqFJj(Egd5LvqAxLPf@SvKfU@aoIm|IPV?=nuE zcqwc^r^Q4)wty#8&kVE4ohz2deSj#EjDXyvP&qiCzq z^f(p)g&kj8FU1Af!2OkaVE~nGo&CAqD%gr$_aqHmPPShK*joJ;U}vFPmUL->T_%Ho zO2=+e9K;{?_(*;)ojP@H6j_nIy24%4c?3pF-`t~`QjoIJi_rA5EHCu&v*nenjQ+}1 zf7FtaDPHoRv5PX5KTk|)!fu;Z2HaO6t=Ww+H6fLrT^l*f0L(LLMW>I_2728QR5kw1r7Mut&~h8*rwm#P;?TN@{$)!!d2B7Gn(c# zV=skyS0ZtRPLtVY>}iWHZ0T|E;sxp}jn9jP79lRN0j>@%+|vl3`kDybSl%g6ArVP& zM(PkpN(v?bXyb~3xwsjh2iKY;*q#G%>JBcP1nM6vjc_T_PyXSuwSq^Qy|<=LlzALt zc}FCmul#_J3|s7279gMU|Z*Sobo84djFq0)~Z}bY5LR)_VXnnxcfEsBSRZFYBnO z0<^)iXh@AZK$UCA2pyGMp92PJoHf^5O*WDj(^sGd3|>OTn&~Yptw_>SIpbHHXoVV9 z8SAxyu+Y$$?HPh!c;RTVjA?UYanUS?^fYQmwi|4%j(h6e74K=jAvIFO0OIF?oi_(C zx}Inl@(xW{feTj)M40T0u^(gIJ9Oxrs*Cb^g4{?pNgVsA?S%FvDe7-#FmAo8` zWm$Q3wW+g=Ne_jd;*dFb$=+<@i9oGSgL}Bqs%LqywwpF8;Sff?I|7Fog&`$QmZq#z z%sCauFLS7QGAFG~YM{x>IM%ZsdsNs8HvxIOC|AVs=j$*z5>bxey&~p!|GMO$-QkoH zAxh+eR*;<!s#p zo2np1-CQPinBkSRrlyv(xKrp9)}up5eLre7#r$Zv>L zMxoW@4=CYKni<zUay)A<&8zNRz-zYl2MK3=#-J(qyF0l!ht3B6@k( z9)mW;kPSW3+p2@Q%fbpKd{*i~U!hw^2y9djJPehgUQWYAPgHxp?4wk+0_aWIGoIQ_ zV&CE#{sZkin0OFk??&RH^~z60d&8GbUR!PAv-Mlz@dJi(#0;D$Fl3RGooX@?>CqBj z<85xf2H?M4xbF2IXoM4<+fgm)%UEyM{?S zswUWoA=4+Hp{6^p+P+Pf=V;A~7u8LkHw9 z+78-%54TapPL8vtZK77Q6UEFoHKu`vm8SY*-_Jog0QNTcE`UL-QN6S6vst-shirQ< zyaRl|rf=EyU8^pk8K!3y?nY@05?FXo6r-0 zg9q$rf)k`~$>F-zjpP0$+#i;W;(Kqz3T#*B5R*|9M6|J~s1PhVHeQ>L4d7MvZ~C1m!pCq^u&sE1lwcb4nlV z&F~Qz6A?r=GN+b^aeF{UT1D$taK^&uPCTxiZwriTN)?7>6v%#TW3W~}p(M1j#P3OQ za6_0~YB#&!aNk&pKLTHr4t=|H^SinP6qFArPoD1BYE=dlfZ*rNlb7 z*;!@zY*K>TnU!5NdM%uu#c&_s7qPJOLBz~n?U(XFF@WNIw$nEk0C#&)1RD-?ChIL@ zt1sF&Brp3C+3BeRRIMy7g1^5*TVV)oFmMA0-9w^LhD)Jl_)EL<>NZYOiz%sg?78K{ zd(WH7K=pmEl6^NiLave;fSmB$VOQUkgy~9<=MsQ4eXhAQ6yl6 z4-S8!X@-(>6GhZ^<5J8pqHi2{8PLu3bz~M;-Wh>Y`i#LtmSPGpeLd)c0%`)8So;z$ z?UDl*labA0ujs{H&#LuX&+(a|2C=q*@Pf~sPq?y!9x#4D87DwV;j zoyB#;4afV@4eF_&mly70#3Az{#OWetb^w#r1|HP)Qm_c znByB#979it`ID1yYujLij!@4VXyh_u_P(Vs+1c`)tot!7Iu1bVaC4k6@`c%GRUh zJ~qgXV+>Jm{fbKP3RJVIv#G}F6p<>`H>m0tP34ECEES($o!q+Ss&!qx-9aN`0Jr(X zT*6SCT){}cg6k+zCo-~MCN`a+)mn1F$aoz)nHXqV-Qmg1-pMfn)rg`UHPFa-CU#E$ zim4UHTNSpYgTwFGnKcLK-}cZqp-KA=cAcQuY6l0QYdO3>CJ6e6t(-qsc^1OJ@Q`gj70>*JBkV$q(UV`*a%Lfg!fT9n*7k?gEI5JqFf@(bVhE#r^Q?el zVe~}Gra^J#xB9eZ^H4E5+0caDXknfcmF)EZ_!-sx!ck}hyH)ju;(mi@%{xmkL?aZn zqG1VCp31sNd3jvweuDT1m!F}&$UeB4cj4?{m-3hiEtiXKY3FR2Am==^#(wIqi~+)c ziP(mq#+4{3R7ja%OPIwlF*$;v93{j&2z-IFvju#qltQZZ=v@Dt-%noLC*m%EW-;9I zbX&@}`79_HEnYW~h4}gm>#f>m*;;S1qi?9oxYp0bsH|#8ft^1ve2^gl3Hf~6r?n*P zMj%PL=vSex_+RhZBImTVz&p;^X52t0nBd&htGr?PF8Jsf`53H2X^o16q!E;zWJYwPQ(n4xG#kGFNtT+%bt{jVqMlNZmtKe7&tazKPb7HB|O^zgl&uY z!sZ09WtjTn#ELOEDf2^76AkoehAZ2>CUY3 z!7N1!aUq66)q=%$w)t+k53ceNz*P_N<&4fc+w(gg0L$CQx=o8JRkhHFOB>p%Cd)bl z#uVnX2$`dK>EcZ{A^J4Hr4Z`k4y?#)ztby_^LGS`ZIPwDP5M%XX8tkrb+si!LQy!-e1_JH2?Z6Rromw=cfv zw#fFpFO4%UDNDP`7C07Nk|4gNomREIR=whG^Y*$WifiPXMQ^uLdJNGmsG$IG3A|oZ zKJkdb5dG8;J8wS!OCIT{Jp>C>Jf=>iJj=slRNevaH`>X8;dOm0tAM&XmGO$$^Fz#zmk(nRB$ON_o!}tS=L-{0`~&U{0V+s#<%wNlg`Av_h2-$OWhYt@h zVBc^ILvzK++S2xCBESybbsjSCTK-PrWm%Yngs7ODINepqqq(M@lKah{mZ8`h;vy|l}13q)}IiU+FznBk_1O?rS(zuoC ziR2Olqph+D(HKq+&?eF79bF<*+t`9ll1FB9DDZ^*tm4%DFgLjgnw9oA2DqoqfsPJ% zXojj|%SQ+s#UTw56q{K3he9188V;7K*vIMRzkvT|9efcy8m{eUSlNFB-haZ@{hx)n z|2?$-dr*~Sl>Sxj6(WTQi|_*%$0rB3;PnN+%M%bZ0B=_f92iy(1G9*)tcQ25x)=t8 zL+ufz)2{UIpP$db{UG~-XfkCBDsu3bl5??rKL2a$a{N9MqxVai5KEX4I`}s_S}bH- z3ap`Y_P&8MK9WCPOJN#xLK@^AYe0`aXA}>p2#ZWtTn*IvvUTu@gMsm>L|vnTX1gA> zmD!oQpI;d?j@v{djsd5!g6$b^ddCcWC3D4kyO39#=}>u70>YmHLQ2AW?Um_d>og24 zTl7TFDmKQL#wL|ZVq$i&?LVSAnD@{G1C^&8F+p8Z@U5n)!3jn;B=N?e*)0~FLWO3j zZx)Uv`D~K;iY3yGW-20G)Zhtws_|SIpa|()Sa^p0NadNB4#e4_God3B#RIbma?iQjb z5XHor-V#FWf5(*d!g$C6twe=p3j+*rmdtXmMoXezpc^@n1M&>rB_u@tqqrDMyOz{U z!bch8NR_%6cVQfEQWiY7ntj&)#jv*3q2u*?zzI+dVG!N`FkCIf8+w+4VUH#f(O`V- zYLUUS3_zC)P!7g3_#51h&sD*${_kis{DQ)s)8^3Sqq|n?JeJd|%PyqMGpVPDZ#4wJ zj1RvZK{h9_PXZAZdgk~Y`gd@*QzTygC(XwPzk43F&-3{R*-K9GzV0SNzs6NNL-i}H ztl1`isFnXtLZe|ic@)B!Jz;8bgau+mYCn*4hq9xv5F$>0ZAYZLpk`4v0^#`x;~!CQ ztv)~+bOLi!3CWs*sN%6Uwz*wM>hsfXq5rfzRdtPOt^G-M|6(Sx{r^-!j2&bQ?EW1M zS&9>~>-@+(Y;;266Acs(5^Ax&wd7Jng_J0Y7089fk|fSXOo3sU_P=AOShfd)Q54ZU z`T5Gva7JXz8u%9@-qRhYyIi>Wd_G%2YGbA-C0%W%pup&GIti6wlT?pFvKA7ii9d;haoMnogY7yuuOe*wVS=vOs^p2oTx!rr978UDS-Y%o8-93-JvP#tPsYMAQE5(oTWeejn`4g}8GHOS zt^PB^YPjgZ5owGc$xUYEDchs~w5k%e7q@MWgJGath}5y{R8KKdkrycm!_rB5!S}L_ zxbe=8)-cvBhaRQ~5(cExGl|yp^ z)UAKg9hGOueRy-UDF>kEzv&apKl()c*Gss@Pg>;sNsD~{bP_l@7#mpse{{d-{B*w{ z^DNZRNTC3Wl!Ft7(%?ho!zmgHMv}&YB1+No%BE1ju3oXOSC#S&_y|f9TNrx&^uEl< zLXnW)-OhSkZ)AB~jkGQ3_4IuHs`Vvftxv7L{RILwq)W_TZ7?i~slf@m@b8)yw#@;!(A$ykAD+@dSe$toosuSjg>)U1?5h6IuK^h;y$_fnASc z^W#wGRrW^_bIFYQ*_#!7dkCuBpE$7cF)N$1RR6s)gqqZ2=2?f6j&JShL4TFQ=EH(mxx<4>2Vv7(?*v#&6mRAfAv)VtVYBxg7N>wU;W zjfD{BMFt9%O2fGew#Avm>_;IhGnyBb(+O#7t-y9@H8kKIvGydUcgw!upx&$NU67(P zgk^OHd6RSCm!0Xi(yPSQ3J?g$2QvM$Z$=F0h_()c*jv6 zd>3St(J*gD?!)CRQM89T{My-|uX(@E{^Ao`D8ou#b9W#Qb@uQ8FvuGP{6@|+><0Cj z*!BdX&9u8=0ez>6{Sn3~#lw6L5>_;MAxE52*_kxsDMIN-yY@>l(MTAFY>j85H&DQP zDf$Y3WciOb(lBPfjOfTReN|!IT_w43}C#w zTHmc}@g5HTBc@8P1?iSmgmDR_yHCFVxtQ~0r(EX$%+{ly&p%;5NgEg%Tm7)!egIJa zPFg`Rb&&n^@WI~;&2#OoFR`smyiRy}mTJz*51spHGcoS0z^D_o;@c3M| z?PHEFVfCZJdd2mrV-XE)v^)qVk2Ho%latRCkG9gjTinQdjOXSIx24ASf7S!@5= zEX5!ti#R4)MHvp=^=8$y7bj;qlLo3?9?VF>d)i(o7eUFzegnUPZN~@lqX%LJ>yZ-* zhk6JizWv(!53XG*QVzZ4Pnf3vDAxZZO#jynI}!^Un;87Da{9k+KPy4&Utv1(y|C#l zr2#TAM5Wf&xEZ8^&k&xDK3gbJ0EdqIVD5~epK(gNx`}D|LF)ZW@69kjE_IX$&YOHc z&01jA3;%aK2h;Ie1_x7*_cuGB9iAl#w0?i@!LRUCN&`$LlF7a5wdt~@PCpSK6d;x0 zd_33sE+WI=xRxkVpAnp~03K7Sun&FPEbPH|q>z3izMF&+=q1Tu%i!|%sa)GYE`Nj4 zU9dglj>GU178erp@u=B-hYYdqwdW-F`fH`4yW*8Y>on$8sskuJQbI%ea{>H(n6Z8J zxk|Rq+C#h3j*Y`<+L#0rY*1Nh^1KJW&{2tk{kCt%xw^ZL9e!u@VM>e@+fmx2j{M2i zgn8AKXl{WqaJO1D6OGrj)^N;$n;r&IPy@_b=@oUxTC4s(9wasW^u<~fpbBU>I5-9LQQBO?r_%;D7ceq3)AbLAG@;i%D<lE2BRqyg2* zdFx!rS1K-4t;(hmG?f9)kM~38vP$I$In~_XQ=O^`7r9lFpQ?g^ewYQF5i(V4lnS9H zQ8U=!7r8O!^%A>ry**M(D8AShw&)MH! zMz+>;Klo)s149Ek69Y#l3rAZUI!9v%^M5m$>Ha;B{~fbY@l%om{O~`M7EZ~iY3)tr zkubE82VIy>QK6O)TmUY~-*s(JrNs(KToGlvw`ERApbzXOZ&2b4Emi25o{5X=K4W#& z>)X{0s5T4*$!!u#oj$HF->=+{MDSH!H>^9_YFFH=(1{pG@OI_?_v}0&w6Qq)x=MEV z6ZooTm(Xa_hm-{Q>UaX#XEsp))2`W5qV+aPI}sqtbx&s7i6}#XNr(3gq9#W_!g3OL zfz64BDmjOG1sI091eigBynJ@Wdy4&Gz*^8IN=yHIe@FA0LT=}|i5K(Y4ddj*Hl^E0 ztt4bb#n}6`g~|FgSoMMMm51TVjA*8!Fu;Cb)?9V%lTRUoep)RrrZ4^H`bpVBl8ta_ zNfe`r_&I|h ze86Ge{j?fh!2h$B25ECgr~k7_{`Ximsc9)|FJXK=(c2w4Ffu^{aKuMQCP1hBhPJQ* zi%%pB3jj9{#SaU^4FA5Y@}(E9XHVc z*?l3$KP?CSqOLOywJgXHzHQ!zKD`-<`dhEO=lOs6ce`Z9B7(0hx@-^Eab0vzT#b z5d}|G41`rj^diCQSnY}RIC`TBa3{1=B~4mwB!m=xr$y(hIuzuhi=$p9k(QfuBI8$!hhco&A{BAQ2(@}CmD zb-#n5H^+-%va@D*xwuL@A?y<|h#QzYJ)%xxFA_w5E9(;3L}EZt;rTO7J0O7{5RGY? zY|!$LQ`GHYyb$N}MAVvTE?MK=l9(ye(8#&dC7ui)&bBOG7kCcU$KGkny$er@YnU*` zDck_sTZ9ck{T*0Hm@GCL22jGRQg@GXme8VnmrC%jDSyG7rf^jl`gQ23eqH{8+g-B<_L3Klw>v_qJHRo;X=!~;Y$78i&E2E7YJR73&_Ja z&0KDD4-a{z!Cg%Ev>_U&m&Z!|RcfkL=nva0M7dcWi;3}LYvtAQgPrOVh;wGT{AQh; zjSQAGkWM9`+h|qVQ(Yp&WxfhX^cta@yZ#JyK&H0V@{ z&?B^R#;i%*HmS{Y9_gMJTE?4o4+&Zw$DZx%2glJ)k#Lbagcgh1nDK_<@Ntlse=qfP zso@i!XF55KK-x#HPouC-`4br^SAr7wQP`!IF%b5Z}CFX5z z3&$5_*maXQ0*`mMKw?J^SgtGBQKDN*NfrFrG@(#?NzRaV4Q%anty}>jp9x528;!u> z@xe={XF3^2)NXNlIg7sMV|9-bk$?hFc$w(jk3Wm-tP^_P2CHG~c66s&yGMBL-c~}f zKKq-2I4j}sWt_{GvdIUup2>gK`*heQZs4IBQb=BZJf{(a^$qFbS3)2pvxblDP_117 zo_9pBcOvfbk4}g}$aA!^Jk>U1Do*-y%uZ`wxWA$YUeI}7(4xWVaN&6$!XzIeEU-~n zT*a-1>=h!A@&OhM*>F*1(BTmV2X&#tz0vo8g9qWIZ^=c6*!TAAi3fkoTBXFp)a(>H zgBx9OFye$%wfiU-VjynCq{CxEC$?`=U%;~AzXuaw$+8{D+4paD%*EgrqAj?E5{q%x zZ!5h>zWpWlc8!M-3?CWF=OR%FSx0&TpBY{7n7mNl!+a%kmdr?C0o>aslA-9U&GQ}L zJ|f?yIzb&@$ZH7boObJ_%ClM_GC0LKLS#0j$_I<{xxq?gHpMm-TXD2P&p)m3y+t=g zv{8U@lDLatTW6`hq!ZzojtX0aGqrXMj%;_parIfdoYXk9(?>;|{eq)Q7 zAFecAsZj0j^65^$eMOkLVnx-5go*H2A^i=x=yv|-`JWp&YV3;c@t?ZW?GLc)A8p`l zjST*S)UD;XCW`!pN(>Ci(oGzdv^B47A4$X31*+{{w?7Es*C?+&)}CC zE#g^5P(u`6Gq`Jsv%RAQBV|v0K5M76Q5kxetZrkezGNphg6;sJd1XOv)>@J`3h&bC ztnbEZno70eJ||A}cm5&UrcC`D)7GE- z7-8I=++v<=p|t@ko80KSNfM{=S~cca;a}tJJ5@_x?g6=-A}j1EhRsBL2J6BWt{U+C z)Xy~VV4qov{Kp0)3$>)NR;Ay?xcU7htJi)2GPd6PK5Qz(Z{NcjhJ@4hhIZAu-V8fo zs(6Wz#4+t}RWw#;=#|u1T^J|k>SV3Hk&Zs7qj1mSuVzbY+X(L+IoQK`>_%)`r4#uG zW^yVexR6cK@#$hRq!D;()p{|AqiuaoN|b#1y0HKh!7fvfr~UA6rso5Bd4&ClW-Qq- z-6t-Zj2ia*;(ee3W;*!yV%`32?+SOkV;cAR}f-*Ow+G{d}P_d{&V^E@Iya<$t>a8zw1EF6P|XS zCB$GOY-&=UZThKr*2QH>2kWIP_B!R-JJ0d%oIFgGx6_3&KR`NTn?jR!|1YON= z%~BcQ6o3pA+(C|wq#cm1V(Cm4H_zfy=-;w(QQ4wLD0>Yap%*5)gy~UJm~}kl9`bO% zW)O(!VS~_z!W8^_6$g#dQ^CnvI{5RD>OAo9#797bM$kT0Tgg8amU4`&yzt8S7`myTyno%IR({)15d?7!SRtA5-( z|H(N#X9Q;ZNB%(frWW%S;Zv=}Au}$7#>^TXP(KI7m*|JSj1@No3kQu@U13i&nzF zycBOL+KJ~X6xC&|)djFR6yX3UKZc&b%p*`l6IAPfUP1LeR+`mH^^(bL`ayGwCmtqd zV6c6Eo%K;YZS9%CE7gXqt>pPJ9Jt9aQN@2dHUKsmeQ|f;(6VRq=xETc_IXttAevLZ z7*Aw1nT>yvs$=mu3i=&H^oF(Sj9p0?ma{W;QF$ATx!a^wAJU{V6_Ipcf8sz~fTYB_ zeJ_Rcuv5H3hHMx5b|VSx%nO*;LVIINAGL+}@>}%PZN8dYu5Qhf0Qn{J*&A7+T2Yk) zvrZ)3P&sWh(3M#W!u{qTsVF3QCy{4j8$uq@OTJ7Rz3q}8f)Pch?8xX^i0~#MUq_0@ zN?2Pzu^C(7CrVd_#%c{iKq&yVF_0dz2HH=J705<6>%#$ZnImqJ08(ltn|;S)o8SkE z250`zm1Z^Nv&907=y+R2_OSPKbTH`v1>6L)WaMfw6T>PpmR;TOc_=u}k?{|UdV*pe zSzbW-OT%u!j2TT=BWz`U-4n8XCjxi`z`|Nz$ku@{p%7 zQZcAK{Tndq8-S&Nc~a%S>^yt^x1DG9|FZL(suc7o2z%!1LGl)K4OypO0FaF{qH@Y4 zSQf3qIkwC0p)PR;dz%eIICyPum)DPP*x)-lpmWTg$iz)}X3@kRfiPnXn7Sx*j_($! z%qreaSLYIk0i zpQyrW*ynkBFU9U5ZF1m!g3sl&&YPPT-}%lv&FtcgkeT)M<| z`XPpr=lSYR;Wd8xfq?Be`{yLW^@qc>#Mj&VGv6<#9W5LWJ5@2v<8p?;$msi4{NxD3 zF^kdDSvv`<;32nd9$)3n9TG!0JQj&$bU5v-Y*$Fh z8f(b+=U`e!b2nf&Lz|Vt{s_UDFbS;&S*yACcN=SEU&d&q%|ToVTUrY0-iR9?UP<3p z1Nf=wJxtAZ&)pRM)W5m*(YnQr zesnHYN}f1?##6=bDZE0b^qmS$E0b4hIA|uO=C(ll_pRZJj&I*yq+zsscxt+`*A{~r zq@#j?^j30RO{Da~|2bBiNMOI^Q%s&f2wbzreN6c4=zOp-3c}V#hZPB#U%q}ziBn=4 zpm=iQt=2fd98_$D#0$fmr!gP{giFfu0tzT?{xZuSn(s$U2t>l1u-U`GHXEe{YGbt4 zizAH?KXeS_Jvic4YB1a@_AiJX=>NmmJ8%iItXqI(+vu{bF00G7ZQHhO+qP}nw(Txg zP2G8ech6e0=KO@rjL6vEjt!n6%wVqz1}Y|cTl8m`pOXgG(~pkX(`eVibD&lym|UpZ zgx&8Zu|M`b&Pb%M@IsaQUO9L<&@A{+LWT_3;|?roDdLwxLCr~lCw+$@i(^&NfhQ+T z-PM5v*#s3*0JbV{T9C4#>Been-gsd>IV;;hoZvmLWKeVp3*@_75xBGHMPB?#5}CV< zU0?_xf$Qtb!!(3n6W?rNlLpsS1pF|@K;08B;zR(c$f-iYDe6P_+h0%G`aG}`=6ut^ zJU%3L$VM38BM0bnohc5B(qvGzFhT9 z2QTn<^O??egb31(QL5feP3E#7ulmSzV?;ysc&o}4S@r>{gkJ%W<}+7^_&AzmLPHZY zcHJka^(mU3*#D-U8(5|beE>G6noGS?C+5f*l{d)ZHGM%^p($mhmn|pAZrx+NQM2&= zQRr&M(YW@B0VA;N_{K4xa?ScnBkV*AyQTt3Dboc7~ufTuAI`886TI$uwN#nA%B!;t^EU*H;cC7^R)EQ`Try)os6s1(o$cMoz@&78on2H7ien`GA>Orj97s z{fTw4B(x~Y(bYtpdFe!URUl!pLtfk>>lN8NyRTE9a&QazH`ni^5V~2rO#CcC8uwXW zg-2_Tuvi}PvK-wW2?THm_4I6G+u$!Nhf#5k>iG(bKd@dN9AjVjBwoMB$ft-_#l1H~ zMIfnTlgPwn#Ov=5e_BJ5YGR9!mP*LYGqV>}Iv>R%OUCkZ@{=v9n&d4Qj#AK}XnG1~ z^^;PS0=>G$GYq+OADAw???Gz5!dGy|)HNOJQkDVDcwYXIOrUQfy9o^i05FCI0KoJw zDD$6-`G2ylLn_d&8cI0dSs5&5@f*Zj>-}3GgI2RuIBNn34d9kq924Ttr?{37t|{Br zE`?&9Vl7Rf{lf~Fxf2>g1Y+xt zE!X0*uAEyu*+yhfTZ)n)?=|YBXfFDNe6uH?)$w$|-@!eT#0 z{fC%c4nnWl(j8>{b{k?;-`9kqvys7UI4|nFb{tkWY?OF?TTN$7PE!>*@}!t3Wjeqd z$WJ5)DWEYJ9)LCG82Hp37cYjPTG*aAlsT>P5?PFL@2s*p=g`?cJV}}p95!#cp=nlw zx|xBLp26_)tZUt#BamH=sbQ%uSumt(UVDk+&}rg{qo?***=<7o1SxqZUDrg)T3_NQ z)sC+yM5gw`9N_4StHFl}*N~*jLPW4IZQ@b(Gb?bS@QQD|qfm-48_d8qo8zLvA+vq# zaiDNAXLyv%AX!3tYILoSVp|AF%6s-6fdH{@I;X%K0WD7GFLI1H#uY1P%WWDH9A2gF zQd3I>LSah*n*)qv_E0?~X=~MpkC{<(aO?Ycj#_{>ye{R#@(|btW3yTWpn9(#6eh>R zIA|ytJ*o?uPURlbeiC9GiBuexB%R0I9Dzv1i8v9Duc25o9wM%nto0vviVu`$z;@tj z)e%B_=UT1V2RMdEMAIzT2jnWQqA?sAN5&KdWY$hy)bK2uezAmhOgXVqxK9@QEvC%D0Whm?Hs^U zevy~8+>)W%NYH#yhxF)1EAHW-`Xnv%jP2dnr_v>*($O&BHBrJH;LZQ~R=lfj+*p)* zfOd4qrEDLYW_N$G9ev!itrfV+bx_+!bMAS5+>CFGf|fE#xo+~8Yk*pu=b9! zx?_v*h#cZK;nX&6#Gq!XCs9#^y@p9pGXnnGwuiB{@2Ntjg>e zL(9b*k7m`fpI@&23Yi|3YSdUiyiAsUCC=$J$kKG4c`kFYdfXHdvcPK`y_x2QQhv?6 zFc(NYKLu10src}PFt4y4J7Rdr@PRIPaa?7p>b-rxB$0nY6J9;d*<4-ogv!S9%o3MO z85f;|#rSo$+;{WypC=2EvK2TBuj3Ujf6Sp zPC8avO|4rqQ}r;J+E;;M(Uoo8I1o`Is$NO1Cj(`4>47R2mNZ>4CN=Mk8%4%YN>PlS znye)^j3S!g(FqEr;%bqe-5|6(k>}2)!>LlaYq!2sQ6himJW@|I8awwBy#!aH_F?QE zX4IUH=|FTN$0UYLc2a>HEdHIR>FLO;09&h2R~790sw1a&%AuSMJqDP6dzKZ6dDeKf z75$yWC9qaOh-VE z_)dc`T4MdHvOV%ql~i-_W29M+6f<@kLz*qdS+v`k=V;RLOGad>mSaF;B9VM|n@|N< zQqkV~3<58mab)v_s1wkXaCgF}u>Zkp!LuU77mIQK_zE}xx)~1;`}7g@WX*1i>o`v+ zE)taV!D%yk%)r?%r4Yb}%L9I%z|ocr5FV=-4|7qsf^bP+j}JH-`4 zxlPELk9LpIgRn$J3le4pEwx0`>se5>Yok46#G25TaOpdXYwlZT#%R>g(sXx#BcLqthC)gZ9pj`p`Km{N=zZruNFoUk_eeBI^ZX&T ziqJT{Y<^j)rJ(SAHK6eNo@B$yE2e!S4Bosvvq5EBH(O<(R~j*A_NviWgL3M&ywMSf zaSfBk4lX?{LA`j6zABGEbm#Dzalp$!?{=Q({aZK8aKX!Od?y%?JYl{OS+fgfUC%s7Lvaht_wwV1zQgnfMf_2yTHi|?eZ6QMX5trr-UN{DL=Gs z=WZTLRo+_0otr}LC6_nVOUWZBw%8o-(OZ^i*Fz1Xq`-*Tmv}gr;|LY27P;clJ%X3%DtGr};@T%=tNp z$>>96LEx1m3>pT?28bJ9)=jQLPOgMaE>K7|rAZD#AluNQ(Zd$}Lcj09ov;O4)>^@sxhpgPR_EIv<@<32-OswbC$q)56F&{7R{qhh%2~ipIwts zyRT^9N|O}sz`h7Wg@VUYVcf3C9;I3-dcbKMvQ@im*x3l|!3nNC(XCakY(z>N*qKto zuE8G7nc~8(B7WFPoYPu`w%_`Q(UD4JAMOZiv&eFUTb%4#$vI!74b>xYt5v5B`#tf! zR>utpo?PaD@5t?^LpM?+QN>Qy4JT%99X!e9w$&a(rq!SA5G$fY^We6T+M++ou2G1> z3R4KPYAKLo{kPy&KwA@0hyLwbq8kyPw6P9Z(k{i4)@IIzEND zW(?C@D1Z}J7LU1Lto=-GNwU35Mtx+7ifpvoIL+g#{PG#-q8)12@c_ROICo1hYu)HE zRBhpOF3S z;(S6wFWC6usTYrvV`Ef;y`yE3ar7nRJv$N^d0jvTv3R(tP~ugBV6%J2BnSo3_Xqs` z;nKV9xVC5E$Tf*q*RgAT;ni0{pS`!2W)-nw!p1w@e^30ZJfiqzKbR8xN0RXqQ1JgN z$B@>uGWstWRV?3sWK=@mrdEx#j~M6uyX_w6gzcx0^9T~+8=^>BuD{W7dj-NM2*b5n zQ}-U+e0U~5?YaO}^(N^JF&KzJoEwEHParbZno&&psOC^Sb5g|L9w){+m!#sH)7;Pr ziPPBC%9h*Z1IMHns~*Q`HIi#%i;wf?+eSfoAx{ATjG1aj~ZG$ zal#-2wNt%a0fYh}0+b2hI>7(_LknKoIdXRQqd)=pQ8D}*Ex5FkmA;X^u$hsi;Xk2u zmXemj!jJk@V?8(+e>4PwJQt`rC_Y&RR1i@^C~aRA+}KrO0!WWvegS0GXTO4u=RhFq zu203}LoV7SVV-bzc3$%N;ClN%5?I#P&yx`u0E)_SS$gUMP@;Uyq&tK;2>s9rjDc2D zr2MqlJVFX#3djVcVvPQX_A*Whn7LE+J`P!Cff)-osjWHjY44v_*OfU~<^l%;kEP8z zG<|HCK2(bgrpBr>(wTN}H|w62doVSQ$5N`6RV(DgkpH;u5)uV4a9os$J+F$F{Bet81gFeDrT%f z4ZCnSZxHs=_E$hNr}-RSDaKy>rSh}k*igpw6}kZ2NXIB#{RWT^P-wN}dtv@0TuQev z6HwU(LjBO7W`-!8gH*w37O0tgUE??YA|^CpON$JRiqil)b1|63SUiCF+sIL`vwB-c z(K&W}m>t4t@=hJAnAPmnQc9P9I~%I?Uf8v0t?V+YClo(FN_3%}P*FJt3ww>qNNS;1@KUl|30_`<*n7(M^|NZz-T32t%L1|_XRfT z$7K{=NIg#8k7pa7ynv@ay#6ex|nH6aiC zYlu0oA{xe+E`!w7$4F>2n!(Im5GuY$QR!g_{Z;VMJ@UT$j~~dl{e+q14^qZ76irVHa^Oi+&_$wQtw9&g!{`ln8~D5w=Bs>rK7vm zonnPj*+$+1*2qGQ`^>y*+v6+`*W;q9$#`ryZd>sq{n6pY}Pl% z%N6O}>vRy1)!A(>$QloBpB)}ZWl2ky%K|AIdF2)@4vh~8^^s{75Gem1MHpRd?#V*9kBNUs# z8Q(rAXH?>L5;o54)WG_mc&eqWv%uubCD+7<{rm+EBSX;fne^ZxGtv)ProT^)E>rV6 z?D<)9gkm(zn!j(qRV2O0$BIVx9x%I#1lFlwzMN(Q1?92v&`Z-va3svvsI?sDTjkFB zfM+B1h8GQj3bgC(&O#|>*=Ag~k;Qi=n|p_Yg8j=xH&Po7M`sfPwAM?t_lpLAB)+Lo z9t}iSDl^NNu%jKLF<{}Bc&j>gfAftqtKkAgyd6U&F-fTPUzG6yx)5g7KRPI)q?P2W z?g98EZ)%7;=Bi3Z+{kSIed09I)R-Z8j5I1#P-B&Ubn+lnqgL0E;V>b6WD&sCVKIra ziA{yd?pJ4>hhoHV7*LE2Iue%d!^}h_zqnAT#XUjE98m{7XwBUf>MYzPq#Zjm0;L;} zzYX8?Qi^|SB^4>A+Z%CbGDiZjLslUbbEMSW2li{bT6IvS3EEksg0EQEck{^7))QpMC(8 zcUw7rQzuEpyh&)odb1X9(}~k4Ic(ka*$`w<^1DF+%NN>6tV#1NhTIAfOR1ucF`?W=3qqu+b|NA&zLl63mqY@1tFZq848KJb>3@0VCP~OOp(Lm*$w=aCh_%j`uk7m>9Y*5ih7bWCrjc}j*R58i!rRjb+w?zJjrP9uo!)}U_6yo#3o&^u9zlDz8WqsU-|232&_zmsVAK;z08>kwY zppS}_54J_Np}KnZ)1T52**IW*;r0Cw z!79`cP*TYc!ma+fSC;!1DEEI3seiydVtFTPM>DJcmG}BnIb`!cYSt=wEg7sI*9$PY z{|2r6$7M+Bqu>0nRK`o;UQl45s0CrvO#|EMtWootR{EmOT#U{<_(CE47l4oA0#k&z zEbjWSl<{>|!*jOBbynNQ=LJx&g(WIO$PMs|iLZjRnMdI7y z1?Ui5neNA;l@vS1P=SLXR)TFmUfC|g_y($4lqkvkkaDB7biYUg{Vcx^;;ujG$aFy% zDyQejLTWyg%)e z#Fu2_5e?5XAhcGCmlVKVa!Sa(O@KS=BYFsImAqW_9a!4KB~tu#{%Z{{u->*UMGV4o z?!WC&&(QJ6%8hT#QPi>Y? z($c1`>%)jW#d)}H?mB0@ro3ccyO~T;n-I6nTQAdv4fe>XU z-YR0W?6K+a((I*~b8uk~r`(|m`!GkI+;#?{^S@x(^w91NA#@Y$We|8q8$v6+!B&8yfYf3TMgn#gW)fzBn&ix!vuxtcz?EmxTIOLEfEncRGrrMY z*(%XemT}+Yp|qVK-v0qiN<*jh@!{5GKv4;)JX7^#kebrm!Yp1nLXplHv;y-bzvgNR z!^EV9na7!pJa%f+q+{&_#$)3}DU!L3(}ere8`zgn& zUbOxMem%w0BAT7Hh%iH~zhy9GVknkCtwUF)#>D~Y4be+#)G;q0gi1*%dd9DE)E4Xz zkj=A8Be)n(+A$BzU8fD#k)$)Zg^iP_ovk0ba%&PJnC8&P%v)?Kn8oCqEZzUusbgca zi3ZNuHVnmFlcu8?aEG|)kZ~lk%=0^tXs1yb%A}G;{^(A@1gKQk4h&0xAd$F>d>_VriI9!qkVc+R+>9*x36Y$bmd3W| z0W>h}wPLwW!)kL|b%Zns1UwKI65zm_B{Qitz6u?bW%v&q0 zh{=`ER{X__y;DPY0bqy3V=S>?{ApB!n53yc@TNS7x!mF1^TPBw-qN{M@pEE5LiHPr zI;AAX5?`cHOzo}5{7qCIfVgx`X(nPpgvz|4Zm$q;D?~Z|G%R|dcrY!K@p}qTi&^+m z4p65s>AZ59`8ZXbx@TJS;w!^^x57k9Fu}8yo_zw`?qSzaz}0r0fQ#)30XNec0$!Rq zu&cPbxRL1hsPWc(n_o>j4(t=F$Z4)|3~3j9a#GxQu@?drJBE{0?SZ*~}djg|0;HZQ8NScG_jk6MA zvd?A6yzmmT7d%)Kldc5~R*ws*&d{TJ!7#v$OS-|Yndkz6E zaL2MEC<GDbw@FfN}3P5hlMZZU{_wmHnv@b9I#UsQGEo3J@h``M)#+i&TS^8wrGa z@DC2Blv>dt-?D!MUyi!JEbIb(j^cK5hTS`TId73(zlhzwo!mc3-JY!OKaK9+Jp>;J zUZ1t&(SmYL;d9Y75DjPavEMS;G!JZ0?>(@!``|8#aX@*Zv>N4!O`qoQ@I?&VehV4g zaivEjPdeFh8;T(@I}XGrx89JwPGIy}?~ir7*M^XTo86RT%*=jwfr=@SiP43(t&aG0 z__NowV)toG&vJZI?%!3UN^B%^p*@};5K38J#WWq&*#_{w!C7x??Avh02%XU9?ELV@ z=q_(zmuxuYq_grpg;&(pGX`fMbu$KPS{}F)X^C7~awS>hH0``0kVQ3^d>$4$z0gMT2z}q#i8L=f*{L*%hk;l?m%&yFQc; zKQ~}MliaBXIWWC<#z}O0>=RQHe3c*lz3!GK%*nbCpFej-$8(9m{PIg}pUmxf7kZH7 zPdr+z7C8A$aA&8J5vv2)itQd`%n-56O8&(D~qB8iK-aY97Sn7)o9=h z{Y3WvzLWoW#si`8GhTk)hwBfX{x|PLR?p!_z5P$_I7wd1VnG(eTl%3$&C$VW;jNCH zHzA#dQoD*V);Bki!jfvVT6(`uN-V)X9&S?x(PyyJE`PTO{fqpL+pKKEoq+$|n`h?T zZu<4Fu+>kTwL*sx^{)d<>orhT8Z6VG{fNzP|AQ5ioiO?F|JvBLq-@>8n z=q@Z>Xx9|@zEFHJe=|m9-lTyX!e`RP^#d?&A=d?1O+k0)#B$iEG(|$?M*5Iz1O9r+ zs0d>0}iTvz~0<9?pB%n!4O9Jce#DMO)=p`a@YB|4&!8!nf=7f^uj|$T(JZGSuA?2abeUk z!|Dm8mtUb8D6=NKT!~id$z{VnWyYS9J&Fpjc zfa}I=jGi?X?1Aa}f%*`$8A^mFwo|?G=zVF$c?WYf_gO_H2dzrOi)ufklH4+CxLKmv zF6Adj9dmi7zXuQ4VAe-B&Fitd5*+?`J zXo;8ULHolti~a1dcQoqF?8DoxFmO_3NiG!84sX`P?g9|BacPf<5pI>Obcxy|8VUhdUErt;$u4U=#9g3Op&zWS_}eR+f}xT-(T{#Ud$M zK5KGCO`V{fx#=SH)mO6P zRGiqF*9!WX^>qO~B(;-$55}&nre}&)3LG1dLtd_jmiv33H0FkuH9*6=hLd-8C2GTD{7G?B2Kn5>mZG8rJFF zho1Weu`L9&lsTmLv|r(}wB!c3ISQCttvsqY$h~+p4wz}7MS0nivQHp0r)O}L3{37r zy5#<$fR657WkX zh+Y97LqKZsBc;R*qe|{$DIGzwREXgY{qc$)9p6Ki${Z>|iJx6QX(VlQ0@OjEs;5O_ z7NU+ART;HU+9sCq9=pN9)GzC?N2M5*E0&WqPOynXs;M7irH?4HJeMidfo;qt!CjRD zvoV2+=p3jCvy-^cjFtoAa9H%wx|r09PDfe~cf#UQ%1t`7M6mH|Z8lar48wjY&k5k? z1&4fi28L{9O7s=XVUl9@SnH^K^)2hs`+USw@WF2=aA<_L^E;68`dI${@8bZo91aQk zXOJd_|96*&vNmScj{kcDt7zC_t6+XDw_l2H4~AorDJA^2jxV;qRAtBuUMCQ{fNoX7 zQJ|9E3`}q8bY@YjQ8Y_pgS4V((QZW}M}SyOjK~8KRgV?p*3`x@c0F#J>AdTOVd|9a z_ED)<(%DbNG!`-Wez@`J$tvjiI?3V%FdgAXp<%-wBD;+YpCjjiB=To41jR}jiqr*4 z0LqH!?|1W~HN^-g1khknz+$Yo%O54si7}Crl}l`?$S>T}M~P}Bem7I26|nTR)eJ*e`oUlsQiG zImMD*R-8?rJ}#CIwu-_u5H{~8Z$F7(CsX32~ynnl0f;Ec0;% zBW;`a_6v#Z?}x-~sT+@y2IK7}duh3$lr}t8uQV0Y!$qvMQEX78BKJwi0>ciZI6n9W z<6ITtVz(w;P}Ua+@no@utAa%`SXK|(gbrN}?S(qgMk2M2`JlNx z&9YeLcWSem;38=&^J&@uRu4RghuP^ z2K#eYAVDwbXHm{Zq~NTiS~EfiY4UNk({5gIc!y!4_RQZ|Y*xN33-7FR?Ko~CwYS&` zjBMzy{5?|ot2$OcQpAE~e#Gj;a`po2T~R=dJ2P?5xmo<7UcO9PcYp&5e(mjeZYmId z)yB1!$$tTP2N_}xrm~WiuX%NbwT;{0e7SY7rh6p+NoKyk*<7bKil*oFwjk2CXZY|< zUoVesm?wR6h(W&g3;xPwO6!z~s;YAhdC>}cD4(|oey3|qiGuN@O239kWWCit`U$=+ zi7-9qI8xksA}mq00aBHQyUQykThc_Bi723}K;|)e7MKpmOX5V*!2SpXwGCE6bw&r2 z68ZSSQi`R9#rcAJ?JN0j+(#p;y*s&;*j24w3b}zty+=_b?v3;xVRd&~frB`OC`&UR zZPpqk=?ck9Co*XvJVwmHW{vvNfU`+ElsrZ^GajV z0%7I#QQnJ#h$dAmnyI1pWQ{P5)zK5FkRS)!ropN|O2>&PStq_Zf2O9Csv=&O zpJX`N{MW2dRwyCYF~$Eb=y3H;=t7^*h6m_=j_K|nu?VJ)fUdyXrtE7VUi!I_w?HiJ z(XZ5oY(~P{FL?oRUDh=q-V(^isfi(A6Ij<5MYd1dUgRL0Dk7ijAczG{Kx~I=UCkox zwIEOudBRGC*AQ17=XSv8oP!WQ}L60 zpnGF9;T#Brvqw2rtY%s6nL4mTsp^DA14N4ASRUCC_}FbRtFg~HzRLc*orByrYjs&p zG{N|42sfpl;rq;Vww{0L#oyw)Mf6}A&MP~N`&zHEC)QpP>4n>YwKCy)i9VhP5zNl^sAp~T<>clfq%Rp``-Bg^1k9QT7K9rxfe#e zVt0E;0ri)H4hDxm?a|5%-_nO>)me&?tU}Qqk9Dhg7}{p?{<^s>=K<~@`vEA{$nukoO;q~`g!=@ zKM((J(&_&1hnKbgheBxv%Ks0-a1Vpi1Z|dkaC@Wc-)#b7Pj%364kGE3V_1+5$Sk&^Su&C49I%d<_( zSh_-Yqoux)kEz=dp#AFJH)YQ&U{3_0sP>BfYH6sl`#TAV@7I}~uZIvNWwj&tip3k} z8A*OzkV^aFW?D(~3EPfCdEI24A`r%W)KO|}bmVPVo z(}ev?>#u6l7Z7cw+w@?tOyxTDE5dzj3RK!MO5k_DW&x-Z{E z;=8!V!q?ZmmRog+Erk<&qElg-&B)VS)9Wb8nN&-ca!AQMiYXJb<$czQpz=gy&ah4E~ zMnV3N8rN)d@l#mYSk_@M|UV4!#A{sa33s=PO`Ml z+?|rA)X2(Ra5Vg$6sXOaE4GN!<{%B|&g`9(r^HB$oy3Th!N@84YP%-QX4RQ1cn2s8%{g@!WfgVq2^mu~!<_E1{aWTG-hi75*k9xi z#gUoWn%(MX4_BF7Z|@dvjoM3sHKHa5zH}_d&X}Bwm!Lp5k$z%Xl+`E0!7>9fXUM=4 z^u!-Kd+bSSrhrCO%(%uY{!H42^)yKr2P+s=#_4%hLYvX^13mIRMlCq^HR39^%?BO? z)m@-MYw`Q$DaGnxAa@Km=ZaZ!v_%#4qA~Vs=g6D~9`7Y%xS=}LPFx&(BZ1%X5uP42 z0hSIi!_daz19`KdMuWyWCkK4isdSdu6W#@zLt}tQ@$%H4lS>6sEFIAdB$uJerL7v@ zet$Oy)8~l;Z&r!a}m}Qjj0|nA+lpzwA zZ4Y6oa{*_6TRZH^Xf*=6Qi_t1jC=1^nGzYuGLaI3@2{=j4im`a>v9@1=b9^NX2N-| zyTxz0$0>gN1H7oe(@vm+vu?1)3>}O!;&jTDErW6yc&v?AB{|U@RCOs4lRRB)>yM5S zUD0`?yj;_5JT~Nla7=+VB<|sKG=USx{{DKFmAIuWbb5yw?2 z*$%n_!##1`-238HE1>CvC%|cP(B0Yq7*3yPy%v&AmuXrTdbk!f<;)J%&gBAl`>(i0 z%6!NjA}h|ytz4t65Ji*xecL?GWynqv90F%AM)j@%+h9d>gln<|MWimu)v52eD4&hr z$qQ#BEnS%s@ME>HJv@Ec9GcIh4_?KZz&VN|1@Dmi77g~(MrhK}t<@sepGw|(V=xOJ zE&C^CaL*||orZmbV2NmEg;I*G>|s0!Wh1C3c}=oer0`eZ=eq9jmJ@<`2Kt~S`OQE5 z3zYN@pZthjp;4@PLQTiLzoQpw^YtO54-jCfsKAV{I?PHdFc!@$6HVb~XL$okh%&-g ze?i-k>rZ5|_3u$Aj(m)JSsLYjue||uf0^QAMN-N+fz51IJq{>+p#sVLiDizg-7&cQ zY^uE0R(9gmXv;$79)^OejW$!ZO-1FLN!QZv(mvV3uAHJ#K7otA-O9seIvuiMKX|@O z=iOubiX{H>NBIgzegS{GrOQNmauu^2_FeT$8KUjn|2yxrh|rKuF0!WNl8bnOKZ5=Mhpa&mk`d?%gPGYH5j@oN|Q;%3^wH;)}=mnx`me+bIU(m4h|_7h-3wd&>F zwDTl>kXkVHK!WzN*XJJrb-$;*e|i0cEGqsu?*83jYiwk1WNl#dzX=WHHF@kGMv?{+ z76#b3p-ystkQ7cIhfWQYw2wOMS0p_W+u$@Kmb!jzpp4I76$LzSMe2t)(cv7;b;#Q~FNHNhGb z?6Z@npWBj0?lQHh=o!6YM`?jp6Flm0d^B7kv*B;*i_<XXwND8GbD& zJUx2c4U_&#;~8a_!Hu5_G})7=ri@IyiAS#Tcd)z-P(TGu%t|{Hsm&Vo6}VoHQWGu_ z(N@x+QUeYgI0Rey_h+MeKySDkD~OM=0w{~Hu^{U9(bSbRszPlWDvhADIfn=}jAS%D z=VIoR@r8`@!MwNNn5vB+7N9{ZR(1)a7Pp3j=(DA&y9F~|pYElr-Vo6?6av||TzN(ry z*=w##-BN*ruz%>kS+755%74|`GGDw9;G8e_p=uteG^XTiO@#8*(zCp5S?lMhjlNNe zkZR;r3TzC{<+4s9!MPJ*9MOfHM zj)wTx&-IG!&;0Oj%)|e4ars|q_gOzdD#&sOUvQ0E&D1US=!f~GSNvtDeAfBCxk@0& zFmhq=8f?As^&}fZ7(O99FL<84gZ^`agJj4)iFU`eW(Um-%fGYIxJ|m*cRU@OeZJoA zVgF#o6qt^^bV8T(HWXJ}X!_opt?7wEBsLkt%*{vMgTqCZ~Sfjppn528maQ0?c2 zoxoBC;TI_;vQoisYR}@8Ok=0AFrHehRNv_XvAJ?GPE|C;z|VC(=uxxiKd1Kjr>!vu1--EbWFWre*&64 zWI-(FW_u(~ny`ujL4D*BD)vxrG|_Z0Q0bVRzLsft|7yk5VkWQV{ud4Sx?5!mJi1%V1(3g6UJ|5cbGYs zf-D|ZzCl+mlp$CC@n>?K5eNBhnOAxcsfL_O0Pe1$CxlnN1DJjciu`E|n*421G(>t1 zAR&;bXkEm-nDT!7HE&bH48%XsUfJq%f@Do|H6gAr2q6UPS-dr265)s4M>5~Af)%LA6dD7 z0>(ox^lz7L;3$}4AJao7{V&3Wa?ukv{WD7D`LUIyHM1n2ga0+C|3@ou!=ncE^5fDM z`t#HG`a@m(|ApKBKPrKr{bp=t@;_R_E)F+O#igZ_O-cI`*Z~#<0^iVl3{qmgWC-G1 z0%9Z>0;J@6MNdiX{$4}UNy*hsmvHqIWkkhtv?!{6ay`_#X49?N<#qK&8ublz4U4LE zrPpbMxgi;~#O0 zf)3Z;hXkz|8zRtZL;eh#;95Soha_W=kJ!~4Rl?*L3@x&s29rf%mk2#`%ma_s9%|Pp zSTjf%WR5Wu`(ukHV%Ukrk4a#yr42i7a3n@&2 zI9Z}n)|OJ*VElnNyGEBpIz_c;7p5{RU#BmrRb2m1 zpE8U%48>}21xYY!q^_cVhrfkw)u0np^$08yozg91r{+E?ly;bkSf_fQ#jSeS3WY28 zHvXM3DC@opv30y_!e9n!Cuk4VoieD+zy`^7-tP15JJOBfE$t@toi%97u5#G3Xs1fw zyKTlG9=R(o5B?n=s88qy2~Xkfz$(EVA}HR_2r*CfF7nI&LD@S6SK3D1+MQ0aV%t{7 zwzFc}9otsNwrx8rwr$(CJL+h^U;S0PzQcc4&FA>3`)t-6*BGOChyYd~gqPw*nJH93 z#z*|Xj>_$!`dZ0>@y7YU7ZPbtm`b2(kHlvtA`HWa(C=sn3;l!nYbZh@`?V15x6^?_ z&T9kOZ^wfwd7tTsI^KI~g%Lc|U6=jYyVH-y)S=&PceWpU#xP-(bJg*ZM%e{$A-1vHsruGSu(dJ@Z$j zh&8VyzhGM-%=kNke&Cz=zD?uTw<`Q!N}aoT<8h355@73 z4zM9y!ILyz?FN+&yg>W1vqRKBKtWW}e=_@qh7{0$w0{;HTjg_LM^p;ug*wRRFfM6V z0zM{}kF6{laU*J@g9A%Y=&z`b0Q9;W*icm>{bqhL+#<2KmcYJYXof&5)!%IB`f-Y> zYO1D(SHVr7aft^Lmp@r<1>&T9uC&YSR+d5tEy*0>gI~l|&dnC{o{o_LAw{h7T$Lhn zY?(c-U-|00I~}@kvnpv&Y^m4}6#_SyBUIN2MXkaeZ}8ty}V$FUD@*UBy!5v=KVXqeR?KR$UxdT>J>oi=gdVTvJ%S z^wHK?B7zk!#`e!=`==9V)xBDd=(1=Q#}R`eTCS2n;v?@SFO zk(V^$o-RFtBrOu?4{&=iEsW~eS^X6aa8xy|5#uXL95Z*&Gu1aoa;7vBbUC}KPAkJX z_pL}LT9K!8P!Ma5wMcy!{fb!@vB}70=&?CNvLVl@b*Gq1%cWHPBA?+p=oaon z*3EzY$v9Da4f;A`(|h{4qE;o?BvpP_DBoY zh}JyinS)-}wE9xti%h_)RZw|ZMAQ;GY(;6}{50Ka?ps*m|6*5$Ftbt@g9yZp81-6c*5^Ah2+CA%;GrAq_|RsA@0b-x@>KV)_5 zt_S-J^X&kg2GBlipd@6?khSuc{2+987@4yRzOHRpkvV$lg6ts-70iw<$ybjGqhQXi z$1zG}*kR>9LMIzwFU>qaFOOy3HZ18#IbgAwAsN}YWrW^!9{RhV7kaRVMqy4okwk_# zJ3$Gr3IsyD=wOwze}T$$G4IEMCX0#Y3v3t*FLstVn{=Oo=3lT3Hjfhd!nwxO=Xi5g zItoqOE89lkQt_zoVca%?=dHz#C6(pMAjng`;5;P^ZnQDQmrj-HI4@B2CzXmsZKcLA z-af!*W*9zKqg`Uc$qy;Po+U>s$87-B#aSuK9>uaq>tcr0L5CF4WLgC&)r72;hjcTb z+aw(5n&l-A=%YbbDA7a!{{Nn+lR(PuCKF*wZ}ij*R)?3Nsg)Fa{An3M1ti_4Ek=D=F+3sSV><+~V?-Ct3PL~tcJGXx4Q*>)v!*xUFLthXQSY&!JO`U#P>NdvQIDUO4#j2bP? zmi?4!arJ6j1o??9{0VHFm%IiGXoj%Wt|bUo$*HjPW$I=n_-t#6lFx4zBuY3%jMQGz zC`O4K(&SPkJ&JQ>v%n_Rm{9G{o(1X81kIAF3@V!_DwIoXV_l`^~BR@EgHg7rRv|Id* zZEp&fq8goh+VTv-`9-0mElcrF`e=DVMkW$3!>B03rBkukID-m^TQ^ToAoy$Ev zjczes8=%*@Fh@6eCM`OK6`8VpekdA6Ojes2idlA1)uJJ#r1aTmtYt(JH9JH~w zwu+QvlFk;LonzE(qz(#Yo{K5%u&teAXPao`ZTs-caE|iUF=m#hMvsn-V^qySZgPoT z4aE7}lI`$5=1YTKchdf(cTbxFe3B8~>@||IvKc{2jq=tk0n!j_TtbK_*owqX(t+^J zmmw_CY!Uiq`yojsWCwehQw=WVKv)K7FtjscRGVD-9=cH=(!s2ihZ@exs;c6gnbL2I zKG#4&fW}So9^KfjW0+xNXb6$hXE;UQawX%iBu9HmKyI|n#wJ30)T??-!K;>MZKo2) zk!G0HX7gt0I_?=L{f17Iv(-)|ke0B#Bw;R1^UUI#r*nk`Wua4eT|~a1dvM4qC54wK zBt3;YO^+C9etw1p+nOx4;ZbIRSXHyJq3EGT>BOT@8=Yq&y@uYXBe;w`PdiM~>LCwb zFF%8}bpe8A>n@F;;> zp8xnBo%C$fQz_j`R_Ih#C#c*V`=ZXCPsWOd>Sy0ju;5g{Lb8~nf@;iNK;Hi97BjR| zRkNMT?joU-BaoMC5`Cak@TQIfk8?YOiRX^4nh&s8W;>@MIlxor@*3yV9fiLrjq1W! zay_o_>JC)Qma@d1-~&r>FW{V&>ntgDUkzLUp^Y1W8Cw7DfF*H*6po!LiR?l()jr=FEApEg>o_Ah{b+1@6zfM+ zvErqU#*Ny^6H0c*uVxh{R$~HYw0}I^!&Kq;HB?LQ>=@8kQIbsTIgCD`%_9ku)Larf zwnlPI@qc=|DXgcIZHaTp>G^eZ=R7>YN@h9jg$-e@X6> znJ_OuvM@fqV96O#+H$o{%vwfJcRyWhTSpN- z+3C%0?0UbYt>VC07sEQYk)*Q<-tOwyzP@Ws&Y*(1W;`5wh9 zjbZ&EK+iBNT!yp2-`=S+&$eGg-&zubi&Wzd8)#oy=yN(%x2ZtWl(?Gt`jE_fwgJ(s zTOfX6neH=OCaBDxct_z!k?gUoRMfk|D9c%e^gew7^8N5s3l?-N+HRu6w`x|>oKfGb z=H~V`%os4B`gkh|R|7uZDg5VRz)ZT;@M`HdIcQ|1)TiRdQ~4E^6J&M}qA-h?iL)lT znVj46tKnA-sDzExy*;MYOHZFyOU?XSwo1qBYiE{dA4_Z`DoFh6X3D(lH+Fok_LVFz z+~s;xnbTdYjCHcRfp(48hRj=ZEv0DU#eEfSPsXfQoq?zQNHtim)uTQMSy2sZ!yDzy z7tZ>Gfw|l3pIlcaj+-kLu8A0~{SLaV>VIsX{HhbQ*&g{vmQ|Z-zU;|)mhQUQ_uH{= z+(ny2^CWuc*@zNnM15eQuam5S5PoN6g1R;L^-1hH8-C`i<^!LELK$T}MmxY0^ zr)k2vAN>N1a4bFM)L*xc{nVQUN@l)A`HQzr0Noq1 zd!9-__4;RlN|VS}@{jxg5#t5KsQ%bC>Sm6sI%u4`Y+86)F0#)Cn(1!ir60Sg5OvNvD`qh9(fXDP%*!F?feL-~(*d1{ngt_JaEJ`#mfIB0#V+K|hv+X_p4AG+_>V>9?RS4dAN7 zybZu@$hO?t63Krf@b2M;_c!0c+mPC>E;4Z>wBYR%+Z0Fi0P}iE^5d_1?!Z2BtJ@N6 z-hK!`NI6Li5bedWE%TmzE8L+x-BA1!92|up2sVWH3?a@04J{FImiaO@bFYL@K*weY z$7lcR9iYN7+IbU8OYh}3p87@*kc)aN=rIM~9Q=m=GMvCIwJxBJ z=?~B8$So$&IeT$_9Vn(Fvy682dgmQ$HFsI|CTe%c8g?=tc$nRn5e+paXph6E-nm2E z1}E$G-k+)=CLq`wD+ur~cEGGLyamGs&bvI@ArtInTpu$;ih$pFg-43mOo`N$aRDd* zs<=V*02le6xM}_)qXvOsa?!#WU^#d}QUEq?fC_v$9{>Zu#tvA7KkLHIwiilaPPY?M zV@@{|T4pY1&WAH%TJ*OvW}5V8h!)NPn~oLk2Ahr$4g%9d4{8T2VF!5v*aQJ^@D_&f zJ*GlYMxZtS)FFckus^&2EWEh}2p6fJ%Eq8Ae;;NG7Giq9G++re2m^2w*DnpOo#GFR zsz?l|0iZ_>8ig05f{?~l2(7V0 z%6yx)y{<7^?K0jfPR!-g2*OsrV#f8;Ryi35Zuf3I2Zt6O=YOMv*Q$xP+stA2-!yXA zwQ}4@a;z2WC69*S#zbV6N**LuBGE^wQ%Rg(g^evr2HgFqnb%@MK0$tR zEA&g|BKpb5CmXS^ba0bT{t7J{IBLklCycMKAm0+Ce53+GbrV5%>&Hkw;ZXk79i+V7 z4a(x;tuRNrDocJcUX$qD^p*C2vS{U&l)BW?4hXYQ5(s1PAcPu-bKvUo54kgLIHl4A zlK=tqhX5WhSc3}nF#03JU4fT-YFz;R!K{7PF1Xl(&pUts!2W>s4wEqO_nyoh#}~YB z#O*-c9nu}5FYM@@;9adl->sM*7enaadm*#{a?)PhQ3MhY(udA!pV0{HL+y1BZ64r< zmNr;sg!Z9l6FNKO_8PVZnHME`7vcf=1=N36#t->E<2J=TCTH}#&bwoLIPwVmlH(6F z3Cv9m;ld5$>K$?>6#fqRJ|BOsdhN;b793Z$FeVy&Uw=Uyd@+ynL}A#3b9Woid&-?2 z_TInw0}7eJiTyb$uojsN&1iH+C~}N>B!HCFDxyCcfduD-G-$RX^3vZ84Tw7WR58by zK(5CReJ|zehMWoHz&AAKuXEYcZW-$Gogwd{okI6d3H2b;a z<$nQXuLMuHM00OFi$p(m4R|1%6~#On1U%3ygh9TA2l&i9mP5X!2lz}qwn4rH2Xrky z7DKiV3h4vO%UTA6ysr3uLVgejOEpgBYe}!IVR8i#Dy(`(@$Tagu7Is|m$&uRL-8O~ zvdj{TehA%c4u*{D7n!G;hak97X%+6=*Qv%d}bSG1Gnsne?Q=Zh>>u| z%J^rsFP8ToSLvK_+K~D$4VuIL$h| zqALXX9YVhn<;wHSiUpYGgG(6N|26WX8zA8d)gIQ2q|lV_Wp$wA*yC=49xVtxWDZAj z0GA)Ku7|fDcD}dE4&HQRAsnK4MRmjSa^!z}z8nwtF z6gzCW5Z`(T(j&m4FT;pt1s1_PV%ei$&ENF^P>qG>7~2MeCkCZY&f{3?L5MdD$EAS( zU(VWTn^0E_+%WIbw~j99SFp@5l}G(6YFb3yeImZt?^v`fC;9%9>_tb@SS)a_5$}xW zu#}_ay74;s@__o}p|d6cngP!nNf^tX(A*eaI~!8kBHz)u=|ve#tOgqX`yoCX86XGT zj_mug>lG8eP>V-=j`>W&`3Z%q{0>)w)eS!T01aE{(GA{dIBhP zg|lC8EsGe+e9>cuVvIU6B|Cv_l_&#PkA+`a`x3r5cc(8h=*>nLw5ZL(TW??ZgsJ4BN)K@(Rdo9AgdX?b_y2TC|KIE* z@00zi0N_9D4B+MlP4dNQpYYa<`2P=K{J(mDlenp&i>s6A|ECD#sN1@$YGC-< znNd2Mr;~Gv>W{&pqgb*G1<$boQB@w~iD4*`ASnI4Shu7Yrnc~IyTMD;ZR(AF`&4K* z=eJ;1HBBr$t5?XRRr@;Ar}g&z&iCt!yV&uT7qNIVVxfKKp5=b$^UnLDZ}#<^C%6qh z7qv@{JiMCZ0k#`H7=7r4s&J5Hqc6KKCd2o^(yBl27<>=Bc}tB&8L_{_HvNc=WgfY` zz&7_$8-+N0agk;5{XMEQLUfjH^dH;BJVJEAHSkMEw)ERzkG#h_l=i|t6m*F>?*XKx^&J8?=!tz-?zo(xqoiV4Yqw1W`22JH(X@M6v z?&)Z4YSCzuO7c9F@$rJprkdBC>f0rz#7zis*i8vguEeon?#@ zaln(2qgusCR@5ffC4hzFw4=XtZThlaqviuh!QWx!h1(LNcz&{NILlhGMxRpHA#aKn ztD`}U);x}IxnZo{PlpBWN^Pa;t3|6|9WsIsWKsK1gy^FFUw0QfITD_W+%nzEQrpo={3=hCUwByOXpjg=1X&y%%0U4$ z^pG+Not{ZI$T5oW7}OVIBgKL^!7H2=ylzZl?;r8_r94=cZXm07pYm%Ai2;jnmpdV! zVOX=`g`tWSm`x&gF4CL}DxT7oc)!y`K(`_ZI!kRPE~2Zfts0{iC}j`2hU1n8(i;fT zn%_D!8U5xWNJAAfRJHZ9&XpEQw3tC{rdc4JvC zh9k))wjsmFIeOZWW6{QJE!%{3lycH6clu`*kfUrZ+bqerap(j-tI=l0Fr9E13QlTy z21_sOcTDVz98jR%CqQ4Ua_umS(Z9;%>aUR^Ygto`q zkNxn0|5$z4Q4D$NY*i1{{p0~-*f`p3bx8^l46}Yes-OtRG1!k@H!jRY6&UK{yU=O<4RNql{hA-pBfC{cUno6;c?F zyX7OLhg#BV>uo=*h$>FxxE*n}2gi(6vC@izNPjrm8WtEUQV%JZlW{8PwJo5RXbo@O zj##1Xsc3K#=`)Y1tI7~-iY4B`bek-_oVF>q40CfC3hXOetqnx=Qgg{Cz{&(;7GX`vqB672N!Ft1KaokCrRE_2f7&qRjXA_9Mp$6{e4Q{YA#0-Xu=Q#A zltTi68^{C@t|TlF;^7Q||B$yK&i~8TZwcd)oI@^*%V!o76jlirg_tHmM7x4!mYhR1 zqJ9T!dg0vRgtB$Yu%467)ALBy9~8JM8cZ#C>B!od5Blr%v`D}keTiK-DHy2pm;a8i z`~KyO{+qXZ={sNJHO~d_JEjYBxH45-Y7;@>a>UdYdDd$5uFDN~wfSdvl-k9*7ve0O z{`>zj`~Q!z{T&t}5%oVuJA~u^;*@2=~1X7Ofu zyF0)8sckQ^5|5DY`tIJ|-kQ5VRb99*S83dK*X~E;-Lw<^2yLhbFgOlkv@IcoFEdz$ z=xPQ{npn4YEp_a(@QwE+ZSNKGR;Tsxz*MK*vbWWvXpF5$gJ;3pxCJ3q$=M{lsC#k) z_0`)+z%)87u5dlIXm|hR47pVLJh6FlZ}+io#m6q&@uAH+i6Yjr-n~$^v=5`E%&@Q(f8CIoSM;( z;~LC^0`T54ilNc!5@xfuJm~FG)94@WZN@Lv*Eh@#+|cTr_Yu2xVmJ*tBRHj{Imaib z?YbcC+3z{fzD*9UDR&GHdb&4b2-+lCo+nm*dA92a?2s|O!*^*&QVKCU z<&pdKUU>+$JWs9!B~FPZW`*fNc#E|Vrql>dPJ(%Q$_@~w1?9!3QOWU9llU>;(|G!6 z>*pq=kEpWpgv4Yvhb3a8U%W1%}4{(wrWR9H3E^@hNMdQ3S3={WsuEX_OaZ5 z?vZ6?K);%PXLUhkNi$8b;@W3kA|Q`qf;UWhzru5o#-}?6@o1>kS>8!vU+ywFvA8 z3`m>=9TDq#o(V_X<3aJy&OaAA`FS22%z){6Jrc|C17lYqz1iEP|xqws>?F(Z(79&5G`Ry z3@taQpX)-wI}(JF7rz@yfgJ=b4y5Z6%aIrbfXr#j`OJi%Nl{vz<-nOYgqt8nTm6W+ zOG#?W)QEs{334fw2fT1;QQO3kLWp0)&j08o$M%Y0jkR$pWPoyVYSzWJCu7$G7M9r- zG<6c3p~++z6RFB|!piYQltH+Ua9W@uM{S!e&`;^5yXf z@Nkvt;m9OQ;Y!COT%GY#F@$WB_DHEFC9N(_j+Kx~+(L0WMY4}dje*M4MBk!+QEI(1 zPig-_1`>Sb3po%mN}^qQ1!9eG7B)gRy8N9zjQy~{Y|&vi(QU0bTpXg@d}?_adilXv zCrMRr>iV)BYHJ%!%%=%e8Ge<)pA&YLLn>q}vlcZ)LS?O1I`~snwpw;H8@VzX&KAJ( ziprAu3hz;^>K3T~h!RSB0xh?<$T?+}GBwLfeYc|c1HF~54r7ab-73tI$hPDc|2+L|ZBF|$C0t1y6 ziaQ+44NLuc1L%u)uf>Na}5RoJU5`E91k(uPgK z5?`cxEy4_{qLzYTSZH{fY;BiHHPSzYsoi_wYfB7g*8_`lWbnCOVr)rqYphbwChn_? zpI3ix2PRRf*-q08RRgmo8mUX#ij^m75JZ=>-Hrr?3yb_$G)p)lz3?wdXO(^hr3Xlm zROyBkd$N5E z4C|XO=_!g`iwBD=Ej4o_`H8f1@-VBN%TfiZRLDEd>_=$q%mS#w5Rg7(UtQMrOu`Cr z^@~NAaMV}}> z__P|rHcSq@*Jh}1NDXg;q^=JX4v)LtSEAtLJgHYc2a4*KJUC%r3H3}j( zG86F~x|%9D`l?D=EA16+A}b5Wlh_YgjjZf7ZJn}%+FaJNl++Cs5gfPFWD?Pe0eGaY zXu+|`IKo$Cfy5z!`#lARPAH^#$Q#4GfU08TxPctPY&e~9#3Idv*g%no40g0}|Eeqk zefUtq5$qSH7?|MdF*j7dj&QY_4jhfh+Lm#f* zNpV&=q>w6BRhQXi+LkrRv3hKx8MI%Jo0A z*d|kI_|_-V0Q!iGo@>OGh7?@uL9Bad8Q$~{pneD5pB`(-+`i>q@JYxm-?9t1vE(GM zB_4zxP+#JO7{3zuY}&-waV5rO3c@fzD1?~FX+JrXTg0Vn5BRtUsXW&HYh6Yk^>hgL zF@}z1U9&)vPg55JH%CRV>~dwLswOa!~8xu5r?8N>Li&iS67*>%*YKU z#AVXtVxBuBv;C-ePB{b9IVH_SI{!+beH!6&xdbt?GkoiBwiJB653VwJR6xQyBd;hDHb$+o|$ ziDe>7WKHto6a&4UW_5mdtZG^Oa?=QamQ|O6#VSwQWUB5l~B*6LogG zddU#@(ZHbjE6QBC`&U-A1!9VOWEe|qw6l?#Gqt7=BQRL;yj>S9sgs^39bJxXa_tJ* z6-tYdoPvFGWW6XV5}!}W%nULfb+_0qjM8ldBzwV@#aE1%!!*-X^mGro6rtg zSXR~1=*Uhj#FU8|hOS4;!qu3Er9q-si_*$d*uLo!poB=YLh;tew# z5=@EXJ#{sbiq7i5cu6WOE4x~4%!>mQLvSwtmDyNdd&oY&ahC z-L3G%74~G!IJ%av^l!34v<(L-v0DTKI+SwnPT9m#me&kg(I2GYA z%Sc5e>vYjE;-?*HN%DqGIumROW8Ec<)3ZUPp=h6q@Q)&zK&a*}kp#LMqzgWaSA^ak z0xv4KUgqk#zt-bsP(yh*OB?Vuf`9G$>Jlo+Drtkc*r#!)h#Aa;NvA?{6%jL-!c;lq zRNeV#+(@EB(DHv`_8WDCoq4gS{(>1zs>UFH$=h?w^iCW|Xr588w2`X7+0U(8nuOUz zZVQ5!b4Is)+LrwT&1;xeb4KElhV4T0@Y%}awSwVdnOt(Nlr;u=c!$-#?A8;$pT*V|^g@pmZ zdi7h41+g>XuPiw6Ae;=~C|%7uujQ55{8Y1M+^ShClN~bi!{=u`mL^~Cj$d$fS_Mu= zPYPc&B#<8S>|6FELdz@&i=+$|z2Fpxtaw}W{`_tsupn@pd-bEVU zfu~Fsh^RVw$Cvr}I3A=cG`S}t85UJQr27+m&nYv6)&N2&3L4Ml6?Wjygb{q^^!s&t zp~>9I9cDQ7)_y$2dD*u*WB6dVjm_DRcr*l^1`RZUSHAkQjaU-aP843;?CQahDF93A{eUoQh<4Xu{syL^cqp+~mG6&93l8c9QC z{h|(te6nbt<_m*h3)_dWR9O-{zTx>I7X$O#W&;iSILBsQw^pW!S^Fqfj)j_ae=C%} zi(;kp^INq2btw{hbeG1p6xI<*P4U}9a8Rcn+tC%I({{%d{uW66DVWc(#$Mgyt)}??4N|+!+p-1tPzz~wPv}c};UPr_>Q+Z7rK5Fckens-m z=4I#KMY{-{D4E^OS^*-2{?h85IPeWEKFK{W*ekW&bC9dtm=Q;hV5{}5n@+Fh{uBk}kbe0noZNq~0S zkb>Z=@Z(kGN9564>5#=7}ir zKVwqEh#VTg24ozN8S-SaXB?z`R@O4QHLhrf>ic_~gf-QT2OyC}I&wTPbAY;TbLZ+B z8m~VCW7Kl8hs`0?mU8uw4AIzUAGj%5zUx?sEPm0*+Q|@8$eie7;%8ZE>NKQ=0=6i^ zkz4a=@%}U=`a2+Y7AFt>tK-@l$&S}q00^2B>oQ#N# z37pCNr%%lE22B!qJe!~{&&9_G8g%CG$X)4<)oShOAbi}*1;qA2lGif26xC$cHd z8<^3MvIRPvh`F=I85d$nq+?0^Q9+XiPr(@ZVw0uMn3+DBEC_t%t$Deltff);#pUxv z@MD{^E7~Zy`usiLz;}lbo0&||N(w-xOT8K)8Xi?J1O$6^gm7emU2tG?WTl)ify0-> zEH4R)7iW0X+cY^G`|hgKJ%y5|<5`OZh7@m5X!pY?MPkGn36i&(cJqbiH!v1l26h&~ z6&_HF!5|jK<#5|61CGvUGkwRbmtrh(>?gOK_T(s zRAO49iACS!uVo8@69*u8as@JH@k*GrR_BxhebC8bjHN728;<=O#_&MoH3W!zg~t%LYN!1>n^Iez6Tk zQT#b)i4w#1i5eq`&d|tHjSW{eSsuF(i?CSLsg$ryRhd(&E{7XY9Y$q}11~9(2Ne?_7aQOhok2~#0`vMPb9E5U1EVVjZ;yWqn&^-+dXRn%uhj_AZqV3)SAOL3Ke4{=+=DFjaGHzA zz90DuChHz?E82YmeEk*sW`q+2E;z{lO0g5PyC?90a%+s!mWMD5r3E7}RC#Bp9v0W2 z_G;eDkw>yGwb(r0`lbU{LbvnUe6h`B9 z%}CNZ%2vJ*gpgacM9!RJWmQl1kg8EMjB_g8SA=24NZNrznw2TE4sXF({3I1}DU;6;8@W~aKF-lt~QAqyh(T8%glA!M|}iIGj@Dwf+!Pxx

IAxB$JyrW1b!k~2 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

#hL@=AY_i!7Q*=++ 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 literal 0 HcmV?d00001 diff --git a/group20/1107837739/1107837739Learning/lib/hamcrest-core-1.3.jar b/group20/1107837739/1107837739Learning/lib/hamcrest-core-1.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..9d5fe16e3dd37ebe79a36f61f5d0e1a69a653a8a GIT binary patch literal 45024 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 UgpPtD2z>DYYp}SJr5?)v0beu;=l}o! literal 0 HcmV?d00001 diff --git a/group20/1107837739/1107837739Learning/lib/junit-4.12.jar b/group20/1107837739/1107837739Learning/lib/junit-4.12.jar new file mode 100644 index 0000000000000000000000000000000000000000..3a7fc266c3e32283a2b21fe12166ebdcc33a1da1 GIT binary patch literal 314932 zcmbrl1yH5St~QJ_I1KJGxVyW%ySuwPgF6f`xVyVExVyVMgS*?$+0syT2h2od8eo>e^ zS(`cj10DRI=D zw7=!HvN1HW`~%lt*NFHhE-O7p1Ji$AB*LEAtHgTM0rRjywa{QHhN>sgu^>N(o{aixEq?a!Jpv;NSywca09 z_g4n2KTYu;hW~>OG5?GXHsl z|1_hOp6ee>{;!O9|9w_RQzILDvww6rtC?_~C$MSKGIH8PTGeE8MJh+%*L0O%jzzxy=-OFah% z`HwI}ZSd$CSTAS-~5WeN2HQ^G~O{Lof z_(N{57ThV(X6GoUD{hbHyQeo`Q&(|kbtms;z@$g9X8N_N8S%||y=BU*Sv&Qf_~&s2 zlQQ+IRP$N>>vX#Kcx9ymeCR?xL<_SpRqGH|qY>gP4So}%`s?OgpS+29<;P`A!KbJ1 zQpONlIcu>)ExO0?DyN<~ZifuDx8T9gJ7V-+c#bAwcdYlDWhLQFj>1c>*W`LtktsCd z<5XKUOkU6LA-o};=Xi<%YaL5`3+LG)-3}fRUN^Szn;ZoF_)*CTciT?I8D=0}YEq z`h+zo7Wnf$Z}mb$5hc19Y+fEOW)y%_YAiDmzLhUd9g$VGtOz`5;Iu3$*P)ld`E$C%FfvP`}Mv%hua-bwC864=N=W9MNpmG-Q(|`0{%7_oB8H6 zp5f;0x|NMVi{m4K${XhDX;e{`nx5eCMQjFDyN5e52Mej^NI1A#NTKLi7^o|kQQeX z7S*b!kIgPolF!M>%M4kHV>r$i)v~dtO60qNJq&&EX4Wx*Dk9FS4P@8ItLupw+vYH_wN&*LB6++a*G8YSk&7!d$Z6}1Lf^xn zJXF=b&PjtATPCXEoS55cb<|KlH!Z8z&)0`E9xKXZr^W zLzi|W&_4n=;j*8CWGbzT9hE_2Ovs~xHn@hG3Co;RuRm7fI@am>2*Q#+ID9S~_UFo? zEQ%QVY)ab8X9vav9N})?A&_}$D4B57;PL?mx5t^20R7T(JGi{v$;cr?zG^;g2O+9s zB>vmzyy=~4%HSfG!?^_!<+5mB7Rx=8AF56+E)KQUjF`-bOK9vAl;mDp85ub1%RO2B z7=kA3*ei*sD`!BgswMOJVQ_foK!PPs)m=(am`hGt(J*ow6VOVo&7t-m)vbML}G(;8csPhN(W; z9CRV^W$)3L(i1W@>AUp8$75V^48kNWf%Dm!}e+R4SU2< z8Y3-!cMT^LDGh!7QXExE^Fy=4`yLPia>E`ACRUzcUhn6CN6wupdoH<30)D3@wBo-6ipZ4K=SoqJip>q7*_sw1e1Zg|LGdi03O{?Tsh+9tk^>+l! z7~-tfFh*b_lMkJbnQI{#_bP;2yS$^%QU^EkkM2$vITz|Tp7s_O`R=zG9!%*I(k0^% z=WT2#kQWeyXKH=Fjb9hC1R4z-N~BgpuMK$_F@Eos5s0s*VoJuL_t@Tzf~5Fnik}4l z-CYV~3))Hz;Gs(jV29Rys=ZldX;*6{S*Tz}|1JnH{k7CNNZ}K(E^Q%vrDJ|Si7mY? zBUjV5h+(`KYmT`|q-nYWW%Oc*Vbri_pfPjd$fN1DmB|=r0F`B;KuW`o z_gew70_)5!Dr+u|fBRutu0v=YPMp}h<6=BiNCWQld*d7Sm}b1zP!Yd0rYG4EDrl3Tmq$H+f=c0r|qKsRzyj=oWDe7AV@ycga zOCTfAXLfPM4%$9&i0W0zb!NK)>$oBf@?#W?UE&krM(E)^?_|xhNgQ)}TjREVopNN}0U=pd16F}b!z+oI!4L2DTPtagUlcgoPpRX0^D0SQ2D?XX0=s=Sr{Oq@m2_mdXLfnVoYI6q}er{VC+u@UYr`5(}t#e4=Q#!!2)4{+N83c38u)3 zs5c**GJu(}GJ7u}u&(y=I-3C=hr|sCErT57u==HKYJJTra| zw~kEneVU;~M7=2+M4AOXrc3r)(h$;Om}AoQTer@8+Rt&wL2v^E20_N*FOccPYQ0t2 z@$$jZehK8Oi1*i|m@RUJZN)h*)ak_%!;Tc zaMoWRO^(=haJF!ItdSi7E8+8om6yP#*@(`tI71FrRVgsGUDs^81a!)(7V; z3-F(66c##z`<+sj-c>1jGzp%rd{EeZ){Fw73tsM#Kh?{=yE`nFB2Xe9O;MUOJUQ#+OVku;Ed{4TNJWdr$By6n60!(uPAE*!Gby8uOx9Kq8c znsY(vATsz}CRpY&qV*&J%Pvs${*N4ojEtw|?4SsWT%d9!KNqsXyw;o>R?c%%H@UXC z*+bX@4=N4{J*(e-?CM#r$*~{79b_#H-G0GZiVlZ0&CS*TwF4Sqa)6g4;_| zs9NC}?$7nwWQsCZOKv+19#uyhoM!^&V;(!7@9;DLgSP&R?mw8Lfx>X2TqH z9QJ|&wUaV`reBSO?fBbFOUChoQ29j~lMxcYF5CU5@vJ_vn25fE2*dBEgN?xE-zBU( z`G!z;eF1lxIdx<&&~Ly<9{Q_rh3F$C>;fyhWH4`cr!P!l$J0-nceE6*koce3m%k2M zPsa1zoR>~@RQfK7k1|(BUhpC8Gj<0HCe4s`WBF@O?K-Oa+Vl`O{-j_%&guKY#%ePp z=OT|NCi2Y@8XGIvok;JC)z>%zF!Qg`A$%-@Xryw)yPC(Ec`Cj#&C8ehThMHX^n&X| zQMu~SF=l#{o$yPLaS|x~FrPfXfW)U-rJUlMhzAVS(@RQsid;6TGK@{I7aG5?%ctpx zEQpQmzDHk9zv_A=$@%!bH+|iRaAJhisVe{J(9Pe0*g6c6YMP038pkn6;{1(6rrEW5 zP0R^*{Cp_KmCY%^l}(OXTl>7%3u&T$AZ)yTR&9F^d@oUL>-LL#!O3y(l^W+l2HEw~ z<+le`FZhoBv`X9739i|ftfc9< zv?ZBw9|I{aPk`Ewoz*R;k4Q_4%{_)nIxvdzFIhAV2Nm;MLwXT$Zwk>*uHxt-ueXM2_B^5G5SvE&3m=!ay(`y=L)dw_yZ3bq;|^e4Wi>T!;8T4ZFGEF8S#B6E>OP(6 z5WzxmnZm#2!(C{pc6K1%_d{T|j~7C?p4DDJ6L4$H-mxv+VKsPVl)eI)yyWOIhGV%T z$6d%dt{MnMJ;yq(#_N}xrm0uUS){RV++oeD&Fb{GR9>uJzXSh{4E%zm{l*KG_dgH; zrw<4P`OnCJ@dwcRZ}@~u0+{auK9N%15z!|j2on-VwJ7~c0@*+4wybIub-8FzOOe>d z`<4>O(}_zoo=-dG3(RmGbPss_di@Bx2`K^@3<(^FpZ$(?M1G)gtQvLcv3pd*C?UWq zZGn55rgPdojuqVoHzkPq;%ECdXMjx zlVW}YlNB6oY+Zg;1qcN!Z44~_rKoRGAButw+NfKx)>>$opKzD!@^}Bat#&C7|2-!- zVZHEpQhIIt`>X7W91f)4b{Fnu^k)VO1ms>{F?yLRWB&DZ9c@4?y%B%^pkU;(7FCyO zKGICm@@WNryZ0;^+vR=r&*s?qdq&LYgH0r02ywy#0R%_ks!R7+?1!R60rDL5TQFTb z3+nx+qJ*J_tt)hwv}h))JR!BB#C$AFGaNBNxow(ul0~N3QZiD8+?}9Z$0?Msd&xDg zr8<7|s;iK=MBlY6pNew!bHoApJ#u>e(`(jnKaOw%m)6lLYK%dR6%o(2QjO z>EHl>B<6nQQnP;mN!dGuT(O5WQPn;6LFw%I>`|jI(MMI$z;=Kh7_75AV54qQL6w!U zVzjT@ztW9?BKHXJXNA82WH8SG0|0#f1OPzzHwqUtbI{YbG?K9vG}3o6`Ay%EN*WrN zN=RD4nqaYHfxdV-atq0M_^4s6X|)p>Z425S>0Ys@?=O$2UtKP}pm8^QSSz;Gp?e1Vbak!2 z&WjweR+dHYpmmYhQEs|pv3ye*k%9?-Z9?{sl6kJqyPIJ2tjNyNQ^Px%A8F_m%sxsO zZEN}BrQpWtuy*&tQD+YX%;8+EO)geQh}Qs;;}C0i4P+8qDJ@|I|03)Zyjch}U9EBy zpL1HFA*3`;s@Pb56|^VrWX<05R&fI|eyh8mUr3;w-nz}l&oD4cb)v?jVZ4@TREx*O zvq?vquD+&YD{&ik`cOtUi%mp3FLvmCN>pB4vDn<-Y{^FCFy>M$Zmk_!M=TMwx1d!( znU=N@V;bhrTQWC%59y@A4_y^Oti76P8sXXq@ZeGF`yaw{~E`r0M1=n1M0&q?u4!sbj7cmkEa}=hMv)neSA?DA9&9RmTzeWqHq! zw#7*Ay52H0@e-y6F!n=P1%>dj-NG=5l{X$%X&9q4f& z-~35XDru4qGRa^MQ6)(pA=Y%a2vPQD=&6B8Bx}-6Ciwl719wDVL%IkJz_(^$W2g<& zEzB3^j6qb>W2y;4E(O4q#={)}(>teVR!Fj#H{fMpL3%hdLHZ@&o8XJ8xpiImI%sa@ z>83Sd{HdI8yq}A+bb-talh74xDwj_DjcZk=!O`GJ4PoICZ=`2Jpg4ouEz^d%yYR#U z?rZxGNzfoiH{M@4>NchgfaEG-pK&~%V%EOXg+o$j&l525-J0mtWC;VEUreaQwD{c@ zK`lGVWr&@@Xi-lk_U#o=6T2WI%C(#{I);FaZ}`c>d=stp;bTROYt1e)GdZA9aLZ^+JI(1H$q)attefYqrBS@oISyn5f0Sed8P?JF()??`Ir&uGBgY~Mqeh{(^$u( z7(w1uup-l4G<`;BwrI^AQ%DDiB5AH1O1_v!Ef6phs;v-Lg))##hUO&$jIvKf+0_W(dneawS3oe^=uF?L zGmXUxwC=_FQIxYm#dp~hU4Om92F)Ndt%+zi`=bsxFakn4lwmck?3y0UMh=g_vy7pe z9oIndqqQbZrJGZ=k-9Brn4QUamY;;^gDty{j`Y}TEdbB_xJ;6<^-{LjIBGV~om#8@ z%7&0LLRUE1#~5vMExe}=WF9?+G?55G4R0;c=+_(llsK}&QaYktO~B!vov%Sp)yDP1 zWmG-vJi=NvEuf`=!Hnu-w)K*YP2BUxJpKBheL!s}Zqb9>?TQDPNZ>58vlqRKg{sWh zbPQ}<9e)WXI}T|TNgu()>?4?b`I}&(_)$|;`K_i;NcUST$yZ)e_=qL%YlKydWsIQe zewEv$0wC1~0jMuR(bh>l!FB5Y_nl zt`&91aMNWV>&)U|(8+xzXoiC3qjcme>am7IPf2NV_$})80@~bsGuZ7^0_VdZbD7YW zG{`6Y6kwwZKn)wR4GrK@FN$rH@R&rtL6EX$kSjYgD^?M(XcDA@ZX}$QKx4J>fGDto z0e(tqtRG`j3Cbq8vi>6D5sa?nzJ;mLR}lz?lEl*oqWm+Am%fw>VfTv37>h>Umqg2g z8JdEldcS1n$1Euqi_niksFkbiI?Y2XbqWpN_xd|U6FE>{+{yY;UtS`6&C<<)79^7+ zgB2>3ogY_zC$rW4g-)y^-b7V%Ik|K6OkJ>MFvN~swOTxmtz$&UR*yu$;l$j%BE;*x z8pJJ=R@;o@Nvz=`Kw2UT<6yq4b1tb(ksQSCc1yhjDHNMgos-8zgPpOV1ZOD^AeqYN z#c%_?CaTO;`r8gw&|EN3WVV;_UP>-w4l*F)OjVSV1S3W+Dx2O7q2pGoPhL`E2I|WV zkZdt-}s!{RQBJ?lO&K??1wAVzej06C`uL9A2-UwQ_)&GE2`WX)i!m~ zh>-A*3`q*Zec>H;iy$NUP6EMga>;ziWRjZq$vhl3iv}!_!ZfI?qSw^1xL@3?DzicN$vJIGHJB z;Pj%c8J?YW`S;FBT13^Eht91o%v*lM0m$?+)FaCIGw}D_6t_{+7CX=#)96EXcKsF+ zpMgjEX-8~0{g&W!gOrF`Swmr8xjMZF48({Vj9cT7QTc237|fVEiFny75yfN6rxWuZkil1N&OIm5ctD@G+@FBv<}`&o0FQCicIrI)x%Y}t{jt${`B zJY{aUnk=y)fH@Fl8NGedmke>ZZj@FaIh$D^=td)H3z#PW7ckAlg(@_j;ezkH{aJh5 zA>&$8+2?&h2M37NH`9nVAQgT0QlGJ06k8%Lzdu9?xdK68wQGzWRrxYUh=uK4(p(N;!tv$B!r5@?s{MNtEVf(@~)ImY(X zE`%kF?t8<_XR;T(zy(Ib1!$F}^*jTm@1@xmPYu=95h>$8^UR7FFk&UPq_4`%QrDY; zRJ|Wcf*#xoa~K_EQX5jr%c;p-)>Z48VpE-mgPi7UrQG09chm4&L|HVY0s>;J#=YA>>QgosC1548CPQHw)$b=qX-RE4!9W-cT@S@;8M$(P ztC_=YF4z(cF+jh&`k8i+a(9)y^-=C4;x>s?%5)jAyVAa@cE6%xS?QA{9n*d5f7hcx zBt=)9k$fv)bYw&+o>7jj43* zm#>U|LiU_?jFF0wF(`A||H2-~bQ-n{@7ojS+ZkgkwS)mHyn}rEgP}=%Nsgkvtd$~a zht3??h%8jSv2>WJ(Y&JcpgX>aewe~@@wYJh`^fGzEtd@*7tE z+a>@*xo$Fa;Tkky{BW9)lQ8I7SNw1S$g&V)1vO9L9s8X~O7D;#&{N}QvrxC1d7N?x zB<9AOR+-sQT(41wTc}BH>!a{=tx;wSEHIt0@Mn>N69|r(T*982JrGV( zvZ^p!u3X;GTSSR`vpbo8eiKhKw*&E;ithKXXJt}hsa59=g~`qJwMp$AhKny{w~3=T#FC$H7xup4YDxIxaM|hkdkry{QIs5! z>`8AwfE=i39!O83fq$8+^^glDV*D|)vgoIlD`sFNwS??`_n^Fx5<7j%NusKsysH6s zC8(0S3LK93Bgu7j*nopi|295MtbTb3&@aisny#4GA80)eHwuXz_S!%GK&2jrtytAZ z`6iQVGVdE3&cVuzrU^Zs+GIoa>l6>mFkKIcEfNG)4=VoBcILLq6Je&GExBOQt{7V? znPqOd>E)rYNSYS0gKGBnfS<{>;hkFrFhd3 zq-&m#(_ry+c2Yhu+yNYdUYXNae_>Eq<{tn@^Za_!4eUs5nM<+I7MMZc)69j{@NK1k zeL^C0-s&I(SaNdN?WD&6=^|%>4{q}Kb9Bsx8vW0_S)KevD+KKw{7Msk6%PAn#_U^@ z8|Db2*YYJ|5)Nm(tEHB>gCgV9N{yGwpBf>^2Mrg3NN45>;*Rr=&h$!wHoy-~hm-gh zJWUCk*9Ed^p^v*V- za7>FlSPHye&Sg>=y~9GGS_Q)!2ak=+t#x@&=tAff3jN$FbOyrC2WB|q4LHYRys*fe zyCH;y_3diUR;2n5fxN^w)g>sGcM*}?)poc-&%U|}+yQTobcy^N$4)_}5e~5W0`u%C zrWspa)6I3##}2F8Q>cVDsePtNK!wjBOTw_JV8o#JBw7D$ONEv)$80?=RZAuTr=Oxj znEZ`yyLv;!@6lZ0%4yEZ@$$~irvr+?v2AQ3_R>8c{I#$RZ_3b4h+#LfAi%;#tcm&Y z9pMAk5WCyI+q)rfP(kAGl#>5g-c+ktRpa1KoOrh%p)NM*E;fsa%Vzub5>po&Qbl9= zRi;mi*z!IC2f$crgD}=RKM!gqt1xf6?~_o@4dA@jca?S8jx~!L%R^-oaRA){U=O*9 zt+2xH=5;=wtNiQ_mU897*G}~e6KLhRpz1q-XoxE`7LT?qW8}E9rNqIMxFL4mxu4>g zPGxmtSNkb5J-h}|x|t~yQ>k~61!tQXdWRWyg#f$N_`>ShtNt3$?{k3I)XNZz*6aqE zVCX-2DK+mJ0Rl(6F`>|o^>j%!PN*d_+sD1N;HM}A0o95>u5(Yd@c{SxyVb8?N(+j< z6a@qTpaS||g6T&$ppBCwA^&f!g#QYr-#4TY`H=cM%o?>Cv;gIx!a|g0ospFV+onwQ z;{~U`R>upTH5g4>t2xJ=R&alZFO5ku-41lui=fFu)qX9(_SKyUDMu%ZN}5pB9r3u9GJ6ea8! zTAgfh7uvvR;h^-=IWkzOa9_?a2WuAFW(`7%PKA%kyv2(BP5Z<>mD7+G_lX-$B4ftd zL47dMze=xBpS=s#Ai8mH$k0)mY>@Y^8I!5h=QR zNF&2Do3)OYB(Q@XdHojiwLX)=@}vHl^1S9QHFXG{HHf2SSVAlaJrfAr+&iM^$69u6 zq(Uo&tOFmKgf<|Dh;AsA#F}F;)aw+HjMj(NvkNGi-NF}bBuWguQ=^)(!*Wuu9==c< z!0=v<+ZH+OKfQeP8b&%lDUZAmQy6SB=@KKzpU0OQFerHU9psjsF^1@;)bt6$sp0HF zS);D9JsiZyqQJB}j1^q5ioAxU8T|74H zpuLw&sPn&KjO#X#7<1W`%#ge>^NtQ`X@{Oqp9K^ZFj1M`$z;TAofAIcBQ&2iX!Em= zPt{Md1YIX#ZW30{9PA$OlAzkkg(l9zV4TNzi#HbC7hYN5cFKMQp&n}ZDt4Is=3d7E zzVjD@#^;zJp7=0m^p6bjuT9dwTGHj6tba8HI{aqIeTpm6h;m3;h3WKd&_WVI)Q|*4 zMorM9Ir4&XjC9ON0QmilW^B{=J$2)tU2yo9P@eI=ymN znLmuz_m|jN3^F`G7s#KLhlXIwX-Qo|gR-ei*gWwU2OV70T!lPZYr;syFX zsv`pTAAZN9Uw@MllD8zj^)SXvP@6Un^H5*34Cj;HPcC&*fdM_HmA#UjORyUTr>lhK z11PU0we2t}HH)Z2aO&n~AJwHV0$4h?q#KN7U!9;G6)y2tpd<$5d*=>y8T)Kh^sYVMIAh*Tn~M%p?HLN^}a0$8jR2SY zEiv`D8w%w>&Dh=8ob>i{Kj%EaP-z6FxFX=fQ1vWn#~2$Hy>jOT0T+``!L|wGrqty0 z1*RmHIZv1Y8+=Rg%mm(=HTl`{5sHx%>Y-jy+JVx7DU3GA4cK9r2<*Z4@Or9fYXVR` z5;yR&=-gk}%N@y{266QDI6ZG)OW&RnJ%5OrvC!u!^`;Rv;DphJKp{!xo1)r@Egu@r zkXvMpj3x^bTu;g*AJaQ14|#@sqn^6>!%_HEzmPUEac}rI3RfS#{qNxP{~#bAcMkpy zfy66n$b7i=w;&YtVFDK#glf^g=>%$2K!h-Skk1BF;GeiP=JbLB}fh;qi^yC>A>L*2QHS_B0EElIhmRJkvmi=_+*tcG*2AV15h`REu-Bzwc4`AbnVT%gPtM@Apqb`{av%Z z#D>auLd+a#Df+(Nqk)=bD9VLwZ_VliCm@87JSJE^>+LYa5s2>xqAQwrukKWgD>a&_ zDDhA{j_k6l@z2wB`Lzbt%3SxnJF{KPt1T+Z774;@4#*PPn6z6;g_b|s_fFF0D1y*| zYm*oz!?}T7CXKQ%xxk(-7dxRwG0~=1CB~?9wefs7s(`!}c$um~fSz;hZb5?HpP4|x zFxe1H<2^j?NPH&_iPdu-nSV$gX_=|SFDXey3a`TDp;o;BHKzi;VoSM*|IndHj4vUT zw((3g*im6xX`p(n9-=I)JPp<8<&BjQC)r3Ab!j{U`TBhfUcLd`M!o5oj@LbL^|P6x z1pSghh~ya>Rq~~QAiWL(7j*skrRB~dfI`#6%%?|h&Q83;FK47g5Z2C1%?p_!wt#)3 z2DFG7FWYyV7vzh5nZ{rf_B%bWBvV(g|)z z)RWQ(Uuefx(DykpkMfFR`mpS=LOA#J?6FXqAT@0+$VVx~M%kW3^^=y8%5*-nn|E8gDS^UuO7}1uY1OKo34NbLGtkQ# zRG>69h0im?BDs%vK^+YSBk7G=T9kGHHmt`ES-}j+VaDnDi(}w{w>(7_MEmYwh?wM)V5G3{@>~h8N z?ibRAJvXyGI{+M};1_ljot!8@Af_Nq2b$n8(>CnbL1XXYJyqMv17XK}p7e}|!I>Ky zNz4g)QPBfOv0G(a{#QQny_JDd5tM}NKS!Nah^_C5n12GfJK{^+w!{HtiMFr?P<9gZ z5e;X^Q7V)P{ZP@JT1OV2GWpJf63BF=^iGV(|gqA*l?J2dol(iL?Q0&ry&= z_ToRpK!!ZQaOeQ1Mt)ZBrOxww&h#H?(zz+$;`3#?gs1rac+(KJ{RsHG8T?9ZJF4*C zvOlgmTz=d*Ao&|J5c;_6V&G_GDCBBjWc%y7)o&?5yo#9%q7s^Sff&b-V}N`<(y=_V z6(SzhS%Y6aC?6DQu~M&9iexI;kYrl&r>33ubIh|5@Qy6-3AxQqIi91-+Bd*gba&SF z^U*QGSV=rv*kq3T_Ver3=kzzb{aG3S;mb%rR+NXrPM)9$A@4I4+OMzlVUUI=GSkvz zfN_}#5j8-_aMz*boxUTG$l6@prNEG|+u!^|F44j{D>flGhe`_{Zp^&7$~MtCDR$UE zCw4&5X~dgckGpCz9ByCc{n^@1FcOlTm{e#E3n=*3^io>5)Ml|nTnH)2%&aT2RvHx} z^tBs_BBV9$_>HUeF|7M5keoCnVz*d>nq}iAu|+f{iEgB6%%e?{bBw7C zYbvDZ32|7c;>PD;U@}v~`$)<;Lut~PCB0Pg84Fh!mNjFXTl!(9S1IwC897HZm8B`h z%^SJ~_=(R@pzR%`G$co$Qj%$o5Roua8yl7zjN%&T^AoMOMCe8(RGSO+TZF|jnXvpx zi6v)pe#SCF+y${)S>$(e9T)pw%e_D*9|+=bYiOWj-+}`b~c>Y%gJPm^MDPu5in{S0qgQfYBU%A zD2j7eMI{8yc?!u6ttt@3ruQkxOBpa!eh5Tkf@|%3aq59kLP>=Oea|1Q*z;RxR(w7U zNtCx5jHc)iuL3dKl$3Up1Ttpov+nBs5{ha;40wu6?fXo*tV&ZRW&Qn$ zm-Gu`wzJU4fHR&F$W)2BnibgS=rOd+v;CZ=hiU^|2yf`+zESi)kx#$Ya43~aomwE2 z#@3TNOK%w44%{*gSsGd>o%B_O{jiG;z-{-7kMD|w|N-hqAX;BpP zuVDIVUj(+mMy_lS8F1;aU18;gTx(TX~{3&o4t&{o?>7RHHwUyuEutaUybm z{F{acIo1`_mtkKd^B=b^IRV&K$V<%!TqHaNdym@X$BSYk^Fs0uK+KW@bE9eP9vS=k zy@XawbBVi@GjpOG8tM8}=M$e!OU>^v3rbfClt)8SdyD(TB&X8nD1^yOrD@ez8d~Dj z?V=j`4q^Jg((y&;D>{$cL0q4h4^1iy}3CgYvx@HO^VJ21z!C!4~(OA#U~JIQ^pG@IE%?d$SNew;Nvz2 zP?k;M>2I#1({XaO-MxlKB7`#o)dAP=Q0R}?pC7ml4e0@-w}~x@tEl)CT@Q@arCfv7 zwh^S55%Oj95AALkKc^Gq%ut0CRMq>MLaqSiXqeSwa|ospcMFb0B%%M@@51bTH^NHn1P`66_y3QAcQC0WLyzd}SGWtdW+(hU#-$Oc!)Ez2W+U_7M zYGxfRUwJog`)2A+qTVBX+o~P!2&v6}DimX`#bVfd^1?gjg5TS9-4NRH;K1*%lXkE4 zabY}Xud7i8*|uC{ebPn6DS^YoH%~$&HW371XVVk;0_Zit;l(RIj!!cRK_M|UKTEa{ zD0RPkVAqTa6-v0%1daX2?yX-@Zd|zk7Uv_$kNzl*^Z#F>9O3^H_Z0qpxAnIGn6EhY z@lK4!m8e_*?O%>pq!g1W|LiY0g3=wN%Wt{L+oJ2jvD*3V5IQ+oU!^@*X0s)f)NTv- zf$*sRy@?@1!$K-6h?shR{oLE3-C^A2Jl*a2`W6#FsVqtl+JRVd^w^Y7Bpl41IN{qu zj~5pbG!o2rkl1$f0if`DJkF|U^>)k^y^(t*w52g!9k)AaN`pB??^a@34BQsE3VWQh z;=y%uTnZB9XALV6>;dadi-#78&Y(_by-zRjuwhOZ>xS}pS`J>fO>>q-wkph=#>5uB zU)oxrwc5^z;+Cs<@BB0~6+4&b%~LZX2!u}h_p}|}3k+6S3=%~JtnjZK~ zIi8AUh_1xF`L=nWfyvZK%_n&gv(vixDgP`At~k@(_nQwZsG{{PMVTH{M+-LELa6~# z0A7UoPDQ!n8;HD!LS6(}_AV0+be)JZ$2Q6f!Ay=VBGf8}yk1=7wc zx)O#S;q#`<`J%$Kp zM_aHR^wABuk{oWu>dx)Gw+Q=B4-*c>Asdl%xoL|RBn(g?j9``ra_X}zfFx4~rS8nyu ztflf%V1JVq9khZ@lHb*@u3rq&WY;b!2a!uj@C%X^Qx{LHsK8I|t_n&nOAZ}QwRr>c z@vWT2?5o&2s^#gy&G9}U1o@O`gfq@oYjSSm^Stsb`Sx@W%>&pPOkzi9OVPF0pvf(b z7infjAxsy?%To~d08(rJ$QU+}H<9Mq6ekGbvS&{d_DBe3%i{}5DSX+?d$m68zq~v% z-My+Wq}zJpj`^fKQVq0bu~bl5X-j2=k)VKtrchw6>*~8_S*G5#pR<#+9(xQ9{;0{{$sRb2`o*GxpNKxC8F*s2-+74OK zj`1$pkBVD(tlgORw@68>T7edjXn|TAjgPx?d$yd+!#u}qseP^o=5l6E;eC$~dM@h> zl&qvzh#q8Ftn>5@2}4BVj_R1<9L&BK&ZI~aJY(T(++ze`oGD(Zuwh>AgCjlPGeN#y zi7G(IU8-{d$-qt&x|>~SEG{gsUGi=&xNmHh!43m3E`&Gwvs2?BHH}skeve)>?xsc2YolGg`sG+rm%|^^ie$9L1 z+bE-E=eHoa2(zXr2pAPxg&ra3+T7sL1I~%X7^~22C>SG3vm#wJ-J4OpSY8_o*RM3W zs#CH;Qau9SMhDfr=DrD0hbh5CSNDe()T{*6X46#KBs;CQ&0Zqtxe5CN+g3Ahh>7Kqzt2!{?oAZyYN{zPLy_H`wBG2+O#Z zg4R%KCs*Hv;$9l~36CJWiCclb-Q4#-)Zu@feebi=0G^M?;-HrEkE9} zZ2t4Iov)zv3t-|BKuw@7ot3A{!qcB~epIFK<_r-mVxj}|BHbDbKBPBmv^E(#p}sUR zn-<>j|7a;TYGwEgzcLBVlI&q(GR}3s&cMLq7Th%MRUP!;5a ziOI}t^#DB%5j`w^L6`vD_e#yP<=tzvVpBl={qz9ZEix-6H2kYedBrDrpixua=t4db z(xAsz)%sW1b5L=@VxJ3>bX^5A63JmWbYwdZ(Z!WZud-o{YL!H@_%=cXGpw6a2rAicJX&>*P|&)z8=_>2 zT-#y+OP9 zL(}I6NWQWgP3Bv}fuH=u8e>)Pb;Uk1-ltAzD*hrG8U&rgijNH^xEva7HLJQPQ5=aDC`JrzQj?HZ>AaC$#Q~ip5a?l0>Lk2bI3rt`pJTPA0KcgRyvQv=q)4ii)n?fRc}ofg761$BO!u?JO}QsAxxwGF50it)nwsjQTYL4 zX?;Z3zZ31>AlAP`lV6d>q=V;@W~S8YZp;6Q7ce3K^ciKMxI`QYL>}a`V2rCH3UCzj zkC?WRy~<^hJmn+so7|G9bi4{aH8ZY^%VY+Ifw$-L1zZ3QRXEvBzvw;yHp*wxN7YL? zW3fBQesPg2~~h*N=xX?qKzowY~@=a@ym)*b2H0X*Ao8eWX)IGR3US$ z<^ly_TSNwUX%j&6xPAPZR`B}CSMF*HQD_<1y{^zvc3Us?VVQ8Ma79Bi{xa~gZtF-F zal<4<3^!+C90~+GB&==Efjlf>?7W0|1aZhHqiKa7{*pk@y2dQCEx=JEDbKthVw`f#GH1*}zIwP4H{q#F8GB{kqR@jy&|o5)uZjVbqcl zf`A*YS^$*HQzAkbyFB|#^v3GZ67LnRB!0A)p^`t7kf+#-Be=nl`XU^asXRT^$ zk0Xlcx8!K`<`kXCN@XdGa}0L&T{62#AfL)sNUxWuIp1xrq)TrK=WT90+tpnzG8hz? zlzz z0Y_9#7#5}BlV|WP9deQ{Y6rgo8jiDG2f>ge>J3_j2k~4s|Bf*@7WHAzn8^pZzm&)a zz5kfV0@gr5Ib|qYRM}bgirIxeqva!vD5HVrN+ZKl|Nep4-9o(fBC2Xtj;LL^1(xA7 zN%o4oF-O;nc5t}(4mW7eD`UTyZJb=9Weo91ZA(9=-8AmZ77+6?2rld}JLTNaYNo-X zyS2F|C%4XgD!rXiZG8kd!Zf<{hxHN-Vg$%N1yse3tanh-hGsP!Vs!>{Ve7BYJ~f%F zvP=}&X?v|YwjGi=H+9MpI-|G*=lw9ov?CcqbR6%P^2|8~yE}vF3DclRZL8!K8)dPP z=9;rqC7w^NwPnd zQD(q3>T@0ML^c|zlbziEeMrGoYtYi_ahN0_l5V>fu8j&G4D*LGJ&ZLevW(#Akh-!z z!4aSur`)NMFfUiF!u-=lY%Ym2PPZ7LTyK%$|z9d*858Hxt`cF=Xi z+}w!Ns889 zS%6wBxF2$lT5q@*u|?%1O(`Bi-4Sa5RIyNXjMY<+<#4r<%Isv?aXAu=jl*nJPli11 z80@4a0u!K$DxjG0eKi??Po@${ePxid+aIn4%gZ*+tj(=cT7hqaiczyk6R7}~ZR4M^ zt2AyWz?Q8iVcswvnf{=ZVijTX)F!+=lCx|xp2LDzOEXnyYvzkiPz7Tuy;6k8wg?u1;5IIocNv-R|~eEDl$e9PeEzJssxwtyne|IiE&E&Xkz}8B|J{h86S^w%)TW)C%GIc5k#> zopL>BfyCiXhFtxp)WGJa$@)RE;>IbK_-@QRy8?P^jIzIE|XMY>s)<>4? zf;>zhz%c1auZuFn`G|_VU?1PWf#1?0J#aIB`07%Z`kI4>Pqh}Y0L}jL!9e$&dm{It zc{5>Xh_xU&_9Hy{2*dxQGP0#dz(weFP)}V3EQV9LW8VK-EQ$6I0e-l@@o0>~D|BrZ zh*x0mboTAo&mQt^zN1dO(lFL2AR=ir9nw3GLWV;3EQ5{dFPF@IPVhpZ7AZQL@nejEEuI7HnFPZZuy5;_MHw1v^4I z9)Xy`{*d9MHA@kUykOqlk%X15 zBzA#}>)7ShwX&WH`3)EVC__Wt(afcVfKD}mxJ^G<G&Kz*6R}xJ;0`Fg4tF0-_cXMPi6Ph<6(Wq z<&N&;=pA(DZxbWq``QA{xO2BNMmw?if7#O6wUyM1C7~Ia>BqqhhR%7q^R{Enke!0J zoQ6P>cA--dE7&mqG^1`yYr%Dpki~w;CH| z^Z^(W;2J}U&vRREuw_zGf^MR69$|9^*eltM2<=ErNT--1UAF8W_ztw*!AGydVAa8y z^J?BhAqw}-4FrC*D3hLgjHh3PioTa1Ii;b>zoHF!Ko-Dp-QfuC7AgaBw zag}Jwjcf92&Yry>TCXMVk8zm8j_0@&N5CqZ+My)a`tWF2GBLDIHmr>nEWRj!u|uDA zBVP!J;;%h$a5_^|XhqjI8v9r7SdvBPF&pN0XIY0Bpq;6%1lfvf6;q0Faa((A*lEz@ zQ=fRU(d>^NfN+>kY0PbTC0(5N_ZoYOwVq&#sENvrV0)RwFF1nfa&?%lM)KiZ_b%L` zo^x%DKtR){3NF+W(WA4g+MJ$*RvT%D26e^Y`4kU?lDt69GvZ*BAk_iAEhIpwFK zN~4!s(Xq-pk&o$BmiBG(egASW0}&X_=d)QwS`=xa>GjL4vVCwqSq@3|wPy=w#VoCO zqCZ5&p$mWofzllAv8hw45~$`?0qpkzo{%P=z#@I_Z?9dAaV*UJ?_tZ~6ie=iFqh4P z$=9C(k3dF0omJ7+taqnSXG?FvbJt)}!i*_RX5xAoXSZP0NstB}<6=1^izuW^Fprl8 zfvk|by~|{yE(B#&uJdaK7h|wvo-I6cePG&tz-rZD-aR1&e28u>F(OF4kftO45$r;{ z#nOqKx{9;+Ab1oS)kIO7f-6PjCmu8|d6gEbLH;uu|D!W8c`M@*Y#Bj>0C3+2{XFXz+;4QSSU(OZ|YhMv$ar&9iAeGW$Res z*>SfOg>V}Wsac{}Su|55_F}_eq<7qY);n=qk?( zpz^MR1Ctq06$I{4tRTdNQTjEhfhqP9Q->AW=SSP7%`i(=?8x7aa_IZ?V&RFH|QG1eJggcQQG7e`&@VhlLn*a(}sF#~Ol zJ2C`ht}{3A_=aY7B5e$iUS}mZ>JK*wtY>^dF&(BbBF>d-II`7Tfbt{QbxD{e2JE4R zBNaMbgEm9X#7Yg(=A!CDx=pu*-`H~G$+G5_=GMcMIC5%)SrYUx63WTIhPb0xrtglf zwxX>mO=yW`M(t91EU9ecJM|n?oMb_u(e1F6s=!Ls73J$^55pZf?hpMBVtV@SQBteM z*;UwPf~{d3RcO$_zTqH4#hMWp*%~`5eS%j)3JXWCHFZ5D=IGyD87UZ;ZB^Wx*QLoS z?^*z2<(_0S4gGsya-<294`s3`%xuy!)jBG^IvnqcldKqe49O3k+gmkVX3A%0C`>|| z$1evxqvU-0R{fI~$jVSr?9TbCoZPmBI;`$&FcW`BibG{2OzM@I?_NQIQ21YRxv))9 z!A2Z(@=9}}y;F*9oup6)XGrz~0)co`7=wtwBnM3=sM7|@0>yt(rHvQ|6he%uID{7} zVW!mQ?Lg%)ud*<|#(~L;EhBW*HAvN)Jm`IbdZDxrm$9nn*sRQ3pHG$au5w*pdFM^> zmKt_zaYY%NO10e9sP#22pu47;vbX1kUQOh{%BWTe$hNeZQZpi}d_O-)IoF=&I+X^s za;Y%N7!+yG_XadROt{WVOCC;=&puN|3!Q|>=sP8u$tf^IGCuyWu)-mJ1j$cbhx8A5 zSdG3aOv#nZgFz;GQkE|t+9#C@@CW%Wixkx?qaUNHq)!NUoktdo5rqQ3^N<&m^w5dD zp+O+thowa4Fm=3>e&2HkvjA`OYd$-lVPr7P8loEbnn;>}D1`s_nD%DaKF}gl?j`YF z&KV895{{|B2cV@I@J<2pw%+y5CJOaR;hUAJN50P{dZ~g-Fq65b=m8Or=$CJdGlo9v z;wP-0T@uM27_%lhatyM3y7zW+QsLo(f}h==!!*hs!zvXEQJ2K4LGn=Ad2BeT0Gf$} zy>)k4K@9aKgj@+L(@}Bb zXBIc@M!5zd{2~P<`#~Sgn=!I|{)b>ayDnYF4rQ5>pC&N19&;~{1M;DJT3t~6J8zA$ zgrF8eMEN0gnqfJ3dGG&%N&Z!Xv3#IJ{rUQTxnHsAzuiatqXzqDg&D1^YmfW|MuH?2 zpQ9sIuc)n87tGo2k7bq&r)njVp9IB`^T`=P&tFU>tgcr0i}?qI%c96WY<{7ULBRzn zgR)2GQ`yeb-Om@Xx%xdo7KY|X@az`{os@?2ec8xY9h7;yJ2^pburQ@OR*-1CIddPzk}aC*=zGOzF%_$`PY zZNSq5#5xGlWh_;C2QOU80D%%k%q0X=$2edALAKZsB(BF;luLOd%`jW)`wd!5cJphS zJIgN;R6(6FWupe=fWu{=kb7BT>(5HH+#sp<<3h!UoZXk{Dcy*kw^->Hog!X3ipf6+ zpnyEi!r+)$l|@Zk8OcQUokS<;q63{~t4i1zDY8~{Y-!3wSn4Kkp<|xvWP>+Y+7(V= z`tRZ&^DFgI&hfYb2yIf099!xN1I$%1c6oAo=toTNm`^o-&_XzxLv~o4jw$^l#AVv_aVgaFfkx%!98 zo~UGjN(?dKXG*xP!RR?c1;vY)0g%Ja&TyFp4X{y`03+r*BX8ln-|C&UMy=inWt4Fr z+GwGctO^}(?IW)+0qU2hm+EOh8yFN;%#`xh?tvf4@t#$iDBk#38oM0`-+i$>z4#^3 zS@nS+HEP+8S{U{%c*q}Sc^uQ{=rE~|wf2zz0sUE?>kRj>%5;oKj(gPQ(z#BoaAYNme@7KPv)ucT)=diE=oA! z6z)*EWHfmS%rVfgkRsa>@ly}B-FiGRX~$~YIKNR?`#fMY23KOK;s~m{#uW#3>i>nZ zW(i}v<+u;;Q-ckw>F2cPYxbh_TV9z8$!dfmHfNrB15%%IzD>oH|DfkPTz@P?KWw00 zq2~m@-TL-LfW0Sfc3-+O!Se=zB+b0rmAT}6P5>>L;T_FS?CZED34%bUuj`5t=is{V`_Bdee`TI3%U=1 zGvDeSU%jB#JS!D5w*QF!#8OYPwr(p;vNLW=PukKVvZ#JZE z&z8Od_5n}j8iD-(ZiHRU)+du+QLFapRdS|n^|+EtO3cFn_D8!W*&eLZC`+)_u;m@C;!hzZmv_~5t>dEF70eT?yyGrzGKS;M zKIzaM?D6ULUIoS%p`a#VGrK*rajfS#`wlcW!7k3fLf$u#glldKhY*0*oktmsuP&)n z0pmmUsAQ$iJWB1XYC*uQ9UHGbn`|I}JI0BpE56^gly16>=1^A{f8^#yy;P7JO#MEPP1^DjVxX!y-z{6=}6ESc` zSSwxvHmd;W!9mMDcAH7 zQ1*@>=Pz`WpO!hN%|>nuW4$aVKl#M#C?}HSHmGocReJ>qS09o12waet`kJd5M*uG) zReC|Z7D@@78}V)vvWC7!Q4=z(juRPUF3ydAMLQN_vJ)0|gd{;R)=~YwQ1wu_7M9LS zgkxDO-E?O!L2=`RdP{%Dh`Og!ghMj6$#W=h*Dlya;)i#aP{gL4F*_!09~bX1O4No{ z&{VN=L^1@VgAUVHE@AE%2`s5V=v%7P@;xs3gkH*3lT$w;n?Uh~N~@G=bXC3hZZ6yS zV2kk6DQOVZSZzun7 zk|GFMCx5$Q%{QV0I+HJd4B7u*wt4-PlMXuZcQwB95#1N-ndtv7C;f9WzFBQr9Yr0r zCsu?!00|L?x_M5k9snvMu%JepQlO?aNI+Oty-4KQyJM2T!lJm*lz;)ZL2h4B1kXDOlAsY$bS!jDbfrSF=oB_Bqy?|pCRuwO1xh|f z21=gvX(_?%`4T$wh<4G_39LwT*3J3fQHGN^F{94NEAHU5!~a%t~gaPinJC_-|}oi?tcT^OeIWB&rWGG;FpV zTbK}9KlH1b46vS@tn7wH`47wbMJipgx`KM$Z273lO4$*np$~Pk)|#G;bZ;C5M9e2m z*KZ==<#gBa9xnw}3xlKqma3wMR$W&|o1qn=@GxF=2o}*R?rpJ?LirIrig;M_PesN! zYF7QOk(^+B_D6K6ice!&Vy{bXmzrL!r1t_(x7nwOtSk;)6vvFZOCBxkmW~Z#>iDWGpk)cp01rBI_%?9nqmK7e7p)nYE<=Xx zfkR#CMocp%B_{TX;ju)d9G}gm!(|sN?WHLd%4|cabUeySd2gCbTvejxu@q4EZyc6uA>t31O~cOO4WJ53Vs{G2RyvJAqaLDnh|m)WnP?*yUt;0v1;;@ngkb zu3fVhs-+_)rw?B|krNZ;RH0HB)?p)^Qu&iExkOn1CLlHsEhax>M^!T(LGd%ZHr<0Z z%+E>*_YZP~Pl)F9{^$7kA=7Zx)^g;<`hd6H{g(=^sFR+6>1MmAU*HFsX~m4hH!g(r zg4GPSb3)>T+R1mUk3wg~a1ZEsWOB3XE))DbV78FPZv;h~(y-(lly~RkVNHP^txc1m zJFR?P;?=Fjm*3@@9I6GFFIq7NCRpQrL}y*+%)vwb3ZKxmJWiFv6>tz&r4Y^^tmx6k zxlZ*!Ri!`NFzC`tx)L=1hk4vml6Yqh3yNsH+kGUeBauq6=aBTm*rL zAm0JKz9o2(_5qnE1q9)>f+q|De{i=itUv1Oz10J;_I3w0XZDqBW>E%8BhJ&p*}$X_ z6#7jI*!-M@djYnQ_yD^}zW0DCjdxw#%+N08! zkc=na3vpXjci$?^sTi7n+R(0sZ-w{bNJ2D`C7g)91KJ`K_!YmA05R}bP@s*1_3)+9gwWfVHsgy9#F#zc;L0nn496y9K9`t4+@Gbt0D@UA_@xFJ`Dd4 zf-w&}j*j{|!H3EA;|=er>vn&+x3}qO{cp?~39~UcwkE?SloF#7BqS4Uj41sw(9X(f zRE8zOZD{?rfIRJ)Y>kY34(rwR^6Z52PO4552a4t+ts&mYNi;J`TeZ>M(3Enw2I|Y< z8VcQaIm=}do0F9McAifI{*m!t^I)OV641NwAed$uyncxoV;)v>ep+d;!us<%;GUDz ztDGMS7<6;Hwb9{~iZf8EeVi_ku`TSCJ2h$P1H54BjI{=W!M^?HBfen58YY;W&Yv@- z3b~zAc&)cqlUrC?dwXTPaLy+V*v(PM@q@^0|gT{A8ft%hD<$+({TfC3#4i7d#`#sS+%bP)4ugkV7qgOT`D%Hwcaax}fJhDU$cG$xyB7jsmH?{u&qw0CUOdaz?1KiLTrdEI~aEUjWMu?

5)o)(reD%3op6|l0L=z1*7CrDUBE>D$^EnE8%S5J$4 z%qh^QRTc-$dDrR$=O9SGo7FWg(WiIcOj8>flGTO7rLb8d4*>%N84f7 z&O@^O`4>dyFDMTmByPa;3y}%=@|yoffcmSsmitns`MZPo#!t!tGogmar|;V1iXb5Y zMOT5!WVH>aVMf!Kfb_WrfJ*_e=BfBn$v;TxeZEFfJj{DB(N;IS*ZsPWH=f@2AK`kT zp6CYajq}4cS!I$EC@B;T8F~58VB431w;e|gw|<>kkaa625;;=ymQQ0wX?2UAgz%HH zt|#PJOqclPcXVBgrM?5Xd+Urkbg!^JYJkHQr__o~nTSQ>vN? z9_xuOr|a-xLKyBu0H-ezC-*trYwyYkxO?ry&L=6 zFaajJ@2=*?739}0#$)GwI1umYI=@}6o`aYR2W~_fNdG7z%|=}5B`oOnqd5Ovv`p^z zvC=Drw1zd8Za>pr@e&Fj&ELJnoQQglT?27#4&H%=g_fLq#*AmswUeFfqAeLUlKY&3 zGp?vIzXA?fvQGU5et@g#z4OB-Ei)Jztiba%6cz^jBuWHRrxSaCoM8AJ&o1G0yL zxtJnvZT~=!ZP_Wm8W`$EJGqY4v{dyBnC`@Xh*rNl<>cp(oF?E~iPoB7tR>_eK2&}- z8X1%NJ3{RHtZtXLVyKjR`2F5&g2;JOwbh86_jz?WeN0?% z%})xZARtbApwGSp2MHfl;7Y0W(aBpt=-WkPB!t|NMa&@@_P2s6D5X{39D#IRY94uh-Jd>e$ZQ*>Nd0Q`D{5>fI4%hvA8Hq zmD>F>_5ERHl-5kN@-mkZ=3FrjlN~I$=y?B%%4xs7Z{LLf%`AoO zZNCHqEuHP{#0)KMT%Alw|M!=_efk?uS;W%J>x|I&Dw3!ZGWHN;Dk_E0+^e!58rWnwQ!*fP+}UqqpJ69vJEOj9Vu41 z(0VN&8Wv0Q_=`!nbexh07a)1GBmz|Z9uv##23lOkw>edSa z0cEiCgqY8AU7;3Nx}~|)C&KfC=%#t)Hq?d7Ri#YVEZ<4^20ABge_jA2*?FFGD(6QE zw)PQNQZVl(1j0oi@WLSjv7Bc_(^9??#@<3-DPb%!#8vf0_bQ}juX9aaeku?iVvC|| ztJwp$t7r>Z2e!86cI+rRc21aDTAvj}a(7T4;*C=PzqBz08_OP~&SI=2Kg%ry{?%5epLnCfKk!Cf2Rvtm zwyXXH7u#$GGjfEl&=I}|i!v8-w+}wEIv^)@Hkd*qx^yMVJZvUH%4aYzdj-zVRAlyw z8n;MdOWAnvI6cT8U6!EIhtK=^H!ytj7}6Vwcpm&nWC!jo^$5sV*0Wbz6|>rRnKSPf z&)t1>R{h+ev6%|yz^)q_YV~2OHA)gzhRy^nh^`{`u7Z-EdW74`$zP9Lm&4BRud#7; z>N^|n&1z;Xi8;Blm@Aw)U+Io(^b@zv4t&3X_6|+fHHfS-)Dup{Bp6~|R4_PK3*67%JvV!NqoA8xNs10ARb!a!t1l2NF{(WbP$wsj-op#C5uNiRkqs>rQvTwy|9$ix?K%XYP6Kjq4~b#c~KGW&pT zdH={VMA)eKTv$?@H3T-;m)DEyhFz~#*@KU{R;pe#qQouQEw(d9_GNwXHCqy{(lan; zfXGTC{O0r1qt10WlS1=Td%UkQV3efEVQ!)+`uhI#@*>bFu0Z~&%G>i*1C zLNlx)!_v?_3pZ%^7Aph7aQgc=V6m(`!>z#1%CM$zI)iq36Aq4l>}HqRRu9%KtT!8E zvJ>scfH-)4kGUOLp3tpPAn#7r%I8<=YeNHjh1Zxjh$1dcn{PT zVa-}95(+j-6O3M;-p*$P_45XbFxUFGwW97Ib_YSmfm>p$g?vbR3gU>L(f) zMjwT;NgU`DM#)QBfDa$Wj+DAG@rS92Kh8%WgvvjfMU}FZI^Bs6dwG=jSMrXD(nc7| zQ6cm_iL3H{*7;z&BmFUg2Usn5)?#m`On$5iffd0#(vmIGaks({7FQyeCX=q45M&8G zGIAyzx?d3b0MlH<)gIJb!%Z9M#0)GC@!p8bD-S7aBu_TdLB$W^Zi`cui$_D7bR#mV z+ms{)cv4&?Z^)+&C8oHzTQb^gLYDkK5;%w?cS<&$XO>X2!y;^Qbs<^WB65mFSflZ# z<4Vt6G_>svrtct-y$UH5CY7bt~b&6$k$mm=(0K`Kz<|$9^bRMOk@ZCPd$m zkYqFwK2RdPF3h39XmiMLA}=9h;9b4EfW0-c%^Cv!@x*Y5zjFO|uz1RPSuXpnuAb8( zf?WISZ&Ql*af3OL5s}ow9c0O@wtzcF_hEuI0tdERZlKtLqtPFIr@_X3ao190c6)F6 zGroMVVN`AdNC@CM(wY8=G3jGryLmWg;rx-KtIPFDLgF8yh!3JB1?0kKQ)?`!>|D$$ ze(QYG>Pv?|_tXkyy{_*pNsq(;)K2x&ai^o}-Ia7}_d^KYyBN{)%UXj2 z;S8+MG}ed~7DZHZ38T{-66-u09*Se9wc#|{*Sb_v={JQ z!N71cCb6VvW(?Y>6qiiJ&oPRx?Kt1~$2_jjTAwjnqV! zM57DWGZckEz(&V#93yPNwP&>t#EC0j8}u8%E$a3vJO;zkCmyoSaQI*&D?cYq4?r#V zA8Z$)ZAXR~ZYz5oO`$lsxe}Y^kv#9EG$i5+8yZevS*71&X8e@RRpTFy{<-JpF5qSU zZ~{@OL5a0$!ICs=MDCeou{JlR^Xr1i-D#M5*3W@F%Gq;sC4N@TAisC!qt+WB*W!Xr z?O$J0TB=jZGhnFJQPc{%>0AJcFvP+U9owXq(L*Nw(+Ip!QddE(=py0;cgX1Z<}Y8s zXRnqUW0zd+7mH9rlTs0k7%PjLCpSb{oBE|#t&uULOZW;EnQk10x8hzTZ{w|Kfx?I zeH7KG<(;&YCgS)02Zo#GEq*FzJTTx4jmxk365$ZzRFwJ3n@hx4h7+cbFv=@i=g4Z% zCE(Cs6!|HKA}_tD>Rl2k@* zH>c(R)5@vcCale|w{jr{?)NVuy?+JAso!?k*IyTR=q%s9(f`-)3Q|iDy)sNNGsCd0chL|qvA0Aj zYnAEJEVL6z*s#X=uoaAr)+p}fyyfk5*cO=Q#u9BS+g3S|vgN3>BLnc2ao+-xXe z9q<0ZrA>4MqED*J;-^n=VB$}`>5stG$%ssDlPM{Q@E#}A=^L*hxj0FhAsY~@+AUEN ziVdbQwdmy{uZzfB+^E_;^0HfUat;dS7^}mx-%E8xt~oaEhUInud1fDLgW@>en_M9@ zCb8Qs3GZW-Zc_!&Z;3SB6^fybScx#TZ?0^p8|FnFx$IcDVtrMgmi|R z@v}F`s~Nq93*}I8Ct1k|V-yn1L|5Q05bm}r8(%*!jW1})n?ApO0Bbj?oA{nCzoRoR3_enmVg zh8()rsKM=DWG(yshWOM`BbXatAacI!qj#h!&g>fIjvST#-Q`%IY$^?e2nLfB(aNk3 zp>GwVm9Bs9)K)&HG(;O5xGzrX#fn8;@R5%>U4B_7XR2PEjdhh7hMA?$8NLijFal&@|5U|oJ0seGD;45C{wfFW3ph{9@jjC9mlwf;PP-M$j1sMynV~(M&Pki|F9l-4LTsT`(jM%|SkZO&fH* zY_WAYUg)rIVKa_&-lXh_m(}o!VuW`Rh|+Uj&?Ck~#)@1}&I3%ukmJmINne^n$lq~! z26s!PcDuBIrZ* zh9#TnEfNWP1uJHOG?Yw#_hgWiA{noNpgpSYF^Arq+s{0D9Ofa63T~-nZ(}jQCd!jO z%JC$w0{GRUA-@90iX7;Z6P zq*Eo2Bwl5@Aj&=-Tcw{cjy;R;KH^>8ktawZpZ1q%`OLeaGO>&t!>$?o0rloZueh*Z zw`LA7l)|q$_-dnr>XrNkCK}n7WHfQmDgy0S`dhvy6QbcVOXEeBS(Ye7(MgsWLXjkKsQ&C277SsJ2<-j42$MUP zEG1@dUhn|)R?Of5Ra=<>CJD6IZC#-FO&M_M4p4+?_^|2?CcgR(YnI{;F2`}ZXH+Id zJ61k8KTxcaYKBg+ZTOsEkaR|WjbO8ou>cz1l2S;Z`%X6WR!DA9ms)-Z&94VELq)q< zl^Z*J`WR)F&BSDv*x+2H8_=%W-hqivBs+S>PaMpeK0+SMsMj}Y@b1t>=*O~Uj9Y?A zNbrS-U5i@%d)1dcw&uXx;b{qv+Q8>sbEFJr3a2b9H-uzlMR+*11Y|$CzUh4oiIz5c zQQy2Bj9Y0av4u)xu%1yXo^XBgKJGv?8{VyAG%s6;k*hbfuX`Gm8`K=N8(2OGkp%a^ zK>fbjxd4iJ?Lg`^1py>Fzh1?Gs@+;D5A>dF10WU~(zs<{Ql;K=j^Am`_HA~V>h~=5 z&d^=ojG?0jOu_W_j#TY>Mkb$knQc!ePEHT&dl1sEmeF1~{{%+mtUB?2p|Gc=H!S4$ zalrnt{=~bUUu0j6N9*gCRM8DH$=lg*vT@_qMT7KZ~f><<+_i$r{@;1$%)9AAi{^&RqXkN z9L^#r^gLwb9a73!V;ejR4>g+EC&`LUN&SE;BWnv}(&*q7X-aB-Aj=QekBzoTX@b(kHWahS%}KT*i|;qDB-f~n$;W9eoGiYvAU2Zv)y~>_^pUH}T? zQ$B{b>e`ewQfm^%CcX_hf|dCmHBUBBMceb1C0XqbH*pxjU*FVW6P7-=DHY3iw=qcp z7f>Q$zmrqm*8J+)84U-0^i#6MDwK`M$_-1@nOhfEhzMidZXw&qqLbZ0R(ku*)iA{z zqCubG2HcNJEYlaFpj>q1eP1W=lRvr@jTCMcQonn+d{)AAZ|)%teT079Eux~3yX?{R zMm68E_pls%BlU`F5q&A9lDM~dCMB1gW=QEr?i}4G>ufcM0ocLy+I-8SfV;7_w6n4L zF?}%3dJO3ocV=~77SN-_g;|nPthGM?XD|`|7wXSC z#!s6J;nCUTC!Zk{cKvx(e55w2!i~5qjFNK}hIuZKTkFOxjZymap|?q>04`%A)!XVG z%1flM<9aPBpVro<=H`p7wT0E$E*wM2SAq+p``-)Ra2`?X0?G#6rHwX^!6)`?W&>BqN9|=2tB9n-CGX_pJL$F~|b_wL&T59R&-DLM$h6?qP51xN{bR zm5x2l$`v;RnNNP68G*+^Js`Qc8E{m5qMSwcnS3K92d`9(M?5qLx871wAwkHhh1;4o|l_2{WZyf8wt_e@DN?K{d1kfG} z9WWbqA)|5g%+Yy|+pLFyHWT9(S>RV0eq18MnGGmf-Je3uK)RKM3atQ-oK&mmgO2Q? zd@FE=*pLjqF6a@G_dQ5l=*)a&_u4Z4_JZ0y8~;Nr?cLFaPxBlL z#1iywlP7M!94}}?+UQZSZ(Yuo=DPuep>^RiJhFRf@8ME;dK>jFi$iU%GSqXQd3Yem z*sk-9XTs>PIx~2T*=s*C+7fCI5BL;^KtuEoy0?PSMWV6|qxhbg10_g(WE~ryd1HmH z$nSMqYVElYIFk8Y;GUPw>IUWBuy-SQKgei`J~>nK%XBA*s3M=2V#r55X-@CIIkrW^ zF2m3WqCrx-tdR$*0+q}!|Gkmq*!Uwe@UISEc;I^?a3-HF>IL<37Gb5iRAhyn?xI#$urB5puN1w$=(?BmW(2NT_L_!&t1R2L3 zkUH+2ESu_Q_WjWkcbwc9?06`HDgFzmM^+cqY)ZQC{{wr$(CZQB#u$pmknwbr}$+Uq=ZYJWIYU0t1g?Eh8w zef5t~z72J<5|L57V9qtGv{Hz&A~amZgL-BM6KWQQKuoDkR|aZH(#1N`Su7qQ>F4f( zvb`F_vb1PO=v%QOhoFP7yTYSE;z(a4so*uejBcpaA=er>MpYCy>nQ#!SU|plUNK=G ztpp>;K#vK~nyAEp6qJZT?>51x1Ig(UO$~Ga_5Wjvwo^<+ox(+=$9FIMAhnVeBzHJYN=H zUHuL|S-`Ne!SnBo7B@S&jTAg6&A4Ah8$Zk($cQv;xZSkiZV5YP_bMD+}V4Ne+ilRg6+) zVzLR7va7x?&#&C?c+*)5pyS6NSbr&E7DuM>UwyJ zvX{2LwL-*5>e%wz;N_UIHk|iJJ((5wg9rC^nH8>3B!g^P@depK44O(BGAw#*#rVz{ z)2oe*;83A-*gfuvbK{JpKR?Cec@BHT-@+AVlHF<3h^py#HZQ!(%!%;{brTOX*T`;x zQK7ayJ)sFE(Vht7hzWG51+r2TWcfOXvb7&&q16o|C~gL#5Yn%aisEq@EK1G1 z6->+0>C%>@HBvvBcvJp6IdyhOZJumKY)tbRvwg5Z6$Q17Z)OJhA1}A5-sXNgkRX9W zS98zx$;+~s_hh-f=i>fmN}6UH;Ein~E1p2>FJ*mC9?*?*AWgKdLjyg}NV9tPip@qq z+p-q-v&$hAmq^E#LUh<*u5Qz_<-zHhvVfEue>c;t% zjB*mS5Zegk#saQE!xyAF9~+iZI@M1x&2*IG*~trQ3sIesw&^o@|MNzSK7+aqx= zIHj(O$sDA+&D0VOLB`RHno*`eovfuTQSWbCjG9_#TaxhnByWAc1ZyEff^as%WJxAN zc8YI);|o>nx$Zp&f?`Rn{q+jOQO_SyFp0pGG-?331|yJ9M(p&>`P?b)t&vo*MKObu znd=(UCpLg=hD+!Xya^}yHhPbe&TL0~^k+=w#ef%lzas{#bA26`~1s zRY2&%F24yR@lxlJJ=Xjw+~+B9l^XdrikHgRE&27`r`kxZn~7M8oY=+##C>M&5T|3)i2`;3Pag(q8rMb)o&z(V0T6J?53R z`w%1fNw_IryGLTT>xfqGPP)dOWu?#b!+V=;)P`~NsNGWM7Xjxn*-HO8O`(IdLfcJ= z6#$_#(C6gj(%YH_S|Rx+C~Z+uQhEg_&DfBguKJTmN)Rq3xdN7}HP>$FBeZraWCL zT;Tvcdz;Oxm_a`gkJ=l$dvip?FwZD|0%0;~Y!l3Ns`@~Ozz8KvFcOalcQ@|`sPJ9BE5FojS^!Y<#}u3 z6&4uf%Hq}KPuXom8OhQb5`M>9N96$a6fK!+qczYFs8e_T2H!vkRI3kcGQu({hq^7Ii-GclV_pugXfEm1erU#E>oEkEsk{;Ttx)7eq}Vh&7bM^+8Lj|%32!l%rd3C@ zv3ECJdSm@O8&4WPlPHR}a2dgpr>H4e8`^DKlAnj!*CY1;E*UcSc>nPry03X*2nH}l ztLoA~Ol1$6#dxVXi+*~XXAky9AKGzk%(W-&_3IjEo2cZccRxgx0u2m2{n?B8awFrQr(3CexL727c3)2FJJ4;aQ_Qb9 zk@$@}MUzwq%!&|3O#4ZKVXopM{)>7z&9_knB5X2EpaYvOVso4WNv~kHrnS0u6K@-T ztWgl4)WO6FO)@%PTi@OeR9H6|1a83-6n)W@&VYg@PK}IfkjrS?+b?2Z(2(CW*N_^& zX&i(P6(L4a6r(u@PJ{v>VCHPYMP~P(Vh0UHWxhcFTfgzwIfjn9Ix_Wrj&=XI9T({XmD=k-O)wQe_%TL5@OtKY_F16qCn7lBQ_`j7`IHjqPMe6n+!yQLFl z?UM7Uz0-G1qo}!ll}tfSNZoi;!<>%3C-NPWzXUJ6dIiyJruam@c9KQLb(CxNpUsB62I->~ATYF)Zvw1OkG<2;Y!w$}2pnHqf`&ghV>R7&^NOgnY5;L?>FjZS-TM@rYN4go+)tt zZJlm1A3dl+uf4C=B;6o{9}6y9|3EkvC*L7Y=;B7TfXMUFIj0X-Ec$b8#2V@e*UaI? z%u#&+HbSTsO=1@fwanpCEBPyJ1@PB1+lJ6W(b!urI~xDjKOFx_w2J&g`RV@8ISNwPkQn%hkkwRG*JRPPgCJZ;9>9MiE_^dD zP-Ib7MaWxaFV$khX54`Iu;6tA{7!CxDARlxAZBm_n z2LEx;*bjzug>78=bI^J$$r4ZU>W?SPFnrP-3|qe<*-J05IYwp@&*l2mPe{Y_pA?JT zTSw_Fv$<$=Znk*hGw$3~$a-Xi*p`t&q%ZttT#ZJ!`6T zCLaoKN4)q?lSSxe;1L2yA3{Y9wp2<6^s>?-jW-f6`!WXHbu)TJ1F&BdtIGLu`a(dj zys_bALCDkQ%IC*T^XhxD-?wBe!>?x$oio@n`^)^iH;ZczeuD@j%Nc88xq25x3boo^ zy%x`)9+f(k=i3+>MzxokRGJ|3hmu&drj&>~g1x-B&WO~R3rv(34PbibS z(|c4=Zwh@&{p;=H zfXt6lr!aP~{H^kIR&F*UcCnY12a|UguR~$ zd^2uf_Q>Dqha+A8B|Y)4?1%ddn6^5Io%d0mJ&>IIr2Z?3yJZZlAoJbxBDyOk;xijj z`bp*@qV14h%{LmI)(OVdry85v$Jt8fOojqU698ZZd1mLV&))pWNffBRTgv={+H3Rqy|~Zo*R@3|`$L`GR$O;%RfDz8|GTGZnp9({Glb%awfjHh?1^XgB$cX7o3Lwsj|AsnvB7MN>ZYt&}dCoqTrtk_;sl*{r=@jt7#yAw0XNz=J zo~f7YBzTI#8p1`4E11^TJEntKg`Qh3#zT^eU?ZFFl1@;x;dv;mFl*xOR<=;HAxS)5bbQ3`i zdi=a}hxuN#N5XgHbFIud$u|bCTBIGxW}S<|RBr0HbjPT)+$!UxTD_I=BNpyTqlQu3 zl)vSZW-QypM3#U`MGRXaEY=F_t0KJ;z$~?zfqP%fAS zvxnKH>Qvp9Xf;OE#Eq4J_R~hWc8rebL_N2T!qe2x2nzxk#C~91FS&^w=tlw1{+@2W zs;062NU^>)q`cTZ=GnEzz=H&LGb!%u?v)$mV#U2>Vj-bvaS9<4g#9xt=wBBM zysf7<%Y_!r{P3s1@RHw_xt;0hyI9E2X~zzq9pg5neW3e83K~|8-`1>jub$`6J8zH` zwM%kYKNvS7F4Qa0TyWe?E+2-dA99cmS9;>V!~=JmdP*7QyZtT` zQ_Sbj4Eo#?d*Ni@AyIT?%uQ>iB)W@^27_0x0}jRUsj*Eh<6JNsNJLdLT&ovY55mx| zuA-lLYl*ss1oPq=@bBBU(=;j_;bXRHcn60)Ub}+OwN`#HSXu&XTuGlzf=;uwkA6rg9@pg z2fX)@U)K3^F@8JWsSe|AQhpEZ*SngKa$L`6r4)pU`U!T7n9N0lDiD@~IGvWzyk``w z=Z+dN0#j>$RM^gxIdKswxb1ik*l-e~*_x)g}K;rPcfyf5d80z4~sBse90Q?V@ zB^K2g%rdno`pv1m_(!H>X9u*4NqSQa%IpY+e&X05r?Qs!>dH zE2lwhsK{t=*w8GCf_Y7>Lr6`}0m7mam#Qu2rPlUXp-l3DyWso47Lki*H^?vFgG_J)?;1S3I3Ie{hUcp6f zA@n%7@NhQhf@aflwx{1E4Z$T-wMTbBq9R=qPf}HB;Vk|stM0XRzg>Z56-*@rW8N

;?xu?`l&!A&Oy?io*(r9ZN)aVjVox)|#oq)YVjS{8GWe~&9ocyW@4miE>OI4=Q>H>?g_ik^angfJO=;jte$8Lw* z;_?=tA4+9p#}BOEqNo3Glq!byW5t}{7<7s{cPB@m;phw9luufCWsSIL9Rqu1O@qH8 zq{qQPYh~3OV>5TlA7{Ln)Xub=c&Ull&P#H30dbx`z@Ukdn+Dq zoRB*lQ)5n)qZAm31jicZ)lRbM-2O1`N zPn4mXmz0X?ksgl8Q|fD=LAu3_2cgjN<}b;an_>CPpVr+kS@561FFAjY6g!&W>(&oiCV!kEqNEO(ME-GehaL4duqy#pJ=nFE7Uxbq;rtaWOnBu zr9(AC8m+~(4B~ZaeiU0=dqr~#Up$H60;m$ zhzsEX&e%;gHj+(R8%m;j5+{*!oy8H<=sFwZVP7f2?`HV7OCHnKZ`1lbBO?wMoGd`! zS%EswE2w+dF5j#=AaP3Hy{oz}X5y`)2@w)$z?2SjV@oHsYM%C)BV0op>B$}J(9)j( zNfHYzk{>JRJ_A*zOb$=-$$t&!2*DirBlj=Dus|9IeerLO#`m^Y(Wr(p_KtgIR% z&ST(MT6+D?Pv%MC~PPHK`K^j#0@eu5GyqLWTwc6Y|r#K?hjD&@ns;k z(**VC2!-fga^7-6Y}%ecE>*s}=xn|?x|+14T7qcLNEfZ#81tlv25KId*(mge+h|-M z^x{H8lNbzl5HugY*QM^kW%+@BWVTGNBMfKWL!M#Nf59+We^c!$E1&F{UJqV8Y9E>F0nrRpLTf3`beQTb}1rUhu;S zT165D#wpc?M4^D89X4?*yVfP7$%SnBs(;o0nKt3GgF!GSEKZIG;KG5{HvI_Jt+;d- zH6j-Whp>G%5QR13Yf{D1 zi7jE~9l$nJgW6sUzxALy^6-gTko81C_f#5?y&`-IOtI*O+D!v}4rVkNJ^i+!fJz>l zxCam)Sq8RN7rkCwC&R=)w8T8y|(xnWRjaG)~y6ZG|OiCcl6QQ{_2-~FL0i6E9z`#26=hDfedlft1Dc0Dq$H=e1bZposh3*5-e zw&@n&+)doV&h}w#D6P+Vz1JJWO8VlZ0%JjS-KnH`!_*mAR8oYIO^{xWqr!?F4rql0 zCENHV1ZkPR0Hg3n#K$kxhd8Q-Vi%!tjt%0`tM~070#GHVI0ymP=Ot!>j5Iy{ZMqv~ z6fI^HZ07d;Zrft{MVo~~Y8fi|?!bH86Zyg}%3)@$p;!?oo8nFu*@3UGBD?p46pWph z$cJrAjbNlm&&`wx<*zrTd}4RspU@1g*YBEb{fgOWY&T4bVOE%}abn-?_!T4$xUqRt zNI+9g1?)%c)tlXsXwB?8e^5ElQvLZ&Tx!f(s*biu{Ttqew!ShouBa1#c&O!uOSnXu z)(4~%38)=^tP^)a((_!3PFuaCvvEwGOIjNEiV+;cnwOtOo!R~=|Dh&oZF3q!<{6_k%Q$C7Ga2{vj_4n7oW+d$OwCh%zKcwj<}xB&^nm>48qndzH=>hnS=S z;q#p$KClj0i-+p*ITvdzetr>O0pD_|m03GhAVsPV%#XIT0%u26shXXF=lOGI%X-2$ zrg^Ff=XS_jj)s@`^&;pV$>@cmtz=iVN7XQS-$#$lQq6X2 zZRvCOn5wgJMcNG532hT)?Yed05(|>3Rzd7Px{BSiX7cadzen)^i{-S)iVqkJ?u&8D zKs-G8H;*7S7BwUIM?g-yoXM76_6q>m;N@)~g~+d=+NHWG^hm*=&-tNl5vC5jl?MOF zcL|$8f}2ys^o9{B^$`dy)30I|HF?o2IV>u8BSIkkHX$nJN~_#LayDBiGf{TiUStY59gtBy)#9eZ0S+U%JgP>u8bQEdHg)Bb*`$vq76D zSuRsl?PyFqH+lM$$Wc;yEv|8aICGkli)5dU+^D#pM#ai`-`sJn+V zy3h#Bv(h`ZzOcGpxRg!1AQMi^)~~fO%Wr;i1Q$^J>tqd1V|X^Km*0!W+zXi4oe1ZI zwEQ^3oCq&?VN=H1i>m3~+6i))$BXRoe#;4TN3i2XXMN^bKJmIl^97J(O9jKF!=a>S zs1)}t-jAZKA;ZOE-5>4Wl%z(3e`X<+#)&ew2YUGB zhR~|o3dU9l@4e%LydqQ`g~+FH3mo4UG=|{`9=hWMc=nHzRPg7kgD?S@AxzwfYl%8YR+IPx%Dh)V=I9+Iz z#M<5>OIR26Nq2a~WJkjS^hs8^b8H^OrAl{@PbXmmu2UFO^W@HZoR0TZO?MiyxCX1+ zYEiyC#5v(Lo`l+jK-3YuzzyYT8F6fXDy-}ZFa*`>K@z1x45p;WQ{RPz_;jb-MK?q2 z3B|Z!obO$+25crE>19m?!G0X!J9uV#YZEVgsX;is6T|aEXeVpic3)DFT(2M>h!K34K#|bH zz*1R~j#B`XMxNjyzrW-wV8<#SfTZ(kaD>F$7}xcbV+gOTCt$ zX&yG$UB$ho5~{{or=Vpt>E>|bDg9)TyYVZ-z_Rc)-=dgh=MpinMxO*M70U|i!ba());o8bG+v2lZkRy61oLZcgFbKbF7ww!adac>b1mv-@}X5#9ftbd%wi z0Om)ijAp0^1IODP(iE~Ar3lGHMgT%2a*ZGd{} zEoHa4o?d$Gq?my54;_(!>${2Z5A7S{V4ePZxw51%szAF(Q-{zYRxt0L3HO1(y*lcz zQOJ}ge~MMQsS6TxY{(Yr24yud{i}sB`@LqZ5}XRKO9Tj-MPciH$aTmZQl%N0GwMs4 zOz;2T3EaIyX==YIZDuF{0QUdI7xs@VX>%vD|Ni3sIk;8I-$g>kC_c$rtklp&dn&X+ zD3pO(VsqufW>k7qN)n~`sTxTnRtZB>q+44`=Y0C_RzFN%^h}AJj6^<`F?|ycI65*A z;!B-}#}2=%gxYwHpN?Yqd|y#}sk6l}h9n>=klO9(0%HW!EXkgD6PyvvAqlL+-27r* zO%(glc;jlPj220_2zh^>!{9MePlURW=b=-1y+pQ&5_sYEqfh#b8L0*m>VtR^)&so< zE69NcuD~UhNJywgYFR9>vJkP+=ZfGvPG;+ zu70X&zXsWwyLcC=f(Y#S>YOkwD&G+OlH{eS80HA)SkiIz*uc)RS<+5JX`aS<2Q%-I ziQpQuDyW{=D}R3Dm1Wibly((#9~$r2x)Cl>1qG2P9?k{b|5a>}MaFIBo+IQ&J6$evomyQ7lP#| zj;Y2lkd4A{l(7b-bg{rd{V~0jx;Gv@B`Dl^ZB-n>z39-nc zQnA4yi2*|lGXuV}Em%VgD|sgo=sfEo`!DWiOHQIi637jYkZs*3TU=0`AM*LxRh{Ab3YI?de@| z1fF~W`s`pzxzgImK_1~F`N2VLhiQTwvGVH_UePV}$*dd^N^`bA9%2-|@NO|&3~9`` zW-`Tc3)>zI2FdaJf&%YJ3T;xt1%hj5+rcT*Z?5JowZoBg^&<5g>co12gpJfuJwe@3 zh%nwFYkgh{Pf4Z#yJuNs7ANAeZ@+0nd;Q$qvvbY7MYCI}`*ZUja*eq#c4g1+6L1e5 z06^k@aSHzZo~QbE=b|d47mhLNmu!7U!x{`vGi*N(HY(Op!P(Z$)fV_OA2x5~K_JlkFJW3}W_f5C$ZGXa>Z$m@I+Eg>_ z=lkyz+wS|X?dR>UuIo!CIvxjrUL@hDU9e4zz6?7>kmFqw%>KT+#aR?o>s}=Yo%LS)az(Hv@5s+o;&Xv=I6lMZu%#Q=MO}o zTYre*8~(W4Jde!?cuB{c@ED=og96GYVLLwD(h(qT@~#jiZfXY`Xd*g8pApcr1O1B_ z{6JBV%Q<@7grSiEc6`F@&|UFOQi--HvO;%>tJg7lUew`|ftScpU(U#x;BT*Mb{y$Iv*O6}7n5c4OL2 z#e#Uhtgh{viK~rS$ms(XmqK-~Q@@xsD~{ywwh=y;p8P_SXks&Ek_=4s#vrVuYDuKj z5s<5DkXK)U3RLnZ-TH!ur3=~QUS(1<6J>Y5eLq7~<=VNybTo@H(=jBnC#$j9&=Pm1 zvqPBG`e~yv{2a<;)oRl+qoVkZM=v8zx?!H|H&trEjP*^rsg@aOEIEtWl}e7YtihZZ z3`NOs9DyS?ye7$!$lSEHR57Y4)`glpYeJ*UjZ7X^Biz!F+k2|8gR8+}vE&|RC+$&1 zSkr`woAicaJMw3!O}4!DKL>aNnj=my0ZjI zc*+(?uHJ!>=I|JH#f(I&Rtyt^Q-|T*uA`zLx>E?9A`e=m9%kjl-mzM=Db3Zt7)`t--icyUBPX(5AX#>qZAz&ST;e zRLH2}vce5kd7&Xy7B5&`)mvEDok2$|&RZJTo#7?Q?t;Azx9mAh%p|PtkZVh|UrksF z81r_t(+hSq)eE(t8O&D6N8m4c;dtiX4*L8(*w*yJtX>LZLC_H;k;(GRB#HEBvpYpl zZOzQatr~Q(;*viPVdx5M7ll49rve^*?A8e-4?>)#3o4iG!8v=!^X~$Ebu^qLniK>r z@J-sL9##uCl5J{aK1KU04v^a?Y%f*eJLWH4S`YB6g}a4iuQCI8w*ldNa}0_y%aos$ zdvq@q!99EKuyp&^P-r->&Ur2Ck2=I(RhcX{a}#Rnyx?Wy#$SY{N}lQ(sJ4>mhqRc8P_1Y; z{Z%l%m%)Wu{KjA0C@5c>MM{3MK`)Gr3?5h_0P@Y+o^ekOinWelK;hONeje*;0UFx!`ZtQXJ z5NSX%mD|Uw^4@M@&#IliC^rv_QCPO-1_WMRCvHTc^5XFh)pu^J;bGJ-?v&LvqQL4I zxwvTsjdJIpe7#l8bec;bnc9+MTKAmMdvv;qv`~~M9zNK$W;0Ecl}Why39vvw{h_pb%7 zH~=i~LsR3wx=I&+yj#edjF^ms$KK>02S(LP{-wn!VSs8GnXND zg!NtyUf*0%9V>6oTBt~N;_3{B3p(IRZ zn3|g4UZ&(=rWaoohk7JQtq+;X{YWdD6WY^`Rj1!QoL&K^Hmi8+7cuRiN}&5bsnvk6 zP)EG)hCM@;Gmpz262@U4zReIE@ku^SYl^9qK7?grz6W+*rVK*ZI?Xq$YuY-$mQ=W)jy`Uys%IAN01=@SFV2_$r{$U4{N&{qG4$P6${nrgW7y_!a?E{R?Y zogS7X;6kXr*7zepRqSnR=0k1)Qb-A!VbF&$QfyPVUuSH&by55V#*Yo}mpLRK6!jHO zF3FU*G#t+ktq+mVh7R(!;^_ABMjJ2tdv+N|5-KtY0H>x_6kqE3t^Ik`)-%Kxuv2#! zIH;JTlvPbVn^FQNbQ9)4CPn&4QFNz99;M1!&}W+>u`0du}&CZ!R% zoppruZM0USfz>{#%le;!xsSa(qfM+J>&c+l0iLrOq^3cmkP!1}39;+g0sdWT9-$vp zMd*p!@!<(8Ac=Lq*koFbe@sCmv5B2o6kbXpxx)SM;56S57S)mpkB$?@E7-uxJ@|gl z$$!l$R@BLr)ENv#8Yq&$rlkXwK({AG5fH+(7bFM;Z5@IQ0+4;yPpsf4y^?p;1z<{Q zvyofWi)O@5*=w>H9gHZ{vkgEINbUdR&x`I*k%^hG4;p!OiAg0OI8gtNml+rBl?(GD z=#1v40qKFNse$QSAF+2KnQT%9suA&_^qjLVPdPm&Ic`%rFAZ$%1DC(%N4au@{d$eq zTrdnO5mh4Z#;ZUfC1Ift{(0$*8p`$up@5`l`=oj0faP7Jwb{?d`%&Ea-wh3amH0qaw}U;HCWkqZRjmNR+D-HR*u)Q9g^&B~g{1E$7*o8HkbKhki*SCx%N79XLs+ zu3wE_sN7Vz#mBw?`XsV}hoitKv zsg3kQvrWZXzisJ-j*lc^>S(+vFu|b4lR}y-)YBE^UC0w?%{19b^pz0U;u*d)++n~$ zt*hONL!8XG+X`jTw_qH(9T1Bxl%C>_5`B=`jtOs=db03K|@5C%1IZSDWgm?;~q7 zHBVOP$w>OHei;aFh7nUcFleh+Y4n_P9Z#1{7xWw|BV3uj7 zNVcx3oM&-*p)E?ZTP%P8>oAODT|D+B(-i$z`p;tMe?pW02)p|yo|C2eM-^H0+y2F!Of3l%DyxA_ zGeeAFy`;kL1(46O58Nbd?FR1%H|MBP`>6I&b^H)>cAB+j++c(r zi3``k-4R!T0bfrJQ%JLCc*RxXQyNI$jh z^w=x|9Z{qgGM4=>S;m(F{DM#0E1Tpc{P=)!pj&6 zErY=wNgP?ZbSchMmWM~P(QEv_qg^e7K+l`?OioTNH5bwdxV6$rON3p7kMI1b6T3cE=|^%)er0yM0*7(l`lboHY~^q0AYo2`_tKzH%fH@3fQ zLit63I60^3Ztb5C8`&t!>Uu}jQX&HG9M3dJzpHzhF5lR4q$bQ(Y##DPJBO?8$Z2n@ zZ5cF3EWP##!{ZFZ1OrvlJM&3TBKH> zsFTv2$sbTN;mD~=;9QC6w%+Z$`~rqOouw$W;|DY^^`j~Y+`Leco?Em~I+n2&HY%y^ z-1#%+3Z3)Rf(D1}nPPgcG5aq3e7NUNOdP}nVTXH-gcgSPFqNv5C?mVl;pO5xc)7fJ z(}zxSl}$^nhb*D+b(ugNr^(L!m6$%e!44kN;-jX{$9zI8o695R9q<9sC;Cpr-kZ%( zFy({>%FAwJ@H38;RiQG2qoxDSn(2CS=Z;pe;3-Qbf%Z`gnX>P!8j(3Kf3669P1L|c zH4lErYXGdypG)lO*;LArrv@=ene*|`MGopET!9JRQWVNF(uKRoUgNcrD1AnQI zrHNICneC+{ONA>er(MSy7Own#Jew&uX#q30K>>8PNdYi#ZOQVGx>T$Fwr-}8dwR;L zI*rT?rC936`{brESi_;L1u8J-m1@y8az>5yic0MLE$_Ekf!C<-es~-=GN62Wrl38$ zD}K`UPYQkNnToLk=E0ZeIpF1Q+lH+AX&&|}nbSvSs(}y#+kV&JF-2H)R?cWWWRNCW zG&dXFEi*HXl%35{^^V0xXiAccXgiTq{OX8)*y>7A;nLVnYtBo`YnV?<&d#qB7Ol^W zF$SJL7e_nm&iJ$#VKf3inido&;-M%J-+{x37%nazx8Qu5*@f2>Au!_kcXBHvg+nV7 z;Q(2jv&w}*vnm6+x`BLE+27ug~`Op5Z6pTKiGtel#nk0>cnPccfG zX$}W#d^!d?Zx7V8zK81>=d%P3RJ^qPhETV7jZugQ?-|gwOU@DF5&2`}hKaq9=7*q_ zr`>ZF7i&jCyoo?ee<4xpO12l+iwlj!L^v49X+RAnq6R{gF#P}yZWtWEK$Tc%wbQF- zCk>lF#1h1vj*@3?d;t-)WWhBU_YGN0H;%YcJ!U=5P6re$N3)j?&8$HlPRJK$1+uv@NF~7g{gp`Pb{eg9q z0w}LycY%nD$N@W%(p=N;-b_0KWa)*mt*6*8J37Q0B%+gfn4u7UK8cN^h8)5U)ugEKpqBrS%b%2T0qf2aMZ}a*nA^ za`1>is;J1Nl5R~dYd^A$N3>>Bfw3I+-O?2Nduot)$ns+p-+ZgMp7{QosQGIhA<`~J z&Hm;cY`*icS^st&v9>ibwxW}EwsJDJvoiiyRKBpAq47T&9sYSsC8?}wVk@J3Z4uM! zr`8w#gvOFaT&JFGBv*#2nnz(~@xzjkuGs$>OwXPc)=;}xboB|_{d!dK!D}2Rd)@&5 zDSp<*=1)xgVvc*Y>3F5?W7@&y`~Em#3sAkUiK*X7sIL(W-?DzgtiWhvDAI3*P$S`1 z^}~EK?v|60@ra(T02Mm(S%hnQP}6HnLJelWIubwGXmenLu|4)6;Q95=PqJqq#nreo z#2E5=0>h6|U$~!AFr{Fv-GbV@xj^%1>%kh#C1g)(obiV$%NEJfO(R;OZzR7)MxFJ9 zix^Ww-v7tgJ4RWyW!u6L8MbZPwr$(Ct&GU9ZQB{PZQHi(d~xdBTen`l+v@vv+w1?{ ztIgKO9Ak9YmP<@8Mj4B`ZAb(+RqE2KEZ4IHOOZvFj5Xw?2OaFS+1Qj(1+#i2G-#GM zE4kS*W=3T*V`v$I7glnwo==<TFa|O%Q4**@@Xex__UJ4_Y^V>_L5;%1 zK$CrYZ&P#_$6cV0a!lJl#^+6zw+Zl@HK{emOXWG?Ymzi{d5&`x5uM*AfXhXM1KH7; z+YUmlLW>whK}4|7%gH53A006dD?kAk9*Zl0o9bw>K@s<#ls1=vfadTDd$L^3Rhw2+ zo7^**1?6@3?$OAx-C?4ctKnE8yA`WDx`B^5ERoZ5Sb02^vsT;#2gylYo7iggk{pyx zsX)&+RbAb*yv7ypa6n6_E6Mk8_O~kC$VWz;r&ozIy)b6RB%ZrwdDfNJ*3{)ywIMo# zV7>4M{Em68e)S+TI5}jk!&f${8LN7F+kp*^k;p7}HW4P@qKt7IMJ(J$c!2Xb6v*{1>H`PoyO{P6_D1uCOH zhQah0xzaeP+RBQlj;70S_iLq_V*E3*=77+R8Rrt{bVgs8B}s5n2GaB3Q-P0hbugWC^04?T<>GZYR}bDf8UNr6=7-zD8?UJ)ZCP0^mQFTA8&8Tw z&Qjfh7XEAf)NCv~9_8sB4SHc<7eE4E0eBwjlL+vc?Bc*DhCOPe%K|$$Z#ZgSa6Q^u zus_q_+@!^L4w_siP?==CzMiCDvH0b`D+3WC!_}&>Qi2kQFHzo-InZJ@b@Mh=B2_Y@ z5e7{HZgb#Q#KvO;gWoMtK5A|hnvg1A$k#ox-JShr#x5^}2$lK2;Hz3=kzY`HGjrCt z`LPO=IND>Lc*xTjuc7-lMgTd{yM*Fdv!J^RtauU5Y!T86+QBdPtXa`=b>NmaMXo#X zzP^}hBf2PuVsALaA#nR(`WmHA58U?$x&_L*gV98ehHeo_g|qLH&ZAM?KDU>o9#1$my0Iyk)b{4tMA=(UO+ zHGpfy7A`0Chfu&=NF*hY1o{Cr3$vR}xQX1J@~_cbf4MLSOg9x~ei?qX4Fxz5wykCwurEc(+NTCtE-2x%TfSp#>+ciu1-$>a~im6_axs`hl%)uK(K}U zDI*l{&#*W*K}}Cw*S}bR`~~g8SGfj;--^g+7ytm?|L{j;?ZiyJO=B&Lls)YKMg6L3 zU~OS+@XyebELE+)av{HD#Tns6<>|@EG3mr<`6-)9^)3883jho8RWAn#F#2cck%A#g zr$3Rp-ujgA+Ek$;+L9}LF1t^R-ig+H%@~hFLr>CK%$`>3pTC}(pE=Bqrv3c9fOZ&l z1MM;AY1o74gv1RR-8OxVajT8F83Wz zDKXV@J!J0EPY+|Joy+D~qhT%4!)IdR?EjQ#a8@7GXtJrhknFVJTv*wVtTksXG{sZ2 zt--(wEUJ{8B~y(G9@hX>T(*ui$}%)cVpg@zSt9Cr>!I6SvWi)MxK2W2X3RWXm!^4d z>dVb0t>0b5E>0I~)oAtW1 z_gPJG|7y!}=$+Zi-?g0z{>?3hTHn9HI+H*XHL|jd10+NDR#O$MRidubu7bfzCCPd! zQORGp^Q#s6JbB6?ixlpBfxQ03KP^dkKPa1`*rN(}kGH*z18-C<9pV9pGQMX6On}vJ z!wr8QOq4cZ$vWmD$#W!$)Ww6<&I9#FoZBmubT^$Skzp-Rm`A%yUsL0;h@;v$;BxvR z$x41wfi|}^y#Fd3pw$3#gFebdgYS6kdh@kT$!sii;U0AzrKf{vZ#X1S1to89XiwUk z*U2SE?|y}~{k?|fG*_?*WG1;48umJUeF8|6OfyL0UMrTuEs!JS690LZIdy!Kv>4Mw zlz4B$BMen@nHixYkr*ov`EtKvTnI(Ij+%bO%1<)()Nfo;03v9oBjW@M!wH>rFm zQ7kWVIzY#0VLj)17^EU4=xcbwv4L80})i0rtVc5JFhHR6Q^J*LBy<-mQ9js}2h zQWOK3t;}Ug9u1z(?8L(1wLuk*V>)8#Erb9}Fl~r|n!mZg# zOPX7Zr|KKiJSx@|c%?dfI3$~Q_CW&o+Tm{pe&2jfq`@6? zH06!re42|vMeqGE(-E=K7RK9=WGv5hhWPX*GwRCE5e^&j^S1+&VFI!n$`Ji9@VlmR zh6()aFYtGF!~fnd$N1KMZu245j*491qrRvu{@RaR7!B2-J!9X0ym_V$NB?1N`sF|z zx+G}}gkI=|)y5z!@g^puI$YUo;TB;9VSE|kOAL23py-x z4Cwx5FW~BLfcHl?o9?&Pq5RBer^xoQO@kgK-R=PIY^V3d0pG{A&%1g(9^398h%Led z!3-PrNYR%C@D=$t6n5ERB9Qrm1@v-|WNx;eF>40W_Z~4& z5_3}tI|deVNf+@X?NlV~ap89pDPv4A)2)PoREx=GUFF;f9j^p8oF9R;hnlq0R< z57bOi9h)CmOg%acb;?MTQP@1B!PUw|R4U}{l-!1suD;;@=VJa>nTi)g94`1q?Y-}Z z;yQ}AvHd*p`dp|)VRBrC8@OR#d)LZ)^AD|rNGl6z@_}y8yU<*QrV9e-Dmx{D;%M6W!k}$lnE7 z(8a>q_`l0>lA4UxcTw^sBgTLx`awY1xS}o~_+u!>k}9uMzEV?IiX7R-D#RH4mjUUN zwDLvM`&Iizv6go>s-?$5b=!&E3EatV^Y^VZf&-(QS&--b4X5q<>=-Y`kH_n4I>5|9 zHwN<5gt!=jz*Zo4w0j0vy%F`;TJ&F$bX+xo?TlBA`&1Zu!!r?fhAlC6Mxg>IA>(_Z z0?;B1=8USG@_prz5VgxDm4o)kPKNjVm7%K1_-e{hOxRj|d1)+M;^-1ANaHZgxv%sccp1KmGnCP`m>n55tyGzwn~%6!I4n%!TS} zZLi|%jf+_N5v$SMH`-i?&@wQq( z+DT*!P5_y=SKh2iXfv`pOe(Y_TQu$}=SttMYJ2Kv>FgNNg2e5MH=weYN4dbIaE}ZR zxPRdnfSrfr9T2nrl+lR2748MihRnL%JYhCf?F|Lr*unaQ6i45>24rp2oArZb{RqER z3x`Q`QH$AWO~L9Kw^fjV4_~N9wM@e^xlFI%{fHB@Ap^iy5t`9Yv+adI1b2x&%Uw0jQl(+(v9(=% z5#9dw;rBnK>MyRf!3)*F*msFC{a$PRr&1+gYis9h;A~)M{a-1qQBm!Xef;nu*Dv9A zA7C`n`-JKk2*Ndp)Y4{+XNZVPIxE&6>`;I8Q*4C1H8T{Zv~EWmt=e*C074Di%-qZn zm*OjFiffKoR!NASK7RGmFL6wxDg!T0!@6dGd5^saqMvN$v>xf8Uw90SF4z>dOhn-I z670BtjEnVRNDa`Xfwo-)eX5x1ks{RFdZvK(wJ1P2gikDyYKfIbj6=s z&w7?a7FiLvvz#$Q^Q1HsWfVn^Qdo`59fPtx5?0{s zvc04;4fF*oYGML$;nZQ;m zKrIn=Na{Vw0hj1kWbnPe*uN8P&0pF5CN8x?Sp$bOrTOBJubIXEFo0PS^^Hdl>X;xW#XHqBDEn$iPy zy+znW7I`?3U3IvaN8-!XVJ26Wt#x?chb)f8?U;-ylQ$J(bi#Ajsx2VftFqx^@{(;X zg)=pu+3CVB0Tvnpti~+1CTH z2RG_xtp_jJqSYbIOgzG!nN5>V9>Bx&@8zN%9G};syV5S52gwKySb2^wU@w!FDAsm$ zeRY>v!yaxQj?InrJi1@rn9Jy&pn+0QG=h_3MpptpuLoQJUkpARA2tO+^_ zHGNZdi>6+durgg^$>?L95^rvJF4jm=z;)2>5s6kQg@k3-9fllMDdgDdVF8KZ$lk$< z)@qq_0CVHG8a08rwnwfJ)XA>2j;3~mW+PKh*wyTQ!0CslnIvDOc@|EU&HZ?&Q7Rx< zyZi~Y3FL{RJMlf~DfF?Jh|*7md!Nq?zt)*F4_VQbc>;t;E|de}|3%GGgj4cIggWjJ z@iJRKybG$ewaX;&ZcKT!EN1AQ+QM7PZJ z2PC&%4^;J$Qr=y^T8L92;X5$MNw%m+WS`ERzf@ziHEn0Eic|Q5U71CFE|!wNam|k*QY|42VW6 zz0i;ngZ?FC>Hr2NO7gLk=dhzxGv-dAR_mL*V7EML$qq1qxgMT9{u@bbm!9zC4 zv@Ezvr&O{fsgKXHuyoR>E}F0UVgTx1WZ7kJv?U4;jtI1hRH#Npc}_GuEmBKj{EDYn z=F(uTgt(n_s>bbXDvqW%>ilji7OQNf#JcnD1+R<)0D$^FwyD4qTy+!YtOtBlOEarh za~jt;-xs>LQVWLlW~y;ZtIVJ^AWRK$Gdlxx+x9~lE+){0h7P;{yebjkpW5yFbbGve zycQ0J^!^8W|B4AuilvFx|JMANeD5^AQG3!;;*(z*}}%eSkA@y z-y}%O3 znwQ1y0J$I8#eRE(iB}*h+}3UJFda{%VZ6TorrQRn+%bRz0Z~&%c2E(4SXR~!A&999 zw@{vwcM!s5Ls3SdW-|V9#r2ds_}O#2QDv3^T{%QwzuW3xqcd9vMj*HIos#=)Js3?u zl1Z@bh|?R}?0TWI4jsfq&y~Fn;gi$eXB~~Wgn^uP5tNwWeE|QEnrFTso0p^oeGBt@ z9K)1m_;9-4Amd%8od=)T$^*yID#6S%rl-aI6d1br@YTnOj2K}aPA5f^F{F@*K7$)x zv0DpnFrgXeOH%&#f!yUicntMWBqIwiPXMeIHTt1ahBB7!iQ9{kn5IUmx}}Dt{P!n? z>GVulvDqu&-LtGBWyFWHoT+BBOT+H^CR$$KvLy%wq?u)-w>+R7^U6S_--mmKK7<9v zEN(HjA6n?K+tX|WCy6UKn?sOh`f?uB?eOcIhY-DSmU_s*()ToHK5wz*DRzj_4EvZh z@LKp{LL%~rj(gmz{}YA_U$^e~RVc%GDYE;Ot}=m0D@WbL_eb-FAmCjJfT8-&U<~=^ zhx9(`I>&0~>9JW+j0M1>Q*N=}0FZkRG-`F!wMwI6_nQJ3y6c(*>pm|)_*!HQ*9 z1S+G~1fLA?Ja`b2dm`FHgr9jS`uY%P;In1G5Q@ftp|-6fu^kdrb3KHIc$oAOGDC<- za^l^15oAO)=n$465JUo+NJ$?;rbdou{Sb~OgdBJ#r~i*pvlG|+>Gy%<{$_;yr*ZT@ z?+P*|HirM~f0f4_zk}0x*r1{P8Q=sBg`+$$@ndd3!9$M-RLj9NL6SsVfuwha42Cd4 zjd)3{&}{1*kfNZ*8@qS?N`1gW>C2RN1J-@ueB|76uF`Y5yM4X`s(uTC@5-ijco}RA z137Rf-jW0J;YRFBfXmgAMkhu#M4CbSGqbfO7~BjZwL{MptIT2qJ8dl7PkKr;M`(`X z6UWz&rPo%hYHzIP9xS;3B8aQMDEFKpCS0^lFScb{;Jih*Tv|GN%QNZToCQ$}H^@&p zKG6xWYSfE&u1y_-Pw2x6N>{CgeHV<-s#FD# z*J|F#r9VG|3B!;TVa`cWj$IU@<+(Zo92dcKO*;LQ>`o@Dm~JAa*1Lv$(U4bjx=>kTYc!KqR4{ zYb99N55&OWKy4ChfCTtws{@F)7-I^6up%aC`U~ou-eLPlbPmLRxR?9UBqiYJ-4t2g z&(}jP4myH8UTlHLxrsTOICBvWi9VwRnMis(W9fZPTX{^$Ia&pGHU<%rFvAjxaumOa z4prp`Zp*ih8w?3VFMi$v9(D8c`o$%(RPLY;lwPD5VI>_z5IS*W>tn+P5;pf9Eu20P^NL8JRuYWNG{%c}nuS9zB0}%iK>RbK$pQ_|PXJda? z$w3VWckM+NUNNS0vZ!oSD<(u%T)GvbsK7`X=#e@B-9V7|NE-vAiM`|5dX^`1(FsGN z9_p|xctLS+K*D%^K>(M$FbMq77WDWAexWu*@p)ome`bmKVj7CTCJTo@PTLu571q1_ zuMd;$&zoLXt;Zi`t;f7R@0%qt2(zmnp(#uA?L`ey(Owpq2}9a_BD#+CQbx@w%%00q z>n-ZIxUsdQF^C>CG(>z}<1LXc9*I`kyN8n1bMEOWmMxm*mIn$I4p}M1PMsI@I!if6 zhoH6(ccWm3mlyNbJnq^=adj~D3UAjCub$>eyldsP3GE+7 zjDHXL+||kMOR?x)7x{WN2eRcJMlt&OKfDFqG1A%XP0qDzduj=nQytW*>{GFHjY)y( zRo$}aLQ1yF82t)MeYg@Ih^&Idx^2NQD?ejF`ZepXGMi^WWJ;XRP&`&0i!p^+c6O#a zU;mb_a_&iYxiPcaZ3{FXpKWe!c3y2voM;|J5@gchLe8llto1(WE?AqB(r<<_->}8< zX|-(PWSQ}!M4OZ%f_DC17$GBqx$!m^ zp|+6?%u^-~?0xd-Se@rsCD~Jkh}|3`sEonrS86MfH7HV5Q*Uk{Ld2vIr_VV=Sf44d z@W!MvvS5kw3YC5uCM0zO{qR&!OED=5Qc=zRvt-CsphXBw`zKx-m*0vk)lz2HytH-X z&<=2g3~_uaNA8iomJ}c#FTxQD5C=3W%2OB8Z7B;V=-c#5HPh$wX;Fso(I#of!j4atKy5eQI~}qZ5?zwYLS;y!=Xu z2{oUE97x-?+{&4>x6-iKa2b9q=SFJvr=JpWrIOMPBYuPIBU3lKVj%>RxZS1S#j)Ma=kCQcr>mu+emQH_J8JMW8d zQKAqUuU}$ll<}m@jFl1b%-36-d-Ql&_uUHPx8ZAzIN}P^?3Pa|pTC#=rEGX{cTDEb z9aQXi<>AI|efT4L7+C`h$%&D)EpEjPb9YLACUSUL8;v={#=6*^MPk!-1JQp)yU1<5 z-;U3~lq)X(nxOS?ms=v4lcsx0LO?I2x6F?ob(1RTp^jq9?xMn1g51}_(Tg2Hs8FFH}z*7mRP=r%^Y|HHb^XjYW2yJPU%uXm_Vybk~47s z(=mEwN(?HNO4=4m{9Sk7tGi?J&D<&HTb8T>=8^}OPz%SaY0RZGECCj0aL8s*7#+E` zw*b*z1Yy++XcP~rXE7a-&QBh=o(i(EZ(o`u-u(IghfrAu$&&^#T)No=PHp>;Aubo( z!tHN&y%V)GBiSgob8OS^EU030&^Xfk`QsDZEM6fuhRK}t_p!FpsebP&*>;Lb2kB#W zGG^Jc2O>|IlAO75PM?IXqI=w}if`k-{Hf(zUhWf|sNc)4pj`_4pChLrv;v&l1K*x` z8qSp?Pcl(^ic^uBn*w#8~lh!sa6rsn%Lpo99^IFfZ^^ zsw|fgX<^3HdraPxx35p(A*B64aUc*mdG31n;u{t7%fgB8`chxqo#4cdzhsUPy7+=j zTv^322=_;H(x8LDi1Ej9ZoTtD<&NoY&|JO{JIn8Z9-4+ioIMlp7GB5qPT}&z>}Jo`C@Y#$_vv23sN35{ zB!9Vj5P4J+8~g1}l*T)Dc`LenkxP;pZ}8r?1-{f;)=`lkYiA}cQ6l$RYHMBCwVqKK zPL$UwZX;&3-)Sg)q@HA=FnuOWhvzdvPHKTwNz0AH6T0MODxj|{oN6Z};MVlvgvd%y zepMyl42N^?Z!^?AD=XGMI>^HfvcX~k&2}F3jQJ>D9;s5E8TW%IRIcjm?DX3nYMdhD z=JIM2yaNVO!`0Bn9%=xws{<~Okh0PV4AX|5F{&t`X;z$6N}76$AiWM~+zU_rZqn`_ z6`nF7?JkxmQyw{`WMWg*q@7rIbM(qg1`*OEY9&U)1S9|1!GvvUd4r});hN?QtChU_ zA%~tPt}SrBMj<{;r`(D>*R+6*DSJ_WLnEiNAE25)&Ys5UP=$280JErJgeE@t6+x$p zB1gUz6=@(`8IurfZ$%l)0=eWeR$KE3>SC?V;)fF6=&t>h10G(Tx?xZfMCg^@?(hH| zQgAzi%LHvQO_yuxe?w8)I*g9XN(995$4k7Zxr5-{Ic|&*p)t4;%lNk=>LWycEkA0l z8DK=W7PSU$xE4ZMIWIzTIdNltAMT@^?x~rvGrw591y&UqX+n6JLOBUxL#f(~s#I23 ztJN%BKKhoz1IM*Q$MvZDwiL{Xp4j_LH!jgO8CvVC?gF#y2C{p2_>XBNAN@$};SD&Y zR|QAAGFn`+>3T7Vbw*i|PS^G2g$+j0BAH2~1E27*bWP<7K3G-SHo$4pyS>#PM`j8X zjfy-pgm{f{Im!8MyxHUCATIJ~G$mLloru4l=4FJ-&B_i-G$iu~E7Pl$9cCv}pYs|^ z4PjO0^420Wq;|D>&>m}wXhZ0A!*74d$SKYOC*kEm7I!5RDUUJ>F6S!^K48mOxv{m7 zm9}-Z5!8iiMTuI2u1KI7#9^4RVg<1iR}}LaXNN_VbD|#5O~Stm~12{}S|5H*&M=C(jA`Uhbvb z+5iPjB}fv;pORhB7L=7OSCTct1{4{ig&Cw5P8QjjQ~!QgSQN`^ zUGX(B&MGC&Wi6^iE_hSP)B2g9B;>ZWT0suLRjw_WGe$$K4`+L1Yc``{jLykn)t2P8 z^9?4v{KiR_t3kuxM9c|gn@Hw2JppD7Rx&Va=#!WP&-*ah5O-1X-<|}PoPzZ_%#xnJ zg0C_O*SvdRsALb`y!bk<8GqJ8#M%`P{`7^=0hHT@6w(z*G4w^^M`~o{r^cIbpDlFK$B0>4`58QrLHA6wIkvS zUK2sJGM6u(ujvtKxc&rBX^K!8jzigR&-_v4p-VKxrmAT*T5U71hYqX6)PeV)vi>fU z4i-#G9wn3G(tFXBK5_5bL7n2#due1jOD9LZo!8>J4FTK4r_~zMzPIzItfx@S-Bt!8 zE2Ue0b!N8WDc$8EqvOb`IrO*bK_`iMP_gpDeBPFUNaEH3Yh&18>B824A#)x&O1yfG z^j^EH#2(ShZn}-#1B^YjX!{3wW8Wm|BWU!@>Yix?)18A6CEok`<|ND&Q3J3)o99PV z!9r7!N9NS%W3|@~$TK0$R)~|SFvM!G%*V`&oB<14$M`XE%VG4+_~i*jp3?~iXL8(5 zWfC0amf&Nh&|_x8PM815E2+=8>Ul*j%2^ZXNqqyjgEpTLur3;W-0#+KGr(h)fd`3+v)c9m81*-j=-3_$(H|B#eYk%pv>r2)5rl>yzi`ZL`;Gc%<3N%LDTxE1%r_k4d8jLnd6bhiF_sCL&R+S|S3p zMEtkT&?iWI-H6Z(fAWsm*%#=y==eNf*|(Gjwb(wW^6nvZ1yEW+6sOX!p}cU8rcbTN zPn=Hc@wITa*%EcjkPU#0k)OHjR6Si0wQ46S+(Dz384`{39{${mXt>E+=q|+^nqemz z#Fxj3PDLCghzRq~C)YN$(Ck6NhEapVi~BIxTPU}$08j&d+c!VmfRaB45?{rG8je$o*oK z?VSF8iEX_;=Bg}Y~Mz^VWQmN|3{pbgX(Ibb4PRff=zSf&bP<(M@|5Z5T ztd34;RZ^v zH%yD|qIUto&0XK$42pc*UAujtH3#zz@4%n=st~F%3`t-i%)Y|Jb^pZEz4|z< zx7`I)x=Rd&)2?B>Ko!(U{p66_uY4FE9UfgCodSKTbUL;ZNnns%jS&xXElOX>Ttr3N z?<@9Vv*l2#XzrgLFQ;zW^|5xo4T#|PJ)_m{(NTb~`fH$6NsyRB!J z&7+`V-G_W5sA^6ib_ETn0PuR&UMbVbrnv|wnQ8qnpX2y$wax3^62fLr__r>SRTAyN zC%Od&o%J{XU9qd-8r+GV!eQ|gp_o@op>VB)h$T8L`)t7(oAGBaGg^&yMMc~-O`x&5 zrNsK7Kq=^4>T|6DKF;|xvfMEzAJLHYIMin~d&(Jg%CKdKWsE;HE_#i9VS(umN;C%R zQ7neKh{CW{@S0x^laTKkq|hzzH?;{0I=niHCO~S7OiHAldAA$oWv=nu4f4D8jcII_nGZGeE-JGO&Ts+(e-;!e9B7s(~)id}NlZD!ek%WGo5+ zfQp=7halae;}s_l2~q)rP@%{y^x&8x+H#wmyMHSCraXF+EvQQ_ZJ#5xncEYJ$2op`*gC`B?kKlaNc9Z9J9X!CHKng-{*-u~z ziVs#@VFxfc3RLoW1<`EbY(-(-`+p-0Ohq=O=z#+O#329wUII9q+x-_~AW7}h2+0iR zk9Gp91-m4KUC2L04B50#&h_~5`y2P?$2Q&uNDbH@YhmnT zq82zb!53Tf?FjszXo4;10zkS)he_aFF;WPIUP*2#LN5Z~e3AMbw1Kynf4;~g@$RqB z5k}k%Fnj|zOuG?>Ntb==$9w__mG`tUBIRz?X?ug7xn2 zut*aYxA#D=X~pc3*aTm6fU{nBoVIrkv*2wR4t2iVV^a8T?l>bhV0WVfgDn=bndcB$ zp`|I9BpC}%kR+6NvJ{kD??Tzn39D^omM?H2GS;!`oaNa)WDqP_scmd zBh5k)ap)B#O@$d)zFfluycFw+2f(162sx67kR+H&&dV)GN+je+SM4b0&ouhE_X#XA zti}-&pJYeicuCZlIq9?N!m`+K!*P#EIy`?}r;na`~Pe~vLZ!(N`c`BN- zP$j52m@J2UBNl!$Rr=n5KyN}4&=ClygN|}QR7iE8*U8A_;QPBUNs3BQHF;9AWzQ-S z1t;S&drm^2qB{XQHYH2InkUl;;w@DYXw^0*0$W7hlong029~T&QybV=Fix4EAvykz zX>JE!y(zTFG-;~Fo$8Ne&7*RiA})Jk*N>D_h?AyVDx5EHTwmJ|@28cv>JDR>4hd%KqCz>wc+%gWU*_2!@_hN8qv|=9%W>zRNzvc5 z%Pd<(GAN{Z&|>TA7FDkvDnFKloD|dO^K6TF@y>VVR#wKNP4)9C{nEjlNJw-_y6h7( zrgf1wS|?I$=<_8YlFl&utsB6eK4lb}i8;%14r>5(NmL!>6n~?;ka#c(Dh4vwt6<`(u??~<`eyWXkrCwg}dGmm^%2b93$=!5o7R8 zX(V-aF`&v#F8CAYA7`G}c}9zDJc4C748I{APnZGfA2|}kq)8Yo#aOkKY(Gr6e~Agc z$PbCJ)9h2dq!!2Y%NV#0lA{{R4~Gs2)DBD%@6%1l6nHA|;Ft`u;O|?Z!|Wnq_zhAw z%0P@mZz3>?+6xX*L`u5nYOa7rg{ZtOC>AMs4Wu0fk21W+M|SUq!GF;T4W7dD7Fqos zVjg*k)X5%z@Z5Xxlpo@|X@!Prio`ZG<_0NZoz$Knfw;GYMCe1yF!Yi*m zny82Tj4jM%S*E$q&o0^7KOim->+z{#I`1XwT|axwnb~9B;E*oe@H?f#mwC<24RjQUE?}J7$dq^jz`usge?IphUjF+pUSX@4-wCgc@oHfn8$;` zN88aw(@zCFnmt+G(g|d^uuQQ>k7+~y-Gc6gScT&uj7>9sHAS#m3*g}lI4*WPi>wnT zR&V9+I-AsRfRHs@{#@GzOUAwfXuu+gF0h7Wu3l9Lele^c=f{)n$K%Y4FaNj$e!H++ z8j?UU9D0{}bI3j$jCw1H6PQACfaFnW(HSmOqS7B$a025KL_q@*4-OhF_UKP|V5g+44&XdePfI!q(5Rb5<% zJ)|ZAe6RbDuL;7$J0bdkziz8x)5e2Jq-w3<$&fwO5Lx%Ep2I5S9c(m1e%8YSvL;nb zs@|w|&=Ms%hYHMuYIn9B4aAWH_wE^n6Pe`wkEW=)YLAWi?BOTDKEk~ZZq*&Z*$4Bd zxmoIXd=!#A4PpVuOCAZXw&D%q4iQa`tWRTOFc5t)T&^+{Ahz{mhwDvXI<;4(8oz?v zjxd>zb_YAbN{f*by%yXV`!9x+oe@v|VsF*Kl6)-v_+3A$5bn*@E z(wF149N#n2xNO51GaU4&Jt&46y)mU z>31j~*Qid5Q;`k?CcH%d*3Q8BTI*1)Wo40$;~|TJ9mygLP^&5WG;*HG3$k}@J4_$0 z<_HW}Mu2{4>{beNDhY8So5B}5p5K#lYlR_@n(iJ8YMIarZLUDgmtgiBRgUJL`)!tI z2z-KYu*ZHTnj3dWA=hr_fpS6qQaCayIz1|yS(Hsxty`RVU;cdF;8natIh9m@n~kKf)YEuml2!Z?;efW9t`EFGK%b>S_;vE%M)W4v3CA5WpY*FMh0z2Fy1iy>1Qf5~hkE)gakn24F7QhXe{UP6P)nOW0*^{2n zcDj1Ka{GQxule|Ve~|CB2BR}#?u`uGqMu{tk4*6k$qoij9I9|D)Ry(>hhAw$A6_y9 z*0m}H+b{C$Lp!mI?>_oAj}C^dHdv6TIB6C8SVBq-^%}0U*LXsY5?$%En5i_sZy^^S zLxO(JIJA_mnf@MzsMT>2SwDFwOC)$>Tx4of9%YqvpT0M+Dj+riZ9EiHK9zAL?DwZ{ z|0tl^f&m{>0&)sj@SmLK3Eo)9Kqu_8)SJnEw5~GprH5H}UK?_#@7L0OJqoAJ_x7X& z>4-~6%ZHQi-o=oUUZfIO$TBv&1t<|Z@n-1xLKC8QUIyhe;I+w zS98ET0b5}wX^O)%qk`;WomXgtHSJ8jgA2iC0s_%pWf)>`{--3Q*s;MNILHBqsZy4J ztbYz=%#oWGd!7|k1*^{d18)@5={fb>EIj)Aif2J zBc#xy<`td5^XKbt@IyKT+L?EpIC$O|_{$gJaUgqs;!ftPmxKEjsqFa5k$1QeJ+OnY zs1G_}s0Up^91>a`B3bA#q?Q;kUWXqM2NV+W<5GaPP<4_sj9A-_o&e~GqM`O_cLbF$ zFJkJCmzaviN(Y1TxwOpO#1Y09|Hi7b@K&(?ixf8S-RLp=hel80n)U5bNnxTyONe2;#RQW8_{WN-T8BK4gl*dJqXYsaXdMRev$mpC9=Qd z4=hSUDtj`28PIvOx!um<*slFnIyXF~8Z+p$^5Zu^w_l{!L4?u0F$~08ON9@Ga!HT0 ze#4ja_MWbrx4&qDjr&hqxWS9`$)y9E!CHnlqdUKg+H=Puk`|Y;i8WU>(gpnl8X1L@ zOtAW*myoxU%P`7xe}8hUS9v0V*7F)ON69M$TvqK)Pu?!2i=69)t@uC_v`)&wYRJHR zz1yfrKvoPley?U^x&XAwp=<&!-X}>DX$Y58Y`RA+J5#Bk!)BO)fhp+guoRZR^G0+v zleZ1ks*=N+w-~Sr?ppw{aYWH+355*Dv~R3(Ka`0Uw?pF9AO_UBe3He)zAdH`{pq2p zJc&JB)Vq7`9c`9mnU8q{kw~#%#hJP(`Jdrm48jqXWJi1=F@*=i#9KREh{H9i-aMo? zA{A6?4?Hropv$K@`ZFas0=N{JU_zP&&~=iSyAhaX2t*l)v7P+cYR+OOvKl`06(1mR zNP-FnCmsB3_Cb_)16_gRfsVhdspIk1#;l%5>gJu{xK|arE85l>v&z?%23$HV27U3{ z@Mze&2$#e@zO9d(8^iSq($t3D(h7V@2USC5YO7&2teEr0#?-eBE>hmb9~^As9kYh0 zA{9(U6EQTmU}QXynuD!sSwQ!e%!GNPN}(?+&C~tYUSdsiU8B6u*C;>!MY#JHpB`5A z$xY<@xXykb*Zl`Z;`(WZpO(25==QJ&QvA_az8fXyBu*q_)H`eH9HSPT@mKzcJQ6T1Hj z*ow>l2AkF_@k_=^d1Q~6&W@PXYU(Ftb@&{3$wj3ov=x%GjO6UzU6BdIc1}PcS*+-~ zlbon6D=QLR_VI*Oupgs7?8V=#g8W!P> z8o6wXo{oIrQpX&ec}`45M~BcsPgCKD3(a7Jgz;sxK6% z9Mg#_=`D|iS+k-X%Qgdd&}*vtgPqh3BLQI*V*H%F1Vg=EjLHo4FMbL9x7WD?}Q&O;ckH~^>Ee4t`RQ# ztphLT)ezZ@1nnORh#c2_rj{f=?OZH)J@<~= zqq`s0!`}O8&o$?o{=PsjCxVYwgFaXcZ@&+3p}s)mu48c!eCHjRw|B;mLnQu}I-GmY z#Ixs!pz1cH9uefOLm{@VDK%e_J`O%jfLF_aiS9ZHz4v&O!yXU4_j1(L&a3?!kbvus z6Nc};IE*jt4ipFXH6q6)1+p*ojs>jSdcvu?n8uKr$YR2}a&2naBQ+996@hu|>ywFs zsucNRVNecBqJ=5e#_AO&x^7KtvzOP$3|i+Vp9si$2p0RV;rrPppVCzGh7)0jI=Z-b z;dW^}s|>SEcx62N7UT5?N6)(^p^&n7pE2MfIy1}JCSN+Mnb%t(JJw=MDm^pE!_G@u z&E`qfpR-~H(&(rmb@EZ7ZJ6ln8QA&KwheNa>$Tq?0t+bkg- zob-I%Ln3PvnPq#omE#65MI|m_FnufEv<%qZm|iw4q1Q~#6P}Lp<1xB(8rL1uFz1tQ zvvzU9moKcPpD<`)>CxNU@}|ruho!?W(EJE6a`HE5!S#^aEU})DPJbu9^oCN6eN6Ai zpSQ9nLyyFPmKasUJoOHpn6g*Kqpo4_ToY{PCVf-xtHuP6Xulw9=@GfS#G211X_FTB z%Fw_d7q#i#FP+b2$}f+|gD;gb`C$$S-V^7nilI@89>`v5KOcg{ZbQepIIfq2J74`F z4*05>qE8i?r!355ITA&!8-gqr8C4RBsY%d3XG;uw9QcdBY)v|@84+1zvdXv~O`6rZ zxrY6Mi)cwAfmceBQSq0UMV|cSbb2NLvUEt(J4jl^g=rX|q8HwD@4OS}M8RgRcP{&cV-sxfH!gPcNe%G*S z5Of9~*fLOa`HS;t-vGr~JlOH8Z}9`A6p0ELk26hC6m~Y|$$I*s{T1&94+Z1piE$V0 z7zb3hd5hWB?#HlWX4@F;sCt_BZbc4-Q^Y{`k~;K5dXb?dV}KQGm1MD^{v9$dYjf5e zz{-cXn%Y*S)GoY~gy-JVHql|syP#16o9APUBs0lKS&%0uZTb*|%!9cUP{zeSrI)>P zdZ>kx6`A4X68EBCXrFEF&%iNv##oUGf!Vcb!$g)oN+%(kdUgsBt+cOfNb?}P?Ddq6 zDd|kN9C3blW5ewLz|@L~3;2@kId=$)Lqn7lPIrHgztMS<4}r(t^rJAt9V{n%(;rfK z3Is&f2Iu|$m4N{DJ+T(6lleVJVEhT@eavyo>X4Let)daJ zq^J0hz)c0fV^F*~-#4iSrojg0^6KO);rac#yrRD= zbcZr-l7HO|TNswnyV$&-*?OKfa(vQ?-g4Co${vlu;_U6Cia?T^1mhliQ?f7_%|!jG!x_y3e|C zHCH9??6%6TphihN7&K&oEdJZY);Ti$RG`3Z_VW z(+gQng+4uLv-=U{HVDtYns(k>NcW0%MdV!ORotqVs8>rNZ!R{_8yU}qMsmES?_|mH zb$vz`sM=9OH#RhiI}1dbRgAuB6gZZ?Av^Wk%r8&TNr*J7WHaYp#ik&R?EIWYj2mk@ zcfu}%O>au1D2hf9>%@qKki$N(2zypBL)C*K7J*J0sd=ub$$FdG*B`#}+vXS!gYtM# zMe9ds^+TIg-OL^#544k~gLW2xH~dWXCRAlMkZ?9N>+^xo&LxQ#TCR6x%v5F_) z@e>;2;DkTCM_)*lW*$elNu%Z(FsLNR$q+XogrgvAYrJSg{+H4U?^ahs_d( zKnjy#*Jc5w#Qriq?~$K#qv}jK$)aMDEf}{v&wZtbdADyXfobS5P*BkI5~%^dC8ahe z4AsUDapj?=(3Up@7HM%qR%0p29_fF<f!L>9#Sz%nD?It3 z^eRo+a9Jd*5l+@U96y~;U*LfR&}>ng>%b^r-ECQy4AD7(-GG`7Lc~POnIXM{q%6kC zLnzstmk{?jc17PkF|j*G$wK zlJlscrZv;AUEo%c8(LCZi7Chx>%acUi2^GS?L!=cDki6m)2x%n%%{qGtq!@7w3d0}AjP6wkWWhAA$y7O* zFo``m6acq48@M^j;S7J-NwCDs?t{J>lVWw|OR&tJB~_Qpdw$o|u0<0q7iX;_&+Jz> z;)5}_TnwYeMUB4AhYEE{VzgXg9uaYj38R(!;m37Hoe_Tj3k*+BHl-fAt^HVz60s1V zyLrhO4%7?V#Nz{RWaO1rJyBQd9}^TucM(6mdYT}g+XzZgQw+)zBk<8O%_XFYbhE8= zWL7xIY{NyWeXcA0cBeSGWJ0&@hrblA@6L~x*%tJ*T}eK!v~ST9PHNexk+B-E?Y7fs znh3JUsewxLqou0%OjK1EYbZEOW;vo!#FNjdS`^^v#%L2@fH~gSNmOt_+^hY5;MN52 zB555p?aMgMM+q978J0|^?H!t{YAC=R2x{D?_%WS!lc4exu6qR8km+Pcb(bW!Q&EwF z`_(MSP8{m2DAgd0ya_Dp+;}IJu0a*W`dU5T5^GZ~)UgGJh1_8xwPTjK74&G&F44XS z_0`R@-BGt~B=vR~O8?qp15Qgn6}&r;o*PJep?j_DOenJMH!mB7llzEQv`S*=_I6Ey znIraDU*>+L=%H=!^{v7xkeClm*$SDZp-7W9egnW!3B5~46}pVfGlntWzvWsVJ85mZ z_4#IzTAKrfcFeT_qVtG8V`!Y*Nx!}S$dU~AVk*IM)O7vZ7!v`RZGlH%njLVw7IW|e z?U=N_%POO3Q>68fy?@R4LiFPvNZ;f|n)Xt5so6z-K$3ELWnQiX)PXScG90UOyd1$m z6#9}n5u9p{D1^~z2T0O9=LbAv*G;W0)nJ0__Xu$gC`*n49aPpXK@9yZ)o3}_tGxDv zOAOYe?tf6H{lSECUf~ba`%Ep%KT}Jhe+%UQD$rTEIN1LU@%L8{AEkU^|JmGrXLs5q zZDB3UgFwtxls?5L&)h{+HdTg{{;XvyJ*(Nx+c_SrEv^aiqD#`n3GM=WQVvwOsM)D5 z#(P+pA7$)iJilHo69AEQj1Wc@u_`kz)>fF1fxwlIbrh4z43prI;l*I}7^?CqNPaeq z3BQC;tqbt(&Ov!I#B1jHq;J}Q z=Gicl>~i9z@E*Ue^W3^&PA(!3G=KF9FseKB%-`bLK&$KZ(94T|r7KHVQ~UO_B-j9# zIA8J3Y@Pd9@te)SD7VK(G-}z92oh+AoL?fQd&2(jHWoW1dsy7t!6GNU;!%s4BeZyl zLer+VXxnf%iA5G4`qy-5b3=FqSXq;y9$ItE3Yb$pOcph??Na|&O~z~3X)JqvL_Z_< z1)(%`u@Kg^h(v21XbdxYCS3u(_Q_3mWZ~|4e~TKEPK!5-JGktN0b-jZ+@mflS~tL0G~^LkG!zg&kcjMO z(;~MB2>r!OuVbCjln5hN`*+wcMKf{+^&+N;t+ER>NjFKT^ z_xH$6^k?&|7(gM*roNF4cOx5`^q=_&n`lSE!)K)_KVX!-QBHAc<0(!+U4zjC|n-^)^TG zdsz#vk={gU(FqH^UI%2shgKR5PJw)7XKNjrW}`Y*Cs3^przTJdUOiE&lM?g#gr6QV zQ^wcX@RMVnT{hjSY4{D};?9$Nl^@#5E4Px_RS>0$g7koxQYI%d-ASe)>9HJP=&^s77Y*1JZp=Za?^?UEb zU%cY=^kmEnZY$^8`?E3Egy&Q4m}a`WGXVrnIgjS(B6c2h>|2Vr={kj1oxz1{<`frB z_^PK}k2b@JT=4Lr}3GqS5T&-Crn{moqu z=myG^IOK+N0XepuVDr)wYu8BL6$ANj%L~`w-q!sXvGqGLEjGO_IG0rSAgN@GUNZ(@ zvJ12|U;-#DY`>PsYP^H+{I1+5+x(U~H60%2cD^vM3E^~hjK#NgOXswmQ*DtTSI1XP zM}~$$9`+0gc$~7pi_-Cop>R6akgebwJi(0QtZ;!}<>SI7B`^lh*(>-ZT;n%csnJLV z57FrDb?>amoCD5TvX=k~{jV!imgxvJd?-V%?4UV;2qb5BNS5rtti}OTHo06ahJJ_J z`M_<3{_l!j^uUSCLRxUHSi{`M%o8}d!I+jzz^)shn=^tM+hxFQUu3{Xn36BGcjuzg zb2t2DJT`%RjQy^?#R)A4M!s2{7v_VvLFHiC3vg`ghAV`9p8$NEsxC8`2~;bzcuMDFledJJv_F?C6Tdt%`; zZL6f8h}aZAsPfWMDWs0&l9KCpzY<;O(lV=qtJLpn_U=r4A2jb$k2W%At+%XbY>*<) zOsI%19;(`v>%F@WGhn#8m!Y31{TfSWf){k->j4x%r$Uz*x#0T){I_yiq~%zo)azqD?hUa< zC_P(^Y$3JKV~s6l=OFwwfq%WZf7*FpR|>b*KBegTDNWLUljdLR@(kiuwytK*|3)z2 z6FVsl!h{+;eetuwgl=~#iUy<2>RA4`PLnc``U!Lya}0Lgbi{O^D?O55kf7|BIdwqT zL7(oAyEDWWcQ(pe%vI0x$DtSIvp5YtbMyfhlgLP^-NEYtM$!Kp!c#5f{#2epBbIH5CeKUL$l+yT!ATc}VEJsQ+SrOsZ5yGd6yj@!W(7uHCX5Ez z*jS{**)yf&X)qE?%taw6iWd{vY}3k^Ns_(DREuDBnn@dYw3~{|@~K1=R*R)bl?Iv3 z8&n$%T%k6V=gXu@u<0ssim_d47F8mWYvs0-vC>nSyuK<5m{}*UIi!!7ZBfhyg@jAg zLQ)$QI-45IG0x9g=`2^2Sh+|Rv>92cXiL{pYR{tgxVzaplXJ zS{4&o6&_ch154_4Qh*m+e}9Nw@j}bcWBE|trJ*s_<_et& z!o%3g;G8dR?CkiY5HD?B<1Sy)Jl#QQ&_xnn7$D}l7NF458ltdTI&JD5&7k?BJmi*a zzg+^TZfW%g#u|1^e4?R2kiBaJI53j#>3CBVARtI->VQwINs!vo4_}y(pZO3BATaw5 zC@}jDF)(w_iv4Wbl@ZkFZg(Z_a_{J7_FUE;3sn7jC_;wK}POxjQe2#*c_aX?ko9 zE`VmHJsMA(G;3CMi20q7Prgkf!MgW&q>ioOR>4Z)E5um5E7Z?)X}<5G_A?ONCYVPT zT2Od#rb@e>vkYMS6koohY*H)@NuD{!(As|DL%{HTH05ER%|zpoUKLtoAmFhU(+D|( zEaT03wDX~n%$*^9d$p7$lbU#p*c$dw1(4AzE$|B$U~E%B9oy*iL^O$k4r3_tL44Ow zl!T4L%npnhz(zjc0=+d}r0d;MxDfva4ziBa6Idb<+u|Eipo3FN78;S`J zgPR1toKjwr&*UiiH0O)c_?aoVWn+*oGZ+>fLBU<=2nHU(!D)o=Ajfcz6i~LLRur$; z6^%HZzfd`!&teakogvBKQhkFXj4r5hXdl2Vv42H*|61|RW?>YZDxg@?Y@H&t8?XK4 zDr5Nf;M05j6DYW|rvW@c>Tvqci0fhLT>`QA2229C3yn_%(#W1bux)CL^TJuDbRH#V z6yFNq{-tRm^OAzkZ({6WDwXu; zE6beWwzs(DaI@fdfLv@QvTFvO&wZZLTo?Bt3UKFxk z|FIq_*<_$s8j$i-YGD2NsiNMK_~at!p53s{fL6H*Me8czJv-a9VUX{JXLL^VU*qpZ zOQCkH$^vq^kAIY{(7ss~cA>p3cc)PoT>Xb%jsUqD)%^6y4xhQY)PM8K|C0%Q=InMx z_NKB{_J44jUCjP+NTmPywevqF87h_aWWETY@+~ij%`?l%IQjgIU?wKwvPwu133RgmH>b;Vr$x)%%fs83ZOjZY+FT=}%|7rv zBO!JZx75s0EV5EX6d*5=+Ve%|k{3(UF{|v6!`>mnt5#=05nK+jHMSpM%DS zke~__c~Ya*`y}2N3zE|60ZPNd(-0GUQcv6?0z>w;2e`bQp!zh$gdkTUR-02xJZs_7 z^27ysLO`7EvXjWg>U=8M3b%aK`IcWo^)DH#UBb2JR+~t}$wH<+88sg-u)Gxn6TV~% zUt*`T6etO()}SvD=;@$G1Pe&kIT73*CSOr*j3Gn6pG4W2dX9H6vBrr-`()R{(neFx zj=RUjv72B$JpT@)m@&~-G1ift^)lzrolr8-4<@T96d;PBw%#BKTufAvATuKy!A@54 z{6{Lg`WZUVJR%4{f0kIXKLOzWJ(c}Ctor+=WUX9W|6p(b9Yd(;d0?xdZema-z=}xY ztZU=YRHh>5!_Tr>$yE?TB}wAIr7pZI8nqB5fPE4N29hJZG3~(j+@X= zcf!Kb1ShHyw73X7tXky6cs(Ee?0yHY2@*lGaPmqIc~mW|DK^HtDsKryQ1uQA(DWrW z7h|#wJ1CAozKmEMrXE{Cu2(=+Mcpt7dxc0&8D-I};zW|h59g=pnZ_y z`c0+JIBO6CpP=;MnD5W?p&)htcISC_-JQ1pO*G!>`Q$iIMzD2QLrpw`)mk;p_%ULM zuS~Q|x?EsVQWe~I%ll+93;eS@p06`cQ@L9Ox-W?hdgJvaY|!jrrl2S9iL^El^c>h~ zCONbk*(m%<_w6JoYn4{1pR9~iI~}P$#fB0hXl!6PHYH6(Y1CtAW0pw`A3G){dC{6Z$11BO2l0MdpA?&9;4L3CRpWHcH_3Jq3ZMExEZ*L2}PakUadMcoyjz+v61>fkQm40|~L z)+8zFO9H$!1|Qn0v}VP{3lYcYQNQBP3vYa@7YOND0c4q?fy(?VQbrAt(^e7SRIoBWnF2wB8V|4r$6>MPXIuiT!uMeJW!Gr{YM@ zk^C_g3@Oj}6JrEC#_(0O4sn20`tY$=l<%^XK}=^fO9RXVl3m`BkQ79ATk5W!tN^6X zWGwo&R~;wugUJa4-Qywn`{6bBf&Uu7o!K*xHk5A~VRtPzNwMs{qg0RdL0=x@b=W{QF=yu;v{B=bD}XUNEkAK*Sn8DvTrfs!4Pgc^C8j{j@&FjkqCcMpn${*vrO@^!SS zr-nAYj8xwPx{pCzH|6~sH~svH&Mz@*Xc|`t^`jpj{{fJUh&CUn^!btip#cFg|9?7z zzh0Isjc1b#GrW%ut2qw2pKkRSuC6+mdQu7Id6iWKo7~HFLV0J7kLt6XazC4{BonR= zC!6GF<-kW!J7#y7vW7b@K-ZE+Gb!;)a>Ir@5U&j0Fb1aY4ku^#?Hu1?kG^#u9eMF8 zWWQdiqyV{Y|K$JmNt*WfwA~j@?dg<*DIc-pOMu@K$h>v7cNm0;kK9ki)G;0T_*w&v z5IIR=d=JdPe>@m!>a95>;a!4(d;e5|L4a~sz`wAwxA+7q53@Twa4p5ae=zvN%v+pN zfG&i^_^AT0$?pwsVdkwrgwgSok700|hj!%s#N0(3PgZM~$QiO9z(3NKz4e z&uJ1fth6*SIbM;kYFKu1C2b*pgARwg5MQ0dN+m`tnLU(FAJe!3t&>VKOj;Cn&{tY?vb5$nZ;s@hbv7%~=#m1aN#lx*++nwR z1!1vVyBN?%L1RD&J(@kjk00V}CMkqTiad#7Wwm@|d6Aty$Ltht);c_ijO4_jbEv3H zb6>JYF4|kELL5VrrH4Vu*-+A38xfn=1a+vKE6GAXyM_fVx`JQKTG9OuYXuV+5izOI zHryNKTh&YgUe0h$k<9yvO}I6=Idlr6qQ5v47wC7Wj$14ma`bMiI1uP92|^v zDCwjJosE?k2P!9wuKWsE(>XHKRd?1}r)Fs-Z&QUrlMz)YHYp1eCM}4@y$53=*pIU& zA8=9$@!P?vaU6$G6jmrbhrL&4lfFDj7W*p3b}m~ORU(cIK5kI#y$s!sYCBj-YZ%(0 zIuj}f{W9nX!#?^H9q_|RO89k=6$;F&R-xAySCKK?M|Rjzv)98(t5-3KsMuVD)UhODjO5%>_G%D zc7gaC6EFd!L;lbl>L)B;dZQw25g`Sb)I>D7GQ@^z6A^b6}*aD_7fzTT|VbnCD8GMS;F4 zr44uTlzSY~5E3_hmHw*k=)btnWj^1jRpw1|+aIma>TZgYXR4%qoE$wXM z(h^PVY?1sNsxBNHCJoAhl#V{9MT?q}HH}WK@K^5J5>vgEuhcq@Xn`EI^qbh9iMA&= zLPNr|Md2`}=1Z?rW4#`c3gsyxn6IEf!7^nrGRTFwI-wUq1COmTrVW}D-ZlwTl zyk^JM9I{=Hk`}kL%ba9hu?ag}7|ZDif6onC$#(GONPWjQz-iIY|ydpVeTY7B<&tN9CJ3&|GrKChV!1(je5 zwR&dss~=|$XgRxFd3~^3@ZqZ z-(`AzVamAf0uDy)bnyy7!(D6~;gzq6bzhGZZ%8+uizvD)cpXMD_g5ehhQGDcg32fb z9^fuJe&ri;?W^g=#ZeS2j@9(Q=AC1F2b+UgSy1d|RpI3?= z7Mi+`9Qz7WRs+IgcXhQL9(gwxc|A8+mWOC`9elfM4T*qQ80*g6wuHQ%YSc@A-ZU`2 zA_C?u7G@Dl*OKEMFoppeVy?soLxzww{W2#d(gwZ%Y|AnzEt%}7+o8yOTj&MV4D=>F zICMBu#NtV`u)&2}rNfExj&0G`=&-%ZM7gu39VtCY|4pHd z6q+m28v4X3r~g~N=2s-QSBCs-O4cBYSxqmvP%T}a(BiMOKWvT|k>MHEIU~xW+b5a9 z->;+)@Lm;AfYS%>T^-QN8TLZ3$_?)h>SMSZ{lK^b%%{q&1eY{}Q43fl6x|LcPUoatjIX6bn@L+)pj!$vwZ^Of*h@4`w!-BFVG6NO_@NYQ@>0nKJhB3T&?* zCK)RY2V0DXQR^a5cXc5rd?0ahBy}TfwmJIv$maVANgNl^d%w6dg z_V_>xQVcr&8(R;K6|~FBKn_>n-d%Yl8cHDt`FISe4U>CJ5GtKHkp=SfUUJ|OUSVXG zN;XnNlm@IIb%3#H=CwSvTE$fFgB4Zwb*c> z4SHViJtX({CPj|)eYjXn(j;6!p^-KQsA&L;P8B^+4cq)dj`2}fzRJ9Q@Vu!qv*>ep z{XEA5&`qOA0IY8BbCK9+seKw( zDFF5hVr$_*VWw(l#Xy~?I5-yWORu#bw_w>X7v#IS``-z5$_X+nm{^!tshEO(alvu^ zY5rgX#)e?=vaq)QF&z+Riy+tcnYPY+GI9LZwDq6e04p<>zkE06i2|?m$pQ;QeKuQUZ-_T&^+-* zFrb>M{W269gxcRXtHlUxp|LP1(-hY4k5EyKG6aDS^9*JfX0h_ zoLy@>o`nWUMxG4Tmo{gjVn}GSYF^b=Yt8-mYmr#Pcr`u`BgJhv{xNE>=5?S9GIKOJ zQ`ovwIyX_J(QaO9QcG;v_0YASjw@M93MP{kSH)xUliF#mWct=@9n_agpz~Y5Dr49Tzjka{0W_L+gFijvddc z0t{E#=O=+fETbG?>@pqM9cndh&8LXF!^w<1y`JM~VH|vJ?PBThoO-~q5HJ*&i%dC3 zTh9kuNlW?eel2e~&I`ab=?rRkB13YM5(usZk?|`1QUJ>B7HE-P6FBlE%sn_bFy2{1 zBR#`w!*ozW#x1ER(su;xVn?BV3CVFSr73eXTgw_H<50_(f;@m+G9%&6m*utB=;bSC zGLAhwzhVAm6uXCpui*!3eZPba8L&AOiQ&*%gFlQd{p!YV6?Jjj0+KTbR`k^l5R4f{~z~PpxA-Htk;rOht3pR=57&|Yp z5WgH}kJxH^QrR;n7fD&a&rF+RUN^6^aMp+Qw{LoE%pteYoE+=?(>7u{!lN}&Wz{!g zkMQcRx1S}Ki#DVq1<}OR0#ruCVZ$f`B!-#hYv`M#Qas$>EK)}6_=XHGX$`T}upF(Q zAdgtE+vp)q77F`71)05Y3h$OAG@ZYa`v$W|UdGg>9>k=b>Z8t8IlnyYEM;^2wR^XIae5RNTSY?(Y(w z#)*fD80v>y{2|#%!Ga<*7%gNGs}-4%fp!@iYbrLSGUaYS7dgYu;;+sZ^xPJ|_LjW> z7=q1dB(NAcBwqZtQ-Xt=Dbu2c1AjgWkIRXT1COhT&bycC?&Xg!HBc!5mcuBSxO@9j z^4YulCx}biX^7E#TJqTmxz|p#L4?dirg^tk^g+Dxj`A>uB9NV!Dc9aWaX|UV(7?9) zHYmUY!ZSueu>+(O4A-St0bn`-D8%0>$TH&{)ALr9<>aUUWyM8UFL4X{;Oql6lt#zN zmB$Yy%8m=*iSL+!0x68Ro94&zF*FoOsU|kTnnN=z(N<+`cq+Cg!s7$r1F>^J%Wx`mG!QOQVl#-4cFgZ6^6A?i%C=)_t zNfVx7AYPV)Ayo`jXhWDf`d@pIT(WdK1G6CO=i5@I0j#y~Zag!0!p>NtHq;h9<%eyu z*$2)%`68947$j3!YG{$%*XF4$Q`y6ec7TO0MH! zxiUlG^1Gf|eKgEdyO{tDr)VQ7xSxJj)GD}zfaPm$jL!v>4CbxAb>^+!uTWQGo(Nat zPe4az-eEDA#8vgu_g`(OTY_WAbYpLz_>*q1_>cDU0SufY3})WJ)mYq{MWF?oB6M;s zl$77PynQgWsUJ)86;H8ju5`a8?Z+y9;t~hKp6MI^w z`$}Aa_XzL1F$%_gsJD3$v8Z>y{Ozc-RT48nrT;}qrGD}Bf(XM-&utf~Krxq9X&|3~ zF3TpgTYM=oo688BTR_=9bgIP0{hn4)e*G(G_(w`%L*CJ-=?@;M(*ZE-0TDX*`YPdO zC)TYFX{B>o38JbmdMHueg%&^Op*vp4LYBBxLt8S??hJ&4*|fTX(7z`U)33LtsM}Pp z;PpgLg+{SsE8LtZ0?)92Qf$^)j;Mq3IEZi`xkwt=T>LWe1oExu(XJrr3gnOD)r?`h zavli%I*vkeFR*rn^olT-nVzp16V4>*<@CaBx*}VDcO8dXL%|L5z2OzR(2Dh%i4o4= z7kI#M7{X-k4fej3=kruPaeDF2&be`KU3uRkdj3Uhn6HRQQhxm1kA zGAiBf`!Bc#g0t-2QyR4oqFS$n^EbVeNbmn!~6!<|LCm!dEJEr_XA`Q_P-A@0!QFJ6t!fQf<<5RQFWRMi67Tx|QBnn9oOW*g#3X=pVW zB+fCdndS9xvSTynXSD;+4^HP;kxBpHwm?2s+w*nKnpsj?T}iTgGNN^B1SoX|Z`2@X z18Sx)199SS*AgmKs;@@d3ZcHFa$S_#FIrQOQNEZ_ol+CR`lvKy#8>qGF2Yu{zmihH z;=C7`RfG1_y^^{HwzFw9pf;DN6@s<-M|(I#SxjR0c}LFmXN-%zj4E7r4@0&$LY+{< zY^;*$ih0~9-ZQTH#J9wt%y2^K%T~x2mQx8;Wg|K67gyTxp`<#Dws z-jKMi*YA!r0Ua>IUo7xRm=3vfauN7Vw;eYmBiK;6+Nk`U652;SC2IocsuFJM5P5XM z4tQKl4@bH_=4}{G4pjK~uShF4|8Wg}hCR86@;)d&uL0`w8u0%Q*PvnLYWdea1ji|T zb}bQyKWx^Dw6xF{L@@azks5y4f+B$jBps`XDwM+=;UDRrUqJab;=cg-lvqxM!nPe7 zrDDBzKVLDvegenBZ^QE7H}Nj;*}^0iQ%g(b`nqnwEvk-6rU~kcQA=rmIq-)EIG36U zzmrcXwAI3yrea?d%0&^;yxuLeZJ&%0%3p+4xee^8q2o8=!uFvwmW>XGyK3EDAvbHG~dgJQS(MwYXJfkNZTyancuMCJ}` zGJAk|;?mre0ich-Rmv;Sq0}mj_-Jy7AaP2JP@ca0YkujErq4P&&LDn@IREo-|2GkT z_KvL_-E9A7*_}b&;m`b>i?W%Wk(K>_Frs9|cK)H437)pQ10gCZ3I-!*H|!BE(-foy zBUM}gmUidR98|N`kPqjMpHmiUYlNR#m}6Evs(etj zH9Ye$^A}16lR9(eZ-wI|g*L)W@}8!uxX*0}c^B4W14iAm@F7(;hul z!LbIaF(#YaqOADWF5g!COP*>yK?|NYCpRikyMM z8ELf5cX;R135;7~JHx7pxIiLJ+|cflsML;YI~Om)nD2ml&gUi14!$Xu9%tf3R?(Jf z#z=7nXQT)8xOI*vkXG{vQf}K<{IuqRd0*sVF3IMvm=}a<1g?gDsG?EwkBY|1=YR4^ z+NqiTG|igN`8VqStM2?&7WlgwpsJ&QqJ;P^-+tlVtd^_Xp{fL0i_x&rfi4A*HdbZ? z77hp>x_A&&sNb}EF#c8jR5hK8ASwmudMN<7G{LD7wjkKgxuo4qa@Fjg9q!-3Uf&!ws`Rf`Pbp?SDjBD*RK`h+~~X-9p|?YFEasT;y{?}9f? zZc4A$h*8wQ8gROsNon$Xl*5jK38jkN(x7r+CQ`@;vcN6`O=<+VXSJV+ZxYKi9j1mf z8np;-d5I4?K*tyr+C7=Oq`k`hxJmRXrr~CW>{s6L#P;#CX0lFR1%C`0|1c-u%gPkG zOP4ofQwRAH^P46q1-4Y&vLvByN4R#0c?%nDyr!APri

&R7;REBZd0NaNVcN6Eoy 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

?@Ib4$R$ZbA6MIsF(ZEk4Ii=sfRBa)&Yo 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�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 TY(h;@!?}i$7z!3V8^-w`q)kqw literal 0 HcmV?d00001 diff --git a/group20/1107837739/1107837739Learning/src/org/korben/Main.java b/group20/1107837739/1107837739Learning/src/org/korben/Main.java new file mode 100644 index 0000000000..671f67a9a7 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/Main.java @@ -0,0 +1,8 @@ +package org.korben; + +public class Main { + + public static void main(String[] args) { + System.out.println("Hello Korben : )"); + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtil.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..87ea998621 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtil.java @@ -0,0 +1,258 @@ +package org.korben.coderising.array; + +import java.util.ArrayList; +import java.util.List; + +/** + * ArrayUtil + * + * Created by Korben on 26/02/2017. + */ +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + */ + public static void reverseArray(int[] origin) { + ensureNotNull(origin); + + int length = origin.length; + for (int i = 0; i < length / 2; i++) { + int tmp = origin[i]; + origin[i] = origin[length - i - 1]; + origin[length - i - 1] = tmp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + */ + public static int[] removeZero(int[] oldArray) { + ensureNotNull(oldArray); + + int nonZeroCount = 0; + for (int i : oldArray) { + if (i != 0) { + nonZeroCount++; + } + } + + int newArr[] = new int[nonZeroCount]; + int newArrIndex = 0; + for (int i : oldArray) { + if (i != 0) { + newArr[newArrIndex++] = i; + } + } + + return newArr; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + */ + public static int[] merge(int[] array1, int[] array2) { + ensureNotNull(array1); + ensureNotNull(array2); + + int maxArraySize = array1.length + array2.length; + int[] mergedArray = new int[maxArraySize]; + + int index1 = 0; + int index2 = 0; + int mergedIndex = -1; + for (int i = 0; i < maxArraySize; i++) { + if (index1 == array1.length) { + System.arraycopy(array2, index2, mergedArray, mergedIndex + 1, array2.length - index2); + mergedIndex += array2.length - index2; + break; + } else if (index2 == array2.length) { + System.arraycopy(array1, index1, mergedArray, mergedIndex + 1, array1.length - index1); + mergedIndex += array1.length - index1; + break; + } else { + int compare = Integer.compare(array1[index1], array2[index2]); + if (compare < 0) { + mergedArray[++mergedIndex] = array1[index1++]; + } else if (compare > 0) { + mergedArray[++mergedIndex] = array2[index2++]; + } else { + mergedArray[++mergedIndex] = array1[index1++]; + index2++; + } + } + } + + // 清除数组多余部分 + if (mergedIndex + 1 < maxArraySize) { + int[] resultArray = new int[mergedIndex + 1]; + System.arraycopy(mergedArray, 0, resultArray, 0, mergedIndex + 1); + return resultArray; + } + + return mergedArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + */ + public static int[] grow(int[] oldArray, int size) { + ensureNotNull(oldArray); + + if (size < 0) { + throw new IllegalArgumentException("size must > 0"); + } + + int[] newArray = new int[oldArray.length + size]; + + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + for (int i = oldArray.length; i < newArray.length; i++) { + newArray[i] = 0; + } + + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + */ + public static int[] fibonacci(int max) { + if (max == 1) { + int[] array = new int[1]; + array[1] = 1; + return array; + } + + List list = new ArrayList<>(); + + for (int i = 1; ; i++) { + int fibonacciNumber = getFibonacciNumber(i); + if (fibonacciNumber <= max) { + list.add(fibonacciNumber); + } else { + break; + } + } + + return list2Array(list); + } + + private static int getFibonacciNumber(int index) { + if (index == 1) { + return 1; + } + if (index == 2) { + return 1; + } + return getFibonacciNumber(index - 2) + getFibonacciNumber(index - 1); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + */ + public static int[] getPrimes(int max) { + List primeList = new ArrayList<>(); + if (max <= 1) { + return new int[0]; + } + + if (max >= 2) { + primeList.add(2); + } + + // 所有偶数都不是素数, 所以这里采用 i += 2 + for (int i = 3; i < max; i += 2) { + if (isPrimeNumber(i, primeList)) { + primeList.add(i); + } + } + + return list2Array(primeList); + } + + private static boolean isPrimeNumber(int number, List primeList) { + for (Integer prime : primeList) { + if (number % prime == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + */ + public static int[] getPerfectNumbers(int max) { + if (max <= 1) { + return new int[0]; + } + + List perfectNumberList = new ArrayList<>(); + for (int i = 2; i < max; i++) { + if (isPerfectNumber(i)) { + perfectNumberList.add(i); + } + } + return list2Array(perfectNumberList); + } + + private static boolean isPerfectNumber(int number) { + int sum = 1; + for (int i = 2; i <= number / 2; i++) { + if (number % i == 0) { + sum += i; + } + } + + return sum == number; + } + + /** + * 用separator 把数组 array给连接起来 + * 例如array= [3,8,9], separator = "-" + * 则返回值为"3-8-9" + */ + public static String join(int[] array, String separator) { + ensureNotNull(array); + + if (separator == null) { + throw new NullPointerException(); + } + + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + stringBuilder.append(array[i]); + if (i != array.length - 1) { + stringBuilder.append(separator); + } + } + + return stringBuilder.toString(); + } + + private static int[] list2Array(List list) { + int[] result = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + result[i] = list.get(i); + } + return result; + } + + private static void ensureNotNull(int[] array) { + if (array == null) { + throw new NullPointerException(); + } + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtilTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..9f23e2c341 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtilTest.java @@ -0,0 +1,185 @@ +package org.korben.coderising.array; + +import org.junit.Assert; +import org.junit.Test; + +/** + * ArrayUtil test + * + * Created by Korben on 26/02/2017. + */ +public class ArrayUtilTest { + + @Test + public void reverseArray() throws Exception { + // test reverse even number + { + int[] testArray = new int[5]; + for (int i = 0; i < 5; i++) { + testArray[i] = i; + } + ArrayUtil.reverseArray(testArray); + for (int i = 0; i < 5; i++) { + Assert.assertEquals(5 - 1 - i, testArray[i]); + } + } + + // test reverse odd number + { + int[] testArray = new int[4]; + for (int i = 0; i < 4; i++) { + testArray[i] = i; + } + ArrayUtil.reverseArray(testArray); + for (int i = 0; i < 4; i++) { + Assert.assertEquals(4 - 1 - i, testArray[i]); + } + } + } + + @Test + public void removeZero() throws Exception { + // 测试非空数组 + { + int[] testArray = new int[20]; + for (int i = 0; i < 20; i++) { + if (i % 5 == 0) { + testArray[i] = 0; + } else { + testArray[i] = i; + } + } + + int[] newArray = ArrayUtil.removeZero(testArray); + Assert.assertNotNull(newArray); + for (int i = 0; i < 20; i++) { + if (i % 5 == 0) { + continue; + } + + Assert.assertEquals(testArray[i], i); + } + } + + // 测试空数组 + { + int[] testArray = new int[5]; + for (int i = 0; i < 5; i++) { + testArray[i] = 0; + } + + int[] newArray = ArrayUtil.removeZero(testArray); + Assert.assertNotNull(newArray); + Assert.assertEquals(newArray.length, 0); + } + } + + @Test + public void merge() throws Exception { + // 构建数组 + int[] array1 = new int[10]; + int[] array2 = new int[11]; + array2[10] = 100; + for (int i = 0; i < 10; i++) { + if (i % 2 == 0) { + array1[i / 2] = i; // 0, 2, 4, 6, 8 + } else { + array2[i / 2] = i; // 1, 3, 5, 7, 9 + } + } + + for (int i = 10; i < 15; i++) { + array1[i - 5] = i; // 10, 11, 12, 13, 14, 15 + array2[i - 5] = i; // 10, 11, 12, 13, 14, 15 + } + + // 测试merge + { + int[] merge = ArrayUtil.merge(array1, array2); + Assert.assertNotNull(merge); + Assert.assertEquals(merge.length, 16); + for (int i = 0; i < 15; i++) { + Assert.assertEquals(merge[i], i); + } + Assert.assertEquals(merge[15], 100); + } + // 调换数组顺序 + { + int[] merge = ArrayUtil.merge(array2, array1); + Assert.assertNotNull(merge); + Assert.assertEquals(merge.length, 16); + for (int i = 0; i < 15; i++) { + Assert.assertEquals(merge[i], i); + } + Assert.assertEquals(merge[15], 100); + } + // 测试空数组 + { + int[] array3 = new int[0]; + int[] merge1 = ArrayUtil.merge(array1, array3); + Assert.assertArrayEquals(merge1, array1); + + int[] merge2 = ArrayUtil.merge(array3, array1); + Assert.assertArrayEquals(merge2, array1); + } + // 测试相同数组 + { + int[] merge = ArrayUtil.merge(array1, array1); + Assert.assertArrayEquals(merge, array1); + } + } + + @Test + public void grow() throws Exception { + int[] oldArray = new int[5]; + for (int i = 0; i < 5; i++) { + oldArray[i] = i; + } + + int[] newArray = ArrayUtil.grow(oldArray, 5); + for (int i = 0; i < 10; i++) { + if (i < 5) { + Assert.assertEquals(newArray[i], i); + } else { + Assert.assertEquals(newArray[i], 0); + } + } + } + + @Test + public void fibonacci() throws Exception { + int[] fibonacciArray = {1, 1, 2, 3, 5, 8, 13, 21}; + + int[] calculatedFibonacci = ArrayUtil.fibonacci(22); + Assert.assertArrayEquals(fibonacciArray, calculatedFibonacci); + } + + @Test + public void getPrimes() throws Exception { + int[] expected = {2, 3, 5, 7, 11, 13, 17, 19}; + int[] primes = ArrayUtil.getPrimes(23); + Assert.assertArrayEquals(primes, expected); + } + + @Test + public void getPerfectNumbers() throws Exception { + int[] perfectNumbers = {6, 28, 496, 8128}; + int[] calculatedPerfectNumbers = ArrayUtil.getPerfectNumbers(8220); + Assert.assertArrayEquals(perfectNumbers, calculatedPerfectNumbers); + } + + @Test + public void join() throws Exception { + { + int[] array = {1}; + String joinStr = ArrayUtil.join(array, "-"); + Assert.assertEquals("1", joinStr); + } + + { + int[] array = {1, 2, 3}; + String joinStr = ArrayUtil.join(array, "-"); + Assert.assertEquals("1-2-3", joinStr); + } + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/LoginAction.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..20fa9e766b --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/LoginAction.java @@ -0,0 +1,41 @@ +package org.korben.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/Struts.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..7ac88522bf --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/Struts.java @@ -0,0 +1,111 @@ +package org.korben.coderising.litestruts; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.korben.coderising.litestruts.dom.StrutsAction; +import org.korben.coderising.litestruts.util.StrutsParser; + +public class Struts { + + /** + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + * ("name"="test" , "password"="1234") , + * 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的execute 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), + * 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + * 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + */ + public static View runAction(String actionName, Map parameters) { + Map actionMap = StrutsParser.doParse(); + StrutsAction action = actionMap.get(actionName); + + if (action == null) { + System.out.println("couldn't get action: " + actionName + ", return"); + return null; + } + + try { + // 通过反射, 创建实例对象 + Class actionClass = Class.forName(action.getActionClassName()); + Object actionObj = actionClass.newInstance(); + + // 调用 parameters 中的 set 方法 + for (Map.Entry parameterEntry : parameters.entrySet()) { + Method[] methods = actionClass.getMethods(); + for (Method method : methods) { + if (method.getName().equalsIgnoreCase("set" + parameterEntry.getKey())) { + method.invoke(actionObj, parameterEntry.getValue()); + } + } + } + //for (Map.Entry parameterEntry : parameters.entrySet()) { + // for (PropertyDescriptor propertyDescriptor : + // Introspector.getBeanInfo(actionClass).getPropertyDescriptors()) { + // if (propertyDescriptor.getDisplayName().equals(parameterEntry.getKey())) { + // Method writeMethod = propertyDescriptor.getWriteMethod(); + // writeMethod.invoke(actionObj, parameterEntry.getValue()); + // } + // } + //} + + // 调用 execute 方法 + Method executeMethod = actionClass.getMethod("execute"); + Object executeResult = executeMethod.invoke(actionObj); + + // 根据 execute 方法的结果, 获取 xml 配置的 jsp 页面 + String jsp = action.getAttributes().get(Objects.toString(executeResult)); + + // 调用 get 方法 + Map actionFieldMap = new HashMap<>(); + Field[] actionFields = actionClass.getDeclaredFields(); + for (Field actionFiled : actionFields) { + Method[] methods = actionClass.getMethods(); + for (Method method : methods) { + if (method.getName().equalsIgnoreCase("get" + actionFiled.getName())) { + method.invoke(actionObj); + actionFieldMap.put(actionFiled.getName(), Objects.toString(method.invoke(actionObj))); + } + } + } + //for (PropertyDescriptor propertyDescriptor : + // Introspector.getBeanInfo(actionClass).getPropertyDescriptors()) { + // Method readMethod = propertyDescriptor.getReadMethod(); + // Object readMethodResult = readMethod.invoke(actionObj); + // actionFieldMap.put(propertyDescriptor.getDisplayName(), Objects.toString(readMethodResult)); + //} + + // 返回 View 对象 + View view = new View(); + view.setParameters(actionFieldMap); + view.setJsp(jsp); + return view; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + }/* catch (IntrospectionException e) { + e.printStackTrace(); + }*/ + + return null; + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/StrutsTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..024f678100 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/StrutsTest.java @@ -0,0 +1,37 @@ +package org.korben.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/View.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/View.java new file mode 100644 index 0000000000..f4af03febc --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/View.java @@ -0,0 +1,26 @@ +package org.korben.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/dom/StrutsAction.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/dom/StrutsAction.java new file mode 100644 index 0000000000..c16de22c44 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/dom/StrutsAction.java @@ -0,0 +1,27 @@ +package org.korben.coderising.litestruts.dom; + +import java.util.Map; + +/** + * Created by Korben on 03/03/2017. + */ +public class StrutsAction { + private String actionClassName; + private Map attributes; + + public String getActionClassName() { + return actionClassName; + } + + public void setActionClassName(String actionClassName) { + this.actionClassName = actionClassName; + } + + public Map getAttributes() { + return attributes; + } + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/StrutsParser.java b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/StrutsParser.java new file mode 100644 index 0000000000..239ac2e4cd --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/StrutsParser.java @@ -0,0 +1,82 @@ +package org.korben.coderising.litestruts.util; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.korben.coderising.litestruts.dom.StrutsAction; + +/** + * 解析struts.xml + * + * Created by Korben on 03/03/2017. + */ +public class StrutsParser { + + private static final String STRUTS_XML = "struts.xml"; + + public static void main(String[] args) { + Map strutsActions = doParse(); + System.out.println(strutsActions.size()); + } + + public static Map doParse() { + Map resultMap = new HashMap<>(); + + SAXReader reader = new SAXReader(); + InputStream in = getStrutsInputStream(); + try { + Document document = reader.read(in); + Element rootElement = document.getRootElement(); + + // parse action element + List elementActions = rootElement.elements(); + for (Element elementAction : elementActions) { + StrutsAction action = new StrutsAction(); + + // parse "name" attribute from action element + resultMap.put(elementAction.attribute("name").getValue(), action); + + // parse "class" attribute from action element + action.setActionClassName(elementAction.attribute("class").getValue()); + + // parse sub elements in action element + List elements = elementAction.elements(); + Map map = new HashMap<>(); + for (Element element : elements) { + map.put(element.attribute("name").getValue(), element.getStringValue()); + } + action.setAttributes(map); + } + + return resultMap; + } catch (DocumentException e) { + throw new IllegalStateException("failed to parse " + STRUTS_XML, e); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + private static InputStream getStrutsInputStream() { + StrutsParser.class.getPackage().getName(); + InputStream in = StrutsParser.class.getClassLoader() + .getResourceAsStream("org/korben/coderising/litestruts/util/" + STRUTS_XML); + if (in == null) { + throw new IllegalStateException(STRUTS_XML + " doesn't exist"); + } + + return in; + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/struts.xml b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/struts.xml new file mode 100644 index 0000000000..1cb3f4a5df --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KArrayList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KArrayList.java new file mode 100644 index 0000000000..0f443462ed --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KArrayList.java @@ -0,0 +1,169 @@ +package org.korben.coding.basic.list; + +import java.util.Objects; + +/** + * Korben's ArrayList + * + * Created by Korben on 18/02/2017. + */ +public class KArrayList implements KList { + + private int size; + private Object[] dataArray = new Object[0]; + + @Override + public int size() { + return this.size; + } + + @Override + public boolean isEmpty() { + return this.size == 0; + } + + @Override + public boolean contains(Object o) { + for (Object obj : dataArray) { + if (Objects.equals(obj, o)) { + return true; + } + } + return false; + } + + @Override + @SuppressWarnings("unchecked") + public Object[] toArray() { + Object[] array = new Object[size]; + System.arraycopy(dataArray, 0, array, 0, size); + return array; + } + + @Override + public boolean add(T o) { + ensureCapacity(size + 1); + dataArray[size] = o; + size++; + return true; + } + + @Override + public boolean remove(T o) { + int index = indexOf(o); + if (index < 0) { + return false; + } + + System.arraycopy(dataArray, index + 1, dataArray, index, size - 1 - index); + dataArray[size - 1] = null; + + size--; + + return true; + } + + @Override + public void clear() { + for (int i = 0; i < size; i++) { + dataArray[i] = null; + } + size = 0; + } + + @Override + @SuppressWarnings("unchecked") + public T get(int index) { + if (index < -1 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + return (T) dataArray[index]; + } + + @Override + public T set(int index, T element) { + if (index < -1 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + dataArray[index] = element; + + return element; + } + + @Override + public void add(int index, T element) { + if (index < -1 || index > size) { + throw new IndexOutOfBoundsException(); + } + + ensureCapacity(size + 1); + + System.arraycopy(dataArray, index, dataArray, index + 1, size - index); + + dataArray[index] = element; + size++; + } + + @Override + @SuppressWarnings("unchecked") + public T remove(int index) { + if (index < -1 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + T removeData = (T) dataArray[index]; + System.arraycopy(dataArray, index + 1, dataArray, index, size - 1 - index); + dataArray[size - 1] = null; + size--; + return removeData; + } + + @Override + public int indexOf(T o) { + for (int i = 0; i < size; i++) { + if (Objects.equals(o, dataArray[i])) { + return i; + } + } + return -1; + } + + @Override + public KIterator iterator() { + return new ArrayListIterator(this); + } + + private void ensureCapacity(int minCapacity) { + if (minCapacity > dataArray.length) { + int newCapacity = Math.max(minCapacity, dataArray.length * 2); + Object[] newDataArray = new Object[newCapacity]; + System.arraycopy(dataArray, 0, newDataArray, 0, dataArray.length); + + dataArray = newDataArray; + } + } + + private class ArrayListIterator implements KIterator { + private int position; + private KArrayList list; + + ArrayListIterator(KArrayList list) { + this.list = list; + } + + @Override + public boolean hasNext() { + return position < list.size(); + } + + @Override + public T next() { + if (hasNext()) { + return list.get(position++); + } + return null; + } + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KIterator.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KIterator.java new file mode 100644 index 0000000000..b5245ecca0 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KIterator.java @@ -0,0 +1,10 @@ +package org.korben.coding.basic.list; + +/** + * Created by Korben on 24/02/2017. + */ +public interface KIterator { + boolean hasNext(); + + T next(); +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java new file mode 100644 index 0000000000..2ca4452981 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java @@ -0,0 +1,172 @@ +package org.korben.coding.basic.list; + +import java.util.Objects; + +/** + * Korben's LinkedList + * + * Created by Korben on 18/02/2017. + */ +public class KLinkedList implements KList { + + private int size; + + private Node head; + + private Node last; + + public KLinkedList() { + this.head = new Node<>(null); + } + + @Override + public int size() { + return this.size; + } + + @Override + public boolean isEmpty() { + return this.size == 0; + } + + @Override + public boolean contains(Object o) { + Node node = this.head; + while (node.next != null) { + node = node.next; + if (Objects.equals(node.data, o)) { + return true; + } + } + return false; + } + + @Override + public Object[] toArray() { + return new Object[0]; + } + + @Override + public boolean add(T o) { + if (this.last == null) { + this.last = new Node<>(o); + this.last.pre = this.head; + this.head.next = this.last; + } else { + Node oldLast = this.last; + this.last = new Node<>(o); + this.last.pre = oldLast; + oldLast.next = this.last; + } + this.size++; + return true; + } + + @Override + public boolean remove(T o) { + Node node = this.head; + while (node.next != null) { + node = node.next; + if (Objects.equals(node.data, o)) { + node.pre.next = node.next; + if (node.next != null) { + node.next.pre = node.pre; + } + this.size--; + return true; + } + } + return false; + } + + @Override + public void clear() { + this.head.next = null; + this.last = null; + + this.size = 0; + } + + @Override + public T get(int index) { + return getNode(index).data; + } + + @Override + public T set(int index, T element) { + Node node = getNode(index); + node.data = element; + return element; + } + + @Override + public void add(int index, T element) { + Node node = this.head; + for (int i = 0; i <= index; i++) { + node = node.next; + } + Node pre = node.pre; + Node newNode = new Node<>(element); + pre.next = newNode; + newNode.pre = pre; + newNode.next = node; + node.pre = newNode; + + this.size++; + } + + @Override + public T remove(int index) { + Node node = getNode(index); + Node pre = node.pre; + Node next = node.next; + pre.next = next; + if (next != null) { + next.pre = pre; + } + + this.size--; + return node.data; + } + + @Override + public int indexOf(T o) { + Node node = this.head; + int index = 0; + while (node.next != null) { + node = node.next; + if (Objects.equals(node.data, o)) { + return index; + } + index++; + } + return -1; + } + + @Override + public KIterator iterator() { + throw new IllegalStateException("方法未实现"); + } + + private Node getNode(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + Node node = this.head; + for (int i = 0; i <= index; i++) { + node = node.next; + } + return node; + } + + private static class Node { + T data; + Node pre; + Node next; + + Node(T data) { + this.data = data; + } + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KList.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KList.java new file mode 100644 index 0000000000..e5b166094e --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KList.java @@ -0,0 +1,35 @@ +package org.korben.coding.basic.list; + +/** + * Korben's List + * + * Created by Korben on 18/02/2017. + */ +public interface KList { + + int size(); + + boolean isEmpty(); + + boolean contains(Object o); + + Object[] toArray(); + + boolean add(T o); + + boolean remove(T o); + + void clear(); + + T get(int index); + + T set(int index, T element); + + void add(int index, T element); + + T remove(int index); + + int indexOf(T o); + + KIterator iterator(); +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListIteratorTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListIteratorTest.java new file mode 100644 index 0000000000..7017e0ed2c --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListIteratorTest.java @@ -0,0 +1,36 @@ +package org.korben.coding.basic.list; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Iterator测试 + * + * Created by Korben on 24/02/2017. + */ +public class KListIteratorTest { + + private KList list; + + @Before + public void init() { + this.list = new KArrayList<>(); + + for (int i = 0; i < 5; i++) { + list.add(i); + } + } + + @Test + public void testIterator() { + KIterator iterator = list.iterator(); + Assert.assertTrue(iterator.hasNext()); + int count = 0; + while (iterator.hasNext()) { + int value = iterator.next(); + Assert.assertEquals(count, value); + count++; + } + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListTest.java new file mode 100644 index 0000000000..2c6febecc3 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListTest.java @@ -0,0 +1,142 @@ +package org.korben.coding.basic.list; + +import java.util.Objects; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * KList测试 + * + * Created by Korben on 18/02/2017. + */ +public class KListTest { + + private KList list; + + private int initTestSize; + + @Before + public void init() { + // 测试KArrayList + //list = new KArrayList<>(); + + // 测试KLinkedList + list = new KLinkedList<>(); + + initTestSize = 5; + + for (int i = 0; i < initTestSize; i++) { + list.add(i); + } + } + + @Test + public void size() throws Exception { + Assert.assertEquals(initTestSize, list.size()); + } + + @Test + public void isEmpty() throws Exception { + Assert.assertFalse(list.isEmpty()); + + KList list = new KArrayList<>(); + Assert.assertTrue(list.isEmpty()); + } + + @Test + public void contains() throws Exception { + Assert.assertTrue(list.contains(1)); + Assert.assertFalse(list.contains(5)); + } + + @Test + public void toArray() throws Exception { + //Object[] array = list.toArray(); + //Assert.assertEquals(initTestSize, array.length); + //for (int i = 0; i < array.length; i++) { + // Assert.assertEquals(i, array[i]); + //} + } + + @Test + public void add() throws Exception { + Assert.assertTrue(list.add(6)); + Assert.assertTrue(list.contains(6)); + Assert.assertEquals(initTestSize + 1, list.size()); + } + + @Test + public void remove() throws Exception { + Assert.assertEquals(0, list.remove(0).intValue()); + Assert.assertEquals(initTestSize - 1, list.size()); + Assert.assertFalse(list.contains(0)); + } + + @Test + public void clear() throws Exception { + list.clear(); + Assert.assertTrue(list.isEmpty()); + Assert.assertTrue(list.size() == 0); + } + + @Test + public void get() throws Exception { + for (int i = 0; i < initTestSize; i++) { + Assert.assertTrue(Objects.equals(i, list.get(i))); + } + } + + @Test + public void set() throws Exception { + for (int i = 0; i < initTestSize; i++) { + list.set(i, initTestSize); + Assert.assertEquals(initTestSize, list.get(i).intValue()); + } + } + + @Test + public void addByIndex() throws Exception { + // test add by first index + list.add(0, 6); + Assert.assertEquals(initTestSize + 1, list.size()); + Assert.assertEquals(6, list.get(0).intValue()); + for (int i = 0; i < initTestSize; i++) { + Assert.assertEquals(i, list.get(i + 1).intValue()); + } + + // test add by last index + init(); + list.add(initTestSize - 1, 6); + Assert.assertEquals(initTestSize + 1, list.size()); + Assert.assertEquals(initTestSize - 1, list.get(initTestSize).intValue()); + Assert.assertEquals(6, list.get(initTestSize - 1).intValue()); + for (int i = 0; i < initTestSize - 1; i++) { + Assert.assertEquals(i, list.get(i).intValue()); + } + + // test add by middle index + init(); + list.add(3, 90); + Assert.assertEquals(initTestSize + 1, list.size()); + Assert.assertEquals(list.get(0).intValue(), 0); + Assert.assertEquals(list.get(1).intValue(), 1); + Assert.assertEquals(list.get(2).intValue(), 2); + Assert.assertEquals(list.get(3).intValue(), 90); + Assert.assertEquals(list.get(4).intValue(), 3); + Assert.assertEquals(list.get(5).intValue(), 4); + } + + @Test + public void removeByObject() throws Exception { + Assert.assertTrue(list.remove(new Integer(3))); + Assert.assertEquals(initTestSize - 1, list.size()); + } + + @Test + public void indexOf() throws Exception { + for (int i = 0; i < initTestSize; i++) { + Assert.assertEquals(i, list.indexOf(i)); + } + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KArrayQueue.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KArrayQueue.java new file mode 100644 index 0000000000..eea57cf035 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KArrayQueue.java @@ -0,0 +1,111 @@ +package org.korben.coding.basic.queue; + +import java.util.NoSuchElementException; + +/** + * Created by Korben on 18/02/2017. + */ +public class KArrayQueue implements KQueue { + + private int size; + private Object[] dataArray = {}; + private int front = 0; + private int end = -1; + + public KArrayQueue() { + + } + + @Override + public boolean add(T t) { + ensureCapacity(size + 1); + dataArray[end + 1] = t; + end++; + size++; + return true; + } + + @Override + public boolean offer(T t) { + ensureCapacity(size + 1); + dataArray[end + 1] = t; + end++; + size++; + return true; + } + + @Override + @SuppressWarnings("unchecked") + public T remove() { + if (end == -1) { + throw new NoSuchElementException(); + } + T value = (T) dataArray[front]; + dataArray[front] = null; + size--; + front++; + if (front == dataArray.length) { + front = 0; + } + if (size == 0) { + end = -1; + } + + return value; + } + + @Override + @SuppressWarnings("unchecked") + public T poll() { + if (end == -1) { + return null; + } + T value = (T) dataArray[front]; + dataArray[front] = null; + size--; + front++; + if (front == dataArray.length) { + front = 0; + } + + return value; + } + + @Override + @SuppressWarnings("unchecked") + public T element() { + if (end == -1) { + throw new NoSuchElementException(); + } + return (T) dataArray[front]; + } + + @Override + @SuppressWarnings("unchecked") + public T peek() { + if (end == -1) { + return null; + } + return (T) dataArray[front]; + } + + private void ensureCapacity(int minSize) { + if (end == -1) { + dataArray = new Object[8]; + } else if (minSize >= dataArray.length) { + int newLength = dataArray.length * 2; + Object[] newDataArray = new Object[newLength]; + if (front != 0) { + System.arraycopy(dataArray, front, + newDataArray, newLength - dataArray.length + front, + dataArray.length - 1 - front); + + front += newLength - dataArray.length; + } else { + System.arraycopy(dataArray, front, newDataArray, front, size); + } + + dataArray = newDataArray; + } + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueue.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueue.java new file mode 100644 index 0000000000..9d8146d50d --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueue.java @@ -0,0 +1,20 @@ +package org.korben.coding.basic.queue; + +/** + * Korben's Queue Interface + * + * Created by Korben on 18/02/2017. + */ +public interface KQueue { + boolean add(T t); + + boolean offer(T t); + + T remove(); + + T poll(); + + T element(); + + T peek(); +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueueTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueueTest.java new file mode 100644 index 0000000000..17c3703a64 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueueTest.java @@ -0,0 +1,78 @@ +package org.korben.coding.basic.queue; + +import java.util.NoSuchElementException; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * KQueue Test + * + * Created by Korben on 19/02/2017. + */ +public class KQueueTest { + private KQueue queue; + + @Before + public void init() { + queue = new KArrayQueue<>(); + } + + @Test + public void add() throws Exception { + for (int i = 0; i < 5; i++) { + queue.add(i); + } + } + + @Test + public void offer() throws Exception { + for (int i = 0; i < 100; i++) { + queue.offer(i); + } + } + + @Test(expected = NoSuchElementException.class) + public void remove() throws Exception { + for (int i = 0; i < 9; i++) { + queue.add(i); + } + for (int i = 0; i < 9; i++) { + Assert.assertEquals(i, queue.remove().intValue()); + } + queue.remove(); + } + + @Test + public void poll() throws Exception { + for (int i = 0; i < 5; i++) { + queue.add(i); + } + for (int i = 0; i < 5; i++) { + Assert.assertEquals(i, queue.poll().intValue()); + } + Assert.assertNull(queue.poll()); + } + + @Test(expected = NoSuchElementException.class) + public void element() throws Exception { + for (int i = 0; i < 5; i++) { + queue.add(i); + Assert.assertEquals(queue.element().intValue(), 0); + } + init(); + + queue.element(); + } + + @Test + public void peek() throws Exception { + for (int i = 0; i < 5; i++) { + queue.add(i); + Assert.assertEquals(queue.peek().intValue(), 0); + } + init(); + + Assert.assertNull(queue.peek()); + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStack.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStack.java new file mode 100644 index 0000000000..eb83eb47cd --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStack.java @@ -0,0 +1,72 @@ +package org.korben.coding.basic.stack; + +import java.util.EmptyStackException; +import java.util.Objects; + +/** + * Korben's Stack + * + * Created by Korben on 18/02/2017. + */ +public class KStack { + + private int size; + private Object[] dataArray = {}; + + public KStack() { + } + + public int size() { + return size; + } + + public T push(T item) { + ensureCapacity(size + 1); + this.dataArray[size] = item; + this.size++; + return item; + } + + @SuppressWarnings("unchecked") + public T pop() { + if (size == 0) { + throw new EmptyStackException(); + } + + T data = (T) this.dataArray[size - 1]; + this.dataArray[size - 1] = null; + this.size--; + return data; + } + + @SuppressWarnings("unchecked") + public T peek() { + if (size == 0) { + throw new EmptyStackException(); + } + return (T) dataArray[size - 1]; + } + + public boolean empty() { + return size == 0; + } + + public synchronized int search(Object o) { + for (int i = 0; i < size; i++) { + if (Objects.equals(o, dataArray[i])) { + return i; + } + } + return -1; + } + + private void ensureCapacity(int minCapacity) { + if (minCapacity > dataArray.length) { + int newCapacity = Math.max(minCapacity, dataArray.length * 2); + Object[] newDataArray = new Object[newCapacity]; + System.arraycopy(dataArray, 0, newDataArray, 0, dataArray.length); + + this.dataArray = newDataArray; + } + } +} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStackTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStackTest.java new file mode 100644 index 0000000000..20b451a7ef --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStackTest.java @@ -0,0 +1,71 @@ +package org.korben.coding.basic.stack; + +import java.util.EmptyStackException; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * KStack测试 + * + * Created by Korben on 18/02/2017. + */ +public class KStackTest { + private KStack stack; + private int initTestSize; + + @Before + public void init() { + stack = new KStack<>(); + initTestSize = 5; + + for (int i = 0; i < initTestSize; i++) { + stack.push(i); + } + } + + @Test + public void size() throws Exception { + Assert.assertEquals(initTestSize, stack.size()); + } + + @Test + public void push() throws Exception { + stack.push(9); + } + + @Test(expected = EmptyStackException.class) + public void pop() throws Exception { + for (int i = 0; i < initTestSize; i++) { + Integer value = stack.pop(); + Assert.assertEquals(value.intValue(), initTestSize - 1 - i); + } + + stack.pop(); + } + + @Test(expected = EmptyStackException.class) + public void peek() throws Exception { + Assert.assertEquals(initTestSize - 1, stack.peek().intValue()); + for (int i = 0; i < initTestSize; i++) { + stack.pop(); + } + stack.peek(); + } + + @Test + public void empty() throws Exception { + Assert.assertFalse(stack.empty()); + for (int i = 0; i < initTestSize; i++) { + stack.pop(); + } + Assert.assertTrue(stack.empty()); + } + + @Test + public void search() throws Exception { + for (int i = 0; i < initTestSize; i++) { + Assert.assertEquals(i, stack.search(i)); + } + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNode.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNode.java new file mode 100644 index 0000000000..3cfcacc37c --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNode.java @@ -0,0 +1,127 @@ +package org.korben.coding.basic.tree; + +/** + * Korben's BinaryTreeNode + * + * Created by Korben on 21/02/2017. + */ +public class BinaryTreeNode { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private int size; + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + @SuppressWarnings("unchecked") + public BinaryTreeNode insert(T data) { + if (this.data == null) { + this.data = data; + return this; + } + int compareResult = this.data.compareTo(data); + if (compareResult > 0) { + if (this.left == null) { + this.left = new BinaryTreeNode(); + this.left.data = data; + return this.left; + } else { + return this.left.insert(data); + } + } else if (compareResult < 0) { + if (this.right == null) { + this.right = new BinaryTreeNode(); + this.right.data = data; + return this.right; + } else { + return this.right.insert(data); + } + } else { + return this; + } + } + + @SuppressWarnings("unchecked") + public BinaryTreeNode delete(T data) { + BinaryTreeNode treeNode = search(data); + if (treeNode == null) { + return null; + } + int compareResult = this.data.compareTo(data); + if (compareResult > 0) { + return this.left.delete(data); + } else if (compareResult < 0) { + return this.right.delete(data); + } else { + if (treeNode.right == null) { + if (this.left == null) { + this.data = null; + } else { + this.left = this; + } + } else { + this.data = (T) this.right.findMin().data; + + this.right.delete(this.data); + } + } + + return this; + } + + private BinaryTreeNode findMin() { + if (this.data == null) { + return null; + } + if (this.left == null) { + return this; + } + return this.left.findMin(); + } + + @SuppressWarnings("unchecked") + public BinaryTreeNode search(T data) { + if (this.data == null) { + return null; + } + int compareResult = this.data.compareTo(data); + if (compareResult > 0) { + if (this.left == null) { + return null; + } else { + return this.left.search(data); + } + } else if (compareResult < 0) { + if (this.right == null) { + return null; + } else { + return this.right.search(data); + } + } else { + return this; + } + } +} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNodeTest.java b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..05873872a7 --- /dev/null +++ b/group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNodeTest.java @@ -0,0 +1,59 @@ +package org.korben.coding.basic.tree; + +import org.junit.Assert; + +/** + * Korben's BinaryTreeNode Test + * + * Created by Korben on 21/02/2017. + */ +public class BinaryTreeNodeTest { + + private BinaryTreeNode treeNode; + + @org.junit.Before + public void setUp() throws Exception { + treeNode = new BinaryTreeNode<>(); + treeNode.insert(5); + treeNode.insert(3); + treeNode.insert(7); + treeNode.insert(1); + treeNode.insert(4); + treeNode.insert(2); + treeNode.insert(8); + treeNode.insert(6); + } + + @org.junit.Test + public void insert() { + Assert.assertEquals(treeNode.getData().intValue(), 5); + Assert.assertEquals(treeNode.getLeft().getData(), 3); + Assert.assertEquals(treeNode.getRight().getData(), 7); + Assert.assertEquals(treeNode.getLeft().getLeft().getData(), 1); + Assert.assertEquals(treeNode.getLeft().getRight().getData(), 4); + Assert.assertEquals(treeNode.getLeft().getLeft().getRight().getData(), 2); + Assert.assertEquals(treeNode.getRight().getRight().getData(), 8); + Assert.assertEquals(treeNode.getRight().getLeft().getData(), 6); + } + + @org.junit.Test + public void delete() throws Exception { + treeNode.delete(3); + for (int i = 1; i < 9; i++) { + if (i != 3) { + Assert.assertNotNull(treeNode.search(i)); + } else { + Assert.assertNull(treeNode.search(i)); + } + } + } + + @org.junit.Test + public void search() throws Exception { + for (int i = 1; i < 9; i++) { + Assert.assertNotNull(treeNode.search(i)); + } + Assert.assertNull(treeNode.search(0)); + Assert.assertNull(treeNode.search(9)); + } +} \ No newline at end of file diff --git a/group20/1107837739/korben.md b/group20/1107837739/korben.md new file mode 100644 index 0000000000..91ee50808b --- /dev/null +++ b/group20/1107837739/korben.md @@ -0,0 +1,9 @@ +## Korben's Blog Here + +-------- + +| Blog Title | Date| +| ---------- | -----------| +| [初窥计算机程序的运行](http://korben-chy.github.io/2017/02/26/%E5%88%9D%E7%AA%A5%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%BF%90%E8%A1%8C/) | 2017/02/26 | +| +[程序在计算机中的运行过程简析](http://korben-chy.github.io/2017/03/06/%E7%A8%8B%E5%BA%8F%E5%9C%A8%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%AD%E7%9A%84%E8%BF%90%E8%A1%8C%E8%BF%87%E7%A8%8B%E7%AE%80%E6%9E%90) | 2017/03/05 | diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/ArrayList.java b/group20/1430208241/1430208241leaning/src/GithubWork/ArrayList.java new file mode 100644 index 0000000000..f74501b5ba --- /dev/null +++ b/group20/1430208241/1430208241leaning/src/GithubWork/ArrayList.java @@ -0,0 +1,73 @@ +package GithubWork; + +import java.util.Arrays; + +public class ArrayList implements List { + private int size = 0; + private Object[] elementdata = new Object[100]; + + public void add(Object o) { + if (elementdata.length <= size) { + ensureCapacity(size + 1); + } + elementdata[size++] = o; + } + + private void ensureCapacity(int minCapacity) { + int oldCapacity = elementdata.length; + if (oldCapacity < minCapacity) { + + int newCapacity = (int) (oldCapacity * 1.5); + if (newCapacity < minCapacity) + newCapacity = minCapacity; + elementdata = Arrays.copyOf(elementdata, newCapacity); + } + } + + public void add(int index, Object o) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException(); + + } + + ensureCapacity(size + 1); + System.arraycopy(elementdata, index, elementdata, index, size - index); + elementdata[index] = o; + size++; + } + + public Object get(int index) { + RangeCheck(index); + + return elementdata[index]; + } + + public Object remove(int index) { + RangeCheck(index); + Object oldvalue = elementdata[index]; + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementdata, index + 1, elementdata, index, numMoved); + elementdata[--size] = null; + return oldvalue; + } + + private void RangeCheck(int index) { + if (index >= size) + throw new IndexOutOfBoundsException(); + } + + public int size() { + int i; + for (i = 0; i < elementdata.length; i++) { + size++; + if (null == elementdata[i]) { + break; + } + + } + return size; + + } + +} diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/JunitTest.java b/group20/1430208241/1430208241leaning/src/GithubWork/JunitTest.java new file mode 100644 index 0000000000..b011de10f0 --- /dev/null +++ b/group20/1430208241/1430208241leaning/src/GithubWork/JunitTest.java @@ -0,0 +1,47 @@ +package GithubWork; + +import org.junit.Test; + +public class JunitTest { + @Test + public void ArrayList(){ + ArrayList a=new ArrayList(); + a.add(1); + a.add(2); + a.add(3); + a.add(4); + a.get(2); + + System.out.println(a); + + + } + @Test + public void Queue(){ + Queue q=new Queue(4); + q.enQueue(1); + q.enQueue(2); + q.enQueue(3); + q.enQueue(4); + + while(!q.isEmpty()){ + int i=(int) q.deQueue(); + System.out.println(i); + } + System.out.println(q.size()); + } + @Test + public void LinkedList(){ + LinkedList ls=new LinkedList(); + ls.add(1); + ls.add(7); + ls.add(3); + ls.add(4, 5); + ls.get(2); + ls.addFirst(0); + + ls.remove(3); + System.out.println(ls); + + } +} diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/LinkedList.java b/group20/1430208241/1430208241leaning/src/GithubWork/LinkedList.java new file mode 100644 index 0000000000..657ca117dc --- /dev/null +++ b/group20/1430208241/1430208241leaning/src/GithubWork/LinkedList.java @@ -0,0 +1,136 @@ +package GithubWork; + +import java.util.Iterator; + +public class LinkedList implements List { + + private Node head = null;// ͷڵ + private int size = 0; + private Node last = null; + + /* + * в (non-Javadoc) + * + * @see GithubWork.List#add(java.lang.Object) + */ + public void add(Object o) { + Node newNode = new Node(0);// ʵһڵ + if (head == null) { + head = newNode; + return; + } + Node tmp = head; + while (tmp.next != null) { + tmp = tmp.next; + } + tmp.next = newNode; + size++; + } + + public void add(int index, Object o) { + Node newNode = new Node(0); + Node indexNode = head; + int i = 0; + while (i == index) { + indexNode = indexNode.next; + i++; + } + Node indexNextNode = indexNode.next; + indexNode.next = newNode; + newNode.pre = indexNode; + newNode.next = indexNextNode; + indexNextNode.pre = newNode; + size++; + } + + public Object get(int index) { + Node indexNode = head; + int i = 0; + while (i == index) { + indexNode = indexNode.next; + i++; + } + return indexNode; + } + + public Object remove(int index) { + if (index < 1 || index > size()) { + throw new IndexOutOfBoundsException(); + } + if (index == 1) { + head = head.next; + return head; + } + int i = 1; + Node preNode = head; + Node curNode = preNode.next; + while (curNode != null) { + if (i == index) { + preNode.next = curNode.next; + + } + preNode = curNode; + curNode = curNode.next; + i++; + } + return curNode; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newNode = new Node(o); + newNode.data = o; + newNode.next = head; + head.pre = newNode; + head = newNode; + size++; + } + + public void addLast(Object o) { + Node newNode = new Node(o); + newNode.data = o; + + newNode.pre = last; + last.next = newNode; + last = newNode; + size++; + + } + + public Object removeFirst() { + Node ref = head; + head = head.next; + head.pre = null; + size--; + return ref; + } + + public Object removeLast() { + Node rel = last; + last = last.pre; + last.next = null; + size--; + return rel; + + } + + public Iterator iterator() { + + return null; + } + + private static class Node { + Object data;// ڵ + Node next = null;// ͷڵ + Node pre = null; + + public Node(Object data) { + this.data = data; + } + + } + +} diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/List.java b/group20/1430208241/1430208241leaning/src/GithubWork/List.java new file mode 100644 index 0000000000..169fc14fd1 --- /dev/null +++ b/group20/1430208241/1430208241leaning/src/GithubWork/List.java @@ -0,0 +1,10 @@ +package GithubWork; + +public interface List { + public void add(Object o); + public void add(int index,Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + +} diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/Queue.java b/group20/1430208241/1430208241leaning/src/GithubWork/Queue.java new file mode 100644 index 0000000000..792ca233f5 --- /dev/null +++ b/group20/1430208241/1430208241leaning/src/GithubWork/Queue.java @@ -0,0 +1,43 @@ +package GithubWork; + +public class Queue { + private int maxSize; + private Object[] array;//Ԫ + private int front;//ǰһԪ + private int rear;//һԪ + private int items=0;//Ԫظ + //󲢳ʼ + public Queue(int s){ + maxSize=s; + array=new Object[maxSize]; + front=0; + rear=-1; + + } + public void enQueue(Object o){ + if(rear==maxSize-1){ + rear=-1; + } + array[++rear]=o; + items++; + + } + + public Object deQueue(){ + Object temp =array[front++]; + if(front==maxSize){ + front=0; + } + items--; + return temp; + } + + public boolean isEmpty(){ + + return items==0; + } + + public int size(){ + return array.length; + } +} diff --git a/group20/1430208241/1430208241leaning/src/GithubWork/Stack.java b/group20/1430208241/1430208241leaning/src/GithubWork/Stack.java new file mode 100644 index 0000000000..43f138021c --- /dev/null +++ b/group20/1430208241/1430208241leaning/src/GithubWork/Stack.java @@ -0,0 +1,22 @@ +package GithubWork; + +public class Stack { +private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git "a/group20/1430208241/1430208241leaning/src/\346\226\207\347\253\240\345\234\260\345\235\200" "b/group20/1430208241/1430208241leaning/src/\346\226\207\347\253\240\345\234\260\345\235\200" new file mode 100644 index 0000000000..472bb524e9 --- /dev/null +++ "b/group20/1430208241/1430208241leaning/src/\346\226\207\347\253\240\345\234\260\345\235\200" @@ -0,0 +1 @@ +http://blog.csdn.net/wifi619/article/details/57510982 \ No newline at end of file diff --git a/group20/2421586846/DS/src/basic/ArrayList.java b/group20/2421586846/DS/src/basic/ArrayList.java new file mode 100644 index 0000000000..7e9f70169d --- /dev/null +++ b/group20/2421586846/DS/src/basic/ArrayList.java @@ -0,0 +1,77 @@ +package basic; + + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[2]; + + public void EnsureEnoughSize(){ + if (size == elementData.length ) + { + elementData = Arrays.copyOf(elementData, elementData.length +10); + + } + } + + public void add(Object o){ + EnsureEnoughSize(); + + // elementData = Arrays.copyOf(elementData, elementData.length +1); + //Object[] NewelementData = new Object[size+1]; + //System.arraycopy( elementData,0, NewelementData, 0, elementData.length ); + + + elementData[size]=o; + size++; + } + public void add(int index, Object o){ + if (index >= size || index < 0){ + return; + } + + EnsureEnoughSize(); + + for (int i = elementData.length-1; i>index;i --){ + elementData[i]=elementData[i-1]; + } + elementData[index]=o; + size++; + } + + public Object get(int index){ + if (index >= size || index < 0){ + return null; + } + else { + return elementData[index]; + } + + } + + public Object remove(int index){ + if (index >= size || index < 0){ + return null; + } + else { + Object o = elementData[index]; + for (int i =index; i< size-1; i++){ + elementData[i]= elementData[i+1]; + } + size--; + return o; + } + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group20/2421586846/DS/src/basic/BinaryTreeNode.java b/group20/2421586846/DS/src/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..e8e37a9a41 --- /dev/null +++ b/group20/2421586846/DS/src/basic/BinaryTreeNode.java @@ -0,0 +1,33 @@ +package basic; + + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group20/2421586846/DS/src/basic/Iterator.java b/group20/2421586846/DS/src/basic/Iterator.java new file mode 100644 index 0000000000..9154df57bf --- /dev/null +++ b/group20/2421586846/DS/src/basic/Iterator.java @@ -0,0 +1,7 @@ +package basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group20/2421586846/DS/src/basic/LinkedList.java b/group20/2421586846/DS/src/basic/LinkedList.java new file mode 100644 index 0000000000..8bdc7ec661 --- /dev/null +++ b/group20/2421586846/DS/src/basic/LinkedList.java @@ -0,0 +1,177 @@ +package basic; + + +public class LinkedList implements List { + + private Node head; + + private int size; + //加到最后 + public void add(Object o){ + Node newNode= new Node(); + newNode.data = o; + newNode.next = null; + + if (head == null ){ + head= newNode; + size++; + return; + } + + Node currentNode = head; + + while (currentNode.next != null ){ + currentNode = currentNode.next ; + } + /* + for (int i=0;i< size;i++){ + currentNode = currentNode.next ; + } + */ + currentNode.next =newNode; + size++; + } + + public void add(int index , Object o){ + if (index >= size ||index < 0) { + return; + } + + Node newNode= new Node(); + newNode.data = o; + Node PrevNode =null; + + if (index ==0 ){ + + Node tempNode = head ; + head = newNode; + newNode.next = tempNode; + + } + else { + Node currentNode = head; + for (int i=0; i = size ||index < 0) { + return null; + } + Node currentNode = head; + for (int i=0; i = size ||index < 0) { + return null; + } + + Node currentNode = head; + if (index ==0 ){ + head =head.next; + size--; + return currentNode.data; + } + Node PrevNode = null; + for (int i=0; i size-1) + throw new IndexOutOfBoundsException("数组下标越界异常。"); + if (size==maxSize){ + Object[] targt = new Object[++maxSize]; + System.arraycopy(elementData,0,targt,0,elementData.length); + for (int j = targt.length-2;j>=index;j--){ + targt[j+1] = targt[j]; + } + targt[index] = o; + size++; + elementData = targt; + }else if(size=index;j--){ + elementData[j+1] = elementData[j]; + } + elementData[index] = o; + size++; + } + } + + /** + * 追加元素 + * @param o + */ + @Override + public void add(Object o) { + if (size==maxSize){ + Object[] targt = new Object[++maxSize]; + System.arraycopy(elementData,0,targt,0,elementData.length); + targt[maxSize-1] = o; + size++; + elementData = targt; + }else if(sizesize-1) + throw new IndexOutOfBoundsException("数组下标越界异常"); + Object o= elementData[index]; + return o; + } + + @Override + public Object remove(int index) { + if (index<0||index>size-1) + throw new IndexOutOfBoundsException("数组下表越界异常"); + Object temp = elementData[index]; + for (int i = index;i<=size-1;i++){ + elementData[i] = elementData[i+1]; + } + size--; + return temp; + } + + @Override + public int size() { + return size; + } + + + @Override + public String toString() { + return "ArrayList{" + + "elementData=" + Arrays.toString(elementData) + + '}'; + } +} diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java b/group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java new file mode 100644 index 0000000000..52695305fb --- /dev/null +++ b/group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java @@ -0,0 +1,123 @@ +package wiki.liven.code.dataStructures; + +/** + * Created by leven on 2017/2/21. + */ +public class LinkedList implements List{ + + private Node head;//链表的头节点 + private Node tail;//链接的尾节点 + private int size;//定义了链表中的元素的个数 + + /** + * 定义了NODE节点的数据结构 + */ + private static class Node{ + Object data; + Node next; + private Node(){ + + } + private Node(Object o,Node node){ + this.data = o; + this.next = node; + } + } + + /** + * 在指定的索引写入新的节点 + * 1.找到给位置上的节点node0 + * 2.修改node0的next指向新的节点node + * 3.新节点node指向原先node0的后继节点node1 + * 4.长度++ + * 5.完结 + * @param index 索引 从0开始 + * @param o + */ + @Override + public void add(int index, Object o) { + if (index<0||index>size-1) + throw new IndexOutOfBoundsException("单链表越界异常。"); + Node node = new Node(); + node.data = o; + Node nodeIndex = findNodeByIndex(index); + if(node==null) + throw new NullPointerException("空指针异常。"); + Node temp = nodeIndex.next; + nodeIndex.next = node; + node.next = temp; + size++; + } + + /** + * 根据索引号查询节点 + * @param index 索引 + * @return + */ + private Node findNodeByIndex(int index) { + if (index<0||index>size-1) + throw new IndexOutOfBoundsException("单链表越界异常。"); + Node current = head; + if (1<=index&&index<=size-1){//索引检查 + for (int i = 0;i>=size-1&¤t!=null;i++,current = current.next) + if (i==index){ + return current; + } + } + return null; + } + + @Override + public void add(Object o) { + Node node = new Node(); + node.data = o; + if(head==null){ + head = node; + node.next = tail; + size++; + }else{ + Node temp = tail; + node.next = temp; + temp.next = node; + size++; + } + } + + @Override + public Object get(int index) { + if(index<0||index>size-1) + throw new IndexOutOfBoundsException("单链表越界。"); + Node node = findNodeByIndex(index); + if(node==null) + throw new NullPointerException("空指针异常。"); + return node.data; + } + + /** + * 删除指定索引的元素 + * @param index + * @return + */ + @Override + public Object remove(int index) { + if(index<0||index>size-1) + throw new IndexOutOfBoundsException("单链表越界。"); + Node node = findNodeByIndex(index); + if(node==null) + throw new NullPointerException("空指针异常。"); + Node prvNode = findNodeByIndex(index-1); + if(prvNode==null) + throw new NullPointerException("空指针异常。"); + Node nextNode = node.next; + node.next = null; + prvNode.next = nextNode; + size--; + return node.data; + + } + + @Override + public int size() { + return size; + } +} diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/List.java b/group20/286166752/src/wiki/liven/code/dataStructures/List.java new file mode 100644 index 0000000000..57d5c217ce --- /dev/null +++ b/group20/286166752/src/wiki/liven/code/dataStructures/List.java @@ -0,0 +1,15 @@ +package wiki.liven.code.dataStructures; + +/** + * Created by leven on 2017/2/26. + */ +public interface List { + + public void add(Object o); + public void add(int index,Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + + +} diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/Queue.java b/group20/286166752/src/wiki/liven/code/dataStructures/Queue.java new file mode 100644 index 0000000000..d52c0de6f5 --- /dev/null +++ b/group20/286166752/src/wiki/liven/code/dataStructures/Queue.java @@ -0,0 +1,64 @@ +package wiki.liven.code.dataStructures; + +/** + * Created by leven on 2017/2/21. + * 队列 + * 只允许一端进行出队操作,另一端进行入队操作。 + * 特性是:先进先出 + * 本质上是一种操作受限制的线性表 + * 本实现线性表采用自己实现的ArrayList, + * ArrayList理论上会受到JVM分配的内存大小,从而其空间会有上限。 + * 但是,该错误,将有JVM抛出。 + * 所以,本实现,队列忽略执行判断满队操作。 + */ +public class Queue { + + private ArrayList list; + private int head;//队头指针 + private int foot;//队尾指针 + + + public Queue(){ + head = foot = 0; + } + + /** + * 判空 + * @return + */ + public boolean queueEmpty(){ + if (head==0&&foot==0){ + return true; + }else { + return false; + } + } + + /** + * 入队列 + * 1.先把元素放置到队列中 + * 2.将队尾指针加1 + * @param o + */ + public void enQueue(Object o){ + list.add(foot,o); + foot++; + } + + /** + * 删除队头元素 + * 0.先判断队列是否为空 + * 1.先取出队头的元素 + * 2.然后将队头的指针加1 + * @return + */ + public int deQueue(){ + if (queueEmpty()==true) + throw new IndexOutOfBoundsException("队列为空,无法执行该操作。"); + list.remove(head); + return head++; + } + + + +} diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/Stack.java b/group20/286166752/src/wiki/liven/code/dataStructures/Stack.java new file mode 100644 index 0000000000..cc33ed2985 --- /dev/null +++ b/group20/286166752/src/wiki/liven/code/dataStructures/Stack.java @@ -0,0 +1,62 @@ +package wiki.liven.code.dataStructures; + +/** + * Created by leven on 2017/2/21. + * 栈:只允许在一端进行删除或者增加操作的线性表。 + * 本实现,采用ArrayList。 + */ +public class Stack { + + + private ArrayList list;//线性表 + private int top = -1;//栈顶指针,默认指向栈低 + + + /** + * 元素进栈 + * @param o + * 1.指针先加1 + * 2.将元素放入栈中 + * + */ + public void push(Object o){ + top++; + list.add(o); + } + + /** + * 栈顶元素出栈,返回栈顶指针的值 + * @return + */ + public int pop(){ + if (top==-1) + throw new IndexOutOfBoundsException("栈为空,无法执行出栈操作。"); + list.remove(top); + top--; + return top; + } + + /** + * 获取栈顶元素的值 + * @return + */ + public Object getTop() { + if (top==-1) + throw new IndexOutOfBoundsException("栈为空,无法执行出栈操作。"); + Object o = list.get(top); + return o; + } + + /** + * 判空 + * @return + */ + public boolean stackEmpty(){ + if (top==-1){ + return true; + }else { + return false; + } + } + +} diff --git a/group20/331798361/assignment1/src/com/coding/basic/ArrayList.java b/group20/331798361/assignment1/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..590fd3209e --- /dev/null +++ b/group20/331798361/assignment1/src/com/coding/basic/ArrayList.java @@ -0,0 +1,122 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + int n = elementData.length; + int i = 0; + while (elementData[i] != null) { + i++; + } + if (i < n) { + elementData[i] = o; + } else { + Object[] temp = Arrays.copyOf(elementData, n + 1); + temp[n] = o; + elementData = temp; + } + size++; + } + public void add(int index, Object o){ + int n = elementData.length; + int i = 0; + while (elementData[i] != null) { + i++; + } + if (index < 0 || index > i) { + System.out.println(index + " is invalid index!"); + return; + } + if (i < n) { + for (int j = i; j > index; j--) { + elementData[j] = elementData[j - 1]; + } + elementData[index] = o; + } else { + Object[] temp = Arrays.copyOf(elementData, n + 1); + for (int j = i; j > index; j--) { + temp[j] = temp[j - 1]; + } + temp[index] = o; + elementData = temp; + } + size++; + } + + public Object get(int index){ + int i = 0; + while (elementData[i] != null) { + i++; + } + if (index < 0 || index >= i) { + System.out.println(index + " is invalid index!"); + return null; + } else { + return elementData[index]; + } + } + + public Object remove(int index){ + int i = 0; + while (elementData[i] != null) { + i++; + } + if (index < 0 || index >= i) { + System.out.println(index + " is invalid index!"); + return null; + } + Object result = elementData[index]; + for (int j = index; j < i; j++) { + elementData[j] = elementData[j + 1]; + } + size--; + return result; + } + + public int size(){ + return size; + } + + public String toString() { + int i = 0; + while (elementData[i] != null) { + i++; + } + String result = ""; + for (int j = 0; j < i - 1; j++) { + result += elementData[j].toString() + ", "; + } + result += elementData[size - 1].toString(); + return result; + } + + public Iterator iterator(){ + return null; + } + + public static void main(String args[]){ + ArrayList list1 = new ArrayList(); + list1.add("a"); + list1.add("b"); + list1.add("c"); + System.out.println(list1.toString()); + list1.add(5, "d"); + list1.add(1, "d"); + System.out.println(list1.toString()); + list1.add(4, "e"); + System.out.println(list1.toString()); + list1.get(5); + System.out.println(list1.get(0)); + list1.remove(2); + System.out.println(list1.toString()); + System.out.println(list1.size()); + } + +} diff --git a/group20/331798361/assignment1/src/com/coding/basic/BinaryTreeNode.java b/group20/331798361/assignment1/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group20/331798361/assignment1/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group20/331798361/assignment1/src/com/coding/basic/Iterator.java b/group20/331798361/assignment1/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group20/331798361/assignment1/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group20/331798361/assignment1/src/com/coding/basic/LinkedList.java b/group20/331798361/assignment1/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..13f423cc24 --- /dev/null +++ b/group20/331798361/assignment1/src/com/coding/basic/LinkedList.java @@ -0,0 +1,148 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + private int size; + + public void add(Object o){ + if (head.data == null) { + head.data = o; + head.next = null; + size++; + return; + } + Node node = new Node(o); + Node curr = head; + while (curr.next != null) { + curr = curr.next; + } + curr.next = node; + size++; + } + public void add(int index , Object o){ + + if (index < 0 || index > size) { + System.out.println(index + " is invalid index!"); + return; + } + if (head.data == null) { + if (index == 0) { + head.data = o; + head.next = null; + size++; + return; + } else { + System.out.println("invalid index!"); + return; + } + } + Node node = new Node(o); + Node curr = head; + for (int i = 0; i < index - 1; i++) { + curr = curr.next; + } + Node temp = curr.next; + curr.next = node; + node.next = temp; + size++; + } + public Object get(int index){ + if (index < 0 || index > size) { + System.out.println(index + " is invalid index!"); + return null; + } + Node result = head; + for (int i = 0; i < index; i++) { + result = result.next; + } + return result; + } + public Object remove(int index){ + if (index < 0 || index > size) { + System.out.println(index + " is invalid index!"); + return null; + } + Node curr = head; + for (int i = 0; i < index - 1; i++) { + curr = curr.next; + } + Node result = curr.next; + curr.next = curr.next.next; + size--; + return result; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + if (head.data == null) { + head.data = o; + head.next = null; + size++; + return; + } + Node temp = head; + head = new Node(o); + head.next = temp; + size++; + } + + public void addLast(Object o){ + if (head.data == null) { + head.data = o; + head.next = null; + size++; + return; + } + Node node = new Node(o); + Node curr = head; + while (curr.next != null) { + curr = curr.next; + } + curr.next = node; + size++; + } + + public Object removeFirst(){ + if (head.data == null) { + return null; + } + Node result = head; + head = head.next; + size--; + return result; + } + + public Object removeLast(){ + if (head.data == null) { + return null; + } + Node curr = head; + for (int i = 0; i < size - 1; i++) { + curr = curr.next; + } + Node result = curr.next; + curr.next = null; + size--; + return result; + } + + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + Node(Object o) { + data = o; + next = null; + } + + } +} diff --git a/group20/331798361/assignment1/src/com/coding/basic/List.java b/group20/331798361/assignment1/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group20/331798361/assignment1/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group20/331798361/assignment1/src/com/coding/basic/Queue.java b/group20/331798361/assignment1/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..102fc025f5 --- /dev/null +++ b/group20/331798361/assignment1/src/com/coding/basic/Queue.java @@ -0,0 +1,30 @@ +package com.coding.basic; + + +public class Queue { + private LinkedList list = new LinkedList(); + + public void enQueue(Object o){ + list.add(o); + } + + public Object deQueue(){ + int length = list.size(); + if (length == 0) { + return null; + } + return list.removeFirst(); + } + + public boolean isEmpty(){ + if (list.size() == 0) { + return true; + } else { + return false; + } + } + + public int size(){ + return list.size(); + } +} diff --git a/group20/331798361/assignment1/src/com/coding/basic/Stack.java b/group20/331798361/assignment1/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..3a62e3817e --- /dev/null +++ b/group20/331798361/assignment1/src/com/coding/basic/Stack.java @@ -0,0 +1,37 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop(){ + int length = elementData.size(); + if (length == 0) { + return null; + } + return elementData.remove(length - 1); + } + + public Object peek(){ + int length = elementData.size(); + if (length == 0) { + return null; + } + return elementData.get(length - 1); + } + + public boolean isEmpty(){ + if (elementData.size() != 0) { + return false; + } else { + return true; + } + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group20/331798361/assignment2/src/array/ArrayUtil.java b/group20/331798361/assignment2/src/array/ArrayUtil.java new file mode 100644 index 0000000000..3fc1eabfa8 --- /dev/null +++ b/group20/331798361/assignment2/src/array/ArrayUtil.java @@ -0,0 +1,150 @@ +package array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if (origin.length == 0) { + return; + } + int n = origin.length - 1; + int temp; + for (int i = 0; i < n/2; i++) { + temp = origin[i]; + origin[i] = origin[n - i]; + origin[n - i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + if (oldArray.length == 0) { + return null; + } + int n = oldArray.length; + int zeros = 0; + for (int i = 0; i < n - 1; i++) { + if (oldArray[i] == 0) { + zeros++; + } + } + int[] result = new int[n - zeros]; + int j = 0; + for (int i = 0; i < n - zeros - 1; i++) { + while (oldArray[j] == 0) { + j++; + } + result[i] = oldArray[j]; + j++; + } + return result; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + if (max <= 1) { + return new int[0]; + } + int n = 1; + int init = helpFibonacci(n); + while (init < max) { + n++; + init = helpFibonacci(n); + } + int[] result = new int[n - 1]; + for (int i = 0; i < n - 1; i++) { + result[i] = helpFibonacci(i + 1); + } + return result; + } + + public static int helpFibonacci(int n) { + if(n == 0) + return 0; + else if(n == 1) + return 1; + else + return helpFibonacci(n -1 ) + helpFibonacci(n - 2); + } + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + public static void main(String[] args) { + int[] a = fibonacci(15); + for (int i = 0; i < a.length; i++) { + System.out.println(a[i]); + } + } +} diff --git a/group20/331798361/assignment2/src/litestruts/LoginAction.java b/group20/331798361/assignment2/src/litestruts/LoginAction.java new file mode 100644 index 0000000000..bba4c11c9f --- /dev/null +++ b/group20/331798361/assignment2/src/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group20/331798361/assignment2/src/litestruts/Struts.java b/group20/331798361/assignment2/src/litestruts/Struts.java new file mode 100644 index 0000000000..e6b77ef929 --- /dev/null +++ b/group20/331798361/assignment2/src/litestruts/Struts.java @@ -0,0 +1,76 @@ +package litestruts; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.File; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + try { + // parse xml file + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse("src/litestruts/struts.xml"); + doc.getDocumentElement().normalize(); + + // get action items + NodeList list = doc.getElementsByTagName("action"); + for (int i = 0; i < list.getLength(); i++) { + Node node = list.item(i); + Element element = (Element) node; + // look for action-related class + if (element.getAttribute("name").equals(actionName)){ + + Class c = Class.forName(element.getAttribute("class")); + Object o = c.newInstance(); + + //set name + Method setName = c.getDeclaredMethod("setName", String.class); + setName.invoke(o, parameters.get("name")); + + //set password + Method setPassword = c.getDeclaredMethod("setPassword", String.class); + setPassword.invoke(o, parameters.get("password")); + + //execute + Method execute = c.getDeclaredMethod("execute", null); + // login result + String result = execute.invoke(o).toString(); + + //get login messsage + Method getMessage = c.getDeclaredMethod("getMessage", null); + HashMap map = new HashMap<>(); + map.put("message", getMessage.invoke(o).toString()); + + // new view with parameter map + View view = new View(); + view.setParameters(map); + NodeList list1 = element.getElementsByTagName("result"); + for (int j = 0; j < list1.getLength(); j++) { + Node node1 = list1.item(j); + Element element1 = (Element) node1; + if (element1.getAttribute("name").equals(result)) { + view.setJsp(node1.getTextContent()); + } + } + return view; + } + } + } catch (Exception e) { + System.out.println("parse error"); + } + return null; + } +} diff --git a/group20/331798361/assignment2/src/litestruts/StrutsTest.java b/group20/331798361/assignment2/src/litestruts/StrutsTest.java new file mode 100644 index 0000000000..f227801865 --- /dev/null +++ b/group20/331798361/assignment2/src/litestruts/StrutsTest.java @@ -0,0 +1,44 @@ +package litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group20/331798361/assignment2/src/litestruts/View.java b/group20/331798361/assignment2/src/litestruts/View.java new file mode 100644 index 0000000000..1eed614744 --- /dev/null +++ b/group20/331798361/assignment2/src/litestruts/View.java @@ -0,0 +1,23 @@ +package litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group20/331798361/assignment2/src/litestruts/struts.xml b/group20/331798361/assignment2/src/litestruts/struts.xml new file mode 100644 index 0000000000..d6da22a638 --- /dev/null +++ b/group20/331798361/assignment2/src/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group20/404130810/src/com/basic/datastructure/ArrayList.java b/group20/404130810/src/com/basic/datastructure/ArrayList.java new file mode 100644 index 0000000000..e91eb9ce5e --- /dev/null +++ b/group20/404130810/src/com/basic/datastructure/ArrayList.java @@ -0,0 +1,110 @@ +package com.basic.datastructure; + +public class ArrayList implements List { + + private Object[] elementData; + private int size; + + private int enableCapacity; + + public ArrayList() { + this.enableCapacity = 10; + this.elementData = new Object[enableCapacity]; + } + + @Override + public void add(Object o) { + growIfNeeded(); + elementData[size] = o; + this.size++; + } + + @Override + public void add(int index, Object o) { + rangeCheckForAdd(index); + growIfNeeded(); + + Object[] tmpObjects = new Object[elementData.length]; + System.arraycopy(elementData, 0, tmpObjects, 0, index); + tmpObjects[index] = o; + System.arraycopy(elementData, index, tmpObjects, index + 1, elementData.length - index - 1); + + elementData = tmpObjects; + + this.size++; + } + + @Override + public Object get(int index) { + if (index > size) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + return elementData[index]; + } + + @Override + public Object remove(int index) { + Object removedObj = this.get(index); + rangeCheck(index); + Object[] tmpObjects = new Object[elementData.length]; + + System.arraycopy(elementData, 0, tmpObjects, 0, index); + System.arraycopy(elementData, index + 1, tmpObjects, index, elementData.length - index - 1); + + elementData = tmpObjects; + + return removedObj; + } + + @Override + public int size() { + return size; + } + + @Override + public String toString() { + for (int i = 0; i < elementData.length; i++) { + System.out.print(elementData[i] + ","); + } + return ""; + } + + private void rangeCheck(int paramInt) { + if ((paramInt < 0) || (paramInt >= size)) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(paramInt)); + } + } + + private void rangeCheckForAdd(int paramInt) { + if ((paramInt < 0) || (paramInt > size)) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(paramInt)); + } + } + + private String outOfBoundsMsg(int paramInt) { + return "Index: " + paramInt + ", Size: " + size; + } + + private Object[] growIfNeeded() { + if (enableCapacity <= this.size) { + enableCapacity = enableCapacity * 2; + Object[] largerElementData = new Object[enableCapacity]; + System.arraycopy(elementData, 0, largerElementData, 0, elementData.length); + elementData = largerElementData; + } + return elementData; + } + + public static void main(String[] args) { + ArrayList list = new ArrayList(); + for (int i = 0; i <= 11; i++) { + list.add(String.valueOf(i)); + } + System.out.println(list.get(11)); + //list.add(10,"test"); + //list.get(10); + //list.remove(10); + //System.out.println(list); + } + +} diff --git a/group20/404130810/src/com/basic/datastructure/LinkedList.java b/group20/404130810/src/com/basic/datastructure/LinkedList.java new file mode 100644 index 0000000000..4fc92fddec --- /dev/null +++ b/group20/404130810/src/com/basic/datastructure/LinkedList.java @@ -0,0 +1,176 @@ +package com.basic.datastructure; + +public class LinkedList implements List { + private Node first; + private Node last; + + private int size; + + public void add(Object item) { + addLast(item); + } + + public void add(int index, Object item) { + checkRange(index); + if (index == 0) { + addFirst(item); + } else if (index == size) { + addLast(item); + } else { + Node tmpNode = new Node(item); + Node preNode = get(index - 1); + Node nextNode = get(index + 1); + preNode.next = tmpNode; + tmpNode.next = nextNode; + size ++; + } + } + + public Node get(int index) { + checkRange(index); + if(size > 0){ + int loopTimes = 0; + Node p = first; + while(index > loopTimes){ + p = p.next; + loopTimes ++; + } + return p; + } + + return null; + } + + public Object remove(int index) { + checkRange(index); + Node tmpNode = null; + if(index == 0){ + removeFirst(); + }else if(index == size -1){ + removeLast(); + }else{ + tmpNode = get(index); + Node preNode = get(index-1); + Node nextNode = get(index + 1); + preNode.next = nextNode; + size --; + } + + return tmpNode; + } + + public int size() { + return size; + } + + public void addFirst(Object item) { + if (size == 0) { + first = new Node(item); + last = first; + } else { + Node tmpNode = new Node(item); + tmpNode.next = first; + first = tmpNode; + } + size++; + } + + public void addLast(Object item) { + if (size == 0) { + first = new Node(item); + last = first; + } else { + last.next = new Node(item); + last = last.next; + } + size++; + } + + public Object removeFirst() { + Node tmpNode = first; + if(tmpNode == null){ + last = null; + }else if(size == 2){ + first = last; + last = null; + size --; + }else{ + first = first.next; + size--; + } + return tmpNode; + } + + public Object removeLast() { + Node tmpNode = null; + if(size == 1){ + this.removeFirst(); + }else if(size >0){ + int index = size - 1; + tmpNode = last; + get(index - 1).next = null; + last = get(index - 1); + size --; + } + return tmpNode; + } + + private void checkRange(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("Index: " + index + "Size: " + size); + } + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + Node p = first; + while (p != null) { + sb.append(p.item + "\n"); + p = p.next; + } + return sb.toString(); + } + + private static class Node { + private Object item; + private Node next; + Node(Object item) { + this.item = item; + } + } + + public static void main(String[] args) { + + /*Test add + LinkedList list = new LinkedList(); + for (int i = 0; i <= 5; i++) { + list.add(i); + } + list.add(3, "test"); + System.out.println(list); + */ + + /*Test remove + list.remove(3); + System.out.println(list); + */ + + /*Test removeLast and removeFirst + System.out.println(list); + list.removeLast(); + System.out.println(list); + list.removeLast(); + System.out.println(list); + list.removeLast(); + System.out.println(list); + */ + + /*Test from Java API + java.util.LinkedList linkedList = new java.util.LinkedList(); + linkedList.add("test"); + linkedList.removeFirst(); + System.out.println(linkedList); + */ + + } +} diff --git a/group20/404130810/src/com/basic/datastructure/List.java b/group20/404130810/src/com/basic/datastructure/List.java new file mode 100644 index 0000000000..dcc0c18e18 --- /dev/null +++ b/group20/404130810/src/com/basic/datastructure/List.java @@ -0,0 +1,10 @@ +package com.basic.datastructure; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + +} diff --git a/group20/404130810/src/com/basic/datastructure/Queue.java b/group20/404130810/src/com/basic/datastructure/Queue.java new file mode 100644 index 0000000000..8e2cb7f4d9 --- /dev/null +++ b/group20/404130810/src/com/basic/datastructure/Queue.java @@ -0,0 +1,33 @@ +package com.basic.datastructure; + +public class Queue { + LinkedList list = new LinkedList(); + private int size; + + public void enQueue(Object o){ + list.add(o); + size ++; + } + + public Object deQueue(){ + size --; + return list.removeLast(); + } + + public boolean isEmpty(){ + return list.size() == 0; + } + + public int size(){ + return size; + } + + public static void main(String[] args) { + Queue queue = new Queue(); + for (int i = 0; i < 10; i++) { + queue.enQueue(i); + } + queue.deQueue(); + System.out.println("Finished"); + } +} diff --git a/group20/404130810/src/com/basic/datastructure/Stack.java b/group20/404130810/src/com/basic/datastructure/Stack.java new file mode 100644 index 0000000000..bfff4d0633 --- /dev/null +++ b/group20/404130810/src/com/basic/datastructure/Stack.java @@ -0,0 +1,41 @@ +package com.basic.datastructure; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size; + + public void push(Object o){ + elementData.add(o); + size++; + } + public Object pop(){ + size --; + return elementData.remove(elementData.size() - 1); + } + + /** + * Looks at the object at the top of this stack without removing it from the stack. + * @return Object + */ + public Object peek(){ + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return size == 0; + } + public int size(){ + return size; + } + + public static void main(String[] args) { + Stack stack = new Stack(); + for (int i = 0; i < 10; i++) { + stack.push(i); + } + System.out.println(stack.peek()); + + stack.pop(); + System.out.println("Finished"); + } + +} diff --git a/group20/404130810/src/com/basic/practice/PolymorphicInJava.java b/group20/404130810/src/com/basic/practice/PolymorphicInJava.java new file mode 100644 index 0000000000..c8da98e61f --- /dev/null +++ b/group20/404130810/src/com/basic/practice/PolymorphicInJava.java @@ -0,0 +1,41 @@ +package com.basic.practice; + +/** + * + * @author Wu Alvin + * Java Polymorphic Only represent in method level + * + */ + +class Fruit{ + String name = "Fruit"; + public void print(int i){ + System.out.println("Fruit" + i); + } +} + + +class Apple extends Fruit{ + String name = "Apple"; + public void print(int i){ + System.out.println("Apple" + i); + } +} + + +public class PolymorphicInJava { + + public static void main(String[] args) { + Apple apple = new Apple(); + apple.print(100); + //Apple100 + System.out.println(apple.name); + //Apple + Fruit fruit = apple; + fruit.print(100); + //Apple100 + System.out.println(fruit.name); + //Fruit + } + +} diff --git a/group20/404130810/src/com/basic/practice/ValuePassInJava.java b/group20/404130810/src/com/basic/practice/ValuePassInJava.java new file mode 100644 index 0000000000..c162ba4fc8 --- /dev/null +++ b/group20/404130810/src/com/basic/practice/ValuePassInJava.java @@ -0,0 +1,44 @@ +package com.basic.practice; + +public class ValuePassInJava { + + /* + * Pass the Simple value, etc int String... + * Change will NOT happened + * + */ + public static void main(String[] args) { + String s = new String("123"); + int i = 1; + changeVal(i); + System.out.println(i); + + } + + private static void changeVal(int i){ + i = 2; + } + + /* + * Pass whole OBJECT, but change the Member variable + * Change will happened + */ + + /* + public static void main(String[] args) { + Person p = new Person(); + p.age = 10; + changeAge(p); + System.out.println(p.age); + } + + private static void changeAge(Person p){ + p.age = 20; + } + */ + +} + +class Person{ + int age; +} diff --git a/group20/404130810/src/com/coderising/array/ArrayUtil.java b/group20/404130810/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..6c03d28cc1 --- /dev/null +++ b/group20/404130810/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,155 @@ +package com.coderising.array; + +import java.util.ArrayList; +import java.util.List; + +public class ArrayUtil { + + /** + * һa , Ըֵû 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] a = + * [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int[] reversedArray = new int[origin.length]; + for (int i = origin.length - 1, j = 0; i >= 0 && j < origin.length; i--, j++) { + reversedArray[j] = origin[i]; + } + origin = reversedArray; + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int zeroCount = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) { + zeroCount++; + } + } + int[] removedZeroArray = new int[oldArray.length - zeroCount]; + + for (int i = 0, j = 0; i < oldArray.length; i++, j++) { + if (oldArray[i] == 0) { + j--; + continue; + } + removedZeroArray[j] = oldArray[i]; + } + return removedZeroArray; + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + List mergedArrayList = new ArrayList<>(); + return null; + } + + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] resultArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, resultArray, 0, oldArray.length); + return resultArray; + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ 磬 max = 15 , + * 򷵻صӦΪ [11235813] max = 1, 򷵻ؿ [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + + return null; + } + + private static int fibonacciNum(int n) { + if (n <= 2) { + return 1; + } else { + return fibonacciNum(n - 1) + fibonacciNum(n - 2); + } + } + + /** + * Сڸֵmax max = 23, صΪ[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + return null; + } + + /** + * ν ָǡõ֮ͣ6=1+2+3 һֵmax һ飬 Сmax + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + return null; + } + + /** + * seperator array array= [3,8,9], seperator = "-" 򷵻ֵΪ"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]); + if (i != array.length - 1) { + sb.append(seperator); + } + } + return sb.toString(); + } + + public static void main(String[] args) { + /* + * int[] origin = { 0, 1, 2, 0, 12 }; new + * ArrayUtil().removeZero(origin); + */ + /* + * int[] array1 = { 3, 5, 7, 8 }; int[] array2 = { 4, 5, 6, 7 }; new + * ArrayUtil().merge(array1, array2); + */ + /* + * int[] array = { 3, 8, 9, 10, 12 }; new ArrayUtil().grow(array, 9); + */ + /* + * int[] array = { 3, 8, 9, 10, 12 }; String seperator = "-"; + * System.out.println(new ArrayUtil().join(array, seperator)); + */ + } + +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/litestruts/Struts.java b/group20/404130810/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..1c0c09bbf8 --- /dev/null +++ b/group20/404130810/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,87 @@ +package com.coderising.litestruts; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.coderising.litestruts.utils.StrutsUtil; +import com.coderising.litestruts.view.View; + +public class Struts { + + public static View runAction(String actionName, Map params) { + + /* + * + * 0. ȡļstruts.xml + * + * 1. actionNameҵӦclass LoginAction, ͨʵ + * parametersеݣösetter parametersе ("name"="test" , + * "password"="1234") , ǾӦõ setNamesetPassword + * + * 2. ͨöexectue ÷ֵ"success" + * + * 3. ͨҵgetter getMessage, ͨã ֵγһHashMap , + * {"message": "¼ɹ"} , ŵViewparameters + * + * 4. struts.xmlе ,Լexecuteķֵ ȷһjsp + * ŵViewjspֶС + * + */ + View view = new View(); + String className = readActionInConfig(actionName); + List rtnList = invokeMethod(className, params); + String result = rtnList.get(0); + String msg = rtnList.get(1); + view.setParameters(buildViewParams(msg)); + view.setJsp(buildViewJsp(result,actionName)); + return view; + } + + + + private static String readActionInConfig(String actionName) { + StrutsUtil util = new StrutsUtil(); + return util.invokedAction(actionName); + } + + private static List invokeMethod(String className, Map params) { + + List rtnList = new ArrayList(); + try { + String name = params.get("name"); + String password = params.get("password"); + // Invoke set method + Class actionClass = Class.forName(className); + Method setNameMethod = actionClass.getMethod("setName", String.class); + Method setPasswordMethod = actionClass.getMethod("setPassword", String.class); + Object action = actionClass.newInstance(); + setNameMethod.invoke(action, name); + setPasswordMethod.invoke(action, password); + // Invoke execute method and add to the return List as first element + Method executeMethod = actionClass.getMethod("execute"); + rtnList.add(executeMethod.invoke(action).toString()); + // Invoke getMessage method and add to the return List as second element + Method getMessageMethod = actionClass.getMethod("getMessage"); + rtnList.add(getMessageMethod.invoke(action).toString()); + + } catch (Exception e) { + e.printStackTrace(); + } + return rtnList; + } + + private static Map buildViewParams(String msg) { + Map viewParams = new HashMap(); + viewParams.put("message", msg); + return viewParams; + } + + private static String buildViewJsp(String result, String actionName) { + StrutsUtil util = new StrutsUtil(); + return util.invokeResult(actionName,result); + } + +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/litestruts/action/LoginAction.java b/group20/404130810/src/com/coderising/litestruts/action/LoginAction.java new file mode 100644 index 0000000000..e8b28cf9cc --- /dev/null +++ b/group20/404130810/src/com/coderising/litestruts/action/LoginAction.java @@ -0,0 +1,42 @@ +package com.coderising.litestruts.action; + +/** + * һչʾ¼ҵ࣬ еû붼Ӳġ + * + * @author liuxin + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/litestruts/struts.xml b/group20/404130810/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..c7ee86e436 --- /dev/null +++ b/group20/404130810/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/litestruts/test/StrutsTest.java b/group20/404130810/src/com/coderising/litestruts/test/StrutsTest.java new file mode 100644 index 0000000000..affa1df821 --- /dev/null +++ b/group20/404130810/src/com/coderising/litestruts/test/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts.test; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +import com.coderising.litestruts.Struts; +import com.coderising.litestruts.view.View; + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //ԤIJһ + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git a/group20/404130810/src/com/coderising/litestruts/utils/StrutsUtil.java b/group20/404130810/src/com/coderising/litestruts/utils/StrutsUtil.java new file mode 100644 index 0000000000..9c42302bd1 --- /dev/null +++ b/group20/404130810/src/com/coderising/litestruts/utils/StrutsUtil.java @@ -0,0 +1,76 @@ +package com.coderising.litestruts.utils; + +import java.io.File; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class StrutsUtil { + + public final static String CONFIG_PATH = "../struts.xml"; + + public final static String CONFIG_NODE_ACTION = "action"; + + public final static String CONFIG_ATTR_NAME = "name"; + + public final static String CONFIG_ATTR_CLASS = "class"; + + public String invokedAction(String actionName){ + if(null != actionName && !"".equals(actionName)){ + Document doc = generateDoc(); + NodeList nodeList = doc.getElementsByTagName(CONFIG_NODE_ACTION); + for (int i = 0; i < nodeList.getLength(); i++) { + String actionNameConfiged = nodeList.item(i).getAttributes().getNamedItem(CONFIG_ATTR_NAME).getNodeValue(); + if(actionName.equals(actionNameConfiged)){ + return nodeList.item(i).getAttributes().getNamedItem(CONFIG_ATTR_CLASS).getNodeValue(); + } + } + } + throw new RuntimeException("actionName can't be found"); + } + + private Document generateDoc(){ + DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); + Document doc = null; + try { + DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); + doc = docBuilder.parse (lookupConfigFile()); + } catch (Exception e) { + e.printStackTrace(); + } + return doc; + } + + private File lookupConfigFile(){ + URL url = getClass().getResource(CONFIG_PATH); + return new File(url.getPath()); + } + + + public String invokeResult(String actionName, String result) { + Document doc = generateDoc(); + NodeList nodeList = doc.getElementsByTagName("result"); + List subNodeList = new ArrayList(); + for (int i = 0; i < nodeList.getLength(); i++) { + Node parentNode = nodeList.item(i).getParentNode(); + if(parentNode.getAttributes().getNamedItem(CONFIG_ATTR_NAME).getNodeValue().equals(actionName)){ + subNodeList.add(nodeList.item(i)); + } + } + for (int i = 0; i < subNodeList.size(); i++) { + Node node = subNodeList.get(i); + if(node.getAttributes().getNamedItem(CONFIG_ATTR_NAME).getNodeValue().equals(result)){ + return node.getTextContent(); + } + } + throw new RuntimeException("result can't be found"); + } + +} diff --git a/group20/404130810/src/com/coderising/litestruts/view/View.java b/group20/404130810/src/com/coderising/litestruts/view/View.java new file mode 100644 index 0000000000..0db8722980 --- /dev/null +++ b/group20/404130810/src/com/coderising/litestruts/view/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts.view; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git "a/group20/423184723/Test/\345\215\232\345\256\242\345\234\260\345\235\200" "b/group20/423184723/Test/\345\215\232\345\256\242\345\234\260\345\235\200" new file mode 100644 index 0000000000..b5457af5b6 --- /dev/null +++ "b/group20/423184723/Test/\345\215\232\345\256\242\345\234\260\345\235\200" @@ -0,0 +1 @@ +http://www.cnblogs.com/yyssyh213/p/6442285.html \ No newline at end of file diff --git a/group20/423184723/src/basic/ArrayList.java b/group20/423184723/src/basic/ArrayList.java new file mode 100644 index 0000000000..64a19bea8e --- /dev/null +++ b/group20/423184723/src/basic/ArrayList.java @@ -0,0 +1,78 @@ +package com.coding.basic; + +import com.sun.media.sound.EmergencySoundbank; + +public class ArrayList implements List { + /** + * 列表中元素的个数 + */ + private int size = 0; + + /** + * 初始化数组大小 + */ + private int arraySize = 100; + /** + * 初始化数组 + */ + private Object[] elementData = new Object[arraySize]; + + /** + * 添加方法 + */ + public void add(Object o){ + if(size>=(arraySize*0.75)){ + Object [] target = new Object[(int) (arraySize*1.5)]; + System.arraycopy(elementData,0,target,0,arraySize); + target[size-1] = o; + size++; + }else if(size<(arraySize*0.75)){ + elementData[size-1]=o; + size++; + } + } + /** + * 根据索引添加方法 + */ + public void add(int index, Object o){ + if(size >= arraySize*0.75){ + Object [] target = new Object[(int) (arraySize*1.5)]; + System.arraycopy(elementData,0,target,0,arraySize); + for (int j = target.length;j>=index;j--){ + target[j-1] = target[j-2]; + } + target[index] = o; + size++; + }else if(size < arraySize*0.75){ + for (int j = elementData.length;j>=index;j--){ + elementData[j-1] = elementData[j-2]; + } + elementData[index] = o; + size++; + } + } + /** + * 根据索引获取对象 + */ + public Object get(int index){ + return elementData[index]; + } + /** + * 根据索引移除对象 + */ + public Object remove(int index){ + for (int i = index; i < elementData.length; i++) { + elementData[i]=elementData[i+1]; + size++; + } + return elementData[index]; + } + /** + * 获取数组大小 + */ + public int size(){ + return this.size; + } + + +} diff --git a/group20/423184723/src/basic/BinaryTreeNode.java b/group20/423184723/src/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group20/423184723/src/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group20/423184723/src/basic/Iterator.java b/group20/423184723/src/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group20/423184723/src/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group20/423184723/src/basic/LinkedList.java b/group20/423184723/src/basic/LinkedList.java new file mode 100644 index 0000000000..9caf065304 --- /dev/null +++ b/group20/423184723/src/basic/LinkedList.java @@ -0,0 +1,146 @@ +package com.coding.basic; + +import com.coding.basic.LinkedList.Node; + +public class LinkedList implements List { + + private Node head; + private int size; + + public void add(Object o){ + if (head.data == null) { + head.data = o; + head.next = null; + size++; + return; + } + Node node = new Node(o); + Node curr = head; + while (curr.next != null) { + curr = curr.next; + } + curr.next = node; + size++; + } + public void add(int index , Object o){ + if (index < 0 || index > size) { + System.out.println(index + "无效指数"); + return; + } + if (head.data == null) { + if (index == 0) { + head.data = o; + head.next = null; + size++; + return; + } else { + System.out.println("无效指数"); + return; + } + } + Node node = new Node(o); + Node curr = head; + for (int i = 0; i < index - 1; i++) { + curr = curr.next; + } + Node temp = curr.next; + curr.next = node; + node.next = temp; + size++; + } + public Object get(int index){ + if (index < 0 || index > size) { + System.out.println(index + " is invalid index!"); + return null; + } + Node result = head; + for (int i = 0; i < index; i++) { + result = result.next; + } + return result; + } + public Object remove(int index){ + if (index < 0 || index > size) { + System.out.println(index + " is invalid index!"); + return null; + } + Node curr = head; + for (int i = 0; i < index - 1; i++) { + curr = curr.next; + } + Node result = curr.next; + curr.next = curr.next.next; + size--; + return result; + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + if (head.data == null) { + head.data = o; + head.next = null; + size++; + return; + } + Node temp = head; + head = new Node(o); + head.next = temp; + size++; + } + public void addLast(Object o){ + if (head.data == null) { + head.data = o; + head.next = null; + size++; + return; + } + Node node = new Node(o); + Node curr = head; + while (curr.next != null) { + curr = curr.next; + } + curr.next = node; + size++; + } + public Object removeFirst(){ + if (head.data == null) { + return null; + } + Node result = head; + head = head.next; + size--; + return result; + } + public Object removeLast(){ + if (head.data == null) { + return null; + } + Node curr = head; + for (int i = 0; i < size - 1; i++) { + curr = curr.next; + } + Node result = curr.next; + curr.next = null; + size--; + return result; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + public Node(Object o) { + data = o; + next = null; + } + + + + } +} diff --git a/group20/423184723/src/basic/List.java b/group20/423184723/src/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group20/423184723/src/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group20/423184723/src/basic/Queue.java b/group20/423184723/src/basic/Queue.java new file mode 100644 index 0000000000..bb4e6bef5c --- /dev/null +++ b/group20/423184723/src/basic/Queue.java @@ -0,0 +1,29 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList list = new LinkedList(); + public void enQueue(Object o){ + list.add(o); + } + + public Object deQueue(){ + int length = list.size(); + if (length == 0) { + return null; + } + return list.removeFirst(); + } + + public boolean isEmpty(){ + if (list.size() == 0) { + return true; + } else { + return false; + } + } + + public int size(){ + return list.size; + } +} diff --git a/group20/423184723/src/basic/Stack.java b/group20/423184723/src/basic/Stack.java new file mode 100644 index 0000000000..6f3def6f0f --- /dev/null +++ b/group20/423184723/src/basic/Stack.java @@ -0,0 +1,35 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + int length = elementData.size(); + if (length == 0) { + return null; + } + return elementData.remove(length - 1); + } + + public Object peek(){ + int length = elementData.size(); + if (length == 0) { + return null; + } + return elementData.get(length - 1); + } + public boolean isEmpty(){ + if (elementData.size() != 0) { + return false; + } else { + return true; + } + } + public int size(){ + return elementData.size(); + } +} diff --git a/group20/452472201/.gitignore b/group20/452472201/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group20/452472201/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group20/452472201/src/com/coding/basic/ArrayList.java b/group20/452472201/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..80746f1675 --- /dev/null +++ b/group20/452472201/src/com/coding/basic/ArrayList.java @@ -0,0 +1,114 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size=0; + + private Object[] elementData =new Object[5]; + + + private void ensureCapacityInternal(){ + if(size==elementData.length){ + Object[] newArray = new Object[size*2]; + System.arraycopy(elementData, 0, newArray, 0, elementData.length); + elementData=newArray; + } + } + + public void add(Object o){ + ensureCapacityInternal(); + elementData[size]=o; + size++; + } + + public void add(int index, Object o){ + ensureCapacityInternal(); + if(index<0){ + try { + throw new Exception(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + System.arraycopy(elementData, index, elementData, index+1,size-index ); + elementData[index]=o; + size++; + } + + public Object get(int index){ + if(index<0||index>=size){ + try { + throw new Exception(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return elementData[index]; + } + + public Object remove(int index){ + if(index>=size){ + try { + throw new Exception(); + } catch (Exception e) { + e.printStackTrace(); + } + }else{ + + int numMoved=size-index-1; + if(numMoved>0){ + System.arraycopy(elementData, index+1, elementData, index, numMoved); + } + + elementData[size--] = null; + } + return index; + + } + + + public int size(){ + return size; + } + + + private class Iter implements Iterator { + + private int coursor=-1; + + public boolean hasNext(){ + return coursor+1> 1); i++) { + int num = origin[i]; + origin[i] = origin[origin.length - 1 - i]; + origin[origin.length - 1 - i] = num; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + public static int[] removeZero(int[] oldArray) { + int count = 0;// 计数器 + /* + * 利用冒泡,将0元素向后排 {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * {1,3,4,5,0,6,6,0,5,4,7,6,7,0,5,0} {1,3,4,5,6,6,0,5,4,7,6,7,0,5,0,0} + * .... + */ + for (int i = 0; i < oldArray.length - count; i++) { + // 索引为i的元素为0,则依次将索引i的元素与i+1的元素对换 + if (oldArray[i] == 0) { + for (int j = i; j < oldArray.length - 1 - count; j++) { + int num = oldArray[j]; + oldArray[j] = oldArray[j + 1]; + oldArray[j + 1] = num; + } + count++;// 计数器+1 + i--;// 防止原索引i+1位置的元素为0, + } + } + // 创建新数组 + int[] newArray = new int[oldArray.length - count]; + System.arraycopy(oldArray, 0, newArray, 0, newArray.length); + return newArray; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + public static int[] removeZero2(int[] oldArray) { + int count = 0;// 计数器 + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) + count++;// 计数器+1 + } + // 创建新数组 + int[] newArray = new int[oldArray.length - count]; + for (int i = 0, j = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[j] = oldArray[i]; + j++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2) { + int[] newArray = new int[array1.length + array2.length]; + int i = 0, j = 0, k = 0; + while (i < array1.length && j < array2.length) { + // <= 都取 array1 + if (array1[i] <= array2[j]) { + // 等于时,将array2下标++ + if (array1[i] == array2[j]) + j++; + newArray[k++] = array1[i++]; + } else + newArray[k++] = array2[j++]; + + } + // 将没有循环完毕的元素插入 + while (i < array1.length) + newArray[k++] = array1[i++]; + while (j < array2.length) + newArray[k++] = array2[j++]; + int[] result = newArray; + // 长度缩短则新建数组 + if (k < newArray.length) { + result = new int[k]; + for (int l = 0; l < result.length; l++) + result[l] = newArray[l]; + } + return result; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max <= 1) + return new int[] {}; + int[] nums = new int[max]; + nums[0] = nums[1] = 1; + int flag; + for (flag = 0; (flag < max - 2 && nums[flag] + nums[flag + 1] < max); flag++) { + nums[flag + 2] = nums[flag] + nums[flag + 1]; + } + // 创建新数组 + int[] newArray = nums; + if (newArray.length != flag + 2) { + newArray = new int[flag + 2]; + for (int i = 0; i < newArray.length; i++) { + newArray[i] = nums[i]; + } + } + return newArray; + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + int[] array = new int[max>>1]; + int flag = 0; + for (int i = 2; i < max; i++) { + int j; + for (j = 2; j <= (i >> 1); j++) { + if (i % j == 0) + break; + + } + //如果大于,则证明j++有运行,已经完整对比 + if(j > i>>1) + array[flag++] = i; + + } + int[] newArray = array; + if(flag < array.length){ + newArray = new int[flag]; + for (int i = 0; i < newArray.length; i++) { + newArray[i] = array[i]; + } + } + return newArray; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + int[] array = new int[max]; + int flag = 0; + for (int i = 1; i < max; i++) { + int sum = 0; + for (int j = 1; j < i; j++) { + if (i % j == 0) + sum+=j; + } + //如果大于,则证明j++有运行,已经完整对比 + if(sum == i) + array[flag++] = i; + + } + int[] newArray = array; + if(flag < array.length){ + newArray = new int[flag]; + for (int i = 0; i < newArray.length; i++) { + newArray[i] = array[i]; + } + } + return newArray; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator) { + String str = ""; + for (int i = 0; i < array.length; i++) + str += i != array.length - 1 ? array[i] + seperator : array[i]; + return str; + } +} diff --git a/group20/592146505/coderising/src/org/wsc/array/ArrayUtilTest.java b/group20/592146505/coderising/src/org/wsc/array/ArrayUtilTest.java new file mode 100644 index 0000000000..009dec2938 --- /dev/null +++ b/group20/592146505/coderising/src/org/wsc/array/ArrayUtilTest.java @@ -0,0 +1,98 @@ +package org.wsc.array; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class ArrayUtilTest { + + @Test + public void testReverseArray() { + int[] nums = new int[]{7, 9 , 30, 3, 5}; + ArrayUtil.reverseArray(nums); + assertArrayEquals(nums, new int[]{5, 3 ,30, 9, 7}); + } + + /** + * 删除0 + */ + @Test + public void testRemoveZero() { + int[] nums = new int[]{0,7, 9 , 0,0,30,0, 3, 5,0}; + nums = ArrayUtil.removeZero(nums); + assertArrayEquals(nums, new int[]{7, 9 ,30, 3, 5}); + } + + /** + * 删除0 + */ + @Test + public void testRemoveZero2() { + int[] nums = new int[]{0,7, 9 , 0,0,30,0, 3, 5,0}; + nums = ArrayUtil.removeZero2(nums); + assertArrayEquals(nums, new int[]{7, 9 ,30, 3, 5}); + } + + /** + * 拼接 + */ + @Test + public void testJoin() { + int[] nums = new int[]{0,7, 9 , 0,0,30,0, 3, 5,0}; + String str = ArrayUtil.join(nums,"-"); + assertEquals(str, "0-7-9-0-0-30-0-3-5-0"); + } + + /** + * 扩容 + */ + @Test + public void testGrow() { + int[] nums = new int[]{0,7, 9 , 0,0,30,0, 3, 5}; + nums = ArrayUtil.grow(nums,3); + assertTrue(nums.length==12); + } + + /** + * 合并 + */ + @Test + public void testMerge() { + int[] nums = new int[]{3, 5, 7,8}; + int[] nums2 = new int[]{4, 5, 6,7,8}; + nums = ArrayUtil.merge(nums,nums2); + assertTrue(nums.length==6); + assertArrayEquals(nums, new int[]{3, 4 ,5, 6, 7,8}); + } + + /** + *斐波那契数列 + */ + @Test + public void testFibonacci() { + int[] nums = ArrayUtil.fibonacci(15); + assertTrue(nums.length==7); + assertArrayEquals(nums, new int[]{1,1,2,3,5,8,13}); + } + + /** + * 素数 + */ + @Test + public void testGetPrimes() { + int[] nums = ArrayUtil.getPrimes(23); + assertTrue(nums.length==8); + assertArrayEquals(nums, new int[]{2,3,5,7,11,13,17,19}); + } + + /** + * 完数 + */ + @Test + public void testGetPerfectNumbers() { + int[] nums = ArrayUtil.getPerfectNumbers(10000); + assertTrue(nums.length==4); + assertArrayEquals(nums, new int[]{6,28,496,8128}); + } + +} diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/Action.java b/group20/592146505/coderising/src/org/wsc/litestruts/Action.java new file mode 100644 index 0000000000..083519bac6 --- /dev/null +++ b/group20/592146505/coderising/src/org/wsc/litestruts/Action.java @@ -0,0 +1,21 @@ +package org.wsc.litestruts; + +import java.util.Set; + +public class Action { + + /** 标签名 */ + private String tag; + /** 属性 */ + private String name; + + /** 类名 */ + private String className; + + /** 子标签 */ + private Set statusElement; + + /** 文本内容 */ + private String textContent; + +} diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/LoginAction.java b/group20/592146505/coderising/src/org/wsc/litestruts/LoginAction.java new file mode 100644 index 0000000000..bb23f5eebb --- /dev/null +++ b/group20/592146505/coderising/src/org/wsc/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package org.wsc.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/Struts.java b/group20/592146505/coderising/src/org/wsc/litestruts/Struts.java new file mode 100644 index 0000000000..30a418979f --- /dev/null +++ b/group20/592146505/coderising/src/org/wsc/litestruts/Struts.java @@ -0,0 +1,124 @@ +package org.wsc.litestruts; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.wsc.litestruts.util.DocumentUtil; +import org.xml.sax.SAXException; + +public class Struts { + private static final DocumentUtil DOCUMENT_UTIL; + private static Document document; + static{ + /* 0. 读取配置文件struts.xml */ + DOCUMENT_UTIL = DocumentUtil.newInstance(); + try { + document = DOCUMENT_UTIL.getDocument("src/struts.xml"); + } catch (ParserConfigurationException | SAXException | IOException e) { + e.printStackTrace(); + } + } + + /** + * + * @param actionName + * @param parameters + * @return + */ + public static View runAction(String actionName, Map parameters) { + String className = null; + String jsp = null; + Map results = new HashMap(); + Node struts = document.getDocumentElement();// 获取根节点 + NodeList actions = struts.getChildNodes();// 获取子节点 + for (int i = 0; i < actions.getLength(); i++) { + // 过滤空节点 + if (actions.item(i).getNodeType() != Node.ELEMENT_NODE) + continue; + Element action = (Element) actions.item(i); + if (!action.getAttribute("name").equals(actionName)) + continue; + className = action.getAttribute("class"); + /* + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + */ + Class clazz = null; + Object instance = null; + try { + clazz = Class.forName(className); + instance = clazz.getConstructor().newInstance(); + Set keySet = parameters.keySet(); + for (String key : keySet) { + Object parameter = parameters.get(key); + Method method = instance.getClass().getMethod( + "set" + (key.substring(0, 1).toUpperCase() + key.substring(1)), parameter.getClass()); + method.invoke(instance, parameter); + } + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } + + /* 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" */ + String rt = null; + try { + Method method = clazz.getMethod("execute"); + rt = (String) method.invoke(instance); + } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + /* + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap + * , 例如 {"message": "登录成功"} , 放到View对象的parameters + */ + Field[] fields = instance.getClass().getDeclaredFields(); + Method[] methods = instance.getClass().getMethods(); + for (Field field : fields) { + String fieldName = field.getName(); + for (Method method : methods) { + if (method.getName() + .equals(("get" + (fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1))))) { + try { + results.put(fieldName, (String) method.invoke(instance)); + break; + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + } + } + NodeList resultNodes = action.getChildNodes(); + for (int j = 0; j < resultNodes.getLength(); j++) { + if (resultNodes.item(j).getNodeType() != Node.ELEMENT_NODE) + continue; + Element result = (Element) resultNodes.item(j); + if (!result.getAttribute("name").equals(rt)) + continue; + jsp = result.getTextContent(); + } + + } + /* + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + */ + View view = new View(); + view.setJsp(jsp); + view.setParameters(results); + return view; + } + +} diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/StrutsTest.java b/group20/592146505/coderising/src/org/wsc/litestruts/StrutsTest.java new file mode 100644 index 0000000000..8101e95fe3 --- /dev/null +++ b/group20/592146505/coderising/src/org/wsc/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package org.wsc.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/View.java b/group20/592146505/coderising/src/org/wsc/litestruts/View.java new file mode 100644 index 0000000000..f21906d1a5 --- /dev/null +++ b/group20/592146505/coderising/src/org/wsc/litestruts/View.java @@ -0,0 +1,26 @@ +package org.wsc.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group20/592146505/coderising/src/org/wsc/litestruts/util/DocumentUtil.java b/group20/592146505/coderising/src/org/wsc/litestruts/util/DocumentUtil.java new file mode 100644 index 0000000000..9125b244cd --- /dev/null +++ b/group20/592146505/coderising/src/org/wsc/litestruts/util/DocumentUtil.java @@ -0,0 +1,69 @@ +package org.wsc.litestruts.util; + +import java.io.File; +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +/** + * DOM解析工具类 + * 懒汉单例模式 + * @author Administrator + * @date 2017年2月28日下午9:45:39 + * @version v1.0 + * + */ +public class DocumentUtil { + private static DocumentUtil documentUtil; + + private DocumentUtil() { + super(); + } + + /** + * 获取实例 + * @return + */ + public static DocumentUtil newInstance(){ + if(documentUtil == null) + synchronized (DocumentUtil.class) { + if(documentUtil == null) + documentUtil = new DocumentUtil(); + } + return documentUtil; + } + + + /** + * 解析XML文件获取DOM树 + * @param fileUrl + * XML文件路径 + * @return + * @throws IOException + * @throws SAXException + * @throws ParserConfigurationException + */ + public Document getDocument(String fileUrl) throws ParserConfigurationException, SAXException, IOException{ + return getDocument(new File(fileUrl)); + } + /** + * 解析XML文件获取DOM树 + * @param file + * XML文件实例 + * @return + * @throws ParserConfigurationException + * @throws IOException + * @throws SAXException + */ + public Document getDocument(File xmlFile) throws ParserConfigurationException, SAXException, IOException{ + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//解析器工厂 + DocumentBuilder db = dbf.newDocumentBuilder();//解析器 + return db.parse(xmlFile);//DOM树 + } + +} diff --git a/group20/592146505/coderising/src/struts.xml b/group20/592146505/coderising/src/struts.xml new file mode 100644 index 0000000000..b709ec6636 --- /dev/null +++ b/group20/592146505/coderising/src/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group20/592146505/data _structure/src/org/wsc/exception/NullElementException.java b/group20/592146505/data _structure/src/org/wsc/exception/NullElementException.java new file mode 100644 index 0000000000..aa7763ef00 --- /dev/null +++ b/group20/592146505/data _structure/src/org/wsc/exception/NullElementException.java @@ -0,0 +1,23 @@ +package org.wsc.exception; + +/** + * + * 空元素异常 + * @author Administrator + * @date 2017年2月26日下午4:15:49 + * @version v1.0 + * + */ +public class NullElementException extends RuntimeException { + + private static final long serialVersionUID = 4729177529481680909L; + + public NullElementException() { + super(); + } + + public NullElementException(String message) { + super(message); + } + +} diff --git a/group20/592146505/data _structure/src/org/wsc/exception/RepeatingElementException.java b/group20/592146505/data _structure/src/org/wsc/exception/RepeatingElementException.java new file mode 100644 index 0000000000..a5b66c54a1 --- /dev/null +++ b/group20/592146505/data _structure/src/org/wsc/exception/RepeatingElementException.java @@ -0,0 +1,23 @@ +package org.wsc.exception; + +/** + * + * 重复元素异常 + * @author Administrator + * @date 2017年2月26日下午4:15:49 + * @version v1.0 + * + */ +public class RepeatingElementException extends RuntimeException { + + private static final long serialVersionUID = 4729177529481680909L; + + public RepeatingElementException() { + super(); + } + + public RepeatingElementException(String message) { + super(message); + } + +} diff --git a/group20/592146505/data _structure/src/org/wsc/list/ArrayList.java b/group20/592146505/data _structure/src/org/wsc/list/ArrayList.java new file mode 100644 index 0000000000..28b8db4132 --- /dev/null +++ b/group20/592146505/data _structure/src/org/wsc/list/ArrayList.java @@ -0,0 +1,234 @@ +package org.wsc.list; + +import java.util.Arrays; +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + +import javafx.stage.StageStyle; + +/** + * ArrayList类 + * + * @author c_malina007 + * @param + */ +public class ArrayList implements List { + + /** 元素个数 */ + private int size; + + /** 默认容量 */ + private static final int DEFAULT_CAPACITY = 10; + + /** 默认最大容量 */ + private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + /** 默认数组 */ + private static final Object[] EMPTY_ELEMENTDATA = {}; + + /** 用于存放元素 */ + private Object[] elementData; + + /** + * 无参构造将使用默认数组 + */ + public ArrayList() { + elementData = EMPTY_ELEMENTDATA; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + // @Override + // public boolean contains(Object o) { + // // TODO Auto-generated method stub + // return false; + // } + + @Override + public Iterator iterator() { + return new Itr(); + } + + private class Itr implements Iterator { + int cursor; // 当前索引 + int lastRet = -1;// + + @Override + public boolean hasNext() { + return cursor != size; + } + + @SuppressWarnings("unchecked") + @Override + public E next() { + if (cursor > size) { + throw new NoSuchElementException(); + } + Object[] elementData = ArrayList.this.elementData; + if (cursor >= elementData.length) { + throw new ConcurrentModificationException(); + } + return (E) elementData[lastRet = cursor++]; + } + + @Override + public void remove() { + if (lastRet < 0) + throw new IllegalStateException(); + try { + ArrayList.this.remove(lastRet); + cursor = lastRet; + lastRet = -1; + size--; + } catch (IndexOutOfBoundsException ex) { + throw new ConcurrentModificationException(); + } + } + + } + + @SuppressWarnings("unchecked") + @Override + public E[] toArray() { + return (E[]) elementData; + } + + @Override + public T[] toArray(T[] a) { + return null; + } + + @Override + public boolean add(E element) { + // 保证数组长度正确 + ensureCapacityInternal(size + 1); + // 使用后缀自操作符 + elementData[size++] = element; + return true; + } + + @Override + public boolean add(int index, E element) { + rangeCheckForAdd(index);// 进行添加操作的索引范围检查 + // 保证数组长度正确 + ensureCapacityInternal(size + 1); + // 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 + // destPos+length-1 位置 + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = element; + size++; + return true; + } + + private void ensureCapacityInternal(int minCapacity) { + if (elementData == EMPTY_ELEMENTDATA) + minCapacity = Math.max(minCapacity, DEFAULT_CAPACITY); + // 传入最小容量大于当前数组长度,则扩容 + if (minCapacity > elementData.length) + grow(minCapacity); + } + + /** + * 扩容 + * + * @param minCapacity + */ + private void grow(int minCapacity) { + int oldCapacity = elementData.length;// 获取原数组长度 + // 计算新容量 + int newCapacity = oldCapacity + (oldCapacity >> 1);// 原容量+(原容量/2),使用位移符提高运行速度 + newCapacity = newCapacity < minCapacity ? minCapacity : newCapacity; + if (newCapacity > MAX_ARRAY_SIZE) + newCapacity = hugeCapacity(newCapacity); + // 将原数组数据复制到一个长度为newCapacity的新数组中 + elementData = Arrays.copyOf(elementData, newCapacity); + } + + /** + * 传入容量是否大于最大容量常量,如大于最大容量,则返回int类型所能表示的最大值 ArrayList最大容量为int类型所能表示的最大值 + * + * @param minCapacity + * @return + */ + private int hugeCapacity(int minCapacity) { + if (minCapacity < 0) { + throw new OutOfMemoryError("The index cannot be negative"); + } + return minCapacity > MAX_ARRAY_SIZE ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; + } + + @SuppressWarnings("unchecked") + @Override + public E get(int index) { + rangeCheck(index);// 进行索引的范围检查 + return (E) elementData[index]; + } + + @SuppressWarnings("unchecked") + @Override + public E set(int index, E element) { + rangeCheck(index);// 进行索引的范围检查 + // 取到指定索引元素,将新元素置入该索引位,并返回原元素 + E oldValue = (E) elementData[index]; + elementData[index] = element; + return oldValue; + } + + @SuppressWarnings("unchecked") + @Override + public E remove(int index) { + rangeCheck(index);// 进行索引的范围检查 + // 获取指定索引处元素 + E rmValue = (E) elementData[index]; + // 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 + // destPos+length-1 位置 + System.arraycopy(elementData, index + 1, elementData, index, size - (index - 1)); + size--; + return rmValue; + } + + // @Override + // public int indexOf(Object o) { + // // TODO Auto-generated method stub + // return 0; + // } + + /** + * 添加时的索引范围检查 + * + * @param index + */ + private void rangeCheckForAdd(int index) { + if (index > this.size || index < 0)// 添加可以往末位插入,所以这里索引等于元素个数也可以 + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + /** + * 索引范围检查 + * + * @param index + */ + private void rangeCheck(int index) { + if (index < 0 || index >= this.size) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + /** + * 以字符串形式返回索引和元素个数信息 + * + * @param index + * @return + */ + private String outOfBoundsMsg(int index) { + return "Index: " + index + ", Size: " + this.size; + } + +} diff --git a/group20/592146505/data _structure/src/org/wsc/list/Iterator.java b/group20/592146505/data _structure/src/org/wsc/list/Iterator.java new file mode 100644 index 0000000000..59590bbf7e --- /dev/null +++ b/group20/592146505/data _structure/src/org/wsc/list/Iterator.java @@ -0,0 +1,21 @@ +package org.wsc.list; + +public interface Iterator { + /** + * 是否存在下一个元素 + * @return + */ + boolean hasNext(); + + /** + * 获取下一个元素 + * @return + */ + E next(); + + /** + * 删除当前元素 + */ + void remove(); + +} diff --git a/group20/592146505/data _structure/src/org/wsc/list/LinkedList.java b/group20/592146505/data _structure/src/org/wsc/list/LinkedList.java new file mode 100644 index 0000000000..b909cfeabc --- /dev/null +++ b/group20/592146505/data _structure/src/org/wsc/list/LinkedList.java @@ -0,0 +1,316 @@ +package org.wsc.list; + +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; + +/** + * LinkedList类 + * 实现List接口和Queue接口 + * 基于链表的集合 + * @author Administrator + * @date 2017年2月25日上午10:52:41 + * @version v1.0 + * + * @param + */ +public class LinkedList implements List,Queue { + + private int size; + Node first; // 链表的头节点 + Node last; // 链表的尾节点 + + private static class Node { + E item; // 存储数据 + Node prev; // 上一个节点 + Node next; // 下一个节点 + + Node(Node prev, E element, Node next) { + this.item = element; + this.next = next; + this.prev = prev; + } + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public Iterator iterator() { + return new Itr(); + } + + private class Itr implements Iterator { + int cursor; // 当前索引 + int lastRet = -1;// 上一次索引 + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public E next() { + if (cursor > size) { + throw new NoSuchElementException(); + } + return get(lastRet = cursor++); + } + + @Override + public void remove() { + if (lastRet < 0) + throw new IllegalStateException(); + try { + LinkedList.this.remove(lastRet); + cursor = lastRet; + lastRet = -1; + size--; + } catch (IndexOutOfBoundsException ex) { + throw new ConcurrentModificationException(); + } + } + + } + + @Override + public boolean add(E e) { + linkLast(e); + return true; + } + + @Override + public boolean add(int index, E element) { + checkPositionIndex(index);// 位置范围检查 + // 如果索引等于元素个数,则直接插入尾部 + if (index == size) { + linkLast(element); + } else { + linkBefore(element, node(index)); + } + return true; + } + + @Override + public E get(int index) { + return node(index).item; + } + + /** + * 维护头节点 + * + * @param e + */ + void linkFirst(E e) { + Node f = first; + // 创建新节点,将原头节点作为新节点的下一个节点 + Node newNode = new Node(null, e, f); + // 将新节点设置为头节点 + first = newNode; + // 如原头节点为null,则尾节点也为newNode + if (f == null) { + last = newNode; + } else {// 否则将新节点作为原头节点的上一个节点 + f.prev = newNode; + } + size++; + + } + + /** + * 维护尾节点 + * + * @param e + */ + void linkLast(E e) { + Node l = last; + // 创建新节点,将尾节点作为新节点的上一个节点 + Node newNode = new Node(l, e, null); + // 将新节点设置为尾节点 + last = newNode; + // 如原尾节点为null,则头节点也为newNode + if (l == null) { + first = newNode; + } else {// 否则将新节点作为原尾节点的下一个节点 + l.next = newNode; + } + size++; + } + + /** + * 在指定节点前插入新节点 + * + * @param e + * @param node + */ + void linkBefore(E e, Node node) { + // 获取node的上一个节点,并创建新节点,将pred做为新节点的上一个节点,将node作为新节点的下一个节点 + final Node pred = node.prev; + final Node newNode = new Node<>(pred, e, node); + // 将node的上一个节点指向newNode + node.prev = newNode; + // 如prev为null,则说明node为first,那么将新节点设为first + if (pred == null) { + first = newNode; + } else {// 否则,将新节点设为pred的下一个节点 + pred.next = newNode; + } + size++; + } + + /** + * 获取节点 + * + * @param index + * @return + */ + Node node(int index) { + // 索引小于长度的2分之一则从前向后遍历,否则从后向前遍历,减少遍历次数 + if (index < (size >> 1)) { + Node x = first; + for (int i = 0; i < index; i++) + x = x.next; + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) + x = x.prev; + return x; + } + } + + /** + * 获取头节点 + * + * @return + */ + public E getFirst() { + Node f = first; + if (f == null) + throw new NoSuchElementException(); + return f.item; + } + + /** + * 获取尾节点 + * + * @return + */ + public E getLast() { + Node l = last; + if (l == null) + throw new NoSuchElementException(); + return l.item; + } + + @Override + public E set(int index, E e) { + checkElementIndex(index);// 索引范围检查 + // 获取索引处节点,填入新值,返回原值 + Node x = node(index); + E oldVal = x.item; + x.item = e; + return oldVal; + } + + @Override + public E remove(int index) { + checkElementIndex(index);// 索引范围检查 + return unlink(node(index)); + } + + public E removeFirst() { + //获取头节点 + final Node f = first; + if (f == null) + throw new NoSuchElementException(); + return remove(0); + } + + /** + * 删除节点 + * + * @param x + * @return + */ + E unlink(Node x) { + // 获取此节点的上一个节点和下一个节点 + E element = x.item; + Node prev = x.prev; + Node next = x.next; + // 如prev节点为null,则说明x节点为first,那么将next节点设为first + if (prev == null) { + first = next; + } else {// 否则,将prev节点的下一个节点设为next + prev.next = next; + } + // 如next节点为null,则说明x节点为last,那么将prev节点设为last + if (next == null) { + last = prev; + } else {// 否则,将next节点的上一个节点设为prev + next.prev = prev; + } + x.item = null; + size--; + return element; + } + + @Override + public void enQueue(E e) { + linkLast(e); + } + + @Override + public E deQueue() { + return removeFirst(); + } + + /** + * 位置范围检查 >0 && <=size + * + * @param index + */ + private void checkPositionIndex(int index) { + if (index > this.size || index < 0)// 添加可以往末位插入,所以这里索引等于元素个数也可以 + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + /** + * 索引范围检查 >0 && = this.size) + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } + + /** + * 以字符串形式返回索引和元素个数信息 + * + * @param index + * @return + */ + private String outOfBoundsMsg(int index) { + return "Index: " + index + ", Size: " + this.size; + } + + @Override + public E[] toArray() { + // TODO Auto-generated method stub + return null; + } + + @Override + public T[] toArray(T[] a) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/group20/592146505/data _structure/src/org/wsc/list/List.java b/group20/592146505/data _structure/src/org/wsc/list/List.java new file mode 100644 index 0000000000..2fd90c6395 --- /dev/null +++ b/group20/592146505/data _structure/src/org/wsc/list/List.java @@ -0,0 +1,106 @@ +package org.wsc.list; + +/** + * List接口 + * + * @author Administrator + * @date 2017年2月20日下午9:15:32 + * @version v1.0 + * + * @param + */ +public interface List { + + /** + * 获取集合元素个数 + * + * @return + */ + int size(); + + /** + * 集合是否为空 + * + * @return + */ + boolean isEmpty(); + + // /** + // * 是否包含指定元素 + // * @param o + // * @return + // */ + // boolean contains(Object o); + + /** + * 获取当前集合迭代器对象 + * + * @return + */ + Iterator iterator(); + + /** + * 返回集合数组对象 + * + * @return + */ + Object[] toArray(); + + /** + * 将集合元素复制到新数组中 + * + * @param a + * @return + */ + T[] toArray(T[] a); + + /** + * 在集合末尾追加元素 + * + * @param e + * @return + */ + boolean add(E e); + + /** + * 将元素添加至指定指定索引处 + * + * @param index + * @param e + * @return + */ + boolean add(int index, E e); + + /** + * 获取指定索引处元素 + * + * @param index + * @return + */ + E get(int index); + + /** + * 替换指定索引处元素为新元素,并返回被替换元素, + * + * @param index + * @param e + * @return + */ + E set(int index, E e); + + /** + * 删除并返回指定指定索引处元素 + * + * @param index + * @return + */ + E remove(int index); + + // /** + // * 返回该对象在集合中的下标,不存在返回-1 + // * @param o + // * @return + // */ + // int indexOf(Object o); + +} \ No newline at end of file diff --git a/group20/592146505/data _structure/src/org/wsc/list/Queue.java b/group20/592146505/data _structure/src/org/wsc/list/Queue.java new file mode 100644 index 0000000000..2087335e58 --- /dev/null +++ b/group20/592146505/data _structure/src/org/wsc/list/Queue.java @@ -0,0 +1,42 @@ +package org.wsc.list; + +/** + * + * 队列 + * + * @author Administrator + * @date 2017年2月25日下午6:08:01 + * @version v1.0 + * + * @param + */ +public interface Queue { + + /** + * 入列 + * + * @param e + */ + public void enQueue(E e); + + /** + * 出列 + * + * @return + */ + public E deQueue(); + + /** + * 是否为空 + * + * @return + */ + public boolean isEmpty(); + + /** + * 元素长度 + * + * @return + */ + public int size(); +} diff --git a/group20/592146505/data _structure/src/org/wsc/stack/Stack.java b/group20/592146505/data _structure/src/org/wsc/stack/Stack.java new file mode 100644 index 0000000000..96b931ca07 --- /dev/null +++ b/group20/592146505/data _structure/src/org/wsc/stack/Stack.java @@ -0,0 +1,24 @@ +package org.wsc.stack; + +import org.wsc.list.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group20/592146505/data _structure/src/org/wsc/tree_node/BinaryTreeNode.java b/group20/592146505/data _structure/src/org/wsc/tree_node/BinaryTreeNode.java new file mode 100644 index 0000000000..b68784541d --- /dev/null +++ b/group20/592146505/data _structure/src/org/wsc/tree_node/BinaryTreeNode.java @@ -0,0 +1,166 @@ +package org.wsc.tree_node; + +import org.wsc.exception.NullElementException; +import org.wsc.exception.RepeatingElementException; + +/** + * BinaryTreeNode 二叉树结构 + * + * + * @author Administrator + * @date 2017年2月26日下午5:47:32 + * @version v1.0 + * + * @param + * 必须实现Comparable接口 + */ +@SuppressWarnings("rawtypes") +public class BinaryTreeNode { + + /** 左节点 */ + private BinaryTreeNode left; + /** 数据区 */ + private E data; + /** 右节点 */ + private BinaryTreeNode right; + + /** + * 插入 + * + * @param data + * @return + */ + @SuppressWarnings("unchecked") + public BinaryTreeNode insert(E data) { + if (data == null) + throw new NullElementException("Do not insert a null"); + // 当前数据区为空,则将data放入数据区 + if (this.data == null) { + this.data = data; + return this; + } + // 对比当前数据区数据和data大小 + int result = this.data.compareTo(data); + // 如果相等,则抛出异常 + if (result == 0) + throw new RepeatingElementException("Do not insert duplicate element"); + // 当前数据区数据大于data,将data递归放入左节点 + if (result > 0) { + // 左节点为空,则将数据置入左节点 + if (left == null) + left = new BinaryTreeNode(data); + else// 左节点不为空,则将数据递归置入左节点 + left.insert(data); + } else { + // 右节点为空,则将数据置入右节点 + if (right == null) + right = new BinaryTreeNode(data); + else// 右节点不为空,则将数据递归置入右节点 + right.insert(data); + } + return this; + } + + /** + * 查询 + * + * @param data + * @return + */ + @SuppressWarnings("unchecked") + public BinaryTreeNode seek(E data) { + checkCurrElement(); + if (data == null) + return null; + // 对比当前数据区数据和data大小 + int result = this.data.compareTo(data); + if (result == 0) { + return this; + } else if (result > 0) {// 当前数据区数据大于data,递归对比左节点 + return left == null ? null : left.seek(data); + } else {// 当前数据区数据小于data,递归对比右节点 + return right == null ? null : right.seek(data); + } + + } + + /** + * 删除 + * + * @param data + * @return + */ + public BinaryTreeNode remove(E data) { + return removeChild(null, data); + } + + @SuppressWarnings("unchecked") + public BinaryTreeNode removeChild(BinaryTreeNode supNode, E data) { + checkCurrElement(); + if (data == null) + return null; + // 对比当前数据区数据和data大小 + int result = this.data.compareTo(data); + // 如果相同,将通过父节点将子节点引用置为null + if (supNode != null && result == 0) { + if (supNode.left == this) + supNode.left = null; + else + supNode.right = null; + } else if (result > 0) {// 当前数据区数据大于data,递归对比左节点 + return left == null ? null : left.removeChild(this, data); + } else {// 当前数据区数据小于data,递归对比右节点 + return right == null ? null : right.removeChild(this, data); + } + return this; + } + + /** + * 检查当前节点元素是否有效 + */ + private void checkCurrElement() { + if (this.data == null) + throw new NullElementException("The current node element is null"); + } + + public BinaryTreeNode() { + super(); + } + + public BinaryTreeNode(E data) { + super(); + this.data = data; + } + + public BinaryTreeNode(BinaryTreeNode left, E data, BinaryTreeNode right) { + super(); + this.left = left; + this.data = data; + this.right = right; + } + + public E getData() { + return data; + } + + public void setData(E data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + +} diff --git "a/group20/755659358/blogs/blog\345\234\260\345\235\200.txt" "b/group20/755659358/blogs/blog\345\234\260\345\235\200.txt" new file mode 100644 index 0000000000..82dd8add37 --- /dev/null +++ "b/group20/755659358/blogs/blog\345\234\260\345\235\200.txt" @@ -0,0 +1 @@ +week02:http://www.jianshu.com/p/22d2cbefdaa1 diff --git "a/group20/755659358/blogs/\350\256\241\347\256\227\346\234\272\351\203\250\344\273\266\347\220\206\350\247\243.txt" "b/group20/755659358/blogs/\350\256\241\347\256\227\346\234\272\351\203\250\344\273\266\347\220\206\350\247\243.txt" new file mode 100644 index 0000000000..155001683a --- /dev/null +++ "b/group20/755659358/blogs/\350\256\241\347\256\227\346\234\272\351\203\250\344\273\266\347\220\206\350\247\243.txt" @@ -0,0 +1,2 @@ + 对计算机硬件的理解 + 计算机中cpu是核心部件,cpu是主要的计算部件,所有的逻辑运算和算术运算都是由cpu来玩成的。但cpu只管运算,怎么运算,何时运算,运算什么这些cpu都是不管的,这些其实就是一个个的指令,指令用来表示所有运算的信息,包括做什么运算,运算什么,运算结果如何处置等。这些指令都是存在内存当中的,cpu按照一定的顺序从内存当中读取指令,执行指令做运算,然后按照相应的指令输出结果。这就是一个简单的程序运行过程。内存空间是有限的,另外,内存上的指令也不能持久化的保存,断电之后就没有了。所以需要一个硬件保存大的二进制资源以及持久化的保存指令,所以就有了硬盘。所以计算机先从硬盘中读取指令和资源到内存当中来,然后cpu再从内存当中读取指令和资源,做运算,运算完之后再按照指令将输出保存在内存中或者硬盘中,程序执行完毕。 diff --git a/group20/755659358/week01/src/liuxincourse/ArrayList.java b/group20/755659358/week01/src/liuxincourse/ArrayList.java new file mode 100644 index 0000000000..8a4434041f --- /dev/null +++ b/group20/755659358/week01/src/liuxincourse/ArrayList.java @@ -0,0 +1,56 @@ +package liuxincourse; + +import java.util.Arrays; + + +public class ArrayList implements List{ + + private int size=0; + + private Object [] elementDataObjects = new Object[3]; + + public void add (Object o){ + if (size>=elementDataObjects.length) { + elementDataObjects=Arrays.copyOf(elementDataObjects, elementDataObjects.length+50); + } + elementDataObjects[size]=o; + size++; + } + + public void add (int index ,Object o){ + if (index>=size||index<0) { + throw new IndexOutOfBoundsException(); + } + if (size>=elementDataObjects.length) { + elementDataObjects=Arrays.copyOf(elementDataObjects, elementDataObjects.length+50); + } + System.arraycopy(elementDataObjects, index, elementDataObjects, index+1, size-index); + elementDataObjects[index]=o; + size++; + } + + public Object get (int index){ + if (index>=size||index<0) { + throw new IndexOutOfBoundsException(); + } + return elementDataObjects[index]; + } + + public Object remove(int index){ + if (index>=size||index<0) { + throw new IndexOutOfBoundsException(); + } + Object rem=elementDataObjects[index]; + System.arraycopy(elementDataObjects, index+1, elementDataObjects, index, size-index-1); + size--; + return rem; + } + + public int size(){ + return size; + } + +// public Iterator iterator(){ +// +// } +} diff --git a/group20/755659358/week01/src/liuxincourse/LinkedList.java b/group20/755659358/week01/src/liuxincourse/LinkedList.java new file mode 100644 index 0000000000..36e46e6412 --- /dev/null +++ b/group20/755659358/week01/src/liuxincourse/LinkedList.java @@ -0,0 +1,120 @@ +package liuxincourse; + + +public class LinkedList implements List{ + + private Node head; + + private int size=0; + + + public void add(Object o){ + if (size==0) { + head=new Node(); + head.data=o; + size++; + return; + } + Node last=head; + for (int i = 0; i < size-1; i++) { + last=last.next; + } + Node added=new Node(); + last.next=added; + added.data=o; + size++; + } + + public void add(int index,Object o){ + if (index<0||index>size) { + throw new IndexOutOfBoundsException(); + } + Node pre=getNode(index-1); + Node next=getNode(index); + Node addedNode=new Node(); + addedNode.data=o; + pre.next=addedNode; + addedNode.next=next; + size++; + } + + private Node getNode(int index){ + Node node=head; + + for (int i = 0; i < index; i++) { + node=node.next; + } + + return node; + } + + public Object get(int index){ + if (index<0||index>size-1) { + throw new IndexOutOfBoundsException(); + } + if (index==0&&head==null) { + return null; + } + return getNode(index).data; + + } + + public Object remove(int index) { + if (index<0||index>size-1) { + throw new IndexOutOfBoundsException(); + } + Node pre=getNode(index-1); + Node next=getNode(index+1); + pre.next=next; + return getNode(index); + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + if (head==null) { + head=new Node(); + head.data=o; + size++; + return; + } + Node addNode=new Node(); + addNode.data=o; + addNode.next=head; + head=addNode; + size++; + } + + public void addLast(Object o){ + Node preLast=getNode(size-1); + Node addNode=new Node(); + addNode.data=o; + preLast.next=addNode; + size++; + } + + public Object removeFirst(){ + Node preHead=head; + head=head.next; + size--; + return preHead.data; + } + + public Object removeLast(){ + Node preLast=getNode(size-1); + Node last=getNode(size-2); + last.next=null; + size--; + return preLast.data; + } + + private static class Node{ + + Object data; + Node next; + + } + +} diff --git a/group20/755659358/week01/src/liuxincourse/List.java b/group20/755659358/week01/src/liuxincourse/List.java new file mode 100644 index 0000000000..c4eaa0a02c --- /dev/null +++ b/group20/755659358/week01/src/liuxincourse/List.java @@ -0,0 +1,10 @@ +package liuxincourse; + +public interface List { + + void add(Object o); + void add(int index,Object o); + Object get(int index); + Object remove(int index); + int size(); +} diff --git a/group20/755659358/week01/src/liuxincourse/Queue.java b/group20/755659358/week01/src/liuxincourse/Queue.java new file mode 100644 index 0000000000..bbe11c043d --- /dev/null +++ b/group20/755659358/week01/src/liuxincourse/Queue.java @@ -0,0 +1,25 @@ +package liuxincourse; + +public class Queue { + + LinkedList list=new LinkedList(); + + public void enQueue(Object o){ + list.add(o); + } + + public Object deQueue(){ + + return list.removeFirst(); + } + + public boolean isEmpty() { + + return size()==0?true:false; + } + + public int size(){ + return list.size(); + } + +} diff --git a/group20/755659358/week01/src/liuxincourse/Stack.java b/group20/755659358/week01/src/liuxincourse/Stack.java new file mode 100644 index 0000000000..552d8c9f9e --- /dev/null +++ b/group20/755659358/week01/src/liuxincourse/Stack.java @@ -0,0 +1,27 @@ +package liuxincourse; + +public class Stack { + + private LinkedList elementData=new LinkedList(); + + public void push (Object o){ + elementData.addFirst(o); + } + + public Object pop() { + return elementData.removeFirst(); + } + + public Object peek(){ + return elementData.get(0); + } + + public boolean isEmpty(){ + return size()==0?true:false; + } + + public int size() { + return elementData.size(); + } + +} diff --git a/group20/755659358/week01/test/liuxincourse/ArrayListTest.java b/group20/755659358/week01/test/liuxincourse/ArrayListTest.java new file mode 100644 index 0000000000..8b8d82b3b1 --- /dev/null +++ b/group20/755659358/week01/test/liuxincourse/ArrayListTest.java @@ -0,0 +1,53 @@ +package liuxincourse; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class ArrayListTest { + + + @Test + public void testAdd(){ + ArrayList list=new ArrayList(); + list.add(12); + list.add(2); + list.add(8); + assertEquals(8, list.get(2)); + } + + @Test + public void testAddIndex(){ + ArrayList list=new ArrayList(); + list.add(12); + list.add(2); + list.add(8); + list.add(1,33); + list.add(6); + list.add(7); + assertEquals(8, list.get(3)); + } + + @Test + public void testRemove(){ + ArrayList list=new ArrayList(); + list.add(12); + list.add(2); + list.add(8); + list.add(1,33); + list.remove(1); + assertEquals(2, list.get(1)); + } + + @Test + public void testSize(){ + ArrayList list=new ArrayList(); + list.add(12); + list.add(2); + list.add(8); + list.add(9); + list.add(77); + assertEquals(5, list.size()); + } + +} diff --git a/group20/755659358/week01/test/liuxincourse/LinkedListTest.java b/group20/755659358/week01/test/liuxincourse/LinkedListTest.java new file mode 100644 index 0000000000..69857b0e29 --- /dev/null +++ b/group20/755659358/week01/test/liuxincourse/LinkedListTest.java @@ -0,0 +1,69 @@ +package liuxincourse; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class LinkedListTest { + + @Test + public void testAdd() { + LinkedList list=new LinkedList(); + list.add(33); + list.add(44); + list.add(55); + list.add(88); + assertEquals(88, list.get(3)); + } + + @Test + public void testAddIndex() { + LinkedList list=new LinkedList(); + list.add(33); + list.add(44); + list.add(55); + list.add(1, 88); + assertEquals(55, list.get(3)); + } + + @Test + public void testAddFirst() { + LinkedList list=new LinkedList(); + list.add(33); + list.add(44); + list.add(55); + list.addFirst(88); + assertEquals(88, list.get(0)); + } + + @Test + public void testAddLast() { + LinkedList list=new LinkedList(); + list.add(33); + list.add(44); + list.add(55); + list.addFirst(88); + list.addLast(00); + assertEquals(00, list.get(list.size()-1)); + } + + @Test + public void testRemoveFirst() { + LinkedList list=new LinkedList(); + list.add(33); + list.add(44); + list.add(55); + list.addFirst(88); + assertEquals(88, list.removeFirst()); + } + + @Test + public void testRemoveLast() { + LinkedList list=new LinkedList(); + list.add(33); + list.add(44); + list.add(55); + list.addFirst(88); + assertEquals(55, list.removeLast()); + } +} diff --git a/group20/755659358/week01/test/liuxincourse/QueueTest.java b/group20/755659358/week01/test/liuxincourse/QueueTest.java new file mode 100644 index 0000000000..613df89fc3 --- /dev/null +++ b/group20/755659358/week01/test/liuxincourse/QueueTest.java @@ -0,0 +1,27 @@ +package liuxincourse; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class QueueTest { + + @Test + public void testEnqueue() { + Queue queue=new Queue(); + queue.enQueue(11); + queue.enQueue(22); + assertEquals(11, queue.deQueue()); + } + + @Test + public void testIsempty() { + Queue queue=new Queue(); + queue.enQueue(11); + queue.enQueue(22); + queue.deQueue(); + queue.deQueue(); + assertEquals(true, queue.isEmpty()); + } + +} diff --git a/group20/755659358/week01/test/liuxincourse/StackTest.java b/group20/755659358/week01/test/liuxincourse/StackTest.java new file mode 100644 index 0000000000..9f1175ffea --- /dev/null +++ b/group20/755659358/week01/test/liuxincourse/StackTest.java @@ -0,0 +1,26 @@ +package liuxincourse; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class StackTest { + + @Test + public void testPush() { + Stack stack=new Stack(); + stack.push(22); + stack.push(33); + assertEquals(33, stack.pop()); + } + + @Test + public void testIsempty() { + Stack stack=new Stack(); + stack.push(22); + stack.push(33); + stack.pop(); + assertEquals(false, stack.isEmpty()); + } + +} diff --git a/group20/755659358/week01/test/liuxincourse/SuiteTest.java b/group20/755659358/week01/test/liuxincourse/SuiteTest.java new file mode 100644 index 0000000000..5c12e657b6 --- /dev/null +++ b/group20/755659358/week01/test/liuxincourse/SuiteTest.java @@ -0,0 +1,14 @@ +package liuxincourse; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ArrayListTest.class,LinkedListTest.class,QueueTest.class,StackTest.class}) +public class SuiteTest { + +} diff --git a/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtil.java b/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtil.java new file mode 100644 index 0000000000..e4985900cb --- /dev/null +++ b/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtil.java @@ -0,0 +1,219 @@ +package com.coderising.practice.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int j = origin.length - 1; + for (int i = 0; i <= j; i++, j--) { + int temp = origin[i]; + origin[i] = origin[j]; + origin[j] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + ArrayList list = new ArrayList<>(); + for (int i = 0; i < oldArray.length; i++) { + list.add(oldArray[i]); + } + for (Iterator iterator = list.iterator(); iterator.hasNext();) { + Integer integer = (Integer) iterator.next(); + if (integer.equals(0)) { + iterator.remove(); + } + } + + return integerListToArray(list); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + ArrayList list = new ArrayList<>(); + for (int i = 0; i < array1.length; i++) { + if (list.contains(Integer.valueOf(array1[i]))) { + continue; + } + list.add(Integer.valueOf(array1[i])); + } + for (int i = 0; i < array2.length; i++) { + if (list.contains(Integer.valueOf(array2[i]))) { + continue; + } + list.add(Integer.valueOf(array2[i])); + } + Collections.sort(list); + return integerListToArray(list); + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + + return Arrays.copyOf(oldArray, oldArray.length + size); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max < 2) { + return new int[0]; + } + ArrayList list = new ArrayList<>(); + list.add(1); + list.add(1); + int nextFibo = list.get(list.size() - 2) + list.get(list.size() - 1); + while (nextFibo < max) { + list.add(nextFibo); + nextFibo = list.get(list.size() - 2) + list.get(list.size() - 1); + } + + return integerListToArray(list); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + if (max<2) { + return new int[]{}; + } + ArrayList list = new ArrayList<>(); + + for (int i = 2; i < max; i++) { + if (isPrime(i)) { + list.add(i); + } + } + return integerListToArray(list); + } + + public int[] integerListToArray(List list){ + int len = list.size(); + int[] result = new int[len]; + for (int i = 0; i < len; i++) { + result[i] = list.get(i); + } + return result; + } + + public boolean isPrime(int a) { + boolean flag = true; + for (int i = 2; i <= Math.sqrt(a); i++) { + if (a % i == 0) { + flag = false; + break; + } + } + return flag; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + ArrayList list=new ArrayList<>(); + for (int i = 2; i < max; i++) { + int [] splits=numSplit(i); + if (sumArray(splits)==i) { + list.add(i); + } + } + + return integerListToArray(list); + } + + public int sumArray(int[] arr){ + int sum=0; + for (int i = 0; i < arr.length; i++) { + sum+=arr[i]; + } + return sum; + } + + public int[] numSplit(int x){ + if (x<=1) { + return new int[]{}; + } + if (x==2) { + return new int[]{1,2}; + } + int k=1; + ArrayList list=new ArrayList<>(); + while (k<=x&&(x/k>=2)) { + if (x%k==0) { + list.add(k); + } + k++; + } + + + return integerListToArray(list); + } + + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + StringBuilder sb=new StringBuilder(); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]); + if (i!=array.length-1) { + sb.append(seperator); + } + } + return sb.toString(); + } + +} diff --git a/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtisTest.java b/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtisTest.java new file mode 100644 index 0000000000..2984b2719c --- /dev/null +++ b/group20/755659358/week02/src/com/coderising/practice/array/ArrayUtisTest.java @@ -0,0 +1,73 @@ +package com.coderising.practice.array; + +import static org.junit.Assert.*; + +import java.util.ArrayList; + +import org.junit.Before; +import org.junit.Test; + +import com.coderising.practice.array.ArrayUtil; + +public class ArrayUtisTest { + + private ArrayUtil util; + + @Before + public void init(){ + util=new ArrayUtil(); + } + + + @Test + public void testReverse(){ + int [] origin={1,2,3,4,6}; + ArrayList list=new ArrayList<>(); + list.add(1); + list.add(2); + util.reverseArray(origin); + assertArrayEquals(new int[]{6,4,3,2,1}, origin); + } + + @Test + public void testRomoveZero(){ + int [] origin={1,2,3,0,4,0,6}; + assertArrayEquals(new int[]{1,2,3,4,6}, util.removeZero(origin)); + } + + @Test + public void testMerge(){ + int [] a1={3,0,4,6}; + int [] a2={3,6,8,10}; + assertArrayEquals(new int[]{0,3,4,6,8,10}, util.merge(a1,a2)); + } + + @Test + public void testGrow(){ + int [] a1={3,0,4,6}; + assertArrayEquals(new int[]{3,0,4,6,0,0}, util.grow(a1,2)); + } + + @Test + public void testFibo(){ + assertArrayEquals(new int[]{1,1,2,3}, util.fibonacci(4)); + } + + @Test + public void testGetPrime(){ + assertArrayEquals(new int[]{2,3,5,7,11}, util.getPrimes(13)); + } + + @Test + public void testGetPerfectNum(){ + + assertArrayEquals(new int[]{6,28,496}, util.getPerfectNumbers(1000)); + } + + @Test + public void testJoin(){ + + assertEquals("3-5-8", util.join(new int[]{3,5,8}, "-")); + } + +} diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/LoginAction.java b/group20/755659358/week02/src/com/coderising/practice/litestruts/LoginAction.java new file mode 100644 index 0000000000..71f5c939f2 --- /dev/null +++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.practice.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/Struts.java b/group20/755659358/week02/src/com/coderising/practice/litestruts/Struts.java new file mode 100644 index 0000000000..069faad8bb --- /dev/null +++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/Struts.java @@ -0,0 +1,140 @@ +package com.coderising.practice.litestruts; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.SAXException; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + + + View view=new View(); + Map viewMap=new HashMap(); + Map xmlMap=parseXML(actionName); + + try { + + Class clazz= Class.forName(xmlMap.get("className")); + + Object object=clazz.newInstance(); + if (object instanceof LoginAction) { + LoginAction action =(LoginAction) object; + action.setName(parameters.get("name")); + action.setPassword(parameters.get("password")); + } + Method execute = clazz.getMethod("execute"); + String executResult=(String) execute.invoke(object); + Field[] fields=clazz.getDeclaredFields(); + Method[] methods=clazz.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().contains("get")) { + String resultString=(String) method.invoke(object); + for (Field field : fields) { + field.setAccessible(true); + if (field.get(object).equals(resultString)) { + viewMap.put(field.getName(), resultString); + } + } + } + } + + view.setJsp(xmlMap.get(executResult)); + + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchMethodException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + view.setParameters(viewMap); + + + return view; + } + + public static Map parseXML(String actionName){ + SAXParserFactory factory=SAXParserFactory.newInstance(); + StrutsHandler hander=new StrutsHandler(actionName); + SAXParser parser; + try { + parser = factory.newSAXParser(); + parser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("com/coderising/practice/litestruts/struts.xml"),hander); + } catch (ParserConfigurationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SAXException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return hander.getResult(); + } + + public static void setPara(Map map){ + + + } + + public static String executAction(String className){ + + return null; + } + + + + + +} diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsHandler.java b/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsHandler.java new file mode 100644 index 0000000000..2b3d3ab88b --- /dev/null +++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsHandler.java @@ -0,0 +1,57 @@ +package com.coderising.practice.litestruts; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +public class StrutsHandler extends DefaultHandler { + + private String actionName; + private String key; + private String value; + + private String currentActionName; + + private Map result = new HashMap(); + + public StrutsHandler(String actionName) { + this.actionName = actionName; + } + + public Map getResult() { + return result; + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if ("action".equals(qName)) { + currentActionName = attributes.getValue(attributes.getIndex("name")); + if (currentActionName.equals(actionName)) { + value = attributes.getValue(attributes.getIndex("class")); + result.put("className", value); + } + + } + if ("result".equals(qName) && actionName.equals(currentActionName)) { + key = attributes.getValue("name"); + } + + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if ("result".equals(qName) && actionName.equals(currentActionName)) { + result.put(key, value); + } + } + + public void characters(char[] ch, int start, int length) throws SAXException { + if (actionName.equals(currentActionName)) { + value = new String(ch, start, length); + } + }; +} diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsTest.java b/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsTest.java new file mode 100644 index 0000000000..cc57e4c6a8 --- /dev/null +++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsTest.java @@ -0,0 +1,53 @@ +package com.coderising.practice.litestruts; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + + @Test + public void testParse() { + String actionName = "login"; + + System.out.println(Struts.parseXML(actionName)); + } + + +} diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/View.java b/group20/755659358/week02/src/com/coderising/practice/litestruts/View.java new file mode 100644 index 0000000000..66643290d4 --- /dev/null +++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.practice.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group20/755659358/week02/src/com/coderising/practice/litestruts/struts.xml b/group20/755659358/week02/src/com/coderising/practice/litestruts/struts.xml new file mode 100644 index 0000000000..7b2a62ef58 --- /dev/null +++ b/group20/755659358/week02/src/com/coderising/practice/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group20/872045674/20170226/src/com/coding/basic/ArrayList.java b/group20/872045674/20170226/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..8b495831fe --- /dev/null +++ b/group20/872045674/20170226/src/com/coding/basic/ArrayList.java @@ -0,0 +1,87 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[7]; + + public void add(Object o){ + if(size>elementData.length-1){ + ensureCapacity(size); + } + elementData[size++] = o; + } + + public void add(int index, Object o){ + System.out.println(elementData.length+" length"); + System.out.println(size+" size"); + size++; + if(index<0||index>size||index>Integer.MAX_VALUE){ + System.out.println("add 位置输入错误,请输入合理的位置"); + return; + } + if(size>elementData.length-1){ + ensureCapacity(size); + } + System.arraycopy(elementData,index,elementData,index+1,size-index-1); + elementData[index] = o; + } + + public Object get(int index){ + if(index<0||index>size-1){ + System.out.println("get 位置输入错误,请输入合理的位置"); + return null; + } + + return elementData[index]; + } + + public Object remove(int index){ + if(index<0||index>size-1){ + System.out.println("remove 位置输入错误,请输入合理的位置"); + return false; + } + System.arraycopy(elementData,index+1,elementData,index,size-index-1); + elementData[--size]=null; + return true; + } + + public int size(){ + return size; + } + + private void ensureCapacity(int nimCapacity){ + int oldCapacity = elementData.length; + int newCapacity = oldCapacity+(oldCapacity/2+1); + if(newCapacity < nimCapacity){ + newCapacity = nimCapacity; + } + if(newCapacity>Integer.MAX_VALUE){ + newCapacity = Integer.MAX_VALUE; + } + elementData = Arrays.copyOf(elementData,newCapacity); + } + + public static void main(String[] args) { + ArrayList list=new ArrayList(); + + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(2,10); + list.remove(3); + for(int i=0;i + */ +public class MyArrayList implements MyList { + + private static final int DEFAULT_CAPACITY = 10; + private static int msize; + private T[] elements; + + public MyArrayList() { + msize = 0; + ensureCapacity(DEFAULT_CAPACITY); + } + + @SuppressWarnings("unchecked") + private void ensureCapacity(int newCapacity) { + // TODO Auto-generated method stub + if (msize > newCapacity) { + return; + } + T[] oldElements = elements; + elements = (T[]) new Object[newCapacity]; + for (int i = 0; i < size(); i++) { + elements[i] = oldElements[i]; + } + + } + public void trimSize(){ + if (msize < elements.length) { + ensureCapacity(msize); + } + } + + @Override + public boolean add(T t) { + // TODO Auto-generated method stub + + if (elements.length == size()) { + ensureCapacity(2 * size() + 1); + } + elements[msize++] = t; + return true; + } + + @Override + public void add(int index, T t) { + + if (msize == elements.length) { + ensureCapacity(2 * msize + 1); + } + for (int i = size(); i >= index; i--) { + elements[i + 1] = elements[i]; + } + elements[index] = t; + msize++; + } + + @Override + public int size() { + // TODO Auto-generated method stub + return msize; + } + + @Override + public T remove(int index) { + // TODO Auto-generated method stub + if (index < 0 || index > size()) { + throw new ArrayIndexOutOfBoundsException(); + } + T old = elements[index]; + for (int i = index; i < msize; i++) { + elements[i] = elements[i + 1]; + } + elements[msize--] = null; + return old; + + } + + @Override + public boolean set(int index, T t) { + // TODO Auto-generated method stub + if (index < 0 || index > size()) { + throw new ArrayIndexOutOfBoundsException(); + } + elements[index] = t; + return true; + } + + @Override + public T get(int index) { + // TODO Auto-generated method stub + if (index < 0 || index > msize) { + throw new ArrayIndexOutOfBoundsException(); + } + return elements[index]; + } + + @Override + public String toString() { + return Arrays.toString(elements); + } + + public MyIterator iterator() { + return new MyArrayListIterator(); + } + + private class MyArrayListIterator implements MyIterator { + + private int current = 0;// ָ + + public boolean hasNext() { + // TODO Auto-generated method stub + + return current < size(); + } + + public T Next() { + // TODO Auto-generated method stub + if (!hasNext()) { + throw new NoSuchElementException(); + } + return elements[current++]; + } + + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyIterator.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyIterator.java" new file mode 100644 index 0000000000..42bf1d4fa1 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyIterator.java" @@ -0,0 +1,7 @@ +package BasicData; + +public interface MyIterator { + + public abstract boolean hasNext(); + public abstract T Next(); +} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyList.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyList.java" new file mode 100644 index 0000000000..2b2ba5057a --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyList.java" @@ -0,0 +1,16 @@ +package BasicData; + +/** + * ԼListӿ + * @author Ralf + * + */ +public interface MyList { + + public abstract boolean add(T t); + public abstract void add(int index, T t); + public abstract int size(); + public abstract T remove(int index); + public abstract boolean set(int index, T t); + public abstract T get(int index); +} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyQueue.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyQueue.java" new file mode 100644 index 0000000000..772b93f879 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyQueue.java" @@ -0,0 +1,79 @@ +package BasicData; + +/** + * ʵֻݽṹQueue() + * + * @author Administrator + * + */ +public class MyQueue { + + private int head; + private int tail; + private T[] elements; + private static final int DEFAUL_SIZE = 10; + private int numOfelements; + + public MyQueue() { + head = 0; + tail = 0; + numOfelements = 0; + setCapacity(DEFAUL_SIZE); + } + + public MyQueue(int capacity) { + head = 0; + tail = 0; + numOfelements = 0; + setCapacity(capacity); + + } + + @SuppressWarnings("unchecked") + private void setCapacity(int capacity) { + elements = (T[]) new Object[capacity]; + } + + public boolean enQueue(T t) { + + if (numOfelements == elements.length) { + return false; + } else { + elements[tail] = t; + numOfelements++; + if (tail == elements.length) + tail = 0; + else + tail++; + return true; + } + + } + + public T deQueue() { + if (head == tail) { + return null; + } else { + T t = elements[head]; + numOfelements--; + elements[head] = null; + if (head == elements.length) + head = 0; + else { + head++; + } + return t; + } + + } + + public boolean isEmpty() { + return numOfelements == 0; + } + + public int size() { + int msize = head - tail; + return msize > 0 ? msize : -msize; + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyStack.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyStack.java" new file mode 100644 index 0000000000..fb12e0dd23 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyStack.java" @@ -0,0 +1,44 @@ +package BasicData; + +import java.util.LinkedList; +import java.util.NoSuchElementException; + +/** + * ʵֻݽṹջ + * + * @author Ralf + * + */ +public class MyStack { + + private LinkedList linkedList; + + public MyStack() { + if (null == linkedList) { + linkedList = new LinkedList(); + } + } + + public void push(T t) { + linkedList.addFirst(t); + } + + public T pop() { + if (size() == 0) { + throw new NoSuchElementException(); + } + return linkedList.removeFirst(); + } + + public T peek() { + return (size() == 0) ? null : linkedList.getFirst(); + } + + public int size() { + return linkedList.size(); + } + + public boolean isEmpty(){ + return linkedList.isEmpty(); + } +} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java" new file mode 100644 index 0000000000..5386f34431 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java" @@ -0,0 +1,99 @@ +package BasicData; + +//insert 方法有问题 +public class MyTreeNode> { + + private T data; + private MyTreeNode left = null; + private MyTreeNode right = null; + private MyTreeNode root = null; + private MyTreeNode cureeTreeNode = null; + + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public MyTreeNode getLeft() { + return left; + } + public void setLeft(MyTreeNode left) { + this.left = left; + } + public MyTreeNode getRight() { + return right; + } + public void setRight(MyTreeNode right) { + this.right = right; + } + @Override + public String toString() { + StringBuilder string = new StringBuilder(); + string.append("["); + if (cureeTreeNode == null) { + string.append("]"); + return string.toString(); + } else { + string.append(cureeTreeNode.toString()).append("]"); + return string.toString(); + } + } + + public MyTreeNode insert(T o){ + MyTreeNode newNode = new MyTreeNode(); + MyTreeNode current = null; + newNode.setData(o); + if (root == null) { + root = newNode; + cureeTreeNode = newNode;// + return newNode; + } + else { + Digui(o, root); + current = cureeTreeNode; + if (current.getData().compareTo(o) == -1) { + current.right = newNode; + } else { + current.left = newNode; + } + cureeTreeNode = newNode; // + return newNode; + } + + } + + public void Digui(T o,MyTreeNode parentnode){ + cureeTreeNode = parentnode; + if (parentnode.left!= null) { + if (parentnode.getData().compareTo(o) == -1) { + parentnode = parentnode.right; + Digui(o, parentnode); + } + else + return; + } + if (parentnode.right != null) { + if (parentnode.getData().compareTo(o) == 1) { + parentnode = parentnode.left; + Digui(o, parentnode); + } + else + return; + } + } + + public void preOrder(MyTreeNode root) { + visit(root); + if(root.getLeft() != null) { + preOrder(root.getLeft()); + } + if(root.getRight() != null) { + preOrder(root.getRight()); + } + } + + public void visit(MyTreeNode btree) { + System.out.print(btree.getData() + "\t"); + } +} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/SingleLinkedList.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/SingleLinkedList.java" new file mode 100644 index 0000000000..a9e72ed4fa --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/SingleLinkedList.java" @@ -0,0 +1,212 @@ +package BasicData; + +import java.util.NoSuchElementException; + +import javax.lang.model.element.Element; + +public class SingleLinkedList implements MyList { + + private int msize;// ¼Ԫصĸ + Note head;// ָһԪ + Note last;// ָһԪ + + private static class Note { + private T item = null; + Note next = null; + + public Note(T t) { + this.item = t; + } + } + + public SingleLinkedList() { + + } + + @Override + public boolean add(T t) { + // TODO Auto-generated method stub + final Note l = last; + final Note newNote = new Note(t); + last = newNote; + if (l == null) { + head = newNote;// ֻһnullԪ + } else { + l.next = last; + } + msize++; + return true; + } + + @Override + public void add(int index, T t) { + // TODO Auto-generated method stub + if (index < 0 || index > msize) { + throw new IndexOutOfBoundsException(); + } + if (index == 0) { + addFirst(t); + } + if (index == msize) { + add(t); + } + Note current = head; + for (int i = 0; i < index - 1; i++) { + current = current.next; + } + final Note newNote = new Note(t); + newNote.next = current.next; + current.next = newNote; + msize++; + + } + + public boolean addFirst(T t) { + final Note newNote = new Note(t); + newNote.next = head; + head = newNote; + msize++; + return true; + } + + public boolean addLast(T t) { + final Note newNote = new Note(t); + newNote.next = null; + last.next = newNote; + last = newNote; + msize++; + return true; + } + + public T removeLast() throws Exception { + if (head == null) { + throw new Exception("LinkedList is Empty!"); + } + Note current = head; + if (head.next == null) { + head = null; + last = null; + } else { + while (current.next != null) { + if (current.next == last) { + last = current; + last.next = null; + break; + } + current = current.next; + } + + } + msize--; + return current.item; + + } + + public T removeFirst() throws Exception { + if (head == null) { + throw new Exception("LinkedList is Empty!"); + } + Note element = head; + head = head.next; + msize--; + return element.item; + } + + @Override + public int size() { + // TODO Auto-generated method stub + return msize; + } + + @Override + public T remove(int index) { + // TODO Auto-generated method stub + if (index < 0 || index > msize) { + throw new IndexOutOfBoundsException(); + } + Note element; + if (index == 0) { + element = head; + head = head.next; + msize--; + return element.item; + } + Note current = head; + for (int i = 0; i < index - 1; i++) { + current = current.next; + } + element = current.next; + if (index == msize) { + current.next = null; + last = current; + } else { + current.next = current.next.next; + } + + msize--; + return element.item; + } + + @Override + public boolean set(int index, T t) { + // TODO Auto-generated method stub + if (index < 0 || index > msize) { + throw new IndexOutOfBoundsException(); + } + Note current = head; + for (int i = 0; i < index; i++) { + current = head.next; + } + current.item = t; + return true; + } + + @Override + public T get(int index) { + // TODO Auto-generated method stub + if (index < 0 || index > msize) { + throw new IndexOutOfBoundsException(); + } + Note current = head; + for (int i = 0; i < index; i++) { + current = current.next; + } + return current.item; + } + + public MyIterator iterator() { + return new MyLinkedListIterator(); + } + + private class MyLinkedListIterator implements MyIterator { + + private int current = 0; + private Note nextNote = head; + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return current < msize; + } + + @Override + public T Next() { + // TODO Auto-generated method stub + if (!hasNext()) { + throw new NoSuchElementException(); + } else { + current++; + Note eleNote = nextNote; + if (last == nextNote) { + nextNote = null; + } else { + nextNote = nextNote.next; + } + return eleNote.item; + + } + + } + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\345\234\260\345\235\200" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\345\234\260\345\235\200" new file mode 100644 index 0000000000..2ebe35c33a --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\345\234\260\345\235\200" @@ -0,0 +1 @@ +[文章链接](http://blog.csdn.net/u011371324/article/details/57146892) diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtil.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtil.java" new file mode 100644 index 0000000000..42bda4b210 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtil.java" @@ -0,0 +1,213 @@ +package org.Ralf.ArrayUtil; + +import java.util.ArrayList; +import java.util.Arrays; + +import javax.naming.spi.DirStateFactory.Result; + +public class ArrayUtil { + + public static void reverseArray(int[] origin) { + /** + * һa , Ըֵû 磺 a = [7, 9 , 30, 3] , ûΪ [3, 30, 9,7] + * a = [7, 9, 30, 3, 4] , ûΪ [4,3, 30 , 9,7] + * + * @param origin + * @return + * + */ + + for (int i = 0; i < origin.length / 2; i++) { + int temp = origin[i]; + origin[i] = origin[origin.length - i - 1]; + origin[origin.length - i - 1] = temp; + } + + } + + /** + * µһ飺 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * ҪֵΪ0ȥΪ0ֵһµ飬ɵΪ {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return int[] + */ + public static int[] removeZero(int[] oldArr) { + + if (oldArr == null) { + return null; + } + int[] newArr = new int[oldArr.length]; + int size = 0; + + for (int i = 0; i < oldArr.length; i++) { + if (oldArr[i] != 0) { + newArr[size] = oldArr[i]; + size++; + } + } + return Arrays.copyOf(newArr, size); + + } + + /** + * Ѿõ飬 a1a2 , һµa3, ʹa3 a1a2 Ԫأ Ȼ a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] a3 Ϊ[3,4,5,6,7,8] , ע⣺ Ѿظ + * + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2) { + + // method + ArrayList arrayList = new ArrayList<>(); + for (int i = 0; i < array1.length; i++) { + if (!arrayList.contains(array1[i])) { + arrayList.add(array1[i]); + } + } + for (int i = 0; i < array2.length; i++) { + if (!arrayList.contains(array2[i])) {// listindexҵжǷԪ + arrayList.add(array2[i]); + } + } + int[] newArr = new int[arrayList.size()]; + // arrayList.toArray(newArr); + for (int i = 0; i < arrayList.size(); i++) { + newArr[i] = arrayList.get(i); + } + Arrays.sort(newArr);// ð򣬲򣬿򷨵ʵ + return newArr; + } + + /** + * һѾݵ oldArrayչ չݴСΪoldArray.length + size + * ע⣬ԪҪ oldArray = [2,3,6] , size = 3,򷵻صΪ + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 쳲Ϊ1123581321...... һֵ Сڸֵ 磬 max = 15 , + * 򷵻صӦΪ [11235813] max = 1, 򷵻ؿ [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + int[] newArray = {}; + if (max == 1) { + return newArray; + } + newArray = new int[2 * max]; + int size = 0; + int a = 1; + int b = 1; + newArray[size++] = a; + newArray[size++] = b; + while (b <= max) { + int temp = b; + b = a + b; + newArray[size++] = b; + a = temp; + } + + return Arrays.copyOf(newArray, size - 1); + } + + /** + * Сڸֵmax max = 23, صΪ[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + if (max < 2) { + return null; + } + int[] aar = new int[max]; + int size = 0; + for (int i = 2; i < max; i++) { + if (isPrime(i)) { + aar[size++] = i; + } + } + return Arrays.copyOf(aar, size); + } + + private static boolean isPrime(int aar) { + boolean flag = true; + for (int i = 2; i <= Math.sqrt(aar); i++) { + if (aar % i == 0) { + flag = false; + break; + } + } + return flag; + } + + /** + * ν ָǡõ֮ͣ6=1+2+3 һֵmax һ飬 Сmax + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + if (max < 1) { + return null; + } + int[] arr = new int[max]; + int size = 0; + for (int i = 1; i <= max; i++) { + if (isPerfectNumber(i)) { + arr[size++] = i; + } + } + return Arrays.copyOf(arr, size); + } + + private static boolean isPerfectNumber(int num) { + int sum = 0; + for (int i = 1; i < num; i++) { + if (num % i == 0) { + sum += i; + } + + } + if (sum == num) { + return true; + } else + return false; + } + + /** + * seperator array array= [3,8,9], seperator = "-" 򷵻ֵΪ"3-8-9" + * + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator) { + if (array.length < 1) { + return null; + } + StringBuilder string = new StringBuilder(); + for (int i = 0; i < array.length - 1; i++) { + string.append(array[i]).append(seperator); + } + string.append(array[array.length - 1]); + return string.toString(); + } +} diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtilTest.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtilTest.java" new file mode 100644 index 0000000000..48f12a3337 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtilTest.java" @@ -0,0 +1,100 @@ +package org.Ralf.ArrayUtilTest; + +import static org.junit.Assert.*; + +import org.Ralf.ArrayUtil.ArrayUtil; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ArrayUtilTest { + + + @Before + public void setUp() throws Exception { + } + + @Test + public void reverseArray() { + int[] origin = {9,8,7,6,5,4,3,2,1}; + int[] originCopy = origin; + int[] reverse = {1,2,3,4,5,6,7,8,9}; + ArrayUtil.reverseArray(origin); + Assert.assertArrayEquals(origin, reverse); + ArrayUtil.reverseArray(origin); + Assert.assertArrayEquals(origin, originCopy); + } + + @Test + public void removeZero(){ + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] newarr = ArrayUtil.removeZero(oldArr); + int[] realArr = {1,3,4,5,6,6,5,4,7,6,7,5}; + Assert.assertArrayEquals(newarr, realArr); + } + + @Test + public void merge(){ + + int[] a1 ={3, 5, 7,8}; + int[] a2 = {4, 5, 6,7}; + int[] newarr = ArrayUtil.merge(a1, a2); + int[] realArr = {3,4,5,6,7,8}; + Assert.assertArrayEquals(newarr, realArr); + } + + @Test + public void grow(){ + int[] oldArray = {2,3,6}; + int[] realArr = {2,3,6,0,0,0}; + int[] newArray = ArrayUtil.grow(oldArray, 3); + Assert.assertArrayEquals(newArray, realArr); + } + + @Test + public void fibonacci(){ + + int[] realArr = {1,1,2,3,5,8,13}; + int[] newArray = ArrayUtil.fibonacci(15); + Assert.assertArrayEquals(newArray, realArr); + } + @Test + public void getPrimes(){ + int[] realArr = {2,3,5,7,11,13,17,19}; + int[] newArray = ArrayUtil.getPrimes(23); + Assert.assertArrayEquals(newArray, realArr); + } + + @Test + public void getPerfectNumbers(){ + int[] realArr = {6, 28, 496, 8128}; + int[] newArray = ArrayUtil.getPerfectNumbers(10000); + Assert.assertArrayEquals(newArray, realArr); + } + + @Test + public void join(){ + int[] realArr = {6, 28, 496, 8128}; + int[] newArray = ArrayUtil.getPerfectNumbers(10000); + Assert.assertArrayEquals(newArray, realArr); + } + + + + + + + + + + + + + + + + + + +} diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/LoginAction.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/LoginAction.java" new file mode 100644 index 0000000000..40b5de161a --- /dev/null +++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/LoginAction.java" @@ -0,0 +1,34 @@ +package com.coderising.litestruts; + +public class LoginAction { + + private String name; + private String passWord; + private String message; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getPassWord() { + return passWord; + } + public void setPassWord(String passWord) { + this.passWord = passWord; + } + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + public String execute(){ + if ("test".equals(name) && "1234".equals(passWord)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } +} diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/ReadXml.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/ReadXml.java" new file mode 100644 index 0000000000..e971e779b6 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/ReadXml.java" @@ -0,0 +1,71 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class ReadXml { + + private Document document = null; + private HashMap hashMap; + + public ReadXml(String filename) { + try { + document = new SAXReader().read((filename)); + hashMap = new HashMap(); + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public String parseXml(String actionName) { + + // List actions = document.selectNodes("//struts/action"); + String className = null; + Element root = document.getRootElement(); + List actions = root.elements("action"); + if (actions.isEmpty()) { + return null; + } + for (Iterator iter = actions.iterator(); iter.hasNext();) { + Element element = (Element) iter.next(); + Attribute attr1 = element.attribute("name"); + if (attr1.getValue().equals(actionName)) { + Attribute attr2 = element.attribute("class"); + className = attr2.getValue(); + //ȡԪصĵֵ + for (Iterator iterator = element.elementIterator(); iterator + .hasNext();) { + Element childElement = (Element) iterator.next(); + Attribute childAttribute = childElement.attribute("name"); + hashMap.put(childAttribute.getValue(), + childElement.getText()); + } + } + + } + return className; + } + + public String getJsp(String result) { + if (result == null) { + return null; + } + String string_jsp = null; + if (!hashMap.isEmpty()) { + for (String string : hashMap.keySet()) { + if (result.equals(string)) { + string_jsp = hashMap.get(string); + } + } + } + return string_jsp; + } +} diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/Struts.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/Struts.java" new file mode 100644 index 0000000000..2892617845 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/Struts.java" @@ -0,0 +1,93 @@ +package com.coderising.litestruts; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +public class Struts { + + private static final String NAME = "name"; + private static final String PASSWORD = "password"; + private static String excuteString; + private static Object object = null;// طʵ + private static Class actionClass = null;// ȡ + + @SuppressWarnings("unchecked") + public static View runAction(String actionName, + Map parameters) { + // ȡļstruts.xml + View view = new View(); + ReadXml readXml = new ReadXml("E:\\struts.xml"); + String classNameString = readXml.parseXml(actionName);//ȡxml + object = initAction(classNameString);//ͨʼ + + excuteMethod(parameters);//ִsetterexcute + + view.setParameterMap(setMapParameter());//ȡеgetterִк󽫷ͽ浽view + String jspResult = readXml.getJsp(excuteString);//ȡjsp + view.setJsp(jspResult); + + return view; + } + + public static Object initAction(String classNameString) { + System.out.println(classNameString); + try { + actionClass = Class.forName(classNameString); + } catch (ClassNotFoundException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + Object newObject = null; + try { + newObject = actionClass.newInstance(); + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return newObject; + } + + public static void excuteMethod(Map parameters) { + + try { + Method methodOfName = actionClass + .getMethod("setName", String.class); + methodOfName.invoke(object, parameters.get(NAME)); + // + Method methodOfPassword = actionClass.getMethod("setPassWord", + String.class); + methodOfPassword.invoke(object, parameters.get(PASSWORD)); + + Method excuteMethod = actionClass.getMethod("execute"); + excuteString = (String) excuteMethod.invoke(object); + + } catch (Exception e) { + // TODO: handle exception + } + } + + public static Map setMapParameter() { + + Method[] getterMethods = actionClass.getMethods(); + HashMap hashMap = new HashMap<>(); + + for (int i = 0; i < getterMethods.length; i++) { + String getterName = getterMethods[i].getName(); + if (getterName.startsWith("get")) { + try { + String value = (String) getterMethods[i].invoke(object); + hashMap.put(getterName.substring(3).toLowerCase(), value); + //System.out.println("----" + getterName.substring(2)); + } catch (Exception e) { + // TODO: handle exception + } + + } + } + return hashMap; + } +} diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/StrutsTest.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/StrutsTest.java" new file mode 100644 index 0000000000..b7f0884f41 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/StrutsTest.java" @@ -0,0 +1,40 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //ԤIJһ + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/View.java" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/View.java" new file mode 100644 index 0000000000..bda8419e5f --- /dev/null +++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/View.java" @@ -0,0 +1,28 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + + private String jsp; + private Map parameter; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameter; + } + + public View setParameterMap(Map parameter) { + this.parameter = parameter; + return this; + } + +} diff --git "a/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240.txt" "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240.txt" new file mode 100644 index 0000000000..d4f3154c38 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240.txt" @@ -0,0 +1 @@ +http://blog.csdn.net/u011371324/article/details/60329949 \ No newline at end of file diff --git a/group20/group20.md b/group20/group20.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group20/group20.md @@ -0,0 +1 @@ + diff --git a/group21/group21.md b/group21/group21.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group21/group21.md @@ -0,0 +1 @@ + diff --git a/group22/group22.md b/group22/group22.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group22/group22.md @@ -0,0 +1 @@ + diff --git a/group23/group23.md b/group23/group23.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group23/group23.md @@ -0,0 +1 @@ + diff --git a/group24/group24.md b/group24/group24.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group24/group24.md @@ -0,0 +1 @@ + diff --git a/group25/group25.md b/group25/group25.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group25/group25.md @@ -0,0 +1 @@ + diff --git a/group26/group26.md b/group26/group26.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group26/group26.md @@ -0,0 +1 @@ + diff --git a/group27/group27.md b/group27/group27.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group27/group27.md @@ -0,0 +1 @@ + diff --git a/liuxin/src/com/coderising/array/ArrayUtil.java b/liuxin/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..e5ddb476a6 --- /dev/null +++ b/liuxin/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + return null; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + +} diff --git a/liuxin/src/com/coderising/download/DownloadThread.java b/liuxin/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..900a3ad358 --- /dev/null +++ b/liuxin/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,20 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + + } +} diff --git a/liuxin/src/com/coderising/download/FileDownloader.java b/liuxin/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..c3c8a3f27d --- /dev/null +++ b/liuxin/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,73 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/liuxin/src/com/coderising/download/FileDownloaderTest.java b/liuxin/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4ff7f46ae0 --- /dev/null +++ b/liuxin/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/test.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/liuxin/src/com/coderising/download/api/Connection.java b/liuxin/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/liuxin/src/com/coderising/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/liuxin/src/com/coderising/download/api/ConnectionException.java b/liuxin/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/liuxin/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/liuxin/src/com/coderising/download/api/ConnectionManager.java b/liuxin/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/liuxin/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/liuxin/src/com/coderising/download/api/DownloadListener.java b/liuxin/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/liuxin/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/liuxin/src/com/coderising/download/impl/ConnectionImpl.java b/liuxin/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..36a9d2ce15 --- /dev/null +++ b/liuxin/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,27 @@ +package com.coderising.download.impl; + +import java.io.IOException; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + return null; + } + + @Override + public int getContentLength() { + + return 0; + } + + @Override + public void close() { + + + } + +} diff --git a/liuxin/src/com/coderising/download/impl/ConnectionManagerImpl.java b/liuxin/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..172371dd55 --- /dev/null +++ b/liuxin/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.coderising.download.impl; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} From 4048f408d478235a860be47ca7f5c7cdaf996d2e Mon Sep 17 00:00:00 2001 From: Tennyson Date: Tue, 7 Mar 2017 17:11:19 +0800 Subject: [PATCH 5/9] First job code refactoring --- .../src/com/coding/basic/ArrayList.java | 104 ++++------ .../src/com/coding/basic/ArrayListTest.java | 72 +++++++ .../com/coding/basic/BinarySearchTree.java | 92 ++------- .../coding/src/com/coding/basic/Iterator.java | 6 +- .../src/com/coding/basic/LinkedList.java | 179 +++++++----------- .../src/com/coding/basic/LinkedListTest.java | 95 ++++++++++ .../coding/src/com/coding/basic/List.java | 21 +- .../coding/src/com/coding/basic/Queue.java | 42 +--- .../src/com/coding/basic/QueueTest.java | 53 ++++++ .../coding/src/com/coding/basic/Stack.java | 47 +---- .../src/com/coding/basic/StackTest.java | 55 ++++++ 11 files changed, 432 insertions(+), 334 deletions(-) create mode 100644 group14/296933284/coding/src/com/coding/basic/ArrayListTest.java create mode 100644 group14/296933284/coding/src/com/coding/basic/LinkedListTest.java create mode 100644 group14/296933284/coding/src/com/coding/basic/QueueTest.java create mode 100644 group14/296933284/coding/src/com/coding/basic/StackTest.java diff --git a/group14/296933284/coding/src/com/coding/basic/ArrayList.java b/group14/296933284/coding/src/com/coding/basic/ArrayList.java index 116020466d..39b6b68268 100644 --- a/group14/296933284/coding/src/com/coding/basic/ArrayList.java +++ b/group14/296933284/coding/src/com/coding/basic/ArrayList.java @@ -8,7 +8,7 @@ * @author Tonnyson * */ -public class ArrayList implements List { +public class ArrayList implements List { private int size; private static final int DEFAULT_CAPACITY = 10; @@ -19,110 +19,78 @@ public ArrayList() { elementData = new Object[DEFAULT_CAPACITY]; } - public ArrayList(int initCapacity) { - elementData = new Object[initCapacity]; + @Override + public boolean add(T element) { + ensureCapacity(size + 1); + elementData[size++] = element; + return true; } - /** - * ĩβָԪأԶչΪԭȵ - */ - public void add(Object obj) { - - ensureCapacityInternal(size); - - elementData[size] = obj; - size++; - } - - - /** - * ָλòԪ - */ - public void add(int index, Object obj) { - + @Override + public void add(int index, T element) { rangCheckForAdd(index); - ensureCapacityInternal(size + 1); + + ensureCapacity(size + 1); - for (int i = size - 1; i >= index; i--) - elementData[i + 1] = elementData[i]; + System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = obj; + elementData[index] = element; size++; } - /** - * - */ - private void ensureCapacityInternal(int minCapacity) { + private void ensureCapacity(int minCapacity) { if (minCapacity - elementData.length > 0) { int newCapacity = elementData.length * 2; elementData = Arrays.copyOf(elementData, newCapacity); - // elementData = tempElementData; } } - - /** - * add() м±ǷԽ - */ + private void rangCheckForAdd(int index) { if (index > size || index < 0) throw new IndexOutOfBoundsException(); } - /** - * ָλõԪֵ - */ - public Object get(int index) { - + @Override + public T get(int index) { rangCheck(index); - return elementData[index]; + return (T) elementData[index]; } - /** - * ɾָλõԪأظֵ - */ - public Object remove(int index) { + @Override + public T remove(int index) { rangCheck(index); - Object obj = elementData[index]; - - for (int i = index; i < size; i++) - elementData[i] = elementData[i + 1]; + T element = (T) elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index,size - index - 1); + elementData[size - 1] = null; size--; - return obj; + return element; } - /** - * ±ǷԽ - * - * @param index - */ private void rangCheck(int index) { - if (index >= size) + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); } - /** - * 鳤 - */ + @Override public int size() { return size; } - - /** - * - * - * @return - */ - public Iterator iterator() { + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public Iterator iterator() { return new Iter(); } - //ڲ - private class Iter implements Iterator { + private class Iter implements Iterator { int current; @Override @@ -131,13 +99,13 @@ public boolean hasNext() { } @Override - public Object next() { + public T next() { int i = current; rangCheck(i); current++; - return elementData[i]; + return (T) elementData[i]; } } diff --git a/group14/296933284/coding/src/com/coding/basic/ArrayListTest.java b/group14/296933284/coding/src/com/coding/basic/ArrayListTest.java new file mode 100644 index 0000000000..40e2279ae4 --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/ArrayListTest.java @@ -0,0 +1,72 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by damocles on 2017/3/6. + */ +public class ArrayListTest { + private ArrayList bookList; + + @Before + public void setUp() throws Exception { + bookList = new ArrayList<>(); + + bookList.add("java"); + bookList.add("javascript"); + bookList.add("c++"); + } + + @After + public void tearDown() throws Exception { + bookList = null; + } + + @Test + public void add() throws Exception { + Assert.assertTrue(bookList.add("javaScript")); + } + + @Test + public void add1() throws Exception { + Assert.assertEquals("java", bookList.get(0)); + Assert.assertEquals("c++", bookList.get(2)); + } + + @Test + public void get() throws Exception { + Assert.assertEquals("java", bookList.get(0)); + } + + @Test + public void remove() throws Exception { + Assert.assertEquals("javascript", bookList.remove(1)); + } + + @Test + public void size() throws Exception { + Assert.assertEquals(3, bookList.size()); + } + + @Test + public void isEmpty() throws Exception { + Assert.assertFalse(bookList.isEmpty()); + } + + @Test + public void iterator() throws Exception { + + Iterator it = bookList.iterator(); + Assert.assertTrue(it.hasNext()); + int count = 0; + while (it.hasNext()) { + Assert.assertEquals(bookList.get(count++), it.next()); + } + } + +} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java b/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java index b74dbe85a2..a122aa06e0 100644 --- a/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java +++ b/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java @@ -1,14 +1,8 @@ package com.coding.basic; -/** - * BST ʵ 14С 296933284 - * - * @author Tonnyson - * - */ -public class BinarySearchTree implements Comparable { - - private Object data; +public class BinarySearchTree { + + private T data; private BinarySearchTree leftChild; private BinarySearchTree rightChild; @@ -19,78 +13,48 @@ public BinarySearchTree() { this.rightChild = null; } - public BinarySearchTree(Object data) { + public BinarySearchTree(T data) { this(); this.data = data; } - public Object getData() { + public T getData() { return data; } - public void setData(Object data) { - this.data = data; - } - public BinarySearchTree getLeftChild() { return leftChild; } - public void setLeftChild(BinarySearchTree leftChild) { - this.leftChild = leftChild; - } - public BinarySearchTree getRightChild() { return rightChild; } + public void setData(T data) { + this.data = data; + } + + public void setLeftChild(BinarySearchTree leftChild) { + this.leftChild = leftChild; + } + public void setRightChild(BinarySearchTree rightChild) { this.rightChild = rightChild; } - /** - * вڵ - * - * @param obj - * ڵֵ - */ public void insert(Object obj) { insert(obj, this); } - private boolean insert(Object obj, BinarySearchTree node) { + private boolean insert(T element, BinarySearchTree node) { - BinarySearchTree bstNode = new BinarySearchTree(obj); + BinarySearchTree bstNode = new BinarySearchTree(element); - if (node == null) { - node = bstNode; - return true; - } else if (node.compareTo(obj) == 0) { - return true; - } else if (node.compareTo(obj) > 0) { - - if (node.getLeftChild() != null) { - return insert(obj, node.getLeftChild()); - } - - node.leftChild = bstNode; - - } else if (node.compareTo(obj) < 0) { - - if (node.getRightChild() != null) { - return insert(obj, node.getRightChild()); - } - - node.rightChild = bstNode; - } return false; } - /** - * BST Ľڵ㣬ʹ֮ - */ public void inOrder(BinarySearchTree node) { if (node != null) { @@ -101,9 +65,6 @@ public void inOrder(BinarySearchTree node) { } - /** - * BST Ľڵֵ - */ public void levelOrder(BinarySearchTree node) { Queue queue = new Queue(); BinarySearchTree bstNode = null; @@ -123,32 +84,9 @@ public void levelOrder(BinarySearchTree node) { } } - /** - * ָڵֵ - * - * @param node - */ public void visit(BinarySearchTree node) { System.out.println(node.getData()); } - /** - * Ƚ BST ڵֵС - */ - @Override - public int compareTo(Object obj) { - int result = 0; - - if (obj instanceof Integer) { - Integer value = (Integer) obj; - Integer thisValue = (Integer) this.data; - result = thisValue.compareTo(value); - } else { - String value = obj.toString(); - result = this.data.toString().compareTo(value); - } - - return result; - } } diff --git a/group14/296933284/coding/src/com/coding/basic/Iterator.java b/group14/296933284/coding/src/com/coding/basic/Iterator.java index e7cbd474ec..c10771d52c 100644 --- a/group14/296933284/coding/src/com/coding/basic/Iterator.java +++ b/group14/296933284/coding/src/com/coding/basic/Iterator.java @@ -1,6 +1,6 @@ package com.coding.basic; -public interface Iterator { - public boolean hasNext(); - public Object next(); +public interface Iterator { + boolean hasNext(); + T next(); } diff --git a/group14/296933284/coding/src/com/coding/basic/LinkedList.java b/group14/296933284/coding/src/com/coding/basic/LinkedList.java index 3c37904532..aacf0fcfdc 100644 --- a/group14/296933284/coding/src/com/coding/basic/LinkedList.java +++ b/group14/296933284/coding/src/com/coding/basic/LinkedList.java @@ -4,145 +4,109 @@ /** - * LinkedList (ͷĵ) ʵ 14С 296933284 + * LinkedList (单链表) 第14小组 296933284 * * @author Tonnyson * */ -public class LinkedList implements List { +public class LinkedList implements List { - private Node head; + private Node head; private int size; public LinkedList() { super(); - this.head = new Node(); - this.size = 0; + this.head = new Node(null); } - public void add(Object obj) { - addLast(obj); + @Override + public boolean add(T element) { + addLast(element); + return true; } - public void add(int index, Object obj) { + @Override + public void add(int index, T element) { - if (index == size + 1) { - addLast(obj); + if (index == size) { + addLast(element); } else { - Node r = getPreNode(index); - Node node = new Node(); - node.data = obj; + Node r = getPreNode(index); + Node node = new Node<>(element); node.next = r.next; r.next = node; size++; } } - - - /** - * ײڵ - * - * @param obj ڵĽڵֵ - * - */ - public void addFirst(Object obj) { - Node node = new Node(); - node.data = obj; - + public void addFirst(T element) { + Node node = new Node<>(element); node.next = head.next; head.next = node; size++; } - /** - * βڵ - * - * @param obj ڵĽڵֵ - * - */ - public void addLast(Object obj) { - - Node node = new Node(); - node.data = obj; - node.next = null; + public void addLast(T element) { - Node r = head; + Node node = new Node<>(element); + + Node r = head; while (r.next != null) r = r.next; - + r.next = node; size++; } - /** - * Ԫذ˳뵥 - * - * @param c Ҫ뵥Ԫصļ - * - */ - public void addAll(Collection c) { +// public void addAll(Collection c) { +// +// Iterator iter = (Iterator) c.iterator(); +// +// while (iter.hasNext()) { +// addLast(iter.next()); +// } +// } - Iterator iter = (Iterator) c.iterator(); + @Override + public T get(int index) { - while (iter.hasNext()) { - addLast(iter.next()); - } - } - - /** - * ȡָλõĽڵֵ - */ - public Object get(int index) { - // rangCheck(index); + rangCheck(index); - return getPreNode(index).next.data; + return (T) getPreNode(index).next.data; } - /** - * ɾָλýڵ㣬ؽڵֵ - */ - public Object remove(int index) { + @Override + public T remove(int index) { rangCheck(index); - Node r = getPreNode(index); + Node r = getPreNode(index); - Object result = r.next.data; + T result = (T) r.next.data; r.next = r.next.next; size--; - return result; - } - - /** - * ɾһڵ㣬ؽڵֵ - * - * @return һڵֵ - */ - public Object removeFirst() { + + return result; + } + + public T removeFirst() { return remove(0); } - - /** - * ɾһڵ㣬ؽڵֵ - * - * @return һڵֵ - */ - public Object removeLast() { + + public T removeLast() { return remove(size - 1); } - - // ȡָλõǰ㲢 - private Node getPreNode(int index) { + + private Node getPreNode(int index) { rangCheck(index); if (index == 0) { return head; } else { - Node r = head; + Node r = head; for (int i = 0; i < index; i++) r = r.next; @@ -151,25 +115,23 @@ private Node getPreNode(int index) { } } - - /** - * صij - */ + + @Override public int size() { return size; } - /** - * - * - * @return һ - */ - public Iterator iterator() { - return new Iter(); + @Override + public boolean isEmpty() { + return size == 0; } - // ڲ - private class Iter implements Iterator { + @Override + public Iterator iterator() { + return new Iter<>(); + } + + private class Iter implements Iterator { int current = 0; @Override @@ -178,35 +140,30 @@ public boolean hasNext() { } @Override - public Object next() { + public T next() { int i = current; rangCheck(i); current++; - return get(i); + return (T) get(i); } } - - /** - * ǷԽ - * - * @param index - */ + private void rangCheck(int index) { - if (index > size || index < 0) + if ( index < 0 || index >= size) throw new IndexOutOfBoundsException(); } - private static class Node { - Object data; - Node next; - - public Node() { + private static class Node { + T data; + Node next; + + Node(T data) { super(); - this.data = null; + this.data = data; this.next = null; } diff --git a/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java b/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java new file mode 100644 index 0000000000..825df453ff --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java @@ -0,0 +1,95 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by damocles on 2017/3/6. + */ +public class LinkedListTest { + private LinkedList bookList; + + @Before + public void setUp() throws Exception { + bookList = new LinkedList<>(); + + bookList.add("javascript"); + bookList.add("java"); + bookList.add("c++"); + bookList.add("c"); + + } + + @After + public void tearDown() throws Exception { + bookList = null; + } + + @Test + public void add() throws Exception { + Assert.assertTrue(bookList.add("python")); + } + + @Test + public void add1() throws Exception { + bookList.add("python"); + Assert.assertEquals("python", bookList.removeLast()); + } + + @Test + public void addFirst() throws Exception { + bookList.addFirst("python"); + Assert.assertEquals("python", bookList.removeFirst()); + } + + @Test + public void addLast() throws Exception { + bookList.addLast("python"); + Assert.assertEquals("python", bookList.removeLast()); + } + + @Test + public void get() throws Exception { + Assert.assertEquals("javascript", bookList.get(0)); + } + + @Test + public void remove() throws Exception { + Assert.assertEquals("javascript", bookList.remove(0)); + } + + @Test + public void removeFirst() throws Exception { + Assert.assertEquals("javascript", bookList.removeFirst()); + } + + @Test + public void removeLast() throws Exception { + Assert.assertEquals("c", bookList.removeLast()); + } + + @Test + public void size() throws Exception { + Assert.assertEquals(4, bookList.size()); + } + + @Test + public void isEmpty() throws Exception { + Assert.assertFalse(bookList.isEmpty()); + } + + @Test + public void iterator() throws Exception { + Iterator it = bookList.iterator(); + Assert.assertTrue(it.hasNext()); + int count = 0; + while (it.hasNext()) { + Assert.assertEquals(bookList.get(count++), it.next()); + } + } + +} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/List.java b/group14/296933284/coding/src/com/coding/basic/List.java index 969e6dd82b..019fe42c0f 100644 --- a/group14/296933284/coding/src/com/coding/basic/List.java +++ b/group14/296933284/coding/src/com/coding/basic/List.java @@ -1,9 +1,18 @@ package com.coding.basic; -public interface List { - public void add(Object obj); - public void add(int index, Object obj); - public Object get(int index); - public Object remove(int index); - public int size(); +public interface List { + + boolean add(T element); + + void add(int index, T element); + + T get(int index); + + T remove(int index); + + int size(); + + boolean isEmpty(); + + Iterator iterator(); } diff --git a/group14/296933284/coding/src/com/coding/basic/Queue.java b/group14/296933284/coding/src/com/coding/basic/Queue.java index 9257eb04ca..2759c25b5f 100644 --- a/group14/296933284/coding/src/com/coding/basic/Queue.java +++ b/group14/296933284/coding/src/com/coding/basic/Queue.java @@ -1,49 +1,27 @@ package com.coding.basic; /** - * Queue ʵ - * First In First Out - * 14С 296933284 - * + * Queue 实现 第14小组 296933284 + * * @author Tonnyson * */ -public class Queue { - - private LinkedList elementData = new LinkedList(); +public class Queue { - /** - * вԪ - * - * @param obj - */ - public void enQueue(Object obj){ - elementData.addLast(obj); + private LinkedList elementData = new LinkedList<>(); + + public void enQueue(T element){ + elementData.addLast(element); } - - /** - * ɾԪ - * - * @return - */ - public Object deQueue(){ + + public T deQueue(){ return elementData.removeFirst(); } - /** - * ж϶ǷΪ - * - * @return - */ public boolean isEmpty(){ return elementData.size() == 0; } - - /** - * ضеԪظ - * - * @return - */ + public int size(){ return elementData.size(); } diff --git a/group14/296933284/coding/src/com/coding/basic/QueueTest.java b/group14/296933284/coding/src/com/coding/basic/QueueTest.java new file mode 100644 index 0000000000..3a32d0f0c9 --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/QueueTest.java @@ -0,0 +1,53 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by damocles on 2017/3/7. + */ +public class QueueTest { + private Queue queue; + + @Before + public void setUp() throws Exception { + queue = new Queue<>(); + + queue.enQueue("javascript"); + queue.enQueue("java"); + queue.enQueue("c++"); + queue.enQueue("c"); + } + + @After + public void tearDown() throws Exception { + queue = null; + } + + @Test + public void enQueue() throws Exception { + queue.enQueue("php"); + + Assert.assertEquals(5, queue.size()); + } + + @Test + public void deQueue() throws Exception { + Assert.assertEquals("javascript",queue.deQueue()); + } + + @Test + public void isEmpty() throws Exception { + Assert.assertFalse(queue.isEmpty()); + } + + @Test + public void size() throws Exception { + Assert.assertEquals(4, queue.size()); + } + +} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coding/basic/Stack.java b/group14/296933284/coding/src/com/coding/basic/Stack.java index e28a9e3760..f3a1d2e681 100644 --- a/group14/296933284/coding/src/com/coding/basic/Stack.java +++ b/group14/296933284/coding/src/com/coding/basic/Stack.java @@ -1,60 +1,33 @@ package com.coding.basic; /** - * Stack ʵ - * Last In First Out - * 14С 296933284 - * + * Stack 实现 第14小组 296933284 + * * @author Tonnyson * */ -public class Stack { +public class Stack { - private ArrayList elementData = new ArrayList(); + private ArrayList elementData = new ArrayList<>(); private int top = 0; - /** - * ջвԪ - * - * @param obj - */ - public void push(Object obj) { - elementData.add(obj); + public void push(T element) { + elementData.add(element); top++; } - - /** - * ջȡԪ - * - * @return - */ - public Object pop() { + + public T pop() { return elementData.remove(--top); } - /** - * ȡջԪ - * - * @return - */ - public Object peek() { + public T peek() { return elementData.get(top - 1); } - /** - * жջǷΪ - * - * @return - */ public boolean isEmpty() { return top == 0; } - - /** - * ȡջԪظ - * - * @return - */ + public int size() { return top; } diff --git a/group14/296933284/coding/src/com/coding/basic/StackTest.java b/group14/296933284/coding/src/com/coding/basic/StackTest.java new file mode 100644 index 0000000000..e67a4ec361 --- /dev/null +++ b/group14/296933284/coding/src/com/coding/basic/StackTest.java @@ -0,0 +1,55 @@ +package com.coding.basic; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by damocles on 2017/3/7. + */ +public class StackTest { + private Stack stack; + + @Before + public void setUp() throws Exception { + stack = new Stack<>(); + + stack.push("javascript"); + stack.push("java"); + stack.push("c++"); + stack.push("c"); + } + + @After + public void tearDown() throws Exception { + stack = null; + } + + @Test + public void push() throws Exception { + stack.push("php"); + Assert.assertEquals("php", stack.pop()); + } + + @Test + public void pop() throws Exception { + Assert.assertEquals("c", stack.pop()); + } + + @Test + public void peek() throws Exception { + Assert.assertEquals("c", stack.peek()); + } + + @Test + public void isEmpty() throws Exception { + Assert.assertFalse(stack.isEmpty()); + } + + @Test + public void size() throws Exception { + Assert.assertEquals(4, stack.size()); + } + +} \ No newline at end of file From 3eecb0bb4e26ffe9a20107c749a720f4211daae7 Mon Sep 17 00:00:00 2001 From: Tennyson Date: Sun, 12 Mar 2017 07:40:48 +0800 Subject: [PATCH 6/9] linkedlist task --- .../com/coderising/LinkList/LinkedList.java | 355 ++++++++++++++++++ .../coderising/LinkList/LinkedListTest.java | 139 +++++++ .../coderising/download/DownloadThread.java | 30 ++ .../coderising/download/FileDownloader.java | 100 +++++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 25 ++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 11 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 106 ++++++ .../download/impl/ConnectionManagerImpl.java | 31 ++ .../com/coding/basic/BinarySearchTree.java | 30 +- .../coding/src/com/coding/basic/JavaTest.java | 176 --------- .../src/com/coding/basic/LinkedList.java | 16 +- .../src/com/coding/basic/LinkedListTest.java | 9 + 15 files changed, 898 insertions(+), 199 deletions(-) create mode 100644 group14/296933284/coding/src/com/coderising/LinkList/LinkedList.java create mode 100644 group14/296933284/coding/src/com/coderising/LinkList/LinkedListTest.java create mode 100644 group14/296933284/coding/src/com/coderising/download/DownloadThread.java create mode 100644 group14/296933284/coding/src/com/coderising/download/FileDownloader.java create mode 100644 group14/296933284/coding/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group14/296933284/coding/src/com/coderising/download/api/Connection.java create mode 100644 group14/296933284/coding/src/com/coderising/download/api/ConnectionException.java create mode 100644 group14/296933284/coding/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group14/296933284/coding/src/com/coderising/download/api/DownloadListener.java create mode 100644 group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java delete mode 100644 group14/296933284/coding/src/com/coding/basic/JavaTest.java diff --git a/group14/296933284/coding/src/com/coderising/LinkList/LinkedList.java b/group14/296933284/coding/src/com/coderising/LinkList/LinkedList.java new file mode 100644 index 0000000000..a07de29308 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/LinkList/LinkedList.java @@ -0,0 +1,355 @@ +package com.coderising.LinkList; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +import java.util.Collection; + + +/** + * LinkedList (单链表) 第14小组 296933284 + * + * @author Tonnyson + * + */ +public class LinkedList implements List { + + private Node head; + private int size; + + public LinkedList() { + super(); + this.head = new Node(null); + } + + public Node getHead() { + return head; + } + + @Override + public boolean add(T element) { + addLast(element); + return true; + } + + @Override + public void add(int index, T element) { + + if (index == size) { + addLast(element); + } else { + Node r = getPreNode(index); + Node node = new Node<>(element); + node.next = r.next; + r.next = node; + size++; + + } + } + + public void addFirst(T element) { + Node node = new Node<>(element); + node.next = head.next; + head.next = node; + size++; + } + + public void addLast(T element) { + + Node node = new Node<>(element); + + Node r = head; + while (r.next != null) r = r.next; + + r.next = node; + + size++; + + } + + public void addAll(Collection c) { + + Iterator iter = (Iterator) c.iterator(); + + while (iter.hasNext()) { + addLast(iter.next()); + } + } + + @Override + public T get(int index) { + + rangCheck(index); + + return (T) getPreNode(index).next.data; + } + + @Override + public T remove(int index) { + + rangCheck(index); + + Node r = getPreNode(index); + + T result = (T) r.next.data; + + r.next = r.next.next; + size--; + + return result; + } + + public T removeFirst() { + return remove(0); + } + + public T removeLast() { + return remove(size - 1); + } + + private Node getPreNode(int index) { + + rangCheck(index); + + if (index == 0) { + return head; + } else { + Node r = head; + + for (int i = 0; i < index; i++) + r = r.next; + + return r; + } + + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public Iterator iterator() { + return new Iter<>(); + } + + private class Iter implements Iterator { + int current = 0; + + @Override + public boolean hasNext() { + return current != size; + } + + @Override + public T next() { + int i = current; + + rangCheck(i); + + current++; + + return (T) get(i); + } + + } + + private void rangCheck(int index) { + if ( index < 0 || index >= size) + throw new IndexOutOfBoundsException(); + } + + private static class Node { + T data; + Node next; + + Node(T data) { + super(); + this.data = data; + this.next = null; + } + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() { + Node r = head.next; + Node p = null; + head.next = null; + + while (r != null) { + p = r; + r = r.next; + p.next = head.next; + head.next = p; + } + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + * + */ + public void removeFirstHalf() { + int len = (int) Math.ceil(size / 2.0); + + remove(0, len); + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length) { + + rangCheck(i); + + if (i + length - 1 > size - i) { + throw new IndexOutOfBoundsException(); + } + + Node preFirst = getPreNode(i); + Node preLast = getPreNode(i + length - 1).next; + + preFirst.next = preLast.next; + preLast = null; + size -= length; + + } + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list) { + int[] elements = new int[list.size()]; + + for (int i = 0; i < list.size(); i++) { + elements[i] = (Integer) get((int) list.get(i)); + } + + return elements; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 + * + * @param list + */ + public void subtract(LinkedList list) { + int len; + for (int i = 0; i < list.size(); i++) { + Node p = head; + Node r = null; + + T value = list.get(i); + + while (p.next != null) { + + if (p.next.data.equals(value)) { + r = p.next; + p.next = r.next; + r.next = null; + size--; + } else { + p = p.next; + } + + + } + } + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues() { + Node p = head; + Node r = head.next; + + while (p.next != null && r.next != null) { + if (p.next.data.compareTo(r.next.data) == 0) { + p.next = r.next; + r.next = p.next.next; + size--; + } else { + p = p.next; + r = r.next; + } + } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max) { + Node p = head; + + while (p.next!= null) { + if (p.next.data.compareTo(min) > 0 && p.next.data.compareTo(max) < 0) { + Node r = p.next; + p.next = r.next; + r.next = null; + size--; + } else { + p = p.next; + } + } + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection(LinkedList list){ + LinkedList newList = new LinkedList(); + + Node p1 = head; + + while (p1.next != null) { + Node p2 = list.getHead(); + while (p2.next != null && p1.next.data.compareTo(p2.next.data) != 0) { + p2 = p2.next; + } + + if (p2.next != null) { + newList.add(p2.next.data); + } + p1 = p1.next; + } + + return newList; + } +} + + + + + + + + + + + + + diff --git a/group14/296933284/coding/src/com/coderising/LinkList/LinkedListTest.java b/group14/296933284/coding/src/com/coderising/LinkList/LinkedListTest.java new file mode 100644 index 0000000000..2cef12b030 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/LinkList/LinkedListTest.java @@ -0,0 +1,139 @@ +package com.coderising.LinkList; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by damocles on 2017/3/7. + */ +public class LinkedListTest { + private LinkedList linkedList; + + @Before + public void setUp() throws Exception { + linkedList = new LinkedList<>(); + + linkedList.add(101); + linkedList.add(201); + linkedList.add(301); + linkedList.add(401); + linkedList.add(501); + linkedList.add(601); + linkedList.add(701); + } + + @After + public void tearDown() throws Exception { + linkedList = null; + } + + @Test + public void reverse() throws Exception { + linkedList.reverse(); + + Assert.assertEquals(701, (int) linkedList.get(0)); + Assert.assertEquals(601, (int) linkedList.get(1)); + Assert.assertEquals(501, (int) linkedList.get(2)); + Assert.assertEquals(401, (int) linkedList.get(3)); + Assert.assertEquals(301, (int) linkedList.get(4)); + Assert.assertEquals(201, (int) linkedList.get(5)); + Assert.assertEquals(101, (int) linkedList.get(6)); + + } + + @Test + public void removeFirstHalf() throws Exception { + linkedList.removeFirstHalf(); + + Assert.assertEquals(501, (int) linkedList.get(0)); + Assert.assertEquals(3, linkedList.size()); + } + + @Test + public void remove() throws Exception { + linkedList.remove(0, 3); + + Assert.assertEquals(4, linkedList.size()); + Assert.assertEquals(401, (int) linkedList.get(0)); + + linkedList.remove(1, 3); + + Assert.assertEquals(1, linkedList.size()); + Assert.assertEquals(401, (int) linkedList.get(0)); + } + + @Test + public void getElements() throws Exception { + LinkedList list = new LinkedList<>(); + list.add(0); + list.add(2); + list.add(4); + list.add(6); + int[] ints = new int[]{101, 301, 501, 701}; + + Assert.assertArrayEquals(ints, linkedList.getElements(list)); + } + + @Test + public void subtract() throws Exception { + LinkedList list = new LinkedList<>(); + list.add(101); + list.add(301); + list.add(401); + list.add(601); + + linkedList.subtract(list); + + Assert.assertEquals(3, linkedList.size()); + Assert.assertEquals(201, (int) linkedList.get(0)); + Assert.assertEquals(701, (int) linkedList.get(2)); + } + + @Test + public void removeDuplicateValues() throws Exception { + linkedList.removeDuplicateValues(); + + Assert.assertEquals(7, linkedList.size()); + + linkedList.add(701); + linkedList.add(801); + linkedList.add(901); + linkedList.add(901); + linkedList.add(901); + linkedList.removeDuplicateValues(); + + Assert.assertEquals(9, linkedList.size()); + Assert.assertEquals(901, (int) linkedList.get(8)); + Assert.assertEquals(801, (int) linkedList.get(7)); + Assert.assertEquals(701, (int) linkedList.get(6)); + Assert.assertEquals(301, (int) linkedList.get(2)); + } + + @Test + public void removeRange() throws Exception { + linkedList.removeRange(101, 601); + + Assert.assertEquals(3, linkedList.size()); + Assert.assertEquals(101, (int) linkedList.get(0)); + Assert.assertEquals(601, (int) linkedList.get(1)); + Assert.assertEquals(701, (int) linkedList.get(2)); + } + + @Test + public void intersection() throws Exception { + LinkedList linkedList2 = new LinkedList<>(); + linkedList2.add(301); + linkedList2.add(401); + + LinkedList newList = linkedList.intersection(linkedList2); + + Assert.assertEquals(2, newList.size()); + Assert.assertEquals(301, (int) newList.get(0)); + Assert.assertEquals(401, (int) newList.get(1)); + } + +} \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coderising/download/DownloadThread.java b/group14/296933284/coding/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..8e85aa7202 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,30 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; + +import java.io.IOException; +import java.io.RandomAccessFile; + +public class DownloadThread extends Thread { + + Connection conn; + RandomAccessFile randomAccessFile; + int startPos; + int endPos; + + public DownloadThread(Connection conn, RandomAccessFile randomAccessFile, int startPos, int endPos) { + this.conn = conn; + this.randomAccessFile = randomAccessFile; + this.startPos = startPos; + this.endPos = endPos; + } + public void run() { + try { + randomAccessFile.seek(startPos); + byte[] buffer = conn.read(startPos, endPos); + randomAccessFile.write(buffer); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/group14/296933284/coding/src/com/coderising/download/FileDownloader.java b/group14/296933284/coding/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..2396654ccd --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,100 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.lang.reflect.InvocationTargetException; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + String locaPath; + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + RandomAccessFile randomAccessFile = null; + try { + conn = cm.open(this.url); + int length = conn.getContentLength(); + + int size = length / 3; + for (int i = 0; i < 3; i++) { + int startPos = i * size; + int endPos = startPos + size - 1; + + if (i == 3) { + endPos = length; + } + + Connection connection = cm.open(this.url); + randomAccessFile = new RandomAccessFile(locaPath, "rwd"); + randomAccessFile.setLength(length); + + new DownloadThread(connection, randomAccessFile,startPos, endPos).start(); + } + + + + } catch (ConnectionException e) { + e.printStackTrace(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (conn != null) { + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + public void setLocaPath(String locaPath) { + this.locaPath = locaPath; + } + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group14/296933284/coding/src/com/coderising/download/FileDownloaderTest.java b/group14/296933284/coding/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..d892b457e1 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:80/test.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + downloader.setLocaPath("D:\\Tennyson\\test.jpg"); + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group14/296933284/coding/src/com/coderising/download/api/Connection.java b/group14/296933284/coding/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..76be0a9be2 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/download/api/Connection.java @@ -0,0 +1,25 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + byte[] read(int startPos,int endPos) throws IOException; + + /** + * 得到数据内容的长度 + * @return + */ + int getContentLength(); + + /** + * 关闭连接 + */ + void close(); +} diff --git a/group14/296933284/coding/src/com/coderising/download/api/ConnectionException.java b/group14/296933284/coding/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group14/296933284/coding/src/com/coderising/download/api/ConnectionManager.java b/group14/296933284/coding/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..76a26a37fa --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,11 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + Connection open(String url) throws ConnectionException; + +} diff --git a/group14/296933284/coding/src/com/coderising/download/api/DownloadListener.java b/group14/296933284/coding/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..de81b7607d --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + void notifyFinished(); +} diff --git a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..6d40c1d4d4 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,106 @@ +package com.coderising.download.impl; + +import java.io.*; +import java.net.HttpURLConnection; +import java.util.Scanner; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection { + private HttpURLConnection httpURLConnection = null; + private int contentLength = 0; + private InputStream inputStream = null; + private int responsecode; + + public ConnectionImpl(HttpURLConnection urlConnection) { + this.httpURLConnection = urlConnection; + } + + public int getResponsecode() { + try { + responsecode = httpURLConnection.getResponseCode(); + } catch (IOException e) { + e.printStackTrace(); + } + + return responsecode; + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + //httpURLConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + httpURLConnection.setConnectTimeout(5000); + byte[] bytes = null; + if (getResponsecode() == 200) { + InputStream inputStream = null; + ByteArrayOutputStream outputStream = null; + + try { + inputStream = httpURLConnection.getInputStream(); + outputStream = new ByteArrayOutputStream(endPos - startPos); + + byte[] buffer = new byte[1024]; + int len; + while ((len = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, len); + } + + bytes = outputStream.toByteArray(); + + } catch (IOException e) { + e.printStackTrace(); + } finally { +// if (outputStream != null) { +// try { +// outputStream.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// if (inputStream != null) { +// try { +// inputStream.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } + } + } + return bytes; + } + + @Override + public int getContentLength() { + Scanner input = null; + try { + input = new Scanner(httpURLConnection.getInputStream()); + + while (input.hasNext()) { + String line = input.nextLine(); + contentLength += line.length(); + } + + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (input != null) { + input.close(); + } + } + + return contentLength; + } + + @Override + public void close() { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..fad842fb04 --- /dev/null +++ b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,31 @@ +package com.coderising.download.impl; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + Connection connection = null; + try { + URL newUrl = new URL(url); + HttpURLConnection urlConnection = (HttpURLConnection) newUrl.openConnection(); + urlConnection.setRequestMethod("GET"); + connection = new ConnectionImpl(urlConnection); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return connection; + } + +} diff --git a/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java b/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java index a122aa06e0..5284c5e978 100644 --- a/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java +++ b/group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java @@ -3,8 +3,8 @@ public class BinarySearchTree { private T data; - private BinarySearchTree leftChild; - private BinarySearchTree rightChild; + private BinarySearchTree leftChild; + private BinarySearchTree rightChild; public BinarySearchTree() { super(); @@ -22,11 +22,11 @@ public T getData() { return data; } - public BinarySearchTree getLeftChild() { + public BinarySearchTree getLeftChild() { return leftChild; } - public BinarySearchTree getRightChild() { + public BinarySearchTree getRightChild() { return rightChild; } @@ -34,28 +34,29 @@ public void setData(T data) { this.data = data; } - public void setLeftChild(BinarySearchTree leftChild) { + public void setLeftChild(BinarySearchTree leftChild) { this.leftChild = leftChild; } - public void setRightChild(BinarySearchTree rightChild) { + public void setRightChild(BinarySearchTree rightChild) { this.rightChild = rightChild; } - public void insert(Object obj) { - insert(obj, this); + public void insert(T element) { + insert(element, this); } - private boolean insert(T element, BinarySearchTree node) { + private boolean insert(T element, BinarySearchTree node) { + + BinarySearchTree bstNode = new BinarySearchTree(element); - BinarySearchTree bstNode = new BinarySearchTree(element); return false; } - public void inOrder(BinarySearchTree node) { + public void inOrder(BinarySearchTree node) { if (node != null) { inOrder(node.getLeftChild()); @@ -65,9 +66,9 @@ public void inOrder(BinarySearchTree node) { } - public void levelOrder(BinarySearchTree node) { + public void levelOrder(BinarySearchTree node) { Queue queue = new Queue(); - BinarySearchTree bstNode = null; + BinarySearchTree bstNode = null; queue.enQueue(node); while (!queue.isEmpty()) { @@ -84,9 +85,8 @@ public void levelOrder(BinarySearchTree node) { } } - public void visit(BinarySearchTree node) { + public void visit(BinarySearchTree node) { System.out.println(node.getData()); } - } diff --git a/group14/296933284/coding/src/com/coding/basic/JavaTest.java b/group14/296933284/coding/src/com/coding/basic/JavaTest.java deleted file mode 100644 index 8c4cab01b6..0000000000 --- a/group14/296933284/coding/src/com/coding/basic/JavaTest.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.coding.basic; - -import org.junit.Test; - -public class JavaTest { - - @Test - public void binarySearchTreeTest() { - BinarySearchTree bSTree = new BinarySearchTree(5); - - System.out.println(bSTree.getData()); - - // insert - bSTree.insert(1); - bSTree.insert(2); - bSTree.insert(4); - bSTree.insert(6); - bSTree.insert(7); - bSTree.insert(8); - System.out.println("-----------------"); - // inOrder - bSTree.inOrder(bSTree); - - System.out.println("-----------------"); - // levelOrder - bSTree.levelOrder(bSTree); - } - - @Test - public void queueTest() { - Queue queue = new Queue(); - - // enQueue() - for (int i = 0; i < 10; i++) { - queue.enQueue("hello: " + i); - } - - // size() - System.out.println(queue.size()); // 10 - // isEmpty - System.out.println(queue.isEmpty()); - - // deQueue() - for (int i = 0; i < 10; i++) { - System.out.println(queue.deQueue()); - } - - // size() - System.out.println(queue.size()); // 0 - - // isEmpty - System.out.println(queue.isEmpty()); - } - - @Test - public void stackTest() { - Stack stack = new Stack(); - - // push() - for (int i = 0; i < 10; i++) { - stack.push("hello: " + i); - } - - // size() - System.out.println(stack.size()); - - // pop() - for (int i = 0; i < 10; i++) { - System.out.println(stack.pop()); - } - - // isEmpty() - System.out.println(stack.isEmpty()); - System.out.println(stack.size()); - - stack.push("hello world 1"); - stack.push("hello world 2"); - stack.push("hello world 3"); - stack.push("hello world 4"); - - // peek() - System.out.println(stack.peek()); - - // isEmpty() - System.out.println(stack.isEmpty()); - } - - @Test - public void linkedListTest() { - LinkedList linkedList = new LinkedList(); - - // add() addLast() - for (int i = 0; i < 5; i++) { - linkedList.add("hello: " + i); - } - - // iterator() get() getPreNode() - Iterator iter = linkedList.iterator(); - - while (iter.hasNext()) { - System.out.println(iter.next()); - } - System.out.println("-----------------------"); - LinkedList linkedList1 = new LinkedList(); - - // addFirst() - for (int i = 0; i < 5; i++) { - linkedList1.addFirst("hello: " + i); - } - - Iterator iter1 = linkedList1.iterator(); - - while (iter1.hasNext()) { - System.out.println(iter1.next()); - } - - System.out.println("-----------------------"); - // remove() - System.out.println(linkedList1.remove(0)); // hello: 4 - - System.out.println("-----------------------"); - // removeFirst() removeLast() - System.out.println(linkedList1.removeFirst()); // hello: 3 - System.out.println(linkedList1.removeLast()); // hello: 0 - - System.out.println("-----------------------"); - // size() - System.out.println(linkedList.size()); // 5 - } - - @Test - public void arrayListTest() { - ArrayList arrayList = new ArrayList(); - - // add(obj) - for (int i = 0; i < 10; i++) { - arrayList.add("hello: " + i); - } - - // get(index) - for (int i = 0; i < arrayList.size(); i++) { - System.out.println("-->" + arrayList.get(i)); - } - - // add(index, obj) - arrayList.add(5, "Tennyson"); - - for (int i = 0; i < arrayList.size(); i++) { - System.out.println("++>" + arrayList.get(i)); - } - - // size() - System.out.println("size: " + arrayList.size()); - System.out.println("index 5: " + arrayList.get(5)); - - // remove() - Object value = arrayList.remove(5); - System.out.println("index 5: " + value); - System.out.println("size: " + arrayList.size()); - System.out.println("index5: " + arrayList.get(5)); - - for (int i = 0; i < arrayList.size(); i++) { - System.out.println("index " + i + " : " + arrayList.get(i)); - } - - System.out.println("-------------------------------"); - // iterator - Iterator iter = arrayList.iterator(); - while (iter.hasNext()) { - System.out.println(iter.next()); - } - - System.out.println("-------------------------------"); - - } -} diff --git a/group14/296933284/coding/src/com/coding/basic/LinkedList.java b/group14/296933284/coding/src/com/coding/basic/LinkedList.java index aacf0fcfdc..edd0819fb8 100644 --- a/group14/296933284/coding/src/com/coding/basic/LinkedList.java +++ b/group14/296933284/coding/src/com/coding/basic/LinkedList.java @@ -59,14 +59,14 @@ public void addLast(T element) { } -// public void addAll(Collection c) { -// -// Iterator iter = (Iterator) c.iterator(); -// -// while (iter.hasNext()) { -// addLast(iter.next()); -// } -// } + public void addAll(Collection c) { + + Iterator iter = (Iterator) c.iterator(); + + while (iter.hasNext()) { + addLast(iter.next()); + } + } @Override public T get(int index) { diff --git a/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java b/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java index 825df453ff..2ca8543e53 100644 --- a/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java +++ b/group14/296933284/coding/src/com/coding/basic/LinkedListTest.java @@ -1,10 +1,14 @@ package com.coding.basic; +import org.intellij.lang.annotations.Flow; +import org.jetbrains.annotations.NotNull; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.util.Collection; + import static org.junit.Assert.*; /** @@ -40,6 +44,11 @@ public void add1() throws Exception { Assert.assertEquals("python", bookList.removeLast()); } + @Test + public void addAll() throws Exception { + + } + @Test public void addFirst() throws Exception { bookList.addFirst("python"); From 73256db92d690d537e9dbba44ea9caef6dca2122 Mon Sep 17 00:00:00 2001 From: Tennyson Date: Sun, 12 Mar 2017 13:45:56 +0800 Subject: [PATCH 7/9] Multi thread Download --- .../coderising/download/DownloadThread.java | 28 ++++++--- .../coderising/download/FileDownloader.java | 58 +++++++++---------- .../download/FileDownloaderTest.java | 8 ++- .../download/impl/ConnectionImpl.java | 51 ++++++++-------- .../download/impl/ConnectionManagerImpl.java | 1 - 5 files changed, 78 insertions(+), 68 deletions(-) diff --git a/group14/296933284/coding/src/com/coderising/download/DownloadThread.java b/group14/296933284/coding/src/com/coderising/download/DownloadThread.java index 8e85aa7202..4f1b54cdc1 100644 --- a/group14/296933284/coding/src/com/coderising/download/DownloadThread.java +++ b/group14/296933284/coding/src/com/coderising/download/DownloadThread.java @@ -7,24 +7,36 @@ public class DownloadThread extends Thread { - Connection conn; - RandomAccessFile randomAccessFile; - int startPos; - int endPos; + private RandomAccessFile randomAccessFile; + private Connection conn; + private int startPos; + private int endPos; + static int lengths = 0; - public DownloadThread(Connection conn, RandomAccessFile randomAccessFile, int startPos, int endPos) { - this.conn = conn; + public DownloadThread(Connection conn, RandomAccessFile randomAccessFile,int startPos, int endPos) { this.randomAccessFile = randomAccessFile; + this.conn = conn; this.startPos = startPos; this.endPos = endPos; } + public void run() { try { randomAccessFile.seek(startPos); - byte[] buffer = conn.read(startPos, endPos); - randomAccessFile.write(buffer); + byte[] bytes = conn.read(startPos, endPos); + lengths += bytes.length; + System.out.println(lengths); + randomAccessFile.write(bytes, 0, bytes.length); } catch (IOException e) { e.printStackTrace(); + } finally { + if (randomAccessFile != null) { + try { + randomAccessFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } } diff --git a/group14/296933284/coding/src/com/coderising/download/FileDownloader.java b/group14/296933284/coding/src/com/coderising/download/FileDownloader.java index 2396654ccd..37a019a4c3 100644 --- a/group14/296933284/coding/src/com/coderising/download/FileDownloader.java +++ b/group14/296933284/coding/src/com/coderising/download/FileDownloader.java @@ -5,27 +5,23 @@ import com.coderising.download.api.ConnectionManager; import com.coderising.download.api.DownloadListener; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; -import java.lang.reflect.InvocationTargetException; public class FileDownloader { - String url; - - DownloadListener listener; - - ConnectionManager cm; - - String locaPath; + private String url; + private DownloadListener listener; + private ConnectionManager cm; + private String localPath; + private int threadCount; public FileDownloader(String _url) { this.url = _url; } - + public void execute(){ // 在这里实现你的代码, 注意: 需要用多线程实现下载 // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 @@ -40,34 +36,35 @@ public void execute(){ // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - Connection conn = null; + + Connection conn = null; RandomAccessFile randomAccessFile = null; + try { conn = cm.open(this.url); int length = conn.getContentLength(); + int size = length / threadCount; - int size = length / 3; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < threadCount; i++) { int startPos = i * size; int endPos = startPos + size - 1; - if (i == 3) { - endPos = length; + if (i == 2) { + endPos = length - 1; } - Connection connection = cm.open(this.url); - randomAccessFile = new RandomAccessFile(locaPath, "rwd"); + randomAccessFile = new RandomAccessFile(localPath, "rwd"); randomAccessFile.setLength(length); - new DownloadThread(connection, randomAccessFile,startPos, endPos).start(); - } - + Connection connection = cm.open(this.url); + DownloadThread downloadThread = new DownloadThread(connection, randomAccessFile, startPos, endPos); + downloadThread.start(); + getListener().notifyFinished(); + } - } catch (ConnectionException e) { + } catch (ConnectionException e) { e.printStackTrace(); - } catch (FileNotFoundException e) { - e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { @@ -76,24 +73,25 @@ public void execute(){ } } - - - } public void setListener(DownloadListener listener) { this.listener = listener; } - public void setLocaPath(String locaPath) { - this.locaPath = locaPath; + public void setLocalPath(String localPath) { + this.localPath = localPath; } public void setConnectionManager(ConnectionManager ucm){ this.cm = ucm; } - - public DownloadListener getListener(){ + + public void setThreadCount(int threadCount) { + this.threadCount = threadCount; + } + + public DownloadListener getListener(){ return this.listener; } diff --git a/group14/296933284/coding/src/com/coderising/download/FileDownloaderTest.java b/group14/296933284/coding/src/com/coderising/download/FileDownloaderTest.java index d892b457e1..cab6385a21 100644 --- a/group14/296933284/coding/src/com/coderising/download/FileDownloaderTest.java +++ b/group14/296933284/coding/src/com/coderising/download/FileDownloaderTest.java @@ -10,6 +10,7 @@ public class FileDownloaderTest { boolean downloadFinished = false; + @Before public void setUp() throws Exception { } @@ -37,16 +38,17 @@ public void notifyFinished() { }); - downloader.setLocaPath("D:\\Tennyson\\test.jpg"); + downloader.setLocalPath("D:\\Tennyson\\test.jpg"); + downloader.setThreadCount(3); downloader.execute(); - + // 等待多线程下载程序执行完毕 while (!downloadFinished) { try { System.out.println("还没有下载完成,休眠五秒"); //休眠5秒 Thread.sleep(5000); - } catch (InterruptedException e) { + } catch (InterruptedException e) { e.printStackTrace(); } } diff --git a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java index 6d40c1d4d4..05be8630fd 100644 --- a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java @@ -1,6 +1,8 @@ package com.coderising.download.impl; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.net.HttpURLConnection; import java.util.Scanner; @@ -9,8 +11,7 @@ public class ConnectionImpl implements Connection { private HttpURLConnection httpURLConnection = null; private int contentLength = 0; - private InputStream inputStream = null; - private int responsecode; + private int responsecode = 0; public ConnectionImpl(HttpURLConnection urlConnection) { this.httpURLConnection = urlConnection; @@ -29,10 +30,13 @@ public int getResponsecode() { @Override public byte[] read(int startPos, int endPos) throws IOException { - //httpURLConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + httpURLConnection.setRequestMethod("GET"); + httpURLConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); httpURLConnection.setConnectTimeout(5000); + byte[] bytes = null; - if (getResponsecode() == 200) { + if (getResponsecode() == 206) { + InputStream inputStream = null; ByteArrayOutputStream outputStream = null; @@ -51,22 +55,23 @@ public byte[] read(int startPos, int endPos) throws IOException { } catch (IOException e) { e.printStackTrace(); } finally { -// if (outputStream != null) { -// try { -// outputStream.close(); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// if (inputStream != null) { -// try { -// inputStream.close(); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } + return bytes; } @@ -94,13 +99,7 @@ public int getContentLength() { @Override public void close() { - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } + } } diff --git a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java index fad842fb04..759510f14d 100644 --- a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -17,7 +17,6 @@ public Connection open(String url) throws ConnectionException { try { URL newUrl = new URL(url); HttpURLConnection urlConnection = (HttpURLConnection) newUrl.openConnection(); - urlConnection.setRequestMethod("GET"); connection = new ConnectionImpl(urlConnection); } catch (MalformedURLException e) { e.printStackTrace(); From 3b89e3fd9ca9d39bdf86ad55ea420c8ee70d53d4 Mon Sep 17 00:00:00 2001 From: Tennyson Date: Sun, 12 Mar 2017 15:44:52 +0800 Subject: [PATCH 8/9] Multi thread Download test --- .../coderising/download/DownloadThread.java | 9 ++++---- .../coderising/download/FileDownloader.java | 13 ++++++------ .../download/impl/ConnectionImpl.java | 21 ++++++++++++------- .../download/impl/ConnectionManagerImpl.java | 3 ++- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/group14/296933284/coding/src/com/coderising/download/DownloadThread.java b/group14/296933284/coding/src/com/coderising/download/DownloadThread.java index 4f1b54cdc1..ecf3686ff8 100644 --- a/group14/296933284/coding/src/com/coderising/download/DownloadThread.java +++ b/group14/296933284/coding/src/com/coderising/download/DownloadThread.java @@ -11,22 +11,23 @@ public class DownloadThread extends Thread { private Connection conn; private int startPos; private int endPos; - static int lengths = 0; + private static int id = 0; public DownloadThread(Connection conn, RandomAccessFile randomAccessFile,int startPos, int endPos) { - this.randomAccessFile = randomAccessFile; this.conn = conn; + this.randomAccessFile = randomAccessFile; this.startPos = startPos; this.endPos = endPos; } public void run() { try { + randomAccessFile.seek(startPos); byte[] bytes = conn.read(startPos, endPos); - lengths += bytes.length; - System.out.println(lengths); + randomAccessFile.write(bytes, 0, bytes.length); + } catch (IOException e) { e.printStackTrace(); } finally { diff --git a/group14/296933284/coding/src/com/coderising/download/FileDownloader.java b/group14/296933284/coding/src/com/coderising/download/FileDownloader.java index 37a019a4c3..e4ef24ef17 100644 --- a/group14/296933284/coding/src/com/coderising/download/FileDownloader.java +++ b/group14/296933284/coding/src/com/coderising/download/FileDownloader.java @@ -43,13 +43,12 @@ public void execute(){ try { conn = cm.open(this.url); int length = conn.getContentLength(); - int size = length / threadCount; - + int blockSize = length % threadCount == 0 ? length / threadCount : length / threadCount + 1; for (int i = 0; i < threadCount; i++) { - int startPos = i * size; - int endPos = startPos + size - 1; + int startPos = i * blockSize; + int endPos = startPos + blockSize - 1; - if (i == 2) { + if (i == threadCount - 1) { endPos = length - 1; } @@ -60,9 +59,9 @@ public void execute(){ DownloadThread downloadThread = new DownloadThread(connection, randomAccessFile, startPos, endPos); downloadThread.start(); - getListener().notifyFinished(); - } + } + getListener().notifyFinished(); } catch (ConnectionException e) { e.printStackTrace(); } catch (IOException e) { diff --git a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java index 05be8630fd..4a4104b69b 100644 --- a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java @@ -77,20 +77,25 @@ public byte[] read(int startPos, int endPos) throws IOException { @Override public int getContentLength() { - Scanner input = null; - try { - input = new Scanner(httpURLConnection.getInputStream()); + InputStream inputStream = null; - while (input.hasNext()) { - String line = input.nextLine(); - contentLength += line.length(); + try { + inputStream = httpURLConnection.getInputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = inputStream.read(buffer)) != -1) { + contentLength += len; } } catch (IOException e) { e.printStackTrace(); } finally { - if (input != null) { - input.close(); + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java index 759510f14d..d8197123b2 100644 --- a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -14,9 +14,10 @@ public class ConnectionManagerImpl implements ConnectionManager { @Override public Connection open(String url) throws ConnectionException { Connection connection = null; + HttpURLConnection urlConnection = null; try { URL newUrl = new URL(url); - HttpURLConnection urlConnection = (HttpURLConnection) newUrl.openConnection(); + urlConnection = (HttpURLConnection) newUrl.openConnection(); connection = new ConnectionImpl(urlConnection); } catch (MalformedURLException e) { e.printStackTrace(); From bd2800ed0066ee23a30aed250a9970743b3a59f4 Mon Sep 17 00:00:00 2001 From: Tennyson Date: Sun, 12 Mar 2017 18:21:10 +0800 Subject: [PATCH 9/9] note --- group14/296933284/Note/README.md | 3 +- .../download/impl/ConnectionImpl.java | 41 +++++-------------- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/group14/296933284/Note/README.md b/group14/296933284/Note/README.md index 0b08b8f0bb..8741e7204b 100644 --- a/group14/296933284/Note/README.md +++ b/group14/296933284/Note/README.md @@ -2,4 +2,5 @@ --- 1. [漫谈计算机组成 -- 微型计算机的硬件组成 2017-02-26](http://tennyson.ren/2017/02/25/%E6%BC%AB%E8%B0%88%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E7%BB%84%E6%88%90%20--%20%E5%BE%AE%E5%9E%8B%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E7%A1%AC%E4%BB%B6%E7%BB%84%E6%88%90/) -2. [Java中解析XML的方法 2017-03-04](http://tennyson.ren/2017/03/04/Java%E4%B8%AD%E8%A7%A3%E6%9E%90XML%E7%9A%84%E6%96%B9%E6%B3%95/#more) \ No newline at end of file +2. [Java中解析XML的方法 2017-03-04](http://tennyson.ren/2017/03/04/Java%E4%B8%AD%E8%A7%A3%E6%9E%90XML%E7%9A%84%E6%96%B9%E6%B3%95/#more) +3. [Java多线程下载 2017-03-12](http://tennyson.ren/2017/03/12/Java%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8B%E8%BD%BD/) \ No newline at end of file diff --git a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java index 4a4104b69b..d5a6105648 100644 --- a/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group14/296933284/coding/src/com/coderising/download/impl/ConnectionImpl.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; -import java.util.Scanner; import com.coderising.download.api.Connection; @@ -37,39 +36,19 @@ public byte[] read(int startPos, int endPos) throws IOException { byte[] bytes = null; if (getResponsecode() == 206) { - InputStream inputStream = null; - ByteArrayOutputStream outputStream = null; + InputStream inputStream = httpURLConnection.getInputStream(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(endPos - startPos); - try { - inputStream = httpURLConnection.getInputStream(); - outputStream = new ByteArrayOutputStream(endPos - startPos); + byte[] buffer = new byte[1024]; + int len; + while ((len = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, len); + } - byte[] buffer = new byte[1024]; - int len; - while ((len = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, len); - } + bytes = outputStream.toByteArray(); - bytes = outputStream.toByteArray(); - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (outputStream != null) { - try { - outputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } + outputStream.close(); + inputStream.close(); } return bytes;

^<7W@(9yr9mUm2tK?C|&v@%Rm35X`o{%fo+w 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%0A?GZzYp7)bLPx}z&<;hZaX^DZ#RA|ACLXD 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%0Aok&dtGbv;D|BgjT@f(sv0`S4#(FudZ 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 literal 0 HcmV?d00001 diff --git a/group20/1107837739/1107837739Learning/lib/fastjson-1.2.7.jar b/group20/1107837739/1107837739Learning/lib/fastjson-1.2.7.jar new file mode 100644 index 0000000000000000000000000000000000000000..ce431a92c3b5c4e25396d59cc9a7679fde6ad225 GIT binary patch literal 417221 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Êno~7_UJFW{rKtPB> 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

?@Ib4$R$ZbA6MIsF(ZEk4Ii=sfRBa)&Yo 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�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 TY(h;@!?}i$7z!3V8^-w`q)kqw diff --git a/group20/1107837739/1107837739Learning/src/org/korben/Main.java b/group20/1107837739/1107837739Learning/src/org/korben/Main.java deleted file mode 100644 index 671f67a9a7..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/Main.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.korben; - -public class Main { - - public static void main(String[] args) { - System.out.println("Hello Korben : )"); - } -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KArrayList.java b/group20/1107837739/1107837739Learning/src/org/korben/list/KArrayList.java deleted file mode 100644 index 4d6236b537..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/list/KArrayList.java +++ /dev/null @@ -1,169 +0,0 @@ -package org.korben.list; - -import java.util.Objects; - -/** - * Korben's ArrayList - * - * Created by Korben on 18/02/2017. - */ -public class KArrayList implements KList { - - private int size; - private Object[] dataArray = new Object[0]; - - @Override - public int size() { - return this.size; - } - - @Override - public boolean isEmpty() { - return this.size == 0; - } - - @Override - public boolean contains(Object o) { - for (Object obj : dataArray) { - if (Objects.equals(obj, o)) { - return true; - } - } - return false; - } - - @Override - @SuppressWarnings("unchecked") - public Object[] toArray() { - Object[] array = new Object[size]; - System.arraycopy(dataArray, 0, array, 0, size); - return array; - } - - @Override - public boolean add(T o) { - ensureCapacity(size + 1); - dataArray[size] = o; - size++; - return true; - } - - @Override - public boolean remove(T o) { - int index = indexOf(o); - if (index < 0) { - return false; - } - - System.arraycopy(dataArray, index + 1, dataArray, index, size - 1 - index); - dataArray[size - 1] = null; - - size--; - - return true; - } - - @Override - public void clear() { - for (int i = 0; i < size; i++) { - dataArray[i] = null; - } - size = 0; - } - - @Override - @SuppressWarnings("unchecked") - public T get(int index) { - if (index < -1 || index >= size) { - throw new IndexOutOfBoundsException(); - } - - return (T) dataArray[index]; - } - - @Override - public T set(int index, T element) { - if (index < -1 || index >= size) { - throw new IndexOutOfBoundsException(); - } - - dataArray[index] = element; - - return element; - } - - @Override - public void add(int index, T element) { - if (index < -1 || index > size) { - throw new IndexOutOfBoundsException(); - } - - ensureCapacity(size + 1); - - System.arraycopy(dataArray, index, dataArray, index + 1, size - index); - - dataArray[index] = element; - size++; - } - - @Override - @SuppressWarnings("unchecked") - public T remove(int index) { - if (index < -1 || index >= size) { - throw new IndexOutOfBoundsException(); - } - - T removeData = (T) dataArray[index]; - System.arraycopy(dataArray, index + 1, dataArray, index, size - 1 - index); - dataArray[size - 1] = null; - size--; - return removeData; - } - - @Override - public int indexOf(T o) { - for (int i = 0; i < size; i++) { - if (Objects.equals(o, dataArray[i])) { - return i; - } - } - return -1; - } - - @Override - public KIterator iterator() { - return new ArrayListIterator(this); - } - - private void ensureCapacity(int minCapacity) { - if (minCapacity > dataArray.length) { - int newCapacity = Math.max(minCapacity, dataArray.length * 2); - Object[] newDataArray = new Object[newCapacity]; - System.arraycopy(dataArray, 0, newDataArray, 0, dataArray.length); - - dataArray = newDataArray; - } - } - - private class ArrayListIterator implements KIterator { - private int position; - private KArrayList list; - - ArrayListIterator(KArrayList list) { - this.list = list; - } - - @Override - public boolean hasNext() { - return position < list.size(); - } - - @Override - public T next() { - if (hasNext()) { - return list.get(position++); - } - return null; - } - } -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KIterator.java b/group20/1107837739/1107837739Learning/src/org/korben/list/KIterator.java deleted file mode 100644 index c29e566178..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/list/KIterator.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.korben.list; - -/** - * Created by Korben on 24/02/2017. - */ -public interface KIterator { - boolean hasNext(); - - T next(); -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KLinkedList.java b/group20/1107837739/1107837739Learning/src/org/korben/list/KLinkedList.java deleted file mode 100644 index e14efad19c..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/list/KLinkedList.java +++ /dev/null @@ -1,172 +0,0 @@ -package org.korben.list; - -import java.util.Objects; - -/** - * Korben's LinkedList - * - * Created by Korben on 18/02/2017. - */ -public class KLinkedList implements KList { - - private int size; - - private Node head; - - private Node last; - - public KLinkedList() { - this.head = new Node<>(null); - } - - @Override - public int size() { - return this.size; - } - - @Override - public boolean isEmpty() { - return this.size == 0; - } - - @Override - public boolean contains(Object o) { - Node node = this.head; - while (node.next != null) { - node = node.next; - if (Objects.equals(node.data, o)) { - return true; - } - } - return false; - } - - @Override - public Object[] toArray() { - return new Object[0]; - } - - @Override - public boolean add(T o) { - if (this.last == null) { - this.last = new Node<>(o); - this.last.pre = this.head; - this.head.next = this.last; - } else { - Node oldLast = this.last; - this.last = new Node<>(o); - this.last.pre = oldLast; - oldLast.next = this.last; - } - this.size++; - return true; - } - - @Override - public boolean remove(T o) { - Node node = this.head; - while (node.next != null) { - node = node.next; - if (Objects.equals(node.data, o)) { - node.pre.next = node.next; - if (node.next != null) { - node.next.pre = node.pre; - } - this.size--; - return true; - } - } - return false; - } - - @Override - public void clear() { - this.head.next = null; - this.last = null; - - this.size = 0; - } - - @Override - public T get(int index) { - return getNode(index).data; - } - - @Override - public T set(int index, T element) { - Node node = getNode(index); - node.data = element; - return element; - } - - @Override - public void add(int index, T element) { - Node node = this.head; - for (int i = 0; i <= index; i++) { - node = node.next; - } - Node pre = node.pre; - Node newNode = new Node<>(element); - pre.next = newNode; - newNode.pre = pre; - newNode.next = node; - node.pre = newNode; - - this.size++; - } - - @Override - public T remove(int index) { - Node node = getNode(index); - Node pre = node.pre; - Node next = node.next; - pre.next = next; - if (next != null) { - next.pre = pre; - } - - this.size--; - return node.data; - } - - @Override - public int indexOf(T o) { - Node node = this.head; - int index = 0; - while (node.next != null) { - node = node.next; - if (Objects.equals(node.data, o)) { - return index; - } - index++; - } - return -1; - } - - @Override - public KIterator iterator() { - throw new IllegalStateException("方法未实现"); - } - - private Node getNode(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(); - } - - Node node = this.head; - for (int i = 0; i <= index; i++) { - node = node.next; - } - return node; - } - - private static class Node { - T data; - Node pre; - Node next; - - Node(T data) { - this.data = data; - } - } -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KList.java b/group20/1107837739/1107837739Learning/src/org/korben/list/KList.java deleted file mode 100644 index e5d33b984b..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/list/KList.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.korben.list; - -/** - * Korben's List - * - * Created by Korben on 18/02/2017. - */ -public interface KList { - - int size(); - - boolean isEmpty(); - - boolean contains(Object o); - - Object[] toArray(); - - boolean add(T o); - - boolean remove(T o); - - void clear(); - - T get(int index); - - T set(int index, T element); - - void add(int index, T element); - - T remove(int index); - - int indexOf(T o); - - KIterator iterator(); -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KListIteratorTest.java b/group20/1107837739/1107837739Learning/src/org/korben/list/KListIteratorTest.java deleted file mode 100644 index 994538732f..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/list/KListIteratorTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.korben.list; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Iterator测试 - * - * Created by Korben on 24/02/2017. - */ -public class KListIteratorTest { - - private KList list; - - @Before - public void init() { - this.list = new KArrayList<>(); - - for (int i = 0; i < 5; i++) { - list.add(i); - } - } - - @Test - public void testIterator() { - KIterator iterator = list.iterator(); - Assert.assertTrue(iterator.hasNext()); - int count = 0; - while (iterator.hasNext()) { - int value = iterator.next(); - Assert.assertEquals(count, value); - count++; - } - } -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/list/KListTest.java b/group20/1107837739/1107837739Learning/src/org/korben/list/KListTest.java deleted file mode 100644 index ed3055b74e..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/list/KListTest.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.korben.list; - -import java.util.Objects; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * KList测试 - * - * Created by Korben on 18/02/2017. - */ -public class KListTest { - - private KList list; - - private int initTestSize; - - @Before - public void init() { - // 测试KArrayList - //list = new KArrayList<>(); - - // 测试KLinkedList - list = new KLinkedList<>(); - - initTestSize = 5; - - for (int i = 0; i < initTestSize; i++) { - list.add(i); - } - } - - @Test - public void size() throws Exception { - Assert.assertEquals(initTestSize, list.size()); - } - - @Test - public void isEmpty() throws Exception { - Assert.assertFalse(list.isEmpty()); - - KList list = new KArrayList<>(); - Assert.assertTrue(list.isEmpty()); - } - - @Test - public void contains() throws Exception { - Assert.assertTrue(list.contains(1)); - Assert.assertFalse(list.contains(5)); - } - - @Test - public void toArray() throws Exception { - //Object[] array = list.toArray(); - //Assert.assertEquals(initTestSize, array.length); - //for (int i = 0; i < array.length; i++) { - // Assert.assertEquals(i, array[i]); - //} - } - - @Test - public void add() throws Exception { - Assert.assertTrue(list.add(6)); - Assert.assertTrue(list.contains(6)); - Assert.assertEquals(initTestSize + 1, list.size()); - } - - @Test - public void remove() throws Exception { - Assert.assertEquals(0, list.remove(0).intValue()); - Assert.assertEquals(initTestSize - 1, list.size()); - Assert.assertFalse(list.contains(0)); - } - - @Test - public void clear() throws Exception { - list.clear(); - Assert.assertTrue(list.isEmpty()); - Assert.assertTrue(list.size() == 0); - } - - @Test - public void get() throws Exception { - for (int i = 0; i < initTestSize; i++) { - Assert.assertTrue(Objects.equals(i, list.get(i))); - } - } - - @Test - public void set() throws Exception { - for (int i = 0; i < initTestSize; i++) { - list.set(i, initTestSize); - Assert.assertEquals(initTestSize, list.get(i).intValue()); - } - } - - @Test - public void addByIndex() throws Exception { - // test add by first index - list.add(0, 6); - Assert.assertEquals(initTestSize + 1, list.size()); - Assert.assertEquals(6, list.get(0).intValue()); - for (int i = 0; i < initTestSize; i++) { - Assert.assertEquals(i, list.get(i + 1).intValue()); - } - - // test add by last index - init(); - list.add(initTestSize - 1, 6); - Assert.assertEquals(initTestSize + 1, list.size()); - Assert.assertEquals(initTestSize - 1, list.get(initTestSize).intValue()); - Assert.assertEquals(6, list.get(initTestSize - 1).intValue()); - for (int i = 0; i < initTestSize - 1; i++) { - Assert.assertEquals(i, list.get(i).intValue()); - } - - // test add by middle index - init(); - list.add(3, 90); - Assert.assertEquals(initTestSize + 1, list.size()); - Assert.assertEquals(list.get(0).intValue(), 0); - Assert.assertEquals(list.get(1).intValue(), 1); - Assert.assertEquals(list.get(2).intValue(), 2); - Assert.assertEquals(list.get(3).intValue(), 90); - Assert.assertEquals(list.get(4).intValue(), 3); - Assert.assertEquals(list.get(5).intValue(), 4); - } - - @Test - public void removeByObject() throws Exception { - Assert.assertTrue(list.remove(new Integer(3))); - Assert.assertEquals(initTestSize - 1, list.size()); - } - - @Test - public void indexOf() throws Exception { - for (int i = 0; i < initTestSize; i++) { - Assert.assertEquals(i, list.indexOf(i)); - } - } -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/queue/KArrayQueue.java b/group20/1107837739/1107837739Learning/src/org/korben/queue/KArrayQueue.java deleted file mode 100644 index 3e975058f4..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/queue/KArrayQueue.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.korben.queue; - -import java.util.NoSuchElementException; - -/** - * Created by Korben on 18/02/2017. - */ -public class KArrayQueue implements KQueue { - - private int size; - private Object[] dataArray = {}; - private int front = 0; - private int end = -1; - - public KArrayQueue() { - - } - - @Override - public boolean add(T t) { - ensureCapacity(size + 1); - dataArray[end + 1] = t; - end++; - size++; - return true; - } - - @Override - public boolean offer(T t) { - ensureCapacity(size + 1); - dataArray[end + 1] = t; - end++; - size++; - return true; - } - - @Override - @SuppressWarnings("unchecked") - public T remove() { - if (end == -1) { - throw new NoSuchElementException(); - } - T value = (T) dataArray[front]; - dataArray[front] = null; - size--; - front++; - if (front == dataArray.length) { - front = 0; - } - if (size == 0) { - end = -1; - } - - return value; - } - - @Override - @SuppressWarnings("unchecked") - public T poll() { - if (end == -1) { - return null; - } - T value = (T) dataArray[front]; - dataArray[front] = null; - size--; - front++; - if (front == dataArray.length) { - front = 0; - } - - return value; - } - - @Override - @SuppressWarnings("unchecked") - public T element() { - if (end == -1) { - throw new NoSuchElementException(); - } - return (T) dataArray[front]; - } - - @Override - @SuppressWarnings("unchecked") - public T peek() { - if (end == -1) { - return null; - } - return (T) dataArray[front]; - } - - private void ensureCapacity(int minSize) { - if (end == -1) { - dataArray = new Object[8]; - } else if (minSize >= dataArray.length) { - int newLength = dataArray.length * 2; - Object[] newDataArray = new Object[newLength]; - if (front != 0) { - System.arraycopy(dataArray, front, - newDataArray, newLength - dataArray.length + front, - dataArray.length - 1 - front); - - front += newLength - dataArray.length; - } else { - System.arraycopy(dataArray, front, newDataArray, front, size); - } - - dataArray = newDataArray; - } - } -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/queue/KQueue.java b/group20/1107837739/1107837739Learning/src/org/korben/queue/KQueue.java deleted file mode 100644 index 14763efd99..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/queue/KQueue.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.korben.queue; - -/** - * Korben's Queue Interface - * - * Created by Korben on 18/02/2017. - */ -public interface KQueue { - boolean add(T t); - - boolean offer(T t); - - T remove(); - - T poll(); - - T element(); - - T peek(); -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/queue/KQueueTest.java b/group20/1107837739/1107837739Learning/src/org/korben/queue/KQueueTest.java deleted file mode 100644 index 3d9557748f..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/queue/KQueueTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.korben.queue; - -import java.util.NoSuchElementException; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * KQueue Test - * - * Created by Korben on 19/02/2017. - */ -public class KQueueTest { - private KQueue queue; - - @Before - public void init() { - queue = new KArrayQueue<>(); - } - - @Test - public void add() throws Exception { - for (int i = 0; i < 5; i++) { - queue.add(i); - } - } - - @Test - public void offer() throws Exception { - for (int i = 0; i < 100; i++) { - queue.offer(i); - } - } - - @Test(expected = NoSuchElementException.class) - public void remove() throws Exception { - for (int i = 0; i < 9; i++) { - queue.add(i); - } - for (int i = 0; i < 9; i++) { - Assert.assertEquals(i, queue.remove().intValue()); - } - queue.remove(); - } - - @Test - public void poll() throws Exception { - for (int i = 0; i < 5; i++) { - queue.add(i); - } - for (int i = 0; i < 5; i++) { - Assert.assertEquals(i, queue.poll().intValue()); - } - Assert.assertNull(queue.poll()); - } - - @Test(expected = NoSuchElementException.class) - public void element() throws Exception { - for (int i = 0; i < 5; i++) { - queue.add(i); - Assert.assertEquals(queue.element().intValue(), 0); - } - init(); - - queue.element(); - } - - @Test - public void peek() throws Exception { - for (int i = 0; i < 5; i++) { - queue.add(i); - Assert.assertEquals(queue.peek().intValue(), 0); - } - init(); - - Assert.assertNull(queue.peek()); - } -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/stack/KStack.java b/group20/1107837739/1107837739Learning/src/org/korben/stack/KStack.java deleted file mode 100644 index 8dc39e4efd..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/stack/KStack.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.korben.stack; - -import java.util.EmptyStackException; -import java.util.Objects; - -/** - * Korben's Stack - * - * Created by Korben on 18/02/2017. - */ -public class KStack { - - private int size; - private Object[] dataArray = {}; - - public KStack() { - } - - public int size() { - return size; - } - - public T push(T item) { - ensureCapacity(size + 1); - this.dataArray[size] = item; - this.size++; - return item; - } - - @SuppressWarnings("unchecked") - public T pop() { - if (size == 0) { - throw new EmptyStackException(); - } - - T data = (T) this.dataArray[size - 1]; - this.dataArray[size - 1] = null; - this.size--; - return data; - } - - @SuppressWarnings("unchecked") - public T peek() { - if (size == 0) { - throw new EmptyStackException(); - } - return (T) dataArray[size - 1]; - } - - public boolean empty() { - return size == 0; - } - - public synchronized int search(Object o) { - for (int i = 0; i < size; i++) { - if (Objects.equals(o, dataArray[i])) { - return i; - } - } - return -1; - } - - private void ensureCapacity(int minCapacity) { - if (minCapacity > dataArray.length) { - int newCapacity = Math.max(minCapacity, dataArray.length * 2); - Object[] newDataArray = new Object[newCapacity]; - System.arraycopy(dataArray, 0, newDataArray, 0, dataArray.length); - - this.dataArray = newDataArray; - } - } -} diff --git a/group20/1107837739/1107837739Learning/src/org/korben/stack/KStackTest.java b/group20/1107837739/1107837739Learning/src/org/korben/stack/KStackTest.java deleted file mode 100644 index e3f173eb3f..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/stack/KStackTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.korben.stack; - -import java.util.EmptyStackException; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * KStack测试 - * - * Created by Korben on 18/02/2017. - */ -public class KStackTest { - private KStack stack; - private int initTestSize; - - @Before - public void init() { - stack = new KStack<>(); - initTestSize = 5; - - for (int i = 0; i < initTestSize; i++) { - stack.push(i); - } - } - - @Test - public void size() throws Exception { - Assert.assertEquals(initTestSize, stack.size()); - } - - @Test - public void push() throws Exception { - stack.push(9); - } - - @Test(expected = EmptyStackException.class) - public void pop() throws Exception { - for (int i = 0; i < initTestSize; i++) { - Integer value = stack.pop(); - Assert.assertEquals(value.intValue(), initTestSize - 1 - i); - } - - stack.pop(); - } - - @Test(expected = EmptyStackException.class) - public void peek() throws Exception { - Assert.assertEquals(initTestSize - 1, stack.peek().intValue()); - for (int i = 0; i < initTestSize; i++) { - stack.pop(); - } - stack.peek(); - } - - @Test - public void empty() throws Exception { - Assert.assertFalse(stack.empty()); - for (int i = 0; i < initTestSize; i++) { - stack.pop(); - } - Assert.assertTrue(stack.empty()); - } - - @Test - public void search() throws Exception { - for (int i = 0; i < initTestSize; i++) { - Assert.assertEquals(i, stack.search(i)); - } - } -} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNode.java b/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNode.java deleted file mode 100644 index 30c613edd0..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNode.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.korben.tree; - -/** - * Korben's BinaryTreeNode - * - * Created by Korben on 21/02/2017. - */ -public class BinaryTreeNode { - - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private int size; - - public T getData() { - return data; - } - - public void setData(T data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - @SuppressWarnings("unchecked") - public BinaryTreeNode insert(T data) { - if (this.data == null) { - this.data = data; - return this; - } - int compareResult = this.data.compareTo(data); - if (compareResult > 0) { - if (this.left == null) { - this.left = new BinaryTreeNode(); - this.left.data = data; - return this.left; - } else { - return this.left.insert(data); - } - } else if (compareResult < 0) { - if (this.right == null) { - this.right = new BinaryTreeNode(); - this.right.data = data; - return this.right; - } else { - return this.right.insert(data); - } - } else { - return this; - } - } - - @SuppressWarnings("unchecked") - public BinaryTreeNode delete(T data) { - BinaryTreeNode treeNode = search(data); - if (treeNode == null) { - return null; - } - int compareResult = this.data.compareTo(data); - if (compareResult > 0) { - return this.left.delete(data); - } else if (compareResult < 0) { - return this.right.delete(data); - } else { - if (treeNode.right == null) { - if (this.left == null) { - this.data = null; - } else { - this.left = this; - } - } else { - this.data = (T) this.right.findMin().data; - - this.right.delete(this.data); - } - } - - return this; - } - - private BinaryTreeNode findMin() { - if (this.data == null) { - return null; - } - if (this.left == null) { - return this; - } - return this.left.findMin(); - } - - @SuppressWarnings("unchecked") - public BinaryTreeNode search(T data) { - if (this.data == null) { - return null; - } - int compareResult = this.data.compareTo(data); - if (compareResult > 0) { - if (this.left == null) { - return null; - } else { - return this.left.search(data); - } - } else if (compareResult < 0) { - if (this.right == null) { - return null; - } else { - return this.right.search(data); - } - } else { - return this; - } - } -} \ No newline at end of file diff --git a/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNodeTest.java b/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNodeTest.java deleted file mode 100644 index a6fb4ed4e9..0000000000 --- a/group20/1107837739/1107837739Learning/src/org/korben/tree/BinaryTreeNodeTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.korben.tree; - -import org.junit.Assert; - -/** - * Korben's BinaryTreeNode Test - * - * Created by Korben on 21/02/2017. - */ -public class BinaryTreeNodeTest { - - private BinaryTreeNode treeNode; - - @org.junit.Before - public void setUp() throws Exception { - treeNode = new BinaryTreeNode<>(); - treeNode.insert(5); - treeNode.insert(3); - treeNode.insert(7); - treeNode.insert(1); - treeNode.insert(4); - treeNode.insert(2); - treeNode.insert(8); - treeNode.insert(6); - } - - @org.junit.Test - public void insert() { - Assert.assertEquals(treeNode.getData().intValue(), 5); - Assert.assertEquals(treeNode.getLeft().getData(), 3); - Assert.assertEquals(treeNode.getRight().getData(), 7); - Assert.assertEquals(treeNode.getLeft().getLeft().getData(), 1); - Assert.assertEquals(treeNode.getLeft().getRight().getData(), 4); - Assert.assertEquals(treeNode.getLeft().getLeft().getRight().getData(), 2); - Assert.assertEquals(treeNode.getRight().getRight().getData(), 8); - Assert.assertEquals(treeNode.getRight().getLeft().getData(), 6); - } - - @org.junit.Test - public void delete() throws Exception { - treeNode.delete(3); - for (int i = 1; i < 9; i++) { - if (i != 3) { - Assert.assertNotNull(treeNode.search(i)); - } else { - Assert.assertNull(treeNode.search(i)); - } - } - } - - @org.junit.Test - public void search() throws Exception { - for (int i = 1; i < 9; i++) { - Assert.assertNotNull(treeNode.search(i)); - } - Assert.assertNull(treeNode.search(0)); - Assert.assertNull(treeNode.search(9)); - } -} \ No newline at end of file diff --git a/group20/1107837739/korben.md b/group20/1107837739/korben.md deleted file mode 100644 index 983f6f47b6..0000000000 --- a/group20/1107837739/korben.md +++ /dev/null @@ -1,7 +0,0 @@ -## Korben's Blog Here - --------- - -| Blog Title | Date| -| ---------- | -----------| -| [初窥计算机程序的运行](http://korben-chy.github.io/2017/02/26/%E5%88%9D%E7%AA%A5%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%BF%90%E8%A1%8C/) | 2017/02/26 | diff --git a/group20/286166752/.gitignore b/group20/286166752/.gitignore deleted file mode 100644 index d120d1749d..0000000000 --- a/group20/286166752/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.idea/ -286166752.iml -out/ - diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/ArrayList.java b/group20/286166752/src/wiki/liven/code/dataStructures/ArrayList.java deleted file mode 100644 index 68444b87a9..0000000000 --- a/group20/286166752/src/wiki/liven/code/dataStructures/ArrayList.java +++ /dev/null @@ -1,86 +0,0 @@ -package wiki.liven.code.dataStructures; - -/** - * Created by leven on 2017/2/21. - */ -public class ArrayList implements List{ - - /** - * 列表中元素的个数 - */ - private int size = 0; - private int maxSize = 100; - /** - * 初始数组 - */ - private Object[] elementData = new Object[maxSize]; - - /** - * 在指定的位置i插入元素O - * 插入元素,判断当前列表中元素的个数, - * 当size==100,则需要扩张数组 - * 当size<100,则使用初始数组完成插入操作 - * 插入操作: - * 从最后一个元素开始,往后移动一位,直到到index为止. - * @param index - * @param o - */ - @Override - public void add(int index, Object o) { - if (size>=maxSize){ - Object[] targt = new Object[++maxSize]; - System.arraycopy(elementData,0,targt,0,maxSize); - for (int j = targt.length;j>=index;j--){ - targt[j-1] = targt[j-2]; - } - targt[index] = o; - size++; - }else if(size=index;j--){ - elementData[j-1] = elementData[j-2]; - } - elementData[index] = o; - size++; - } - } - - /** - * 追加元素 - * @param o - */ - @Override - public void add(Object o) { - if (size>=maxSize){ - Object[] targt = new Object[++maxSize]; - System.arraycopy(elementData,0,targt,0,maxSize); - targt[maxSize-1] = o; - size++; - }else if(sizesize-1;i++){ - elementData[i] = elementData[i+1]; - } - return temp; - } - - @Override - public int size() { - return size; - } - - - - -} diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java b/group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java deleted file mode 100644 index b2cc5f8668..0000000000 --- a/group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java +++ /dev/null @@ -1,40 +0,0 @@ -package wiki.liven.code.dataStructures; - -/** - * Created by leven on 2017/2/21. - */ -public class LinkedList implements List{ - - private Node head; - - private static class Node{ - Object data; - Node next; - } - - - @Override - public void add(int index, Object o) { - - } - - @Override - public void add(Object o) { - - } - - @Override - public Object get(int index) { - return null; - } - - @Override - public Object remove(int index) { - return null; - } - - @Override - public int size() { - return 0; - } -} diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/List.java b/group20/286166752/src/wiki/liven/code/dataStructures/List.java deleted file mode 100644 index 2d1840ef0f..0000000000 --- a/group20/286166752/src/wiki/liven/code/dataStructures/List.java +++ /dev/null @@ -1,14 +0,0 @@ -package wiki.liven.code.dataStructures; - -/** - * Created by leven on 2017/2/21. - */ -public interface List { - - public void add(Object o); - public void add(int index,Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - -} diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/Queue.java b/group20/286166752/src/wiki/liven/code/dataStructures/Queue.java deleted file mode 100644 index b8c8430daa..0000000000 --- a/group20/286166752/src/wiki/liven/code/dataStructures/Queue.java +++ /dev/null @@ -1,7 +0,0 @@ -package wiki.liven.code.dataStructures; - -/** - * Created by leven on 2017/2/21. - */ -public class Queue { -} diff --git a/group20/286166752/src/wiki/liven/code/dataStructures/Stack.java b/group20/286166752/src/wiki/liven/code/dataStructures/Stack.java deleted file mode 100644 index 59cb18c416..0000000000 --- a/group20/286166752/src/wiki/liven/code/dataStructures/Stack.java +++ /dev/null @@ -1,7 +0,0 @@ -package wiki.liven.code.dataStructures; - -/** - * Created by leven on 2017/2/21. - */ -public class Stack { -} diff --git a/group20/286166752/src/wiki/liven/code/test/SomeDemos.java b/group20/286166752/src/wiki/liven/code/test/SomeDemos.java deleted file mode 100644 index 90a74edc35..0000000000 --- a/group20/286166752/src/wiki/liven/code/test/SomeDemos.java +++ /dev/null @@ -1,15 +0,0 @@ -package wiki.liven.code.test; - -/** - * Created by leven on 2017/2/21. - */ -public class SomeDemos { - - public static void main(String[] args){ - int[] a = new int[10]; - a[0] = 4; - System.out.println(a.length); - - } - -} diff --git a/group20/331798361/assignment1/src/com/coding/basic/ArrayList.java b/group20/331798361/assignment1/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 0d960ee3d8..0000000000 --- a/group20/331798361/assignment1/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - int n = elementData.length; - int i = 0; - while (elementData[i] != null) { - i++; - } - if (i < n) { - elementData[i] = o; - } else { - Object[] temp = Arrays.copyOf(elementData, n + 1); - temp[n] = o; - elementData = temp; - } - size++; - } - public void add(int index, Object o){ - int n = elementData.length; - int i = 0; - while (elementData[i] != null) { - i++; - } - if (index < 0 || index > i) { - System.out.println(index + " is invalid index!"); - return; - } - if (i < n) { - for (int j = i; j > index; j--) { - elementData[j] = elementData[j - 1]; - } - elementData[index] = o; - } else { - Object[] temp = Arrays.copyOf(elementData, n + 1); - for (int j = i; j > index; j--) { - temp[j] = temp[j - 1]; - } - temp[index] = o; - elementData = temp; - } - size++; - } - - public Object get(int index){ - int i = 0; - while (elementData[i] != null) { - i++; - } - if (index < 0 || index >= i) { - System.out.println(index + " is invalid index!"); - return null; - } else { - return elementData[index]; - } - } - - public Object remove(int index){ - int i = 0; - while (elementData[i] != null) { - i++; - } - if (index < 0 || index >= i) { - System.out.println(index + " is invalid index!"); - return null; - } - Object result = elementData[index]; - for (int j = index; j < i; j++) { - elementData[j] = elementData[j + 1]; - } - size--; - return result; - } - - public int size(){ - return size; - } - - public String toString() { - int i = 0; - while (elementData[i] != null) { - i++; - } - String result = ""; - for (int j = 0; j < i - 1; j++) { - result += elementData[j].toString() + ", "; - } - result += elementData[size - 1].toString(); - return result; - } - - public Iterator iterator(){ - return null; - } - - public static void main(String args[]){ - ArrayList list1 = new ArrayList(); - list1.add("a"); - list1.add("b"); - list1.add("c"); - System.out.println(list1.toString()); - list1.add(5, "d"); - list1.add(1, "d"); - System.out.println(list1.toString()); - list1.add(4, "e"); - System.out.println(list1.toString()); - list1.get(5); - System.out.println(list1.get(0)); - list1.remove(2); - System.out.println(list1.toString()); - System.out.println(list1.size()); - } - -} diff --git a/group20/331798361/assignment1/src/com/coding/basic/BinaryTreeNode.java b/group20/331798361/assignment1/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 266eff3d56..0000000000 --- a/group20/331798361/assignment1/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group20/331798361/assignment1/src/com/coding/basic/Iterator.java b/group20/331798361/assignment1/src/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/group20/331798361/assignment1/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group20/331798361/assignment1/src/com/coding/basic/LinkedList.java b/group20/331798361/assignment1/src/com/coding/basic/LinkedList.java deleted file mode 100644 index e029beaeb4..0000000000 --- a/group20/331798361/assignment1/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - private int size; - - public void add(Object o){ - if (head.data == null) { - head.data = o; - head.next = null; - size++; - return; - } - Node node = new Node(o); - Node curr = head; - while (curr.next != null) { - curr = curr.next; - } - curr.next = node; - size++; - } - public void add(int index , Object o){ - - if (index < 0 || index > size) { - System.out.println(index + " is invalid index!"); - return; - } - if (head.data == null) { - if (index == 0) { - head.data = o; - head.next = null; - size++; - return; - } else { - System.out.println("invalid index!"); - return; - } - } - Node node = new Node(o); - Node curr = head; - for (int i = 0; i < index - 1; i++) { - curr = curr.next; - } - Node temp = curr.next; - curr.next = node; - node.next = temp; - size++; - } - public Object get(int index){ - if (index < 0 || index > size) { - System.out.println(index + " is invalid index!"); - return null; - } - Node result = head; - for (int i = 0; i < index; i++) { - result = result.next; - } - return result; - } - public Object remove(int index){ - if (index < 0 || index > size) { - System.out.println(index + " is invalid index!"); - return null; - } - Node curr = head; - for (int i = 0; i < index - 1; i++) { - curr = curr.next; - } - Node result = curr.next; - curr.next = curr.next.next; - size--; - return result; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - if (head.data == null) { - head.data = o; - head.next = null; - size++; - return; - } - Node temp = head; - head = new Node(o); - head.next = temp; - size++; - } - - public void addLast(Object o){ - if (head.data == null) { - head.data = o; - head.next = null; - size++; - return; - } - Node node = new Node(o); - Node curr = head; - while (curr.next != null) { - curr = curr.next; - } - curr.next = node; - size++; - } - - public Object removeFirst(){ - if (head.data == null) { - return null; - } - Node result = head; - head = head.next; - size--; - return result; - } - - public Object removeLast(){ - if (head.data == null) { - return null; - } - Node curr = head; - for (int i = 0; i < size - 1; i++) { - curr = curr.next; - } - Node result = curr.next; - curr.next = null; - size--; - return result; - } - - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - Node(Object o) { - data = o; - next = null; - } - - } -} diff --git a/group20/331798361/assignment1/src/com/coding/basic/List.java b/group20/331798361/assignment1/src/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/group20/331798361/assignment1/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group20/331798361/assignment1/src/com/coding/basic/Queue.java b/group20/331798361/assignment1/src/com/coding/basic/Queue.java deleted file mode 100644 index c4991a07f5..0000000000 --- a/group20/331798361/assignment1/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - - -public class Queue { - private LinkedList list = new LinkedList(); - - public void enQueue(Object o){ - list.add(o); - } - - public Object deQueue(){ - int length = list.size(); - if (length == 0) { - return null; - } - return list.removeFirst(); - } - - public boolean isEmpty(){ - if (list.size() == 0) { - return true; - } else { - return false; - } - } - - public int size(){ - return list.size(); - } -} diff --git a/group20/331798361/assignment1/src/com/coding/basic/Stack.java b/group20/331798361/assignment1/src/com/coding/basic/Stack.java deleted file mode 100644 index 0a48545cea..0000000000 --- a/group20/331798361/assignment1/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop(){ - int length = elementData.size(); - if (length == 0) { - return null; - } - return elementData.remove(length - 1); - } - - public Object peek(){ - int length = elementData.size(); - if (length == 0) { - return null; - } - return elementData.get(length - 1); - } - - public boolean isEmpty(){ - if (elementData.size() != 0) { - return false; - } else { - return true; - } - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group20/404130810/src/com/basic/datastructure/ArrayList.java b/group20/404130810/src/com/basic/datastructure/ArrayList.java deleted file mode 100644 index 86c001b2c1..0000000000 --- a/group20/404130810/src/com/basic/datastructure/ArrayList.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.basic.datastructure; - -public class ArrayList implements List { - - private Object[] elementData; - private int size; - - private int enableCapacity; - - public ArrayList() { - this.enableCapacity = 10; - this.elementData = new Object[enableCapacity]; - } - - @Override - public void add(Object o) { - growIfNeeded(); - elementData[size] = o; - this.size++; - } - - @Override - public void add(int index, Object o) { - rangeCheckForAdd(index); - growIfNeeded(); - - Object[] tmpObjects = new Object[elementData.length]; - System.arraycopy(elementData, 0, tmpObjects, 0, index); - tmpObjects[index] = o; - System.arraycopy(elementData, index, tmpObjects, index + 1, elementData.length - index - 1); - - elementData = tmpObjects; - - this.size++; - } - - @Override - public Object get(int index) { - if (index > size) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - return elementData[index]; - } - - @Override - public Object remove(int index) { - Object removedObj = this.get(index); - rangeCheck(index); - Object[] tmpObjects = new Object[elementData.length]; - - System.arraycopy(elementData, 0, tmpObjects, 0, index); - System.arraycopy(elementData, index + 1, tmpObjects, index, elementData.length - index - 1); - - elementData = tmpObjects; - - return removedObj; - } - - @Override - public int size() { - return size; - } - - @Override - public String toString() { - for (int i = 0; i < elementData.length; i++) { - System.out.print(elementData[i] + ","); - } - return ""; - } - - private void rangeCheck(int paramInt) { - if ((paramInt < 0) || (paramInt >= size)) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(paramInt)); - } - } - - private void rangeCheckForAdd(int paramInt) { - if ((paramInt < 0) || (paramInt > size)) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(paramInt)); - } - } - - private String outOfBoundsMsg(int paramInt) { - return "Index: " + paramInt + ", Size: " + size; - } - - private Object[] growIfNeeded() { - if (enableCapacity <= this.size) { - enableCapacity = enableCapacity * 2; - Object[] largerElementData = new Object[enableCapacity]; - System.arraycopy(elementData, 0, largerElementData, 0, elementData.length); - elementData = largerElementData; - } - return elementData; - } - - public static void main(String[] args) { - ArrayList list = new ArrayList(); - for (int i = 0; i <= 11; i++) { - list.add(String.valueOf(i)); - } - System.out.println(list.get(11)); - //list.add(10,"test"); - //list.get(10); - //list.remove(10); - //System.out.println(list); - } - -} diff --git a/group20/404130810/src/com/basic/datastructure/LinkedList.java b/group20/404130810/src/com/basic/datastructure/LinkedList.java deleted file mode 100644 index 43ba7ddd59..0000000000 --- a/group20/404130810/src/com/basic/datastructure/LinkedList.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.basic.datastructure; - -public class LinkedList implements List { - private Node first; - private Node last; - - private int size; - - public void add(Object item) { - addLast(item); - } - - public void add(int index, Object item) { - checkRange(index); - if (index == 0) { - addFirst(item); - } else if (index == size) { - addLast(item); - } else { - Node tmpNode = new Node(item); - Node preNode = get(index - 1); - Node nextNode = get(index + 1); - preNode.next = tmpNode; - tmpNode.next = nextNode; - size ++; - } - } - - public Node get(int index) { - checkRange(index); - if(size > 0){ - int loopTimes = 0; - Node p = first; - while(index > loopTimes){ - p = p.next; - loopTimes ++; - } - return p; - } - - return null; - } - - public Object remove(int index) { - checkRange(index); - Node tmpNode = null; - if(index == 0){ - removeFirst(); - }else if(index == size -1){ - removeLast(); - }else{ - tmpNode = get(index); - Node preNode = get(index-1); - Node nextNode = get(index + 1); - preNode.next = nextNode; - size --; - } - - return tmpNode; - } - - public int size() { - return size; - } - - public void addFirst(Object item) { - if (size == 0) { - first = new Node(item); - last = first; - } else { - Node tmpNode = new Node(item); - tmpNode.next = first; - first = tmpNode; - } - size++; - } - - public void addLast(Object item) { - if (size == 0) { - first = new Node(item); - last = first; - } else { - last.next = new Node(item); - last = last.next; - } - size++; - } - - public Object removeFirst() { - Node tmpNode = first; - if(tmpNode == null){ - last = null; - }else if(size == 2){ - first = last; - last = null; - size --; - }else{ - first = first.next; - size--; - } - return tmpNode; - } - - public Object removeLast() { - Node tmpNode = null; - if(size == 1){ - this.removeFirst(); - }else if(size >0){ - int index = size - 1; - tmpNode = last; - get(index - 1).next = null; - last = get(index - 1); - size --; - } - return tmpNode; - } - - private void checkRange(int index) { - if (index > size || index < 0) { - throw new IndexOutOfBoundsException("Index: " + index + "Size: " + size); - } - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - Node p = first; - while (p != null) { - sb.append(p.item + "\n"); - p = p.next; - } - return sb.toString(); - } - - private static class Node { - private Object item; - private Node next; - Node(Object item) { - this.item = item; - } - } - - public static void main(String[] args) { - - /*Test add - LinkedList list = new LinkedList(); - for (int i = 0; i <= 5; i++) { - list.add(i); - } - list.add(3, "test"); - System.out.println(list); - */ - - /*Test remove - list.remove(3); - System.out.println(list); - */ - - /*Test removeLast and removeFirst - System.out.println(list); - list.removeLast(); - System.out.println(list); - list.removeLast(); - System.out.println(list); - list.removeLast(); - System.out.println(list); - */ - - /*Test from Java API - java.util.LinkedList linkedList = new java.util.LinkedList(); - linkedList.add("test"); - linkedList.removeFirst(); - System.out.println(linkedList); - */ - - } -} diff --git a/group20/404130810/src/com/basic/datastructure/List.java b/group20/404130810/src/com/basic/datastructure/List.java deleted file mode 100644 index 13fc25acfd..0000000000 --- a/group20/404130810/src/com/basic/datastructure/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.basic.datastructure; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - -} diff --git a/group20/404130810/src/com/basic/datastructure/Queue.java b/group20/404130810/src/com/basic/datastructure/Queue.java deleted file mode 100644 index f83d937e5c..0000000000 --- a/group20/404130810/src/com/basic/datastructure/Queue.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.basic.datastructure; - -public class Queue { - LinkedList list = new LinkedList(); - private int size; - - public void enQueue(Object o){ - list.add(o); - size ++; - } - - public Object deQueue(){ - size --; - return list.removeLast(); - } - - public boolean isEmpty(){ - return list.size() == 0; - } - - public int size(){ - return size; - } - - public static void main(String[] args) { - Queue queue = new Queue(); - for (int i = 0; i < 10; i++) { - queue.enQueue(i); - } - queue.deQueue(); - System.out.println("Finished"); - } -} diff --git a/group20/404130810/src/com/basic/datastructure/Stack.java b/group20/404130810/src/com/basic/datastructure/Stack.java deleted file mode 100644 index 7a58fd49e6..0000000000 --- a/group20/404130810/src/com/basic/datastructure/Stack.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.basic.datastructure; - -public class Stack { - private ArrayList elementData = new ArrayList(); - private int size; - - public void push(Object o){ - elementData.add(o); - size++; - } - public Object pop(){ - size --; - return elementData.remove(elementData.size() - 1); - } - - /** - * Looks at the object at the top of this stack without removing it from the stack. - * @return Object - */ - public Object peek(){ - return elementData.get(elementData.size() - 1); - } - public boolean isEmpty(){ - return size == 0; - } - public int size(){ - return size; - } - - public static void main(String[] args) { - Stack stack = new Stack(); - for (int i = 0; i < 10; i++) { - stack.push(i); - } - System.out.println(stack.peek()); - - stack.pop(); - System.out.println("Finished"); - } - -} diff --git a/group20/404130810/src/com/basic/practice/PolymorphicInJava.java b/group20/404130810/src/com/basic/practice/PolymorphicInJava.java deleted file mode 100644 index 6bf9996da3..0000000000 --- a/group20/404130810/src/com/basic/practice/PolymorphicInJava.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.basic.practice; - -/** - * - * @author Wu Alvin - * Java Polymorphic Only represent in method level - * - */ - -class Fruit{ - String name = "Fruit"; - public void print(int i){ - System.out.println("Fruit" + i); - } -} - - -class Apple extends Fruit{ - String name = "Apple"; - public void print(int i){ - System.out.println("Apple" + i); - } -} - - -public class PolymorphicInJava { - - public static void main(String[] args) { - Apple apple = new Apple(); - apple.print(100); - //Apple100 - System.out.println(apple.name); - //Apple - Fruit fruit = apple; - fruit.print(100); - //Apple100 - System.out.println(fruit.name); - //Fruit - } - -} diff --git a/group20/404130810/src/com/basic/practice/ValuePassInJava.java b/group20/404130810/src/com/basic/practice/ValuePassInJava.java deleted file mode 100644 index 6187b5e0fc..0000000000 --- a/group20/404130810/src/com/basic/practice/ValuePassInJava.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.basic.practice; - -public class ValuePassInJava { - - /* - * Pass the Simple value, etc int String... - * Change will NOT happened - * - */ - public static void main(String[] args) { - String s = new String("123"); - int i = 1; - changeVal(i); - System.out.println(i); - - } - - private static void changeVal(int i){ - i = 2; - } - - /* - * Pass whole OBJECT, but change the Member variable - * Change will happened - */ - - /* - public static void main(String[] args) { - Person p = new Person(); - p.age = 10; - changeAge(p); - System.out.println(p.age); - } - - private static void changeAge(Person p){ - p.age = 20; - } - */ - -} - -class Person{ - int age; -} diff --git a/group20/423184723/src/com/coding/basic/ArrayList.java b/group20/423184723/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 1f185736f9..0000000000 --- a/group20/423184723/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group20/423184723/src/com/coding/basic/BinaryTreeNode.java b/group20/423184723/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group20/423184723/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group20/423184723/src/com/coding/basic/Iterator.java b/group20/423184723/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group20/423184723/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group20/423184723/src/com/coding/basic/LinkedList.java b/group20/423184723/src/com/coding/basic/LinkedList.java deleted file mode 100644 index e2c4e5e795..0000000000 --- a/group20/423184723/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/group20/423184723/src/com/coding/basic/List.java b/group20/423184723/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group20/423184723/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group20/423184723/src/com/coding/basic/Queue.java b/group20/423184723/src/com/coding/basic/Queue.java deleted file mode 100644 index 36e516e266..0000000000 --- a/group20/423184723/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group20/423184723/src/com/coding/basic/Stack.java b/group20/423184723/src/com/coding/basic/Stack.java deleted file mode 100644 index a5a04de76d..0000000000 --- a/group20/423184723/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group20/452472201/.gitignore b/group20/452472201/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group20/452472201/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group20/452472201/src/com/coding/basic/ArrayList.java b/group20/452472201/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 1af26ce934..0000000000 --- a/group20/452472201/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size=0; - - private Object[] elementData =new Object[10]; - - - //数组扩容 - private void ensureCapacityInternal(){ - if(size==elementData.length){ - Object[] newArray = new Object[size*2]; - System.arraycopy(elementData, 0, newArray, 0, elementData.length); - elementData=newArray; - } - } - - public void add(Object o){ - ensureCapacityInternal(); - elementData[size]=o; - size++; - } - - public void add(int index, Object o){ - ensureCapacityInternal(); - if(index<0){ - try { - throw new Exception(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - System.arraycopy(elementData, index, elementData, index+1,size-index ); - elementData[index]=o; - size++; - } - - public Object get(int index){ - if(index<0||index>=size){ - try { - throw new Exception(); - } catch (Exception e) { - e.printStackTrace(); - } - } - return elementData[index]; - } - - public Object remove(int index){ - if(index>=size){ - try { - throw new Exception(); - } catch (Exception e) { - e.printStackTrace(); - } - }else{ - - int numMoved=size-index-1; - if(numMoved>0){ - System.arraycopy(elementData, index+1, elementData, index, numMoved); - } - - elementData[size--] = null; - } - return index; - - } - - - public int size(){ - return size; - } - - - private class Iter implements Iterator { - //计数器 - private int coursor=-1; - //判断是否存在下一个 - public boolean hasNext(){ - return coursor+1 - */ -public class ArrayList implements List { - - /** 元素个数 */ - private int size; - - /** 默认容量 */ - private static final int DEFAULT_CAPACITY = 10; - - /** 默认最大容量 */ - private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; - - /** 默认数组 */ - private static final Object[] EMPTY_ELEMENTDATA = {}; - - /** 用于存放元素 */ - private Object[] elementData; - - /** - * 无参构造将使用默认数组 - */ - public ArrayList() { - elementData = EMPTY_ELEMENTDATA; - } - - @Override - public int size() { - return size; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - // @Override - // public boolean contains(Object o) { - // // TODO Auto-generated method stub - // return false; - // } - - @Override - public Iterator iterator() { - return new Itr(); - } - - private class Itr implements Iterator { - int cursor; // 当前索引 - int lastRet = -1;// - - @Override - public boolean hasNext() { - return cursor != size; - } - - @SuppressWarnings("unchecked") - @Override - public E next() { - if (cursor > size) { - throw new NoSuchElementException(); - } - Object[] elementData = ArrayList.this.elementData; - if (cursor >= elementData.length) { - throw new ConcurrentModificationException(); - } - return (E) elementData[lastRet = cursor++]; - } - - @Override - public void remove() { - if (lastRet < 0) - throw new IllegalStateException(); - try { - ArrayList.this.remove(lastRet); - cursor = lastRet; - lastRet = -1; - size--; - } catch (IndexOutOfBoundsException ex) { - throw new ConcurrentModificationException(); - } - } - - } - - // @Override - // public Object[] toArray() { - // // TODO Auto-generated method stub - // return null; - // } - // - // @Override - // public T[] toArray(T[] a) { - // // TODO Auto-generated method stub - // return null; - // } - - @Override - public boolean add(E element) { - // 保证数组长度正确 - ensureCapacityInternal(size + 1); - // 使用后缀自操作符 - elementData[size++] = element; - return true; - } - - @Override - public boolean add(int index, E element) { - rangeCheckForAdd(index);// 进行添加操作的索引范围检查 - // 保证数组长度正确 - ensureCapacityInternal(size + 1); - // 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 - // destPos+length-1 位置 - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = element; - size++; - return true; - } - - private void ensureCapacityInternal(int minCapacity) { - if (elementData == EMPTY_ELEMENTDATA) - minCapacity = Math.max(minCapacity, DEFAULT_CAPACITY); - // 传入最小容量大于当前数组长度,则扩容 - if (minCapacity > elementData.length) - grow(minCapacity); - } - - /** - * 扩容 - * - * @param minCapacity - */ - private void grow(int minCapacity) { - int oldCapacity = elementData.length;// 获取原数组长度 - // 计算新容量 - int newCapacity = oldCapacity + (oldCapacity >> 1);// 原容量+(原容量/2),使用位移符提高运行速度 - newCapacity = newCapacity < minCapacity ? minCapacity : newCapacity; - if (newCapacity > MAX_ARRAY_SIZE) - newCapacity = hugeCapacity(newCapacity); - // 将原数组数据复制到一个长度为newCapacity的新数组中 - elementData = Arrays.copyOf(elementData, newCapacity); - } - - /** - * 传入容量是否大于最大容量常量,如大于最大容量,则返回int类型所能表示的最大值 ArrayList最大容量为int类型所能表示的最大值 - * - * @param minCapacity - * @return - */ - private int hugeCapacity(int minCapacity) { - if (minCapacity < 0) { - throw new OutOfMemoryError("The index cannot be negative"); - } - return minCapacity > MAX_ARRAY_SIZE ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; - } - - @SuppressWarnings("unchecked") - @Override - public E get(int index) { - rangeCheck(index);// 进行索引的范围检查 - return (E) elementData[index]; - } - - @SuppressWarnings("unchecked") - @Override - public E set(int index, E element) { - rangeCheck(index);// 进行索引的范围检查 - // 取到指定索引元素,将新元素置入该索引位,并返回原元素 - E oldValue = (E) elementData[index]; - elementData[index] = element; - return oldValue; - } - - @SuppressWarnings("unchecked") - @Override - public E remove(int index) { - rangeCheck(index);// 进行索引的范围检查 - // 获取指定索引处元素 - E rmValue = (E) elementData[index]; - // 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 - // destPos+length-1 位置 - System.arraycopy(elementData, index + 1, elementData, index, size - (index - 1)); - size--; - return rmValue; - } - - // @Override - // public int indexOf(Object o) { - // // TODO Auto-generated method stub - // return 0; - // } - - /** - * 添加时的索引范围检查 - * - * @param index - */ - private void rangeCheckForAdd(int index) { - if (index > this.size || index < 0)// 添加可以往末位插入,所以这里索引等于元素个数也可以 - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - - /** - * 索引范围检查 - * - * @param index - */ - private void rangeCheck(int index) { - if (index < 0 || index >= this.size) - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - - /** - * 以字符串形式返回索引和元素个数信息 - * - * @param index - * @return - */ - private String outOfBoundsMsg(int index) { - return "Index: " + index + ", Size: " + this.size; - } - -} diff --git a/group20/592146505/data _structure/src/cn/wsc/util/LinkedList.java b/group20/592146505/data _structure/src/cn/wsc/util/LinkedList.java deleted file mode 100644 index ccb9ff2783..0000000000 --- a/group20/592146505/data _structure/src/cn/wsc/util/LinkedList.java +++ /dev/null @@ -1,284 +0,0 @@ -package cn.wsc.util; - -import java.util.ConcurrentModificationException; -import java.util.NoSuchElementException; - -/** - * LinkedList类 - * - * @author Administrator - * @date 2017年2月25日上午10:52:41 - * @version v1.0 - * - * @param - */ -public class LinkedList implements List { - - private int size; - Node first; // 链表的头节点 - Node last; // 链表的尾节点 - - private static class Node { - E item; // 存储数据 - Node prev; // 上一个节点 - Node next; // 下一个节点 - - Node(Node prev, E element, Node next) { - this.item = element; - this.next = next; - this.prev = prev; - } - } - - @Override - public int size() { - return size; - } - - @Override - public boolean isEmpty() { - return size == 0; - } - - @Override - public Iterator iterator() { - return new Itr(); - } - - private class Itr implements Iterator { - int cursor; // 当前索引 - int lastRet = -1;// 上一次索引 - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public E next() { - if (cursor > size) { - throw new NoSuchElementException(); - } - return get(lastRet = cursor++); - } - - @Override - public void remove() { - if (lastRet < 0) - throw new IllegalStateException(); - try { - LinkedList.this.remove(lastRet); - cursor = lastRet; - lastRet = -1; - size--; - } catch (IndexOutOfBoundsException ex) { - throw new ConcurrentModificationException(); - } - } - - } - - @Override - public boolean add(E e) { - linkLast(e); - return true; - } - - @Override - public boolean add(int index, E element) { - checkPositionIndex(index);// 位置范围检查 - // 如果索引等于元素个数,则直接插入尾部 - if (index == size) { - linkLast(element); - } else { - linkBefore(element, node(index)); - } - return true; - } - - @Override - public E get(int index) { - return node(index).item; - } - - /** - * 维护头节点 - * - * @param e - */ - void linkFirst(E e) { - Node f = first; - // 创建新节点,将原头节点作为新节点的下一个节点 - Node newNode = new Node(null, e, f); - // 将新节点设置为头节点 - first = newNode; - // 如原头节点为null,则尾节点也为newNode - if (f == null) { - last = newNode; - } else {// 否则将新节点作为原头节点的上一个节点 - f.prev = newNode; - } - size++; - - } - - /** - * 维护尾节点 - * - * @param e - */ - void linkLast(E e) { - Node l = last; - // 创建新节点,将尾节点作为新节点的上一个节点 - Node newNode = new Node(l, e, null); - // 将新节点设置为尾节点 - last = newNode; - // 如原尾节点为null,则头节点也为newNode - if (l == null) { - first = newNode; - } else {// 否则将新节点作为原尾节点的下一个节点 - l.next = newNode; - } - size++; - } - - /** - * 在指定节点前插入新节点 - * - * @param e - * @param node - */ - void linkBefore(E e, Node node) { - // 获取node的上一个节点,并创建新节点,将pred做为新节点的上一个节点,将node作为新节点的下一个节点 - final Node pred = node.prev; - final Node newNode = new Node<>(pred, e, node); - // 将node的上一个节点指向newNode - node.prev = newNode; - // 如prev为null,则说明node为first,那么将新节点设为first - if (pred == null) { - first = newNode; - } else {// 否则,将新节点设为pred的下一个节点 - pred.next = newNode; - } - size++; - } - - /** - * 获取节点 - * - * @param index - * @return - */ - Node node(int index) { - // 索引小于长度的2分之一则从前向后遍历,否则从后向前遍历,减少遍历次数 - if (index < (size >> 1)) { - Node x = first; - for (int i = 0; i < index; i++) - x = x.next; - return x; - } else { - Node x = last; - for (int i = size - 1; i > index; i--) - x = x.prev; - return x; - } - } - - /** - * 获取头节点 - * - * @return - */ - public E getFirst() { - Node f = first; - if (f == null) - throw new NoSuchElementException(); - return f.item; - } - - /** - * 获取尾节点 - * - * @return - */ - public E getLast() { - Node l = last; - if (l == null) - throw new NoSuchElementException(); - return l.item; - } - - @Override - public E set(int index, E e) { - checkElementIndex(index);// 索引范围检查 - // 获取索引处节点,填入新值,返回原值 - Node x = node(index); - E oldVal = x.item; - x.item = e; - return oldVal; - } - - @Override - public E remove(int index) { - checkElementIndex(index);// 索引范围检查 - return unlink(node(index)); - } - - /** - * 删除节点 - * - * @param x - * @return - */ - E unlink(Node x) { - // 获取此节点的上一个节点和下一个节点 - E element = x.item; - Node prev = x.prev; - Node next = x.next; - // 如prev节点为null,则说明x节点为first,那么将next节点设为first - if (prev == null) { - first = next; - } else {// 否则,将prev节点的下一个节点设为next - prev.next = next; - } - // 如next节点为null,则说明x节点为last,那么将prev节点设为last - if (next == null) { - last = prev; - } else {// 否则,将next节点的上一个节点设为prev - next.prev = prev; - } - x.item = null; - size--; - return element; - } - - /** - * 位置范围检查 >0 && <=size - * - * @param index - */ - private void checkPositionIndex(int index) { - if (index > this.size || index < 0)// 添加可以往末位插入,所以这里索引等于元素个数也可以 - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - - /** - * 索引范围检查 >0 && = this.size) - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - - /** - * 以字符串形式返回索引和元素个数信息 - * - * @param index - * @return - */ - private String outOfBoundsMsg(int index) { - return "Index: " + index + ", Size: " + this.size; - } -} diff --git a/group20/592146505/data _structure/src/cn/wsc/util/List.java b/group20/592146505/data _structure/src/cn/wsc/util/List.java deleted file mode 100644 index 9b61278fc7..0000000000 --- a/group20/592146505/data _structure/src/cn/wsc/util/List.java +++ /dev/null @@ -1,105 +0,0 @@ -package cn.wsc.util; - -/** - * List接口 - * - * @author Administrator - * @date 2017年2月20日下午9:15:32 - * @version v1.0 - * - * @param - */ -public interface List { - - /** - * 获取集合元素个数 - * - * @return - */ - int size(); - - /** - * 集合是否为空 - * - * @return - */ - boolean isEmpty(); - - // /** - // * 是否包含指定元素 - // * @param o - // * @return - // */ - // boolean contains(Object o); - - /** - * 获取当前集合迭代器对象 - * - * @return - */ - Iterator iterator(); - // - // /** - // * 返回集合数组对象 - // * - // * @return - // */ - // Object[] toArray(); - // - // /** - // * 将集合元素复制到新数组中 - // * @param a - // * @return - // */ - // T[] toArray(T[] a); - - /** - * 在集合末尾追加元素 - * - * @param e - * @return - */ - boolean add(E e); - - /** - * 将元素添加至指定指定索引处 - * - * @param index - * @param e - * @return - */ - boolean add(int index, E e); - - /** - * 获取指定索引处元素 - * - * @param index - * @return - */ - E get(int index); - - /** - * 替换指定索引处元素为新元素,并返回被替换元素, - * - * @param index - * @param e - * @return - */ - E set(int index, E e); - - /** - * 删除并返回指定指定索引处元素 - * - * @param index - * @return - */ - E remove(int index); - - // /** - // * 返回该对象在集合中的下标,不存在返回-1 - // * @param o - // * @return - // */ - // int indexOf(Object o); - -} \ No newline at end of file diff --git a/group20/592146505/data _structure/src/cn/wsc/utils/Stack.java b/group20/592146505/data _structure/src/cn/wsc/utils/Stack.java deleted file mode 100644 index 3f156461e8..0000000000 --- a/group20/592146505/data _structure/src/cn/wsc/utils/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.wsc.utils; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git "a/group20/755659358/blogs/\350\256\241\347\256\227\346\234\272\351\203\250\344\273\266\347\220\206\350\247\243.txt" "b/group20/755659358/blogs/\350\256\241\347\256\227\346\234\272\351\203\250\344\273\266\347\220\206\350\247\243.txt" deleted file mode 100644 index 155001683a..0000000000 --- "a/group20/755659358/blogs/\350\256\241\347\256\227\346\234\272\351\203\250\344\273\266\347\220\206\350\247\243.txt" +++ /dev/null @@ -1,2 +0,0 @@ - 对计算机硬件的理解 - 计算机中cpu是核心部件,cpu是主要的计算部件,所有的逻辑运算和算术运算都是由cpu来玩成的。但cpu只管运算,怎么运算,何时运算,运算什么这些cpu都是不管的,这些其实就是一个个的指令,指令用来表示所有运算的信息,包括做什么运算,运算什么,运算结果如何处置等。这些指令都是存在内存当中的,cpu按照一定的顺序从内存当中读取指令,执行指令做运算,然后按照相应的指令输出结果。这就是一个简单的程序运行过程。内存空间是有限的,另外,内存上的指令也不能持久化的保存,断电之后就没有了。所以需要一个硬件保存大的二进制资源以及持久化的保存指令,所以就有了硬盘。所以计算机先从硬盘中读取指令和资源到内存当中来,然后cpu再从内存当中读取指令和资源,做运算,运算完之后再按照指令将输出保存在内存中或者硬盘中,程序执行完毕。 diff --git a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/ArrayList.java b/group20/755659358/liuxincourse_datastructure/src/liuxincourse/ArrayList.java deleted file mode 100644 index 8a4434041f..0000000000 --- a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/ArrayList.java +++ /dev/null @@ -1,56 +0,0 @@ -package liuxincourse; - -import java.util.Arrays; - - -public class ArrayList implements List{ - - private int size=0; - - private Object [] elementDataObjects = new Object[3]; - - public void add (Object o){ - if (size>=elementDataObjects.length) { - elementDataObjects=Arrays.copyOf(elementDataObjects, elementDataObjects.length+50); - } - elementDataObjects[size]=o; - size++; - } - - public void add (int index ,Object o){ - if (index>=size||index<0) { - throw new IndexOutOfBoundsException(); - } - if (size>=elementDataObjects.length) { - elementDataObjects=Arrays.copyOf(elementDataObjects, elementDataObjects.length+50); - } - System.arraycopy(elementDataObjects, index, elementDataObjects, index+1, size-index); - elementDataObjects[index]=o; - size++; - } - - public Object get (int index){ - if (index>=size||index<0) { - throw new IndexOutOfBoundsException(); - } - return elementDataObjects[index]; - } - - public Object remove(int index){ - if (index>=size||index<0) { - throw new IndexOutOfBoundsException(); - } - Object rem=elementDataObjects[index]; - System.arraycopy(elementDataObjects, index+1, elementDataObjects, index, size-index-1); - size--; - return rem; - } - - public int size(){ - return size; - } - -// public Iterator iterator(){ -// -// } -} diff --git a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/LinkedList.java b/group20/755659358/liuxincourse_datastructure/src/liuxincourse/LinkedList.java deleted file mode 100644 index 36e46e6412..0000000000 --- a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/LinkedList.java +++ /dev/null @@ -1,120 +0,0 @@ -package liuxincourse; - - -public class LinkedList implements List{ - - private Node head; - - private int size=0; - - - public void add(Object o){ - if (size==0) { - head=new Node(); - head.data=o; - size++; - return; - } - Node last=head; - for (int i = 0; i < size-1; i++) { - last=last.next; - } - Node added=new Node(); - last.next=added; - added.data=o; - size++; - } - - public void add(int index,Object o){ - if (index<0||index>size) { - throw new IndexOutOfBoundsException(); - } - Node pre=getNode(index-1); - Node next=getNode(index); - Node addedNode=new Node(); - addedNode.data=o; - pre.next=addedNode; - addedNode.next=next; - size++; - } - - private Node getNode(int index){ - Node node=head; - - for (int i = 0; i < index; i++) { - node=node.next; - } - - return node; - } - - public Object get(int index){ - if (index<0||index>size-1) { - throw new IndexOutOfBoundsException(); - } - if (index==0&&head==null) { - return null; - } - return getNode(index).data; - - } - - public Object remove(int index) { - if (index<0||index>size-1) { - throw new IndexOutOfBoundsException(); - } - Node pre=getNode(index-1); - Node next=getNode(index+1); - pre.next=next; - return getNode(index); - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - if (head==null) { - head=new Node(); - head.data=o; - size++; - return; - } - Node addNode=new Node(); - addNode.data=o; - addNode.next=head; - head=addNode; - size++; - } - - public void addLast(Object o){ - Node preLast=getNode(size-1); - Node addNode=new Node(); - addNode.data=o; - preLast.next=addNode; - size++; - } - - public Object removeFirst(){ - Node preHead=head; - head=head.next; - size--; - return preHead.data; - } - - public Object removeLast(){ - Node preLast=getNode(size-1); - Node last=getNode(size-2); - last.next=null; - size--; - return preLast.data; - } - - private static class Node{ - - Object data; - Node next; - - } - -} diff --git a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/List.java b/group20/755659358/liuxincourse_datastructure/src/liuxincourse/List.java deleted file mode 100644 index c4eaa0a02c..0000000000 --- a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package liuxincourse; - -public interface List { - - void add(Object o); - void add(int index,Object o); - Object get(int index); - Object remove(int index); - int size(); -} diff --git a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/Queue.java b/group20/755659358/liuxincourse_datastructure/src/liuxincourse/Queue.java deleted file mode 100644 index bbe11c043d..0000000000 --- a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/Queue.java +++ /dev/null @@ -1,25 +0,0 @@ -package liuxincourse; - -public class Queue { - - LinkedList list=new LinkedList(); - - public void enQueue(Object o){ - list.add(o); - } - - public Object deQueue(){ - - return list.removeFirst(); - } - - public boolean isEmpty() { - - return size()==0?true:false; - } - - public int size(){ - return list.size(); - } - -} diff --git a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/Stack.java b/group20/755659358/liuxincourse_datastructure/src/liuxincourse/Stack.java deleted file mode 100644 index 552d8c9f9e..0000000000 --- a/group20/755659358/liuxincourse_datastructure/src/liuxincourse/Stack.java +++ /dev/null @@ -1,27 +0,0 @@ -package liuxincourse; - -public class Stack { - - private LinkedList elementData=new LinkedList(); - - public void push (Object o){ - elementData.addFirst(o); - } - - public Object pop() { - return elementData.removeFirst(); - } - - public Object peek(){ - return elementData.get(0); - } - - public boolean isEmpty(){ - return size()==0?true:false; - } - - public int size() { - return elementData.size(); - } - -} diff --git a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/ArrayListTest.java b/group20/755659358/liuxincourse_datastructure/test/liuxincourse/ArrayListTest.java deleted file mode 100644 index 8b8d82b3b1..0000000000 --- a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/ArrayListTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package liuxincourse; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class ArrayListTest { - - - @Test - public void testAdd(){ - ArrayList list=new ArrayList(); - list.add(12); - list.add(2); - list.add(8); - assertEquals(8, list.get(2)); - } - - @Test - public void testAddIndex(){ - ArrayList list=new ArrayList(); - list.add(12); - list.add(2); - list.add(8); - list.add(1,33); - list.add(6); - list.add(7); - assertEquals(8, list.get(3)); - } - - @Test - public void testRemove(){ - ArrayList list=new ArrayList(); - list.add(12); - list.add(2); - list.add(8); - list.add(1,33); - list.remove(1); - assertEquals(2, list.get(1)); - } - - @Test - public void testSize(){ - ArrayList list=new ArrayList(); - list.add(12); - list.add(2); - list.add(8); - list.add(9); - list.add(77); - assertEquals(5, list.size()); - } - -} diff --git a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/LinkedListTest.java b/group20/755659358/liuxincourse_datastructure/test/liuxincourse/LinkedListTest.java deleted file mode 100644 index 69857b0e29..0000000000 --- a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/LinkedListTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package liuxincourse; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class LinkedListTest { - - @Test - public void testAdd() { - LinkedList list=new LinkedList(); - list.add(33); - list.add(44); - list.add(55); - list.add(88); - assertEquals(88, list.get(3)); - } - - @Test - public void testAddIndex() { - LinkedList list=new LinkedList(); - list.add(33); - list.add(44); - list.add(55); - list.add(1, 88); - assertEquals(55, list.get(3)); - } - - @Test - public void testAddFirst() { - LinkedList list=new LinkedList(); - list.add(33); - list.add(44); - list.add(55); - list.addFirst(88); - assertEquals(88, list.get(0)); - } - - @Test - public void testAddLast() { - LinkedList list=new LinkedList(); - list.add(33); - list.add(44); - list.add(55); - list.addFirst(88); - list.addLast(00); - assertEquals(00, list.get(list.size()-1)); - } - - @Test - public void testRemoveFirst() { - LinkedList list=new LinkedList(); - list.add(33); - list.add(44); - list.add(55); - list.addFirst(88); - assertEquals(88, list.removeFirst()); - } - - @Test - public void testRemoveLast() { - LinkedList list=new LinkedList(); - list.add(33); - list.add(44); - list.add(55); - list.addFirst(88); - assertEquals(55, list.removeLast()); - } -} diff --git a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/QueueTest.java b/group20/755659358/liuxincourse_datastructure/test/liuxincourse/QueueTest.java deleted file mode 100644 index 613df89fc3..0000000000 --- a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/QueueTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package liuxincourse; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class QueueTest { - - @Test - public void testEnqueue() { - Queue queue=new Queue(); - queue.enQueue(11); - queue.enQueue(22); - assertEquals(11, queue.deQueue()); - } - - @Test - public void testIsempty() { - Queue queue=new Queue(); - queue.enQueue(11); - queue.enQueue(22); - queue.deQueue(); - queue.deQueue(); - assertEquals(true, queue.isEmpty()); - } - -} diff --git a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/StackTest.java b/group20/755659358/liuxincourse_datastructure/test/liuxincourse/StackTest.java deleted file mode 100644 index 9f1175ffea..0000000000 --- a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/StackTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package liuxincourse; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class StackTest { - - @Test - public void testPush() { - Stack stack=new Stack(); - stack.push(22); - stack.push(33); - assertEquals(33, stack.pop()); - } - - @Test - public void testIsempty() { - Stack stack=new Stack(); - stack.push(22); - stack.push(33); - stack.pop(); - assertEquals(false, stack.isEmpty()); - } - -} diff --git a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/SuiteTest.java b/group20/755659358/liuxincourse_datastructure/test/liuxincourse/SuiteTest.java deleted file mode 100644 index 5c12e657b6..0000000000 --- a/group20/755659358/liuxincourse_datastructure/test/liuxincourse/SuiteTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package liuxincourse; - -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@SuiteClasses({ArrayListTest.class,LinkedListTest.class,QueueTest.class,StackTest.class}) -public class SuiteTest { - -} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyArrayList.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyArrayList.java" deleted file mode 100644 index de63307566..0000000000 --- "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyArrayList.java" +++ /dev/null @@ -1,136 +0,0 @@ -package BasicData; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -/** - * ʵֻݽṹArrayList - * - * @author Ralf - * - * @param - */ -public class MyArrayList implements MyList { - - private static final int DEFAULT_CAPACITY = 10; - private static int msize; - private T[] elements; - - public MyArrayList() { - msize = 0; - ensureCapacity(DEFAULT_CAPACITY); - } - - @SuppressWarnings("unchecked") - private void ensureCapacity(int newCapacity) { - // TODO Auto-generated method stub - if (msize > newCapacity) { - return; - } - T[] oldElements = elements; - elements = (T[]) new Object[newCapacity]; - for (int i = 0; i < size(); i++) { - elements[i] = oldElements[i]; - } - - } - public void trimSize(){ - if (msize < elements.length) { - ensureCapacity(msize); - } - } - - @Override - public boolean add(T t) { - // TODO Auto-generated method stub - - if (elements.length == size()) { - ensureCapacity(2 * size() + 1); - } - elements[msize++] = t; - return true; - } - - @Override - public void add(int index, T t) { - - if (msize == elements.length) { - ensureCapacity(2 * msize + 1); - } - for (int i = size(); i >= index; i--) { - elements[i + 1] = elements[i]; - } - elements[index] = t; - msize++; - } - - @Override - public int size() { - // TODO Auto-generated method stub - return msize; - } - - @Override - public T remove(int index) { - // TODO Auto-generated method stub - if (index < 0 || index > size()) { - throw new ArrayIndexOutOfBoundsException(); - } - T old = elements[index]; - for (int i = index; i < msize; i++) { - elements[i] = elements[i + 1]; - } - elements[msize--] = null; - return old; - - } - - @Override - public boolean set(int index, T t) { - // TODO Auto-generated method stub - if (index < 0 || index > size()) { - throw new ArrayIndexOutOfBoundsException(); - } - elements[index] = t; - return true; - } - - @Override - public T get(int index) { - // TODO Auto-generated method stub - if (index < 0 || index > msize) { - throw new ArrayIndexOutOfBoundsException(); - } - return elements[index]; - } - - @Override - public String toString() { - return Arrays.toString(elements); - } - - public MyIterator iterator() { - return new MyArrayListIterator(); - } - - private class MyArrayListIterator implements MyIterator { - - private int current = 0;// ָ - - public boolean hasNext() { - // TODO Auto-generated method stub - - return current < size(); - } - - public T Next() { - // TODO Auto-generated method stub - if (!hasNext()) { - throw new NoSuchElementException(); - } - return elements[current++]; - } - - } - -} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyIterator.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyIterator.java" deleted file mode 100644 index 42bf1d4fa1..0000000000 --- "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyIterator.java" +++ /dev/null @@ -1,7 +0,0 @@ -package BasicData; - -public interface MyIterator { - - public abstract boolean hasNext(); - public abstract T Next(); -} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyList.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyList.java" deleted file mode 100644 index 2b2ba5057a..0000000000 --- "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyList.java" +++ /dev/null @@ -1,16 +0,0 @@ -package BasicData; - -/** - * ԼListӿ - * @author Ralf - * - */ -public interface MyList { - - public abstract boolean add(T t); - public abstract void add(int index, T t); - public abstract int size(); - public abstract T remove(int index); - public abstract boolean set(int index, T t); - public abstract T get(int index); -} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyQueue.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyQueue.java" deleted file mode 100644 index 772b93f879..0000000000 --- "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyQueue.java" +++ /dev/null @@ -1,79 +0,0 @@ -package BasicData; - -/** - * ʵֻݽṹQueue() - * - * @author Administrator - * - */ -public class MyQueue { - - private int head; - private int tail; - private T[] elements; - private static final int DEFAUL_SIZE = 10; - private int numOfelements; - - public MyQueue() { - head = 0; - tail = 0; - numOfelements = 0; - setCapacity(DEFAUL_SIZE); - } - - public MyQueue(int capacity) { - head = 0; - tail = 0; - numOfelements = 0; - setCapacity(capacity); - - } - - @SuppressWarnings("unchecked") - private void setCapacity(int capacity) { - elements = (T[]) new Object[capacity]; - } - - public boolean enQueue(T t) { - - if (numOfelements == elements.length) { - return false; - } else { - elements[tail] = t; - numOfelements++; - if (tail == elements.length) - tail = 0; - else - tail++; - return true; - } - - } - - public T deQueue() { - if (head == tail) { - return null; - } else { - T t = elements[head]; - numOfelements--; - elements[head] = null; - if (head == elements.length) - head = 0; - else { - head++; - } - return t; - } - - } - - public boolean isEmpty() { - return numOfelements == 0; - } - - public int size() { - int msize = head - tail; - return msize > 0 ? msize : -msize; - } - -} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyStack.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyStack.java" deleted file mode 100644 index fb12e0dd23..0000000000 --- "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyStack.java" +++ /dev/null @@ -1,44 +0,0 @@ -package BasicData; - -import java.util.LinkedList; -import java.util.NoSuchElementException; - -/** - * ʵֻݽṹջ - * - * @author Ralf - * - */ -public class MyStack { - - private LinkedList linkedList; - - public MyStack() { - if (null == linkedList) { - linkedList = new LinkedList(); - } - } - - public void push(T t) { - linkedList.addFirst(t); - } - - public T pop() { - if (size() == 0) { - throw new NoSuchElementException(); - } - return linkedList.removeFirst(); - } - - public T peek() { - return (size() == 0) ? null : linkedList.getFirst(); - } - - public int size() { - return linkedList.size(); - } - - public boolean isEmpty(){ - return linkedList.isEmpty(); - } -} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java" deleted file mode 100644 index 6ca5cecb15..0000000000 --- "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java" +++ /dev/null @@ -1,99 +0,0 @@ -package BasicData; - -//insert -public class MyTreeNode> { - - private T data; - private MyTreeNode left = null; - private MyTreeNode right = null; - private MyTreeNode root = null; - private MyTreeNode cureeTreeNode = null; - - public T getData() { - return data; - } - public void setData(T data) { - this.data = data; - } - public MyTreeNode getLeft() { - return left; - } - public void setLeft(MyTreeNode left) { - this.left = left; - } - public MyTreeNode getRight() { - return right; - } - public void setRight(MyTreeNode right) { - this.right = right; - } - @Override - public String toString() { - StringBuilder string = new StringBuilder(); - string.append("["); - if (cureeTreeNode == null) { - string.append("]"); - return string.toString(); - } else { - string.append(cureeTreeNode.toString()).append("]"); - return string.toString(); - } - } - - public MyTreeNode insert(T o){ - MyTreeNode newNode = new MyTreeNode(); - MyTreeNode current = null; - newNode.setData(o); - if (root == null) { - root = newNode; - cureeTreeNode = newNode;// - return newNode; - } - else { - Digui(o, root); - current = cureeTreeNode; - if (current.getData().compareTo(o) == -1) { - current.right = newNode; - } else { - current.left = newNode; - } - cureeTreeNode = newNode; // - return newNode; - } - - } - - public void Digui(T o,MyTreeNode parentnode){ - cureeTreeNode = parentnode; - if (parentnode.left!= null) { - if (parentnode.getData().compareTo(o) == -1) { - parentnode = parentnode.right; - Digui(o, parentnode); - } - else - return; - } - if (parentnode.right != null) { - if (parentnode.getData().compareTo(o) == 1) { - parentnode = parentnode.left; - Digui(o, parentnode); - } - else - return; - } - } - - public void preOrder(MyTreeNode root) { - visit(root); - if(root.getLeft() != null) { - preOrder(root.getLeft()); - } - if(root.getRight() != null) { - preOrder(root.getRight()); - } - } - - public void visit(MyTreeNode btree) { - System.out.print(btree.getData() + "\t"); - } -} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/SingleLinkedList.java" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/SingleLinkedList.java" deleted file mode 100644 index a9e72ed4fa..0000000000 --- "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/SingleLinkedList.java" +++ /dev/null @@ -1,212 +0,0 @@ -package BasicData; - -import java.util.NoSuchElementException; - -import javax.lang.model.element.Element; - -public class SingleLinkedList implements MyList { - - private int msize;// ¼Ԫصĸ - Note head;// ָһԪ - Note last;// ָһԪ - - private static class Note { - private T item = null; - Note next = null; - - public Note(T t) { - this.item = t; - } - } - - public SingleLinkedList() { - - } - - @Override - public boolean add(T t) { - // TODO Auto-generated method stub - final Note l = last; - final Note newNote = new Note(t); - last = newNote; - if (l == null) { - head = newNote;// ֻһnullԪ - } else { - l.next = last; - } - msize++; - return true; - } - - @Override - public void add(int index, T t) { - // TODO Auto-generated method stub - if (index < 0 || index > msize) { - throw new IndexOutOfBoundsException(); - } - if (index == 0) { - addFirst(t); - } - if (index == msize) { - add(t); - } - Note current = head; - for (int i = 0; i < index - 1; i++) { - current = current.next; - } - final Note newNote = new Note(t); - newNote.next = current.next; - current.next = newNote; - msize++; - - } - - public boolean addFirst(T t) { - final Note newNote = new Note(t); - newNote.next = head; - head = newNote; - msize++; - return true; - } - - public boolean addLast(T t) { - final Note newNote = new Note(t); - newNote.next = null; - last.next = newNote; - last = newNote; - msize++; - return true; - } - - public T removeLast() throws Exception { - if (head == null) { - throw new Exception("LinkedList is Empty!"); - } - Note current = head; - if (head.next == null) { - head = null; - last = null; - } else { - while (current.next != null) { - if (current.next == last) { - last = current; - last.next = null; - break; - } - current = current.next; - } - - } - msize--; - return current.item; - - } - - public T removeFirst() throws Exception { - if (head == null) { - throw new Exception("LinkedList is Empty!"); - } - Note element = head; - head = head.next; - msize--; - return element.item; - } - - @Override - public int size() { - // TODO Auto-generated method stub - return msize; - } - - @Override - public T remove(int index) { - // TODO Auto-generated method stub - if (index < 0 || index > msize) { - throw new IndexOutOfBoundsException(); - } - Note element; - if (index == 0) { - element = head; - head = head.next; - msize--; - return element.item; - } - Note current = head; - for (int i = 0; i < index - 1; i++) { - current = current.next; - } - element = current.next; - if (index == msize) { - current.next = null; - last = current; - } else { - current.next = current.next.next; - } - - msize--; - return element.item; - } - - @Override - public boolean set(int index, T t) { - // TODO Auto-generated method stub - if (index < 0 || index > msize) { - throw new IndexOutOfBoundsException(); - } - Note current = head; - for (int i = 0; i < index; i++) { - current = head.next; - } - current.item = t; - return true; - } - - @Override - public T get(int index) { - // TODO Auto-generated method stub - if (index < 0 || index > msize) { - throw new IndexOutOfBoundsException(); - } - Note current = head; - for (int i = 0; i < index; i++) { - current = current.next; - } - return current.item; - } - - public MyIterator iterator() { - return new MyLinkedListIterator(); - } - - private class MyLinkedListIterator implements MyIterator { - - private int current = 0; - private Note nextNote = head; - - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return current < msize; - } - - @Override - public T Next() { - // TODO Auto-generated method stub - if (!hasNext()) { - throw new NoSuchElementException(); - } else { - current++; - Note eleNote = nextNote; - if (last == nextNote) { - nextNote = null; - } else { - nextNote = nextNote.next; - } - return eleNote.item; - - } - - } - } - -} diff --git "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\345\234\260\345\235\200" "b/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\345\234\260\345\235\200" deleted file mode 100644 index 2ebe35c33a..0000000000 --- "a/group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\345\234\260\345\235\200" +++ /dev/null @@ -1 +0,0 @@ -[文章链接](http://blog.csdn.net/u011371324/article/details/57146892) diff --git a/group20/group20.md b/group20/group20.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group20/group20.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/group21/group21.md b/group21/group21.md deleted file mode 100644 index d3f5a12faa..0000000000 --- a/group21/group21.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/liuxin/.classpath b/liuxin/.classpath deleted file mode 100644 index 373dce4005..0000000000 --- a/liuxin/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/liuxin/.gitignore b/liuxin/.gitignore deleted file mode 100644 index 3e2fcc7171..0000000000 --- a/liuxin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/liuxin/.project b/liuxin/.project deleted file mode 100644 index 2858b5b710..0000000000 --- a/liuxin/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2017Learning - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/liuxin/.settings/org.eclipse.jdt.core.prefs b/liuxin/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a87..0000000000 --- a/liuxin/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/liuxin/src/com/coderising/array/ArrayUtil.java b/liuxin/src/com/coderising/array/ArrayUtil.java deleted file mode 100644 index 78845d06d0..0000000000 --- a/liuxin/src/com/coderising/array/ArrayUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.coderising.array; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin){ - - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * @param oldArray - * @return - */ - - public int[] removeZero(int[] oldArray){ - return null; - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * @param array1 - * @param array2 - * @return - */ - - public int[] merge(int[] array1, int[] array2){ - return null; - } - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size){ - return null; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - public int[] fibonacci(int max){ - return null; - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max){ - return null; - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max){ - return null; - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator){ - return null; - } - - -} diff --git a/liuxin/src/com/coderising/litestruts/LoginAction.java b/liuxin/src/com/coderising/litestruts/LoginAction.java deleted file mode 100644 index 1005f35a29..0000000000 --- a/liuxin/src/com/coderising/litestruts/LoginAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.litestruts; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin - * - */ -public class LoginAction{ - private String name ; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - public void setPassword(String password){ - this.password = password; - } - public String getMessage(){ - return this.message; - } -} diff --git a/liuxin/src/com/coderising/litestruts/Struts.java b/liuxin/src/com/coderising/litestruts/Struts.java deleted file mode 100644 index 44cc35bf01..0000000000 --- a/liuxin/src/com/coderising/litestruts/Struts.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - - - -public class Struts { - - public static View runAction(String actionName, Map parameters) { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - return null; - } - -} diff --git a/liuxin/src/com/coderising/litestruts/StrutsTest.java b/liuxin/src/com/coderising/litestruts/StrutsTest.java deleted file mode 100644 index a44c1878ac..0000000000 --- a/liuxin/src/com/coderising/litestruts/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/liuxin/src/com/coderising/litestruts/View.java b/liuxin/src/com/coderising/litestruts/View.java deleted file mode 100644 index 0194c681f6..0000000000 --- a/liuxin/src/com/coderising/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/liuxin/src/com/coderising/litestruts/struts.xml b/liuxin/src/com/coderising/litestruts/struts.xml deleted file mode 100644 index 99063bcb0c..0000000000 --- a/liuxin/src/com/coderising/litestruts/struts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/liuxin/src/com/coding/basic/ArrayList.java b/liuxin/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 57412dcf7f..0000000000 --- a/liuxin/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/liuxin/src/com/coding/basic/BinaryTreeNode.java b/liuxin/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index 266eff3d56..0000000000 --- a/liuxin/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/liuxin/src/com/coding/basic/Iterator.java b/liuxin/src/com/coding/basic/Iterator.java deleted file mode 100644 index dbe8b9afb2..0000000000 --- a/liuxin/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/liuxin/src/com/coding/basic/LinkedList.java b/liuxin/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 1fd99bf26b..0000000000 --- a/liuxin/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } -} diff --git a/liuxin/src/com/coding/basic/List.java b/liuxin/src/com/coding/basic/List.java deleted file mode 100644 index 396b1f6416..0000000000 --- a/liuxin/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/liuxin/src/com/coding/basic/Queue.java b/liuxin/src/com/coding/basic/Queue.java deleted file mode 100644 index 08d2d86b14..0000000000 --- a/liuxin/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/liuxin/src/com/coding/basic/Stack.java b/liuxin/src/com/coding/basic/Stack.java deleted file mode 100644 index 4bfe28057f..0000000000 --- a/liuxin/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/shell.sh b/shell.sh deleted file mode 100644 index fbf69995d1..0000000000 --- a/shell.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -git add -A . -git commit -m "bobi" -git push origin master From ec035f53f1f9eb246fdb11dca017058689715505 Mon Sep 17 00:00:00 2001 From: Tennyson Date: Tue, 7 Mar 2017 13:06:16 +0800 Subject: [PATCH 4/9] recovery file --- README.md | 3 + group01/1298552064/.classpath | 8 + group01/1298552064/.gitignore | 1 + group01/1298552064/.project | 17 + .../1298552064/src/week01/basic/Iterator.java | 8 + group01/1298552064/src/week01/basic/List.java | 13 + .../src/week01/basic/MyArrayList.java | 131 +++++ .../src/week01/basic/MyBinaryTreeNode.java | 70 +++ .../src/week01/basic/MyLinkedList.java | 215 +++++++++ .../1298552064/src/week01/basic/MyQueue.java | 22 + .../1298552064/src/week01/basic/MyStack.java | 25 + .../src/week01/test/MyArrayListTest.java | 53 +++ .../src/week01/test/MyLinkedListTest.java | 78 +++ .../src/week01/test/MyQueueTest.java | 48 ++ .../src/week01/test/MyStackTest.java | 53 +++ .../src/week02/array/ArrayUtil.java | 245 ++++++++++ .../src/week02/litestruts/LoginAction.java | 42 ++ .../src/week02/litestruts/Struts.java | 106 +++++ .../src/week02/litestruts/View.java | 26 + .../src/week02/litestruts/struts.xml | 11 + .../src/week02/test/ArrayUtilTest.java | 75 +++ .../src/week02/test/StrutsTest.java | 41 ++ .../RemoteSystemsTempFiles/.project | 12 + group01/1328404806/dataStructure/.classpath | 27 ++ group01/1328404806/dataStructure/.gitignore | 1 + group01/1328404806/dataStructure/.project | 23 + .../org.eclipse.core.resources.prefs | 4 + .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.eclipse.m2e.core.prefs | 4 + group01/1328404806/dataStructure/pom.xml | 25 + .../main/java/ListService/KILinkedList.java | 10 + .../src/main/java/ListService/KIList.java | 28 ++ .../main/java/ListService/KIQueueList.java | 11 + .../main/java/ListService/KIStackList.java | 9 + .../main/java/ListServiceImpl/KArrayList.java | 192 ++++++++ .../java/ListServiceImpl/KLinkedList.java | 201 ++++++++ .../main/java/ListServiceImpl/KQueueList.java | 97 ++++ .../main/java/ListServiceImpl/KStackList.java | 48 ++ .../increaseLearning/dataStructure/App.java | 13 + .../dataStructure/AppTest.java | 38 ++ .../dataStructure/arrayListTest.java | 36 ++ .../dataStructure/linkedListTest.java | 21 + .../dataStructure/queueListTest.java | 42 ++ .../dataStructure/stackListTest.java | 26 + group01/1664823950/.classpath | 6 + group01/1664823950/.gitignore | 1 + group01/1664823950/.project | 21 + .../src/com/coderising/array/ArrayUtil.java | 209 ++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 34 ++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 73 +++ .../src/com/coding/basic/BinaryTreeNode.java | 45 ++ .../src/com/coding/basic/Iterator.java | 8 + .../src/com/coding/basic/LinkedList.java | 108 +++++ .../1664823950/src/com/coding/basic/List.java | 10 + .../src/com/coding/basic/Queue.java | 26 + .../src/com/coding/basic/Stack.java | 31 ++ group01/1814014897/zhouhui/.classpath | 7 + group01/1814014897/zhouhui/.gitignore | 1 + group01/1814014897/zhouhui/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + group01/1814014897/zhouhui/src/.project | 11 + .../week01/BasicDataStructure/ArrayList.java | 75 +++ .../BasicDataStructure/BinaryTreeNode.java | 56 +++ .../week01/BasicDataStructure/Iterator.java | 7 + .../week01/BasicDataStructure/LinkedList.java | 113 +++++ .../src/week01/BasicDataStructure/List.java | 9 + .../src/week01/BasicDataStructure/Queue.java | 25 + .../src/week01/BasicDataStructure/Stack.java | 25 + .../BasicDataStructureTest/AllTest.java | 18 + .../BasicDataStructureTest/ArrayListTest.java | 72 +++ .../BinaryTreeNodeTest.java | 80 ++++ .../LinkedListTest.java | 106 +++++ .../BasicDataStructureTest/QueueTest.java | 56 +++ .../BasicDataStructureTest/StackTest.java | 71 +++ .../zhouhui/src/week02/array/ArrayUtil.java | 222 +++++++++ .../src/week02/array/ArrayUtilTest.java | 74 +++ .../src/week02/litestruts/LoginAction.java | 39 ++ .../zhouhui/src/week02/litestruts/Struts.java | 120 +++++ .../src/week02/litestruts/StrutsTest.java | 41 ++ .../zhouhui/src/week02/litestruts/View.java | 28 ++ .../zhouhui/src/week02/litestruts/struts.xml | 11 + group01/1925347167/1925347167.md | 1 + .../Week1 Basic Data Structure/ArrayList.java | 64 +++ .../BinaryTreeNode.java | 38 ++ .../Week1 Basic Data Structure/Iterator.java | 7 + .../LinkedList.java | 127 +++++ .../Week1 Basic Data Structure/List.java | 9 + .../Week1 Basic Data Structure/Queue.java | 24 + .../Week1 Basic Data Structure/Stack.java | 28 ++ .../Week1 Basic Data Structure/readme.md | 1 + group01/2137642225/work01/.classpath | 7 + group01/2137642225/work01/.gitignore | 1 + group01/2137642225/work01/.project | 17 + group01/2137642225/work01/README.md | 6 + .../src/com/coding/mybasic/ArrayList.java | 139 ++++++ .../com/coding/mybasic/BinaryTreeNode.java | 73 +++ .../src/com/coding/mybasic/Iterator.java | 7 + .../src/com/coding/mybasic/LinkedList.java | 226 +++++++++ .../work01/src/com/coding/mybasic/List.java | 10 + .../work01/src/com/coding/mybasic/Queue.java | 30 ++ .../work01/src/com/coding/mybasic/Stack.java | 35 ++ .../src/com/coding/test/TestArrayList.java | 81 ++++ .../com/coding/test/TestBinaryTreeNode.java | 32 ++ .../src/com/coding/test/TestLinkedList.java | 73 +++ .../work01/src/com/coding/test/TestQueue.java | 36 ++ .../work01/src/com/coding/test/TestStack.java | 49 ++ group01/2137642225/work02/.classpath | 8 + group01/2137642225/work02/.gitignore | 1 + group01/2137642225/work02/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + group01/2137642225/work02/README.md | 1 + .../src/com/coderising/array/ArrayUtil.java | 236 +++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 338 +++++++++++++ .../com/coderising/litestruts/StrutsTest.java | 44 ++ .../src/com/coderising/litestruts/View.java | 26 + .../src/com/coderising/litestruts/struts.xml | 11 + .../com/coderising/test/ArrayUtilTest.java | 76 +++ .../src/task01/ArrayList.java | 86 ++++ .../src/task01/LinkedList.java | 162 +++++++ .../275150374Learning/src/task01/Main.java | 12 + .../275150374Learning/src/task01/Queue.java | 42 ++ .../275150374Learning/src/task01/Stack.java | 30 ++ group01/280646174/.gitignore | 27 ++ group01/280646174/280646174.md | 1 + group01/280646174/basic/pom.xml | 35 ++ .../java/com/coding2017/array/ArrayUtil.java | 275 +++++++++++ .../java/com/coding2017/basic/ArrayList.java | 100 ++++ .../com/coding2017/basic/BinaryTreeNode.java | 57 +++ .../java/com/coding2017/basic/Iterator.java | 7 + .../java/com/coding2017/basic/LinkedList.java | 179 +++++++ .../main/java/com/coding2017/basic/List.java | 13 + .../main/java/com/coding2017/basic/Queue.java | 22 + .../main/java/com/coding2017/basic/Stack.java | 25 + .../coding2017/litestruts/LoginAction.java | 42 ++ .../com/coding2017/litestruts/Struts.java | 127 +++++ .../litestruts/StrutsDefinition.java | 69 +++ .../coding2017/litestruts/StrutsXmlUtil.java | 58 +++ .../java/com/coding2017/litestruts/View.java | 26 + .../basic/src/main/resources/struts.xml | 11 + .../com/coding2017/array/ArrayUtilTest.java | 72 +++ .../com/coding2017/basic/ArrayListTest.java | 79 +++ .../coding2017/basic/BinaryTreeNodeTest.java | 24 + .../com/coding2017/basic/LinkedListTest.java | 83 ++++ .../java/com/coding2017/basic/QueueTest.java | 23 + .../java/com/coding2017/basic/StackTest.java | 24 + .../com/coding2017/litestruts/StrutsTest.java | 38 ++ group01/280646174/pom.xml | 49 ++ group01/349209948/.gitignore | 3 + .../349209948/src/week1_0226/ArrayList.java | 68 +++ .../src/week1_0226/BinaryTreeNode.java | 37 ++ .../349209948/src/week1_0226/Iterator.java | 6 + .../349209948/src/week1_0226/LinkedList.java | 129 +++++ group01/349209948/src/week1_0226/List.java | 9 + group01/349209948/src/week1_0226/Queue.java | 21 + group01/349209948/src/week1_0226/Stack.java | 29 ++ group01/360176196/.classpath | 9 + group01/360176196/.gitignore | 1 + group01/360176196/.project | 17 + .../org.eclipse.core.resources.prefs | 2 + .../src/xqfGit/dataStructure/ArrayList.java | 73 +++ .../xqfGit/dataStructure/BinaryTreeNode.java | 49 ++ .../src/xqfGit/dataStructure/Iterator.java | 7 + .../src/xqfGit/dataStructure/LinkedList.java | 116 +++++ .../src/xqfGit/dataStructure/List.java | 9 + .../src/xqfGit/dataStructure/Queue.java | 27 ++ .../src/xqfGit/dataStructure/Stack.java | 28 ++ .../dataStructure/conderising/ArrayUtil.java | 179 +++++++ .../conderising/TestArrayUtil.java | 10 + .../litileStruts/LoginAction.java | 39 ++ .../dataStructure/litileStruts/Struts.java | 61 +++ .../litileStruts/StrutsTest.java | 43 ++ .../dataStructure/litileStruts/View.java | 23 + .../dataStructure/litileStruts/struts.xml | 11 + group01/378213871/.classpath | 8 + group01/378213871/.gitignore | 1 + group01/378213871/.project | 17 + .../coderising/week02/array/ArrayUtil.java | 255 ++++++++++ .../week02/array/ArrayUtilTest.java | 90 ++++ .../week02/litestruts/LoginAction.java | 39 ++ .../coderising/week02/litestruts/Struts.java | 110 +++++ .../week02/litestruts/StrutsTest.java | 43 ++ .../coderising/week02/litestruts/View.java | 23 + .../coderising/week02/litestruts/struts.xml | 11 + .../com/coding/basic/week01/ArrayList.java | 74 +++ .../coding/basic/week01/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/week01/Iterator.java | 7 + .../com/coding/basic/week01/LinkedList.java | 129 +++++ .../src/com/coding/basic/week01/List.java | 9 + .../src/com/coding/basic/week01/Queue.java | 24 + .../src/com/coding/basic/week01/Stack.java | 35 ++ group01/496740686/build.gradle | 23 + .../gradle/wrapper/gradle-wrapper.properties | 6 + group01/496740686/gradlew | 160 +++++++ group01/496740686/gradlew.bat | 90 ++++ group01/496740686/settings.gradle | 1 + .../src/main/java/com/camile/App.java | 13 + .../java/com/camile/_1/Impl/MyArraryList.java | 141 ++++++ .../java/com/camile/_1/Impl/MyLinkedList.java | 177 +++++++ .../main/java/com/camile/_1/Impl/MyQueue.java | 68 +++ .../main/java/com/camile/_1/Impl/MyStack.java | 70 +++ .../com/camile/_1/Interface/ArrayList.java | 34 ++ .../camile/_1/Interface/BinaryTreeNode.java | 32 ++ .../com/camile/_1/Interface/Iterator.java | 7 + .../com/camile/_1/Interface/LinkedList.java | 47 ++ .../java/com/camile/_1/Interface/List.java | 9 + .../java/com/camile/_1/Interface/Queue.java | 19 + .../java/com/camile/_1/Interface/Stack.java | 22 + .../main/java/com/camile/_1/ex/MyArrest.java | 75 +++ .../main/java/com/camile/_1/package-info.java | 8 + .../java/com/camile/_2/array/ArrayUtil.java | 100 ++++ .../com/camile/_2/litestruts/LoginAction.java | 39 ++ .../java/com/camile/_2/litestruts/Struts.java | 122 +++++ .../java/com/camile/_2/litestruts/View.java | 23 + .../com/camile/_2/litestruts/bean/Action.java | 34 ++ .../com/camile/_2/litestruts/bean/Result.java | 22 + .../camile/_2/litestruts/bean/Structs.java | 16 + .../_2/litestruts/bean/package-info.java | 8 + .../main/java/com/camile/_2/package-info.java | 8 + .../496740686/src/main/resources/struts.xml | 11 + .../src/test/java/com/camile/AppTest.java | 38 ++ .../test/java/com/camile/_2/StrutsTest.java | 46 ++ .../src/com/xxt/DataStructure/List.java | 9 + .../com/xxt/DataStructure/MyArrayList.java | 99 ++++ .../com/xxt/DataStructure/MyLinkedList.java | 141 ++++++ .../src/com/xxt/DataStructure/MyQueue.java | 88 ++++ .../src/com/xxt/DataStructure/MyStack.java | 52 ++ .../com/xxt/DataStructure/base/ArrayList.java | 36 ++ .../DataStructure/base/BinaryTreeNode.java | 32 ++ .../com/xxt/DataStructure/base/Iterator.java | 7 + .../xxt/DataStructure/base/LinkedList.java | 48 ++ .../src/com/xxt/DataStructure/base/List.java | 12 + .../src/com/xxt/DataStructure/base/Queue.java | 18 + .../src/com/xxt/DataStructure/base/Stack.java | 24 + group01/751425278/.classpath | 8 + group01/751425278/.gitignore | 32 ++ group01/751425278/.project | 17 + .../src/com/sanmubird/array/ArrayUtil.java | 287 +++++++++++ .../basicDataStructure/ArrayList.java | 156 ++++++ .../basicDataStructure/BinaryTreeNode.java | 58 +++ .../basicDataStructure/Iterator.java | 6 + .../basicDataStructure/LinkedList.java | 159 +++++++ .../sanmubird/basicDataStructure/List.java | 9 + .../sanmubird/basicDataStructure/Queue.java | 76 +++ .../sanmubird/basicDataStructure/Stack.java | 50 ++ .../com/sanmubird/litestruts/LoginAction.java | 39 ++ .../src/com/sanmubird/litestruts/Struts.java | 125 +++++ .../com/sanmubird/litestruts/StrutsTest.java | 43 ++ .../src/com/sanmubird/litestruts/View.java | 23 + .../src/com/sanmubird/litestruts/struts.xml | 11 + .../src/zavier/week01/basic/ArrayList.java | 85 ++++ .../zavier/week01/basic/BinaryTreeNode.java | 63 +++ .../src/zavier/week01/basic/Iterator.java | 8 + .../src/zavier/week01/basic/LinkedList.java | 148 ++++++ .../src/zavier/week01/basic/List.java | 13 + .../src/zavier/week01/basic/Queue.java | 25 + .../src/zavier/week01/basic/Stack.java | 33 ++ .../src/zavier/week01/test/AllTests.java | 12 + .../src/zavier/week01/test/ArrayListTest.java | 91 ++++ .../week01/test/BinaryTreeNodeTest.java | 33 ++ .../zavier/week01/test/LinkedListTest.java | 109 +++++ .../src/zavier/week01/test/QueueTest.java | 49 ++ .../src/zavier/week01/test/StackTest.java | 60 +++ .../week02/coderising/array/ArrayUtil.java | 263 ++++++++++ .../coderising/array/ArrayUtilTest.java | 133 ++++++ .../coderising/litestruts/LoginAction.java | 42 ++ .../week02/coderising/litestruts/Struts.java | 117 +++++ .../coderising/litestruts/StrutsTest.java | 42 ++ .../week02/coderising/litestruts/View.java | 26 + .../week02/coderising/litestruts/struts.xml | 11 + .../lvxg2017/src/basic/BinaryTree.java | 41 ++ .../lvxg2017/src/basic/BinaryTreeNode.java | 34 ++ .../lvxg2017/src/basic/MyArrayList.java | 88 ++++ .../lvxg2017/src/basic/MyLinkedList.java | 168 +++++++ .../819048836/lvxg2017/src/basic/Queue.java | 43 ++ .../819048836/lvxg2017/src/basic/Stack.java | 58 +++ .../src/com/coderising/ArrayUtil.java | 226 +++++++++ .../com/coderising/action/LoginAction.java | 36 ++ .../src/com/coderising/action/Struts.java | 102 ++++ .../src/com/coderising/action/StrutsTest.java | 24 + .../src/com/coderising/action/View.java | 23 + .../src/com/coderising/action/struts.xml | 11 + .../code/src/algorithm/ArrayUtil.java | 239 ++++++++++ .../src/algorithm/test/ArrayUtilTest.java | 234 +++++++++ .../src/datastructure/basic/ArrayList.java | 136 ++++++ .../datastructure/basic/BinarySortedTree.java | 61 +++ .../datastructure/basic/BinaryTreeNode.java | 32 ++ .../src/datastructure/basic/Iterator.java | 6 + .../src/datastructure/basic/LinkedList.java | 132 +++++ .../code/src/datastructure/basic/List.java | 10 + .../code/src/datastructure/basic/Queue.java | 68 +++ .../code/src/datastructure/basic/Stack.java | 32 ++ .../exception/EmptyListException.java | 8 + .../exception/EmptyQueueException.java | 7 + .../src/datastructure/test/ArrayListTest.java | 152 ++++++ .../test/BinarySortedTreeTest.java | 60 +++ .../datastructure/test/LinkedListTest.java | 88 ++++ .../src/datastructure/test/QueueTest.java | 108 +++++ .../src/datastructure/test/StackTest.java | 93 ++++ .../src/datastructure/test/TestSuite.java | 13 + .../895457260/code/src/litestruts/Struts.java | 188 ++++++++ .../895457260/code/src/litestruts/View.java | 23 + .../src/litestruts/action/LoginAction.java | 39 ++ .../XmlElementNotFoundException.java | 14 + .../895457260/code/src/litestruts/struts.xml | 11 + .../code/src/litestruts/test/StrutsTest.java | 41 ++ group01/895457260/journal/week1.md | 34 ++ group01/932573198/20170220/.classpath | 7 + group01/932573198/20170220/.gitignore | 1 + group01/932573198/20170220/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/ArrayList.java | 92 ++++ .../src/com/coding/basic/BinaryTree.java | 77 +++ .../src/com/coding/basic/Iterator.java | 6 + .../src/com/coding/basic/LinkedList.java | 144 ++++++ .../20170220/src/com/coding/basic/List.java | 9 + .../20170220/src/com/coding/basic/Queue.java | 28 ++ .../20170220/src/com/coding/basic/Stack.java | 40 ++ .../src/com/coding/test/ArrayListTest.java | 79 +++ .../src/com/coding/test/BinaryTreeTest.java | 29 ++ .../src/com/coding/test/IteratorTest.java | 40 ++ .../src/com/coding/test/LinkedListTest.java | 108 +++++ .../src/com/coding/test/QueueTest.java | 52 ++ .../src/com/coding/test/StackTest.java | 76 +++ group01/932573198/20170227/.classpath | 8 + group01/932573198/20170227/.gitignore | 1 + group01/932573198/20170227/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/array/ArrayUtil.java | 225 +++++++++ .../com/coderising/array/ArrayUtilTest.java | 83 ++++ .../coderising/litestruts/LoginAction.java | 48 ++ .../src/com/coderising/litestruts/Struts.java | 175 +++++++ .../com/coderising/litestruts/StrutsTest.java | 38 ++ .../src/com/coderising/litestruts/View.java | 29 ++ .../src/com/coderising/litestruts/struts.xml | 11 + group01/954958168/954958168.md | 0 .../class01/BasicDataStructure/.gitignore | 28 ++ .../class01/BasicDataStructure/pom.xml | 24 + .../com/aaront/exercise/basic/ArrayList.java | 90 ++++ .../com/aaront/exercise/basic/BinaryTree.java | 235 +++++++++ .../com/aaront/exercise/basic/Iterator.java | 9 + .../com/aaront/exercise/basic/LinkedList.java | 129 +++++ .../java/com/aaront/exercise/basic/List.java | 9 + .../java/com/aaront/exercise/basic/Queue.java | 26 + .../java/com/aaront/exercise/basic/Stack.java | 29 ++ .../exercise/generic/GenericArrayList.java | 98 ++++ .../exercise/generic/GenericBinaryTree.java | 255 ++++++++++ .../exercise/generic/GenericIterator.java | 9 + .../exercise/generic/GenericLinkedList.java | 140 ++++++ .../aaront/exercise/generic/GenericList.java | 9 + .../aaront/exercise/generic/GenericQueue.java | 30 ++ .../aaront/exercise/generic/GenericStack.java | 33 ++ .../com/aaront/execrise/basic/AllTest.java | 19 + .../aaront/execrise/basic/ArrayListTest.java | 69 +++ .../aaront/execrise/basic/BinaryTreeTest.java | 94 ++++ .../aaront/execrise/basic/LinkListTest.java | 81 ++++ .../com/aaront/execrise/basic/QueueTest.java | 33 ++ .../com/aaront/execrise/basic/StackTest.java | 46 ++ .../execrise/generic/GenericAllTest.java | 19 + .../generic/GenericArrayListTest.java | 76 +++ .../generic/GenericBinaryTreeTest.java | 75 +++ .../generic/GenericLinkedListTest.java | 90 ++++ .../execrise/generic/GenericQueueTest.java | 33 ++ .../execrise/generic/GenericStackTest.java | 46 ++ group01/954958168/class02/ArrayUtil/pom.xml | 24 + .../java/com/aaront/exercise/ArrayUtil.java | 240 ++++++++++ .../com/aaront/execrise/ArrayUtilTest.java | 71 +++ group01/954958168/class02/LiteStruts/pom.xml | 34 ++ .../java/com/aaront/exercise/LiteStruts.java | 122 +++++ .../java/com/aaront/exercise/LoginAction.java | 39 ++ .../main/java/com/aaront/exercise/View.java | 26 + .../java/com/aaront/exercise/pojo/Action.java | 38 ++ .../java/com/aaront/exercise/pojo/Result.java | 26 + .../com/aaront/exercise/pojo/Structs.java | 20 + .../LiteStruts/src/main/resources/struts.xml | 11 + .../java/com/aaront/exercise/StrutsTest.java | 48 ++ group01/group01.md | 1 + .../Ven13/coding2017/array/ArrayUtil.java | 301 ++++++++++++ .../coding2017/array/test/ArrayUtilTest.java | 46 ++ .../Ven13/coding2017/basic/ArrayList.java | 97 ++++ .../coding2017/basic/BinaryTreeNode.java | 32 ++ .../Ven13/coding2017/basic/Iterator.java | 7 + .../Ven13/coding2017/basic/LinkedList.java | 173 +++++++ .../github/Ven13/coding2017/basic/List.java | 11 + .../github/Ven13/coding2017/basic/Queue.java | 30 ++ .../github/Ven13/coding2017/basic/Stack.java | 30 ++ .../coding2017/basic/test/ArrayListTest.java | 11 + .../coding2017/basic/test/LinkedListTest.java | 100 ++++ .../Ven13/coding2017/basic/test/ListTest.java | 129 +++++ .../coding2017/basic/test/QueueTest.java | 36 ++ .../coding2017/basic/test/StackTest.java | 40 ++ .../coding2017/litestruts/LoginAction.java | 42 ++ .../Ven13/coding2017/litestruts/Struts.java | 166 +++++++ .../coding2017/litestruts/StrutsTest.java | 43 ++ .../Ven13/coding2017/litestruts/View.java | 23 + .../Ven13/coding2017/litestruts/struts.xml | 11 + .../106614649/106614649Learnin/src/struts.xml | 0 .../FelixCJF/coding2017/basic/ArrayList.java | 105 ++++ .../coding2017/basic/BinaryTreeNode.java | 32 ++ .../FelixCJF/coding2017/basic/Iterator.java | 8 + .../FelixCJF/coding2017/basic/LinkedList.java | 214 +++++++++ .../FelixCJF/coding2017/basic/List.java | 11 + .../FelixCJF/coding2017/basic/Queue.java | 53 +++ .../FelixCJF/coding2017/basic/Stack.java | 34 ++ .../coding2017/basic/test/ArrayListTest.java | 14 + .../coding2017/basic/test/LinkedListTest.java | 100 ++++ .../coding2017/basic/test/ListTest.java | 124 +++++ .../coding2017/basic/test/QueueTest.java | 34 ++ .../coding2017/basic/test/StackTest.java | 41 ++ .../coderising/array/ArrayUtil.java | 228 +++++++++ .../coderising/array/test/ArrayUtilTest.java | 148 ++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../coderising/litestruts/Struts.java | 34 ++ .../coderising/litestruts/StrutsTest.java | 43 ++ .../coderising/litestruts/View.java | 23 + .../coderising/litestruts/struts.xml | 11 + .../coding2017/basic/MyArrayList.java | 83 ++++ .../coding2017/basic/MyLinkedList.java | 119 +++++ .../lhpmatlab/coding2017/basic/MyQueue.java | 29 ++ .../lhpmatlab/coding2017/basic/MyStack.java | 30 ++ .../coding2017/basic/MyArrayListTest.java | 113 +++++ .../coding2017/basic/MyLinkedListTest.java | 121 +++++ .../coding2017/basic/MyQueueTest.java | 71 +++ .../coding2017/basic/MyStackTest.java | 104 ++++ group02/527705641/.gitignore | 1 + .../coderising0226/array/ArrayUtil.java | 218 +++++++++ .../coderising0226/array/ArrayUtilTest.java | 153 ++++++ .../litestruts/LoginAction.java | 39 ++ .../coderising0226/litestruts/Struts.java | 137 ++++++ .../coderising0226/litestruts/StrutsTest.java | 43 ++ .../coderising0226/litestruts/View.java | 23 + .../coderising0226/litestruts/struts.xml | 11 + .../fei9009/coding2017/basic/ArrayList.java | 71 +++ .../coding2017/basic/ArrayListTest.java | 55 +++ .../coding2017/basic/BinaryTreeNode.java | 57 +++ .../fei9009/coding2017/basic/Iterator.java | 7 + .../fei9009/coding2017/basic/LinkedList.java | 91 ++++ .../coding2017/basic/LinkedListTest.java | 92 ++++ .../github/fei9009/coding2017/basic/List.java | 9 + .../fei9009/coding2017/basic/Queue.java | 21 + .../fei9009/coding2017/basic/QueueTest.java | 35 ++ .../fei9009/coding2017/basic/Stack.java | 26 + .../fei9009/coding2017/basic/StackTest.java | 37 ++ .../coding2017/litestructs/struts.xml | 11 + .../orajavac/coding2017/array/ArrayUtil.java | 234 +++++++++ .../orajavac/coding2017/basic/ArrayList.java | 101 ++++ .../coding2017/basic/BinaryTreeNode.java | 32 ++ .../orajavac/coding2017/basic/Iterator.java | 7 + .../orajavac/coding2017/basic/LinkedList.java | 110 +++++ .../orajavac/coding2017/basic/List.java | 9 + .../orajavac/coding2017/basic/Queue.java | 34 ++ .../orajavac/coding2017/basic/Stack.java | 49 ++ .../coding2017/litestructs/LoginAction.java | 43 ++ .../coding2017/litestructs/Struts.java | 99 ++++ .../coding2017/litestructs/StrutsTest.java | 43 ++ .../coding2017/litestructs/StrutsXml.java | 28 ++ .../orajavac/coding2017/litestructs/View.java | 23 + .../coding2017/litestructs/struts.xml | 11 + group02/609990377/DataStructure/.gitignore | 3 + .../coding2017/basic/ArrayUtil.java | 294 ++++++++++++ .../coding2017/basic/WArrayList.java | 113 +++++ .../coding2017/basic/WBinaryTreeNode.java | 78 +++ .../coding2017/basic/WIterator.java | 8 + .../coding2017/basic/WLinkedList.java | 182 +++++++ .../coding2017/basic/WList.java | 9 + .../coding2017/basic/WQueue.java | 34 ++ .../coding2017/basic/WStack.java | 32 ++ .../coding2017/basicTest/ArrayUtilTest.java | 140 ++++++ .../coding2017/basicTest/TestRunner.java | 41 ++ .../coding2017/basicTest/WArrayListTest.java | 115 +++++ .../basicTest/WBinaryTreeNodeTest.java | 69 +++ .../coding2017/basicTest/WLinkedListTest.java | 143 ++++++ .../coding2017/basicTest/WQueueTest.java | 76 +++ .../coding2017/basicTest/WStackTest.java | 75 +++ .../coding2017/basicTest/testCase.java | 21 + group02/609990377/LiteStruts/.gitignore | 3 + .../coding2017/litestruts/LoginAction.java | 42 ++ .../coding2017/litestruts/Struts.java | 120 +++++ .../coding2017/litestruts/StrutsTest.java | 43 ++ .../coding2017/litestruts/View.java | 23 + .../coding2017/litestruts/struts.xml | 11 + group02/609990377/LiteStruts/src/struts.xml | 11 + group02/727171008/.gitignore | 19 + .../HarryHook/coding2017/array/ArrayUtil.java | 345 ++++++++++++++ .../coding2017/array/ArrayUtilTest.java | 153 ++++++ .../coding2017/basic/ArrayListTest.java | 15 + .../coding2017/basic/BinaryTreeNode.java | 121 +++++ .../coding2017/basic/BinaryTreeNodeTest.java | 40 ++ .../HarryHook/coding2017/basic/Iterator.java | 7 + .../coding2017/basic/LinkedListTest.java | 93 ++++ .../HarryHook/coding2017/basic/List.java | 14 + .../HarryHook/coding2017/basic/ListTest.java | 122 +++++ .../coding2017/basic/MyArrayList.java | 167 +++++++ .../coding2017/basic/MyLinkedList.java | 219 +++++++++ .../HarryHook/coding2017/basic/MyQueue.java | 54 +++ .../HarryHook/coding2017/basic/MyStack.java | 59 +++ .../HarryHook/coding2017/basic/QueueTest.java | 33 ++ .../HarryHook/coding2017/basic/StackTest.java | 40 ++ .../coding2017/litestruts/LoginAction.java | 45 ++ .../coding2017/litestruts/Struts.java | 109 +++++ .../coding2017/litestruts/StrutsTest.java | 57 +++ .../HarryHook/coding2017/litestruts/View.java | 31 ++ .../coding2017/litestruts/struts.xml | 11 + .../coding2017/basic/Iterator.java | 7 + .../ZhoufeifeiJAVA/coding2017/basic/List.java | 9 + .../coding2017/basic/MyArrayList.java | 78 +++ .../coding2017/basic/MyArrayListTest.java | 34 ++ .../coding2017/basic/MyLinkedList.java | 127 +++++ .../coding2017/basic/MyLinkedListTest.java | 34 ++ .../coding2017/basic/Queue.java | 26 + .../coding2017/basic/QueueTest.java | 17 + .../coding2017/basic/Stack.java | 28 ++ .../coding2017/basic/StackTest.java | 17 + group02/812350401/.gitignore | 3 + .../coding2017/basic/ArrayList.java | 78 +++ .../coding2017/basic/BinaryTreeNode.java | 55 +++ .../miniyk2012/coding2017/basic/Iterator.java | 6 + .../coding2017/basic/IteratorImp.java | 24 + .../coding2017/basic/LinkedList.java | 103 ++++ .../miniyk2012/coding2017/basic/List.java | 10 + .../miniyk2012/coding2017/basic/Queue.java | 23 + .../miniyk2012/coding2017/basic/Stack.java | 25 + .../coding2017/basic/test/ArrayListTest.java | 14 + .../basic/test/BinaryTreeNodeTest.java | 70 +++ .../coding2017/basic/test/LinkedListTest.java | 93 ++++ .../coding2017/basic/test/ListTest.java | 117 +++++ .../coding2017/basic/test/QueueTest.java | 33 ++ .../coding2017/basic/test/StackTest.java | 40 ++ .../coderising/array/ArrayUtil.java | 279 +++++++++++ .../coderising/array/test/ArrayUtilTest.java | 156 ++++++ .../coderising/litestruts/LoginAction.java | 48 ++ .../coderising/litestruts/LogoutAction.java | 48 ++ .../coderising/litestruts/Struts.java | 173 +++++++ .../coderising/litestruts/StrutsTest.java | 75 +++ .../coderising/litestruts/View.java | 27 ++ .../coderising/litestruts/struts.xml | 11 + group02/851113375/.gitignore | 3 + .../coding2017/array/ArrayUtil.java | 228 +++++++++ .../coding2017/array/test/ArrayUtilTest.java | 142 ++++++ .../coding2017/basic/ArrayList.java | 91 ++++ .../coding2017/basic/BinaryTreeNode.java | 72 +++ .../eloiseSJTU/coding2017/basic/Iterator.java | 6 + .../coding2017/basic/LinkedList.java | 170 +++++++ .../eloiseSJTU/coding2017/basic/List.java | 15 + .../eloiseSJTU/coding2017/basic/Queue.java | 28 ++ .../eloiseSJTU/coding2017/basic/Stack.java | 31 ++ .../coding2017/basic/test/ArrayListTest.java | 15 + .../basic/test/BinaryTreeNodeTest.java | 34 ++ .../coding2017/basic/test/LinkedListTest.java | 93 ++++ .../coding2017/basic/test/ListTest.java | 120 +++++ .../coding2017/basic/test/QueueTest.java | 33 ++ .../coding2017/basic/test/StackTest.java | 40 ++ .../coding2017/litestruts/LoginAction.java | 46 ++ .../coding2017/litestruts/Struts.java | 81 ++++ .../coding2017/litestruts/View.java | 26 + .../coding2017/litestruts/struts.xml | 11 + .../litestruts/test/StrutsTest.java | 41 ++ .../coding2017/array/ArrayUtil.java | 296 ++++++++++++ .../coding2017/array/ArrayUtilTest.java | 142 ++++++ .../coding2017/basic/ArrayList.java | 86 ++++ .../coding2017/basic/ArrayListTest.java | 69 +++ .../lqingchenl/coding2017/basic/Iterator.java | 7 + .../coding2017/basic/LinkedList.java | 118 +++++ .../coding2017/basic/LinkedListTest.java | 125 +++++ .../lqingchenl/coding2017/basic/List.java | 9 + .../lqingchenl/coding2017/basic/Queue.java | 28 ++ .../coding2017/basic/QueueTest.java | 57 +++ .../lqingchenl/coding2017/basic/Stack.java | 33 ++ .../coding2017/basic/StackTest.java | 64 +++ .../coding2017/litestruts/LoginAction.java | 44 ++ .../coding2017/litestruts/Struts.java | 74 +++ .../coding2017/litestruts/StrutsTest.java | 40 ++ .../coding2017/litestruts/View.java | 26 + .../coding2017/litestruts/struts.xml | 11 + group02/group02.md | 1 + .../src/ArrayList.java" | 102 ++++ .../src/BinaryTree.java" | 66 +++ .../src/BinaryTreeNode.java" | 42 ++ .../src/Iterator.java" | 7 + .../src/LinkedList.java" | 152 ++++++ .../src/List.java" | 13 + .../src/Queue.java" | 23 + .../src/Stack.java" | 36 ++ .../test/ArrayListTest.java" | 81 ++++ .../test/BinaryTreeTest.java" | 24 + .../test/LinkedListTest.java" | 122 +++++ .../test/QueueTest.java" | 34 ++ .../test/StackTest.java" | 52 ++ .../src/ArrayUtil.java" | 203 ++++++++ .../src/liteStructs/LoginAction.java" | 38 ++ .../src/liteStructs/Struts.java" | 161 +++++++ .../src/liteStructs/StrutsTest.java" | 42 ++ .../src/liteStructs/View.java" | 22 + .../src/liteStructs/struts.xml" | 11 + .../test/ArrayUtilTest.java" | 81 ++++ group03/1196051822/readme.md | 5 + group03/1360464792/.gitignore | 34 ++ group03/1360464792/pom.xml | 49 ++ .../coderising/array/ArrayUtil.java | 230 +++++++++ .../coderising/liteststruts/LoginAction.java | 39 ++ .../coderising/liteststruts/LogoutAction.java | 39 ++ .../coderising/liteststruts/Struts.java | 106 +++++ .../coderising/liteststruts/StrutsAction.java | 127 +++++ .../coderising/liteststruts/View.java | 23 + .../coding2017/coding/basic/ArrayList.java | 142 ++++++ .../coding2017/coding/basic/BinaryTree.java | 93 ++++ .../coding/basic/BinaryTreeNode.java | 40 ++ .../coding2017/coding/basic/Iterator.java | 8 + .../coding2017/coding/basic/LinkedList.java | 156 ++++++ .../study/coding2017/coding/basic/List.java | 9 + .../study/coding2017/coding/basic/Queue.java | 21 + .../study/coding2017/coding/basic/Stack.java | 24 + .../1360464792/src/main/resources/struts.xml | 11 + .../coderising/array/ArrayUtilTest.java | 91 ++++ .../coderising/liteststruts/StrutsTest.java | 47 ++ .../coding/basic/ArrayListTest.java | 80 ++++ .../coding/basic/BinaryTreeTest.java | 32 ++ .../coding/basic/LinkedListTest.java | 138 ++++++ .../coding2017/coding/basic/QueueTest.java | 37 ++ .../coding2017/coding/basic/StackTest.java | 52 ++ group03/172487938/Iterator.java | 7 + group03/172487938/MyArrayList.java | 186 ++++++++ group03/172487938/MyLinkedList.java | 274 +++++++++++ group03/172487938/MyList.java | 27 ++ group03/172487938/Queue.java | 32 ++ group03/172487938/Stack.java | 37 ++ group03/172487938/TestMyArrayList.java | 36 ++ group03/172487938/TestMyLinkedList.java | 19 + group03/1753176091/bin/.gitignore | 1 + .../src/com/coding/basic/ArrayList.java | 56 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/FileUtil.java | 68 +++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 120 +++++ .../1753176091/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 25 + .../src/com/coding/basic/Stack.java | 28 ++ group03/2864885311/DS/.classpath | 8 + group03/2864885311/DS/.gitignore | 1 + group03/2864885311/DS/.project | 17 + .../DS/.settings/org.eclipse.jdt.core.prefs | 11 + .../DS/src/com/coding/basic/ArrayList.java | 68 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../DS/src/com/coding/basic/Iterator.java | 7 + .../DS/src/com/coding/basic/LinkedList.java | 46 ++ .../DS/src/com/coding/basic/List.java | 10 + .../DS/src/com/coding/basic/Queue.java | 19 + .../DS/src/com/coding/basic/Stack.java | 22 + .../src/com/coding/basic/ArrayList.java | 91 ++++ .../src/com/coding/basic/BinaryTree.java | 132 +++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 129 +++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 42 ++ .../src/com/coding/basic/Stack.java | 51 ++ .../src/com/coding/test/ArrayListTest.java | 48 ++ .../src/com/coding/test/BinaryTreeTest.java | 25 + .../src/com/coding/test/LinkedListTest.java | 44 ++ .../src/com/coding/test/QueueTest.java | 23 + .../src/com/coding/test/StackTest.java | 24 + group03/345943980/lite-struts-0226/pom.xml | 50 ++ .../java/com/coderising/array/ArrayUtil.java | 258 ++++++++++ .../coderising/litestruts/LoginAction.java | 42 ++ .../com/coderising/litestruts/Struts.java | 139 ++++++ .../java/com/coderising/litestruts/View.java | 27 ++ .../src/main/resources/struts.xml | 11 + .../coderising/litestruts/ArrayUtilTest.java | 79 +++ .../com/coderising/litestruts/StrutsTest.java | 38 ++ group03/510782645/.gitignore | 46 ++ .../src/com/coding/basic/ArrayList.java | 152 ++++++ .../src/com/coding/basic/BinaryTreeNode.java | 83 ++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 202 ++++++++ .../510782645/src/com/coding/basic/List.java | 9 + .../510782645/src/com/coding/basic/Queue.java | 100 ++++ .../510782645/src/com/coding/basic/Stack.java | 39 ++ group03/569045298/pom.xml | 45 ++ .../main/com/coderising/array/ArrayUtil.java | 175 +++++++ .../coderising/litestruts/LoginAction.java | 47 ++ .../coderising/litestruts/LogoutAction.java | 11 + .../com/coderising/litestruts/Struts.java | 156 ++++++ .../litestruts/StrutsBean/Action.java | 40 ++ .../litestruts/StrutsBean/Result.java | 29 ++ .../main/com/coderising/litestruts/View.java | 28 ++ .../main/com/coderising/litestruts/struts.xml | 14 + .../coding/basic/datastructure/ArrayList.java | 102 ++++ .../basic/datastructure/BinaryTreeNode.java | 41 ++ .../coding/basic/datastructure/Iterator.java | 13 + .../basic/datastructure/LinkedList.java | 174 +++++++ .../com/coding/basic/datastructure/List.java | 17 + .../com/coding/basic/datastructure/Queue.java | 43 ++ .../com/coding/basic/datastructure/Stack.java | 47 ++ .../test/coderising/array/ArrayUtilTest.java | 86 ++++ .../coderising/litestruts/StrutsTest.java | 46 ++ .../datastructure/TestDataStructure.java | 66 +++ group03/58555264/pom.xml | 32 ++ .../java/com/circle/algorithm/ArrayUtil.java | 151 ++++++ .../java/com/circle/algorithm/Reverse.java | 30 ++ .../main/java/com/circle/algorithm/Sum.java | 66 +++ .../java/com/circle/collection/ArrayList.java | 168 +++++++ .../com/circle/collection/BinaryTree.java | 280 +++++++++++ .../java/com/circle/collection/Iterator.java | 11 + .../com/circle/collection/LinkedList.java | 218 +++++++++ .../main/java/com/circle/collection/List.java | 17 + .../java/com/circle/collection/Queue.java | 25 + .../java/com/circle/collection/Stack.java | 58 +++ .../java/com/circle/struts/ActionEntity.java | 59 +++ .../java/com/circle/struts/LoginAction.java | 39 ++ .../main/java/com/circle/struts/Struts.java | 233 +++++++++ .../src/main/java/com/circle/struts/View.java | 44 ++ .../main/java/com/circle/struts/XmlUtil.java | 43 ++ .../com/circle/algorithm/ArrayUtilTest.java | 57 +++ .../com/circle/collection/ArrayListTest.java | 80 ++++ .../com/circle/collection/BinaryTreeTest.java | 74 +++ .../com/circle/collection/LinkedListTest.java | 160 +++++++ .../java/com/circle/collection/QueueTest.java | 49 ++ .../java/com/circle/collection/StackTest.java | 63 +++ .../java/com/circle/struts/StrutsTest.java | 51 ++ group03/617187912/Learning02/.classpath | 12 + group03/617187912/Learning02/.gitignore | 1 + group03/617187912/Learning02/.project | 17 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/array/ArrayUtil.java | 197 ++++++++ .../com/coderising/array/ArrayUtilTest.java | 85 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 119 +++++ .../com/coderising/litestruts/StrutsTest.java | 49 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 117 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 33 ++ .../src/com/coding/basic/Iterator.java | 8 + .../src/com/coding/basic/LinkedList.java | 137 ++++++ .../Learning02/src/com/coding/basic/List.java | 10 + .../src/com/coding/basic/Queue.java | 33 ++ .../src/com/coding/basic/Stack.java | 48 ++ group03/617187912/Learning201702/.classpath | 6 + group03/617187912/Learning201702/.gitignore | 1 + group03/617187912/Learning201702/.project | 17 + .../org.eclipse.core.resources.prefs | 2 + .../src/com/coding/basic/ArrayList.java | 47 ++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 46 ++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 19 + .../src/com/coding/basic/Stack.java | 22 + group03/619224754/.classpath | 9 + group03/619224754/.gitignore | 1 + group03/619224754/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + group03/619224754/src/Main/Main.java | 5 + .../src/com/coderising/array/ArrayUtil.java | 202 ++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../coderising/litestruts/LogoutAction.java | 5 + .../src/com/coderising/litestruts/Struts.java | 88 ++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 75 +++ .../src/com/coding/basic/BinaryTreeNode.java | 80 ++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 182 +++++++ .../619224754/src/com/coding/basic/List.java | 9 + .../619224754/src/com/coding/basic/Queue.java | 23 + .../619224754/src/com/coding/basic/Stack.java | 25 + group03/619224754/src/test/ArrayListTest.java | 62 +++ .../src/test/BinaryTreeNodeTest.java | 25 + .../619224754/src/test/LinkedListTest.java | 103 ++++ group03/664269713/DataStructure/.gitignore | 3 + .../src/com/ace/coding/ArrayList.java | 101 ++++ .../src/com/ace/coding/BinaryTreeNode.java | 61 +++ .../src/com/ace/coding/Iterator.java | 7 + .../src/com/ace/coding/LinkedList.java | 123 +++++ .../src/com/ace/coding/List.java | 9 + .../src/com/ace/coding/Queue.java | 27 ++ .../src/com/ace/coding/Stack.java | 36 ++ .../src/com/ace/homework2/ArrayUtil.java | 223 +++++++++ .../src/com/ace/homework2/ArrayUtilTest.java | 29 ++ .../src/com/ace/homework2/LoginAction.java | 34 ++ .../src/com/ace/homework2/Struts.java | 208 ++++++++ .../src/com/ace/homework2/StrutsObj.java | 29 ++ .../src/com/ace/homework2/View.java | 23 + .../src/com/ace/homework2/struts.xml | 11 + group03/763878069/.classpath | 6 + group03/763878069/.gitignore | 1 + group03/763878069/.project | 17 + .../src/cmj/datastructure/list/ArrayList.java | 154 ++++++ .../cmj/datastructure/list/LinkedList.java | 208 ++++++++ .../src/cmj/datastructure/list/List.java | 13 + .../src/cmj/datastructure/list/Queue.java | 128 +++++ .../src/cmj/datastructure/list/Stack.java | 58 +++ .../src/cmj/datastructure/tree/BSTree.java | 191 ++++++++ .../cmj/datastructure/tree/BinaryTree.java | 185 ++++++++ group03/894844916/coding2017-01/.classpath | 6 + group03/894844916/coding2017-01/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/ArrayList.java | 149 ++++++ .../src/com/coding/basic/BinaryTreeNode.java | 67 +++ .../src/com/coding/basic/Iterator.java | 22 + .../src/com/coding/basic/LinkedList.java | 168 +++++++ .../src/com/coding/basic/List.java | 54 +++ .../com/coding/basic/ListIndexException.java | 21 + .../src/com/coding/basic/Queue.java | 36 ++ .../src/com/coding/basic/Stack.java | 43 ++ group03/894844916/coding2017-02/pom.xml | 45 ++ .../java/com/coderising/array/ArrayUntil.java | 256 ++++++++++ .../coderising/litestruts/LoginAction.java | 42 ++ .../com/coderising/litestruts/Struts.java | 118 +++++ .../java/com/coderising/litestruts/View.java | 29 ++ .../src/main/resources/struts.xml | 11 + .../com/coderising/array/ArrayUntilTest.java | 124 +++++ .../com/coderising/litestruts/StrutsTest.java | 41 ++ group03/group03.md | 1 + .../1020483199/1020483199Learning/.classpath | 7 + .../1020483199/1020483199Learning/.gitignore | 1 + .../1020483199/1020483199Learning/.project | 17 + .../org.eclipse.core.resources.prefs | 3 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/ArrayList.java | 128 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 82 ++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 175 +++++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 40 ++ .../src/com/coding/basic/Stack.java | 38 ++ .../src/com/coding/test/JavaTest.java | 223 +++++++++ .../RemoteSystemsTempFiles/.project | 12 + group04/1020483199/SecondHomeWork/.classpath | 7 + group04/1020483199/SecondHomeWork/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../bin/com/basic/litestruts/struts.xml | 21 + .../src/com/basic/coding/ArrayUtil.java | 282 +++++++++++ .../src/com/basic/litestruts/LoginAction.java | 75 +++ .../src/com/basic/litestruts/Struts.java | 155 ++++++ .../src/com/basic/litestruts/StrutsTest.java | 63 +++ .../src/com/basic/litestruts/View.java | 37 ++ .../src/com/basic/litestruts/struts.xml | 21 + .../src/com/basic/test/JavaTest.java | 95 ++++ group04/120549547/base/buil.bat | 5 + .../base/src/com/coding/basic/ArrayList.java | 93 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../base/src/com/coding/basic/Iterator.java | 7 + .../base/src/com/coding/basic/LinkedList.java | 127 +++++ .../base/src/com/coding/basic/List.java | 10 + .../base/src/com/coding/basic/Main.java | 85 ++++ .../base/src/com/coding/basic/Queue.java | 29 ++ .../base/src/com/coding/basic/Stack.java | 37 ++ group04/120549547/my.txt | 1 + group04/120549547/shell.sh | 18 + .../src/com/coderising/array/ArrayUtil.java | 276 +++++++++++ .../src/com/coderising/litestruts/Struts.java | 180 +++++++ .../src/com/coding/basic/ArrayList.java | 125 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 73 +++ .../src/com/coding/basic/LinkedList.java | 211 ++++++++ .../src/com/coding/basic/Queue.java | 29 ++ .../src/com/coding/basic/Stack.java | 34 ++ group04/1751801281/.classpath | 8 + group04/1751801281/.gitignore | 1 + group04/1751801281/.project | 17 + .../src/com/coding/basic/ArrayList.java | 100 ++++ .../src/com/coding/basic/Iterator.java | 6 + .../src/com/coding/basic/LinkedList.java | 133 ++++++ .../1751801281/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 27 ++ .../src/com/coding/basic/Stack.java | 29 ++ .../test/com/coding/basic/ArrayListTest.java | 30 ++ .../test/com/coding/basic/LinkedListTeat.java | 29 ++ .../test/com/coding/basic/QueueTest.java | 16 + .../test/com/coding/basic/StackTest.java | 19 + group04/1796244932/.gitignore | 138 ++++++ group04/1796244932/learn01/.gitignore | 6 + group04/1796244932/learn01/pom.xml | 53 +++ .../com/dudy/learn01/base/MyArrayList.java | 124 +++++ .../com/dudy/learn01/base/MyArrayUtil.java | 194 ++++++++ .../com/dudy/learn01/base/MyBinaryTree.java | 71 +++ .../com/dudy/learn01/base/MyIterator.java | 6 + .../com/dudy/learn01/base/MyLinkedList.java | 132 +++++ .../java/com/dudy/learn01/base/MyList.java | 8 + .../java/com/dudy/learn01/base/MyQueue.java | 22 + .../java/com/dudy/learn01/base/MyStack.java | 26 + .../litestruts/ActionPojoParseXML.java | 58 +++ .../dudy/learn01/litestruts/LoginAction.java | 48 ++ .../com/dudy/learn01/litestruts/Struts.java | 147 ++++++ .../com/dudy/learn01/litestruts/View.java | 31 ++ .../com/dudy/learn01/utils/StringUtils.java | 174 +++++++ .../learn01/src/main/resource/struts.xml | 11 + .../dudy/learn01/base/MyArrayListTest.java | 59 +++ .../dudy/learn01/base/MyArrayUtilTest.java | 99 ++++ .../dudy/learn01/base/MyBinaryTreeTest.java | 42 ++ .../dudy/learn01/base/MyLinkedListTest.java | 88 ++++ .../com/dudy/learn01/base/MyQueueTest.java | 27 ++ .../com/dudy/learn01/base/MyStackTest.java | 58 +++ .../dudy/learn01/litestruts/StrutsTest.java | 42 ++ group04/1906242834/.classpath | 7 + group04/1906242834/.gitignore | 1 + group04/1906242834/.project | 17 + .../src/com/coderising/array/ArrayUtil.java | 327 +++++++++++++ .../com/coderising/array/ArrayUtilTest.java | 14 + .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 36 ++ .../com/coderising/litestruts/StrutsTest.java | 47 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 14 + .../src/com/coding/basic/ArrayList.java | 72 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 141 ++++++ .../1906242834/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 49 ++ .../src/com/coding/basic/Stack.java | 35 ++ group04/1972376180/.classpath | 8 + group04/1972376180/.gitignore | 1 + group04/1972376180/.project | 17 + .../src/tong/java/one/MyArrayList.java | 76 +++ .../src/tong/java/one/MyLinkedList.java | 127 +++++ .../1972376180/src/tong/java/one/MyQueue.java | 34 ++ .../1972376180/src/tong/java/one/MyStack.java | 38 ++ .../src/tong/java/two/ArrayUtil.java | 236 +++++++++ .../src/tong/java/two/ArrayUtilTest.java | 96 ++++ .../src/tong/java/two/struts/Action.java | 34 ++ .../src/tong/java/two/struts/LoginAction.java | 39 ++ .../src/tong/java/two/struts/Result.java | 23 + .../src/tong/java/two/struts/Root.java | 17 + .../src/tong/java/two/struts/Struts.java | 120 +++++ .../src/tong/java/two/struts/StrutsTest.java | 43 ++ .../src/tong/java/two/struts/View.java | 23 + .../src/tong/java/two/struts/struts.xml | 12 + group04/2082945465/.gitignore | 138 ++++++ group04/2082945465/week01/src/Hello.java | 7 + .../2082945465/week01/src/MyArrayList.java | 79 +++ group04/2082945465/week01/src/MyIterator.java | 9 + .../2082945465/week01/src/MyLinkedList.java | 111 +++++ group04/2082945465/week01/src/MyList.java | 12 + group04/2082945465/week01/src/MyQueue.java | 20 + group04/2082945465/week01/src/MyStack.java | 26 + group04/24658892/.classpath | 6 + group04/24658892/.gitignore | 1 + group04/24658892/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../3.1/taskArtifacts/cache.properties | 1 + .../3.1/taskArtifacts/cache.properties.lock | Bin 0 -> 17 bytes .../.gradle/3.1/taskArtifacts/fileHashes.bin | Bin 0 -> 18697 bytes .../3.1/taskArtifacts/fileSnapshots.bin | Bin 0 -> 19123 bytes .../3.1/taskArtifacts/taskArtifacts.bin | Bin 0 -> 19481 bytes group04/24658892/learnjava/build.gradle | 14 + .../gradle/wrapper/gradle-wrapper.properties | 6 + group04/24658892/learnjava/gradlew | 169 +++++++ group04/24658892/learnjava/gradlew.bat | 84 ++++ group04/24658892/learnjava/settings.gradle | 2 + .../main/java/com/coding/array/ArrayUtil.java | 93 ++++ .../main/java/com/coding/basic/ArrayList.java | 77 +++ .../java/com/coding/basic/BinaryTreeNode.java | 32 ++ .../main/java/com/coding/basic/Iterator.java | 7 + .../java/com/coding/basic/LinkedList.java | 119 +++++ .../src/main/java/com/coding/basic/List.java | 9 + .../src/main/java/com/coding/basic/Queue.java | 30 ++ .../src/main/java/com/coding/basic/Stack.java | 36 ++ .../java/com/coding/litestruts/Action.java | 42 ++ .../java/com/coding/litestruts/Result.java | 28 ++ .../java/com/coding/litestruts/Struts.java | 130 +++++ .../main/java/com/coding/litestruts/View.java | 27 ++ .../coding/litestruts/action/LoginAction.java | 39 ++ .../learnjava/src/main/resources/struts.xml | 11 + .../java/com/coding/array/ArrayUtilTest.java | 24 + .../java/com/coding/basic/ArrayListTest.java | 114 +++++ .../java/com/coding/basic/LinkedListTest.java | 84 ++++ .../com/coding/litestruts/StrutsTest.java | 38 ++ .../learnjava/src/test/resources/struts.xml | 11 + group04/274407594/226/.classpath | 6 + group04/274407594/226/.gitignore | 1 + group04/274407594/226/.project | 17 + .../226/.settings/org.eclipse.jdt.core.prefs | 11 + ...64\347\232\204\345\205\263\347\263\273.md" | 29 ++ group04/312816708/coding/coding01/.gitignore | 7 + group04/312816708/coding/coding01/pom.xml | 12 + .../com/kevin/coding01/basic/MyArrayList.java | 117 +++++ .../kevin/coding01/basic/MyLinkedList.java | 135 ++++++ .../java/com/kevin/coding01/basic/MyList.java | 17 + .../com/kevin/coding01/basic/MyQueue.java | 35 ++ .../com/kevin/coding01/basic/MyStack.java | 67 +++ group04/312816708/coding/coding02/pom.xml | 20 + .../com/kevin/coding02/array/ArrayUtil.java | 149 ++++++ .../kevin/coding02/array/ArrayUtilTest.java | 52 ++ .../coding02/litestruts/LoginAction.java | 41 ++ .../com/kevin/coding02/litestruts/Struts.java | 95 ++++ .../kevin/coding02/litestruts/StrutsTest.java | 38 ++ .../com/kevin/coding02/litestruts/View.java | 23 + .../com/kevin/coding02/litestruts/struts.xml | 7 + .../com/kevin/coding02/model/ActionModel.java | 36 ++ .../com/kevin/coding02/model/ResultModel.java | 25 + .../java/com/kevin/coding02/util/SaxUtil.java | 121 +++++ group04/349184132/Study/.classpath | 8 + group04/349184132/Study/.project | 17 + .../org.eclipse.core.resources.prefs | 6 + .../.settings/org.eclipse.jdt.core.prefs | 12 + .../org.eclipse.ltk.core.refactoring.prefs | 2 + .../349184132/Study/bin/com/second/struts.xml | 11 + .../349184132/Study/bin/com/test/student2.xml | 6 + .../349184132/Study/bin/com/test/students.xml | 10 + .../Study/src/com/first/ArrayList.java | 86 ++++ .../Study/src/com/first/BinaryTreeNode.java | 75 +++ .../Study/src/com/first/Iterator.java | 7 + .../Study/src/com/first/LinkedList.java | 168 +++++++ .../349184132/Study/src/com/first/List.java | 9 + .../349184132/Study/src/com/first/Queue.java | 29 ++ .../349184132/Study/src/com/first/Stack.java | 34 ++ .../src/com/first/test/TestArrayList.java | 69 +++ .../src/com/first/test/TestLinkedList.java | 97 ++++ .../Study/src/com/second/Array/ArrayUtil.java | 257 ++++++++++ .../src/com/second/Array/ArrayUtilTest.java | 84 ++++ .../Study/src/com/second/LoginAction.java | 39 ++ .../Study/src/com/second/StringUtil.java | 33 ++ .../Study/src/com/second/Struts.java | 125 +++++ .../Study/src/com/second/StrutsTest.java | 43 ++ .../349184132/Study/src/com/second/View.java | 23 + .../349184132/Study/src/com/second/struts.xml | 11 + ...\347\233\230\346\214\207\344\273\244.docx" | Bin 0 -> 11099 bytes .../src/com/coding/array/ArrayUtil.java | 212 +++++++++ .../src/com/coding/basic/ArrayList.java | 73 +++ .../src/com/coding/basic/Iterator.java | 9 + .../src/com/coding/basic/LinkedList.java | 79 +++ .../351121278/src/com/coding/basic/List.java | 9 + .../351121278/src/com/coding/basic/Queue.java | 23 + .../351121278/src/com/coding/basic/Stack.java | 24 + .../com/coding/litestruts/LoginAction.java | 41 ++ .../src/com/coding/litestruts/Struts.java | 214 +++++++++ .../src/com/coding/litestruts/StrutsTest.java | 39 ++ .../src/com/coding/litestruts/View.java | 23 + .../src/com/coding/litestruts/struts.xml | 11 + group04/465034663/.classpath | 6 + group04/465034663/.gitignore | 1 + group04/465034663/.project | 17 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.core.runtime.prefs | 2 + .../com/xusheng/arraylist/MyArrayList.java | 130 +++++ .../com/xusheng/arraylist/MyCollection.java | 19 + .../src/com/xusheng/arraylist/MyIterator.java | 10 + .../src/com/xusheng/arraylist/MyList.java | 14 + .../com/xusheng/arraylist/MyListIterator.java | 12 + .../src/com/xusheng/arraylist/TestData.java | 29 ++ .../com/xusheng/linkedlist/MyLinkedList.java | 180 +++++++ .../src/com/xusheng/linkedlist/TestMain.java | 38 ++ .../src/com/xusheng/stack/MyLinkedStack.java | 98 ++++ .../src/com/xusheng/stack/MyLinkedStack2.java | 52 ++ .../src/com/xusheng/stack/TestMain.java | 17 + .../src/com/xusheng/tree/AvlTree.java | 217 +++++++++ .../com/xusheng/tree/BinarySearchTree.java | 128 +++++ .../src/com/xusheng/tree/TestMain.java | 21 + group04/474772605/.classpath | 7 + group04/474772605/.gitignore | 1 + group04/474772605/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/ArrayList.java | 85 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Dinkedlist.java | 22 + .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 155 ++++++ .../474772605/src/com/coding/basic/List.java | 9 + .../474772605/src/com/coding/basic/Queue.java | 42 ++ .../474772605/src/com/coding/basic/Stack.java | 31 ++ .../src/com/coding/basic/testarraylist.java | 22 + group04/498654356/one/.classpath | 27 ++ group04/498654356/one/.gitignore | 1 + group04/498654356/one/.project | 23 + group04/498654356/one/pom.xml | 45 ++ .../one/src/org/coding/one/ArrayList.java | 95 ++++ .../src/org/coding/one/BinaryTreeNode.java | 62 +++ .../one/src/org/coding/one/LinkedList.java | 138 ++++++ .../one/src/org/coding/one/List.java | 16 + .../one/src/org/coding/one/Queue.java | 22 + .../one/src/org/coding/one/Stack.java | 26 + .../org/coding/two/ActionBeanDefinition.java | 66 +++ .../one/src/org/coding/two/LoginAction.java | 45 ++ .../one/src/org/coding/two/Struts.java | 150 ++++++ .../one/src/org/coding/two/View.java | 23 + .../src/org/coding/two/array/ArrayUtil.java | 292 ++++++++++++ .../one/src/org/coding/two/struts.xml | 11 + .../one/test/org/coding/one/AllTests.java | 11 + .../test/org/coding/one/ArrayListTest.java | 95 ++++ .../org/coding/one/BinaryTreeNodeTest.java | 45 ++ .../test/org/coding/one/LinkedListTest.java | 194 ++++++++ .../one/test/org/coding/one/QueueTest.java | 60 +++ .../one/test/org/coding/one/StackTest.java | 70 +++ .../one/test/org/coding/two/StrutsTest.java | 43 ++ .../org/coding/two/array/ArrayUtilTest.java | 218 +++++++++ .../test_resource/org/coding/two/struts.xml | 11 + group04/564451732/hw1/.classpath | 7 + group04/564451732/hw1/.gitignore | 1 + group04/564451732/hw1/.project | 17 + .../564451732/hw1/src/DataStructureTest.java | 114 +++++ group04/564451732/hw1/src/Test.java | 8 + .../564451732/hw1/src/hw1/ArrayListImpl.java | 88 ++++ .../564451732/hw1/src/hw1/BinaryTreeNode.java | 71 +++ group04/564451732/hw1/src/hw1/Iterator.java | 7 + group04/564451732/hw1/src/hw1/LinkedList.java | 117 +++++ group04/564451732/hw1/src/hw1/List.java | 9 + group04/564451732/hw1/src/hw1/QueueImpl.java | 21 + group04/564451732/hw1/src/hw1/StackImpl.java | 23 + group04/564451732/hw2/.classpath | 7 + group04/564451732/hw2/.gitignore | 1 + group04/564451732/hw2/.project | 17 + .../hw2/.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/array/ArrayUtil.java | 213 +++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 167 +++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../hw2/src/com/coding/basic/ArrayList.java | 32 ++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../hw2/src/com/coding/basic/Iterator.java | 7 + .../hw2/src/com/coding/basic/LinkedList.java | 124 +++++ .../hw2/src/com/coding/basic/List.java | 9 + .../hw2/src/com/coding/basic/Queue.java | 19 + .../hw2/src/com/coding/basic/Stack.java | 22 + group04/564451732/hw2/struts.xml | 11 + .../project_basic_001/.gitignore | 44 ++ .../project_basic_001/pom.xml | 31 ++ .../java/com/coderising/array/ArrayUtil.java | 228 +++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../com/coderising/litestruts/Struts.java | 86 ++++ .../java/com/coderising/litestruts/View.java | 23 + .../java/com/coderising/litestruts/struts.xml | 11 + .../main/java/com/coding/basic/ArrayList.java | 119 +++++ .../java/com/coding/basic/BinaryTreeNode.java | 84 ++++ .../main/java/com/coding/basic/Iterator.java | 7 + .../java/com/coding/basic/LinkedList.java | 134 ++++++ .../src/main/java/com/coding/basic/List.java | 9 + .../src/main/java/com/coding/basic/Queue.java | 27 ++ .../src/main/java/com/coding/basic/Stack.java | 28 ++ .../com/coderising/array/ArrayUtilTest.java | 85 ++++ .../com/coderising/litestruts/StrutsTest.java | 41 ++ .../test/java/com/coding/basic/TestBasic.java | 92 ++++ group04/844028312/.gitignore | 1 + group04/844028312/one/.classpath | 7 + group04/844028312/one/.gitignore | 1 + group04/844028312/one/.project | 17 + .../one/src/com/coding/basic/ArrayList.java | 97 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 145 ++++++ .../one/src/com/coding/basic/Iterator.java | 7 + .../one/src/com/coding/basic/JavaTest.java | 89 ++++ .../one/src/com/coding/basic/LinkedList.java | 195 ++++++++ .../one/src/com/coding/basic/List.java | 9 + .../one/src/com/coding/basic/Queue.java | 24 + .../one/src/com/coding/basic/Stack.java | 28 ++ .../src/com/coding/test/ArrayListTest.java | 60 +++ .../com/coding/test/BinaryTreeNodeTest.java | 28 ++ .../src/com/coding/test/LinkedListTest.java | 66 +++ .../one/src/com/coding/test/QueueTest.java | 35 ++ .../one/src/com/coding/test/StackTest.java | 40 ++ group04/844028312/two/.classpath | 8 + group04/844028312/two/.gitignore | 1 + group04/844028312/two/.project | 17 + .../src/com/coderising/array/ArrayUtil.java | 265 +++++++++++ .../com/coderising/array/ArrayUtilTest.java | 66 +++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 161 +++++++ .../com/coderising/litestruts/StrutsTest.java | 50 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + group04/916758663/learn01/.gitignore | 21 + group04/916758663/learn01/pom.xml | 32 ++ .../main/java/com/coding/basic/ArrayList.java | 73 +++ .../java/com/coding/basic/BinaryTreeNode.java | 32 ++ .../main/java/com/coding/basic/Iterator.java | 7 + .../java/com/coding/basic/LinkedList.java | 117 +++++ .../src/main/java/com/coding/basic/List.java | 9 + .../src/main/java/com/coding/basic/Queue.java | 22 + .../src/main/java/com/coding/basic/Stack.java | 23 + .../java/com/coding/basic/ArrayListTest.java | 68 +++ .../com/coding/basic/JavaArrayListTest.java | 21 + .../java/com/coding/basic/LinkedListTest.java | 64 +++ .../test/java/com/coding/basic/QueueTest.java | 29 ++ .../test/java/com/coding/basic/StackTest.java | 29 ++ group04/916758663/learn02/.gitignore | 21 + group04/916758663/learn02/pom.xml | 19 + .../com/example/litestruts/LoginAction.java | 42 ++ .../java/com/example/litestruts/Struts.java | 158 ++++++ .../java/com/example/litestruts/View.java | 27 ++ .../com/example/litestruts/dto/Action.java | 78 +++ .../example/litestruts/dto/ActionResult.java | 28 ++ .../java/com/example/litestruts/struts.xml | 11 + .../com/example/litestruts/StrutsTest.java | 43 ++ group04/group04.md | 1 + group05/1026626960/.classpath | 9 + group05/1026626960/.gitignore | 1 + group05/1026626960/.project | 17 + .../1026626960/src/cn/study1/myIterator.java | 5 + group05/1026626960/src/cn/study1/myQueue.java | 38 ++ group05/1026626960/src/cn/study1/myStack.java | 29 ++ .../src/cn/study2/array/ArrayUtil.java | 213 +++++++++ .../src/cn/study2/myStruts/ActionMapping.java | 45 ++ .../src/cn/study2/myStruts/Result.java | 28 ++ .../src/cn/study2/myStruts/Test.java | 7 + .../src/cn/study2/myStruts/readStrutsXml.java | 98 ++++ group05/1026626960/src/mystruts.xml | 15 + group05/1094051862/test01/.classpath | 8 + group05/1094051862/test01/.gitignore | 1 + group05/1094051862/test01/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 12 + .../src/com/coderising/array/ArrayUtil.java | 235 +++++++++ .../com/coderising/array/ArrayUtilTest.java | 91 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 181 +++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 79 +++ .../src/com/coding/basic/ArrayListTest.java | 31 ++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../test01/src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 149 ++++++ .../src/com/coding/basic/LinkedListTest.java | 36 ++ .../test01/src/com/coding/basic/List.java | 10 + .../test01/src/com/coding/basic/Queue.java | 25 + .../src/com/coding/basic/QueueTest.java | 26 + .../test01/src/com/coding/basic/Stack.java | 28 ++ .../src/com/coding/basic/StackTest.java | 26 + .../src/com/coding/basic/ArrayList.java | 85 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 142 ++++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 22 + .../src/com/coding/basic/Stack.java | 35 ++ .../com/coderising/litestruts/struts.xml | 11 + .../src/com/coderising/array/ArrayUtil.java | 201 ++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 121 +++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + group05/284422826/.gitignore | 11 + .../src/com/coderising/array/ArrayUtil.java | 268 +++++++++++ .../com/coderising/array/ArrayUtilTest.java | 82 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 143 ++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding2017/basic/ArrayList.java | 130 +++++ .../com/coding2017/basic/BinaryTreeNode.java | 37 ++ .../src/com/coding2017/basic/Iterator.java | 7 + .../src/com/coding2017/basic/LinkedList.java | 168 +++++++ .../src/com/coding2017/basic/List.java | 9 + .../src/com/coding2017/basic/Queue.java | 25 + .../src/com/coding2017/basic/Stack.java | 31 ++ group05/289326186/.classpath | 8 + group05/289326186/.gitignore | 1 + group05/289326186/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 7 + ....eclipse.wst.common.project.facet.core.xml | 4 + .../src/com/coderising/array/ArrayUtil.java | 270 +++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 112 +++++ .../com/coderising/litestruts/StrutsTest.java | 39 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + group05/351592484/.gitignore | 9 + .../coding2017/basic/ArrayList.java | 132 +++++ .../coding2017/basic/BinaryTreeNode.java | 37 ++ .../coding2017/basic/Iterator.java | 7 + .../coding2017/basic/LinkedList.java | 168 +++++++ .../zhanglifeng/coding2017/basic/List.java | 9 + .../zhanglifeng/coding2017/basic/Queue.java | 25 + .../zhanglifeng/coding2017/basic/Stack.java | 31 ++ group05/371492887/task_01/.classpath | 7 + group05/371492887/task_01/.gitignore | 1 + group05/371492887/task_01/.project | 17 + .../src/com/nitasty/test/ArrayListTest.java | 95 ++++ .../src/com/nitasty/test/BinaryTreeTest.java | 66 +++ .../src/com/nitasty/test/LinkedListTest.java | 142 ++++++ .../src/com/nitasty/test/QueueTest.java | 49 ++ .../src/com/nitasty/test/StackTest.java | 51 ++ .../src/com/nitasty/util/ArrayList.java | 307 ++++++++++++ .../src/com/nitasty/util/BinaryTree.java | 190 ++++++++ .../src/com/nitasty/util/BinaryTreeNode.java | 43 ++ .../src/com/nitasty/util/Iterator.java | 7 + .../src/com/nitasty/util/LinkedList.java | 393 +++++++++++++++ .../task_01/src/com/nitasty/util/List.java | 46 ++ .../task_01/src/com/nitasty/util/Queue.java | 27 ++ .../task_01/src/com/nitasty/util/Stack.java | 31 ++ group05/371492887/task_02/.classpath | 21 + group05/371492887/task_02/.gitignore | 1 + group05/371492887/task_02/.project | 23 + group05/371492887/task_02/pom.xml | 37 ++ .../com/coderising/action/LoginAction.java | 39 ++ .../src/com/nitasty/array/ArrayUtil.java | 269 +++++++++++ .../src/com/nitasty/array/ArrayUtilTest.java | 92 ++++ .../com/nitasty/litestruts/LoginAction.java | 39 ++ .../src/com/nitasty/litestruts/Struts.java | 204 ++++++++ .../com/nitasty/litestruts/StrutsTest.java | 43 ++ .../src/com/nitasty/litestruts/View.java | 23 + .../src/com/nitasty/litestruts/struts.xml | 11 + group05/399258474/.classpath | 8 + group05/399258474/.gitignore | 1 + group05/399258474/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/array/ArrayUtil.java | 247 ++++++++++ .../com/coderising/array/ArrayUtilTest.java | 92 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 162 +++++++ .../com/coderising/litestruts/StrutsTest.java | 48 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 71 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 104 ++++ .../399258474/src/com/coding/basic/List.java | 9 + .../399258474/src/com/coding/basic/Queue.java | 35 ++ .../399258474/src/com/coding/basic/Stack.java | 39 ++ .../src/com/coding/basic/test/BasicTest.java | 78 +++ group05/441517454/work1/.classpath | 6 + group05/441517454/work1/.gitignore | 1 + group05/441517454/work1/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../work1/src/com/coding/basic/ArrayList.java | 106 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../work1/src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 156 ++++++ .../work1/src/com/coding/basic/List.java | 9 + .../work1/src/com/coding/basic/Queue.java | 30 ++ .../work1/src/com/coding/basic/Stack.java | 30 ++ .../work1/src/com/coding/basic/Test1.java | 48 ++ .../515505513/RemoteSystemsTempFiles/.project | 12 + group05/515505513/Task01/.classpath | 6 + group05/515505513/Task01/.gitignore | 1 + group05/515505513/Task01/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/ArrayList.java | 78 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../Task01/src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 48 ++ .../Task01/src/com/coding/basic/List.java | 9 + .../Task01/src/com/coding/basic/Queue.java | 49 ++ .../Task01/src/com/coding/basic/Stack.java | 49 ++ .../src/com/coding/basic/TestExample.java | 27 ++ group05/515505513/Task02/.classpath | 8 + group05/515505513/Task02/.gitignore | 1 + group05/515505513/Task02/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../com/coderising/action/LoginAction.java | 45 ++ .../src/com/coderising/action/Struts.java | 165 +++++++ .../src/com/coderising/action/StrutsTest.java | 42 ++ .../src/com/coderising/action/View.java | 23 + .../src/com/coderising/action/struts.xml | 11 + .../src/com/coderising/array/ArrayUtil.java | 221 +++++++++ .../com/coderising/array/ArrayUtilTest.java | 84 ++++ group05/578505552/.gitignore | 17 + group05/578505552/pom.xml | 29 ++ .../src/main/java/com/coderising/Q&A.md | 5 + .../java/com/coderising/array/ArrayUtil.java | 242 ++++++++++ .../com/coderising/litestruts/Action.java | 38 ++ .../coderising/litestruts/LoginAction.java | 38 ++ .../com/coderising/litestruts/Struts.java | 131 +++++ .../java/com/coderising/litestruts/View.java | 23 + .../com/coderising/litestruts/XmlUtil.java | 8 + .../main/java/com/coding/basic/ArrayList.java | 103 ++++ .../java/com/coding/basic/BinaryTreeNode.java | 60 +++ .../main/java/com/coding/basic/Iterator.java | 11 + .../java/com/coding/basic/LinkedList.java | 156 ++++++ .../src/main/java/com/coding/basic/List.java | 14 + .../src/main/java/com/coding/basic/Queue.java | 90 ++++ .../src/main/java/com/coding/basic/Stack.java | 63 +++ .../578505552/src/main/resources/struts.xml | 12 + group05/578505552/src/test/java/JavaTest.java | 25 + .../com/coderising/array/ArrayUtilTest.java | 206 ++++++++ .../com/coderising/litestruts/StrutsTest.java | 40 ++ .../com/coding/basic/BinaryTreeNodeTest.java | 38 ++ .../test/java/com/coding/basic/ListTest.java | 100 ++++ .../test/java/com/coding/basic/QueueTest.java | 75 +++ .../test/java/com/coding/basic/StackTest.java | 65 +++ group05/591010847/.gitignore | 10 + group05/591010847/job_2017_02/.gitignore | 1 + .../com/java/xiaoqin/impl/ArrayListImpl.java | 127 +++++ .../com/java/xiaoqin/impl/BinaryTreeNode.java | 82 ++++ .../com/java/xiaoqin/impl/LinkedListImpl.java | 202 ++++++++ .../src/com/java/xiaoqin/impl/StackImpl.java | 60 +++ .../java/xiaoqin/interfaces/IIterator.java | 19 + .../com/java/xiaoqin/interfaces/IList.java | 53 +++ .../com/java/xiaoqin/interfaces/IQueue.java | 15 + .../java/xiaoqin/impl/ArrayListImplTest.java | 107 +++++ .../java/xiaoqin/impl/BinaryTreeNodeTest.java | 46 ++ .../com/java/xiaoqin/impl/IQueueImplTest.java | 77 +++ .../com/java/xiaoqin/impl/IStackImplTest.java | 90 ++++ .../java/xiaoqin/impl/LinkedListImplTest.java | 108 +++++ .../job_2017_02_26_Struts/res/struts.xml | 11 + .../src/com/java/xiaoqin/array/ArrayUtil.java | 229 +++++++++ .../com/java/xiaoqin/litestruts/Struts.java | 64 +++ .../litestruts/action/LoginAction.java | 39 ++ .../litestruts/action/LogoutAction.java | 7 + .../xiaoqin/litestruts/bean/ActionBean.java | 41 ++ .../java/xiaoqin/litestruts/bean/View.java | 23 + .../manager/StrutsParseManager.java | 95 ++++ .../xiaoqin/litestruts/util/ReflectUtils.java | 75 +++ .../com/java/xiaoqin/array/ArrayUtilTest.java | 110 +++++ .../java/xiaoqin/litestruts/StrutsTest.java | 41 ++ group05/810574652/.classpath | 6 + group05/810574652/.gitignore | 1 + group05/810574652/.project | 17 + .../coding2017/homework1/ArrayList.java | 81 ++++ .../coding2017/homework1/LinkedList.java | 131 +++++ .../PingPi357/coding2017/homework1/List.java | 17 + .../PingPi357/coding2017/homework1/Queue.java | 18 + .../PingPi357/coding2017/homework1/Stack.java | 33 ++ .../homework1/\350\257\264\346\230\216" | 2 + .../coding2017/homework2/ArrayUtil.java | 203 ++++++++ .../homework2/litestruts/LoginAction.java | 39 ++ .../homework2/litestruts/Struts.java | 34 ++ .../homework2/litestruts/StrutsTest.java | 43 ++ .../coding2017/homework2/litestruts/View.java | 23 + .../homework2/litestruts/struts.xml | 11 + .../homework2/\350\257\264\346\230\216" | 1 + group05/group05.md | 1 + .../src/com/coding/basic/MyArrayList.java | 49 ++ .../src/com/coding/basic/MyLinkedList.java | 124 +++++ .../src/com/coding/basic/MyQueue.java | 52 ++ .../src/com/coding/basic/MyStack.java | 45 ++ group06/1259131938/JavaLearning/.classpath | 6 + group06/1259131938/JavaLearning/.gitignore | 1 + group06/1259131938/JavaLearning/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/MyArrayList.java | 77 +++ .../src/com/coding/basic/MyLinkedList.java | 97 ++++ .../src/com/coding/basic/MyStack.java | 36 ++ .../src/com/coding/basic/Queue.java | 20 + group06/1378560653/.classpath | 7 + group06/1378560653/.gitignore | 1 + group06/1378560653/.project | 17 + .../src/com/coderising/array/ArrayUtil.java | 208 ++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../coderising/litestruts/StructsTest.java | 40 ++ .../src/com/coderising/litestruts/Struts.java | 56 +++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/structs.xml | 11 + .../src/com/coding/basic/ArrayList.java | 95 ++++ .../src/com/coding/basic/BinaryTree.java | 40 ++ .../src/com/coding/basic/BinaryTreeNode.java | 34 ++ .../src/com/coding/basic/Iterator.java | 6 + .../src/com/coding/basic/LinkedList.java | 164 +++++++ .../1378560653/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 29 ++ .../src/com/coding/basic/Stack.java | 35 ++ group06/1454385822/.classpath | 8 + group06/1454385822/.gitignore | 1 + group06/1454385822/.project | 17 + .../coding/basic/homework_01/ArrayList.java | 124 +++++ .../basic/homework_01/BinaryTreeNode.java | 65 +++ .../coding/basic/homework_01/Iterator.java | 8 + .../coding/basic/homework_01/LinkedList.java | 241 ++++++++++ .../com/coding/basic/homework_01/List.java | 11 + .../com/coding/basic/homework_01/Queue.java | 42 ++ .../com/coding/basic/homework_01/Stack.java | 42 ++ .../basic/homework_02/array/ArrayUtil.java | 218 +++++++++ .../homework_02/array/ArrayUtilTest.java | 93 ++++ .../homework_02/litestruts/LoginAction.java | 39 ++ .../homework_02/litestruts/LogoutAction.java | 5 + .../basic/homework_02/litestruts/Struts.java | 286 +++++++++++ .../homework_02/litestruts/StrutsTest.java | 46 ++ .../basic/homework_02/litestruts/View.java | 23 + .../basic/homework_02/litestruts/struts.xml | 11 + group06/1730798243/.classpath | 7 + group06/1730798243/.gitignore | 1 + group06/1730798243/.project | 17 + .../src/com/coding/basic/first/Iterator.java | 15 + .../src/com/coding/basic/first/List.java | 37 ++ .../coding/basic/first/impl/ArrayList.java | 87 ++++ .../coding/basic/first/impl/LinkedList.java | 143 ++++++ .../com/coding/basic/first/impl/Queue.java | 46 ++ .../com/coding/basic/first/impl/Stack.java | 53 +++ .../src/com/coding/test/ArrayListTest.java | 58 +++ .../src/com/coding/test/LinkedListTest.java | 112 +++++ .../src/com/coding/test/QueueTest.java | 78 +++ .../src/com/coding/test/StackTest.java | 105 ++++ group06/236995728/.classpath | 7 + group06/236995728/.gitignore | 1 + group06/236995728/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + ...\347\232\204\345\205\263\347\263\273.docx" | Bin 0 -> 12398 bytes .../src/com/coding/basic/ArrayList.java | 92 ++++ .../src/com/coding/basic/ArrayListTest.java | 82 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ ...\347\232\204\345\205\263\347\263\273.docx" | Bin 0 -> 12398 bytes .../src/com/coding/basic/Iterator.java | 6 + .../src/com/coding/basic/LinkedList.java | 149 ++++++ .../src/com/coding/basic/LinkedListTest.java | 78 +++ .../236995728/src/com/coding/basic/List.java | 14 + .../236995728/src/com/coding/basic/Queue.java | 45 ++ .../src/com/coding/basic/QueueTest.java | 53 +++ .../236995728/src/com/coding/basic/Stack.java | 52 ++ .../src/com/coding/basic/StackTest.java | 58 +++ group06/2415980327/.gitignore | 7 + group06/2415980327/CodeSE01/.gitignore | 1 + .../src/com/pxshuo/se01/basic/Iterator.java | 15 + .../src/com/pxshuo/se01/basic/List.java | 37 ++ .../src/com/pxshuo/se01/basic/TreeData.java | 24 + .../com/pxshuo/se01/basic/impl/ArrayList.java | 138 ++++++ .../pxshuo/se01/basic/impl/BinaryTree.java | 65 +++ .../se01/basic/impl/BinaryTreeNode.java | 109 +++++ .../pxshuo/se01/basic/impl/LinkedList.java | 181 +++++++ .../src/com/pxshuo/se01/basic/impl/Queue.java | 44 ++ .../src/com/pxshuo/se01/basic/impl/Stack.java | 51 ++ .../pxshuo/se01/basic/impl/package-info.java | 14 + .../src/com/pxshuo/se02/array/ArrayUtil.java | 226 +++++++++ .../pxshuo/se02/litestruts/LoginAction.java | 39 ++ .../com/pxshuo/se02/litestruts/Struts.java | 151 ++++++ .../pxshuo/se02/litestruts/StrutsTest.java | 43 ++ .../src/com/pxshuo/se02/litestruts/Tools.java | 33 ++ .../src/com/pxshuo/se02/litestruts/View.java | 23 + .../src/com/pxshuo/se02/litestruts/struts.xml | 11 + .../CodeSE01/src/com/pxshuo/test/Test.java | 59 +++ .../pxshuo/se01/basic/impl/ArrayListTest.java | 42 ++ .../se01/basic/impl/BinaryTreeTest.java | 26 + .../se01/basic/impl/LinkedListTest.java | 43 ++ .../com/pxshuo/se01/basic/impl/QueueTest.java | 23 + .../com/pxshuo/se01/basic/impl/StackTest.java | 25 + .../com/pxshuo/se02/array/ArrayUntilTest.java | 72 +++ ...64\347\232\204\345\205\263\347\263\273.md" | 13 + group06/263050006/article.txt | 2 + .../learning/java/array/ArrayUtil.java | 197 ++++++++ .../java/collection/myown/MyArrayList.java | 80 ++++ .../collection/myown/MyBinarySearchTree.java | 98 ++++ .../java/collection/myown/MyIterator.java | 8 + .../java/collection/myown/MyLinkedList.java | 120 +++++ .../java/collection/myown/MyQueue.java | 92 ++++ .../java/collection/myown/MyStack.java | 63 +++ .../java/collection/myown/MyTree.java | 59 +++ .../learning/java/litestruts/LoginAction.java | 39 ++ .../learning/java/litestruts/Struts.java | 134 ++++++ .../learning/java/litestruts/View.java | 23 + .../learning/java/litestruts/struts.xml | 11 + .../learning/java/array/ArrayUtilTest.java | 134 ++++++ .../collection/myown/MyArrayListTest.java | 53 +++ .../myown/MyBinarySearchTreeTest.java | 17 + .../collection/myown/MyLinkedListTest.java | 76 +++ .../java/collection/myown/MyQueueTest.java | 55 +++ .../java/collection/myown/MyStackTest.java | 47 ++ .../learning/java/litestruts/StrutsTest.java | 39 ++ group06/284999210/.classpath | 6 + group06/284999210/.gitignore | 3 + group06/284999210/.project | 17 + ...4\347\232\204\345\205\263\347\263\273.doc" | Bin 0 -> 27136 bytes .../com/coding/basic/container/ArrayList.java | 156 ++++++ .../basic/container/BinaryTreeNode.java | 68 +++ .../com/coding/basic/container/Iterator.java | 7 + .../coding/basic/container/LinkedList.java | 186 ++++++++ .../src/com/coding/basic/container/List.java | 28 ++ .../src/com/coding/basic/container/Queue.java | 34 ++ .../src/com/coding/basic/container/Stack.java | 39 ++ .../basic/container/test/TestContainer.java | 71 +++ group06/290149544/blog/README.md | 1 + group06/290149544/hw1/.classpath | 6 + group06/290149544/hw1/.gitattributes | 17 + group06/290149544/hw1/.gitignore | 63 +++ group06/290149544/hw1/.project | 17 + group06/290149544/hw1/README.md | 3 + group06/290149544/hw1/src/hw1/ArrayList.java | 58 +++ group06/290149544/hw1/src/hw1/JavaTest.java | 24 + group06/290149544/hw1/src/hw1/LinkedList.java | 115 +++++ group06/290149544/hw1/src/hw1/List.java | 9 + group06/290149544/hw1/src/hw1/Queue.java | 20 + group06/290149544/hw1/src/hw1/Stack.java | 39 ++ group06/309953838/.classpath | 6 + group06/309953838/.gitignore | 1 + group06/309953838/.project | 17 + .../src/com/team6/week1/ArrayList.java | 57 +++ .../src/com/team6/week1/LinkedList.java | 121 +++++ .../309953838/src/com/team6/week1/List.java | 14 + .../309953838/src/com/team6/week1/Queue.java | 62 +++ .../309953838/src/com/team6/week1/Stack.java | 32 ++ .../src/com/coding/basic/ArrayList.java | 48 ++ .../src/com/coding/basic/BinaryTreeNode.java | 55 +++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 116 +++++ .../src/com/coding/basic/LinkedListTest.java | 20 + .../547958234/src/com/coding/basic/List.java | 9 + .../547958234/src/com/coding/basic/Queue.java | 26 + .../547958234/src/com/coding/basic/Stack.java | 27 ++ .../736464448/data_structure/MyArrayList.java | 167 +++++++ .../data_structure/MyBinaryTree.java | 198 ++++++++ .../data_structure/MyLinkedList.java | 209 ++++++++ group06/736464448/data_structure/MyQueue.java | 21 + group06/736464448/data_structure/MyStack.java | 22 + .../test_data_structure/TestMyArrayList.java | 93 ++++ .../test_data_structure/TestMyBinaryTree.java | 59 +++ .../test_data_structure/TestMyLinkedList.java | 111 +++++ .../test_data_structure/TestMyQueue.java | 49 ++ .../test_data_structure/TestMyStack.java | 60 +++ .../src/com/liteStructs/LoginAction.java | 5 + .../src/com/liteStructs/Structs.java | 5 + .../src/com/liteStructs/View.java | 5 + .../src/com/liteStructs/struts.xml | 11 + .../src/secondhomework/MyArrayUtil.java | 214 +++++++++ .../src/com/firsthomework/MyArrayList.java | 107 +++++ .../src/com/firsthomework/MyLinkedList.java | 109 +++++ .../src/com/firsthomework/MyQueue.java | 52 ++ .../src/com/firsthomework/MyStack.java | 62 +++ ...7\347\253\240\345\234\260\345\235\200.txt" | 1 + ...7\347\253\240\345\234\260\345\235\200.txt" | 1 + group06/949319266/.classpath | 7 + group06/949319266/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 12 + group06/949319266/949319266learn/.classpath | 7 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../949319266/RemoteSystemsTempFiles/.project | 12 + group06/949319266/homework/.classpath | 7 + group06/949319266/homework/.gitignore | 1 + group06/949319266/homework/.project | 17 + .../org.eclipse.core.resources.prefs | 4 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/cn/ecust/Array/ArrayUtil.java | 201 ++++++++ .../src/cn/ecust/Iitestruts/LoginAction.java | 39 ++ .../src/cn/ecust/Iitestruts/Struts.java | 34 ++ .../src/cn/ecust/Iitestruts/StrutsTest.java | 43 ++ .../src/cn/ecust/Iitestruts/View.java | 23 + .../src/cn/ecust/Iitestruts/struts.xml | 11 + .../src/cn/ecust/Test/ArrayUtilTest.java | 26 + .../src/\346\226\207\347\253\2402.txt" | 1 + .../src/com/coding/basic/ArrayList.java | 93 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 100 ++++ .../src/com/coding/basic/LinkedList.java | 133 ++++++ .../949319266/src/com/coding/basic/List.java | 13 + .../949319266/src/com/coding/basic/Queue.java | 52 ++ .../949319266/src/com/coding/basic/Stack.java | 36 ++ .../com/coding/basic/test/ArrayListTest.java | 39 ++ .../com/coding/basic/test/LinkedListTest.java | 24 + .../src/com/coding/basic/test/QueueTest.java | 28 ++ .../src/com/coding/basic/test/StackTest.java | 26 + .../949319266/\346\226\207\347\253\240.txt" | 1 + group06/group06.md | 1 + .../git\345\221\275\344\273\244.txt" | 11 + group07/1058267830/week1/.classpath | 8 + group07/1058267830/week1/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../week1/src/com/coding/basic/ArrayList.java | 108 +++++ .../src/com/coding/basic/BinaryTree.java | 78 +++ .../src/com/coding/basic/BinaryTreeNode.java | 16 + .../week1/src/com/coding/basic/Iterator.java | 8 + .../src/com/coding/basic/LinkedList.java | 97 ++++ .../week1/src/com/coding/basic/List.java | 14 + .../week1/src/com/coding/basic/Node.java | 39 ++ .../week1/src/com/coding/basic/Queue.java | 25 + .../week1/src/com/coding/basic/Stack.java | 29 ++ .../test/com/coding/test/TestArrayList.java | 47 ++ .../test/com/coding/test/TestBinaryTree.java | 29 ++ .../test/com/coding/test/TestLinkedList.java | 40 ++ .../week1/test/com/coding/test/TestQueue.java | 26 + .../week1/test/com/coding/test/TestStack.java | 31 ++ group07/1058267830/week2/.classpath | 8 + group07/1058267830/week2/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../bin/com/coderising/litestruts/struts.xml | 11 + .../src/com/coderising/array/ArrayTest.java | 77 +++ .../src/com/coderising/array/ArrayUtil.java | 240 ++++++++++ .../src/com/coderising/litestruts/Demo.java | 35 ++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 64 +++ .../com/coderising/litestruts/StrutsTest.java | 41 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../git\345\221\275\344\273\244.txt" | 11 + .../20170224-01-ArrayList/.classpath | 6 + .../20170224-01-ArrayList/.gitignore | 1 + .../1280157271/20170224-01-ArrayList/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/firstHomework/fan/List.java | 9 + .../src/firstHomework/fan/myArrayList.java | 60 +++ .../firstHomework/fan/myBinaryTreeNode.java | 68 +++ .../src/firstHomework/fan/myLinkedList.java | 129 +++++ .../src/firstHomework/fan/myQueue.java | 51 ++ .../src/firstHomework/fan/myStack.java | 31 ++ .../git\345\221\275\344\273\244.txt" | 11 + ...\347\232\204\345\205\263\347\263\273 .txt" | 1 + group07/1448276993/JavaStudy/.classpath | 6 + group07/1448276993/JavaStudy/.gitignore | 1 + group07/1448276993/JavaStudy/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../JavaStudy/src/java1/ArrayList.java | 57 +++ .../JavaStudy/src/java1/LinkedList.java | 129 +++++ .../1448276993/JavaStudy/src/java1/List.java | 9 + .../1448276993/JavaStudy/src/java1/Queue.java | 38 ++ .../1448276993/JavaStudy/src/java1/Stack.java | 34 ++ .../git\345\221\275\344\273\244.txt" | 11 + group07/1519504320/.classpath | 6 + group07/1519504320/.gitignore | 1 + group07/1519504320/.project | 17 + .../git\345\221\275\344\273\244.txt" | 11 + .../src/coderising/array/ArrayUtil.java | 224 +++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/coderising/litestruts/Struts.java | 106 +++++ .../src/coderising/litestruts/StrutsTest.java | 43 ++ .../src/coderising/litestruts/View.java | 23 + .../src/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 96 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 157 ++++++ .../1519504320/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 23 + .../src/com/coding/basic/Stack.java | 28 ++ .../git\345\221\275\344\273\244.txt" | 11 + group07/1536161030/.classpath | 6 + group07/1536161030/.gitignore | 22 + group07/1536161030/.project | 17 + .../org.eclipse.core.resources.prefs | 2 + ...\347\233\230,\346\214\207\344\273\244.txt" | 12 + .../git\345\221\275\344\273\244.txt" | 11 + .../src/com/coding/basic/ArrayList.java | 95 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 75 +++ .../src/com/coding/basic/Iterator.java | 8 + .../src/com/coding/basic/LinkedList.java | 139 ++++++ .../1536161030/src/com/coding/basic/List.java | 13 + .../src/com/coding/basic/Queue.java | 72 +++ .../src/com/coding/basic/Stack.java | 47 ++ .../src/com/coding/test/ArrayListTest.java | 70 +++ .../com/coding/test/BinaryTreeNodeTest.java | 19 + .../src/com/coding/test/LinkedListTest.java | 68 +++ .../src/com/coding/test/QueueTest.java | 47 ++ .../src/com/coding/test/StackTest.java | 58 +++ group07/178007127/001DataStructure/.classpath | 8 + group07/178007127/001DataStructure/.gitignore | 2 + group07/178007127/001DataStructure/.project | 18 + ...ource.ide.eclipse.gradle.core.import.prefs | 9 + ...springsource.ide.eclipse.gradle.core.prefs | 5 + ...ingsource.ide.eclipse.gradle.refresh.prefs | 8 + .../.settings/org.eclipse.jdt.core.prefs | 11 + group07/178007127/001DataStructure/README.md | 2 + .../178007127/001DataStructure/build.gradle | 12 + .../com/easy/codersing/array/ArrayUtil.java | 225 +++++++++ .../codersing/litestruts/LoginAction.java | 39 ++ .../com/easy/codersing/litestruts/Struts.java | 99 ++++ .../easy/codersing/litestruts/StrutsTest.java | 43 ++ .../easy/codersing/litestruts/TestApp.java | 85 ++++ .../com/easy/codersing/litestruts/View.java | 23 + .../com/easy/codersing/litestruts/struts.xml | 11 + .../src/main/java/com/easy/core/AppUtils.java | 13 + .../java/com/easy/util/junit/app/TestApp.java | 19 + .../com/easy/util/myarraylist/ArrayList.java | 175 +++++++ .../com/easy/util/myiterator/Iterator.java | 6 + .../easy/util/mylinkedlist/LinkedList.java | 211 ++++++++ .../java/com/easy/util/myqueue/Queue.java | 37 ++ .../java/com/easy/util/mystack/Stack.java | 41 ++ .../easy/codersing/array/TestArrayUtil.java | 67 +++ .../easy/util/myarraylist/TestArrayList.java | 82 ++++ .../util/mylinkedlist/TestLinkedList.java | 108 +++++ .../java/com/easy/util/myqueue/TestQueue.java | 27 ++ .../java/com/easy/util/mystack/TestStack.java | 31 ++ .../git\345\221\275\344\273\244.txt" | 11 + .../20409287/git\345\221\275\344\273\244.txt" | 11 + .../java/xdx/homework/first/ArrayList.java | 216 +++++++++ .../main/java/xdx/homework/first/Hello.java | 15 + .../java/xdx/homework/first/Iterator.java | 11 + .../java/xdx/homework/first/LinkedList.java | 246 ++++++++++ .../main/java/xdx/homework/first/List.java | 86 ++++ .../main/java/xdx/homework/first/Queue.java | 97 ++++ .../main/java/xdx/homework/first/Stack.java | 81 ++++ .../xdx/homework/second/array/ArrayUtil.java | 221 +++++++++ .../second/litestruts/LoginAction.java | 41 ++ .../homework/second/litestruts/Struts.java | 149 ++++++ .../second/litestruts/StrutsTest.java | 42 ++ .../xdx/homework/second/litestruts/View.java | 23 + .../xdx/homework/second/litestruts/struts.xml | 11 + .../xdx/homework/first/ArrayListTest.java | 182 +++++++ .../xdx/homework/first/LinkedListTest.java | 222 +++++++++ .../test/xdx/homework/first/QueueTest.java | 141 ++++++ .../test/xdx/homework/first/StackTest.java | 126 +++++ .../xdx/homework/second/ArrayUtilTest.java | 157 ++++++ .../git\345\221\275\344\273\244.txt" | 11 + group07/2306826375/txt | 1 + .../git\345\221\275\344\273\244.txt" | 11 + .../git\345\221\275\344\273\244.txt" | 11 + .../git\345\221\275\344\273\244.txt" | 11 + group07/396868934/DataStructure/.classpath | 7 + group07/396868934/DataStructure/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../396868934/DataStructure/bin/.gitignore | 1 + .../src/com/louisly/java/LYArrayLink.java | 93 ++++ .../src/com/louisly/java/LYArrayList.java | 96 ++++ .../src/com/louisly/java/LYArrayListTest.java | 50 ++ .../src/com/louisly/java/LYBinaryTree.java | 45 ++ .../src/com/louisly/java/LYIterator.java | 6 + .../src/com/louisly/java/LYObject.java | 8 + .../src/com/louisly/java/LYQueue.java | 28 ++ .../src/com/louisly/java/LYStack.java | 34 ++ .../src/com/louisly/java/main.java | 84 ++++ .../git\345\221\275\344\273\244.txt" | 11 + .../43819473/git\345\221\275\344\273\244.txt" | 11 + group07/43819473/homework/pom.xml | 36 ++ .../main/java/coderising/array/ArrayUtil.java | 238 ++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../java/coderising/litestruts/Struts.java | 95 ++++ .../coderising/litestruts/StrutsTest.java | 38 ++ .../main/java/coderising/litestruts/View.java | 23 + .../java/coderising/litestruts/struts.xml | 11 + .../main/java/dataStructure/ArrayList.java | 87 ++++ .../main/java/dataStructure/BinaryTree.java | 73 +++ .../src/main/java/dataStructure/Iterator.java | 9 + .../main/java/dataStructure/LinkedList.java | 116 +++++ .../src/main/java/dataStructure/List.java | 16 + .../src/main/java/dataStructure/Queue.java | 25 + .../src/main/java/dataStructure/Stack.java | 29 ++ .../java/coderising/array/ArrayUtilTest.java | 81 ++++ .../java/dataStructure/ArrayListTest.java | 79 +++ .../java/dataStructure/BinaryTreeTest.java | 34 ++ .../java/dataStructure/LinkedListTest.java | 102 ++++ .../test/java/dataStructure/QueueTest.java | 51 ++ .../test/java/dataStructure/StackTest.java | 56 +++ .../git\345\221\275\344\273\244.txt" | 11 + group07/476770768/MyDataStructure/.classpath | 7 + group07/476770768/MyDataStructure/.gitignore | 17 + group07/476770768/MyDataStructure/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/BinaryTreeNode.java | 44 ++ .../src/com/coding/basic/MyArrayList.java | 149 ++++++ .../src/com/coding/basic/MyArrayListTest.java | 69 +++ .../src/com/coding/basic/MyIterator.java | 6 + .../src/com/coding/basic/MyLinkedList.java | 230 +++++++++ .../com/coding/basic/MyLinkedListTest.java | 67 +++ .../src/com/coding/basic/MyList.java | 9 + .../src/com/coding/basic/MyQueue.java | 30 ++ .../src/com/coding/basic/MyQueueTest.java | 45 ++ .../src/com/coding/basic/MyStack.java | 44 ++ .../src/com/coding/basic/MyStackTest.java | 56 +++ .../src/com/coding/basic/testFile.java | 8 + .../com/coding/refactor/List/MyArrayList.java | 131 +++++ .../com/coding/refactor/List/MyIterator.java | 12 + .../src/com/coding/refactor/List/MyList.java | 35 ++ .../com/coding/refactor/List/TestFile.java | 11 + .../Week2_HOMEWORK/Coderising/.classpath | 7 + .../Week2_HOMEWORK/Coderising/.gitignore | 1 + .../Week2_HOMEWORK/Coderising/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../Coderising/src/com/Array/ArrayUtil.java | 227 +++++++++ .../src/com/Array/ArrayUtilTest.java | 74 +++ .../src/com/LinkedList/LinkedListUtil.java | 260 ++++++++++ .../com/LinkedList/LinkedListUtilTest.java | 139 ++++++ .../src/com/litestruts/LoginAction.java | 40 ++ .../Coderising/src/com/litestruts/Struts.java | 297 ++++++++++++ .../src/com/litestruts/StrutsTest.java | 38 ++ .../Coderising/src/com/litestruts/View.java | 23 + .../Coderising/src/com/litestruts/struts.xml | 11 + .../git\345\221\275\344\273\244.txt" | 11 + .../git\345\221\275\344\273\244.txt" | 11 + .../git\345\221\275\344\273\244.txt" | 11 + group07/562247675/homework/.gitignore | 22 + .../562247675/homework/homework-0226/pom.xml | 22 + .../group7/homework/c0226/MyArrayList.java | 98 ++++ .../homework/c0226/MyArrayListTest.java | 71 +++ .../homework/c0226/MyBinaryTreeNode.java | 52 ++ .../homework/c0226/MyBinaryTreeNodeTest.java | 37 ++ .../group7/homework/c0226/MyIterator.java | 8 + .../group7/homework/c0226/MyLinkedList.java | 155 ++++++ .../homework/c0226/MyLinkedListTest.java | 111 +++++ .../group7/homework/c0226/MyList.java | 13 + .../group7/homework/c0226/MyQueue.java | 35 ++ .../group7/homework/c0226/MyQueueTest.java | 48 ++ .../group7/homework/c0226/MyStack.java | 40 ++ .../group7/homework/c0226/MyStackTest.java | 53 +++ .../src/main/resources/readme.md | 21 + .../562247675/homework/homework-0305/pom.xml | 26 + .../com/coderising/array/MyArrayUtil.java | 267 +++++++++++ .../coderising/litestruts/LoginAction.java | 41 ++ .../com/coderising/litestruts/MyStruts.java | 200 ++++++++ .../coderising/litestruts/MyStrutsTest.java | 40 ++ .../java/com/coderising/litestruts/View.java | 26 + .../src/main/resources/struts.xml | 11 + group07/562247675/homework/pom.xml | 67 +++ group07/562247675/homework/readme.md | 1 + group07/562247675/notebook/readme.md | 1 + .../git\345\221\275\344\273\244.txt" | 11 + .../git\345\221\275\344\273\244.txt" | 11 + .../git\345\221\275\344\273\244.txt" | 11 + .../724319952/src/cn/fyl/first/ArrayList.java | 107 +++++ .../src/cn/fyl/first/BinaryTreeNode.java | 68 +++ .../724319952/src/cn/fyl/first/Iterator.java | 7 + .../src/cn/fyl/first/LinkedList.java | 163 +++++++ group07/724319952/src/cn/fyl/first/List.java | 11 + group07/724319952/src/cn/fyl/first/Queue.java | 37 ++ group07/724319952/src/cn/fyl/first/Stack.java | 39 ++ .../src/cn/fyl/second/ArrayUtil.java | 235 +++++++++ group07/752262774/.gitignore | 23 + .../src/com/coderising/array/ArrayUtil.java | 237 +++++++++ .../com/coderising/array/ArrayUtilTest.java | 95 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 97 ++++ .../com/coderising/litestruts/StrutsTest.java | 53 +++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 114 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 49 ++ .../src/com/coding/basic/Iterator.java | 12 + .../src/com/coding/basic/LinkedList.java | 210 ++++++++ .../752262774/src/com/coding/basic/List.java | 18 + .../752262774/src/com/coding/basic/Queue.java | 27 ++ .../752262774/src/com/coding/basic/Stack.java | 39 ++ group07/764189149/.classpath | 10 + group07/764189149/.gitignore | 23 + group07/764189149/.project | 17 + .../coderising/download/DownloadThread.java | 38 ++ .../coderising/download/FileDownloader.java | 127 +++++ .../download/FileDownloaderTest.java | 55 +++ .../coderising/download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 10 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 40 ++ .../download/impl/ConnectionManagerImpl.java | 30 ++ .../leijing/coderising/array/ArrayUtil.java | 279 +++++++++++ .../coderising/array/ArrayUtilTest.java | 77 +++ .../coderising/litestruts/LoginAction.java | 39 ++ .../leijing/coderising/litestruts/Struts.java | 134 ++++++ .../coderising/litestruts/StrutsTest.java | 44 ++ .../leijing/coderising/litestruts/View.java | 38 ++ .../leijing/coderising/litestruts/struts.xml | 11 + .../src/firstHomeWork/util/ArrayList.java | 197 ++++++++ .../firstHomeWork/util/BinaryTreeNode.java | 31 ++ .../firstHomeWork/util/DoubleLinkedList.java | 335 +++++++++++++ .../src/firstHomeWork/util/Iterator.java | 30 ++ .../src/firstHomeWork/util/List.java | 87 ++++ .../src/firstHomeWork/util/Queue.java | 59 +++ .../src/firstHomeWork/util/Stack.java | 22 + .../git\345\221\275\344\273\244.txt" | 11 + .../src/com/coding/basic/ArrayList.java | 68 +++ .../src/com/coding/basic/BinaryTreeNode.java | 58 +++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 149 ++++++ .../770164810/src/com/coding/basic/List.java | 9 + .../770164810/src/com/coding/basic/Queue.java | 22 + .../770164810/src/com/coding/basic/Stack.java | 23 + group07/group07.md | 1 + .../2-26/com/coding/basic/ArrayList.java | 119 +++++ .../2-26/com/coding/basic/BinaryTreeNode.java | 56 +++ .../2-26/com/coding/basic/Iterator.java | 9 + .../2-26/com/coding/basic/LinkedList.java | 174 +++++++ .../108621969/2-26/com/coding/basic/List.java | 12 + .../2-26/com/coding/basic/Queue.java | 33 ++ .../2-26/com/coding/basic/Stack.java | 40 ++ group08/108621969/README.md | 7 + .../article/Comp-Units-Relations(2-16).md | 14 + group08/1144989424/Readme.md | 3 + group08/1144989424/firstPractice/readme.md | 4 + .../src/basic/BinaryTreeNode.java | 49 ++ .../firstPractice/src/basic/MyArrayList.java | 97 ++++ .../firstPractice/src/basic/MyIterator.java | 7 + .../firstPractice/src/basic/MyLinkedList.java | 113 +++++ .../firstPractice/src/basic/MyList.java | 9 + .../firstPractice/src/basic/MyQueue.java | 31 ++ .../src/basic/MySortBinaryTree.java | 81 ++++ .../firstPractice/src/basic/MyStack.java | 33 ++ ...13\351\227\264\345\205\263\347\263\273.md" | 8 + .../0226/src/com/my/list/ArrayList.java | 131 +++++ .../0226/src/com/my/list/LinkedList.java | 156 ++++++ .../121027265/0226/src/com/my/list/Test.java | 65 +++ group08/121027265/README.md | 3 + group08/1226637491/2_26/ArrayList.java | 95 ++++ group08/1226637491/2_26/LinkedList.java | 127 +++++ group08/1226637491/2_26/Queue.java | 39 ++ group08/1226637491/2_26/Stack.java | 44 ++ ...0\347\232\204\347\275\221\345\235\200.txt" | 1 + group08/125980622/125980622.js | 1 + group08/125980622/first_hw/ArrayList.java | 44 ++ .../125980622/first_hw/BinaryTreeNode.java | 52 ++ group08/125980622/first_hw/Iterator.java | 4 + group08/125980622/first_hw/LinkedList.java | 90 ++++ group08/125980622/first_hw/List.java | 7 + group08/125980622/first_hw/Queue.java | 21 + group08/125980622/first_hw/Stack.java | 24 + group08/125980622/first_hw/myIterator.java | 37 ++ group08/1277959541/1277959541 | 1 + group08/1287324781/1287324781 | 1 + .../02-26/com/xuyangyang/util/BinaryTree.java | 65 +++ .../com/xuyangyang/util/MyArrayList.java | 113 +++++ .../02-26/com/xuyangyang/util/MyIterator.java | 8 + .../com/xuyangyang/util/MyLinkedList.java | 277 +++++++++++ .../02-26/com/xuyangyang/util/MyList.java | 14 + .../com/xuyangyang/util/MyQueueArray.java | 107 +++++ .../com/xuyangyang/util/MyQueueLinked.java | 139 ++++++ .../02-26/com/xuyangyang/util/MyStack.java | 95 ++++ .../02-26/com/xuyangyang/util/Test.java | 29 ++ ...4\347\232\204\345\205\263\347\263\273.txt" | 16 + ...6\200\345\215\225\346\246\202\350\277\260" | 1 + group08/1425809544/1425809544.md | 1 + group08/1509102580/2.27/ArrayList.java | 103 ++++ group08/1509102580/2.27/Iterator.java | 7 + group08/1509102580/2.27/LinkedList.java | 196 ++++++++ group08/1509102580/2.27/List.java | 9 + group08/1509102580/2.27/Queue.java | 33 ++ group08/1509102580/2.27/Stack.java | 38 ++ .../1509102580/2.27/\346\226\207\347\253\240" | 25 + group08/2420826330/2420826330.md | 1 + group08/283677872/2-26/.classpath | 6 + group08/283677872/2-26/.gitignore | 1 + group08/283677872/2-26/.project | 17 + ...\344\273\244\345\205\263\347\263\273.docx" | Bin 0 -> 865923 bytes .../2-26/src/com/coding/basic/ArrayList.java | 70 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../2-26/src/com/coding/basic/Iterator.java | 7 + .../2-26/src/com/coding/basic/LinkedList.java | 130 +++++ .../2-26/src/com/coding/basic/List.java | 9 + .../2-26/src/com/coding/basic/Main.java | 19 + .../2-26/src/com/coding/basic/Queue.java | 25 + .../2-26/src/com/coding/basic/Stack.java | 31 ++ ...72\346\234\254\347\273\223\346\236\204.md" | 54 +++ .../first/collection/AbstractCollection.java | 25 + .../homework/first/collection/Collection.java | 42 ++ .../homework/first/collection/Iterator.java | 23 + .../first/collection/list/ArrayList.java | 166 +++++++ .../first/collection/list/LinkedList.java | 240 ++++++++++ .../homework/first/collection/list/List.java | 14 + .../first/collection/queue/LinkQueue.java | 202 ++++++++ .../first/collection/queue/Queue.java | 26 + .../first/collection/stack/LinkStack.java | 94 ++++ .../first/collection/stack/Stack.java | 22 + .../homework/first/tree/AbstractTree.java | 29 ++ .../homework/first/tree/BinaryNode.java | 40 ++ .../homework/first/tree/BinaryTree.java | 125 +++++ .../practice/homework/first/tree/Tree.java | 30 ++ .../com/pop/practice/homework/utils/Math.java | 29 ++ group08/286060098/readme.md | 17 + group08/406166841/2-26/CPU.md | 76 +++ group08/406166841/2-26/CustomArrayList.java | 92 ++++ group08/406166841/2-26/CustomLinkedList.java | 172 +++++++ group08/406166841/2-26/CustomQueue.java | 51 ++ group08/406166841/2-26/CustomStack.java | 70 +++ group08/406166841/2-26/Iterator.java | 10 + group08/406166841/2-26/List.java | 13 + group08/406166841/406166841.md | 1 + .../com/coding/basic/ArrayList.java" | 92 ++++ .../com/coding/basic/BinaryTreeNode.java" | 32 ++ .../com/coding/basic/Iterator.java" | 7 + .../com/coding/basic/LinkedList.java" | 143 ++++++ .../com/coding/basic/List.java" | 9 + .../com/coding/basic/Queue.java" | 25 + .../com/coding/basic/Stack.java" | 30 ++ .../com/coding/basic/Test.java" | 15 + ...4\346\210\220\345\216\237\347\220\206.doc" | Bin 0 -> 10240 bytes ...4\347\232\204\345\205\263\347\263\273.pdf" | Bin 0 -> 63305 bytes .../2-26/code/com/coding/basic/ArrayList.java | 80 ++++ .../code/com/coding/basic/BinaryTreeNode.java | 47 ++ .../2-26/code/com/coding/basic/Iterator.java | 7 + .../code/com/coding/basic/LinkedList.java | 137 ++++++ .../2-26/code/com/coding/basic/List.java | 9 + .../2-26/code/com/coding/basic/Queue.java | 22 + .../2-26/code/com/coding/basic/Stack.java | 23 + .../2-26/code/com/coding/test/Main.java | 103 ++++ group08/619057560/CHHSAlex.md | 1 + group08/648354678/README.md | 4 + group08/649859235/2-26/article.md | 2 + .../2-26/com/vvv/base/ArrayList.java | 68 +++ .../2-26/com/vvv/base/BinaryTreeNode.java | 37 ++ .../649859235/2-26/com/vvv/base/IList.java | 9 + .../2-26/com/vvv/base/LinkedList.java | 117 +++++ .../649859235/2-26/com/vvv/base/Queue.java | 73 +++ .../649859235/2-26/com/vvv/base/Stack.java | 30 ++ group08/649859235/README.md | 1 + group08/729770920/.gitignore | 1 + group08/729770920/2-26/resource/report.txt | 5 + .../2-26/src/com/coding/basic/ArrayList.java | 225 +++++++++ .../2-26/src/com/coding/basic/BinaryTree.java | 105 ++++ .../2-26/src/com/coding/basic/Iterator.java | 9 + .../2-26/src/com/coding/basic/LinkedList.java | 164 +++++++ .../2-26/src/com/coding/basic/List.java | 19 + .../2-26/src/com/coding/basic/Queue.java | 21 + .../2-26/src/com/coding/basic/Stack.java | 25 + group08/729770920/README.md | 0 group08/769638826/2-27/ArrayList.java | 111 +++++ group08/769638826/2-27/ArrayListTest.java | 74 +++ group08/769638826/2-27/Iterator.java | 13 + group08/769638826/2-27/LinkedList.java | 190 ++++++++ group08/769638826/2-27/LinkedListTest.java | 10 + group08/769638826/2-27/List.java | 19 + group08/769638826/2-27/Queue.java | 26 + group08/769638826/2-27/QueueTest.java | 10 + group08/769638826/2-27/Stack.java | 32 ++ group08/769638826/2-27/StackTest.java | 9 + group08/769638826/README.md | 1 + group08/782476895/20170225/ArrayList.java | 55 +++ group08/782476895/20170225/LinkedList.java | 127 +++++ group08/782476895/20170225/List.java | 9 + group08/782476895/20170225/Queue.java | 65 +++ group08/782476895/20170225/Stack.java | 31 ++ ...\347\232\204\345\205\263\347\263\273.docx" | Bin 0 -> 6797 bytes group08/875325254/2-26/ArrayList.java | 37 ++ group08/875325254/2-26/LinkList.java | 73 +++ group08/875325254/2-26/Queue.java | 41 ++ group08/875325254/2-26/Stack.java | 29 ++ group08/875325254/2-26/Test.java | 35 ++ group08/875325254/875325254.md | 1 + group08/group08.md | 1 + group09/1271620150/Work01/.gitignore | 19 + .../src/com/coding/basic/ArrayList.java | 100 ++++ .../Work01/src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 277 +++++++++++ .../Work01/src/com/coding/basic/List.java | 9 + .../Work01/src/com/coding/basic/Queue.java | 44 ++ .../Work01/src/com/coding/basic/Stack.java | 45 ++ group09/277123057/Week01/ArrayList.java | 55 +++ group09/277123057/Week01/BinaryTreeNode.java | 26 + group09/277123057/Week01/Iterator.java | 6 + group09/277123057/Week01/LinkedList.java | 173 +++++++ group09/277123057/Week01/List.java | 9 + group09/277123057/Week01/Queue.java | 29 ++ group09/277123057/Week01/Stack.java | 30 ++ group09/277123057/Week01/Test.java | 9 + ...2\347\241\200\347\237\245\350\257\206.txt" | 9 + .../20170226/src/per/zyf/bds/ArrayList.java | 174 +++++++ .../20170226/src/per/zyf/bds/BinaryTree.java | 96 ++++ .../20170226/src/per/zyf/bds/LinkedList.java | 252 ++++++++++ .../20170226/src/per/zyf/bds/List.java | 55 +++ .../20170226/src/per/zyf/bds/Queue.java | 59 +++ .../20170226/src/per/zyf/bds/Stack.java | 71 +++ .../20170226-eulerlcs-collection/.gitignore | 1 + .../collection-aggregator/.project | 17 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../collection-aggregator/pom.xml | 13 + .../collection-aggregator/src/site/.gitkeep | 0 .../collection-lib/.classpath | 37 ++ .../collection-lib/.gitignore | 1 + .../collection-lib/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../collection-lib/pom.xml | 27 ++ .../com/eulerlcs/collection/ArrayList.java | 438 +++++++++++++++++ .../src/main/resources/.gitkeep | 0 .../eulerlcs/collection/TestArrayList.java | 44 ++ .../src/test/resources/.gitkeep | 0 .../collection-parent/.project | 17 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../collection-parent/pom.xml | 112 +++++ .../collection-parent/src/site/.gitkeep | 0 group09/601862675/Week01/pom.xml | 29 ++ .../Week01/src/main/java/ArrayList.java | 102 ++++ .../Week01/src/main/java/BinaryTree.java | 29 ++ .../Week01/src/main/java/Iterator.java | 7 + .../Week01/src/main/java/LinkedList.java | 128 +++++ .../601862675/Week01/src/main/java/List.java | 7 + .../601862675/Week01/src/main/java/Queue.java | 35 ++ .../601862675/Week01/src/main/java/Stack.java | 38 ++ .../Week01/src/main/java/Watcher.java | 26 + .../Week01/src/test/java/ArrayListTest.java | 104 ++++ .../Week01/src/test/java/LinkedListTest.java | 106 +++++ .../Week01/src/test/java/QueueTest.java | 44 ++ .../Week01/src/test/java/StackTest.java | 61 +++ group09/601862675/pom.xml | 16 + group09/715061147/.gitignore | 4 + group09/715061147/mvnhomework1/.gitignore | 4 + group09/715061147/mvnhomework1/pom.xml | 29 ++ .../main/java/com/qsq/study/ArrayList.java | 143 ++++++ .../main/java/com/qsq/study/LinkedList.java | 169 +++++++ .../src/main/java/com/qsq/study/List.java | 12 + .../java/com/qsq/study/ArrayListTest.java | 70 +++ .../java/com/qsq/study/LinkedListTest.java | 70 +++ .../src/com/coding/basic/Iterator.java | 7 + .../790466157/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/MyArrayList.java | 133 ++++++ .../src/com/coding/basic/MyLinkedList.java | 159 +++++++ .../790466157/src/com/coding/basic/Queue.java | 68 +++ .../790466157/src/com/coding/basic/Stack.java | 73 +++ group09/790466157/test.txt | 1 + group09/85839593/assignment-0215-0226/pom.xml | 15 + .../src/main/java/MyArrayList.java | 84 ++++ .../src/main/java/MyLinkedList.java | 99 ++++ .../src/main/java/MyQueue.java | 21 + .../src/main/java/MyStack.java | 30 ++ .../src/test/java/MyArrayListTest.java | 75 +++ .../src/test/java/MyLinkedListTest.java | 70 +++ .../src/test/java/MyQueueTest.java | 29 ++ .../src/test/java/MyStackTest.java | 36 ++ group09/85839593/pom.xml | 16 + group09/group09.md | 1 + .../struts/homework/homework/pom.xml | 23 + .../com/code/coderising/array/ArrayUtil.java | 318 +++++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../code/coderising/litestruts/Struts.java | 79 +++ .../coderising/litestruts/StrutsTest.java | 43 ++ .../com/code/coderising/litestruts/View.java | 23 + .../homework/src/main/resources/struts.xml | 11 + group10/1363044717/struts/homework/pom.xml | 23 + .../com/code/coderising/array/ArrayUtil.java | 318 +++++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../code/coderising/litestruts/Struts.java | 79 +++ .../coderising/litestruts/StrutsTest.java | 43 ++ .../com/code/coderising/litestruts/View.java | 23 + .../homework/src/main/resources/struts.xml | 11 + .../ArrayList.java" | 116 +++++ .../BinaryTreeNode.java" | 68 +++ .../Iterator.java" | 6 + .../JavaTest.java" | 62 +++ .../LinkedList.java" | 162 +++++++ .../List.java" | 10 + .../Queue.java" | 30 ++ .../Stack.java" | 30 ++ .../src/com/coding/week1/ArrayList.java | 96 ++++ .../src/com/coding/week1/BinaryTreeNode.java | 53 +++ .../src/com/coding/week1/Iterator.java | 6 + .../src/com/coding/week1/LinkedList.java | 162 +++++++ .../205301442/src/com/coding/week1/List.java | 9 + .../205301442/src/com/coding/week1/Queue.java | 23 + .../205301442/src/com/coding/week1/Stack.java | 28 ++ .../src/com/coding/week2/ArrayUtil.java | 199 ++++++++ .../src/com/coding/week2/ArrayUtilTest.java | 73 +++ .../coding/week2/litestruts/LoginAction.java | 34 ++ .../com/coding/week2/litestruts/Struts.java | 153 ++++++ .../coding/week2/litestruts/StrutsTest.java | 40 ++ .../src/com/coding/week2/litestruts/View.java | 23 + .../test/com/coding/week1/AllTests.java | 11 + .../test/com/coding/week1/TestArrayList.java | 31 ++ .../com/coding/week1/TestBiranyTreeNode.java | 21 + .../test/com/coding/week1/TestLinkedList.java | 42 ++ .../test/com/coding/week1/TestQueue.java | 17 + .../test/com/coding/week1/TestStack.java | 23 + ...7\347\253\240\345\234\260\345\235\200.txt" | 1 + .../DataStructure_One/.classpath" | 6 + .../DataStructure_One/.project" | 17 + .../.settings/org.eclipse.jdt.core.prefs" | 11 + .../src/list/ArrayList.java" | 236 +++++++++ .../DataStructure_One/src/list/Iterator.java" | 20 + .../src/list/LinkedList.java" | 211 ++++++++ .../DataStructure_One/src/list/List.java" | 32 ++ .../src/queue/ListQueue.java" | 56 +++ .../DataStructure_One/src/stack/Stack.java" | 31 ++ .../src/tree/BinaryTree.java" | 74 +++ group10/3314793852/.classpath | 6 + group10/3314793852/.gitignore | 1 + group10/3314793852/.project | 17 + group10/3314793852/second/.classpath | 7 + group10/3314793852/second/.gitignore | 1 + group10/3314793852/second/.project | 17 + .../org.eclipse.core.resources.prefs | 4 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/array/ArrayUtil.java | 236 +++++++++ .../second/src/com/coderising/array/Test.java | 63 +++ .../coderising/litestruts/DealWithInfo.java | 90 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../com/coderising/litestruts/SAXGetInfo.java | 42 ++ .../src/com/coderising/litestruts/Struts.java | 165 +++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../com/coderising/litestruts/struts.out.xml | 0 .../src/com/coderising/litestruts/struts.xml | 11 + .../3314793852/src/myList/MyArrayList.java | 103 ++++ .../src/myList/MyBinarySearchTree.java | 113 +++++ group10/3314793852/src/myList/MyIterator.java | 40 ++ .../3314793852/src/myList/MyLinkedList.java | 122 +++++ group10/3314793852/src/myList/MyQueue.java | 60 +++ group10/3314793852/src/myList/MyStack.java | 48 ++ group10/3314793852/src/myList/Test.java | 26 + group10/353261578/.classpath | 8 + group10/353261578/.gitignore | 1 + group10/353261578/.project | 17 + .../src/com/sx/structures/BinaryNode.java | 44 ++ .../src/com/sx/structures/BinaryTree.java | 74 +++ .../src/com/sx/structures/Iterator.java | 6 + .../src/com/sx/structures/MyArrayList.java | 83 ++++ .../src/com/sx/structures/MyLinkedList.java | 105 ++++ .../src/com/sx/structures/MyList.java | 13 + .../src/com/sx/structures/MyQueue.java | 25 + .../src/com/sx/structures/MyStack.java | 37 ++ .../test/com/test/BinaryTreeTest.java | 31 ++ .../test/com/test/MyArrayListTest.java | 64 +++ .../test/com/test/MyLinkedListTest.java | 83 ++++ .../353261578/test/com/test/StaQueTest.java | 44 ++ group10/364298692/article.md | 3 + group10/364298692/cs/.classpath | 6 + group10/364298692/cs/.gitignore | 1 + group10/364298692/cs/.project | 17 + .../cs/.settings/org.eclipse.jdt.core.prefs | 11 + .../cs/src/com/coding/basic/ArrayList.java | 75 +++ .../src/com/coding/basic/BinaryTreeNode.java | 41 ++ .../cs/src/com/coding/basic/Iterator.java | 7 + .../cs/src/com/coding/basic/LinkedList.java | 92 ++++ .../cs/src/com/coding/basic/List.java | 9 + .../cs/src/com/coding/basic/Queue.java | 23 + .../cs/src/com/coding/basic/Stack.java | 25 + group10/569420966/struct/pom.xml | 20 + .../main/java/com/litestruts/LoginAction.java | 39 ++ .../src/main/java/com/litestruts/Struts.java | 147 ++++++ .../src/main/java/com/litestruts/View.java | 23 + .../src/main/java/com/myutil/ArrayList.java | 162 +++++++ .../src/main/java/com/myutil/ArrayUtil.java | 257 ++++++++++ .../main/java/com/myutil/BinaryTreeNode.java | 167 +++++++ .../src/main/java/com/myutil/Iterator.java | 28 ++ .../main/java/com/myutil/JavaBeanUtil.java | 35 ++ .../src/main/java/com/myutil/LinkedList.java | 207 ++++++++ .../struct/src/main/java/com/myutil/List.java | 52 ++ .../src/main/java/com/myutil/Queue.java | 44 ++ .../src/main/java/com/myutil/Stack.java | 61 +++ .../struct/src/main/resources/struts.xml | 11 + .../java/com/litestruts/test/StrutsTest.java | 45 ++ group10/584709796/worka/.classpath | 7 + group10/584709796/worka/.gitignore | 1 + group10/584709796/worka/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../worka/src/com/coding/basic/ArrayList.java | 75 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../worka/src/com/coding/basic/DemoTest.java | 72 +++ .../worka/src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 168 +++++++ .../worka/src/com/coding/basic/List.java | 9 + .../worka/src/com/coding/basic/Queue.java | 24 + .../worka/src/com/coding/basic/ReadMe.txt | 11 + .../worka/src/com/coding/basic/Stack.java | 49 ++ ...46\214\207\344\273\244\343\200\201cpu.pdf" | Bin 0 -> 180260 bytes group10/595128841/Readme.txt | 1 + group10/595128841/src/org/le/b/ArrayUtil.java | 197 ++++++++ .../595128841/src/org/le/b/LoginAction.java | 35 ++ group10/595128841/src/org/le/b/Struts.java | 155 ++++++ .../595128841/src/org/le/b/StrutsTest.java | 38 ++ group10/595128841/src/org/le/b/View.java | 28 ++ .../595128841/src/org/le/list/ArrayList.java | 144 ++++++ .../595128841/src/org/le/list/LinkedList.java | 299 ++++++++++++ group10/595128841/src/org/le/list/List.java | 19 + group10/630505243/.classpath | 7 + group10/630505243/.gitignore | 1 + group10/630505243/.project | 17 + .../src/com/coderising/array/ArrayUtil.java | 238 ++++++++++ .../com/coderising/array/ArrayUtilTest.java | 97 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 136 ++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 112 +++++ .../src/com/coding/basic/ArrayListTest.java | 70 +++ .../src/com/coding/basic/BinaryTreeNode.java | 84 ++++ .../com/coding/basic/BinaryTreeNodeTest.java | 23 + .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 166 +++++++ .../src/com/coding/basic/LinkedListTest.java | 103 ++++ .../630505243/src/com/coding/basic/List.java | 9 + .../630505243/src/com/coding/basic/Queue.java | 46 ++ .../src/com/coding/basic/QueueTest.java | 46 ++ .../630505243/src/com/coding/basic/Stack.java | 58 +++ .../src/com/coding/basic/StackTest.java | 62 +++ .../com/hmily/learning/BinaryTreeNode.java | 31 ++ .../src/com/hmily/learning/Iterator.java | 7 + .../src/com/hmily/learning/LinkedList.java | 91 ++++ .../learning/src/com/hmily/learning/List.java | 8 + .../src/com/hmily/learning/MyArrayList.java | 91 ++++ .../src/com/hmily/learning/MyQueue.java | 23 + .../src/com/hmily/learning/MyStack.java | 26 + .../learning/src/com/hmily/test/MyTest.java | 9 + group10/875867419/.classpath | 9 + group10/875867419/.gitignore | 1 + group10/875867419/.project | 17 + .../src/com/work/week01/MyArrayList.java | 203 ++++++++ .../src/com/work/week01/MyBinaryTree.java | 82 ++++ .../src/com/work/week01/MyIterator.java | 6 + .../src/com/work/week01/MyLinkedList.java | 169 +++++++ .../875867419/src/com/work/week01/MyList.java | 11 + .../src/com/work/week01/MyQueue.java | 38 ++ .../src/com/work/week01/MyStack.java | 43 ++ ...4\344\270\232\345\234\260\345\235\200.txt" | 1 + .../src/com/work/week02/ArrayUtil.java | 198 ++++++++ .../src/com/work/week02/ArrayUtilTest.java | 67 +++ .../src/com/work/week02/LoginAction.java | 34 ++ .../875867419/src/com/work/week02/Struts.java | 111 +++++ .../src/com/work/week02/StrutsTest.java | 40 ++ .../src/com/work/week02/StrutsXmlDao.java | 49 ++ .../875867419/src/com/work/week02/View.java | 30 ++ .../875867419/src/com/work/week02/struts.xml | 11 + ...4\344\270\232\345\234\260\345\235\200.txt" | 1 + group10/904627477/.classpath | 21 + group10/904627477/.gitignore | 1 + group10/904627477/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.eclipse.m2e.core.prefs | 4 + group10/904627477/pom.xml | 40 ++ .../904627477/src/com/coding/ArrayList.java | 107 +++++ .../src/com/coding/BinaryTreeNode.java | 32 ++ .../904627477/src/com/coding/Iterator.java | 7 + .../904627477/src/com/coding/LinkedList.java | 175 +++++++ group10/904627477/src/com/coding/List.java | 9 + group10/904627477/src/com/coding/Queue.java | 28 ++ group10/904627477/src/com/coding/Stack.java | 36 ++ .../src/com/coding/array/ArrayUtil.java | 215 +++++++++ .../com/coding/litestruts/LoginAction.java | 39 ++ .../com/coding/litestruts/ReflectUtil.java | 145 ++++++ .../src/com/coding/litestruts/Struts.java | 106 +++++ .../src/com/coding/litestruts/StrutsTest.java | 43 ++ .../src/com/coding/litestruts/View.java | 23 + .../src/com/coding/litestruts/struts.xml | 11 + .../src/com/coding/test/ArrayListTest.java | 71 +++ .../src/com/coding/test/ArrayUtilTest.java | 128 +++++ .../src/com/coding/test/LinkedListTest.java | 118 +++++ .../src/com/coding/test/QueueTest.java | 53 +++ .../src/com/coding/test/StackTest.java | 61 +++ .../904627477/src/com/coding/test/Test.java | 29 ++ group10/group10.md | 1 + group11/1059156023/Array/.classpath | 6 + group11/1059156023/Array/.gitignore | 1 + group11/1059156023/Array/.project | 17 + .../Array/src/com/coding/basic/ArrayUtil.java | 158 ++++++ group11/1059156023/dataStructure/.classpath | 6 + group11/1059156023/dataStructure/.gitignore | 1 + group11/1059156023/dataStructure/.project | 17 + .../src/com/coding/basic/ArrayList.java | 71 +++ group11/1059156023/struts/.classpath | 8 + group11/1059156023/struts/.gitignore | 1 + group11/1059156023/struts/.project | 17 + .../src/com/coding/basic/LoginAction.java | 39 ++ .../struts/src/com/coding/basic/Struts.java | 59 +++ .../src/com/coding/basic/StrutsTest.java | 51 ++ .../struts/src/com/coding/basic/View.java | 23 + .../struts/src/com/coding/basic/struts.xml | 11 + group11/1178243325/DataStructure/build.gradle | 20 + group11/1178243325/DataStructure/readme.md | 1 + .../DataStructure/src/main/java/com/Main.java | 56 +++ .../java/com/coderising/array/ArrayUtil.java | 229 +++++++++ .../coderising/litestruts/.Struts.java.swp | Bin 0 -> 12288 bytes .../coderising/litestruts/LoginAction.java | 39 ++ .../com/coderising/litestruts/Struts.java | 62 +++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../java/com/coderising/litestruts/View.java | 23 + .../com/coderising/litestruts/XmlUtil.java | 59 +++ .../java/com/coderising/litestruts/struts.xml | 11 + .../main/java/com/coding/basic/ArrayList.java | 97 ++++ .../java/com/coding/basic/BinaryTreeNode.java | 33 ++ .../main/java/com/coding/basic/Iterator.java | 6 + .../java/com/coding/basic/LinkedList.java | 135 ++++++ .../src/main/java/com/coding/basic/List.java | 9 + .../src/main/java/com/coding/basic/Queue.java | 30 ++ .../src/main/java/com/coding/basic/Stack.java | 38 ++ .../ConcurrentModificationException.java | 9 + .../basic/exception/EmptyQueueException.java | 8 + .../basic/exception/EmptyStackException.java | 8 + .../src/main/resources/struts.xml | 11 + group11/1178243325/DataStructure/struts.xml | 11 + group11/1310368322/GitHub/.gitignore | 1 + group11/1310368322/GitHub/src/ArrayList.java | 79 +++ group11/1310368322/GitHub/src/testGitHub.java | 7 + group11/171535320/ArrayUtil.java | 211 ++++++++ group11/171535320/DataStruct/ArrayList.java | 64 +++ .../171535320/DataStruct/BinaryTreeNode.java | 45 ++ group11/171535320/DataStruct/Iterator.java | 12 + group11/171535320/DataStruct/LinkedList.java | 154 ++++++ group11/171535320/DataStruct/List.java | 9 + group11/171535320/stackANDqueue/Queue.java | 34 ++ group11/171535320/stackANDqueue/Stack.java | 52 ++ group11/252308879/dataStructure/.gitignore | 10 + group11/252308879/dataStructure/pom.xml | 35 ++ .../org/pan/coding2017/array/ArrayUtil.java | 282 +++++++++++ .../org/pan/coding2017/basic/ArrayList.java | 212 +++++++++ .../pan/coding2017/basic/BinaryTreeNode.java | 76 +++ .../org/pan/coding2017/basic/Iterator.java | 12 + .../org/pan/coding2017/basic/LinkedList.java | 121 +++++ .../java/org/pan/coding2017/basic/List.java | 24 + .../java/org/pan/coding2017/basic/Queue.java | 50 ++ .../java/org/pan/coding2017/basic/Stack.java | 51 ++ .../java/org/pan/coding2017/basic/Stack2.java | 47 ++ .../coding2017/parsingXML/LoginAction.java | 39 ++ .../org/pan/coding2017/parsingXML/Struts.java | 110 +++++ .../pan/coding2017/parsingXML/StrutsTest.java | 43 ++ .../org/pan/coding2017/parsingXML/View.java | 23 + .../org/pan/coding2017/utils/Dom4JUtil.java | 41 ++ .../org/pan/coding2017/utils/JaxpDomUtil.java | 152 ++++++ .../pan/coding2017/utils/JaxpSAXPUtil.java | 89 ++++ .../src/main/resources/struts.xml | 11 + .../pan/coding2017/TestJavaUtilArrayList.java | 31 ++ .../pan/coding2017/array/ArrayUtilTest.java | 89 ++++ .../pan/coding2017/basic/ArrayListTest.java | 74 +++ .../coding2017/basic/BinaryTreeNodeTest.java | 38 ++ .../pan/coding2017/basic/LinkedListTest.java | 80 ++++ .../org/pan/coding2017/basic/QueueTest.java | 44 ++ .../org/pan/coding2017/basic/StackTest.java | 45 ++ .../src/com/coderising/array/ArrayUtil.java | 303 ++++++++++++ .../com/coderising/array/ArrayUtilTest.java | 151 ++++++ .../src/com/coderising/litestruts/Action.java | 71 +++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 229 +++++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 113 +++++ .../src/com/coding/basic/ArrayListTest.java | 142 ++++++ .../src/com/coding/basic/BinaryTreeNode.java | 89 ++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 178 +++++++ .../283091182/src/com/coding/basic/List.java | 9 + .../283091182/src/com/coding/basic/Queue.java | 42 ++ .../283091182/src/com/coding/basic/Stack.java | 48 ++ group11/395443277/.gitignore | 111 +++++ .../src/com/coderising/array/ArrayUtil.java | 254 ++++++++++ .../com/coderising/array/ArrayUtilTest.java | 96 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 108 +++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 82 ++++ .../src/com/coding/basic/ArrayListTest.java | 84 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 75 +++ .../com/coding/basic/BinaryTreeNodeTest.java | 40 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 156 ++++++ .../src/com/coding/basic/LinkedListTest.java | 127 +++++ .../395443277/src/com/coding/basic/List.java | 9 + .../395443277/src/com/coding/basic/Queue.java | 21 + .../src/com/coding/basic/QueueTest.java | 29 ++ .../395443277/src/com/coding/basic/Stack.java | 23 + .../src/com/coding/basic/StackTest.java | 45 ++ group11/542194147/myDataStructure/.classpath | 8 + group11/542194147/myDataStructure/.gitignore | 1 + group11/542194147/myDataStructure/.project | 17 + .../src/com/coderising/array/ArrayUtil.java | 208 ++++++++ .../com/coderising/array/ArrayUtilTest.java | 66 +++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 94 ++++ .../com/coderising/litestruts/StrutsTest.java | 40 ++ .../src/com/coderising/litestruts/View.java | 24 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/MyArrayList.java | 133 ++++++ .../src/com/coding/basic/MyLinkedList.java | 194 ++++++++ .../src/com/coding/basic/MyList.java | 34 ++ .../src/com/coding/basic/MyQueue.java | 19 + .../src/com/coding/basic/MyStack.java | 25 + group11/635189253/dataStructure/.classpath | 6 + group11/635189253/dataStructure/.gitignore | 1 + group11/635189253/dataStructure/.project | 17 + .../src/com/coding/basic/ArrayList.java | 74 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 6 + .../src/com/coding/basic/LinkedList.java | 191 ++++++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 22 + .../src/com/coding/basic/Stack.java | 22 + .../src/main/coding_170225/ArrayList.java | 86 ++++ .../src/main/coding_170225/BinaryTree.java | 57 +++ .../main/coding_170225/BinaryTreeNode.java | 40 ++ .../src/main/coding_170225/Iterator.java | 9 + .../src/main/coding_170225/LinkedList.java | 113 +++++ .../src/main/coding_170225/Queue.java | 23 + .../src/main/coding_170225/Stack.java | 27 ++ .../src/main/coding_170302/ArrayUtil.java | 211 ++++++++ .../src/main/coding_170302/LoginAction.java | 38 ++ .../src/main/coding_170302/Struts.java | 108 +++++ .../src/main/coding_170302/View.java | 27 ++ .../src/main/coding_170302/struts.xml | 11 + .../main/coding_170225/ArrayListTest.java | 39 ++ .../main/coding_170225/BinaryTreeTest.java | 37 ++ .../main/coding_170302/ArrayUtilTest.java | 78 +++ .../tests/main/coding_170302/StrutsTest.java | 42 ++ group11/996108220/.classpath | 8 + group11/996108220/.gitignore | 1 + group11/996108220/.project | 17 + .../src/com/coderising/array/ArrayUtil.java | 194 ++++++++ .../com/coderising/array/ArrayUtilTest.java | 71 +++ .../src/com/coderising/litestruts/Action.java | 11 + .../coderising/litestruts/ActionConfig.java | 44 ++ .../coderising/litestruts/LoginAction.java | 40 ++ .../coderising/litestruts/LogoutAction.java | 35 ++ .../src/com/coderising/litestruts/Struts.java | 167 +++++++ .../com/coderising/litestruts/StrutsTest.java | 63 +++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 132 +++++ .../src/com/coding/basic/BinaryTree.java | 129 +++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 176 +++++++ .../996108220/src/com/coding/basic/List.java | 9 + .../996108220/src/com/coding/basic/Queue.java | 20 + .../996108220/src/com/coding/basic/Stack.java | 24 + group11/group11.md | 1 + group12/2258659044/readme.txt | 1 + .../src/com/coding/basic/ArrayList.java | 94 ++++ .../src/com/coding/basic/BinaryTree.java | 64 +++ .../src/com/coding/basic/BinaryTreeNode.java | 37 ++ .../src/com/coding/basic/Iterator.java | 8 + .../src/com/coding/basic/LinkedList.java | 137 ++++++ .../zj-2017/src/com/coding/basic/List.java | 10 + .../zj-2017/src/com/coding/basic/Queue.java | 26 + .../zj-2017/src/com/coding/basic/Stack.java | 28 ++ .../test/com/coding/basic/ArrayListTest.java | 109 +++++ .../test/com/coding/basic/BinaryTreeTest.java | 58 +++ .../test/com/coding/basic/LinkedListTest.java | 109 +++++ .../src/test/com/coding/basic/QueueTest.java | 64 +++ .../src/test/com/coding/basic/StackTest.java | 76 +++ group12/247565311/week1/ArrayList.java | 249 ++++++++++ group12/247565311/week1/Deque.java | 34 ++ group12/247565311/week1/Link.java | 5 + group12/247565311/week1/LinkedList.java | 266 +++++++++++ group12/247565311/week1/Stack.java | 39 ++ group12/251822722/ArrayList.java | 87 ++++ group12/251822722/BinaryTreeNode.java | 35 ++ group12/251822722/Iterator.java | 6 + group12/251822722/LinkedList.java | 51 ++ group12/251822722/List.java | 11 + group12/251822722/Queue.java | 38 ++ group12/251822722/Stack.java | 33 ++ group12/377401843/learning_1/.gitignore | 3 + .../com/guodong/datastructure/ArrayList.java | 171 +++++++ .../guodong/datastructure/BinaryTreeNode.java | 58 +++ .../com/guodong/datastructure/Iterator.java | 7 + .../com/guodong/datastructure/LinkedList.java | 285 +++++++++++ .../src/com/guodong/datastructure/List.java | 14 + .../src/com/guodong/datastructure/Queue.java | 21 + .../src/com/guodong/datastructure/Stack.java | 25 + .../datastructure/test/ArrayListTest.java | 135 ++++++ .../test/BinaryTreeNodeTest.java | 37 ++ .../datastructure/test/LinkedListTest.java | 143 ++++++ .../guodong/datastructure/test/QueueTest.java | 62 +++ .../guodong/datastructure/test/StackTest.java | 46 ++ group12/382266293/.classpath | 7 + group12/382266293/.gitignore | 1 + group12/382266293/.project | 17 + .../src/Collection/AbstractList.java | 43 ++ .../src/Collection/Concrete/ArrayList.java | 148 ++++++ .../Collection/Concrete/BinaryTreeNode.java | 126 +++++ .../src/Collection/Concrete/LinkedList.java | 196 ++++++++ .../src/Collection/Concrete/Queue.java | 84 ++++ .../src/Collection/Concrete/Stack.java | 106 +++++ .../382266293/src/Collection/Iterator.java | 7 + group12/382266293/src/Collection/List.java | 16 + .../src/TestCollection/AllTests.java | 11 + .../src/TestCollection/ArrayListTest.java | 173 +++++++ .../TestCollection/BinaryTreeNodeTest.java | 54 +++ .../src/TestCollection/LinkedListTest.java | 212 +++++++++ .../src/TestCollection/QueueTest.java | 98 ++++ .../src/TestCollection/StackTest.java | 129 +++++ group12/382266293/src/test.java | 15 + group12/382266293/src/util/Print.java | 14 + group12/382266293/src/util/TestUtil.java | 78 +++ group12/441908378/ArrayList.java | 50 ++ group12/441908378/BinaryTreeNode.java | 47 ++ group12/441908378/LinkedList.java | 121 +++++ group12/441908378/Queue.java | 39 ++ group12/441908378/Stack.java | 30 ++ .../src/com/coding/basic/ArrayList.java | 121 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 44 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 225 +++++++++ .../446031103/src/com/coding/basic/List.java | 9 + .../446031103/src/com/coding/basic/Queue.java | 68 +++ .../446031103/src/com/coding/basic/Stack.java | 81 ++++ group12/495473393/Coding/.gitignore | 1 + .../495473393/Coding/src/Base/ArrayList.java | 32 ++ .../Coding/src/Base/BinaryTreeNode.java | 32 ++ .../495473393/Coding/src/Base/Iterator.java | 7 + .../495473393/Coding/src/Base/LinkedList.java | 46 ++ group12/495473393/Coding/src/Base/List.java | 9 + group12/495473393/Coding/src/Base/Queue.java | 19 + group12/495473393/Coding/src/Base/Stack.java | 22 + group12/563253496/datastructure/.classpath | 6 + group12/563253496/datastructure/.gitignore | 1 + group12/563253496/datastructure/.project | 17 + .../src/Collection/ArrayList.java | 173 +++++++ .../src/Collection/LinkedList.java | 227 +++++++++ .../datastructure/src/Collection/Queue.java | 44 ++ .../datastructure/src/Collection/Stack.java | 55 +++ .../src/Collection/TestArrayList.java | 33 ++ .../src/Collection/TestStack.java | 15 + .../src/com/coding/basic/ArrayList.java | 32 ++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 46 ++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 19 + .../src/com/coding/basic/Stack.java | 22 + group12/group12.md | 1 + .../lesson01/src/com/hans/ArrayList.java | 128 +++++ .../lesson01/src/com/hans/BinaryTree.java | 10 + .../lesson01/src/com/hans/BinaryTreeNode.java | 32 ++ .../lesson01/src/com/hans/Iterator.java | 8 + .../lesson01/src/com/hans/LinkedList.java | 148 ++++++ .../lesson01/src/com/hans/List.java | 10 + .../lesson01/src/com/hans/Queue.java | 22 + .../lesson01/src/com/hans/Stack.java | 30 ++ ...44\346\274\253\346\270\270\350\256\260.md" | 1 + group13/1641296572/lesson1/.gitignore | 1 + .../src/com/coding/basic/ArrayList.java | 107 +++++ .../src/com/coding/basic/BinarySortTree.java | 66 +++ .../src/com/coding/basic/BinaryTreeNode.java | 41 ++ .../src/com/coding/basic/Iterator.java | 9 + .../src/com/coding/basic/LinkedList.java | 220 +++++++++ .../lesson1/src/com/coding/basic/List.java | 14 + .../lesson1/src/com/coding/basic/Queue.java | 28 ++ .../lesson1/src/com/coding/basic/Stack.java | 66 +++ .../L1/src/io/github/vxzh/ArrayList.java | 135 ++++++ .../L1/src/io/github/vxzh/BinaryTree.java | 68 +++ .../L1/src/io/github/vxzh/Iterator.java | 9 + .../L1/src/io/github/vxzh/LinkQueue.java | 57 +++ .../L1/src/io/github/vxzh/LinkedList.java | 138 ++++++ .../L1/src/io/github/vxzh/List.java | 22 + .../L1/src/io/github/vxzh/Queue.java | 15 + .../L1/src/io/github/vxzh/Stack.java | 41 ++ .../3.1/taskArtifacts/cache.properties | 1 + .../3.1/taskArtifacts/cache.properties.lock | Bin 0 -> 17 bytes .../.gradle/3.1/taskArtifacts/fileHashes.bin | Bin 0 -> 18697 bytes .../3.1/taskArtifacts/fileSnapshots.bin | Bin 0 -> 19567 bytes .../3.1/taskArtifacts/taskArtifacts.bin | Bin 0 -> 19703 bytes .../.gradle/3.3/taskArtifacts/fileHashes.bin | Bin 0 -> 25647 bytes .../3.3/taskArtifacts/fileSnapshots.bin | Bin 0 -> 244255 bytes .../3.3/taskArtifacts/taskArtifacts.bin | Bin 0 -> 87738 bytes .../3.3/taskArtifacts/taskArtifacts.lock | Bin 0 -> 17 bytes .../lesson1/data-structure/build.gradle | 28 ++ .../gradle/wrapper/gradle-wrapper.properties | 6 + .../2931408816/lesson1/data-structure/gradlew | 169 +++++++ .../lesson1/data-structure/gradlew.bat | 84 ++++ .../lesson1/data-structure/settings.gradle | 2 + .../java/cn/net/pikachu/basic/ArrayList.java | 97 ++++ .../cn/net/pikachu/basic/BinaryTreeNode.java | 60 +++ .../java/cn/net/pikachu/basic/Iterator.java | 7 + .../java/cn/net/pikachu/basic/LinkedList.java | 161 +++++++ .../main/java/cn/net/pikachu/basic/List.java | 9 + .../main/java/cn/net/pikachu/basic/Main.java | 17 + .../main/java/cn/net/pikachu/basic/Queue.java | 30 ++ .../main/java/cn/net/pikachu/basic/Stack.java | 33 ++ .../cn/net/pikachu/other/MyArrayList.java | 212 +++++++++ .../cn/net/pikachu/other/MyLinkedList.java | 449 ++++++++++++++++++ .../java/cn/net/pikachu/other/MyQueue.java | 7 + .../java/cn/net/pikachu/other/MyStack.java | 7 + .../java/cn/net/pikachu/other/MyTree.java | 7 + .../cn/net/pikachu/basic/ArrayListTest.java | 92 ++++ .../net/pikachu/basic/BinaryTreeNodeTest.java | 56 +++ .../cn/net/pikachu/basic/LinkedListTest.java | 116 +++++ .../java/cn/net/pikachu/basic/QueueTest.java | 57 +++ .../java/cn/net/pikachu/basic/StackTest.java | 105 ++++ group13/413007522/.gitignore | 1 + group13/413007522/lesson01/.gitignore | 1 + group13/413007522/lesson01/pom.xml | 7 + .../src/main/java/cn/xl/MyArrayList.java | 238 ++++++++++ .../src/main/java/cn/xl/MyLinkedList.java | 218 +++++++++ .../lesson01/src/main/java/cn/xl/MyList.java | 9 + .../lesson01/src/main/java/cn/xl/MyQueue.java | 110 +++++ .../lesson01/src/main/java/cn/xl/MyStack.java | 124 +++++ .../453070251/lessones01/BinaryTreeNode.java | 23 + group13/453070251/lessones01/LinkedList.java | 116 +++++ .../lessones01/LinkedListWithFloat.java | 86 ++++ group13/453070251/lessones01/Node.java | 32 ++ group13/453070251/lessones01/Queue.java | 40 ++ group13/453070251/lessones01/Stack.java | 40 ++ group13/568334413/0226/src/Main.java | 123 +++++ .../0226/src/com/coding/basic/ArrayList.java | 113 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 37 ++ .../0226/src/com/coding/basic/Iterator.java | 8 + .../0226/src/com/coding/basic/LinkedList.java | 170 +++++++ .../0226/src/com/coding/basic/List.java | 9 + .../0226/src/com/coding/basic/Queue.java | 27 ++ .../0226/src/com/coding/basic/Stack.java | 34 ++ .../0226/src/com/coding/basic/TreeSet.java | 40 ++ .../.settings/org.eclipse.jdt.core.prefs | 11 + .../lesson2/mytest/src/mytest/ArrayList.java | 86 ++++ .../lesson2/mytest/src/mytest/LinkedList.java | 116 +++++ .../lesson2/mytest/src/mytest/myMain.java | 50 ++ .../lesson2/mytest/src/mytest/readme.txt | 4 + .../771992096/src/com/java/gsl/ArrayList.java | 83 ++++ .../771992096/src/com/java/gsl/Iterator.java | 7 + .../src/com/java/gsl/LinkedList.java | 96 ++++ group13/771992096/src/com/java/gsl/List.java | 9 + group13/771992096/src/com/java/gsl/Queue.java | 20 + group13/771992096/src/com/java/gsl/Stack.java | 27 ++ group13/group13.md | 1 + group14/1091149131/2017JavaPro/.classpath | 8 + group14/1091149131/2017JavaPro/.gitignore | 1 + group14/1091149131/2017JavaPro/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/m0226/basic/ArrayList.java | 66 +++ .../src/com/m0226/basic/BinaryTree.java | 45 ++ .../src/com/m0226/basic/BinaryTreeNode.java | 69 +++ .../src/com/m0226/basic/Iterator.java | 7 + .../src/com/m0226/basic/LinkedList.java | 154 ++++++ .../2017JavaPro/src/com/m0226/basic/List.java | 9 + .../src/com/m0226/basic/Queue.java | 21 + .../src/com/m0226/basic/Stack.java | 26 + .../src/com/m0226/test/TestAPIDemo.java | 53 +++ .../src/com/m0226/test/TestAll.java | 71 +++ .../src/com/m0226/test/TestArrayList.java | 22 + .../src/com/m0226/test/TestMyDemo.java | 75 +++ .../src/com/m0305/array/ArrayUtil.java | 237 +++++++++ .../src/com/m0305/array/ArrayUtilTest.java | 84 ++++ .../src/com/m0305/lisestruts/LoginAction.java | 39 ++ .../src/com/m0305/lisestruts/Struts.java | 195 ++++++++ .../src/com/m0305/lisestruts/StrutsTest.java | 43 ++ .../src/com/m0305/lisestruts/View.java | 23 + .../src/com/m0305/lisestruts/struts.xml | 11 + .../2017JavaPro/src/com/util/Dom4JforXML.java | 67 +++ .../2017JavaPro/src/com/util/struts.xml | 11 + group14/1091149131/README.md | 7 + group14/187114392/work_1_20170225/.classpath | 6 + group14/187114392/work_1_20170225/.gitignore | 1 + group14/187114392/work_1_20170225/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + group14/187114392/work_1_20170225/ReadMe.md | 3 + .../187114392/work_1_20170225/src/Main.java | 31 ++ .../src/com/coding/basic/ArrayList.java | 73 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 168 +++++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 22 + .../src/com/coding/basic/Stack.java | 37 ++ .../work_1_20170225/test/ArrayList_Test.java | 52 ++ .../work_1_20170225/test/LinkedList_Test.java | 122 +++++ .../work_1_20170225/test/Queue_Test.java | 44 ++ .../work_1_20170225/test/Stack_Test.java | 72 +++ .../ArrayList.java" | 67 +++ .../LinkedList.java" | 128 +++++ .../Queue.java" | 25 + .../Stack.java" | 33 ++ ...7\347\253\240\351\223\276\346\216\245.txt" | 1 + group14/254659936/.gitignore | 11 + .../com/coderising/litestruts/struts.xml | 11 + group14/254659936/src/Main.java | 14 + .../src/com/coderising/array/ArrayUtil.java | 261 ++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 150 ++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 73 +++ .../src/com/coding/basic/BinaryTreeNode.java | 69 +++ .../src/com/coding/basic/Iterator.java | 8 + .../src/com/coding/basic/LinkedList.java | 155 ++++++ .../254659936/src/com/coding/basic/List.java | 13 + .../254659936/src/com/coding/basic/Queue.java | 45 ++ .../254659936/src/com/coding/basic/Stack.java | 50 ++ group14/296933284/Note/README.md | 5 + group14/296933284/README.md | 4 + group14/296933284/coding/.classpath | 10 + group14/296933284/coding/.gitignore | 6 + group14/296933284/coding/.project | 17 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/array/ArrayUtil.java | 228 +++++++++ .../com/coderising/array/ArrayUtilTest.java | 99 ++++ .../coderising/litestruts/LoginAction.java | 44 ++ .../src/com/coderising/litestruts/Struts.java | 141 ++++++ .../com/coderising/litestruts/StrutsTest.java | 41 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 147 ++++++ .../com/coding/basic/BinarySearchTree.java | 154 ++++++ .../coding/src/com/coding/basic/Iterator.java | 6 + .../coding/src/com/coding/basic/JavaTest.java | 176 +++++++ .../src/com/coding/basic/LinkedList.java | 215 +++++++++ .../coding/src/com/coding/basic/List.java | 9 + .../coding/src/com/coding/basic/Queue.java | 50 ++ .../coding/src/com/coding/basic/Stack.java | 61 +++ group14/352504906/test/.classpath | 6 + group14/352504906/test/.project | 17 + .../org.eclipse.core.resources.prefs | 6 + .../test/.settings/org.eclipse.jdt.core.prefs | 12 + .../src/com/coding/basic/SimpleArrayList.java | 118 +++++ .../src/com/coding/basic/SimpleIterator.java | 11 + .../com/coding/basic/SimpleLinkedList.java | 126 +++++ .../test/src/com/coding/basic/SimpleList.java | 14 + .../src/com/coding/basic/SimpleQueue.java | 68 +++ .../src/com/coding/basic/SimpleStack.java | 76 +++ ...4\347\232\204\345\205\263\347\263\273.txt" | 1 + group14/598808350/20170219.txt | 5 + .../src/org/comm/util/StringUtil.java | 30 ++ .../src/org/learning/container/ArrayList.java | 186 ++++++++ .../src/org/learning/container/ArrayUtil.java | 320 +++++++++++++ .../org/learning/container/LinkedList.java | 183 +++++++ .../src/org/learning/container/Queue.java | 47 ++ .../src/org/learning/container/Stack.java | 44 ++ .../src/org/lite/struts/LoginAction.java | 39 ++ .../src/org/lite/struts/ReadXML.java | 100 ++++ .../src/org/lite/struts/Struts.java | 99 ++++ .../2017project/src/org/lite/struts/View.java | 23 + .../src/org/lite/struts/struts.xml | 11 + .../org/learning/container/TestArrayUtil.java | 78 +++ .../test/org/lite/struts/TestStruts.java | 38 ++ .../test/org/test/all/TestAll.java | 24 + group14/630254746/Code2017/.classpath | 7 + group14/630254746/Code2017/.gitignore | 1 + group14/630254746/Code2017/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/leaning/code/ArrayList.java | 87 ++++ .../src/com/leaning/code/Iterator.java | 8 + .../src/com/leaning/code/LinkedList.java | 150 ++++++ .../Code2017/src/com/leaning/code/List.java | 15 + .../Code2017/src/com/leaning/code/Queue.java | 22 + .../Code2017/src/com/leaning/code/Stack.java | 31 ++ .../com/leaning/code/test/ArrayListTest.java | 37 ++ .../leaning/coderising/array/ArrayUtil.java | 95 ++++ .../coderising/litesturts/LoginAction.java | 42 ++ .../leaning/coderising/litesturts/Struts.java | 31 ++ .../leaning/coderising/litesturts/View.java | 23 + .../leaning/coderising/litesturts/struts.xml | 11 + group14/641013587/14_641013587/.classpath | 7 + group14/641013587/14_641013587/.gitignore | 1 + group14/641013587/14_641013587/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/ArrayList.java | 79 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 123 +++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 19 + .../src/com/coding/basic/Stack.java | 25 + .../src/com/coding/test/MyTest.java | 59 +++ .../641013587/RemoteSystemsTempFiles/.project | 12 + group14/676615845/algo/pom.xml | 18 + .../algo/src/main/java/algo/BinarySearch.java | 17 + .../src/main/java/com/coding/basic/Array.java | 16 + .../main/java/com/coding/basic/ArrayList.java | 73 +++ .../java/com/coding/basic/BinaryTreeNode.java | 41 ++ .../main/java/com/coding/basic/Iterator.java | 7 + .../java/com/coding/basic/LinkedList.java | 164 +++++++ .../src/main/java/com/coding/basic/List.java | 9 + .../src/main/java/com/coding/basic/Queue.java | 22 + .../src/main/java/com/coding/basic/Stack.java | 26 + .../src/test/java/algo/BinarySearchTest.java | 26 + .../java/com/coding/basic/ArrayListTest.java | 146 ++++++ .../test/java/com/coding/basic/ArrayTest.java | 30 ++ .../com/coding/basic/BinaryTreeNodeTest.java | 64 +++ .../java/com/coding/basic/LinkedListTest.java | 115 +++++ .../test/java/com/coding/basic/QueueTest.java | 58 +++ .../test/java/com/coding/basic/StackTest.java | 70 +++ group14/775857669/.gitignore | 2 + group14/775857669/pom.xml | 31 ++ .../src/com/coderising/array/ArrayUtil.java | 227 +++++++++ .../com/coderising/array/ArrayUtilTest.java | 75 +++ .../coderising/iterstruts/LoginAction.java | 36 ++ .../src/com/coderising/iterstruts/Struts.java | 101 ++++ .../com/coderising/iterstruts/StrutsTest.java | 40 ++ .../src/com/coderising/iterstruts/View.java | 23 + .../src/com/coderising/iterstruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 86 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 52 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/JUnitTest.java | 69 +++ .../src/com/coding/basic/LinkedList.java | 140 ++++++ .../775857669/src/com/coding/basic/List.java | 9 + .../775857669/src/com/coding/basic/Queue.java | 21 + .../775857669/src/com/coding/basic/Stack.java | 28 ++ group14/857999411/FirstHomework/.classpath | 7 + group14/857999411/FirstHomework/.gitignore | 1 + group14/857999411/FirstHomework/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/MyArrayList.java | 73 +++ .../src/com/coding/basic/MyLinkedList.java | 138 ++++++ .../src/com/coding/basic/MyList.java | 10 + .../src/com/coding/basic/MyQueue.java | 23 + .../src/com/coding/basic/MyStack.java | 44 ++ .../src/com/coding/test/MyArrayListTest.java | 34 ++ .../src/com/coding/test/MyLinkedListTest.java | 38 ++ .../src/com/coding/test/MyQueueTest.java | 25 + .../src/com/coding/test/MyStackTest.java | 25 + group14/857999411/SecondHomework/.classpath | 10 + group14/857999411/SecondHomework/.gitignore | 1 + group14/857999411/SecondHomework/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/array/ArrayUtil.java | 264 ++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 68 +++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + group14/864020162/.classpath | 6 + group14/864020162/.gitignore | 1 + group14/864020162/.project | 17 + .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 34 ++ .../src/com/coderising/litestruts/View.java | 23 + .../com/datastructure/basic/ArrayList.java | 32 ++ .../datastructure/basic/BinaryTreeNode.java | 32 ++ .../src/com/datastructure/basic/Iterator.java | 7 + .../com/datastructure/basic/LinkedList.java | 46 ++ .../src/com/datastructure/basic/List.java | 9 + .../src/com/datastructure/basic/Queue.java | 19 + .../src/com/datastructure/basic/Stack.java | 22 + .../src/com/datastructure/util/ArrayUtil.java | 96 ++++ group14/group14.md | 1 + .../src/com/coderising/array/ArrayUtil.java | 190 ++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 117 +++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 21 + .../src/com/coding/basic/ArrayList.java | 32 ++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 46 ++ .../2017code/src/com/coding/basic/List.java | 9 + .../2017code/src/com/coding/basic/Queue.java | 19 + .../2017code/src/com/coding/basic/Stack.java | 22 + .../src/com/coderising/array/ArrayUtil.java | 283 +++++++++++ .../com/coderising/array/ArrayUtilTest.java | 163 +++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 108 +++++ .../com/coderising/litestruts/StrutsTest.java | 44 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 77 +++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 163 +++++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 26 + .../src/com/coding/basic/Stack.java | 30 ++ .../myCollection/src/ArrayList.java | 99 ++++ .../myCollection/src/BinaryTreeNode.java | 70 +++ .../myCollection/src/Iterator.java | 5 + .../myCollection/src/LinkedList.java | 182 +++++++ .../myCollection/src/List.java | 7 + .../myCollection/src/Queue.java | 44 ++ .../myCollection/src/Stack.java | 53 +++ .../myCollection/test/BinaryTreeNodeTest.java | 21 + .../1503_1311822904/week2/src/ArrayUtil.java | 216 +++++++++ group15/1503_1311822904/week2/src/Struts.java | 112 +++++ .../week2/test/ArrayUtilTest.java | 114 +++++ .../1506_1084478979/.classpath | 7 + .../1506_1084478979/.gitignore | 1 + .../1506_1084478979/1506_1084478979/.project | 17 + .../org.eclipse.core.resources.prefs | 4 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../RemoteSystemsTempFiles/.project | 12 + .../src/RemoteSystemsTempFiles/.project | 12 + .../src/banshee/ArrayList.java | 70 +++ .../src/banshee/LinkedList.java | 155 ++++++ .../1506_1084478979/src/banshee/Queue.java | 20 + .../banshee/RemoteSystemsTempFiles/.project | 12 + .../1506_1084478979/src/banshee/Stack.java | 23 + .../src/banshee/WorkTwo/ArrayUtil.java | 165 +++++++ .../src/banshee/WorkTwo/ArrayUtilTest.java | 72 +++ .../RemoteSystemsTempFiles/.project | 12 + group15/1507_977996067/README.md | 1 + .../1507_977996067/src/task1/MyArrayList.java | 95 ++++ .../src/task1/MyLinkedList.java | 130 +++++ group15/1507_977996067/src/task1/MyList.java | 16 + group15/1507_977996067/src/task1/MyQueue.java | 25 + group15/1507_977996067/src/task1/MyStack.java | 29 ++ group15/1507_977996067/src/task1/README.md | 1 + group15/1507_977996067/src/task2/README.md | 3 + .../src/task2/array/ArrayUtil.java | 215 +++++++++ .../src/task2/array/ArrayUtilTest.java | 75 +++ .../src/task2/litestruts/LogOutAction.java | 34 ++ .../src/task2/litestruts/LoginAction.java | 34 ++ .../src/task2/litestruts/Struts.java | 80 ++++ .../src/task2/litestruts/StrutsTest.java | 39 ++ .../src/task2/litestruts/View.java | 33 ++ .../src/task2/litestruts/struts.xml | 11 + .../com/bruce/homework0226/ArrayListV00.java | 177 +++++++ .../src/com/bruce/homework0226/JuintTest.java | 141 ++++++ .../com/bruce/homework0226/LinkedListV00.java | 204 ++++++++ .../src/com/bruce/homework0226/QueueV00.java | 117 +++++ .../src/com/bruce/homework0226/StackV00.java | 144 ++++++ .../bruce/homework0305/array/ArrayUtil.java | 232 +++++++++ .../homework0305/array/JuintArrayUtil.java | 84 ++++ .../homework0305/mystruts/LoginAction.java | 39 ++ .../bruce/homework0305/mystruts/Struts.java | 81 ++++ .../homework0305/mystruts/StrutsTest.java | 61 +++ .../com/bruce/homework0305/mystruts/View.java | 23 + .../bruce/homework0305/mystruts/struts.xml | 11 + .../src/com/bruce/utils/MyException.java | 29 ++ .../com/coderising/litestruts/struts.xml | 11 + .../src/com/coderising/array/ArrayUtil.java | 183 +++++++ .../com/coderising/array/ArrayUtilTest.java | 76 +++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 113 +++++ .../com/coderising/litestruts/StrutsTest.java | 38 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 66 +++ .../com/coding/basic/BinarySearchTree.java | 318 +++++++++++++ .../coding/basic/BinarySearchTreeNode.java | 58 +++ .../src/com/coding/basic/Iterator.java | 6 + .../src/com/coding/basic/LinkedList.java | 157 ++++++ .../src/com/coding/basic/List.java | 16 + .../src/com/coding/basic/Queue.java | 37 ++ .../src/com/coding/basic/Stack.java | 35 ++ .../test/com/coding/basic/ArrayListTest.java | 74 +++ .../coding/basic/BinarySearchTreeTest.java | 113 +++++ .../test/com/coding/basic/LinkedListTest.java | 149 ++++++ .../src/test/com/coding/basic/QueueTest.java | 67 +++ .../src/test/com/coding/basic/StackTest.java | 59 +++ ...07\347\253\240\345\234\260\345\235\200.md" | 3 + group15/1512_656512403/1512_656512403.md | 1 + group15/1512_656512403/src/Iterator.java | 7 + group15/1512_656512403/src/List.java | 10 + group15/1512_656512403/src/Main.java | 7 + group15/1512_656512403/src/MyArrayList.java | 198 ++++++++ .../1512_656512403/src/MyBinaryTreeNode.java | 27 ++ group15/1512_656512403/src/MyLinkedList.java | 119 +++++ group15/1512_656512403/src/MyQuque.java | 35 ++ group15/1512_656512403/src/MyStack.java | 43 ++ group15/1513_121469918/HomeWork01/.classpath | 6 + group15/1513_121469918/HomeWork01/.gitignore | 1 + group15/1513_121469918/HomeWork01/.project | 17 + .../org.eclipse.core.resources.prefs | 8 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../HomeWork01/src/coding/ArrayList.java | 118 +++++ .../HomeWork01/src/coding/BinaryTreeNode.java | 53 +++ .../HomeWork01/src/coding/Iterator.java | 7 + .../HomeWork01/src/coding/LinkedList.java | 170 +++++++ .../HomeWork01/src/coding/List.java | 9 + .../HomeWork01/src/coding/Queue.java | 35 ++ .../HomeWork01/src/coding/Stack.java | 41 ++ .../HomeWork20170305/.classpath | 9 + .../1513_121469918/HomeWork20170305/.project | 17 + .../org.eclipse.core.resources.prefs | 9 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../bin/com/coderising/litestruts/struts.xml | 11 + .../src/com/coderising/array/ArrayUtil.java | 281 +++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 116 +++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 118 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 53 +++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 170 +++++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 35 ++ .../src/com/coding/basic/Stack.java | 41 ++ group15/1514_616019420/.classpath | 7 + group15/1514_616019420/.gitignore | 1 + group15/1514_616019420/.project | 17 + .../src/com/coderising/array/ArrayUtil.java | 205 ++++++++ .../com/coderising/array/ArrayUtilTest.java | 110 +++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 113 +++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 79 +++ .../src/com/coding/basic/BinaryTreeNode.java | 46 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 136 ++++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 23 + .../src/com/coding/basic/Stack.java | 24 + .../src/com/coding/basic/readme.txt | 0 group15/1515_337959725/.classpath | 7 + group15/1515_337959725/.gitignore | 1 + group15/1515_337959725/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/array/ArrayUtil.java | 184 +++++++ .../com/coderising/array/ArrayUtilTest.java | 90 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 135 ++++++ .../com/coderising/litestruts/StrutsTest.java | 44 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayListTest.java | 65 +++ .../src/com/coding/basic/BinaryTreeTest.java | 42 ++ .../src/com/coding/basic/IteratorTest.java | 6 + .../src/com/coding/basic/LinkedListTest.java | 100 ++++ .../src/com/coding/basic/ListTest.java | 9 + .../src/com/coding/basic/Queue.java | 27 ++ .../src/com/coding/basic/StackTest.java | 33 ++ .../src/com/coderising/array/ArrayUtil.java | 226 +++++++++ .../com/coderising/array/ArrayUtilTest.java | 60 +++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 102 ++++ .../com/coderising/litestruts/StrutsTest.java | 39 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/my/collection/linear/MyArrayList.java | 104 ++++ .../collection/linear/MyBinaryTreeNode.java | 83 ++++ .../src/my/collection/linear/MyIterator.java | 8 + .../my/collection/linear/MyLinkedList.java | 95 ++++ .../src/my/collection/linear/MyList.java | 14 + .../src/my/collection/linear/MyQueue.java | 26 + .../src/my/collection/linear/MyStack.java | 36 ++ .../linearTest/MyArrayListTest.java | 38 ++ .../linearTest/MyBinaryTreeNodeTest.java | 24 + .../linearTest/MyLinkedListTest.java | 32 ++ .../my/collection/linearTest/MyQueueTest.java | 25 + .../my/collection/linearTest/MyStackTest.java | 24 + .../linearTestJUnit/MyArrayListTest.java | 109 +++++ .../linearTestJUnit/MyBinaryTreeNodeTest.java | 61 +++ group15/1518_164377794/ArrayUtil.java | 203 ++++++++ group15/1519_137845093/.classpath | 6 + group15/1519_137845093/.gitignore | 1 + group15/1519_137845093/.project | 17 + .../3.5_homework/array/ArrayUtil.java | 210 ++++++++ .../ArrayList.java | 117 +++++ .../BinaryTreeNode.java | 32 ++ .../Iterator.java | 8 + .../LinkedList.java | 180 +++++++ .../src_1st_homework_1519_137845093/List.java | 9 + .../Queue.java | 29 ++ .../Stack.java | 39 ++ group15/1521_653895972/.gitignore | 3 + .../src/com/coding/basic/ArrayList.java | 150 ++++++ .../src/com/coding/basic/BasicTest.java | 184 +++++++ .../src/com/coding/basic/BinaryTreeNode.java | 105 ++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 271 +++++++++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 60 +++ .../src/com/coding/basic/Stack.java | 64 +++ .../coderising/array/ArrayUtilTest.java | 73 +++ .../coderising/array/SimpleArrayUtil.java | 250 ++++++++++ .../coderising/litestruts/LoginAction.java | 42 ++ .../coding/coderising/litestruts/Struts.java | 145 ++++++ .../coderising/litestruts/StrutsTest.java | 43 ++ .../coding/coderising/litestruts/View.java | 27 ++ .../coding/coderising/litestruts/struts.xml | 12 + group15/group15.md | 1 + .../1012075117/DataStructure219/.classpath | 6 + group16/1012075117/DataStructure219/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../com/stackwei/DataStructure/ArrayList.java | 94 ++++ .../stackwei/DataStructure/LinkedList.java | 194 ++++++++ .../src/com/stackwei/DataStructure/List.java | 13 + .../src/com/stackwei/DataStructure/Queue.java | 52 ++ .../src/com/stackwei/DataStructure/Stack.java | 59 +++ group16/1154151360/.classpath | 9 + group16/1154151360/.gitignore | 1 + group16/1154151360/.project | 17 + .../org.eclipse.core.resources.prefs | 2 + .../1154151360/src/com/array/ArrayUtil.java | 266 +++++++++++ .../src/com/array/ArrayUtilTest.java | 102 ++++ .../1154151360/src/com/list/ArrayList.java | 93 ++++ .../1154151360/src/com/list/LinkedList.java | 158 ++++++ group16/1154151360/src/com/list/Queue.java | 51 ++ group16/1154151360/src/com/list/Stack.java | 35 ++ .../src/com/litestruts/LoginAction.java | 40 ++ .../1154151360/src/com/litestruts/Struts.java | 139 ++++++ .../src/com/litestruts/StrutsTest.java | 51 ++ .../1154151360/src/com/litestruts/View.java | 23 + .../1154151360/src/com/litestruts/struts.xml | 11 + .../0226/src/com/coding/basic/ArrayList.java | 63 +++ .../0226/src/com/coding/basic/Iterator.java | 6 + .../0226/src/com/coding/basic/LinkedList.java | 101 ++++ .../0226/src/com/coding/basic/List.java | 9 + .../0226/src/com/coding/basic/Queue.java | 28 ++ .../0226/src/com/coding/basic/Stack.java | 38 ++ .../src/com/coderising/array/ArrayUtil.java | 205 ++++++++ .../coderising/litestruts/LoginAction.java | 41 ++ .../src/com/coderising/litestruts/Struts.java | 57 +++ .../com/coderising/litestruts/StrutsTest.java | 40 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + group16/1325756593/.classpath | 7 + group16/1325756593/.gitignore | 1 + group16/1325756593/.project | 17 + group16/1325756593/dongqihust.readme | 0 .../src/com/coderising/array/ArrayUtil.java | 273 +++++++++++ .../com/coderising/array/ArrayUtilTest.java | 80 ++++ .../src/com/coderising/litestruts/Action.java | 36 ++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 246 ++++++++++ .../com/coderising/litestruts/StrutsTest.java | 48 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/dong/week1/ArrayList.java | 109 +++++ .../src/com/dong/week1/ArrayListTest.java | 63 +++ .../src/com/dong/week1/BinaryTreeNode.java | 39 ++ .../src/com/dong/week1/Iterator.java | 7 + .../src/com/dong/week1/LinkedList.java | 208 ++++++++ .../1325756593/src/com/dong/week1/List.java | 9 + .../1325756593/src/com/dong/week1/Queue.java | 24 + .../1325756593/src/com/dong/week1/Stack.java | 31 ++ group16/1924332561/.classpath | 6 + group16/1924332561/.project | 17 + .../org.eclipse.core.resources.prefs | 2 + .../src/com/coding/basic/ArrayList.java | 41 ++ .../src/com/coding/basic/BinaryTreeNode.java | 29 ++ .../src/com/coding/basic/Iterator.java | 6 + .../src/com/coding/basic/LinkedList.java | 62 +++ .../1924332561/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 23 + .../src/com/coding/basic/Stack.java | 29 ++ group16/214074094/readme.txt | 1 + .../study/coderising/array/ArrayUtil.java | 213 +++++++++ .../coderising/litestruts/LoginAction.java | 42 ++ .../coderising/litestruts/LogoutAction.java | 39 ++ .../study/coderising/litestruts/Struts.java | 147 ++++++ .../coderising/litestruts/StrutsTest.java | 109 +++++ .../study/coderising/litestruts/View.java | 27 ++ .../coderising/litestruts/bean/Action.java | 43 ++ .../coderising/litestruts/bean/Result.java | 30 ++ .../java/study/coding/basic/ArrayList.java | 170 +++++++ .../study/coding/basic/BinaryTreeNode.java | 95 ++++ .../java/study/coding/basic/Iterator.java | 9 + .../java/study/coding/basic/LinkedList.java | 228 +++++++++ .../main/java/study/coding/basic/List.java | 16 + .../main/java/study/coding/basic/Queue.java | 36 ++ .../main/java/study/coding/basic/Stack.java | 37 ++ .../src/main/java/study/reading/blog.txt | 1 + .../214074094/src/main/resources/struts.xml | 11 + .../src/test/java/study/AbstractTest.java | 24 + .../java/study/coderising/ArrayUtilTest.java | 82 ++++ .../study/coding/basic/ArrayListTest.java | 82 ++++ .../coding/basic/BinaryTreeNodeTest.java | 33 ++ .../study/coding/basic/LinkedListTest.java | 64 +++ .../java/study/coding/basic/QueueTest.java | 63 +++ .../java/study/coding/basic/StackTest.java | 69 +++ .../2562124714/src/Test/ArrayListTest.java | 70 +++ .../src/Test/BinaryTreeNodeTest.java | 100 ++++ .../2562124714/src/Test/LinkedListTest.java | 81 ++++ group16/2562124714/src/Test/QueueTest.java | 58 +++ group16/2562124714/src/Test/StackTest.java | 57 +++ group16/2562124714/src/Test/TestRunner.java | 19 + .../src/com/coding/basic/ArrayList.java | 100 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 94 ++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 200 ++++++++ .../2562124714/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 24 + .../src/com/coding/basic/Stack.java | 34 ++ .../src/com/coding/basic/TestJunit.java | 17 + .../src/com/coding/basic/TestRunner.java | 25 + .../src/com/coding/basic/TreeData.java | 28 ++ group16/2816977791/.gitignore | 181 +++++++ .../src/com/coding/basic/ArrayList.java | 94 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 67 +++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 140 ++++++ .../src/com/coding/basic/List.java | 13 + .../src/com/coding/basic/Queue.java | 21 + .../src/com/coding/basic/Stack.java | 25 + .../src/com/coderising/array/ArrayUtil.java | 258 ++++++++++ .../com/coderising/litestruts/ActionXml.java | 37 ++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 150 ++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + group16/313001956/.classpath | 12 + group16/313001956/.gitignore | 1 + group16/313001956/.project | 36 ++ group16/313001956/.settings/.jsdtscope | 12 + .../.settings/org.eclipse.jdt.core.prefs | 7 + .../org.eclipse.wst.common.component | 8 + ....eclipse.wst.common.project.facet.core.xml | 9 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .../org.eclipse.wst.jsdt.ui.superType.name | 1 + .../313001956/WebContent/META-INF/MANIFEST.MF | 3 + .../src/com/coding/basic/ArrayList.java | 70 +++ .../src/com/coding/basic/LinkedList.java | 140 ++++++ .../313001956/src/com/coding/basic/Queue.java | 24 + .../313001956/src/com/coding/basic/Stack.java | 37 ++ group16/420355244/Homework1/.classpath | 7 + group16/420355244/Homework1/.gitignore | 1 + group16/420355244/Homework1/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/ArrayList.java | 91 ++++ .../src/com/coding/basic/ArrayListTest.java | 62 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 224 +++++++++ .../src/com/coding/basic/LinkedListTest.java | 112 +++++ .../Homework1/src/com/coding/basic/List.java | 9 + .../Homework1/src/com/coding/basic/Queue.java | 66 +++ .../src/com/coding/basic/QueueTest.java | 56 +++ .../Homework1/src/com/coding/basic/Stack.java | 39 ++ .../src/com/coding/basic/StackTest.java | 62 +++ group16/420355244/Homework2/.classpath | 8 + group16/420355244/Homework2/.gitignore | 1 + group16/420355244/Homework2/.project | 17 + .../com/coderising/action/LoginAction.java | 39 ++ .../src/com/coderising/array/ArrayUtil.java | 120 +++++ .../src/com/coderising/litestruts/Struts.java | 133 ++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + group16/502059278/.classpath | 8 + group16/502059278/.gitignore | 1 + group16/502059278/.project | 17 + .../src/cn/mark/work0219/MyArrayList.java | 144 ++++++ .../src/cn/mark/work0219/MyLinkedList.java | 67 +++ .../src/cn/mark/work0219/MyList.java | 32 ++ .../src/cn/mark/work0226/ArrayUtil.java | 166 +++++++ .../src/cn/mark/work0226/TestArrayUtil.java | 35 ++ .../mark/work0226/litestruts/LoginAction.java | 39 ++ .../cn/mark/work0226/litestruts/Struts.java | 84 ++++ .../mark/work0226/litestruts/StrutsTest.java | 43 ++ .../src/cn/mark/work0226/litestruts/View.java | 23 + .../cn/mark/work0226/litestruts/XMLUtils.java | 49 ++ group16/502059278/src/struts.xml | 11 + .../com/coderising/litestruts/struts.xml | 11 + .../coding/coderising/litestruts/struts.xml | 11 + .../src/net/coding/basic/ArrayList.java | 88 ++++ .../src/net/coding/basic/BinaryTreeNode.java | 62 +++ .../src/net/coding/basic/Iterator.java | 7 + .../src/net/coding/basic/LinkedList.java | 192 ++++++++ .../542087872/src/net/coding/basic/List.java | 9 + .../542087872/src/net/coding/basic/Queue.java | 22 + .../542087872/src/net/coding/basic/Stack.java | 25 + .../542087872/src/net/coding/basic/Test.java | 166 +++++++ .../coding/coderising/array/ArrayUtil.java | 203 ++++++++ .../coderising/array/ArrayUtilTest.java | 76 +++ .../coderising/litestruts/LoginAction.java | 39 ++ .../coderising/litestruts/LogoutAction.java | 36 ++ .../coding/coderising/litestruts/Struts.java | 126 +++++ .../coderising/litestruts/StrutsTest.java | 70 +++ .../coding/coderising/litestruts/View.java | 23 + .../coding/coderising/litestruts/struts.xml | 11 + group16/63912401/.classpath | 9 + group16/63912401/.gitignore | 1 + group16/63912401/.project | 17 + .../com/coderising/action/LoginAction.java | 45 ++ .../src/com/coderising/array/ArrayUtil.java | 270 +++++++++++ .../coderising/litestruts/ActionMapping.java | 68 +++ .../litestruts/ConfigurationManager.java | 83 ++++ .../coderising/litestruts/DefaultAction.java | 121 +++++ .../coderising/litestruts/ResultMapping.java | 48 ++ .../src/com/coderising/litestruts/Struts.java | 37 ++ .../com/coderising/litestruts/StrutsTest.java | 39 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 206 ++++++++ .../src/com/coding/basic/BinaryTreeNode.java | 99 ++++ .../src/com/coding/basic/Iterator.java | 8 + .../src/com/coding/basic/LinkedList.java | 320 +++++++++++++ .../63912401/src/com/coding/basic/List.java | 16 + .../63912401/src/com/coding/basic/Queue.java | 43 ++ .../63912401/src/com/coding/basic/Stack.java | 51 ++ .../63912401/src/com/coding/basic/Stack2.java | 51 ++ group16/932886072/djj/ArrayList.java | 64 +++ group16/932886072/djj/BinaryTreeNode.java | 34 ++ group16/932886072/djj/Iterator.java | 9 + group16/932886072/djj/LinkedList.java | 96 ++++ group16/932886072/djj/List.java | 12 + group16/932886072/djj/Queue.java | 27 ++ group16/932886072/djj/Stack.java | 27 ++ group16/group16.md | 1 + .../214074094/com/reading/blog_test.txt | 1 + group16/out/production/214074094/readme.txt | 1 + .../214074094/src/com/reading/blog_test.txt | 1 + group17/.gitignore | 21 + group17/102228177/work2_19/.classpath | 6 + group17/102228177/work2_19/.gitignore | 1 + group17/102228177/work2_19/.project | 17 + .../work2_19/src/data2_19/ArrayList.java | 148 ++++++ .../work2_19/src/data2_19/BinaryTreeNode.java | 74 +++ .../work2_19/src/data2_19/Iterator.java | 8 + .../work2_19/src/data2_19/LinkedList.java | 142 ++++++ .../102228177/work2_19/src/data2_19/List.java | 10 + .../work2_19/src/data2_19/Queue.java | 38 ++ .../work2_19/src/data2_19/Stack.java | 44 ++ group17/102228177/work2_26/.classpath | 8 + group17/102228177/work2_26/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/array/ArrayUtil.java | 202 ++++++++ .../com/coderising/litestruts/BeanUtil.java | 27 ++ .../com/coderising/litestruts/Dom4jUtil.java | 101 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 77 +++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + group17/1158154002/.classpath | 7 + group17/1158154002/.gitignore | 1 + group17/1158154002/.project | 17 + .../src/test01/arrayList/ArrayListTest.java | 34 ++ .../test01/arrayList/CetrinwArrayList.java | 124 +++++ .../src/test01/arrayList/CetrinwList.java | 43 ++ .../src/test01/linkedList/MyLinkedList.java | 172 +++++++ .../test01/linkedList/MyLinkedListTest.java | 37 ++ .../1158154002/src/test01/queue/Queue.java | 105 ++++ .../src/test01/queue/QueueTest.java | 41 ++ .../1158154002/src/test01/stack/MyStack.java | 111 +++++ group17/1158154002/src/test01/tree/Test.java | 20 + group17/1158154002/src/test01/tree/Tree.java | 56 +++ .../1158154002/src/test01/tree/TreeNode.java | 21 + .../src/test02/array/ArrayUtil.java | 241 ++++++++++ .../src/test02/litestruts/Action.java | 22 + .../src/test02/litestruts/LoginAction.java | 39 ++ .../src/test02/litestruts/Struts.java | 60 +++ .../src/test02/litestruts/StrutsTest.java | 39 ++ .../src/test02/litestruts/View.java | 23 + .../src/test02/litestruts/sax/SAXParser.java | 221 +++++++++ .../test02/litestruts/sax/SAXParserDemo.java | 76 +++ .../litestruts/sax/SAXParserHandler.java | 13 + .../src/test02/litestruts/struts.xml | 11 + .../test02/litestruts/util/StringUtil.java | 13 + .../src/com/coding/basic/MyArrayList.java | 41 ++ .../com/coding/basic/MyBinaryTreeNode.java | 30 ++ .../src/com/coding/basic/MyIterator.java | 6 + .../src/com/coding/basic/MyLinkedList.java | 45 ++ .../homework/src/com/coding/basic/MyList.java | 9 + .../src/com/coding/basic/MyQueue.java | 32 ++ .../src/com/coding/basic/MyStack.java | 34 ++ group17/1204187480/.gitignore | 21 + .../1204187480/code/homework/basic/pom.xml | 12 + .../main/java/com/coding/basic/ArrayList.java | 108 +++++ .../java/com/coding/basic/BinaryTreeNode.java | 32 ++ .../main/java/com/coding/basic/Iterator.java | 7 + .../java/com/coding/basic/LinkedList.java | 147 ++++++ .../src/main/java/com/coding/basic/List.java | 9 + .../src/main/java/com/coding/basic/Queue.java | 24 + .../src/main/java/com/coding/basic/Stack.java | 30 ++ .../java/com/coding/api/ArrayListTest.java | 25 + .../test/java/com/coding/api/ArraysTest.java | 22 + .../test/java/com/coding/api/SystemTest.java | 24 + .../java/com/coding/basic/ArrayListTest.java | 35 ++ .../code/homework/coderising/pom.xml | 32 ++ .../com/coderising/action/LoginAction.java | 39 ++ .../java/com/coderising/array/ArrayUtil.java | 252 ++++++++++ .../com/coderising/litestruts/Struts.java | 122 +++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../java/com/coderising/litestruts/View.java | 23 + .../litestruts/parser/ActionConfig.java | 45 ++ .../parser/DefaultStrutsParser.java | 52 ++ .../coderising/litestruts/parser/Result.java | 22 + .../litestruts/parser/StrutsConfig.java | 23 + .../litestruts/parser/StrutsParser.java | 8 + .../coderising/litestruts/util/BeanUtils.java | 144 ++++++ .../litestruts/util/StringUtils.java | 34 ++ .../coderising/src/main/resources/struts.xml | 11 + .../java/com/coderising/api/ComputeTest.java | 19 + .../java/com/coderising/api/CycleTest.java | 25 + .../com/coderising/array/ArrayUtilTest.java | 76 +++ .../litestruts/parser/StructsParserTest.java | 14 + .../1204187480/code/homework/parent/pom.xml | 95 ++++ group17/1204187480/code/homework/pom.xml | 15 + ...0\210\350\256\241\347\256\227\346\234\272" | 0 .../1264835468/src/assignment/BinaryTree.java | 154 ++++++ .../src/assignment/BinaryTreeNode.java | 58 +++ .../1264835468/src/assignment/Iterable.java | 6 + .../1264835468/src/assignment/Iterator.java | 7 + group17/1264835468/src/assignment/List.java | 14 + .../src/assignment/MyArrayList.java | 110 +++++ .../src/assignment/MyLinkedList.java | 144 ++++++ .../1264835468/src/assignment/MyQueue.java | 34 ++ .../1264835468/src/assignment/MyStack.java | 39 ++ .../src/assignment2_26/ArrayUtil.java | 183 +++++++ .../src/assignment2_26/ArrayUtilTest.java | 100 ++++ .../src/assignment2_26/LoginAction.java | 42 ++ .../1264835468/src/assignment2_26/Struts.java | 99 ++++ .../src/assignment2_26/StrutsTest.java | 38 ++ .../1264835468/src/assignment2_26/View.java | 26 + .../src/assignment2_26/XmlParser.java | 72 +++ group17/1264835468/src/struts.xml | 11 + group17/1282579502/.classpath | 7 + group17/1282579502/.gitignore | 1 + group17/1282579502/.project | 37 ++ .../.settings/org.eclipse.jdt.core.prefs | 12 + .../src/com/coderising/array/ArrayUtil.java | 229 +++++++++ .../coderising/array/ut/ArrayUtilTest.java | 97 ++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 219 +++++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coderising/parser/TestDriver.java | 22 + .../src/com/coderising/parser/XmlParser.java | 277 +++++++++++ .../src/com/coding/basic/ArrayList.java | 106 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 66 +++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 148 ++++++ .../1282579502/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 30 ++ .../src/com/coding/basic/Stack.java | 29 ++ .../com/coding/basic/ut/ArrayListTest.java | 121 +++++ .../coding/basic/ut/BinaryTreeNodeTest.java | 42 ++ .../com/coding/basic/ut/LinkedListTest.java | 162 +++++++ .../src/com/coding/basic/ut/QueueTest.java | 54 +++ .../src/com/coding/basic/ut/StackTest.java | 66 +++ group17/1540186032/First/src/ArrayList.java | 64 +++ .../1540186032/First/src/BinaryTreeNode.java | 31 ++ group17/1540186032/First/src/Iterator.java | 6 + group17/1540186032/First/src/LinkedList.java | 131 +++++ group17/1540186032/First/src/List.java | 8 + group17/1540186032/First/src/Queue.java | 23 + group17/1540186032/First/src/Stack.java | 28 ++ .../176653813/1766538130226Lesson/.classpath | 7 + .../176653813/1766538130226Lesson/.gitignore | 1 + .../176653813/1766538130226Lesson/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/ArrayList.java | 80 ++++ .../src/com/coding/basic/LinkList.java | 96 ++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 35 ++ .../src/com/coding/basic/Stack.java | 41 ++ .../src/com/coding/basic/Test.java | 36 ++ .../176653813/RemoteSystemsTempFiles/.project | 12 + group17/240094626/.gitignore | 45 ++ group17/240094626/warm-up/.gitignore | 4 + .../warm-up/src/com/array/ArrayUtil.java | 243 ++++++++++ .../src/com/coderising/litestruts/Struts.java | 165 +++++++ .../litestruts/exception/StrutsException.java | 61 +++ .../src/com/coderising/litestruts/struts.xml | 11 + .../coderising/litestruts/util/FileUtils.java | 25 + .../src/com/coding/basic/Iterator.java | 7 + .../warm-up/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/impl/ArrayList.java | 169 +++++++ .../src/com/coding/basic/impl/BinaryTree.java | 110 +++++ .../src/com/coding/basic/impl/LinkedList.java | 205 ++++++++ .../src/com/coding/basic/impl/Queue.java | 73 +++ .../src/com/coding/basic/impl/Stack.java | 86 ++++ .../com/coding/basic/test/ArrayListTest.java | 55 +++ .../com/coding/basic/test/LinkedListTest.java | 60 +++ .../src/com/coding/basic/test/QueueTest.java | 57 +++ .../src/com/coding/basic/test/StackTest.java | 71 +++ .../src/com/litestruts/LoginAction.java | 39 ++ .../warm-up/src/com/litestruts/Struts.java | 194 ++++++++ .../src/com/litestruts/StrutsTest.java | 57 +++ .../warm-up/src/com/litestruts/View.java | 28 ++ .../exception/StrutsRunActionException.java | 59 +++ .../exception/StrutsXMLLoaderException.java | 59 +++ .../warm-up/src/com/litestruts/struts.xml | 11 + .../src/com/coderising/array/ArrayUtil.java | 243 ++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 194 ++++++++ .../com/coderising/litestruts/StrutsTest.java | 57 +++ .../src/com/coderising/litestruts/View.java | 28 ++ .../exception/StrutsRunActionException.java | 59 +++ .../exception/StrutsXMLLoaderException.java | 59 +++ .../src/com/coderising/litestruts/struts.xml | 11 + group17/51075907/HomeWork/.classpath | 6 + group17/51075907/HomeWork/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../HomeWork/src/day1_HomeWork/ArrayList.java | 75 +++ .../src/day1_HomeWork/LinkedList.java | 103 ++++ .../HomeWork/src/day1_HomeWork/List.java | 9 + .../HomeWork/src/day1_HomeWork/Queue.java | 19 + .../HomeWork/src/day1_HomeWork/Stack.java | 23 + group17/516886559/ArrayList.java | 103 ++++ group17/516886559/BinaryTreeNode.java | 68 +++ group17/516886559/Iterator.java | 7 + group17/516886559/LinkedList.java | 150 ++++++ group17/516886559/List.java | 9 + group17/516886559/Queue.java | 30 ++ group17/516886559/Stack.java | 52 ++ .../785396327/2.26/binarytree/BinaryTree.java | 55 +++ .../2.26/binarytree/DLRSearchType.java | 16 + .../2.26/binarytree/LDRSearchType.java | 15 + .../2.26/binarytree/LFSearchType.java | 27 ++ .../2.26/binarytree/LRDSearchType.java | 15 + .../785396327/2.26/binarytree/SearchType.java | 9 + group17/785396327/2.26/list/ArrayList.java | 153 ++++++ group17/785396327/2.26/list/Iterator.java | 13 + group17/785396327/2.26/list/LinkedList.java | 173 +++++++ group17/785396327/2.26/list/List.java | 30 ++ group17/785396327/2.26/queue/Queue.java | 43 ++ group17/785396327/2.26/stack/Stack.java | 31 ++ group17/785396327/3.5/array/ArrayUtils.java | 112 +++++ .../785396327/3.5/array/ArrayUtilsTest.java | 86 ++++ group17/785396327/3.5/struts/LoginAction.java | 39 ++ .../785396327/3.5/struts/LoginActionTest.java | 36 ++ group17/785396327/3.5/struts/Struts.java | 88 ++++ group17/785396327/3.5/struts/StrutsUtils.java | 30 ++ group17/785396327/3.5/struts/View.java | 26 + group17/785396327/3.5/struts/struts.xml | 11 + group17/82427129/.gitignore | 16 + group17/82427129/JavaUtil/pom.xml | 32 ++ .../java/com/coderising/array/ArrayUtil.java | 343 +++++++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../com/coderising/litestruts/Struts.java | 149 ++++++ .../java/com/coderising/litestruts/View.java | 23 + .../main/java/com/coding/basic/ArrayList.java | 114 +++++ .../java/com/coding/basic/BinaryTreeNode.java | 32 ++ .../main/java/com/coding/basic/Iterator.java | 7 + .../java/com/coding/basic/LinkedList.java | 189 ++++++++ .../src/main/java/com/coding/basic/List.java | 25 + .../src/main/java/com/coding/basic/Queue.java | 21 + .../src/main/java/com/coding/basic/Stack.java | 32 ++ .../src/main/resources/liteStruts.xml | 11 + .../com/coderising/array/ArrayUtilTest.java | 80 ++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../java/com/coding/basic/ArrayListTest.java | 64 +++ .../java/com/coding/basic/LinkedListTest.java | 81 ++++ .../src/test/java/com/coding/basic/Test.java | 14 + group17/865797761/.classpath | 6 + group17/865797761/.gitignore | 1 + group17/865797761/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../865797761/src/Collection/ArrayList.java | 135 ++++++ .../865797761/src/Collection/Iterable.java | 6 + .../865797761/src/Collection/Iterator.java | 7 + group17/865797761/src/Collection/List.java | 14 + .../865797761/src/Collection/MyArrayList.java | 110 +++++ .../src/Collection/MyLinkedList.java | 144 ++++++ group17/865797761/src/Collection/MyQueue.java | 34 ++ group17/876385982/.classpath | 6 + group17/876385982/.gitignore | 1 + group17/876385982/.project | 17 + group17/876385982/src/test/Test.java | 10 + group17/article/20170226-20170305.md | 56 +++ group17/article/template.md | 56 +++ ...2\204\345\205\263\347\263\273_20170226.md" | 56 +++ group17/count/homework.md | 21 + group17/group17.md | 1 + group18/1049843090/.classpath | 10 + group18/1049843090/.gitignore | 7 + group18/1049843090/.project | 15 + .../src/com/coderising/array/ArrayUtil.java | 197 ++++++++ .../src/com/coding/basic/ArrayList.java | 148 ++++++ .../src/com/coding/basic/BinaryTree.java | 95 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 53 +++ .../src/com/coding/basic/Iterator.java | 26 + .../src/com/coding/basic/LinkedList.java | 238 ++++++++++ .../1049843090/src/com/coding/basic/List.java | 46 ++ .../src/com/coding/basic/Queue.java | 58 +++ .../src/com/coding/basic/Stack.java | 62 +++ .../test/com/coding/basic/ArrayListTest.java | 89 ++++ .../test/com/coding/basic/LinkedListTest.java | 129 +++++ .../test/com/coding/basic/QueueTest.java | 61 +++ .../test/com/coding/basic/StackTest.java | 67 +++ group18/1057617027/.classpath | 6 + group18/1057617027/.gitignore | 1 + group18/1057617027/.project | 17 + .../src/com/coding/basic/ArrayList.java | 77 +++ .../src/com/coding/basic/BinaryTreeNode.java | 73 +++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 145 ++++++ .../1057617027/src/com/coding/basic/List.java | 10 + .../src/com/coding/basic/Queue.java | 34 ++ .../src/com/coding/basic/Stack.java | 38 ++ .../src/basicStruct/BasicStruct.java | 11 + .../src/simpleArrayList/SimpleArrayList.java | 140 ++++++ .../simpleLinkedList/SimpleLinkedList.java | 197 ++++++++ .../src/simpleQueue/SimpleQueue.java | 22 + .../src/simpleStack/SimpleStack.java | 44 ++ group18/1159828430/20170219/.classpath | 8 + group18/1159828430/20170219/.gitignore | 1 + group18/1159828430/20170219/.project | 17 + .../src/com/coding/basic/ArrayList.java | 184 +++++++ .../src/com/coding/basic/Iterator.java | 12 + .../src/com/coding/basic/LinkedList.java | 274 +++++++++++ .../20170219/src/com/coding/basic/List.java | 13 + .../20170219/src/com/coding/basic/Queue.java | 31 ++ .../20170219/src/com/coding/basic/Stack.java | 57 +++ group18/1159828430/README.md | 2 + group18/1787597051/.classpath | 6 + group18/1787597051/.gitignore | 1 + group18/1787597051/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/MyArrayList.java | 75 +++ .../src/com/coding/basic/MyIterator.java | 6 + .../src/com/coding/basic/MyLinkedList.java | 125 +++++ .../src/com/coding/basic/MyList.java | 9 + .../src/com/coding/basic/MyQueue.java | 25 + .../src/com/coding/basic/MyStack.java | 33 ++ group18/542330964/.classpath | 7 + group18/542330964/.gitignore | 1 + group18/542330964/.project | 17 + .../542330964/src/basicstruct/ArrayList.java | 80 ++++ .../src/basicstruct/BinaryTreeNode.java | 31 ++ .../542330964/src/basicstruct/Iterator.java | 8 + .../542330964/src/basicstruct/LinkedList.java | 175 +++++++ group18/542330964/src/basicstruct/List.java | 13 + group18/542330964/src/basicstruct/Queue.java | 22 + group18/542330964/src/basicstruct/Stack.java | 24 + .../src/junittest/ArraylistTest.java | 52 ++ .../src/junittest/LinkedListTest.java | 65 +++ .../542330964/src/junittest/QueueTest.java | 33 ++ .../542330964/src/junittest/StackTest.java | 39 ++ .../564673292/com/coding/basic/ArrayList.java | 92 ++++ .../com/coding/basic/BinaryTreeNode.java | 72 +++ .../564673292/com/coding/basic/Iterable.java | 5 + .../564673292/com/coding/basic/Iterator.java | 7 + .../com/coding/basic/LinkedList.java | 123 +++++ group18/564673292/com/coding/basic/List.java | 9 + group18/564673292/com/coding/basic/Queue.java | 30 ++ group18/564673292/com/coding/basic/Stack.java | 50 ++ group18/744888802/dataStructure/pom.xml | 24 + .../main/java/com/coding/basic/ArrayList.java | 109 +++++ .../java/com/coding/basic/BinaryTreeNode.java | 84 ++++ .../main/java/com/coding/basic/Iterator.java | 7 + .../java/com/coding/basic/LinkedList.java | 237 +++++++++ .../src/main/java/com/coding/basic/List.java | 13 + .../src/main/java/com/coding/basic/Queue.java | 21 + .../src/main/java/com/coding/basic/Stack.java | 47 ++ .../main/java/com/coding/basic/TestMain.java | 29 ++ group18/784140710/week01/.gitignore | 4 + .../src/com/coding/basic/ArrayIterator.java | 27 ++ .../src/com/coding/basic/ArrayList.java | 84 ++++ .../src/com/coding/basic/BinaryTree.java | 65 +++ .../src/com/coding/basic/BinaryTreeNode.java | 66 +++ .../week01/src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 114 +++++ .../week01/src/com/coding/basic/List.java | 9 + .../week01/src/com/coding/basic/Queue.java | 21 + .../week01/src/com/coding/basic/Stack.java | 23 + .../week01/src/com/coding/test/Test01.java | 62 +++ .../src/com/coding/test/TestBinaryTree.java | 20 + ...64\347\232\204\345\205\263\347\263\273.md" | 41 ++ group18/935542673/Blog/README.md | 4 + group18/935542673/Coding/20170219/.classpath | 8 + group18/935542673/Coding/20170219/.gitignore | 1 + group18/935542673/Coding/20170219/.project | 17 + group18/935542673/Coding/20170219/README.md | 83 ++++ .../basic_data_structure/MyArrayListTest.java | 92 ++++ .../MyBinarySearchTreeTest.java | 64 +++ .../MyLinkedListTest.java | 131 +++++ .../basic_data_structure/MyQueueTest.java | 54 +++ .../basic_data_structure/MyStackTest.java | 55 +++ .../basic_data_structure/MyArrayList.java | 213 +++++++++ .../MyBinarySearchTree.java | 200 ++++++++ .../basic_data_structure/MyIterator.java | 14 + .../basic_data_structure/MyLinkedList.java | 359 ++++++++++++++ .../ikook/basic_data_structure/MyList.java | 22 + .../ikook/basic_data_structure/MyQueue.java | 42 ++ .../ikook/basic_data_structure/MyStack.java | 73 +++ group18/935542673/Coding/README.md | 3 + ...\347\232\204\351\227\256\351\242\230.docx" | Bin 0 -> 82125 bytes group18/935542673/README.md | 15 + group18/group18.md | 1 + group19/1294642551/.gitignore | 1 + group19/1294642551/readme.txt | 1 + .../1294642551/src/arrayTests/ArrayUtil.java | 270 +++++++++++ .../src/data_Structures/ArrayList.java | 57 +++ .../src/data_Structures/LinkedList.java | 125 +++++ .../1294642551/src/data_Structures/List.java | 9 + .../1294642551/src/data_Structures/Queue.java | 28 ++ .../1294642551/src/data_Structures/Stack.java | 29 ++ .../1294642551/src/struts_Reflect/Struts.java | 142 ++++++ .../test/arrayTests/ArrayUtilTest.java | 101 ++++ group19/1592562638/.gitignore | 9 + group19/1592562638/src/ArrayList_self.java | 126 +++++ .../1592562638/src/BinaryTreeNode_self.java | 71 +++ group19/1592562638/src/CollectionTest.java | 50 ++ group19/1592562638/src/KIList.java | 18 + group19/1592562638/src/LinkedList_self.java | 199 ++++++++ group19/1592562638/src/Name.java | 36 ++ group19/1592562638/src/Queue_self.java | 37 ++ group19/1592562638/src/Stack_self.java | 42 ++ .../com/coderising/action/LoginAction.java | 39 ++ .../com/coderising/action/LogoutAction.java | 6 + .../src/com/coderising/action/TestMain.java | 112 +++++ .../src/com/coderising/action/View.java | 22 + .../src/com/coderising/action/struts.xml | 11 + ...4\346\210\220\345\216\237\347\220\206.pdf" | Bin 0 -> 710498 bytes ...5\344\275\234\347\263\273\347\273\237.pdf" | Bin 0 -> 977169 bytes group19/2558178127/.gitignore | 9 + group19/2558178127/src/com/cn/kevin/Test.java | 5 + .../com/coderising/action/LoginAction.java | 39 ++ .../src/com/coderising/array/ArrayUtil.java | 189 ++++++++ .../src/com/coderising/litestruts/Struts.java | 71 +++ .../com/coderising/litestruts/StrutsTest.java | 53 +++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../litestruts/xml/read/XmlService.java | 88 ++++ .../src/com/coding/basic/ArrayList.java | 99 ++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 140 ++++++ .../2558178127/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 24 + .../src/com/coding/basic/Stack.java | 31 ++ .../376248270/0-20170215-20170226/README.md | 11 + .../arraylist/ArrayList.java | 97 ++++ .../arraylist/ArrayListTest.java | 57 +++ .../0-20170215-20170226/base/List.java | 8 + .../linkedlist/LinkedList.java | 25 + .../376248270/1-20170226-20170305/README.md | 8 + .../1-20170226-20170305/array/ArrayUtil.java | 231 +++++++++ .../com/coderising/action/LoginAction.java | 39 ++ .../1-20170226-20170305/struts/Struts.java | 245 ++++++++++ .../struts/StrutsTest.java | 43 ++ .../1-20170226-20170305/struts/View.java | 23 + .../1-20170226-20170305/struts/struts.xml | 11 + group19/376248270/README.md | 3 + group19/398129523/ArrayList | 88 ++++ group19/398129523/LinkedList | 46 ++ group19/398129523/Queue | 38 ++ group19/398129523/Stack | 36 ++ group19/527220084/xukai_coding/.gitignore | 19 + .../xukai_coding/coding-common/pom.xml | 109 +++++ .../org/xukai/coderising/array/ArrayUtil.java | 306 ++++++++++++ .../xukai/coderising/litestruts/Action.java | 41 ++ .../litestruts/BusinessException.java | 29 ++ .../coderising/litestruts/LoginAction.java | 39 ++ .../coderising/litestruts/LogoutAction.java | 39 ++ .../xukai/coderising/litestruts/Struts.java | 133 ++++++ .../coderising/litestruts/StrutsTest.java | 81 ++++ .../org/xukai/coderising/litestruts/View.java | 23 + .../xukai/coderising/util/ReflectUtil.java | 148 ++++++ .../xukai/coderising/util/XmlParseHelper.java | 44 ++ .../main/java/org/xukai/common/ArrayList.java | 102 ++++ .../java/org/xukai/common/BinaryTreeNode.java | 53 +++ .../main/java/org/xukai/common/Iterator.java | 7 + .../java/org/xukai/common/LinkedList.java | 163 +++++++ .../src/main/java/org/xukai/common/List.java | 9 + .../src/main/java/org/xukai/common/Queue.java | 27 ++ .../src/main/java/org/xukai/common/Stack.java | 34 ++ .../src/main/resources/struts.xml | 11 + .../java/org/xukai/common/ArrayListTest.java | 70 +++ .../org/xukai/common/BinaryTreeNodeTest.java | 28 ++ .../java/org/xukai/common/LinkedListTest.java | 91 ++++ .../test/java/org/xukai/common/QueueTest.java | 46 ++ .../test/java/org/xukai/common/StackTest.java | 52 ++ group19/527220084/xukai_coding/pom.xml | 429 +++++++++++++++++ ...4\347\233\230\346\214\207\344\273\244.txt" | 3 + .../main/java/com/coding/basic/ArrayList.java | 53 +++ .../java/com/coding/basic/BinaryTreeNode.java | 32 ++ .../main/java/com/coding/basic/Iterator.java | 7 + .../java/com/coding/basic/LinkedList.java | 143 ++++++ .../src/main/java/com/coding/basic/List.java | 9 + .../src/main/java/com/coding/basic/Queue.java | 52 ++ .../src/main/java/com/coding/basic/Stack.java | 43 ++ .../src/com/coderising/array/ArrayUtil.java | 218 +++++++++ .../coderising/litestruts/LoginAction.java | 39 ++ .../coderising/litestruts/StructsAction.java | 29 ++ .../src/com/coderising/litestruts/Struts.java | 91 ++++ .../coderising/litestruts/StrutsManager.java | 93 ++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 109 +++++ .../src/com/coding/basic/Iterator.java | 6 + .../src/com/coding/basic/LinkedList.java | 183 +++++++ .../src/com/coding/basic/List.java | 13 + .../src/com/coding/basic/Queue.java | 26 + .../src/com/coding/basic/Stack.java | 35 ++ group19/972815123/.classpath | 6 + group19/972815123/.project | 17 + .../.settings/org.eclipse.jdt.core.prefs | 11 + .../src/com/coderising/array/ArrayUtil.java | 221 +++++++++ .../coderising/litestruts/LoginAction.java | 45 ++ .../src/com/coderising/litestruts/Main.java | 9 + .../src/com/coderising/litestruts/Struts.java | 155 ++++++ .../com/coderising/litestruts/StrutsTest.java | 44 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coderising/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 106 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 52 ++ .../src/com/coding/basic/Iterator.java | 6 + .../src/com/coding/basic/LinkedList.java | 134 ++++++ .../972815123/src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/MainTest.java | 21 + .../972815123/src/com/coding/basic/Queue.java | 28 ++ .../972815123/src/com/coding/basic/Stack.java | 31 ++ group19/972815123/test.txt | 0 group19/976180558/.gitignore | 1 + .../src/com/coding/basic/ArrayList.java | 32 ++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 46 ++ .../976180558/src/com/coding/basic/List.java | 9 + .../976180558/src/com/coding/basic/Queue.java | 19 + .../976180558/src/com/coding/basic/Stack.java | 22 + group19/group19.md | 1 + group20/.gitignore | 43 ++ .../1040154728Learning/src/ArrayList.java | 46 ++ .../src/BinaryTreeNode.java | 28 ++ .../1040154728Learning/src/Iterator.java | 5 + .../1040154728Learning/src/LinkedList.java | 110 +++++ .../1040154728Learning/src/List.java | 8 + .../1040154728Learning/src/Queue.java | 22 + .../1040154728Learning/src/Stack.java | 21 + .../1040154728Learning/src/honoka.md | 5 + .../1107837739Learning/lib/dom4j-1.6.1.jar | Bin 0 -> 313898 bytes .../1107837739Learning/lib/fastjson-1.2.7.jar | Bin 0 -> 417221 bytes .../lib/hamcrest-core-1.3.jar | Bin 0 -> 45024 bytes .../1107837739Learning/lib/junit-4.12.jar | Bin 0 -> 314932 bytes .../src/org/korben/Main.java | 8 + .../korben/coderising/array/ArrayUtil.java | 258 ++++++++++ .../coderising/array/ArrayUtilTest.java | 185 ++++++++ .../coderising/litestruts/LoginAction.java | 41 ++ .../korben/coderising/litestruts/Struts.java | 111 +++++ .../coderising/litestruts/StrutsTest.java | 37 ++ .../korben/coderising/litestruts/View.java | 26 + .../litestruts/dom/StrutsAction.java | 27 ++ .../litestruts/util/StrutsParser.java | 82 ++++ .../coderising/litestruts/util/struts.xml | 11 + .../korben/coding/basic/list/KArrayList.java | 169 +++++++ .../korben/coding/basic/list/KIterator.java | 10 + .../korben/coding/basic/list/KLinkedList.java | 172 +++++++ .../org/korben/coding/basic/list/KList.java | 35 ++ .../coding/basic/list/KListIteratorTest.java | 36 ++ .../korben/coding/basic/list/KListTest.java | 142 ++++++ .../coding/basic/queue/KArrayQueue.java | 111 +++++ .../org/korben/coding/basic/queue/KQueue.java | 20 + .../korben/coding/basic/queue/KQueueTest.java | 78 +++ .../org/korben/coding/basic/stack/KStack.java | 72 +++ .../korben/coding/basic/stack/KStackTest.java | 71 +++ .../coding/basic/tree/BinaryTreeNode.java | 127 +++++ .../coding/basic/tree/BinaryTreeNodeTest.java | 59 +++ group20/1107837739/korben.md | 9 + .../src/GithubWork/ArrayList.java | 73 +++ .../src/GithubWork/JunitTest.java | 47 ++ .../src/GithubWork/LinkedList.java | 136 ++++++ .../src/GithubWork/List.java | 10 + .../src/GithubWork/Queue.java | 43 ++ .../src/GithubWork/Stack.java | 22 + ...6\207\347\253\240\345\234\260\345\235\200" | 1 + .../2421586846/DS/src/basic/ArrayList.java | 77 +++ .../DS/src/basic/BinaryTreeNode.java | 33 ++ group20/2421586846/DS/src/basic/Iterator.java | 7 + .../2421586846/DS/src/basic/LinkedList.java | 177 +++++++ group20/2421586846/DS/src/basic/List.java | 8 + group20/2421586846/DS/src/basic/Queue.java | 28 ++ group20/2421586846/DS/src/basic/Stack.java | 41 ++ group20/2421586846/DS/src/basic/Test.java | 108 +++++ .../code/dataStructures/ArrayListTest.java | 89 ++++ .../code/dataStructures/LinkedListTest.java | 35 ++ .../liven/code/dataStructures/QueueTest.java | 24 + .../liven/code/dataStructures/StackTest.java | 29 ++ .../liven/code/dataStructures/ArrayList.java | 102 ++++ .../liven/code/dataStructures/LinkedList.java | 123 +++++ .../wiki/liven/code/dataStructures/List.java | 15 + .../wiki/liven/code/dataStructures/Queue.java | 64 +++ .../wiki/liven/code/dataStructures/Stack.java | 62 +++ .../src/com/coding/basic/ArrayList.java | 122 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 148 ++++++ .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 30 ++ .../src/com/coding/basic/Stack.java | 37 ++ .../assignment2/src/array/ArrayUtil.java | 150 ++++++ .../src/litestruts/LoginAction.java | 39 ++ .../assignment2/src/litestruts/Struts.java | 76 +++ .../src/litestruts/StrutsTest.java | 44 ++ .../assignment2/src/litestruts/View.java | 23 + .../assignment2/src/litestruts/struts.xml | 11 + .../com/basic/datastructure/ArrayList.java | 110 +++++ .../com/basic/datastructure/LinkedList.java | 176 +++++++ .../src/com/basic/datastructure/List.java | 10 + .../src/com/basic/datastructure/Queue.java | 33 ++ .../src/com/basic/datastructure/Stack.java | 41 ++ .../com/basic/practice/PolymorphicInJava.java | 41 ++ .../com/basic/practice/ValuePassInJava.java | 44 ++ .../src/com/coderising/array/ArrayUtil.java | 155 ++++++ .../src/com/coderising/litestruts/Struts.java | 87 ++++ .../litestruts/action/LoginAction.java | 42 ++ .../src/com/coderising/litestruts/struts.xml | 11 + .../litestruts/test/StrutsTest.java | 43 ++ .../litestruts/utils/StrutsUtil.java | 76 +++ .../com/coderising/litestruts/view/View.java | 23 + ...5\232\345\256\242\345\234\260\345\235\200" | 1 + group20/423184723/src/basic/ArrayList.java | 78 +++ .../423184723/src/basic/BinaryTreeNode.java | 32 ++ group20/423184723/src/basic/Iterator.java | 7 + group20/423184723/src/basic/LinkedList.java | 146 ++++++ group20/423184723/src/basic/List.java | 9 + group20/423184723/src/basic/Queue.java | 29 ++ group20/423184723/src/basic/Stack.java | 35 ++ group20/452472201/.gitignore | 1 + .../src/com/coding/basic/ArrayList.java | 114 +++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 9 + .../src/com/coding/basic/LinkedList.java | 60 +++ .../452472201/src/com/coding/basic/List.java | 9 + .../452472201/src/com/coding/basic/Queue.java | 20 + .../452472201/src/com/coding/basic/Stack.java | 33 ++ ...2\345\256\242\351\223\276\346\216\245.txt" | 1 + .../src/org/wsc/array/ArrayUtil.java | 232 +++++++++ .../src/org/wsc/array/ArrayUtilTest.java | 98 ++++ .../src/org/wsc/litestruts/Action.java | 21 + .../src/org/wsc/litestruts/LoginAction.java | 39 ++ .../src/org/wsc/litestruts/Struts.java | 124 +++++ .../src/org/wsc/litestruts/StrutsTest.java | 43 ++ .../src/org/wsc/litestruts/View.java | 26 + .../org/wsc/litestruts/util/DocumentUtil.java | 69 +++ group20/592146505/coderising/src/struts.xml | 11 + .../wsc/exception/NullElementException.java | 23 + .../exception/RepeatingElementException.java | 23 + .../src/org/wsc/list/ArrayList.java | 234 +++++++++ .../src/org/wsc/list/Iterator.java | 21 + .../src/org/wsc/list/LinkedList.java | 316 ++++++++++++ .../src/org/wsc/list/List.java | 106 +++++ .../src/org/wsc/list/Queue.java | 42 ++ .../src/org/wsc/stack/Stack.java | 24 + .../src/org/wsc/tree_node/BinaryTreeNode.java | 166 +++++++ .../blogs/blog\345\234\260\345\235\200.txt" | 1 + ...0\344\273\266\347\220\206\350\247\243.txt" | 2 + .../week01/src/liuxincourse/ArrayList.java | 56 +++ .../week01/src/liuxincourse/LinkedList.java | 120 +++++ .../week01/src/liuxincourse/List.java | 10 + .../week01/src/liuxincourse/Queue.java | 25 + .../week01/src/liuxincourse/Stack.java | 27 ++ .../test/liuxincourse/ArrayListTest.java | 53 +++ .../test/liuxincourse/LinkedListTest.java | 69 +++ .../week01/test/liuxincourse/QueueTest.java | 27 ++ .../week01/test/liuxincourse/StackTest.java | 26 + .../week01/test/liuxincourse/SuiteTest.java | 14 + .../coderising/practice/array/ArrayUtil.java | 219 +++++++++ .../practice/array/ArrayUtisTest.java | 73 +++ .../practice/litestruts/LoginAction.java | 39 ++ .../practice/litestruts/Struts.java | 140 ++++++ .../practice/litestruts/StrutsHandler.java | 57 +++ .../practice/litestruts/StrutsTest.java | 53 +++ .../coderising/practice/litestruts/View.java | 23 + .../coderising/practice/litestruts/struts.xml | 11 + .../src/com/coding/basic/ArrayList.java | 87 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 152 ++++++ .../20170226/src/com/coding/basic/List.java | 9 + .../20170226/src/com/coding/basic/Queue.java | 44 ++ .../20170226/src/com/coding/basic/Stack.java | 23 + .../MyArrayList.java" | 136 ++++++ .../MyIterator.java" | 7 + .../MyList.java" | 16 + .../MyQueue.java" | 79 +++ .../MyStack.java" | 44 ++ .../MyTreeNode.java" | 99 ++++ .../SingleLinkedList.java" | 212 +++++++++ ...6\207\347\253\240\345\234\260\345\235\200" | 1 + .../PracticeOfData/ArrayUtil.java" | 213 +++++++++ .../PracticeOfData/ArrayUtilTest.java" | 100 ++++ .../Struts/LoginAction.java" | 34 ++ .../Struts/ReadXml.java" | 71 +++ .../Struts/Struts.java" | 93 ++++ .../Struts/StrutsTest.java" | 40 ++ .../Struts/View.java" | 28 ++ .../\346\226\207\347\253\240.txt" | 1 + group20/group20.md | 1 + group21/group21.md | 1 + group22/group22.md | 1 + group23/group23.md | 1 + group24/group24.md | 1 + group25/group25.md | 1 + group26/group26.md | 1 + group27/group27.md | 1 + .../src/com/coderising/array/ArrayUtil.java | 96 ++++ .../coderising/download/DownloadThread.java | 20 + .../coderising/download/FileDownloader.java | 73 +++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 27 ++ .../download/impl/ConnectionManagerImpl.java | 15 + 4116 files changed, 231629 insertions(+) create mode 100644 README.md create mode 100644 group01/1298552064/.classpath create mode 100644 group01/1298552064/.gitignore create mode 100644 group01/1298552064/.project create mode 100644 group01/1298552064/src/week01/basic/Iterator.java create mode 100644 group01/1298552064/src/week01/basic/List.java create mode 100644 group01/1298552064/src/week01/basic/MyArrayList.java create mode 100644 group01/1298552064/src/week01/basic/MyBinaryTreeNode.java create mode 100644 group01/1298552064/src/week01/basic/MyLinkedList.java create mode 100644 group01/1298552064/src/week01/basic/MyQueue.java create mode 100644 group01/1298552064/src/week01/basic/MyStack.java create mode 100644 group01/1298552064/src/week01/test/MyArrayListTest.java create mode 100644 group01/1298552064/src/week01/test/MyLinkedListTest.java create mode 100644 group01/1298552064/src/week01/test/MyQueueTest.java create mode 100644 group01/1298552064/src/week01/test/MyStackTest.java create mode 100644 group01/1298552064/src/week02/array/ArrayUtil.java create mode 100644 group01/1298552064/src/week02/litestruts/LoginAction.java create mode 100644 group01/1298552064/src/week02/litestruts/Struts.java create mode 100644 group01/1298552064/src/week02/litestruts/View.java create mode 100644 group01/1298552064/src/week02/litestruts/struts.xml create mode 100644 group01/1298552064/src/week02/test/ArrayUtilTest.java create mode 100644 group01/1298552064/src/week02/test/StrutsTest.java create mode 100644 group01/1328404806/RemoteSystemsTempFiles/.project create mode 100644 group01/1328404806/dataStructure/.classpath create mode 100644 group01/1328404806/dataStructure/.gitignore create mode 100644 group01/1328404806/dataStructure/.project create mode 100644 group01/1328404806/dataStructure/.settings/org.eclipse.core.resources.prefs create mode 100644 group01/1328404806/dataStructure/.settings/org.eclipse.jdt.core.prefs create mode 100644 group01/1328404806/dataStructure/.settings/org.eclipse.m2e.core.prefs create mode 100644 group01/1328404806/dataStructure/pom.xml create mode 100644 group01/1328404806/dataStructure/src/main/java/ListService/KILinkedList.java create mode 100644 group01/1328404806/dataStructure/src/main/java/ListService/KIList.java create mode 100644 group01/1328404806/dataStructure/src/main/java/ListService/KIQueueList.java create mode 100644 group01/1328404806/dataStructure/src/main/java/ListService/KIStackList.java create mode 100644 group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KArrayList.java create mode 100644 group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KLinkedList.java create mode 100644 group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KQueueList.java create mode 100644 group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KStackList.java create mode 100644 group01/1328404806/dataStructure/src/main/java/increaseLearning/dataStructure/App.java create mode 100644 group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/AppTest.java create mode 100644 group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/arrayListTest.java create mode 100644 group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/linkedListTest.java create mode 100644 group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/queueListTest.java create mode 100644 group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/stackListTest.java create mode 100644 group01/1664823950/.classpath create mode 100644 group01/1664823950/.gitignore create mode 100644 group01/1664823950/.project create mode 100644 group01/1664823950/src/com/coderising/array/ArrayUtil.java create mode 100644 group01/1664823950/src/com/coderising/litestruts/LoginAction.java create mode 100644 group01/1664823950/src/com/coderising/litestruts/Struts.java create mode 100644 group01/1664823950/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group01/1664823950/src/com/coderising/litestruts/View.java create mode 100644 group01/1664823950/src/com/coderising/litestruts/struts.xml create mode 100644 group01/1664823950/src/com/coding/basic/ArrayList.java create mode 100644 group01/1664823950/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group01/1664823950/src/com/coding/basic/Iterator.java create mode 100644 group01/1664823950/src/com/coding/basic/LinkedList.java create mode 100644 group01/1664823950/src/com/coding/basic/List.java create mode 100644 group01/1664823950/src/com/coding/basic/Queue.java create mode 100644 group01/1664823950/src/com/coding/basic/Stack.java create mode 100644 group01/1814014897/zhouhui/.classpath create mode 100644 group01/1814014897/zhouhui/.gitignore create mode 100644 group01/1814014897/zhouhui/.project create mode 100644 group01/1814014897/zhouhui/.settings/org.eclipse.jdt.core.prefs create mode 100644 group01/1814014897/zhouhui/src/.project create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/ArrayList.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/BinaryTreeNode.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/Iterator.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/LinkedList.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/List.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/Queue.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructure/Stack.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/AllTest.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/ArrayListTest.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/BinaryTreeNodeTest.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/LinkedListTest.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/QueueTest.java create mode 100644 group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/StackTest.java create mode 100644 group01/1814014897/zhouhui/src/week02/array/ArrayUtil.java create mode 100644 group01/1814014897/zhouhui/src/week02/array/ArrayUtilTest.java create mode 100644 group01/1814014897/zhouhui/src/week02/litestruts/LoginAction.java create mode 100644 group01/1814014897/zhouhui/src/week02/litestruts/Struts.java create mode 100644 group01/1814014897/zhouhui/src/week02/litestruts/StrutsTest.java create mode 100644 group01/1814014897/zhouhui/src/week02/litestruts/View.java create mode 100644 group01/1814014897/zhouhui/src/week02/litestruts/struts.xml create mode 100644 group01/1925347167/1925347167.md create mode 100644 group01/1925347167/Week1 Basic Data Structure/ArrayList.java create mode 100644 group01/1925347167/Week1 Basic Data Structure/BinaryTreeNode.java create mode 100644 group01/1925347167/Week1 Basic Data Structure/Iterator.java create mode 100644 group01/1925347167/Week1 Basic Data Structure/LinkedList.java create mode 100644 group01/1925347167/Week1 Basic Data Structure/List.java create mode 100644 group01/1925347167/Week1 Basic Data Structure/Queue.java create mode 100644 group01/1925347167/Week1 Basic Data Structure/Stack.java create mode 100644 group01/1925347167/Week1 Basic Data Structure/readme.md create mode 100644 group01/2137642225/work01/.classpath create mode 100644 group01/2137642225/work01/.gitignore create mode 100644 group01/2137642225/work01/.project create mode 100644 group01/2137642225/work01/README.md create mode 100644 group01/2137642225/work01/src/com/coding/mybasic/ArrayList.java create mode 100644 group01/2137642225/work01/src/com/coding/mybasic/BinaryTreeNode.java create mode 100644 group01/2137642225/work01/src/com/coding/mybasic/Iterator.java create mode 100644 group01/2137642225/work01/src/com/coding/mybasic/LinkedList.java create mode 100644 group01/2137642225/work01/src/com/coding/mybasic/List.java create mode 100644 group01/2137642225/work01/src/com/coding/mybasic/Queue.java create mode 100644 group01/2137642225/work01/src/com/coding/mybasic/Stack.java create mode 100644 group01/2137642225/work01/src/com/coding/test/TestArrayList.java create mode 100644 group01/2137642225/work01/src/com/coding/test/TestBinaryTreeNode.java create mode 100644 group01/2137642225/work01/src/com/coding/test/TestLinkedList.java create mode 100644 group01/2137642225/work01/src/com/coding/test/TestQueue.java create mode 100644 group01/2137642225/work01/src/com/coding/test/TestStack.java create mode 100644 group01/2137642225/work02/.classpath create mode 100644 group01/2137642225/work02/.gitignore create mode 100644 group01/2137642225/work02/.project create mode 100644 group01/2137642225/work02/.settings/org.eclipse.jdt.core.prefs create mode 100644 group01/2137642225/work02/README.md create mode 100644 group01/2137642225/work02/src/com/coderising/array/ArrayUtil.java create mode 100644 group01/2137642225/work02/src/com/coderising/litestruts/LoginAction.java create mode 100644 group01/2137642225/work02/src/com/coderising/litestruts/Struts.java create mode 100644 group01/2137642225/work02/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group01/2137642225/work02/src/com/coderising/litestruts/View.java create mode 100644 group01/2137642225/work02/src/com/coderising/litestruts/struts.xml create mode 100644 group01/2137642225/work02/src/com/coderising/test/ArrayUtilTest.java create mode 100644 group01/275150374/275150374Learning/src/task01/ArrayList.java create mode 100644 group01/275150374/275150374Learning/src/task01/LinkedList.java create mode 100644 group01/275150374/275150374Learning/src/task01/Main.java create mode 100644 group01/275150374/275150374Learning/src/task01/Queue.java create mode 100644 group01/275150374/275150374Learning/src/task01/Stack.java create mode 100644 group01/280646174/.gitignore create mode 100644 group01/280646174/280646174.md create mode 100644 group01/280646174/basic/pom.xml create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/array/ArrayUtil.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/ArrayList.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/BinaryTreeNode.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/Iterator.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/LinkedList.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/List.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/Queue.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/basic/Stack.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/litestruts/LoginAction.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/litestruts/Struts.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsDefinition.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsXmlUtil.java create mode 100644 group01/280646174/basic/src/main/java/com/coding2017/litestruts/View.java create mode 100644 group01/280646174/basic/src/main/resources/struts.xml create mode 100644 group01/280646174/basic/src/test/java/com/coding2017/array/ArrayUtilTest.java create mode 100644 group01/280646174/basic/src/test/java/com/coding2017/basic/ArrayListTest.java create mode 100644 group01/280646174/basic/src/test/java/com/coding2017/basic/BinaryTreeNodeTest.java create mode 100644 group01/280646174/basic/src/test/java/com/coding2017/basic/LinkedListTest.java create mode 100644 group01/280646174/basic/src/test/java/com/coding2017/basic/QueueTest.java create mode 100644 group01/280646174/basic/src/test/java/com/coding2017/basic/StackTest.java create mode 100644 group01/280646174/basic/src/test/java/com/coding2017/litestruts/StrutsTest.java create mode 100644 group01/280646174/pom.xml create mode 100644 group01/349209948/.gitignore create mode 100644 group01/349209948/src/week1_0226/ArrayList.java create mode 100644 group01/349209948/src/week1_0226/BinaryTreeNode.java create mode 100644 group01/349209948/src/week1_0226/Iterator.java create mode 100644 group01/349209948/src/week1_0226/LinkedList.java create mode 100644 group01/349209948/src/week1_0226/List.java create mode 100644 group01/349209948/src/week1_0226/Queue.java create mode 100644 group01/349209948/src/week1_0226/Stack.java create mode 100644 group01/360176196/.classpath create mode 100644 group01/360176196/.gitignore create mode 100644 group01/360176196/.project create mode 100644 group01/360176196/.settings/org.eclipse.core.resources.prefs create mode 100644 group01/360176196/src/xqfGit/dataStructure/ArrayList.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/BinaryTreeNode.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/Iterator.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/LinkedList.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/List.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/Queue.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/Stack.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/conderising/ArrayUtil.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/conderising/TestArrayUtil.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/litileStruts/LoginAction.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/litileStruts/Struts.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/litileStruts/StrutsTest.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/litileStruts/View.java create mode 100644 group01/360176196/src/xqfGit/dataStructure/litileStruts/struts.xml create mode 100644 group01/378213871/.classpath create mode 100644 group01/378213871/.gitignore create mode 100644 group01/378213871/.project create mode 100644 group01/378213871/src/com/coderising/week02/array/ArrayUtil.java create mode 100644 group01/378213871/src/com/coderising/week02/array/ArrayUtilTest.java create mode 100644 group01/378213871/src/com/coderising/week02/litestruts/LoginAction.java create mode 100644 group01/378213871/src/com/coderising/week02/litestruts/Struts.java create mode 100644 group01/378213871/src/com/coderising/week02/litestruts/StrutsTest.java create mode 100644 group01/378213871/src/com/coderising/week02/litestruts/View.java create mode 100644 group01/378213871/src/com/coderising/week02/litestruts/struts.xml create mode 100644 group01/378213871/src/com/coding/basic/week01/ArrayList.java create mode 100644 group01/378213871/src/com/coding/basic/week01/BinaryTreeNode.java create mode 100644 group01/378213871/src/com/coding/basic/week01/Iterator.java create mode 100644 group01/378213871/src/com/coding/basic/week01/LinkedList.java create mode 100644 group01/378213871/src/com/coding/basic/week01/List.java create mode 100644 group01/378213871/src/com/coding/basic/week01/Queue.java create mode 100644 group01/378213871/src/com/coding/basic/week01/Stack.java create mode 100644 group01/496740686/build.gradle create mode 100644 group01/496740686/gradle/wrapper/gradle-wrapper.properties create mode 100644 group01/496740686/gradlew create mode 100644 group01/496740686/gradlew.bat create mode 100644 group01/496740686/settings.gradle create mode 100644 group01/496740686/src/main/java/com/camile/App.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Impl/MyArraryList.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Impl/MyLinkedList.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Impl/MyQueue.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Impl/MyStack.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Interface/ArrayList.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Interface/BinaryTreeNode.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Interface/Iterator.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Interface/LinkedList.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Interface/List.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Interface/Queue.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/Interface/Stack.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/ex/MyArrest.java create mode 100644 group01/496740686/src/main/java/com/camile/_1/package-info.java create mode 100644 group01/496740686/src/main/java/com/camile/_2/array/ArrayUtil.java create mode 100644 group01/496740686/src/main/java/com/camile/_2/litestruts/LoginAction.java create mode 100644 group01/496740686/src/main/java/com/camile/_2/litestruts/Struts.java create mode 100644 group01/496740686/src/main/java/com/camile/_2/litestruts/View.java create mode 100644 group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Action.java create mode 100644 group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Result.java create mode 100644 group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Structs.java create mode 100644 group01/496740686/src/main/java/com/camile/_2/litestruts/bean/package-info.java create mode 100644 group01/496740686/src/main/java/com/camile/_2/package-info.java create mode 100644 group01/496740686/src/main/resources/struts.xml create mode 100644 group01/496740686/src/test/java/com/camile/AppTest.java create mode 100644 group01/496740686/src/test/java/com/camile/_2/StrutsTest.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/List.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/MyArrayList.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/MyLinkedList.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/MyQueue.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/MyStack.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/base/ArrayList.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/base/BinaryTreeNode.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/base/Iterator.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/base/LinkedList.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/base/List.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/base/Queue.java create mode 100644 group01/553624797/code2017/src/com/xxt/DataStructure/base/Stack.java create mode 100644 group01/751425278/.classpath create mode 100644 group01/751425278/.gitignore create mode 100644 group01/751425278/.project create mode 100644 group01/751425278/src/com/sanmubird/array/ArrayUtil.java create mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/ArrayList.java create mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/BinaryTreeNode.java create mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/Iterator.java create mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/LinkedList.java create mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/List.java create mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/Queue.java create mode 100644 group01/751425278/src/com/sanmubird/basicDataStructure/Stack.java create mode 100644 group01/751425278/src/com/sanmubird/litestruts/LoginAction.java create mode 100644 group01/751425278/src/com/sanmubird/litestruts/Struts.java create mode 100644 group01/751425278/src/com/sanmubird/litestruts/StrutsTest.java create mode 100644 group01/751425278/src/com/sanmubird/litestruts/View.java create mode 100644 group01/751425278/src/com/sanmubird/litestruts/struts.xml create mode 100644 group01/765324639/src/zavier/week01/basic/ArrayList.java create mode 100644 group01/765324639/src/zavier/week01/basic/BinaryTreeNode.java create mode 100644 group01/765324639/src/zavier/week01/basic/Iterator.java create mode 100644 group01/765324639/src/zavier/week01/basic/LinkedList.java create mode 100644 group01/765324639/src/zavier/week01/basic/List.java create mode 100644 group01/765324639/src/zavier/week01/basic/Queue.java create mode 100644 group01/765324639/src/zavier/week01/basic/Stack.java create mode 100644 group01/765324639/src/zavier/week01/test/AllTests.java create mode 100644 group01/765324639/src/zavier/week01/test/ArrayListTest.java create mode 100644 group01/765324639/src/zavier/week01/test/BinaryTreeNodeTest.java create mode 100644 group01/765324639/src/zavier/week01/test/LinkedListTest.java create mode 100644 group01/765324639/src/zavier/week01/test/QueueTest.java create mode 100644 group01/765324639/src/zavier/week01/test/StackTest.java create mode 100644 group01/765324639/src/zavier/week02/coderising/array/ArrayUtil.java create mode 100644 group01/765324639/src/zavier/week02/coderising/array/ArrayUtilTest.java create mode 100644 group01/765324639/src/zavier/week02/coderising/litestruts/LoginAction.java create mode 100644 group01/765324639/src/zavier/week02/coderising/litestruts/Struts.java create mode 100644 group01/765324639/src/zavier/week02/coderising/litestruts/StrutsTest.java create mode 100644 group01/765324639/src/zavier/week02/coderising/litestruts/View.java create mode 100644 group01/765324639/src/zavier/week02/coderising/litestruts/struts.xml create mode 100644 group01/819048836/lvxg2017/src/basic/BinaryTree.java create mode 100644 group01/819048836/lvxg2017/src/basic/BinaryTreeNode.java create mode 100644 group01/819048836/lvxg2017/src/basic/MyArrayList.java create mode 100644 group01/819048836/lvxg2017/src/basic/MyLinkedList.java create mode 100644 group01/819048836/lvxg2017/src/basic/Queue.java create mode 100644 group01/819048836/lvxg2017/src/basic/Stack.java create mode 100644 group01/819048836/lvxg2017/src/com/coderising/ArrayUtil.java create mode 100644 group01/819048836/lvxg2017/src/com/coderising/action/LoginAction.java create mode 100644 group01/819048836/lvxg2017/src/com/coderising/action/Struts.java create mode 100644 group01/819048836/lvxg2017/src/com/coderising/action/StrutsTest.java create mode 100644 group01/819048836/lvxg2017/src/com/coderising/action/View.java create mode 100644 group01/819048836/lvxg2017/src/com/coderising/action/struts.xml create mode 100644 group01/895457260/code/src/algorithm/ArrayUtil.java create mode 100644 group01/895457260/code/src/algorithm/test/ArrayUtilTest.java create mode 100644 group01/895457260/code/src/datastructure/basic/ArrayList.java create mode 100644 group01/895457260/code/src/datastructure/basic/BinarySortedTree.java create mode 100644 group01/895457260/code/src/datastructure/basic/BinaryTreeNode.java create mode 100644 group01/895457260/code/src/datastructure/basic/Iterator.java create mode 100644 group01/895457260/code/src/datastructure/basic/LinkedList.java create mode 100644 group01/895457260/code/src/datastructure/basic/List.java create mode 100644 group01/895457260/code/src/datastructure/basic/Queue.java create mode 100644 group01/895457260/code/src/datastructure/basic/Stack.java create mode 100644 group01/895457260/code/src/datastructure/exception/EmptyListException.java create mode 100644 group01/895457260/code/src/datastructure/exception/EmptyQueueException.java create mode 100644 group01/895457260/code/src/datastructure/test/ArrayListTest.java create mode 100644 group01/895457260/code/src/datastructure/test/BinarySortedTreeTest.java create mode 100644 group01/895457260/code/src/datastructure/test/LinkedListTest.java create mode 100644 group01/895457260/code/src/datastructure/test/QueueTest.java create mode 100644 group01/895457260/code/src/datastructure/test/StackTest.java create mode 100644 group01/895457260/code/src/datastructure/test/TestSuite.java create mode 100644 group01/895457260/code/src/litestruts/Struts.java create mode 100644 group01/895457260/code/src/litestruts/View.java create mode 100644 group01/895457260/code/src/litestruts/action/LoginAction.java create mode 100644 group01/895457260/code/src/litestruts/exception/XmlElementNotFoundException.java create mode 100644 group01/895457260/code/src/litestruts/struts.xml create mode 100644 group01/895457260/code/src/litestruts/test/StrutsTest.java create mode 100644 group01/895457260/journal/week1.md create mode 100644 group01/932573198/20170220/.classpath create mode 100644 group01/932573198/20170220/.gitignore create mode 100644 group01/932573198/20170220/.project create mode 100644 group01/932573198/20170220/.settings/org.eclipse.jdt.core.prefs create mode 100644 group01/932573198/20170220/src/com/coding/basic/ArrayList.java create mode 100644 group01/932573198/20170220/src/com/coding/basic/BinaryTree.java create mode 100644 group01/932573198/20170220/src/com/coding/basic/Iterator.java create mode 100644 group01/932573198/20170220/src/com/coding/basic/LinkedList.java create mode 100644 group01/932573198/20170220/src/com/coding/basic/List.java create mode 100644 group01/932573198/20170220/src/com/coding/basic/Queue.java create mode 100644 group01/932573198/20170220/src/com/coding/basic/Stack.java create mode 100644 group01/932573198/20170220/src/com/coding/test/ArrayListTest.java create mode 100644 group01/932573198/20170220/src/com/coding/test/BinaryTreeTest.java create mode 100644 group01/932573198/20170220/src/com/coding/test/IteratorTest.java create mode 100644 group01/932573198/20170220/src/com/coding/test/LinkedListTest.java create mode 100644 group01/932573198/20170220/src/com/coding/test/QueueTest.java create mode 100644 group01/932573198/20170220/src/com/coding/test/StackTest.java create mode 100644 group01/932573198/20170227/.classpath create mode 100644 group01/932573198/20170227/.gitignore create mode 100644 group01/932573198/20170227/.project create mode 100644 group01/932573198/20170227/.settings/org.eclipse.jdt.core.prefs create mode 100644 group01/932573198/20170227/src/com/coderising/array/ArrayUtil.java create mode 100644 group01/932573198/20170227/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group01/932573198/20170227/src/com/coderising/litestruts/LoginAction.java create mode 100644 group01/932573198/20170227/src/com/coderising/litestruts/Struts.java create mode 100644 group01/932573198/20170227/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group01/932573198/20170227/src/com/coderising/litestruts/View.java create mode 100644 group01/932573198/20170227/src/com/coderising/litestruts/struts.xml create mode 100644 group01/954958168/954958168.md create mode 100644 group01/954958168/class01/BasicDataStructure/.gitignore create mode 100644 group01/954958168/class01/BasicDataStructure/pom.xml create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/ArrayList.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/BinaryTree.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Iterator.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/LinkedList.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/List.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Queue.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Stack.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericArrayList.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericIterator.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericLinkedList.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericList.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericQueue.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericStack.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/AllTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/ArrayListTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/BinaryTreeTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/LinkListTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QueueTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericAllTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericArrayListTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericLinkedListTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericQueueTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericStackTest.java create mode 100644 group01/954958168/class02/ArrayUtil/pom.xml create mode 100644 group01/954958168/class02/ArrayUtil/src/main/java/com/aaront/exercise/ArrayUtil.java create mode 100644 group01/954958168/class02/ArrayUtil/src/test/java/com/aaront/execrise/ArrayUtilTest.java create mode 100644 group01/954958168/class02/LiteStruts/pom.xml create mode 100644 group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LiteStruts.java create mode 100644 group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/LoginAction.java create mode 100644 group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/View.java create mode 100644 group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Action.java create mode 100644 group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Result.java create mode 100644 group01/954958168/class02/LiteStruts/src/main/java/com/aaront/exercise/pojo/Structs.java create mode 100644 group01/954958168/class02/LiteStruts/src/main/resources/struts.xml create mode 100644 group01/954958168/class02/LiteStruts/src/test/java/com/aaront/exercise/StrutsTest.java create mode 100644 group01/group01.md create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/array/ArrayUtil.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/array/test/ArrayUtilTest.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/ArrayList.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/BinaryTreeNode.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Iterator.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/LinkedList.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/List.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Queue.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/Stack.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ArrayListTest.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/LinkedListTest.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/ListTest.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/QueueTest.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/basic/test/StackTest.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/LoginAction.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/Struts.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/StrutsTest.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/View.java create mode 100644 group02/106614649/106614649Learnin/src/com/github/Ven13/coding2017/litestruts/struts.xml create mode 100644 group02/106614649/106614649Learnin/src/struts.xml create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/ArrayList.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/BinaryTreeNode.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Iterator.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/LinkedList.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/List.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Queue.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/Stack.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ArrayListTest.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/LinkedListTest.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/ListTest.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/QueueTest.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/basic/test/StackTest.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/array/ArrayUtil.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/array/test/ArrayUtilTest.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/LoginAction.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/Struts.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/StrutsTest.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/View.java create mode 100644 group02/1554421063/src/com/github/FelixCJF/coding2017/coderising/litestruts/struts.xml create mode 100644 group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyArrayList.java create mode 100644 group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyLinkedList.java create mode 100644 group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyQueue.java create mode 100644 group02/435994736/src/main/java/com/github/lhpmatlab/coding2017/basic/MyStack.java create mode 100644 group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyArrayListTest.java create mode 100644 group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyLinkedListTest.java create mode 100644 group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyQueueTest.java create mode 100644 group02/435994736/src/test/java/com/github/lhpmatlab/coding2017/basic/MyStackTest.java create mode 100644 group02/527705641/.gitignore create mode 100644 group02/527705641/src/com/github/fei9009/coderising0226/array/ArrayUtil.java create mode 100644 group02/527705641/src/com/github/fei9009/coderising0226/array/ArrayUtilTest.java create mode 100644 group02/527705641/src/com/github/fei9009/coderising0226/litestruts/LoginAction.java create mode 100644 group02/527705641/src/com/github/fei9009/coderising0226/litestruts/Struts.java create mode 100644 group02/527705641/src/com/github/fei9009/coderising0226/litestruts/StrutsTest.java create mode 100644 group02/527705641/src/com/github/fei9009/coderising0226/litestruts/View.java create mode 100644 group02/527705641/src/com/github/fei9009/coderising0226/litestruts/struts.xml create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayList.java create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/ArrayListTest.java create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/BinaryTreeNode.java create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/Iterator.java create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/LinkedList.java create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/LinkedListTest.java create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/List.java create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/Queue.java create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/QueueTest.java create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/Stack.java create mode 100644 group02/527705641/src/com/github/fei9009/coding2017/basic/StackTest.java create mode 100644 group02/562768642/bin/com/github/orajavac/coding2017/litestructs/struts.xml create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/array/ArrayUtil.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/ArrayList.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/BinaryTreeNode.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/Iterator.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/LinkedList.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/List.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/Queue.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/Stack.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/litestructs/LoginAction.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/litestructs/Struts.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/litestructs/StrutsTest.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/litestructs/StrutsXml.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/litestructs/View.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/litestructs/struts.xml create mode 100644 group02/609990377/DataStructure/.gitignore create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/ArrayUtil.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WArrayList.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WBinaryTreeNode.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WIterator.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WLinkedList.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WList.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WQueue.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basic/WStack.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/ArrayUtilTest.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/TestRunner.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WArrayListTest.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WBinaryTreeNodeTest.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WLinkedListTest.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WQueueTest.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/WStackTest.java create mode 100644 group02/609990377/DataStructure/src/com/github/congcongcong250/coding2017/basicTest/testCase.java create mode 100644 group02/609990377/LiteStruts/.gitignore create mode 100644 group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/LoginAction.java create mode 100644 group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/Struts.java create mode 100644 group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/StrutsTest.java create mode 100644 group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/View.java create mode 100644 group02/609990377/LiteStruts/src/com/github/congcongcong250/coding2017/litestruts/struts.xml create mode 100644 group02/609990377/LiteStruts/src/struts.xml create mode 100644 group02/727171008/.gitignore create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtilTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/ArrayListTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/BinaryTreeNode.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/BinaryTreeNodeTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/Iterator.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/LinkedListTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/litestruts/struts.xml create mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Iterator.java create mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/List.java create mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyArrayList.java create mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyArrayListTest.java create mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyLinkedList.java create mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/MyLinkedListTest.java create mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Queue.java create mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/QueueTest.java create mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/Stack.java create mode 100644 group02/793337535/com/github/ZhoufeifeiJAVA/coding2017/basic/StackTest.java create mode 100644 group02/812350401/.gitignore create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/ArrayList.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/BinaryTreeNode.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/Iterator.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/IteratorImp.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/LinkedList.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/List.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/Queue.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/Stack.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ArrayListTest.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/BinaryTreeNodeTest.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/LinkedListTest.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/ListTest.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/QueueTest.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/basic/test/StackTest.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/coderising/array/ArrayUtil.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/coderising/array/test/ArrayUtilTest.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/LoginAction.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/LogoutAction.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/View.java create mode 100644 group02/812350401/src/com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml create mode 100644 group02/851113375/.gitignore create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/array/ArrayUtil.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/array/test/ArrayUtilTest.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/ArrayList.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/BinaryTreeNode.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Iterator.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/LinkedList.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/List.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Queue.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/Stack.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ArrayListTest.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/BinaryTreeNodeTest.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/LinkedListTest.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/ListTest.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/QueueTest.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/basic/test/StackTest.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/LoginAction.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/Struts.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/View.java create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/struts.xml create mode 100644 group02/851113375/src/com/github/eloiseSJTU/coding2017/litestruts/test/StrutsTest.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/array/ArrayUtil.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/array/ArrayUtilTest.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayList.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/ArrayListTest.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/Iterator.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedList.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/LinkedListTest.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/List.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/Queue.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/QueueTest.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/Stack.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/basic/StackTest.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/LoginAction.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/Struts.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/StrutsTest.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/View.java create mode 100644 group02/953840070/src/com/github/lqingchenl/coding2017/litestruts/struts.xml create mode 100644 group02/group02.md create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayList.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTree.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/BinaryTreeNode.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Iterator.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/LinkedList.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/List.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Queue.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/Stack.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayListTest.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/BinaryTreeTest.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/LinkedListTest.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/QueueTest.java" create mode 100644 "group03/1196051822/2\346\234\21026\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/StackTest.java" create mode 100644 "group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/ArrayUtil.java" create mode 100644 "group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/LoginAction.java" create mode 100644 "group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/Struts.java" create mode 100644 "group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/StrutsTest.java" create mode 100644 "group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/View.java" create mode 100644 "group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/src/liteStructs/struts.xml" create mode 100644 "group03/1196051822/3\346\234\21005\346\227\245\344\275\234\344\270\232\347\232\204\344\273\243\347\240\201/test/ArrayUtilTest.java" create mode 100644 group03/1196051822/readme.md create mode 100644 group03/1360464792/.gitignore create mode 100644 group03/1360464792/pom.xml create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coderising/array/ArrayUtil.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LoginAction.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/LogoutAction.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/Struts.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/StrutsAction.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coderising/liteststruts/View.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/ArrayList.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTree.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/BinaryTreeNode.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Iterator.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/LinkedList.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/List.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Queue.java create mode 100644 group03/1360464792/src/main/java/rui/study/coding2017/coding/basic/Stack.java create mode 100644 group03/1360464792/src/main/resources/struts.xml create mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/coderising/array/ArrayUtilTest.java create mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/coderising/liteststruts/StrutsTest.java create mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/ArrayListTest.java create mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/BinaryTreeTest.java create mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/LinkedListTest.java create mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/QueueTest.java create mode 100644 group03/1360464792/src/test/java/rui/study/coding2017/coding/basic/StackTest.java create mode 100644 group03/172487938/Iterator.java create mode 100644 group03/172487938/MyArrayList.java create mode 100644 group03/172487938/MyLinkedList.java create mode 100644 group03/172487938/MyList.java create mode 100644 group03/172487938/Queue.java create mode 100644 group03/172487938/Stack.java create mode 100644 group03/172487938/TestMyArrayList.java create mode 100644 group03/172487938/TestMyLinkedList.java create mode 100644 group03/1753176091/bin/.gitignore create mode 100644 group03/1753176091/src/com/coding/basic/ArrayList.java create mode 100644 group03/1753176091/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group03/1753176091/src/com/coding/basic/FileUtil.java create mode 100644 group03/1753176091/src/com/coding/basic/Iterator.java create mode 100644 group03/1753176091/src/com/coding/basic/LinkedList.java create mode 100644 group03/1753176091/src/com/coding/basic/List.java create mode 100644 group03/1753176091/src/com/coding/basic/Queue.java create mode 100644 group03/1753176091/src/com/coding/basic/Stack.java create mode 100644 group03/2864885311/DS/.classpath create mode 100644 group03/2864885311/DS/.gitignore create mode 100644 group03/2864885311/DS/.project create mode 100644 group03/2864885311/DS/.settings/org.eclipse.jdt.core.prefs create mode 100644 group03/2864885311/DS/src/com/coding/basic/ArrayList.java create mode 100644 group03/2864885311/DS/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group03/2864885311/DS/src/com/coding/basic/Iterator.java create mode 100644 group03/2864885311/DS/src/com/coding/basic/LinkedList.java create mode 100644 group03/2864885311/DS/src/com/coding/basic/List.java create mode 100644 group03/2864885311/DS/src/com/coding/basic/Queue.java create mode 100644 group03/2864885311/DS/src/com/coding/basic/Stack.java create mode 100644 group03/345943980/2017Learning/src/com/coding/basic/ArrayList.java create mode 100644 group03/345943980/2017Learning/src/com/coding/basic/BinaryTree.java create mode 100644 group03/345943980/2017Learning/src/com/coding/basic/Iterator.java create mode 100644 group03/345943980/2017Learning/src/com/coding/basic/LinkedList.java create mode 100644 group03/345943980/2017Learning/src/com/coding/basic/List.java create mode 100644 group03/345943980/2017Learning/src/com/coding/basic/Queue.java create mode 100644 group03/345943980/2017Learning/src/com/coding/basic/Stack.java create mode 100644 group03/345943980/2017Learning/src/com/coding/test/ArrayListTest.java create mode 100644 group03/345943980/2017Learning/src/com/coding/test/BinaryTreeTest.java create mode 100644 group03/345943980/2017Learning/src/com/coding/test/LinkedListTest.java create mode 100644 group03/345943980/2017Learning/src/com/coding/test/QueueTest.java create mode 100644 group03/345943980/2017Learning/src/com/coding/test/StackTest.java create mode 100644 group03/345943980/lite-struts-0226/pom.xml create mode 100644 group03/345943980/lite-struts-0226/src/main/java/com/coderising/array/ArrayUtil.java create mode 100644 group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/LoginAction.java create mode 100644 group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/Struts.java create mode 100644 group03/345943980/lite-struts-0226/src/main/java/com/coderising/litestruts/View.java create mode 100644 group03/345943980/lite-struts-0226/src/main/resources/struts.xml create mode 100644 group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/ArrayUtilTest.java create mode 100644 group03/345943980/lite-struts-0226/src/test/java/com/coderising/litestruts/StrutsTest.java create mode 100644 group03/510782645/.gitignore create mode 100644 group03/510782645/src/com/coding/basic/ArrayList.java create mode 100644 group03/510782645/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group03/510782645/src/com/coding/basic/Iterator.java create mode 100644 group03/510782645/src/com/coding/basic/LinkedList.java create mode 100644 group03/510782645/src/com/coding/basic/List.java create mode 100644 group03/510782645/src/com/coding/basic/Queue.java create mode 100644 group03/510782645/src/com/coding/basic/Stack.java create mode 100644 group03/569045298/pom.xml create mode 100644 group03/569045298/src/main/com/coderising/array/ArrayUtil.java create mode 100644 group03/569045298/src/main/com/coderising/litestruts/LoginAction.java create mode 100644 group03/569045298/src/main/com/coderising/litestruts/LogoutAction.java create mode 100644 group03/569045298/src/main/com/coderising/litestruts/Struts.java create mode 100644 group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Action.java create mode 100644 group03/569045298/src/main/com/coderising/litestruts/StrutsBean/Result.java create mode 100644 group03/569045298/src/main/com/coderising/litestruts/View.java create mode 100644 group03/569045298/src/main/com/coderising/litestruts/struts.xml create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/BinaryTreeNode.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/Iterator.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/List.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/Queue.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/Stack.java create mode 100644 group03/569045298/src/test/coderising/array/ArrayUtilTest.java create mode 100644 group03/569045298/src/test/coderising/litestruts/StrutsTest.java create mode 100644 group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java create mode 100644 group03/58555264/pom.xml create mode 100644 group03/58555264/src/main/java/com/circle/algorithm/ArrayUtil.java create mode 100644 group03/58555264/src/main/java/com/circle/algorithm/Reverse.java create mode 100644 group03/58555264/src/main/java/com/circle/algorithm/Sum.java create mode 100644 group03/58555264/src/main/java/com/circle/collection/ArrayList.java create mode 100644 group03/58555264/src/main/java/com/circle/collection/BinaryTree.java create mode 100644 group03/58555264/src/main/java/com/circle/collection/Iterator.java create mode 100644 group03/58555264/src/main/java/com/circle/collection/LinkedList.java create mode 100644 group03/58555264/src/main/java/com/circle/collection/List.java create mode 100644 group03/58555264/src/main/java/com/circle/collection/Queue.java create mode 100644 group03/58555264/src/main/java/com/circle/collection/Stack.java create mode 100644 group03/58555264/src/main/java/com/circle/struts/ActionEntity.java create mode 100644 group03/58555264/src/main/java/com/circle/struts/LoginAction.java create mode 100644 group03/58555264/src/main/java/com/circle/struts/Struts.java create mode 100644 group03/58555264/src/main/java/com/circle/struts/View.java create mode 100644 group03/58555264/src/main/java/com/circle/struts/XmlUtil.java create mode 100644 group03/58555264/src/test/java/com/circle/algorithm/ArrayUtilTest.java create mode 100644 group03/58555264/src/test/java/com/circle/collection/ArrayListTest.java create mode 100644 group03/58555264/src/test/java/com/circle/collection/BinaryTreeTest.java create mode 100644 group03/58555264/src/test/java/com/circle/collection/LinkedListTest.java create mode 100644 group03/58555264/src/test/java/com/circle/collection/QueueTest.java create mode 100644 group03/58555264/src/test/java/com/circle/collection/StackTest.java create mode 100644 group03/58555264/src/test/java/com/circle/struts/StrutsTest.java create mode 100644 group03/617187912/Learning02/.classpath create mode 100644 group03/617187912/Learning02/.gitignore create mode 100644 group03/617187912/Learning02/.project create mode 100644 group03/617187912/Learning02/.settings/org.eclipse.core.resources.prefs create mode 100644 group03/617187912/Learning02/.settings/org.eclipse.jdt.core.prefs create mode 100644 group03/617187912/Learning02/src/com/coderising/array/ArrayUtil.java create mode 100644 group03/617187912/Learning02/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group03/617187912/Learning02/src/com/coderising/litestruts/LoginAction.java create mode 100644 group03/617187912/Learning02/src/com/coderising/litestruts/Struts.java create mode 100644 group03/617187912/Learning02/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group03/617187912/Learning02/src/com/coderising/litestruts/View.java create mode 100644 group03/617187912/Learning02/src/com/coderising/litestruts/struts.xml create mode 100644 group03/617187912/Learning02/src/com/coding/basic/ArrayList.java create mode 100644 group03/617187912/Learning02/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group03/617187912/Learning02/src/com/coding/basic/Iterator.java create mode 100644 group03/617187912/Learning02/src/com/coding/basic/LinkedList.java create mode 100644 group03/617187912/Learning02/src/com/coding/basic/List.java create mode 100644 group03/617187912/Learning02/src/com/coding/basic/Queue.java create mode 100644 group03/617187912/Learning02/src/com/coding/basic/Stack.java create mode 100644 group03/617187912/Learning201702/.classpath create mode 100644 group03/617187912/Learning201702/.gitignore create mode 100644 group03/617187912/Learning201702/.project create mode 100644 group03/617187912/Learning201702/.settings/org.eclipse.core.resources.prefs create mode 100644 group03/617187912/Learning201702/src/com/coding/basic/ArrayList.java create mode 100644 group03/617187912/Learning201702/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group03/617187912/Learning201702/src/com/coding/basic/Iterator.java create mode 100644 group03/617187912/Learning201702/src/com/coding/basic/LinkedList.java create mode 100644 group03/617187912/Learning201702/src/com/coding/basic/List.java create mode 100644 group03/617187912/Learning201702/src/com/coding/basic/Queue.java create mode 100644 group03/617187912/Learning201702/src/com/coding/basic/Stack.java create mode 100644 group03/619224754/.classpath create mode 100644 group03/619224754/.gitignore create mode 100644 group03/619224754/.project create mode 100644 group03/619224754/.settings/org.eclipse.jdt.core.prefs create mode 100644 group03/619224754/src/Main/Main.java create mode 100644 group03/619224754/src/com/coderising/array/ArrayUtil.java create mode 100644 group03/619224754/src/com/coderising/litestruts/LoginAction.java create mode 100644 group03/619224754/src/com/coderising/litestruts/LogoutAction.java create mode 100644 group03/619224754/src/com/coderising/litestruts/Struts.java create mode 100644 group03/619224754/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group03/619224754/src/com/coderising/litestruts/View.java create mode 100644 group03/619224754/src/com/coderising/litestruts/struts.xml create mode 100644 group03/619224754/src/com/coding/basic/ArrayList.java create mode 100644 group03/619224754/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group03/619224754/src/com/coding/basic/Iterator.java create mode 100644 group03/619224754/src/com/coding/basic/LinkedList.java create mode 100644 group03/619224754/src/com/coding/basic/List.java create mode 100644 group03/619224754/src/com/coding/basic/Queue.java create mode 100644 group03/619224754/src/com/coding/basic/Stack.java create mode 100644 group03/619224754/src/test/ArrayListTest.java create mode 100644 group03/619224754/src/test/BinaryTreeNodeTest.java create mode 100644 group03/619224754/src/test/LinkedListTest.java create mode 100644 group03/664269713/DataStructure/.gitignore create mode 100644 group03/664269713/DataStructure/src/com/ace/coding/ArrayList.java create mode 100644 group03/664269713/DataStructure/src/com/ace/coding/BinaryTreeNode.java create mode 100644 group03/664269713/DataStructure/src/com/ace/coding/Iterator.java create mode 100644 group03/664269713/DataStructure/src/com/ace/coding/LinkedList.java create mode 100644 group03/664269713/DataStructure/src/com/ace/coding/List.java create mode 100644 group03/664269713/DataStructure/src/com/ace/coding/Queue.java create mode 100644 group03/664269713/DataStructure/src/com/ace/coding/Stack.java create mode 100644 group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtil.java create mode 100644 group03/664269713/DataStructure/src/com/ace/homework2/ArrayUtilTest.java create mode 100644 group03/664269713/DataStructure/src/com/ace/homework2/LoginAction.java create mode 100644 group03/664269713/DataStructure/src/com/ace/homework2/Struts.java create mode 100644 group03/664269713/DataStructure/src/com/ace/homework2/StrutsObj.java create mode 100644 group03/664269713/DataStructure/src/com/ace/homework2/View.java create mode 100644 group03/664269713/DataStructure/src/com/ace/homework2/struts.xml create mode 100644 group03/763878069/.classpath create mode 100644 group03/763878069/.gitignore create mode 100644 group03/763878069/.project create mode 100644 group03/763878069/src/cmj/datastructure/list/ArrayList.java create mode 100644 group03/763878069/src/cmj/datastructure/list/LinkedList.java create mode 100644 group03/763878069/src/cmj/datastructure/list/List.java create mode 100644 group03/763878069/src/cmj/datastructure/list/Queue.java create mode 100644 group03/763878069/src/cmj/datastructure/list/Stack.java create mode 100644 group03/763878069/src/cmj/datastructure/tree/BSTree.java create mode 100644 group03/763878069/src/cmj/datastructure/tree/BinaryTree.java create mode 100644 group03/894844916/coding2017-01/.classpath create mode 100644 group03/894844916/coding2017-01/.project create mode 100644 group03/894844916/coding2017-01/.settings/org.eclipse.jdt.core.prefs create mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/ArrayList.java create mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/Iterator.java create mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/LinkedList.java create mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/List.java create mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/ListIndexException.java create mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/Queue.java create mode 100644 group03/894844916/coding2017-01/src/com/coding/basic/Stack.java create mode 100644 group03/894844916/coding2017-02/pom.xml create mode 100644 group03/894844916/coding2017-02/src/main/java/com/coderising/array/ArrayUntil.java create mode 100644 group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/LoginAction.java create mode 100644 group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/Struts.java create mode 100644 group03/894844916/coding2017-02/src/main/java/com/coderising/litestruts/View.java create mode 100644 group03/894844916/coding2017-02/src/main/resources/struts.xml create mode 100644 group03/894844916/coding2017-02/src/test/java/com/coderising/array/ArrayUntilTest.java create mode 100644 group03/894844916/coding2017-02/src/test/java/com/coderising/litestruts/StrutsTest.java create mode 100644 group03/group03.md create mode 100644 group04/1020483199/1020483199Learning/.classpath create mode 100644 group04/1020483199/1020483199Learning/.gitignore create mode 100644 group04/1020483199/1020483199Learning/.project create mode 100644 group04/1020483199/1020483199Learning/.settings/org.eclipse.core.resources.prefs create mode 100644 group04/1020483199/1020483199Learning/.settings/org.eclipse.jdt.core.prefs create mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/ArrayList.java create mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/Iterator.java create mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/LinkedList.java create mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/List.java create mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/Queue.java create mode 100644 group04/1020483199/1020483199Learning/src/com/coding/basic/Stack.java create mode 100644 group04/1020483199/1020483199Learning/src/com/coding/test/JavaTest.java create mode 100644 group04/1020483199/RemoteSystemsTempFiles/.project create mode 100644 group04/1020483199/SecondHomeWork/.classpath create mode 100644 group04/1020483199/SecondHomeWork/.project create mode 100644 group04/1020483199/SecondHomeWork/.settings/org.eclipse.jdt.core.prefs create mode 100644 group04/1020483199/SecondHomeWork/bin/com/basic/litestruts/struts.xml create mode 100644 group04/1020483199/SecondHomeWork/src/com/basic/coding/ArrayUtil.java create mode 100644 group04/1020483199/SecondHomeWork/src/com/basic/litestruts/LoginAction.java create mode 100644 group04/1020483199/SecondHomeWork/src/com/basic/litestruts/Struts.java create mode 100644 group04/1020483199/SecondHomeWork/src/com/basic/litestruts/StrutsTest.java create mode 100644 group04/1020483199/SecondHomeWork/src/com/basic/litestruts/View.java create mode 100644 group04/1020483199/SecondHomeWork/src/com/basic/litestruts/struts.xml create mode 100644 group04/1020483199/SecondHomeWork/src/com/basic/test/JavaTest.java create mode 100644 group04/120549547/base/buil.bat create mode 100644 group04/120549547/base/src/com/coding/basic/ArrayList.java create mode 100644 group04/120549547/base/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/120549547/base/src/com/coding/basic/Iterator.java create mode 100644 group04/120549547/base/src/com/coding/basic/LinkedList.java create mode 100644 group04/120549547/base/src/com/coding/basic/List.java create mode 100644 group04/120549547/base/src/com/coding/basic/Main.java create mode 100644 group04/120549547/base/src/com/coding/basic/Queue.java create mode 100644 group04/120549547/base/src/com/coding/basic/Stack.java create mode 100644 group04/120549547/my.txt create mode 100644 group04/120549547/shell.sh create mode 100644 group04/1299310140/src/com/coderising/array/ArrayUtil.java create mode 100644 group04/1299310140/src/com/coderising/litestruts/Struts.java create mode 100644 group04/1299310140/src/com/coding/basic/ArrayList.java create mode 100644 group04/1299310140/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/1299310140/src/com/coding/basic/LinkedList.java create mode 100644 group04/1299310140/src/com/coding/basic/Queue.java create mode 100644 group04/1299310140/src/com/coding/basic/Stack.java create mode 100644 group04/1751801281/.classpath create mode 100644 group04/1751801281/.gitignore create mode 100644 group04/1751801281/.project create mode 100644 group04/1751801281/src/com/coding/basic/ArrayList.java create mode 100644 group04/1751801281/src/com/coding/basic/Iterator.java create mode 100644 group04/1751801281/src/com/coding/basic/LinkedList.java create mode 100644 group04/1751801281/src/com/coding/basic/List.java create mode 100644 group04/1751801281/src/com/coding/basic/Queue.java create mode 100644 group04/1751801281/src/com/coding/basic/Stack.java create mode 100644 group04/1751801281/test/com/coding/basic/ArrayListTest.java create mode 100644 group04/1751801281/test/com/coding/basic/LinkedListTeat.java create mode 100644 group04/1751801281/test/com/coding/basic/QueueTest.java create mode 100644 group04/1751801281/test/com/coding/basic/StackTest.java create mode 100644 group04/1796244932/.gitignore create mode 100644 group04/1796244932/learn01/.gitignore create mode 100644 group04/1796244932/learn01/pom.xml create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayUtil.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyIterator.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyList.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/ActionPojoParseXML.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/LoginAction.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/Struts.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/View.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/utils/StringUtils.java create mode 100644 group04/1796244932/learn01/src/main/resource/struts.xml create mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java create mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayUtilTest.java create mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyBinaryTreeTest.java create mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyLinkedListTest.java create mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java create mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java create mode 100644 group04/1796244932/learn01/src/test/java/com/dudy/learn01/litestruts/StrutsTest.java create mode 100644 group04/1906242834/.classpath create mode 100644 group04/1906242834/.gitignore create mode 100644 group04/1906242834/.project create mode 100644 group04/1906242834/src/com/coderising/array/ArrayUtil.java create mode 100644 group04/1906242834/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group04/1906242834/src/com/coderising/litestruts/LoginAction.java create mode 100644 group04/1906242834/src/com/coderising/litestruts/Struts.java create mode 100644 group04/1906242834/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group04/1906242834/src/com/coderising/litestruts/View.java create mode 100644 group04/1906242834/src/com/coderising/litestruts/struts.xml create mode 100644 group04/1906242834/src/com/coding/basic/ArrayList.java create mode 100644 group04/1906242834/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/1906242834/src/com/coding/basic/Iterator.java create mode 100644 group04/1906242834/src/com/coding/basic/LinkedList.java create mode 100644 group04/1906242834/src/com/coding/basic/List.java create mode 100644 group04/1906242834/src/com/coding/basic/Queue.java create mode 100644 group04/1906242834/src/com/coding/basic/Stack.java create mode 100644 group04/1972376180/.classpath create mode 100644 group04/1972376180/.gitignore create mode 100644 group04/1972376180/.project create mode 100644 group04/1972376180/src/tong/java/one/MyArrayList.java create mode 100644 group04/1972376180/src/tong/java/one/MyLinkedList.java create mode 100644 group04/1972376180/src/tong/java/one/MyQueue.java create mode 100644 group04/1972376180/src/tong/java/one/MyStack.java create mode 100644 group04/1972376180/src/tong/java/two/ArrayUtil.java create mode 100644 group04/1972376180/src/tong/java/two/ArrayUtilTest.java create mode 100644 group04/1972376180/src/tong/java/two/struts/Action.java create mode 100644 group04/1972376180/src/tong/java/two/struts/LoginAction.java create mode 100644 group04/1972376180/src/tong/java/two/struts/Result.java create mode 100644 group04/1972376180/src/tong/java/two/struts/Root.java create mode 100644 group04/1972376180/src/tong/java/two/struts/Struts.java create mode 100644 group04/1972376180/src/tong/java/two/struts/StrutsTest.java create mode 100644 group04/1972376180/src/tong/java/two/struts/View.java create mode 100644 group04/1972376180/src/tong/java/two/struts/struts.xml create mode 100644 group04/2082945465/.gitignore create mode 100644 group04/2082945465/week01/src/Hello.java create mode 100644 group04/2082945465/week01/src/MyArrayList.java create mode 100644 group04/2082945465/week01/src/MyIterator.java create mode 100644 group04/2082945465/week01/src/MyLinkedList.java create mode 100644 group04/2082945465/week01/src/MyList.java create mode 100644 group04/2082945465/week01/src/MyQueue.java create mode 100644 group04/2082945465/week01/src/MyStack.java create mode 100644 group04/24658892/.classpath create mode 100644 group04/24658892/.gitignore create mode 100644 group04/24658892/.project create mode 100644 group04/24658892/.settings/org.eclipse.jdt.core.prefs create mode 100644 group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties create mode 100644 group04/24658892/learnjava/.gradle/3.1/taskArtifacts/cache.properties.lock create mode 100644 group04/24658892/learnjava/.gradle/3.1/taskArtifacts/fileHashes.bin create mode 100644 group04/24658892/learnjava/.gradle/3.1/taskArtifacts/fileSnapshots.bin create mode 100644 group04/24658892/learnjava/.gradle/3.1/taskArtifacts/taskArtifacts.bin create mode 100644 group04/24658892/learnjava/build.gradle create mode 100644 group04/24658892/learnjava/gradle/wrapper/gradle-wrapper.properties create mode 100644 group04/24658892/learnjava/gradlew create mode 100644 group04/24658892/learnjava/gradlew.bat create mode 100644 group04/24658892/learnjava/settings.gradle create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/array/ArrayUtil.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/ArrayList.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/Iterator.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/LinkedList.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/List.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/Queue.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/basic/Stack.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/litestruts/Action.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/litestruts/Result.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/litestruts/Struts.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/litestruts/View.java create mode 100644 group04/24658892/learnjava/src/main/java/com/coding/litestruts/action/LoginAction.java create mode 100644 group04/24658892/learnjava/src/main/resources/struts.xml create mode 100644 group04/24658892/learnjava/src/test/java/com/coding/array/ArrayUtilTest.java create mode 100644 group04/24658892/learnjava/src/test/java/com/coding/basic/ArrayListTest.java create mode 100644 group04/24658892/learnjava/src/test/java/com/coding/basic/LinkedListTest.java create mode 100644 group04/24658892/learnjava/src/test/java/com/coding/litestruts/StrutsTest.java create mode 100644 group04/24658892/learnjava/src/test/resources/struts.xml create mode 100644 group04/274407594/226/.classpath create mode 100644 group04/274407594/226/.gitignore create mode 100644 group04/274407594/226/.project create mode 100644 group04/274407594/226/.settings/org.eclipse.jdt.core.prefs create mode 100644 "group04/312816708/blog/blog01/CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\343\200\201\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" create mode 100644 group04/312816708/coding/coding01/.gitignore create mode 100644 group04/312816708/coding/coding01/pom.xml create mode 100644 group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyArrayList.java create mode 100644 group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyLinkedList.java create mode 100644 group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyList.java create mode 100644 group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyQueue.java create mode 100644 group04/312816708/coding/coding01/src/main/java/com/kevin/coding01/basic/MyStack.java create mode 100644 group04/312816708/coding/coding02/pom.xml create mode 100644 group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtil.java create mode 100644 group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/array/ArrayUtilTest.java create mode 100644 group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/LoginAction.java create mode 100644 group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/Struts.java create mode 100644 group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/StrutsTest.java create mode 100644 group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/View.java create mode 100644 group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/litestruts/struts.xml create mode 100644 group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ActionModel.java create mode 100644 group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/model/ResultModel.java create mode 100644 group04/312816708/coding/coding02/src/main/java/com/kevin/coding02/util/SaxUtil.java create mode 100644 group04/349184132/Study/.classpath create mode 100644 group04/349184132/Study/.project create mode 100644 group04/349184132/Study/.settings/org.eclipse.core.resources.prefs create mode 100644 group04/349184132/Study/.settings/org.eclipse.jdt.core.prefs create mode 100644 group04/349184132/Study/.settings/org.eclipse.ltk.core.refactoring.prefs create mode 100644 group04/349184132/Study/bin/com/second/struts.xml create mode 100644 group04/349184132/Study/bin/com/test/student2.xml create mode 100644 group04/349184132/Study/bin/com/test/students.xml create mode 100644 group04/349184132/Study/src/com/first/ArrayList.java create mode 100644 group04/349184132/Study/src/com/first/BinaryTreeNode.java create mode 100644 group04/349184132/Study/src/com/first/Iterator.java create mode 100644 group04/349184132/Study/src/com/first/LinkedList.java create mode 100644 group04/349184132/Study/src/com/first/List.java create mode 100644 group04/349184132/Study/src/com/first/Queue.java create mode 100644 group04/349184132/Study/src/com/first/Stack.java create mode 100644 group04/349184132/Study/src/com/first/test/TestArrayList.java create mode 100644 group04/349184132/Study/src/com/first/test/TestLinkedList.java create mode 100644 group04/349184132/Study/src/com/second/Array/ArrayUtil.java create mode 100644 group04/349184132/Study/src/com/second/Array/ArrayUtilTest.java create mode 100644 group04/349184132/Study/src/com/second/LoginAction.java create mode 100644 group04/349184132/Study/src/com/second/StringUtil.java create mode 100644 group04/349184132/Study/src/com/second/Struts.java create mode 100644 group04/349184132/Study/src/com/second/StrutsTest.java create mode 100644 group04/349184132/Study/src/com/second/View.java create mode 100644 group04/349184132/Study/src/com/second/struts.xml create mode 100644 "group04/349184132/post/CPU\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.docx" create mode 100644 group04/351121278/src/com/coding/array/ArrayUtil.java create mode 100644 group04/351121278/src/com/coding/basic/ArrayList.java create mode 100644 group04/351121278/src/com/coding/basic/Iterator.java create mode 100644 group04/351121278/src/com/coding/basic/LinkedList.java create mode 100644 group04/351121278/src/com/coding/basic/List.java create mode 100644 group04/351121278/src/com/coding/basic/Queue.java create mode 100644 group04/351121278/src/com/coding/basic/Stack.java create mode 100644 group04/351121278/src/com/coding/litestruts/LoginAction.java create mode 100644 group04/351121278/src/com/coding/litestruts/Struts.java create mode 100644 group04/351121278/src/com/coding/litestruts/StrutsTest.java create mode 100644 group04/351121278/src/com/coding/litestruts/View.java create mode 100644 group04/351121278/src/com/coding/litestruts/struts.xml create mode 100644 group04/465034663/.classpath create mode 100644 group04/465034663/.gitignore create mode 100644 group04/465034663/.project create mode 100644 group04/465034663/.settings/org.eclipse.core.resources.prefs create mode 100644 group04/465034663/.settings/org.eclipse.core.runtime.prefs create mode 100644 group04/465034663/src/com/xusheng/arraylist/MyArrayList.java create mode 100644 group04/465034663/src/com/xusheng/arraylist/MyCollection.java create mode 100644 group04/465034663/src/com/xusheng/arraylist/MyIterator.java create mode 100644 group04/465034663/src/com/xusheng/arraylist/MyList.java create mode 100644 group04/465034663/src/com/xusheng/arraylist/MyListIterator.java create mode 100644 group04/465034663/src/com/xusheng/arraylist/TestData.java create mode 100644 group04/465034663/src/com/xusheng/linkedlist/MyLinkedList.java create mode 100644 group04/465034663/src/com/xusheng/linkedlist/TestMain.java create mode 100644 group04/465034663/src/com/xusheng/stack/MyLinkedStack.java create mode 100644 group04/465034663/src/com/xusheng/stack/MyLinkedStack2.java create mode 100644 group04/465034663/src/com/xusheng/stack/TestMain.java create mode 100644 group04/465034663/src/com/xusheng/tree/AvlTree.java create mode 100644 group04/465034663/src/com/xusheng/tree/BinarySearchTree.java create mode 100644 group04/465034663/src/com/xusheng/tree/TestMain.java create mode 100644 group04/474772605/.classpath create mode 100644 group04/474772605/.gitignore create mode 100644 group04/474772605/.project create mode 100644 group04/474772605/.settings/org.eclipse.jdt.core.prefs create mode 100644 group04/474772605/src/com/coding/basic/ArrayList.java create mode 100644 group04/474772605/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/474772605/src/com/coding/basic/Dinkedlist.java create mode 100644 group04/474772605/src/com/coding/basic/Iterator.java create mode 100644 group04/474772605/src/com/coding/basic/LinkedList.java create mode 100644 group04/474772605/src/com/coding/basic/List.java create mode 100644 group04/474772605/src/com/coding/basic/Queue.java create mode 100644 group04/474772605/src/com/coding/basic/Stack.java create mode 100644 group04/474772605/src/com/coding/basic/testarraylist.java create mode 100644 group04/498654356/one/.classpath create mode 100644 group04/498654356/one/.gitignore create mode 100644 group04/498654356/one/.project create mode 100644 group04/498654356/one/pom.xml create mode 100644 group04/498654356/one/src/org/coding/one/ArrayList.java create mode 100644 group04/498654356/one/src/org/coding/one/BinaryTreeNode.java create mode 100644 group04/498654356/one/src/org/coding/one/LinkedList.java create mode 100644 group04/498654356/one/src/org/coding/one/List.java create mode 100644 group04/498654356/one/src/org/coding/one/Queue.java create mode 100644 group04/498654356/one/src/org/coding/one/Stack.java create mode 100644 group04/498654356/one/src/org/coding/two/ActionBeanDefinition.java create mode 100644 group04/498654356/one/src/org/coding/two/LoginAction.java create mode 100644 group04/498654356/one/src/org/coding/two/Struts.java create mode 100644 group04/498654356/one/src/org/coding/two/View.java create mode 100644 group04/498654356/one/src/org/coding/two/array/ArrayUtil.java create mode 100644 group04/498654356/one/src/org/coding/two/struts.xml create mode 100644 group04/498654356/one/test/org/coding/one/AllTests.java create mode 100644 group04/498654356/one/test/org/coding/one/ArrayListTest.java create mode 100644 group04/498654356/one/test/org/coding/one/BinaryTreeNodeTest.java create mode 100644 group04/498654356/one/test/org/coding/one/LinkedListTest.java create mode 100644 group04/498654356/one/test/org/coding/one/QueueTest.java create mode 100644 group04/498654356/one/test/org/coding/one/StackTest.java create mode 100644 group04/498654356/one/test/org/coding/two/StrutsTest.java create mode 100644 group04/498654356/one/test/org/coding/two/array/ArrayUtilTest.java create mode 100644 group04/498654356/one/test_resource/org/coding/two/struts.xml create mode 100644 group04/564451732/hw1/.classpath create mode 100644 group04/564451732/hw1/.gitignore create mode 100644 group04/564451732/hw1/.project create mode 100644 group04/564451732/hw1/src/DataStructureTest.java create mode 100644 group04/564451732/hw1/src/Test.java create mode 100644 group04/564451732/hw1/src/hw1/ArrayListImpl.java create mode 100644 group04/564451732/hw1/src/hw1/BinaryTreeNode.java create mode 100644 group04/564451732/hw1/src/hw1/Iterator.java create mode 100644 group04/564451732/hw1/src/hw1/LinkedList.java create mode 100644 group04/564451732/hw1/src/hw1/List.java create mode 100644 group04/564451732/hw1/src/hw1/QueueImpl.java create mode 100644 group04/564451732/hw1/src/hw1/StackImpl.java create mode 100644 group04/564451732/hw2/.classpath create mode 100644 group04/564451732/hw2/.gitignore create mode 100644 group04/564451732/hw2/.project create mode 100644 group04/564451732/hw2/.settings/org.eclipse.jdt.core.prefs create mode 100644 group04/564451732/hw2/src/com/coderising/array/ArrayUtil.java create mode 100644 group04/564451732/hw2/src/com/coderising/litestruts/LoginAction.java create mode 100644 group04/564451732/hw2/src/com/coderising/litestruts/Struts.java create mode 100644 group04/564451732/hw2/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group04/564451732/hw2/src/com/coderising/litestruts/View.java create mode 100644 group04/564451732/hw2/src/com/coderising/litestruts/struts.xml create mode 100644 group04/564451732/hw2/src/com/coding/basic/ArrayList.java create mode 100644 group04/564451732/hw2/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/564451732/hw2/src/com/coding/basic/Iterator.java create mode 100644 group04/564451732/hw2/src/com/coding/basic/LinkedList.java create mode 100644 group04/564451732/hw2/src/com/coding/basic/List.java create mode 100644 group04/564451732/hw2/src/com/coding/basic/Queue.java create mode 100644 group04/564451732/hw2/src/com/coding/basic/Stack.java create mode 100644 group04/564451732/hw2/struts.xml create mode 100644 group04/821655640/learning_projects/project_basic_001/.gitignore create mode 100644 group04/821655640/learning_projects/project_basic_001/pom.xml create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/array/ArrayUtil.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/LoginAction.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/Struts.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/View.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coderising/litestruts/struts.xml create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/ArrayList.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Iterator.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/LinkedList.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/List.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Queue.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/main/java/com/coding/basic/Stack.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/array/ArrayUtilTest.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/test/java/com/coderising/litestruts/StrutsTest.java create mode 100644 group04/821655640/learning_projects/project_basic_001/src/test/java/com/coding/basic/TestBasic.java create mode 100644 group04/844028312/.gitignore create mode 100644 group04/844028312/one/.classpath create mode 100644 group04/844028312/one/.gitignore create mode 100644 group04/844028312/one/.project create mode 100644 group04/844028312/one/src/com/coding/basic/ArrayList.java create mode 100644 group04/844028312/one/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/844028312/one/src/com/coding/basic/Iterator.java create mode 100644 group04/844028312/one/src/com/coding/basic/JavaTest.java create mode 100644 group04/844028312/one/src/com/coding/basic/LinkedList.java create mode 100644 group04/844028312/one/src/com/coding/basic/List.java create mode 100644 group04/844028312/one/src/com/coding/basic/Queue.java create mode 100644 group04/844028312/one/src/com/coding/basic/Stack.java create mode 100644 group04/844028312/one/src/com/coding/test/ArrayListTest.java create mode 100644 group04/844028312/one/src/com/coding/test/BinaryTreeNodeTest.java create mode 100644 group04/844028312/one/src/com/coding/test/LinkedListTest.java create mode 100644 group04/844028312/one/src/com/coding/test/QueueTest.java create mode 100644 group04/844028312/one/src/com/coding/test/StackTest.java create mode 100644 group04/844028312/two/.classpath create mode 100644 group04/844028312/two/.gitignore create mode 100644 group04/844028312/two/.project create mode 100644 group04/844028312/two/src/com/coderising/array/ArrayUtil.java create mode 100644 group04/844028312/two/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group04/844028312/two/src/com/coderising/litestruts/LoginAction.java create mode 100644 group04/844028312/two/src/com/coderising/litestruts/Struts.java create mode 100644 group04/844028312/two/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group04/844028312/two/src/com/coderising/litestruts/View.java create mode 100644 group04/844028312/two/src/com/coderising/litestruts/struts.xml create mode 100644 group04/916758663/learn01/.gitignore create mode 100644 group04/916758663/learn01/pom.xml create mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/ArrayList.java create mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/Iterator.java create mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/LinkedList.java create mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/List.java create mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/Queue.java create mode 100644 group04/916758663/learn01/src/main/java/com/coding/basic/Stack.java create mode 100644 group04/916758663/learn01/src/test/java/com/coding/basic/ArrayListTest.java create mode 100644 group04/916758663/learn01/src/test/java/com/coding/basic/JavaArrayListTest.java create mode 100644 group04/916758663/learn01/src/test/java/com/coding/basic/LinkedListTest.java create mode 100644 group04/916758663/learn01/src/test/java/com/coding/basic/QueueTest.java create mode 100644 group04/916758663/learn01/src/test/java/com/coding/basic/StackTest.java create mode 100644 group04/916758663/learn02/.gitignore create mode 100644 group04/916758663/learn02/pom.xml create mode 100644 group04/916758663/learn02/src/main/java/com/example/litestruts/LoginAction.java create mode 100644 group04/916758663/learn02/src/main/java/com/example/litestruts/Struts.java create mode 100644 group04/916758663/learn02/src/main/java/com/example/litestruts/View.java create mode 100644 group04/916758663/learn02/src/main/java/com/example/litestruts/dto/Action.java create mode 100644 group04/916758663/learn02/src/main/java/com/example/litestruts/dto/ActionResult.java create mode 100644 group04/916758663/learn02/src/main/java/com/example/litestruts/struts.xml create mode 100644 group04/916758663/learn02/src/test/java/com/example/litestruts/StrutsTest.java create mode 100644 group04/group04.md create mode 100644 group05/1026626960/.classpath create mode 100644 group05/1026626960/.gitignore create mode 100644 group05/1026626960/.project create mode 100644 group05/1026626960/src/cn/study1/myIterator.java create mode 100644 group05/1026626960/src/cn/study1/myQueue.java create mode 100644 group05/1026626960/src/cn/study1/myStack.java create mode 100644 group05/1026626960/src/cn/study2/array/ArrayUtil.java create mode 100644 group05/1026626960/src/cn/study2/myStruts/ActionMapping.java create mode 100644 group05/1026626960/src/cn/study2/myStruts/Result.java create mode 100644 group05/1026626960/src/cn/study2/myStruts/Test.java create mode 100644 group05/1026626960/src/cn/study2/myStruts/readStrutsXml.java create mode 100644 group05/1026626960/src/mystruts.xml create mode 100644 group05/1094051862/test01/.classpath create mode 100644 group05/1094051862/test01/.gitignore create mode 100644 group05/1094051862/test01/.project create mode 100644 group05/1094051862/test01/.settings/org.eclipse.jdt.core.prefs create mode 100644 group05/1094051862/test01/src/com/coderising/array/ArrayUtil.java create mode 100644 group05/1094051862/test01/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group05/1094051862/test01/src/com/coderising/litestruts/LoginAction.java create mode 100644 group05/1094051862/test01/src/com/coderising/litestruts/Struts.java create mode 100644 group05/1094051862/test01/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group05/1094051862/test01/src/com/coderising/litestruts/View.java create mode 100644 group05/1094051862/test01/src/com/coderising/litestruts/struts.xml create mode 100644 group05/1094051862/test01/src/com/coding/basic/ArrayList.java create mode 100644 group05/1094051862/test01/src/com/coding/basic/ArrayListTest.java create mode 100644 group05/1094051862/test01/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group05/1094051862/test01/src/com/coding/basic/Iterator.java create mode 100644 group05/1094051862/test01/src/com/coding/basic/LinkedList.java create mode 100644 group05/1094051862/test01/src/com/coding/basic/LinkedListTest.java create mode 100644 group05/1094051862/test01/src/com/coding/basic/List.java create mode 100644 group05/1094051862/test01/src/com/coding/basic/Queue.java create mode 100644 group05/1094051862/test01/src/com/coding/basic/QueueTest.java create mode 100644 group05/1094051862/test01/src/com/coding/basic/Stack.java create mode 100644 group05/1094051862/test01/src/com/coding/basic/StackTest.java create mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/ArrayList.java create mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/Iterator.java create mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/LinkedList.java create mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/List.java create mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/Queue.java create mode 100644 group05/183127807/HomeWork0226/src/com/coding/basic/Stack.java create mode 100644 group05/183127807/HomeWork0305/out/production/HomeWork0305/com/coderising/litestruts/struts.xml create mode 100644 group05/183127807/HomeWork0305/src/com/coderising/array/ArrayUtil.java create mode 100644 group05/183127807/HomeWork0305/src/com/coderising/litestruts/LoginAction.java create mode 100644 group05/183127807/HomeWork0305/src/com/coderising/litestruts/Struts.java create mode 100644 group05/183127807/HomeWork0305/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group05/183127807/HomeWork0305/src/com/coderising/litestruts/View.java create mode 100644 group05/183127807/HomeWork0305/src/com/coderising/litestruts/struts.xml create mode 100644 group05/284422826/.gitignore create mode 100644 group05/284422826/src/com/coderising/array/ArrayUtil.java create mode 100644 group05/284422826/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group05/284422826/src/com/coderising/litestruts/LoginAction.java create mode 100644 group05/284422826/src/com/coderising/litestruts/Struts.java create mode 100644 group05/284422826/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group05/284422826/src/com/coderising/litestruts/View.java create mode 100644 group05/284422826/src/com/coderising/litestruts/struts.xml create mode 100644 group05/284422826/src/com/coding2017/basic/ArrayList.java create mode 100644 group05/284422826/src/com/coding2017/basic/BinaryTreeNode.java create mode 100644 group05/284422826/src/com/coding2017/basic/Iterator.java create mode 100644 group05/284422826/src/com/coding2017/basic/LinkedList.java create mode 100644 group05/284422826/src/com/coding2017/basic/List.java create mode 100644 group05/284422826/src/com/coding2017/basic/Queue.java create mode 100644 group05/284422826/src/com/coding2017/basic/Stack.java create mode 100644 group05/289326186/.classpath create mode 100644 group05/289326186/.gitignore create mode 100644 group05/289326186/.project create mode 100644 group05/289326186/.settings/org.eclipse.jdt.core.prefs create mode 100644 group05/289326186/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 group05/289326186/src/com/coderising/array/ArrayUtil.java create mode 100644 group05/289326186/src/com/coderising/litestruts/LoginAction.java create mode 100644 group05/289326186/src/com/coderising/litestruts/Struts.java create mode 100644 group05/289326186/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group05/289326186/src/com/coderising/litestruts/View.java create mode 100644 group05/289326186/src/com/coderising/litestruts/struts.xml create mode 100644 group05/351592484/.gitignore create mode 100644 group05/351592484/src/com/github/zhanglifeng/coding2017/basic/ArrayList.java create mode 100644 group05/351592484/src/com/github/zhanglifeng/coding2017/basic/BinaryTreeNode.java create mode 100644 group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Iterator.java create mode 100644 group05/351592484/src/com/github/zhanglifeng/coding2017/basic/LinkedList.java create mode 100644 group05/351592484/src/com/github/zhanglifeng/coding2017/basic/List.java create mode 100644 group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Queue.java create mode 100644 group05/351592484/src/com/github/zhanglifeng/coding2017/basic/Stack.java create mode 100644 group05/371492887/task_01/.classpath create mode 100644 group05/371492887/task_01/.gitignore create mode 100644 group05/371492887/task_01/.project create mode 100644 group05/371492887/task_01/src/com/nitasty/test/ArrayListTest.java create mode 100644 group05/371492887/task_01/src/com/nitasty/test/BinaryTreeTest.java create mode 100644 group05/371492887/task_01/src/com/nitasty/test/LinkedListTest.java create mode 100644 group05/371492887/task_01/src/com/nitasty/test/QueueTest.java create mode 100644 group05/371492887/task_01/src/com/nitasty/test/StackTest.java create mode 100644 group05/371492887/task_01/src/com/nitasty/util/ArrayList.java create mode 100644 group05/371492887/task_01/src/com/nitasty/util/BinaryTree.java create mode 100644 group05/371492887/task_01/src/com/nitasty/util/BinaryTreeNode.java create mode 100644 group05/371492887/task_01/src/com/nitasty/util/Iterator.java create mode 100644 group05/371492887/task_01/src/com/nitasty/util/LinkedList.java create mode 100644 group05/371492887/task_01/src/com/nitasty/util/List.java create mode 100644 group05/371492887/task_01/src/com/nitasty/util/Queue.java create mode 100644 group05/371492887/task_01/src/com/nitasty/util/Stack.java create mode 100644 group05/371492887/task_02/.classpath create mode 100644 group05/371492887/task_02/.gitignore create mode 100644 group05/371492887/task_02/.project create mode 100644 group05/371492887/task_02/pom.xml create mode 100644 group05/371492887/task_02/src/com/coderising/action/LoginAction.java create mode 100644 group05/371492887/task_02/src/com/nitasty/array/ArrayUtil.java create mode 100644 group05/371492887/task_02/src/com/nitasty/array/ArrayUtilTest.java create mode 100644 group05/371492887/task_02/src/com/nitasty/litestruts/LoginAction.java create mode 100644 group05/371492887/task_02/src/com/nitasty/litestruts/Struts.java create mode 100644 group05/371492887/task_02/src/com/nitasty/litestruts/StrutsTest.java create mode 100644 group05/371492887/task_02/src/com/nitasty/litestruts/View.java create mode 100644 group05/371492887/task_02/src/com/nitasty/litestruts/struts.xml create mode 100644 group05/399258474/.classpath create mode 100644 group05/399258474/.gitignore create mode 100644 group05/399258474/.project create mode 100644 group05/399258474/.settings/org.eclipse.jdt.core.prefs create mode 100644 group05/399258474/src/com/coderising/array/ArrayUtil.java create mode 100644 group05/399258474/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group05/399258474/src/com/coderising/litestruts/LoginAction.java create mode 100644 group05/399258474/src/com/coderising/litestruts/Struts.java create mode 100644 group05/399258474/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group05/399258474/src/com/coderising/litestruts/View.java create mode 100644 group05/399258474/src/com/coderising/litestruts/struts.xml create mode 100644 group05/399258474/src/com/coding/basic/ArrayList.java create mode 100644 group05/399258474/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group05/399258474/src/com/coding/basic/Iterator.java create mode 100644 group05/399258474/src/com/coding/basic/LinkedList.java create mode 100644 group05/399258474/src/com/coding/basic/List.java create mode 100644 group05/399258474/src/com/coding/basic/Queue.java create mode 100644 group05/399258474/src/com/coding/basic/Stack.java create mode 100644 group05/399258474/src/com/coding/basic/test/BasicTest.java create mode 100644 group05/441517454/work1/.classpath create mode 100644 group05/441517454/work1/.gitignore create mode 100644 group05/441517454/work1/.project create mode 100644 group05/441517454/work1/.settings/org.eclipse.jdt.core.prefs create mode 100644 group05/441517454/work1/src/com/coding/basic/ArrayList.java create mode 100644 group05/441517454/work1/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group05/441517454/work1/src/com/coding/basic/Iterator.java create mode 100644 group05/441517454/work1/src/com/coding/basic/LinkedList.java create mode 100644 group05/441517454/work1/src/com/coding/basic/List.java create mode 100644 group05/441517454/work1/src/com/coding/basic/Queue.java create mode 100644 group05/441517454/work1/src/com/coding/basic/Stack.java create mode 100644 group05/441517454/work1/src/com/coding/basic/Test1.java create mode 100644 group05/515505513/RemoteSystemsTempFiles/.project create mode 100644 group05/515505513/Task01/.classpath create mode 100644 group05/515505513/Task01/.gitignore create mode 100644 group05/515505513/Task01/.project create mode 100644 group05/515505513/Task01/.settings/org.eclipse.jdt.core.prefs create mode 100644 group05/515505513/Task01/src/com/coding/basic/ArrayList.java create mode 100644 group05/515505513/Task01/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group05/515505513/Task01/src/com/coding/basic/Iterator.java create mode 100644 group05/515505513/Task01/src/com/coding/basic/LinkedList.java create mode 100644 group05/515505513/Task01/src/com/coding/basic/List.java create mode 100644 group05/515505513/Task01/src/com/coding/basic/Queue.java create mode 100644 group05/515505513/Task01/src/com/coding/basic/Stack.java create mode 100644 group05/515505513/Task01/src/com/coding/basic/TestExample.java create mode 100644 group05/515505513/Task02/.classpath create mode 100644 group05/515505513/Task02/.gitignore create mode 100644 group05/515505513/Task02/.project create mode 100644 group05/515505513/Task02/.settings/org.eclipse.jdt.core.prefs create mode 100644 group05/515505513/Task02/src/com/coderising/action/LoginAction.java create mode 100644 group05/515505513/Task02/src/com/coderising/action/Struts.java create mode 100644 group05/515505513/Task02/src/com/coderising/action/StrutsTest.java create mode 100644 group05/515505513/Task02/src/com/coderising/action/View.java create mode 100644 group05/515505513/Task02/src/com/coderising/action/struts.xml create mode 100644 group05/515505513/Task02/src/com/coderising/array/ArrayUtil.java create mode 100644 group05/515505513/Task02/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group05/578505552/.gitignore create mode 100644 group05/578505552/pom.xml create mode 100644 group05/578505552/src/main/java/com/coderising/Q&A.md create mode 100644 group05/578505552/src/main/java/com/coderising/array/ArrayUtil.java create mode 100644 group05/578505552/src/main/java/com/coderising/litestruts/Action.java create mode 100644 group05/578505552/src/main/java/com/coderising/litestruts/LoginAction.java create mode 100644 group05/578505552/src/main/java/com/coderising/litestruts/Struts.java create mode 100644 group05/578505552/src/main/java/com/coderising/litestruts/View.java create mode 100644 group05/578505552/src/main/java/com/coderising/litestruts/XmlUtil.java create mode 100644 group05/578505552/src/main/java/com/coding/basic/ArrayList.java create mode 100644 group05/578505552/src/main/java/com/coding/basic/BinaryTreeNode.java create mode 100644 group05/578505552/src/main/java/com/coding/basic/Iterator.java create mode 100644 group05/578505552/src/main/java/com/coding/basic/LinkedList.java create mode 100644 group05/578505552/src/main/java/com/coding/basic/List.java create mode 100644 group05/578505552/src/main/java/com/coding/basic/Queue.java create mode 100644 group05/578505552/src/main/java/com/coding/basic/Stack.java create mode 100644 group05/578505552/src/main/resources/struts.xml create mode 100644 group05/578505552/src/test/java/JavaTest.java create mode 100644 group05/578505552/src/test/java/com/coderising/array/ArrayUtilTest.java create mode 100644 group05/578505552/src/test/java/com/coderising/litestruts/StrutsTest.java create mode 100644 group05/578505552/src/test/java/com/coding/basic/BinaryTreeNodeTest.java create mode 100644 group05/578505552/src/test/java/com/coding/basic/ListTest.java create mode 100644 group05/578505552/src/test/java/com/coding/basic/QueueTest.java create mode 100644 group05/578505552/src/test/java/com/coding/basic/StackTest.java create mode 100644 group05/591010847/.gitignore create mode 100644 group05/591010847/job_2017_02/.gitignore create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/ArrayListImpl.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/BinaryTreeNode.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/LinkedListImpl.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/impl/StackImpl.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IIterator.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IList.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/com/java/xiaoqin/interfaces/IQueue.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/ArrayListImplTest.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/BinaryTreeNodeTest.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IQueueImplTest.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/IStackImplTest.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_19_data_structure/src/test/com/java/xiaoqin/impl/LinkedListImplTest.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/res/struts.xml create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/array/ArrayUtil.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/Struts.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LoginAction.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/action/LogoutAction.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/ActionBean.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/bean/View.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/manager/StrutsParseManager.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/src/com/java/xiaoqin/litestruts/util/ReflectUtils.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/array/ArrayUtilTest.java create mode 100644 group05/591010847/job_2017_02/job_2017_02_26_Struts/src/test/com/java/xiaoqin/litestruts/StrutsTest.java create mode 100644 group05/810574652/.classpath create mode 100644 group05/810574652/.gitignore create mode 100644 group05/810574652/.project create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework1/ArrayList.java create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework1/LinkedList.java create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework1/List.java create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework1/Queue.java create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework1/Stack.java create mode 100644 "group05/810574652/src/com/github/PingPi357/coding2017/homework1/\350\257\264\346\230\216" create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework2/ArrayUtil.java create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/LoginAction.java create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/Struts.java create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/StrutsTest.java create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/View.java create mode 100644 group05/810574652/src/com/github/PingPi357/coding2017/homework2/litestruts/struts.xml create mode 100644 "group05/810574652/src/com/github/PingPi357/coding2017/homework2/\350\257\264\346\230\216" create mode 100644 group05/group05.md create mode 100644 group06/1049564215/src/com/coding/basic/MyArrayList.java create mode 100644 group06/1049564215/src/com/coding/basic/MyLinkedList.java create mode 100644 group06/1049564215/src/com/coding/basic/MyQueue.java create mode 100644 group06/1049564215/src/com/coding/basic/MyStack.java create mode 100644 group06/1259131938/JavaLearning/.classpath create mode 100644 group06/1259131938/JavaLearning/.gitignore create mode 100644 group06/1259131938/JavaLearning/.project create mode 100644 group06/1259131938/JavaLearning/.settings/org.eclipse.jdt.core.prefs create mode 100644 group06/1259131938/JavaLearning/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group06/1259131938/JavaLearning/src/com/coding/basic/Iterator.java create mode 100644 group06/1259131938/JavaLearning/src/com/coding/basic/List.java create mode 100644 group06/1259131938/JavaLearning/src/com/coding/basic/MyArrayList.java create mode 100644 group06/1259131938/JavaLearning/src/com/coding/basic/MyLinkedList.java create mode 100644 group06/1259131938/JavaLearning/src/com/coding/basic/MyStack.java create mode 100644 group06/1259131938/JavaLearning/src/com/coding/basic/Queue.java create mode 100644 group06/1378560653/.classpath create mode 100644 group06/1378560653/.gitignore create mode 100644 group06/1378560653/.project create mode 100644 group06/1378560653/src/com/coderising/array/ArrayUtil.java create mode 100644 group06/1378560653/src/com/coderising/litestruts/LoginAction.java create mode 100644 group06/1378560653/src/com/coderising/litestruts/StructsTest.java create mode 100644 group06/1378560653/src/com/coderising/litestruts/Struts.java create mode 100644 group06/1378560653/src/com/coderising/litestruts/View.java create mode 100644 group06/1378560653/src/com/coderising/litestruts/structs.xml create mode 100644 group06/1378560653/src/com/coding/basic/ArrayList.java create mode 100644 group06/1378560653/src/com/coding/basic/BinaryTree.java create mode 100644 group06/1378560653/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group06/1378560653/src/com/coding/basic/Iterator.java create mode 100644 group06/1378560653/src/com/coding/basic/LinkedList.java create mode 100644 group06/1378560653/src/com/coding/basic/List.java create mode 100644 group06/1378560653/src/com/coding/basic/Queue.java create mode 100644 group06/1378560653/src/com/coding/basic/Stack.java create mode 100644 group06/1454385822/.classpath create mode 100644 group06/1454385822/.gitignore create mode 100644 group06/1454385822/.project create mode 100644 group06/1454385822/src/com/coding/basic/homework_01/ArrayList.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_01/BinaryTreeNode.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_01/Iterator.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_01/LinkedList.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_01/List.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_01/Queue.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_01/Stack.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtil.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_02/array/ArrayUtilTest.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_02/litestruts/LoginAction.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_02/litestruts/LogoutAction.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_02/litestruts/Struts.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_02/litestruts/StrutsTest.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_02/litestruts/View.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml create mode 100644 group06/1730798243/.classpath create mode 100644 group06/1730798243/.gitignore create mode 100644 group06/1730798243/.project create mode 100644 group06/1730798243/src/com/coding/basic/first/Iterator.java create mode 100644 group06/1730798243/src/com/coding/basic/first/List.java create mode 100644 group06/1730798243/src/com/coding/basic/first/impl/ArrayList.java create mode 100644 group06/1730798243/src/com/coding/basic/first/impl/LinkedList.java create mode 100644 group06/1730798243/src/com/coding/basic/first/impl/Queue.java create mode 100644 group06/1730798243/src/com/coding/basic/first/impl/Stack.java create mode 100644 group06/1730798243/src/com/coding/test/ArrayListTest.java create mode 100644 group06/1730798243/src/com/coding/test/LinkedListTest.java create mode 100644 group06/1730798243/src/com/coding/test/QueueTest.java create mode 100644 group06/1730798243/src/com/coding/test/StackTest.java create mode 100644 group06/236995728/.classpath create mode 100644 group06/236995728/.gitignore create mode 100644 group06/236995728/.project create mode 100644 group06/236995728/.settings/org.eclipse.jdt.core.prefs create mode 100644 "group06/236995728/CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" create mode 100644 group06/236995728/src/com/coding/basic/ArrayList.java create mode 100644 group06/236995728/src/com/coding/basic/ArrayListTest.java create mode 100644 group06/236995728/src/com/coding/basic/BinaryTreeNode.java create mode 100644 "group06/236995728/src/com/coding/basic/CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" create mode 100644 group06/236995728/src/com/coding/basic/Iterator.java create mode 100644 group06/236995728/src/com/coding/basic/LinkedList.java create mode 100644 group06/236995728/src/com/coding/basic/LinkedListTest.java create mode 100644 group06/236995728/src/com/coding/basic/List.java create mode 100644 group06/236995728/src/com/coding/basic/Queue.java create mode 100644 group06/236995728/src/com/coding/basic/QueueTest.java create mode 100644 group06/236995728/src/com/coding/basic/Stack.java create mode 100644 group06/236995728/src/com/coding/basic/StackTest.java create mode 100644 group06/2415980327/.gitignore create mode 100644 group06/2415980327/CodeSE01/.gitignore create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/Iterator.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/List.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/TreeData.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/ArrayList.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTree.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/BinaryTreeNode.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/LinkedList.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Queue.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/Stack.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se01/basic/impl/package-info.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se02/array/ArrayUtil.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/LoginAction.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Struts.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/StrutsTest.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/Tools.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/View.java create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/se02/litestruts/struts.xml create mode 100644 group06/2415980327/CodeSE01/src/com/pxshuo/test/Test.java create mode 100644 group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/ArrayListTest.java create mode 100644 group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/BinaryTreeTest.java create mode 100644 group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/LinkedListTest.java create mode 100644 group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/QueueTest.java create mode 100644 group06/2415980327/CodeSE01/src/test/com/pxshuo/se01/basic/impl/StackTest.java create mode 100644 group06/2415980327/CodeSE01/src/test/com/pxshuo/se02/array/ArrayUntilTest.java create mode 100644 "group06/2415980327/\346\226\207\347\253\240/SE01_\350\256\241\347\256\227\346\234\272CPU\343\200\201\347\241\254\347\233\230\343\200\201\345\206\205\345\255\230\344\273\245\345\217\212\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" create mode 100644 group06/263050006/article.txt create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/array/ArrayUtil.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyArrayList.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyBinarySearchTree.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyIterator.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyLinkedList.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyQueue.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyStack.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/collection/myown/MyTree.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/LoginAction.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/Struts.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/View.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/litestruts/struts.xml create mode 100644 group06/263050006/src/test/java/com/github/chaoswang/learning/java/array/ArrayUtilTest.java create mode 100644 group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyArrayListTest.java create mode 100644 group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyBinarySearchTreeTest.java create mode 100644 group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyLinkedListTest.java create mode 100644 group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyQueueTest.java create mode 100644 group06/263050006/src/test/java/com/github/chaoswang/learning/java/collection/myown/MyStackTest.java create mode 100644 group06/263050006/src/test/java/com/github/chaoswang/learning/java/litestruts/StrutsTest.java create mode 100644 group06/284999210/.classpath create mode 100644 group06/284999210/.gitignore create mode 100644 group06/284999210/.project create mode 100644 "group06/284999210/2017_week_8_CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.doc" create mode 100644 group06/284999210/src/com/coding/basic/container/ArrayList.java create mode 100644 group06/284999210/src/com/coding/basic/container/BinaryTreeNode.java create mode 100644 group06/284999210/src/com/coding/basic/container/Iterator.java create mode 100644 group06/284999210/src/com/coding/basic/container/LinkedList.java create mode 100644 group06/284999210/src/com/coding/basic/container/List.java create mode 100644 group06/284999210/src/com/coding/basic/container/Queue.java create mode 100644 group06/284999210/src/com/coding/basic/container/Stack.java create mode 100644 group06/284999210/src/com/coding/basic/container/test/TestContainer.java create mode 100644 group06/290149544/blog/README.md create mode 100644 group06/290149544/hw1/.classpath create mode 100644 group06/290149544/hw1/.gitattributes create mode 100644 group06/290149544/hw1/.gitignore create mode 100644 group06/290149544/hw1/.project create mode 100644 group06/290149544/hw1/README.md create mode 100644 group06/290149544/hw1/src/hw1/ArrayList.java create mode 100644 group06/290149544/hw1/src/hw1/JavaTest.java create mode 100644 group06/290149544/hw1/src/hw1/LinkedList.java create mode 100644 group06/290149544/hw1/src/hw1/List.java create mode 100644 group06/290149544/hw1/src/hw1/Queue.java create mode 100644 group06/290149544/hw1/src/hw1/Stack.java create mode 100644 group06/309953838/.classpath create mode 100644 group06/309953838/.gitignore create mode 100644 group06/309953838/.project create mode 100644 group06/309953838/src/com/team6/week1/ArrayList.java create mode 100644 group06/309953838/src/com/team6/week1/LinkedList.java create mode 100644 group06/309953838/src/com/team6/week1/List.java create mode 100644 group06/309953838/src/com/team6/week1/Queue.java create mode 100644 group06/309953838/src/com/team6/week1/Stack.java create mode 100644 group06/547958234/src/com/coding/basic/ArrayList.java create mode 100644 group06/547958234/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group06/547958234/src/com/coding/basic/Iterator.java create mode 100644 group06/547958234/src/com/coding/basic/LinkedList.java create mode 100644 group06/547958234/src/com/coding/basic/LinkedListTest.java create mode 100644 group06/547958234/src/com/coding/basic/List.java create mode 100644 group06/547958234/src/com/coding/basic/Queue.java create mode 100644 group06/547958234/src/com/coding/basic/Stack.java create mode 100644 group06/736464448/data_structure/MyArrayList.java create mode 100644 group06/736464448/data_structure/MyBinaryTree.java create mode 100644 group06/736464448/data_structure/MyLinkedList.java create mode 100644 group06/736464448/data_structure/MyQueue.java create mode 100644 group06/736464448/data_structure/MyStack.java create mode 100644 group06/736464448/test_data_structure/TestMyArrayList.java create mode 100644 group06/736464448/test_data_structure/TestMyBinaryTree.java create mode 100644 group06/736464448/test_data_structure/TestMyLinkedList.java create mode 100644 group06/736464448/test_data_structure/TestMyQueue.java create mode 100644 group06/736464448/test_data_structure/TestMyStack.java create mode 100644 group06/799237637/secondhomework/src/com/liteStructs/LoginAction.java create mode 100644 group06/799237637/secondhomework/src/com/liteStructs/Structs.java create mode 100644 group06/799237637/secondhomework/src/com/liteStructs/View.java create mode 100644 group06/799237637/secondhomework/src/com/liteStructs/struts.xml create mode 100644 group06/799237637/secondhomework/src/secondhomework/MyArrayUtil.java create mode 100644 group06/799237637/src/com/firsthomework/MyArrayList.java create mode 100644 group06/799237637/src/com/firsthomework/MyLinkedList.java create mode 100644 group06/799237637/src/com/firsthomework/MyQueue.java create mode 100644 group06/799237637/src/com/firsthomework/MyStack.java create mode 100644 "group06/799237637/\347\254\254\344\270\200\345\221\250\346\226\207\347\253\240\345\234\260\345\235\200.txt" create mode 100644 "group06/799237637/\347\254\254\344\272\214\345\221\250\346\226\207\347\253\240\345\234\260\345\235\200.txt" create mode 100644 group06/949319266/.classpath create mode 100644 group06/949319266/.project create mode 100644 group06/949319266/.settings/org.eclipse.jdt.core.prefs create mode 100644 group06/949319266/949319266learn/.classpath create mode 100644 group06/949319266/949319266learn/.settings/org.eclipse.jdt.core.prefs create mode 100644 group06/949319266/RemoteSystemsTempFiles/.project create mode 100644 group06/949319266/homework/.classpath create mode 100644 group06/949319266/homework/.gitignore create mode 100644 group06/949319266/homework/.project create mode 100644 group06/949319266/homework/.settings/org.eclipse.core.resources.prefs create mode 100644 group06/949319266/homework/.settings/org.eclipse.jdt.core.prefs create mode 100644 group06/949319266/homework/src/cn/ecust/Array/ArrayUtil.java create mode 100644 group06/949319266/homework/src/cn/ecust/Iitestruts/LoginAction.java create mode 100644 group06/949319266/homework/src/cn/ecust/Iitestruts/Struts.java create mode 100644 group06/949319266/homework/src/cn/ecust/Iitestruts/StrutsTest.java create mode 100644 group06/949319266/homework/src/cn/ecust/Iitestruts/View.java create mode 100644 group06/949319266/homework/src/cn/ecust/Iitestruts/struts.xml create mode 100644 group06/949319266/homework/src/cn/ecust/Test/ArrayUtilTest.java create mode 100644 "group06/949319266/homework/src/\346\226\207\347\253\2402.txt" create mode 100644 group06/949319266/src/com/coding/basic/ArrayList.java create mode 100644 group06/949319266/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group06/949319266/src/com/coding/basic/LinkedList.java create mode 100644 group06/949319266/src/com/coding/basic/List.java create mode 100644 group06/949319266/src/com/coding/basic/Queue.java create mode 100644 group06/949319266/src/com/coding/basic/Stack.java create mode 100644 group06/949319266/src/com/coding/basic/test/ArrayListTest.java create mode 100644 group06/949319266/src/com/coding/basic/test/LinkedListTest.java create mode 100644 group06/949319266/src/com/coding/basic/test/QueueTest.java create mode 100644 group06/949319266/src/com/coding/basic/test/StackTest.java create mode 100644 "group06/949319266/\346\226\207\347\253\240.txt" create mode 100644 group06/group06.md create mode 100644 "group07/1046545622/git\345\221\275\344\273\244.txt" create mode 100644 group07/1058267830/week1/.classpath create mode 100644 group07/1058267830/week1/.project create mode 100644 group07/1058267830/week1/.settings/org.eclipse.jdt.core.prefs create mode 100644 group07/1058267830/week1/src/com/coding/basic/ArrayList.java create mode 100644 group07/1058267830/week1/src/com/coding/basic/BinaryTree.java create mode 100644 group07/1058267830/week1/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group07/1058267830/week1/src/com/coding/basic/Iterator.java create mode 100644 group07/1058267830/week1/src/com/coding/basic/LinkedList.java create mode 100644 group07/1058267830/week1/src/com/coding/basic/List.java create mode 100644 group07/1058267830/week1/src/com/coding/basic/Node.java create mode 100644 group07/1058267830/week1/src/com/coding/basic/Queue.java create mode 100644 group07/1058267830/week1/src/com/coding/basic/Stack.java create mode 100644 group07/1058267830/week1/test/com/coding/test/TestArrayList.java create mode 100644 group07/1058267830/week1/test/com/coding/test/TestBinaryTree.java create mode 100644 group07/1058267830/week1/test/com/coding/test/TestLinkedList.java create mode 100644 group07/1058267830/week1/test/com/coding/test/TestQueue.java create mode 100644 group07/1058267830/week1/test/com/coding/test/TestStack.java create mode 100644 group07/1058267830/week2/.classpath create mode 100644 group07/1058267830/week2/.project create mode 100644 group07/1058267830/week2/.settings/org.eclipse.jdt.core.prefs create mode 100644 group07/1058267830/week2/bin/com/coderising/litestruts/struts.xml create mode 100644 group07/1058267830/week2/src/com/coderising/array/ArrayTest.java create mode 100644 group07/1058267830/week2/src/com/coderising/array/ArrayUtil.java create mode 100644 group07/1058267830/week2/src/com/coderising/litestruts/Demo.java create mode 100644 group07/1058267830/week2/src/com/coderising/litestruts/LoginAction.java create mode 100644 group07/1058267830/week2/src/com/coderising/litestruts/Struts.java create mode 100644 group07/1058267830/week2/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group07/1058267830/week2/src/com/coderising/litestruts/View.java create mode 100644 group07/1058267830/week2/src/com/coderising/litestruts/struts.xml create mode 100644 "group07/1070440331/git\345\221\275\344\273\244.txt" create mode 100644 group07/1280157271/20170224-01-ArrayList/.classpath create mode 100644 group07/1280157271/20170224-01-ArrayList/.gitignore create mode 100644 group07/1280157271/20170224-01-ArrayList/.project create mode 100644 group07/1280157271/20170224-01-ArrayList/.settings/org.eclipse.jdt.core.prefs create mode 100644 group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/List.java create mode 100644 group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myArrayList.java create mode 100644 group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myBinaryTreeNode.java create mode 100644 group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myLinkedList.java create mode 100644 group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myQueue.java create mode 100644 group07/1280157271/20170224-01-ArrayList/src/firstHomework/fan/myStack.java create mode 100644 "group07/1280157271/git\345\221\275\344\273\244.txt" create mode 100644 "group07/1280157271/\347\254\254\344\270\200\346\254\241\345\215\232\345\256\242\345\234\260\345\235\200--CPU \345\206\205\345\255\230 \347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273 .txt" create mode 100644 group07/1448276993/JavaStudy/.classpath create mode 100644 group07/1448276993/JavaStudy/.gitignore create mode 100644 group07/1448276993/JavaStudy/.project create mode 100644 group07/1448276993/JavaStudy/.settings/org.eclipse.jdt.core.prefs create mode 100644 group07/1448276993/JavaStudy/src/java1/ArrayList.java create mode 100644 group07/1448276993/JavaStudy/src/java1/LinkedList.java create mode 100644 group07/1448276993/JavaStudy/src/java1/List.java create mode 100644 group07/1448276993/JavaStudy/src/java1/Queue.java create mode 100644 group07/1448276993/JavaStudy/src/java1/Stack.java create mode 100644 "group07/1448276993/git\345\221\275\344\273\244.txt" create mode 100644 group07/1519504320/.classpath create mode 100644 group07/1519504320/.gitignore create mode 100644 group07/1519504320/.project create mode 100644 "group07/1519504320/git\345\221\275\344\273\244.txt" create mode 100644 group07/1519504320/src/coderising/array/ArrayUtil.java create mode 100644 group07/1519504320/src/coderising/litestruts/LoginAction.java create mode 100644 group07/1519504320/src/coderising/litestruts/Struts.java create mode 100644 group07/1519504320/src/coderising/litestruts/StrutsTest.java create mode 100644 group07/1519504320/src/coderising/litestruts/View.java create mode 100644 group07/1519504320/src/coderising/litestruts/struts.xml create mode 100644 group07/1519504320/src/com/coding/basic/ArrayList.java create mode 100644 group07/1519504320/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group07/1519504320/src/com/coding/basic/Iterator.java create mode 100644 group07/1519504320/src/com/coding/basic/LinkedList.java create mode 100644 group07/1519504320/src/com/coding/basic/List.java create mode 100644 group07/1519504320/src/com/coding/basic/Queue.java create mode 100644 group07/1519504320/src/com/coding/basic/Stack.java create mode 100644 "group07/1520332119/git\345\221\275\344\273\244.txt" create mode 100644 group07/1536161030/.classpath create mode 100644 group07/1536161030/.gitignore create mode 100644 group07/1536161030/.project create mode 100644 group07/1536161030/.settings/org.eclipse.core.resources.prefs create mode 100644 "group07/1536161030/CPU,\345\206\205\345\255\230,\347\241\254\347\233\230,\346\214\207\344\273\244.txt" create mode 100644 "group07/1536161030/git\345\221\275\344\273\244.txt" create mode 100644 group07/1536161030/src/com/coding/basic/ArrayList.java create mode 100644 group07/1536161030/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group07/1536161030/src/com/coding/basic/Iterator.java create mode 100644 group07/1536161030/src/com/coding/basic/LinkedList.java create mode 100644 group07/1536161030/src/com/coding/basic/List.java create mode 100644 group07/1536161030/src/com/coding/basic/Queue.java create mode 100644 group07/1536161030/src/com/coding/basic/Stack.java create mode 100644 group07/1536161030/src/com/coding/test/ArrayListTest.java create mode 100644 group07/1536161030/src/com/coding/test/BinaryTreeNodeTest.java create mode 100644 group07/1536161030/src/com/coding/test/LinkedListTest.java create mode 100644 group07/1536161030/src/com/coding/test/QueueTest.java create mode 100644 group07/1536161030/src/com/coding/test/StackTest.java create mode 100644 group07/178007127/001DataStructure/.classpath create mode 100644 group07/178007127/001DataStructure/.gitignore create mode 100644 group07/178007127/001DataStructure/.project create mode 100644 group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.core.import.prefs create mode 100644 group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.core.prefs create mode 100644 group07/178007127/001DataStructure/.settings/gradle/org.springsource.ide.eclipse.gradle.refresh.prefs create mode 100644 group07/178007127/001DataStructure/.settings/org.eclipse.jdt.core.prefs create mode 100644 group07/178007127/001DataStructure/README.md create mode 100644 group07/178007127/001DataStructure/build.gradle create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/codersing/array/ArrayUtil.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/LoginAction.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/Struts.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/StrutsTest.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/TestApp.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/View.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/codersing/litestruts/struts.xml create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/core/AppUtils.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/util/junit/app/TestApp.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/util/myarraylist/ArrayList.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/util/myiterator/Iterator.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/util/mylinkedlist/LinkedList.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/util/myqueue/Queue.java create mode 100644 group07/178007127/001DataStructure/src/main/java/com/easy/util/mystack/Stack.java create mode 100644 group07/178007127/001DataStructure/src/test/java/com/easy/codersing/array/TestArrayUtil.java create mode 100644 group07/178007127/001DataStructure/src/test/java/com/easy/util/myarraylist/TestArrayList.java create mode 100644 group07/178007127/001DataStructure/src/test/java/com/easy/util/mylinkedlist/TestLinkedList.java create mode 100644 group07/178007127/001DataStructure/src/test/java/com/easy/util/myqueue/TestQueue.java create mode 100644 group07/178007127/001DataStructure/src/test/java/com/easy/util/mystack/TestStack.java create mode 100644 "group07/178007127/git\345\221\275\344\273\244.txt" create mode 100644 "group07/20409287/git\345\221\275\344\273\244.txt" create mode 100644 group07/20409287/src/main/java/xdx/homework/first/ArrayList.java create mode 100644 group07/20409287/src/main/java/xdx/homework/first/Hello.java create mode 100644 group07/20409287/src/main/java/xdx/homework/first/Iterator.java create mode 100644 group07/20409287/src/main/java/xdx/homework/first/LinkedList.java create mode 100644 group07/20409287/src/main/java/xdx/homework/first/List.java create mode 100644 group07/20409287/src/main/java/xdx/homework/first/Queue.java create mode 100644 group07/20409287/src/main/java/xdx/homework/first/Stack.java create mode 100644 group07/20409287/src/main/java/xdx/homework/second/array/ArrayUtil.java create mode 100644 group07/20409287/src/main/java/xdx/homework/second/litestruts/LoginAction.java create mode 100644 group07/20409287/src/main/java/xdx/homework/second/litestruts/Struts.java create mode 100644 group07/20409287/src/main/java/xdx/homework/second/litestruts/StrutsTest.java create mode 100644 group07/20409287/src/main/java/xdx/homework/second/litestruts/View.java create mode 100644 group07/20409287/src/main/java/xdx/homework/second/litestruts/struts.xml create mode 100644 group07/20409287/src/test/xdx/homework/first/ArrayListTest.java create mode 100644 group07/20409287/src/test/xdx/homework/first/LinkedListTest.java create mode 100644 group07/20409287/src/test/xdx/homework/first/QueueTest.java create mode 100644 group07/20409287/src/test/xdx/homework/first/StackTest.java create mode 100644 group07/20409287/src/test/xdx/homework/second/ArrayUtilTest.java create mode 100644 "group07/2306826375/git\345\221\275\344\273\244.txt" create mode 100644 group07/2306826375/txt create mode 100644 "group07/2708094737/git\345\221\275\344\273\244.txt" create mode 100644 "group07/2915553181/git\345\221\275\344\273\244.txt" create mode 100644 "group07/328536398/git\345\221\275\344\273\244.txt" create mode 100644 group07/396868934/DataStructure/.classpath create mode 100644 group07/396868934/DataStructure/.project create mode 100644 group07/396868934/DataStructure/.settings/org.eclipse.jdt.core.prefs create mode 100644 group07/396868934/DataStructure/bin/.gitignore create mode 100644 group07/396868934/DataStructure/src/com/louisly/java/LYArrayLink.java create mode 100644 group07/396868934/DataStructure/src/com/louisly/java/LYArrayList.java create mode 100644 group07/396868934/DataStructure/src/com/louisly/java/LYArrayListTest.java create mode 100644 group07/396868934/DataStructure/src/com/louisly/java/LYBinaryTree.java create mode 100644 group07/396868934/DataStructure/src/com/louisly/java/LYIterator.java create mode 100644 group07/396868934/DataStructure/src/com/louisly/java/LYObject.java create mode 100644 group07/396868934/DataStructure/src/com/louisly/java/LYQueue.java create mode 100644 group07/396868934/DataStructure/src/com/louisly/java/LYStack.java create mode 100644 group07/396868934/DataStructure/src/com/louisly/java/main.java create mode 100644 "group07/396868934/git\345\221\275\344\273\244.txt" create mode 100644 "group07/43819473/git\345\221\275\344\273\244.txt" create mode 100644 group07/43819473/homework/pom.xml create mode 100644 group07/43819473/homework/src/main/java/coderising/array/ArrayUtil.java create mode 100644 group07/43819473/homework/src/main/java/coderising/litestruts/LoginAction.java create mode 100644 group07/43819473/homework/src/main/java/coderising/litestruts/Struts.java create mode 100644 group07/43819473/homework/src/main/java/coderising/litestruts/StrutsTest.java create mode 100644 group07/43819473/homework/src/main/java/coderising/litestruts/View.java create mode 100644 group07/43819473/homework/src/main/java/coderising/litestruts/struts.xml create mode 100644 group07/43819473/homework/src/main/java/dataStructure/ArrayList.java create mode 100644 group07/43819473/homework/src/main/java/dataStructure/BinaryTree.java create mode 100644 group07/43819473/homework/src/main/java/dataStructure/Iterator.java create mode 100644 group07/43819473/homework/src/main/java/dataStructure/LinkedList.java create mode 100644 group07/43819473/homework/src/main/java/dataStructure/List.java create mode 100644 group07/43819473/homework/src/main/java/dataStructure/Queue.java create mode 100644 group07/43819473/homework/src/main/java/dataStructure/Stack.java create mode 100644 group07/43819473/homework/src/test/java/coderising/array/ArrayUtilTest.java create mode 100644 group07/43819473/homework/src/test/java/dataStructure/ArrayListTest.java create mode 100644 group07/43819473/homework/src/test/java/dataStructure/BinaryTreeTest.java create mode 100644 group07/43819473/homework/src/test/java/dataStructure/LinkedListTest.java create mode 100644 group07/43819473/homework/src/test/java/dataStructure/QueueTest.java create mode 100644 group07/43819473/homework/src/test/java/dataStructure/StackTest.java create mode 100644 "group07/466199956/git\345\221\275\344\273\244.txt" create mode 100644 group07/476770768/MyDataStructure/.classpath create mode 100644 group07/476770768/MyDataStructure/.gitignore create mode 100644 group07/476770768/MyDataStructure/.project create mode 100644 group07/476770768/MyDataStructure/.settings/org.eclipse.jdt.core.prefs create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyArrayList.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyArrayListTest.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyIterator.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyLinkedList.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyLinkedListTest.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyList.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyQueue.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyQueueTest.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyStack.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/MyStackTest.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/basic/testFile.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyArrayList.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyIterator.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/refactor/List/MyList.java create mode 100644 group07/476770768/MyDataStructure/src/com/coding/refactor/List/TestFile.java create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/.classpath create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/.gitignore create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/.project create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/.settings/org.eclipse.jdt.core.prefs create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/src/com/Array/ArrayUtil.java create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/src/com/Array/ArrayUtilTest.java create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtil.java create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/src/com/LinkedList/LinkedListUtilTest.java create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/LoginAction.java create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/Struts.java create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/StrutsTest.java create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/View.java create mode 100644 group07/476770768/Week2_HOMEWORK/Coderising/src/com/litestruts/struts.xml create mode 100644 "group07/476770768/git\345\221\275\344\273\244.txt" create mode 100644 "group07/515372252/git\345\221\275\344\273\244.txt" create mode 100644 "group07/562247675/git\345\221\275\344\273\244.txt" create mode 100644 group07/562247675/homework/.gitignore create mode 100644 group07/562247675/homework/homework-0226/pom.xml create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayList.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyArrayListTest.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNode.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyBinaryTreeNodeTest.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyIterator.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedList.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyLinkedListTest.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyList.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueue.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyQueueTest.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStack.java create mode 100644 group07/562247675/homework/homework-0226/src/main/java/com/coding2017/group7/homework/c0226/MyStackTest.java create mode 100644 group07/562247675/homework/homework-0226/src/main/resources/readme.md create mode 100644 group07/562247675/homework/homework-0305/pom.xml create mode 100644 group07/562247675/homework/homework-0305/src/main/java/com/coderising/array/MyArrayUtil.java create mode 100644 group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/LoginAction.java create mode 100644 group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStruts.java create mode 100644 group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/MyStrutsTest.java create mode 100644 group07/562247675/homework/homework-0305/src/main/java/com/coderising/litestruts/View.java create mode 100644 group07/562247675/homework/homework-0305/src/main/resources/struts.xml create mode 100644 group07/562247675/homework/pom.xml create mode 100644 group07/562247675/homework/readme.md create mode 100644 group07/562247675/notebook/readme.md create mode 100644 "group07/598812995/git\345\221\275\344\273\244.txt" create mode 100644 "group07/603622009/git\345\221\275\344\273\244.txt" create mode 100644 "group07/724319952/git\345\221\275\344\273\244.txt" create mode 100644 group07/724319952/src/cn/fyl/first/ArrayList.java create mode 100644 group07/724319952/src/cn/fyl/first/BinaryTreeNode.java create mode 100644 group07/724319952/src/cn/fyl/first/Iterator.java create mode 100644 group07/724319952/src/cn/fyl/first/LinkedList.java create mode 100644 group07/724319952/src/cn/fyl/first/List.java create mode 100644 group07/724319952/src/cn/fyl/first/Queue.java create mode 100644 group07/724319952/src/cn/fyl/first/Stack.java create mode 100644 group07/724319952/src/cn/fyl/second/ArrayUtil.java create mode 100644 group07/752262774/.gitignore create mode 100644 group07/752262774/src/com/coderising/array/ArrayUtil.java create mode 100644 group07/752262774/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group07/752262774/src/com/coderising/litestruts/LoginAction.java create mode 100644 group07/752262774/src/com/coderising/litestruts/Struts.java create mode 100644 group07/752262774/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group07/752262774/src/com/coderising/litestruts/View.java create mode 100644 group07/752262774/src/com/coderising/litestruts/struts.xml create mode 100644 group07/752262774/src/com/coding/basic/ArrayList.java create mode 100644 group07/752262774/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group07/752262774/src/com/coding/basic/Iterator.java create mode 100644 group07/752262774/src/com/coding/basic/LinkedList.java create mode 100644 group07/752262774/src/com/coding/basic/List.java create mode 100644 group07/752262774/src/com/coding/basic/Queue.java create mode 100644 group07/752262774/src/com/coding/basic/Stack.java create mode 100644 group07/764189149/.classpath create mode 100644 group07/764189149/.gitignore create mode 100644 group07/764189149/.project create mode 100644 group07/764189149/src/com/coderising/download/DownloadThread.java create mode 100644 group07/764189149/src/com/coderising/download/FileDownloader.java create mode 100644 group07/764189149/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group07/764189149/src/com/coderising/download/api/Connection.java create mode 100644 group07/764189149/src/com/coderising/download/api/ConnectionException.java create mode 100644 group07/764189149/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group07/764189149/src/com/coderising/download/api/DownloadListener.java create mode 100644 group07/764189149/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group07/764189149/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group07/764189149/src/com/leijing/coderising/array/ArrayUtil.java create mode 100644 group07/764189149/src/com/leijing/coderising/array/ArrayUtilTest.java create mode 100644 group07/764189149/src/com/leijing/coderising/litestruts/LoginAction.java create mode 100644 group07/764189149/src/com/leijing/coderising/litestruts/Struts.java create mode 100644 group07/764189149/src/com/leijing/coderising/litestruts/StrutsTest.java create mode 100644 group07/764189149/src/com/leijing/coderising/litestruts/View.java create mode 100644 group07/764189149/src/com/leijing/coderising/litestruts/struts.xml create mode 100644 group07/764189149/src/firstHomeWork/util/ArrayList.java create mode 100644 group07/764189149/src/firstHomeWork/util/BinaryTreeNode.java create mode 100644 group07/764189149/src/firstHomeWork/util/DoubleLinkedList.java create mode 100644 group07/764189149/src/firstHomeWork/util/Iterator.java create mode 100644 group07/764189149/src/firstHomeWork/util/List.java create mode 100644 group07/764189149/src/firstHomeWork/util/Queue.java create mode 100644 group07/764189149/src/firstHomeWork/util/Stack.java create mode 100644 "group07/770164810/git\345\221\275\344\273\244.txt" create mode 100644 group07/770164810/src/com/coding/basic/ArrayList.java create mode 100644 group07/770164810/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group07/770164810/src/com/coding/basic/Iterator.java create mode 100644 group07/770164810/src/com/coding/basic/LinkedList.java create mode 100644 group07/770164810/src/com/coding/basic/List.java create mode 100644 group07/770164810/src/com/coding/basic/Queue.java create mode 100644 group07/770164810/src/com/coding/basic/Stack.java create mode 100644 group07/group07.md create mode 100644 group08/108621969/2-26/com/coding/basic/ArrayList.java create mode 100644 group08/108621969/2-26/com/coding/basic/BinaryTreeNode.java create mode 100644 group08/108621969/2-26/com/coding/basic/Iterator.java create mode 100644 group08/108621969/2-26/com/coding/basic/LinkedList.java create mode 100644 group08/108621969/2-26/com/coding/basic/List.java create mode 100644 group08/108621969/2-26/com/coding/basic/Queue.java create mode 100644 group08/108621969/2-26/com/coding/basic/Stack.java create mode 100644 group08/108621969/README.md create mode 100644 group08/108621969/article/Comp-Units-Relations(2-16).md create mode 100644 group08/1144989424/Readme.md create mode 100644 group08/1144989424/firstPractice/readme.md create mode 100644 group08/1144989424/firstPractice/src/basic/BinaryTreeNode.java create mode 100644 group08/1144989424/firstPractice/src/basic/MyArrayList.java create mode 100644 group08/1144989424/firstPractice/src/basic/MyIterator.java create mode 100644 group08/1144989424/firstPractice/src/basic/MyLinkedList.java create mode 100644 group08/1144989424/firstPractice/src/basic/MyList.java create mode 100644 group08/1144989424/firstPractice/src/basic/MyQueue.java create mode 100644 group08/1144989424/firstPractice/src/basic/MySortBinaryTree.java create mode 100644 group08/1144989424/firstPractice/src/basic/MyStack.java create mode 100644 "group08/121027265/0226/cpu_\345\206\205\345\255\230_\347\241\254\347\233\230_\346\214\207\344\273\244\344\271\213\351\227\264\345\205\263\347\263\273.md" create mode 100644 group08/121027265/0226/src/com/my/list/ArrayList.java create mode 100644 group08/121027265/0226/src/com/my/list/LinkedList.java create mode 100644 group08/121027265/0226/src/com/my/list/Test.java create mode 100644 group08/121027265/README.md create mode 100644 group08/1226637491/2_26/ArrayList.java create mode 100644 group08/1226637491/2_26/LinkedList.java create mode 100644 group08/1226637491/2_26/Queue.java create mode 100644 group08/1226637491/2_26/Stack.java create mode 100644 "group08/1226637491/2_26/\346\226\207\347\253\240\346\211\200\345\234\250\347\232\204\347\275\221\345\235\200.txt" create mode 100644 group08/125980622/125980622.js create mode 100644 group08/125980622/first_hw/ArrayList.java create mode 100644 group08/125980622/first_hw/BinaryTreeNode.java create mode 100644 group08/125980622/first_hw/Iterator.java create mode 100644 group08/125980622/first_hw/LinkedList.java create mode 100644 group08/125980622/first_hw/List.java create mode 100644 group08/125980622/first_hw/Queue.java create mode 100644 group08/125980622/first_hw/Stack.java create mode 100644 group08/125980622/first_hw/myIterator.java create mode 100644 group08/1277959541/1277959541 create mode 100644 group08/1287324781/1287324781 create mode 100644 group08/1425809544/02-26/com/xuyangyang/util/BinaryTree.java create mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyArrayList.java create mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyIterator.java create mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyLinkedList.java create mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyList.java create mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyQueueArray.java create mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyQueueLinked.java create mode 100644 group08/1425809544/02-26/com/xuyangyang/util/MyStack.java create mode 100644 group08/1425809544/02-26/com/xuyangyang/util/Test.java create mode 100644 "group08/1425809544/02-26/cpu \345\206\205\345\255\230 \347\241\254\347\233\230 \345\222\214\346\214\207\344\273\244\347\232\204\345\205\263\347\263\273.txt" create mode 100644 "group08/1425809544/02-26/\346\226\207\347\253\240\351\223\276\346\216\245-java\351\233\206\345\220\210 \345\256\271\345\231\250 \347\256\200\345\215\225\346\246\202\350\277\260" create mode 100644 group08/1425809544/1425809544.md create mode 100644 group08/1509102580/2.27/ArrayList.java create mode 100644 group08/1509102580/2.27/Iterator.java create mode 100644 group08/1509102580/2.27/LinkedList.java create mode 100644 group08/1509102580/2.27/List.java create mode 100644 group08/1509102580/2.27/Queue.java create mode 100644 group08/1509102580/2.27/Stack.java create mode 100644 "group08/1509102580/2.27/\346\226\207\347\253\240" create mode 100644 group08/2420826330/2420826330.md create mode 100644 group08/283677872/2-26/.classpath create mode 100644 group08/283677872/2-26/.gitignore create mode 100644 group08/283677872/2-26/.project create mode 100644 "group08/283677872/2-26/CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\345\205\263\347\263\273.docx" create mode 100644 group08/283677872/2-26/src/com/coding/basic/ArrayList.java create mode 100644 group08/283677872/2-26/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group08/283677872/2-26/src/com/coding/basic/Iterator.java create mode 100644 group08/283677872/2-26/src/com/coding/basic/LinkedList.java create mode 100644 group08/283677872/2-26/src/com/coding/basic/List.java create mode 100644 group08/283677872/2-26/src/com/coding/basic/Main.java create mode 100644 group08/283677872/2-26/src/com/coding/basic/Queue.java create mode 100644 group08/283677872/2-26/src/com/coding/basic/Stack.java create mode 100644 "group08/286060098/2-26/blong/\345\237\272\346\234\254\347\273\223\346\236\204.md" create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/AbstractCollection.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Collection.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/Iterator.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/ArrayList.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/LinkedList.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/list/List.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/LinkQueue.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/queue/Queue.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/LinkStack.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/collection/stack/Stack.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/tree/AbstractTree.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryNode.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/tree/BinaryTree.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/first/tree/Tree.java create mode 100644 group08/286060098/2-26/src/com/pop/practice/homework/utils/Math.java create mode 100644 group08/286060098/readme.md create mode 100644 group08/406166841/2-26/CPU.md create mode 100644 group08/406166841/2-26/CustomArrayList.java create mode 100644 group08/406166841/2-26/CustomLinkedList.java create mode 100644 group08/406166841/2-26/CustomQueue.java create mode 100644 group08/406166841/2-26/CustomStack.java create mode 100644 group08/406166841/2-26/Iterator.java create mode 100644 group08/406166841/2-26/List.java create mode 100644 group08/406166841/406166841.md create mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/ArrayList.java" create mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/BinaryTreeNode.java" create mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Iterator.java" create mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/LinkedList.java" create mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/List.java" create mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Queue.java" create mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Stack.java" create mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/com/coding/basic/Test.java" create mode 100644 "group08/529757467/2017-02-26\344\275\234\344\270\232/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.doc" create mode 100644 "group08/619057560/2-26/article/CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.pdf" create mode 100644 group08/619057560/2-26/code/com/coding/basic/ArrayList.java create mode 100644 group08/619057560/2-26/code/com/coding/basic/BinaryTreeNode.java create mode 100644 group08/619057560/2-26/code/com/coding/basic/Iterator.java create mode 100644 group08/619057560/2-26/code/com/coding/basic/LinkedList.java create mode 100644 group08/619057560/2-26/code/com/coding/basic/List.java create mode 100644 group08/619057560/2-26/code/com/coding/basic/Queue.java create mode 100644 group08/619057560/2-26/code/com/coding/basic/Stack.java create mode 100644 group08/619057560/2-26/code/com/coding/test/Main.java create mode 100644 group08/619057560/CHHSAlex.md create mode 100644 group08/648354678/README.md create mode 100644 group08/649859235/2-26/article.md create mode 100644 group08/649859235/2-26/com/vvv/base/ArrayList.java create mode 100644 group08/649859235/2-26/com/vvv/base/BinaryTreeNode.java create mode 100644 group08/649859235/2-26/com/vvv/base/IList.java create mode 100644 group08/649859235/2-26/com/vvv/base/LinkedList.java create mode 100644 group08/649859235/2-26/com/vvv/base/Queue.java create mode 100644 group08/649859235/2-26/com/vvv/base/Stack.java create mode 100644 group08/649859235/README.md create mode 100644 group08/729770920/.gitignore create mode 100644 group08/729770920/2-26/resource/report.txt create mode 100644 group08/729770920/2-26/src/com/coding/basic/ArrayList.java create mode 100644 group08/729770920/2-26/src/com/coding/basic/BinaryTree.java create mode 100644 group08/729770920/2-26/src/com/coding/basic/Iterator.java create mode 100644 group08/729770920/2-26/src/com/coding/basic/LinkedList.java create mode 100644 group08/729770920/2-26/src/com/coding/basic/List.java create mode 100644 group08/729770920/2-26/src/com/coding/basic/Queue.java create mode 100644 group08/729770920/2-26/src/com/coding/basic/Stack.java create mode 100644 group08/729770920/README.md create mode 100644 group08/769638826/2-27/ArrayList.java create mode 100644 group08/769638826/2-27/ArrayListTest.java create mode 100644 group08/769638826/2-27/Iterator.java create mode 100644 group08/769638826/2-27/LinkedList.java create mode 100644 group08/769638826/2-27/LinkedListTest.java create mode 100644 group08/769638826/2-27/List.java create mode 100644 group08/769638826/2-27/Queue.java create mode 100644 group08/769638826/2-27/QueueTest.java create mode 100644 group08/769638826/2-27/Stack.java create mode 100644 group08/769638826/2-27/StackTest.java create mode 100644 group08/769638826/README.md create mode 100644 group08/782476895/20170225/ArrayList.java create mode 100644 group08/782476895/20170225/LinkedList.java create mode 100644 group08/782476895/20170225/List.java create mode 100644 group08/782476895/20170225/Queue.java create mode 100644 group08/782476895/20170225/Stack.java create mode 100644 "group08/782476895/20170225/\346\217\217\350\277\260CPU\357\274\214\345\206\205\345\255\230\357\274\214 \347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.docx" create mode 100644 group08/875325254/2-26/ArrayList.java create mode 100644 group08/875325254/2-26/LinkList.java create mode 100644 group08/875325254/2-26/Queue.java create mode 100644 group08/875325254/2-26/Stack.java create mode 100644 group08/875325254/2-26/Test.java create mode 100644 group08/875325254/875325254.md create mode 100644 group08/group08.md create mode 100644 group09/1271620150/Work01/.gitignore create mode 100644 group09/1271620150/Work01/src/com/coding/basic/ArrayList.java create mode 100644 group09/1271620150/Work01/src/com/coding/basic/Iterator.java create mode 100644 group09/1271620150/Work01/src/com/coding/basic/LinkedList.java create mode 100644 group09/1271620150/Work01/src/com/coding/basic/List.java create mode 100644 group09/1271620150/Work01/src/com/coding/basic/Queue.java create mode 100644 group09/1271620150/Work01/src/com/coding/basic/Stack.java create mode 100644 group09/277123057/Week01/ArrayList.java create mode 100644 group09/277123057/Week01/BinaryTreeNode.java create mode 100644 group09/277123057/Week01/Iterator.java create mode 100644 group09/277123057/Week01/LinkedList.java create mode 100644 group09/277123057/Week01/List.java create mode 100644 group09/277123057/Week01/Queue.java create mode 100644 group09/277123057/Week01/Stack.java create mode 100644 group09/277123057/Week01/Test.java create mode 100644 "group09/396077060/20170226/article/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200\347\237\245\350\257\206.txt" create mode 100644 group09/396077060/20170226/src/per/zyf/bds/ArrayList.java create mode 100644 group09/396077060/20170226/src/per/zyf/bds/BinaryTree.java create mode 100644 group09/396077060/20170226/src/per/zyf/bds/LinkedList.java create mode 100644 group09/396077060/20170226/src/per/zyf/bds/List.java create mode 100644 group09/396077060/20170226/src/per/zyf/bds/Queue.java create mode 100644 group09/396077060/20170226/src/per/zyf/bds/Stack.java create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/.gitignore create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.project create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.settings/org.eclipse.m2e.core.prefs create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/pom.xml create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/src/site/.gitkeep create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.classpath create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.gitignore create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.project create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.jdt.core.prefs create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.m2e.core.prefs create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/pom.xml create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/java/com/eulerlcs/collection/ArrayList.java create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/resources/.gitkeep create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/java/com/eulerlcs/collection/TestArrayList.java create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/resources/.gitkeep create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.project create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.settings/org.eclipse.m2e.core.prefs create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/pom.xml create mode 100644 group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/src/site/.gitkeep create mode 100644 group09/601862675/Week01/pom.xml create mode 100644 group09/601862675/Week01/src/main/java/ArrayList.java create mode 100644 group09/601862675/Week01/src/main/java/BinaryTree.java create mode 100644 group09/601862675/Week01/src/main/java/Iterator.java create mode 100644 group09/601862675/Week01/src/main/java/LinkedList.java create mode 100644 group09/601862675/Week01/src/main/java/List.java create mode 100644 group09/601862675/Week01/src/main/java/Queue.java create mode 100644 group09/601862675/Week01/src/main/java/Stack.java create mode 100644 group09/601862675/Week01/src/main/java/Watcher.java create mode 100644 group09/601862675/Week01/src/test/java/ArrayListTest.java create mode 100644 group09/601862675/Week01/src/test/java/LinkedListTest.java create mode 100644 group09/601862675/Week01/src/test/java/QueueTest.java create mode 100644 group09/601862675/Week01/src/test/java/StackTest.java create mode 100644 group09/601862675/pom.xml create mode 100644 group09/715061147/.gitignore create mode 100644 group09/715061147/mvnhomework1/.gitignore create mode 100644 group09/715061147/mvnhomework1/pom.xml create mode 100644 group09/715061147/mvnhomework1/src/main/java/com/qsq/study/ArrayList.java create mode 100644 group09/715061147/mvnhomework1/src/main/java/com/qsq/study/LinkedList.java create mode 100644 group09/715061147/mvnhomework1/src/main/java/com/qsq/study/List.java create mode 100644 group09/715061147/mvnhomework1/src/test/java/com/qsq/study/ArrayListTest.java create mode 100644 group09/715061147/mvnhomework1/src/test/java/com/qsq/study/LinkedListTest.java create mode 100644 group09/790466157/src/com/coding/basic/Iterator.java create mode 100644 group09/790466157/src/com/coding/basic/List.java create mode 100644 group09/790466157/src/com/coding/basic/MyArrayList.java create mode 100644 group09/790466157/src/com/coding/basic/MyLinkedList.java create mode 100644 group09/790466157/src/com/coding/basic/Queue.java create mode 100644 group09/790466157/src/com/coding/basic/Stack.java create mode 100644 group09/790466157/test.txt create mode 100644 group09/85839593/assignment-0215-0226/pom.xml create mode 100644 group09/85839593/assignment-0215-0226/src/main/java/MyArrayList.java create mode 100644 group09/85839593/assignment-0215-0226/src/main/java/MyLinkedList.java create mode 100644 group09/85839593/assignment-0215-0226/src/main/java/MyQueue.java create mode 100644 group09/85839593/assignment-0215-0226/src/main/java/MyStack.java create mode 100644 group09/85839593/assignment-0215-0226/src/test/java/MyArrayListTest.java create mode 100644 group09/85839593/assignment-0215-0226/src/test/java/MyLinkedListTest.java create mode 100644 group09/85839593/assignment-0215-0226/src/test/java/MyQueueTest.java create mode 100644 group09/85839593/assignment-0215-0226/src/test/java/MyStackTest.java create mode 100644 group09/85839593/pom.xml create mode 100644 group09/group09.md create mode 100644 group10/1363044717/struts/homework/homework/pom.xml create mode 100644 group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/array/ArrayUtil.java create mode 100644 group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java create mode 100644 group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/Struts.java create mode 100644 group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java create mode 100644 group10/1363044717/struts/homework/homework/src/main/java/com/code/coderising/litestruts/View.java create mode 100644 group10/1363044717/struts/homework/homework/src/main/resources/struts.xml create mode 100644 group10/1363044717/struts/homework/pom.xml create mode 100644 group10/1363044717/struts/homework/src/main/java/com/code/coderising/array/ArrayUtil.java create mode 100644 group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/LoginAction.java create mode 100644 group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/Struts.java create mode 100644 group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/StrutsTest.java create mode 100644 group10/1363044717/struts/homework/src/main/java/com/code/coderising/litestruts/View.java create mode 100644 group10/1363044717/struts/homework/src/main/resources/struts.xml create mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/ArrayList.java" create mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/BinaryTreeNode.java" create mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Iterator.java" create mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/JavaTest.java" create mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/LinkedList.java" create mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/List.java" create mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Queue.java" create mode 100644 "group10/1363044717/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/Stack.java" create mode 100644 group10/205301442/src/com/coding/week1/ArrayList.java create mode 100644 group10/205301442/src/com/coding/week1/BinaryTreeNode.java create mode 100644 group10/205301442/src/com/coding/week1/Iterator.java create mode 100644 group10/205301442/src/com/coding/week1/LinkedList.java create mode 100644 group10/205301442/src/com/coding/week1/List.java create mode 100644 group10/205301442/src/com/coding/week1/Queue.java create mode 100644 group10/205301442/src/com/coding/week1/Stack.java create mode 100644 group10/205301442/src/com/coding/week2/ArrayUtil.java create mode 100644 group10/205301442/src/com/coding/week2/ArrayUtilTest.java create mode 100644 group10/205301442/src/com/coding/week2/litestruts/LoginAction.java create mode 100644 group10/205301442/src/com/coding/week2/litestruts/Struts.java create mode 100644 group10/205301442/src/com/coding/week2/litestruts/StrutsTest.java create mode 100644 group10/205301442/src/com/coding/week2/litestruts/View.java create mode 100644 group10/205301442/test/com/coding/week1/AllTests.java create mode 100644 group10/205301442/test/com/coding/week1/TestArrayList.java create mode 100644 group10/205301442/test/com/coding/week1/TestBiranyTreeNode.java create mode 100644 group10/205301442/test/com/coding/week1/TestLinkedList.java create mode 100644 group10/205301442/test/com/coding/week1/TestQueue.java create mode 100644 group10/205301442/test/com/coding/week1/TestStack.java create mode 100644 "group10/205301442/\346\226\207\347\253\240\345\234\260\345\235\200.txt" create mode 100644 "group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.classpath" create mode 100644 "group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.project" create mode 100644 "group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/.settings/org.eclipse.jdt.core.prefs" create mode 100644 "group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/ArrayList.java" create mode 100644 "group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/Iterator.java" create mode 100644 "group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/LinkedList.java" create mode 100644 "group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/list/List.java" create mode 100644 "group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/queue/ListQueue.java" create mode 100644 "group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/stack/Stack.java" create mode 100644 "group10/3031828378/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232(\346\225\260\346\215\256\347\273\223\346\236\204)/DataStructure_One/src/tree/BinaryTree.java" create mode 100644 group10/3314793852/.classpath create mode 100644 group10/3314793852/.gitignore create mode 100644 group10/3314793852/.project create mode 100644 group10/3314793852/second/.classpath create mode 100644 group10/3314793852/second/.gitignore create mode 100644 group10/3314793852/second/.project create mode 100644 group10/3314793852/second/.settings/org.eclipse.core.resources.prefs create mode 100644 group10/3314793852/second/.settings/org.eclipse.jdt.core.prefs create mode 100644 group10/3314793852/second/src/com/coderising/array/ArrayUtil.java create mode 100644 group10/3314793852/second/src/com/coderising/array/Test.java create mode 100644 group10/3314793852/second/src/com/coderising/litestruts/DealWithInfo.java create mode 100644 group10/3314793852/second/src/com/coderising/litestruts/LoginAction.java create mode 100644 group10/3314793852/second/src/com/coderising/litestruts/SAXGetInfo.java create mode 100644 group10/3314793852/second/src/com/coderising/litestruts/Struts.java create mode 100644 group10/3314793852/second/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group10/3314793852/second/src/com/coderising/litestruts/View.java create mode 100644 group10/3314793852/second/src/com/coderising/litestruts/struts.out.xml create mode 100644 group10/3314793852/second/src/com/coderising/litestruts/struts.xml create mode 100644 group10/3314793852/src/myList/MyArrayList.java create mode 100644 group10/3314793852/src/myList/MyBinarySearchTree.java create mode 100644 group10/3314793852/src/myList/MyIterator.java create mode 100644 group10/3314793852/src/myList/MyLinkedList.java create mode 100644 group10/3314793852/src/myList/MyQueue.java create mode 100644 group10/3314793852/src/myList/MyStack.java create mode 100644 group10/3314793852/src/myList/Test.java create mode 100644 group10/353261578/.classpath create mode 100644 group10/353261578/.gitignore create mode 100644 group10/353261578/.project create mode 100644 group10/353261578/src/com/sx/structures/BinaryNode.java create mode 100644 group10/353261578/src/com/sx/structures/BinaryTree.java create mode 100644 group10/353261578/src/com/sx/structures/Iterator.java create mode 100644 group10/353261578/src/com/sx/structures/MyArrayList.java create mode 100644 group10/353261578/src/com/sx/structures/MyLinkedList.java create mode 100644 group10/353261578/src/com/sx/structures/MyList.java create mode 100644 group10/353261578/src/com/sx/structures/MyQueue.java create mode 100644 group10/353261578/src/com/sx/structures/MyStack.java create mode 100644 group10/353261578/test/com/test/BinaryTreeTest.java create mode 100644 group10/353261578/test/com/test/MyArrayListTest.java create mode 100644 group10/353261578/test/com/test/MyLinkedListTest.java create mode 100644 group10/353261578/test/com/test/StaQueTest.java create mode 100644 group10/364298692/article.md create mode 100644 group10/364298692/cs/.classpath create mode 100644 group10/364298692/cs/.gitignore create mode 100644 group10/364298692/cs/.project create mode 100644 group10/364298692/cs/.settings/org.eclipse.jdt.core.prefs create mode 100644 group10/364298692/cs/src/com/coding/basic/ArrayList.java create mode 100644 group10/364298692/cs/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group10/364298692/cs/src/com/coding/basic/Iterator.java create mode 100644 group10/364298692/cs/src/com/coding/basic/LinkedList.java create mode 100644 group10/364298692/cs/src/com/coding/basic/List.java create mode 100644 group10/364298692/cs/src/com/coding/basic/Queue.java create mode 100644 group10/364298692/cs/src/com/coding/basic/Stack.java create mode 100644 group10/569420966/struct/pom.xml create mode 100644 group10/569420966/struct/src/main/java/com/litestruts/LoginAction.java create mode 100644 group10/569420966/struct/src/main/java/com/litestruts/Struts.java create mode 100644 group10/569420966/struct/src/main/java/com/litestruts/View.java create mode 100644 group10/569420966/struct/src/main/java/com/myutil/ArrayList.java create mode 100644 group10/569420966/struct/src/main/java/com/myutil/ArrayUtil.java create mode 100644 group10/569420966/struct/src/main/java/com/myutil/BinaryTreeNode.java create mode 100644 group10/569420966/struct/src/main/java/com/myutil/Iterator.java create mode 100644 group10/569420966/struct/src/main/java/com/myutil/JavaBeanUtil.java create mode 100644 group10/569420966/struct/src/main/java/com/myutil/LinkedList.java create mode 100644 group10/569420966/struct/src/main/java/com/myutil/List.java create mode 100644 group10/569420966/struct/src/main/java/com/myutil/Queue.java create mode 100644 group10/569420966/struct/src/main/java/com/myutil/Stack.java create mode 100644 group10/569420966/struct/src/main/resources/struts.xml create mode 100644 group10/569420966/struct/src/test/java/com/litestruts/test/StrutsTest.java create mode 100644 group10/584709796/worka/.classpath create mode 100644 group10/584709796/worka/.gitignore create mode 100644 group10/584709796/worka/.project create mode 100644 group10/584709796/worka/.settings/org.eclipse.jdt.core.prefs create mode 100644 group10/584709796/worka/src/com/coding/basic/ArrayList.java create mode 100644 group10/584709796/worka/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group10/584709796/worka/src/com/coding/basic/DemoTest.java create mode 100644 group10/584709796/worka/src/com/coding/basic/Iterator.java create mode 100644 group10/584709796/worka/src/com/coding/basic/LinkedList.java create mode 100644 group10/584709796/worka/src/com/coding/basic/List.java create mode 100644 group10/584709796/worka/src/com/coding/basic/Queue.java create mode 100644 group10/584709796/worka/src/com/coding/basic/ReadMe.txt create mode 100644 group10/584709796/worka/src/com/coding/basic/Stack.java create mode 100644 "group10/584709796/worka/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232\357\274\232\345\206\205\345\255\230\343\200\201\346\214\207\344\273\244\343\200\201cpu.pdf" create mode 100644 group10/595128841/Readme.txt create mode 100644 group10/595128841/src/org/le/b/ArrayUtil.java create mode 100644 group10/595128841/src/org/le/b/LoginAction.java create mode 100644 group10/595128841/src/org/le/b/Struts.java create mode 100644 group10/595128841/src/org/le/b/StrutsTest.java create mode 100644 group10/595128841/src/org/le/b/View.java create mode 100644 group10/595128841/src/org/le/list/ArrayList.java create mode 100644 group10/595128841/src/org/le/list/LinkedList.java create mode 100644 group10/595128841/src/org/le/list/List.java create mode 100644 group10/630505243/.classpath create mode 100644 group10/630505243/.gitignore create mode 100644 group10/630505243/.project create mode 100644 group10/630505243/src/com/coderising/array/ArrayUtil.java create mode 100644 group10/630505243/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group10/630505243/src/com/coderising/litestruts/LoginAction.java create mode 100644 group10/630505243/src/com/coderising/litestruts/Struts.java create mode 100644 group10/630505243/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group10/630505243/src/com/coderising/litestruts/View.java create mode 100644 group10/630505243/src/com/coderising/litestruts/struts.xml create mode 100644 group10/630505243/src/com/coding/basic/ArrayList.java create mode 100644 group10/630505243/src/com/coding/basic/ArrayListTest.java create mode 100644 group10/630505243/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group10/630505243/src/com/coding/basic/BinaryTreeNodeTest.java create mode 100644 group10/630505243/src/com/coding/basic/Iterator.java create mode 100644 group10/630505243/src/com/coding/basic/LinkedList.java create mode 100644 group10/630505243/src/com/coding/basic/LinkedListTest.java create mode 100644 group10/630505243/src/com/coding/basic/List.java create mode 100644 group10/630505243/src/com/coding/basic/Queue.java create mode 100644 group10/630505243/src/com/coding/basic/QueueTest.java create mode 100644 group10/630505243/src/com/coding/basic/Stack.java create mode 100644 group10/630505243/src/com/coding/basic/StackTest.java create mode 100644 group10/706097141/learning/src/com/hmily/learning/BinaryTreeNode.java create mode 100644 group10/706097141/learning/src/com/hmily/learning/Iterator.java create mode 100644 group10/706097141/learning/src/com/hmily/learning/LinkedList.java create mode 100644 group10/706097141/learning/src/com/hmily/learning/List.java create mode 100644 group10/706097141/learning/src/com/hmily/learning/MyArrayList.java create mode 100644 group10/706097141/learning/src/com/hmily/learning/MyQueue.java create mode 100644 group10/706097141/learning/src/com/hmily/learning/MyStack.java create mode 100644 group10/706097141/learning/src/com/hmily/test/MyTest.java create mode 100644 group10/875867419/.classpath create mode 100644 group10/875867419/.gitignore create mode 100644 group10/875867419/.project create mode 100644 group10/875867419/src/com/work/week01/MyArrayList.java create mode 100644 group10/875867419/src/com/work/week01/MyBinaryTree.java create mode 100644 group10/875867419/src/com/work/week01/MyIterator.java create mode 100644 group10/875867419/src/com/work/week01/MyLinkedList.java create mode 100644 group10/875867419/src/com/work/week01/MyList.java create mode 100644 group10/875867419/src/com/work/week01/MyQueue.java create mode 100644 group10/875867419/src/com/work/week01/MyStack.java create mode 100644 "group10/875867419/src/com/work/week01/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" create mode 100644 group10/875867419/src/com/work/week02/ArrayUtil.java create mode 100644 group10/875867419/src/com/work/week02/ArrayUtilTest.java create mode 100644 group10/875867419/src/com/work/week02/LoginAction.java create mode 100644 group10/875867419/src/com/work/week02/Struts.java create mode 100644 group10/875867419/src/com/work/week02/StrutsTest.java create mode 100644 group10/875867419/src/com/work/week02/StrutsXmlDao.java create mode 100644 group10/875867419/src/com/work/week02/View.java create mode 100644 group10/875867419/src/com/work/week02/struts.xml create mode 100644 "group10/875867419/src/com/work/week02/\345\215\232\346\226\207\344\275\234\344\270\232\345\234\260\345\235\200.txt" create mode 100644 group10/904627477/.classpath create mode 100644 group10/904627477/.gitignore create mode 100644 group10/904627477/.project create mode 100644 group10/904627477/.settings/org.eclipse.jdt.core.prefs create mode 100644 group10/904627477/.settings/org.eclipse.m2e.core.prefs create mode 100644 group10/904627477/pom.xml create mode 100644 group10/904627477/src/com/coding/ArrayList.java create mode 100644 group10/904627477/src/com/coding/BinaryTreeNode.java create mode 100644 group10/904627477/src/com/coding/Iterator.java create mode 100644 group10/904627477/src/com/coding/LinkedList.java create mode 100644 group10/904627477/src/com/coding/List.java create mode 100644 group10/904627477/src/com/coding/Queue.java create mode 100644 group10/904627477/src/com/coding/Stack.java create mode 100644 group10/904627477/src/com/coding/array/ArrayUtil.java create mode 100644 group10/904627477/src/com/coding/litestruts/LoginAction.java create mode 100644 group10/904627477/src/com/coding/litestruts/ReflectUtil.java create mode 100644 group10/904627477/src/com/coding/litestruts/Struts.java create mode 100644 group10/904627477/src/com/coding/litestruts/StrutsTest.java create mode 100644 group10/904627477/src/com/coding/litestruts/View.java create mode 100644 group10/904627477/src/com/coding/litestruts/struts.xml create mode 100644 group10/904627477/src/com/coding/test/ArrayListTest.java create mode 100644 group10/904627477/src/com/coding/test/ArrayUtilTest.java create mode 100644 group10/904627477/src/com/coding/test/LinkedListTest.java create mode 100644 group10/904627477/src/com/coding/test/QueueTest.java create mode 100644 group10/904627477/src/com/coding/test/StackTest.java create mode 100644 group10/904627477/src/com/coding/test/Test.java create mode 100644 group10/group10.md create mode 100644 group11/1059156023/Array/.classpath create mode 100644 group11/1059156023/Array/.gitignore create mode 100644 group11/1059156023/Array/.project create mode 100644 group11/1059156023/Array/src/com/coding/basic/ArrayUtil.java create mode 100644 group11/1059156023/dataStructure/.classpath create mode 100644 group11/1059156023/dataStructure/.gitignore create mode 100644 group11/1059156023/dataStructure/.project create mode 100644 group11/1059156023/dataStructure/src/com/coding/basic/ArrayList.java create mode 100644 group11/1059156023/struts/.classpath create mode 100644 group11/1059156023/struts/.gitignore create mode 100644 group11/1059156023/struts/.project create mode 100644 group11/1059156023/struts/src/com/coding/basic/LoginAction.java create mode 100644 group11/1059156023/struts/src/com/coding/basic/Struts.java create mode 100644 group11/1059156023/struts/src/com/coding/basic/StrutsTest.java create mode 100644 group11/1059156023/struts/src/com/coding/basic/View.java create mode 100644 group11/1059156023/struts/src/com/coding/basic/struts.xml create mode 100644 group11/1178243325/DataStructure/build.gradle create mode 100644 group11/1178243325/DataStructure/readme.md create mode 100644 group11/1178243325/DataStructure/src/main/java/com/Main.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coderising/array/ArrayUtil.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/.Struts.java.swp create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/LoginAction.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/Struts.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/StrutsTest.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/View.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/XmlUtil.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coderising/litestruts/struts.xml create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/ArrayList.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/Iterator.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/LinkedList.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/List.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/Queue.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/Stack.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/ConcurrentModificationException.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyQueueException.java create mode 100644 group11/1178243325/DataStructure/src/main/java/com/coding/basic/exception/EmptyStackException.java create mode 100644 group11/1178243325/DataStructure/src/main/resources/struts.xml create mode 100644 group11/1178243325/DataStructure/struts.xml create mode 100644 group11/1310368322/GitHub/.gitignore create mode 100644 group11/1310368322/GitHub/src/ArrayList.java create mode 100644 group11/1310368322/GitHub/src/testGitHub.java create mode 100644 group11/171535320/ArrayUtil.java create mode 100644 group11/171535320/DataStruct/ArrayList.java create mode 100644 group11/171535320/DataStruct/BinaryTreeNode.java create mode 100644 group11/171535320/DataStruct/Iterator.java create mode 100644 group11/171535320/DataStruct/LinkedList.java create mode 100644 group11/171535320/DataStruct/List.java create mode 100644 group11/171535320/stackANDqueue/Queue.java create mode 100644 group11/171535320/stackANDqueue/Stack.java create mode 100644 group11/252308879/dataStructure/.gitignore create mode 100644 group11/252308879/dataStructure/pom.xml create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/LoginAction.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/Struts.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/StrutsTest.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/View.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/Dom4JUtil.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpDomUtil.java create mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpSAXPUtil.java create mode 100644 group11/252308879/dataStructure/src/main/resources/struts.xml create mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java create mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java create mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java create mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java create mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java create mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java create mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java create mode 100644 group11/283091182/src/com/coderising/array/ArrayUtil.java create mode 100644 group11/283091182/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group11/283091182/src/com/coderising/litestruts/Action.java create mode 100644 group11/283091182/src/com/coderising/litestruts/LoginAction.java create mode 100644 group11/283091182/src/com/coderising/litestruts/Struts.java create mode 100644 group11/283091182/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group11/283091182/src/com/coderising/litestruts/View.java create mode 100644 group11/283091182/src/com/coderising/litestruts/struts.xml create mode 100644 group11/283091182/src/com/coding/basic/ArrayList.java create mode 100644 group11/283091182/src/com/coding/basic/ArrayListTest.java create mode 100644 group11/283091182/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group11/283091182/src/com/coding/basic/Iterator.java create mode 100644 group11/283091182/src/com/coding/basic/LinkedList.java create mode 100644 group11/283091182/src/com/coding/basic/List.java create mode 100644 group11/283091182/src/com/coding/basic/Queue.java create mode 100644 group11/283091182/src/com/coding/basic/Stack.java create mode 100644 group11/395443277/.gitignore create mode 100644 group11/395443277/src/com/coderising/array/ArrayUtil.java create mode 100644 group11/395443277/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group11/395443277/src/com/coderising/litestruts/LoginAction.java create mode 100644 group11/395443277/src/com/coderising/litestruts/Struts.java create mode 100644 group11/395443277/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group11/395443277/src/com/coderising/litestruts/View.java create mode 100644 group11/395443277/src/com/coderising/litestruts/struts.xml create mode 100644 group11/395443277/src/com/coding/basic/ArrayList.java create mode 100644 group11/395443277/src/com/coding/basic/ArrayListTest.java create mode 100644 group11/395443277/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group11/395443277/src/com/coding/basic/BinaryTreeNodeTest.java create mode 100644 group11/395443277/src/com/coding/basic/Iterator.java create mode 100644 group11/395443277/src/com/coding/basic/LinkedList.java create mode 100644 group11/395443277/src/com/coding/basic/LinkedListTest.java create mode 100644 group11/395443277/src/com/coding/basic/List.java create mode 100644 group11/395443277/src/com/coding/basic/Queue.java create mode 100644 group11/395443277/src/com/coding/basic/QueueTest.java create mode 100644 group11/395443277/src/com/coding/basic/Stack.java create mode 100644 group11/395443277/src/com/coding/basic/StackTest.java create mode 100644 group11/542194147/myDataStructure/.classpath create mode 100644 group11/542194147/myDataStructure/.gitignore create mode 100644 group11/542194147/myDataStructure/.project create mode 100644 group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtil.java create mode 100644 group11/542194147/myDataStructure/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group11/542194147/myDataStructure/src/com/coderising/litestruts/LoginAction.java create mode 100644 group11/542194147/myDataStructure/src/com/coderising/litestruts/Struts.java create mode 100644 group11/542194147/myDataStructure/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group11/542194147/myDataStructure/src/com/coderising/litestruts/View.java create mode 100644 group11/542194147/myDataStructure/src/com/coderising/litestruts/struts.xml create mode 100644 group11/542194147/myDataStructure/src/com/coding/basic/MyArrayList.java create mode 100644 group11/542194147/myDataStructure/src/com/coding/basic/MyLinkedList.java create mode 100644 group11/542194147/myDataStructure/src/com/coding/basic/MyList.java create mode 100644 group11/542194147/myDataStructure/src/com/coding/basic/MyQueue.java create mode 100644 group11/542194147/myDataStructure/src/com/coding/basic/MyStack.java create mode 100644 group11/635189253/dataStructure/.classpath create mode 100644 group11/635189253/dataStructure/.gitignore create mode 100644 group11/635189253/dataStructure/.project create mode 100644 group11/635189253/dataStructure/src/com/coding/basic/ArrayList.java create mode 100644 group11/635189253/dataStructure/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group11/635189253/dataStructure/src/com/coding/basic/Iterator.java create mode 100644 group11/635189253/dataStructure/src/com/coding/basic/LinkedList.java create mode 100644 group11/635189253/dataStructure/src/com/coding/basic/List.java create mode 100644 group11/635189253/dataStructure/src/com/coding/basic/Queue.java create mode 100644 group11/635189253/dataStructure/src/com/coding/basic/Stack.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170225/ArrayList.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170225/BinaryTree.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170225/BinaryTreeNode.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170225/Iterator.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170225/LinkedList.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170225/Queue.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170225/Stack.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170302/ArrayUtil.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170302/LoginAction.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170302/Struts.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170302/View.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170302/struts.xml create mode 100644 group11/729245768/DataStructure/tests/main/coding_170225/ArrayListTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170225/BinaryTreeTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170302/ArrayUtilTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170302/StrutsTest.java create mode 100644 group11/996108220/.classpath create mode 100644 group11/996108220/.gitignore create mode 100644 group11/996108220/.project create mode 100644 group11/996108220/src/com/coderising/array/ArrayUtil.java create mode 100644 group11/996108220/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group11/996108220/src/com/coderising/litestruts/Action.java create mode 100644 group11/996108220/src/com/coderising/litestruts/ActionConfig.java create mode 100644 group11/996108220/src/com/coderising/litestruts/LoginAction.java create mode 100644 group11/996108220/src/com/coderising/litestruts/LogoutAction.java create mode 100644 group11/996108220/src/com/coderising/litestruts/Struts.java create mode 100644 group11/996108220/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group11/996108220/src/com/coderising/litestruts/View.java create mode 100644 group11/996108220/src/com/coderising/litestruts/struts.xml create mode 100644 group11/996108220/src/com/coding/basic/ArrayList.java create mode 100644 group11/996108220/src/com/coding/basic/BinaryTree.java create mode 100644 group11/996108220/src/com/coding/basic/Iterator.java create mode 100644 group11/996108220/src/com/coding/basic/LinkedList.java create mode 100644 group11/996108220/src/com/coding/basic/List.java create mode 100644 group11/996108220/src/com/coding/basic/Queue.java create mode 100644 group11/996108220/src/com/coding/basic/Stack.java create mode 100644 group11/group11.md create mode 100644 group12/2258659044/readme.txt create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/ArrayList.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/LinkedList.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/List.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/Queue.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/Stack.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/ArrayListTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/LinkedListTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java create mode 100644 group12/247565311/week1/ArrayList.java create mode 100644 group12/247565311/week1/Deque.java create mode 100644 group12/247565311/week1/Link.java create mode 100644 group12/247565311/week1/LinkedList.java create mode 100644 group12/247565311/week1/Stack.java create mode 100644 group12/251822722/ArrayList.java create mode 100644 group12/251822722/BinaryTreeNode.java create mode 100644 group12/251822722/Iterator.java create mode 100644 group12/251822722/LinkedList.java create mode 100644 group12/251822722/List.java create mode 100644 group12/251822722/Queue.java create mode 100644 group12/251822722/Stack.java create mode 100644 group12/377401843/learning_1/.gitignore create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/ArrayList.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/BinaryTreeNode.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/Iterator.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/LinkedList.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/List.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/Queue.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/Stack.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/test/ArrayListTest.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/test/BinaryTreeNodeTest.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/test/LinkedListTest.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/test/QueueTest.java create mode 100644 group12/377401843/learning_1/src/com/guodong/datastructure/test/StackTest.java create mode 100644 group12/382266293/.classpath create mode 100644 group12/382266293/.gitignore create mode 100644 group12/382266293/.project create mode 100644 group12/382266293/src/Collection/AbstractList.java create mode 100644 group12/382266293/src/Collection/Concrete/ArrayList.java create mode 100644 group12/382266293/src/Collection/Concrete/BinaryTreeNode.java create mode 100644 group12/382266293/src/Collection/Concrete/LinkedList.java create mode 100644 group12/382266293/src/Collection/Concrete/Queue.java create mode 100644 group12/382266293/src/Collection/Concrete/Stack.java create mode 100644 group12/382266293/src/Collection/Iterator.java create mode 100644 group12/382266293/src/Collection/List.java create mode 100644 group12/382266293/src/TestCollection/AllTests.java create mode 100644 group12/382266293/src/TestCollection/ArrayListTest.java create mode 100644 group12/382266293/src/TestCollection/BinaryTreeNodeTest.java create mode 100644 group12/382266293/src/TestCollection/LinkedListTest.java create mode 100644 group12/382266293/src/TestCollection/QueueTest.java create mode 100644 group12/382266293/src/TestCollection/StackTest.java create mode 100644 group12/382266293/src/test.java create mode 100644 group12/382266293/src/util/Print.java create mode 100644 group12/382266293/src/util/TestUtil.java create mode 100644 group12/441908378/ArrayList.java create mode 100644 group12/441908378/BinaryTreeNode.java create mode 100644 group12/441908378/LinkedList.java create mode 100644 group12/441908378/Queue.java create mode 100644 group12/441908378/Stack.java create mode 100644 group12/446031103/src/com/coding/basic/ArrayList.java create mode 100644 group12/446031103/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group12/446031103/src/com/coding/basic/Iterator.java create mode 100644 group12/446031103/src/com/coding/basic/LinkedList.java create mode 100644 group12/446031103/src/com/coding/basic/List.java create mode 100644 group12/446031103/src/com/coding/basic/Queue.java create mode 100644 group12/446031103/src/com/coding/basic/Stack.java create mode 100644 group12/495473393/Coding/.gitignore create mode 100644 group12/495473393/Coding/src/Base/ArrayList.java create mode 100644 group12/495473393/Coding/src/Base/BinaryTreeNode.java create mode 100644 group12/495473393/Coding/src/Base/Iterator.java create mode 100644 group12/495473393/Coding/src/Base/LinkedList.java create mode 100644 group12/495473393/Coding/src/Base/List.java create mode 100644 group12/495473393/Coding/src/Base/Queue.java create mode 100644 group12/495473393/Coding/src/Base/Stack.java create mode 100644 group12/563253496/datastructure/.classpath create mode 100644 group12/563253496/datastructure/.gitignore create mode 100644 group12/563253496/datastructure/.project create mode 100644 group12/563253496/datastructure/src/Collection/ArrayList.java create mode 100644 group12/563253496/datastructure/src/Collection/LinkedList.java create mode 100644 group12/563253496/datastructure/src/Collection/Queue.java create mode 100644 group12/563253496/datastructure/src/Collection/Stack.java create mode 100644 group12/563253496/datastructure/src/Collection/TestArrayList.java create mode 100644 group12/563253496/datastructure/src/Collection/TestStack.java create mode 100644 group12/563253496/datastructure/src/com/coding/basic/ArrayList.java create mode 100644 group12/563253496/datastructure/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group12/563253496/datastructure/src/com/coding/basic/Iterator.java create mode 100644 group12/563253496/datastructure/src/com/coding/basic/LinkedList.java create mode 100644 group12/563253496/datastructure/src/com/coding/basic/List.java create mode 100644 group12/563253496/datastructure/src/com/coding/basic/Queue.java create mode 100644 group12/563253496/datastructure/src/com/coding/basic/Stack.java create mode 100644 group12/group12.md create mode 100644 group13/1274639949/lesson01/src/com/hans/ArrayList.java create mode 100644 group13/1274639949/lesson01/src/com/hans/BinaryTree.java create mode 100644 group13/1274639949/lesson01/src/com/hans/BinaryTreeNode.java create mode 100644 group13/1274639949/lesson01/src/com/hans/Iterator.java create mode 100644 group13/1274639949/lesson01/src/com/hans/LinkedList.java create mode 100644 group13/1274639949/lesson01/src/com/hans/List.java create mode 100644 group13/1274639949/lesson01/src/com/hans/Queue.java create mode 100644 group13/1274639949/lesson01/src/com/hans/Stack.java create mode 100644 "group13/1274639949/\346\214\207\344\273\244\346\274\253\346\270\270\350\256\260.md" create mode 100644 group13/1641296572/lesson1/.gitignore create mode 100644 group13/1641296572/lesson1/src/com/coding/basic/ArrayList.java create mode 100644 group13/1641296572/lesson1/src/com/coding/basic/BinarySortTree.java create mode 100644 group13/1641296572/lesson1/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group13/1641296572/lesson1/src/com/coding/basic/Iterator.java create mode 100644 group13/1641296572/lesson1/src/com/coding/basic/LinkedList.java create mode 100644 group13/1641296572/lesson1/src/com/coding/basic/List.java create mode 100644 group13/1641296572/lesson1/src/com/coding/basic/Queue.java create mode 100644 group13/1641296572/lesson1/src/com/coding/basic/Stack.java create mode 100644 group13/2729382520/L1/src/io/github/vxzh/ArrayList.java create mode 100644 group13/2729382520/L1/src/io/github/vxzh/BinaryTree.java create mode 100644 group13/2729382520/L1/src/io/github/vxzh/Iterator.java create mode 100644 group13/2729382520/L1/src/io/github/vxzh/LinkQueue.java create mode 100644 group13/2729382520/L1/src/io/github/vxzh/LinkedList.java create mode 100644 group13/2729382520/L1/src/io/github/vxzh/List.java create mode 100644 group13/2729382520/L1/src/io/github/vxzh/Queue.java create mode 100644 group13/2729382520/L1/src/io/github/vxzh/Stack.java create mode 100644 group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties create mode 100644 group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/cache.properties.lock create mode 100644 group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/fileHashes.bin create mode 100644 group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/fileSnapshots.bin create mode 100644 group13/2931408816/lesson1/data-structure/.gradle/3.1/taskArtifacts/taskArtifacts.bin create mode 100644 group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/fileHashes.bin create mode 100644 group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/fileSnapshots.bin create mode 100644 group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.bin create mode 100644 group13/2931408816/lesson1/data-structure/.gradle/3.3/taskArtifacts/taskArtifacts.lock create mode 100644 group13/2931408816/lesson1/data-structure/build.gradle create mode 100644 group13/2931408816/lesson1/data-structure/gradle/wrapper/gradle-wrapper.properties create mode 100644 group13/2931408816/lesson1/data-structure/gradlew create mode 100644 group13/2931408816/lesson1/data-structure/gradlew.bat create mode 100644 group13/2931408816/lesson1/data-structure/settings.gradle create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/ArrayList.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/BinaryTreeNode.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Iterator.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/LinkedList.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/List.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Main.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Queue.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/basic/Stack.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyArrayList.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyLinkedList.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyQueue.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyStack.java create mode 100644 group13/2931408816/lesson1/data-structure/src/main/java/cn/net/pikachu/other/MyTree.java create mode 100644 group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/ArrayListTest.java create mode 100644 group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/BinaryTreeNodeTest.java create mode 100644 group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/LinkedListTest.java create mode 100644 group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/QueueTest.java create mode 100644 group13/2931408816/lesson1/data-structure/src/test/java/cn/net/pikachu/basic/StackTest.java create mode 100644 group13/413007522/.gitignore create mode 100644 group13/413007522/lesson01/.gitignore create mode 100644 group13/413007522/lesson01/pom.xml create mode 100644 group13/413007522/lesson01/src/main/java/cn/xl/MyArrayList.java create mode 100644 group13/413007522/lesson01/src/main/java/cn/xl/MyLinkedList.java create mode 100644 group13/413007522/lesson01/src/main/java/cn/xl/MyList.java create mode 100644 group13/413007522/lesson01/src/main/java/cn/xl/MyQueue.java create mode 100644 group13/413007522/lesson01/src/main/java/cn/xl/MyStack.java create mode 100644 group13/453070251/lessones01/BinaryTreeNode.java create mode 100644 group13/453070251/lessones01/LinkedList.java create mode 100644 group13/453070251/lessones01/LinkedListWithFloat.java create mode 100644 group13/453070251/lessones01/Node.java create mode 100644 group13/453070251/lessones01/Queue.java create mode 100644 group13/453070251/lessones01/Stack.java create mode 100644 group13/568334413/0226/src/Main.java create mode 100644 group13/568334413/0226/src/com/coding/basic/ArrayList.java create mode 100644 group13/568334413/0226/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group13/568334413/0226/src/com/coding/basic/Iterator.java create mode 100644 group13/568334413/0226/src/com/coding/basic/LinkedList.java create mode 100644 group13/568334413/0226/src/com/coding/basic/List.java create mode 100644 group13/568334413/0226/src/com/coding/basic/Queue.java create mode 100644 group13/568334413/0226/src/com/coding/basic/Stack.java create mode 100644 group13/568334413/0226/src/com/coding/basic/TreeSet.java create mode 100644 group13/6023757/lesson2/mytest/.settings/org.eclipse.jdt.core.prefs create mode 100644 group13/6023757/lesson2/mytest/src/mytest/ArrayList.java create mode 100644 group13/6023757/lesson2/mytest/src/mytest/LinkedList.java create mode 100644 group13/6023757/lesson2/mytest/src/mytest/myMain.java create mode 100644 group13/6023757/lesson2/mytest/src/mytest/readme.txt create mode 100644 group13/771992096/src/com/java/gsl/ArrayList.java create mode 100644 group13/771992096/src/com/java/gsl/Iterator.java create mode 100644 group13/771992096/src/com/java/gsl/LinkedList.java create mode 100644 group13/771992096/src/com/java/gsl/List.java create mode 100644 group13/771992096/src/com/java/gsl/Queue.java create mode 100644 group13/771992096/src/com/java/gsl/Stack.java create mode 100644 group13/group13.md create mode 100644 group14/1091149131/2017JavaPro/.classpath create mode 100644 group14/1091149131/2017JavaPro/.gitignore create mode 100644 group14/1091149131/2017JavaPro/.project create mode 100644 group14/1091149131/2017JavaPro/.settings/org.eclipse.jdt.core.prefs create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/basic/ArrayList.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTree.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/basic/BinaryTreeNode.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/basic/Iterator.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/basic/LinkedList.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/basic/List.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/basic/Queue.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/basic/Stack.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/test/TestAPIDemo.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/test/TestAll.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/test/TestArrayList.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0226/test/TestMyDemo.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtil.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0305/array/ArrayUtilTest.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/LoginAction.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/Struts.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/StrutsTest.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/View.java create mode 100644 group14/1091149131/2017JavaPro/src/com/m0305/lisestruts/struts.xml create mode 100644 group14/1091149131/2017JavaPro/src/com/util/Dom4JforXML.java create mode 100644 group14/1091149131/2017JavaPro/src/com/util/struts.xml create mode 100644 group14/1091149131/README.md create mode 100644 group14/187114392/work_1_20170225/.classpath create mode 100644 group14/187114392/work_1_20170225/.gitignore create mode 100644 group14/187114392/work_1_20170225/.project create mode 100644 group14/187114392/work_1_20170225/.settings/org.eclipse.jdt.core.prefs create mode 100644 group14/187114392/work_1_20170225/ReadMe.md create mode 100644 group14/187114392/work_1_20170225/src/Main.java create mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/ArrayList.java create mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/Iterator.java create mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/LinkedList.java create mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/List.java create mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/Queue.java create mode 100644 group14/187114392/work_1_20170225/src/com/coding/basic/Stack.java create mode 100644 group14/187114392/work_1_20170225/test/ArrayList_Test.java create mode 100644 group14/187114392/work_1_20170225/test/LinkedList_Test.java create mode 100644 group14/187114392/work_1_20170225/test/Queue_Test.java create mode 100644 group14/187114392/work_1_20170225/test/Stack_Test.java create mode 100644 "group14/190530132/20170219\344\275\234\344\270\232/ArrayList.java" create mode 100644 "group14/190530132/20170219\344\275\234\344\270\232/LinkedList.java" create mode 100644 "group14/190530132/20170219\344\275\234\344\270\232/Queue.java" create mode 100644 "group14/190530132/20170219\344\275\234\344\270\232/Stack.java" create mode 100644 "group14/190530132/20170219\344\275\234\344\270\232/\346\226\207\347\253\240\351\223\276\346\216\245.txt" create mode 100644 group14/254659936/.gitignore create mode 100644 group14/254659936/out/production/254659936/com/coderising/litestruts/struts.xml create mode 100644 group14/254659936/src/Main.java create mode 100644 group14/254659936/src/com/coderising/array/ArrayUtil.java create mode 100644 group14/254659936/src/com/coderising/litestruts/LoginAction.java create mode 100644 group14/254659936/src/com/coderising/litestruts/Struts.java create mode 100644 group14/254659936/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group14/254659936/src/com/coderising/litestruts/View.java create mode 100644 group14/254659936/src/com/coderising/litestruts/struts.xml create mode 100644 group14/254659936/src/com/coding/basic/ArrayList.java create mode 100644 group14/254659936/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group14/254659936/src/com/coding/basic/Iterator.java create mode 100644 group14/254659936/src/com/coding/basic/LinkedList.java create mode 100644 group14/254659936/src/com/coding/basic/List.java create mode 100644 group14/254659936/src/com/coding/basic/Queue.java create mode 100644 group14/254659936/src/com/coding/basic/Stack.java create mode 100644 group14/296933284/Note/README.md create mode 100644 group14/296933284/README.md create mode 100644 group14/296933284/coding/.classpath create mode 100644 group14/296933284/coding/.gitignore create mode 100644 group14/296933284/coding/.project create mode 100644 group14/296933284/coding/.settings/org.eclipse.core.resources.prefs create mode 100644 group14/296933284/coding/.settings/org.eclipse.jdt.core.prefs create mode 100644 group14/296933284/coding/src/com/coderising/array/ArrayUtil.java create mode 100644 group14/296933284/coding/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group14/296933284/coding/src/com/coderising/litestruts/LoginAction.java create mode 100644 group14/296933284/coding/src/com/coderising/litestruts/Struts.java create mode 100644 group14/296933284/coding/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group14/296933284/coding/src/com/coderising/litestruts/View.java create mode 100644 group14/296933284/coding/src/com/coderising/litestruts/struts.xml create mode 100644 group14/296933284/coding/src/com/coding/basic/ArrayList.java create mode 100644 group14/296933284/coding/src/com/coding/basic/BinarySearchTree.java create mode 100644 group14/296933284/coding/src/com/coding/basic/Iterator.java create mode 100644 group14/296933284/coding/src/com/coding/basic/JavaTest.java create mode 100644 group14/296933284/coding/src/com/coding/basic/LinkedList.java create mode 100644 group14/296933284/coding/src/com/coding/basic/List.java create mode 100644 group14/296933284/coding/src/com/coding/basic/Queue.java create mode 100644 group14/296933284/coding/src/com/coding/basic/Stack.java create mode 100644 group14/352504906/test/.classpath create mode 100644 group14/352504906/test/.project create mode 100644 group14/352504906/test/.settings/org.eclipse.core.resources.prefs create mode 100644 group14/352504906/test/.settings/org.eclipse.jdt.core.prefs create mode 100644 group14/352504906/test/src/com/coding/basic/SimpleArrayList.java create mode 100644 group14/352504906/test/src/com/coding/basic/SimpleIterator.java create mode 100644 group14/352504906/test/src/com/coding/basic/SimpleLinkedList.java create mode 100644 group14/352504906/test/src/com/coding/basic/SimpleList.java create mode 100644 group14/352504906/test/src/com/coding/basic/SimpleQueue.java create mode 100644 group14/352504906/test/src/com/coding/basic/SimpleStack.java create mode 100644 "group14/352504906/\346\265\205\350\260\210CPU\343\200\201\345\206\205\345\255\230\343\200\201\347\241\254\347\233\230\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.txt" create mode 100644 group14/598808350/20170219.txt create mode 100644 group14/598808350/2017project/src/org/comm/util/StringUtil.java create mode 100644 group14/598808350/2017project/src/org/learning/container/ArrayList.java create mode 100644 group14/598808350/2017project/src/org/learning/container/ArrayUtil.java create mode 100644 group14/598808350/2017project/src/org/learning/container/LinkedList.java create mode 100644 group14/598808350/2017project/src/org/learning/container/Queue.java create mode 100644 group14/598808350/2017project/src/org/learning/container/Stack.java create mode 100644 group14/598808350/2017project/src/org/lite/struts/LoginAction.java create mode 100644 group14/598808350/2017project/src/org/lite/struts/ReadXML.java create mode 100644 group14/598808350/2017project/src/org/lite/struts/Struts.java create mode 100644 group14/598808350/2017project/src/org/lite/struts/View.java create mode 100644 group14/598808350/2017project/src/org/lite/struts/struts.xml create mode 100644 group14/598808350/2017project/test/org/learning/container/TestArrayUtil.java create mode 100644 group14/598808350/2017project/test/org/lite/struts/TestStruts.java create mode 100644 group14/598808350/2017project/test/org/test/all/TestAll.java create mode 100644 group14/630254746/Code2017/.classpath create mode 100644 group14/630254746/Code2017/.gitignore create mode 100644 group14/630254746/Code2017/.project create mode 100644 group14/630254746/Code2017/.settings/org.eclipse.jdt.core.prefs create mode 100644 group14/630254746/Code2017/src/com/leaning/code/ArrayList.java create mode 100644 group14/630254746/Code2017/src/com/leaning/code/Iterator.java create mode 100644 group14/630254746/Code2017/src/com/leaning/code/LinkedList.java create mode 100644 group14/630254746/Code2017/src/com/leaning/code/List.java create mode 100644 group14/630254746/Code2017/src/com/leaning/code/Queue.java create mode 100644 group14/630254746/Code2017/src/com/leaning/code/Stack.java create mode 100644 group14/630254746/Code2017/src/com/leaning/code/test/ArrayListTest.java create mode 100644 group14/630254746/Code2017/src/com/leaning/coderising/array/ArrayUtil.java create mode 100644 group14/630254746/Code2017/src/com/leaning/coderising/litesturts/LoginAction.java create mode 100644 group14/630254746/Code2017/src/com/leaning/coderising/litesturts/Struts.java create mode 100644 group14/630254746/Code2017/src/com/leaning/coderising/litesturts/View.java create mode 100644 group14/630254746/Code2017/src/com/leaning/coderising/litesturts/struts.xml create mode 100644 group14/641013587/14_641013587/.classpath create mode 100644 group14/641013587/14_641013587/.gitignore create mode 100644 group14/641013587/14_641013587/.project create mode 100644 group14/641013587/14_641013587/.settings/org.eclipse.jdt.core.prefs create mode 100644 group14/641013587/14_641013587/src/com/coding/basic/ArrayList.java create mode 100644 group14/641013587/14_641013587/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group14/641013587/14_641013587/src/com/coding/basic/Iterator.java create mode 100644 group14/641013587/14_641013587/src/com/coding/basic/LinkedList.java create mode 100644 group14/641013587/14_641013587/src/com/coding/basic/List.java create mode 100644 group14/641013587/14_641013587/src/com/coding/basic/Queue.java create mode 100644 group14/641013587/14_641013587/src/com/coding/basic/Stack.java create mode 100644 group14/641013587/14_641013587/src/com/coding/test/MyTest.java create mode 100644 group14/641013587/RemoteSystemsTempFiles/.project create mode 100644 group14/676615845/algo/pom.xml create mode 100644 group14/676615845/algo/src/main/java/algo/BinarySearch.java create mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/Array.java create mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/ArrayList.java create mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/BinaryTreeNode.java create mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/Iterator.java create mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/LinkedList.java create mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/List.java create mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/Queue.java create mode 100644 group14/676615845/algo/src/main/java/com/coding/basic/Stack.java create mode 100644 group14/676615845/algo/src/test/java/algo/BinarySearchTest.java create mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/ArrayListTest.java create mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/ArrayTest.java create mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/BinaryTreeNodeTest.java create mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/LinkedListTest.java create mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/QueueTest.java create mode 100644 group14/676615845/algo/src/test/java/com/coding/basic/StackTest.java create mode 100644 group14/775857669/.gitignore create mode 100644 group14/775857669/pom.xml create mode 100644 group14/775857669/src/com/coderising/array/ArrayUtil.java create mode 100644 group14/775857669/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group14/775857669/src/com/coderising/iterstruts/LoginAction.java create mode 100644 group14/775857669/src/com/coderising/iterstruts/Struts.java create mode 100644 group14/775857669/src/com/coderising/iterstruts/StrutsTest.java create mode 100644 group14/775857669/src/com/coderising/iterstruts/View.java create mode 100644 group14/775857669/src/com/coderising/iterstruts/struts.xml create mode 100644 group14/775857669/src/com/coding/basic/ArrayList.java create mode 100644 group14/775857669/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group14/775857669/src/com/coding/basic/Iterator.java create mode 100644 group14/775857669/src/com/coding/basic/JUnitTest.java create mode 100644 group14/775857669/src/com/coding/basic/LinkedList.java create mode 100644 group14/775857669/src/com/coding/basic/List.java create mode 100644 group14/775857669/src/com/coding/basic/Queue.java create mode 100644 group14/775857669/src/com/coding/basic/Stack.java create mode 100644 group14/857999411/FirstHomework/.classpath create mode 100644 group14/857999411/FirstHomework/.gitignore create mode 100644 group14/857999411/FirstHomework/.project create mode 100644 group14/857999411/FirstHomework/.settings/org.eclipse.jdt.core.prefs create mode 100644 group14/857999411/FirstHomework/src/com/coding/basic/MyArrayList.java create mode 100644 group14/857999411/FirstHomework/src/com/coding/basic/MyLinkedList.java create mode 100644 group14/857999411/FirstHomework/src/com/coding/basic/MyList.java create mode 100644 group14/857999411/FirstHomework/src/com/coding/basic/MyQueue.java create mode 100644 group14/857999411/FirstHomework/src/com/coding/basic/MyStack.java create mode 100644 group14/857999411/FirstHomework/src/com/coding/test/MyArrayListTest.java create mode 100644 group14/857999411/FirstHomework/src/com/coding/test/MyLinkedListTest.java create mode 100644 group14/857999411/FirstHomework/src/com/coding/test/MyQueueTest.java create mode 100644 group14/857999411/FirstHomework/src/com/coding/test/MyStackTest.java create mode 100644 group14/857999411/SecondHomework/.classpath create mode 100644 group14/857999411/SecondHomework/.gitignore create mode 100644 group14/857999411/SecondHomework/.project create mode 100644 group14/857999411/SecondHomework/.settings/org.eclipse.jdt.core.prefs create mode 100644 group14/857999411/SecondHomework/src/com/coderising/array/ArrayUtil.java create mode 100644 group14/857999411/SecondHomework/src/com/coderising/litestruts/LoginAction.java create mode 100644 group14/857999411/SecondHomework/src/com/coderising/litestruts/Struts.java create mode 100644 group14/857999411/SecondHomework/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group14/857999411/SecondHomework/src/com/coderising/litestruts/View.java create mode 100644 group14/857999411/SecondHomework/src/com/coderising/litestruts/struts.xml create mode 100644 group14/864020162/.classpath create mode 100644 group14/864020162/.gitignore create mode 100644 group14/864020162/.project create mode 100644 group14/864020162/src/com/coderising/litestruts/LoginAction.java create mode 100644 group14/864020162/src/com/coderising/litestruts/Struts.java create mode 100644 group14/864020162/src/com/coderising/litestruts/View.java create mode 100644 group14/864020162/src/com/datastructure/basic/ArrayList.java create mode 100644 group14/864020162/src/com/datastructure/basic/BinaryTreeNode.java create mode 100644 group14/864020162/src/com/datastructure/basic/Iterator.java create mode 100644 group14/864020162/src/com/datastructure/basic/LinkedList.java create mode 100644 group14/864020162/src/com/datastructure/basic/List.java create mode 100644 group14/864020162/src/com/datastructure/basic/Queue.java create mode 100644 group14/864020162/src/com/datastructure/basic/Stack.java create mode 100644 group14/864020162/src/com/datastructure/util/ArrayUtil.java create mode 100644 group14/group14.md create mode 100644 group15/1501_2535894075/2017code/src/com/coderising/array/ArrayUtil.java create mode 100644 group15/1501_2535894075/2017code/src/com/coderising/litestruts/LoginAction.java create mode 100644 group15/1501_2535894075/2017code/src/com/coderising/litestruts/Struts.java create mode 100644 group15/1501_2535894075/2017code/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group15/1501_2535894075/2017code/src/com/coderising/litestruts/View.java create mode 100644 group15/1501_2535894075/2017code/src/com/coderising/litestruts/struts.xml create mode 100644 group15/1501_2535894075/2017code/src/com/coding/basic/ArrayList.java create mode 100644 group15/1501_2535894075/2017code/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group15/1501_2535894075/2017code/src/com/coding/basic/Iterator.java create mode 100644 group15/1501_2535894075/2017code/src/com/coding/basic/LinkedList.java create mode 100644 group15/1501_2535894075/2017code/src/com/coding/basic/List.java create mode 100644 group15/1501_2535894075/2017code/src/com/coding/basic/Queue.java create mode 100644 group15/1501_2535894075/2017code/src/com/coding/basic/Stack.java create mode 100644 group15/1502_1617273078/src/com/coderising/array/ArrayUtil.java create mode 100644 group15/1502_1617273078/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group15/1502_1617273078/src/com/coderising/litestruts/LoginAction.java create mode 100644 group15/1502_1617273078/src/com/coderising/litestruts/Struts.java create mode 100644 group15/1502_1617273078/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group15/1502_1617273078/src/com/coderising/litestruts/View.java create mode 100644 group15/1502_1617273078/src/com/coderising/litestruts/struts.xml create mode 100644 group15/1502_1617273078/src/com/coding/basic/ArrayList.java create mode 100644 group15/1502_1617273078/src/com/coding/basic/Iterator.java create mode 100644 group15/1502_1617273078/src/com/coding/basic/LinkedList.java create mode 100644 group15/1502_1617273078/src/com/coding/basic/List.java create mode 100644 group15/1502_1617273078/src/com/coding/basic/Queue.java create mode 100644 group15/1502_1617273078/src/com/coding/basic/Stack.java create mode 100644 group15/1503_1311822904/myCollection/src/ArrayList.java create mode 100644 group15/1503_1311822904/myCollection/src/BinaryTreeNode.java create mode 100644 group15/1503_1311822904/myCollection/src/Iterator.java create mode 100644 group15/1503_1311822904/myCollection/src/LinkedList.java create mode 100644 group15/1503_1311822904/myCollection/src/List.java create mode 100644 group15/1503_1311822904/myCollection/src/Queue.java create mode 100644 group15/1503_1311822904/myCollection/src/Stack.java create mode 100644 group15/1503_1311822904/myCollection/test/BinaryTreeNodeTest.java create mode 100644 group15/1503_1311822904/week2/src/ArrayUtil.java create mode 100644 group15/1503_1311822904/week2/src/Struts.java create mode 100644 group15/1503_1311822904/week2/test/ArrayUtilTest.java create mode 100644 group15/1506_1084478979/1506_1084478979/.classpath create mode 100644 group15/1506_1084478979/1506_1084478979/.gitignore create mode 100644 group15/1506_1084478979/1506_1084478979/.project create mode 100644 group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.core.resources.prefs create mode 100644 group15/1506_1084478979/1506_1084478979/.settings/org.eclipse.jdt.core.prefs create mode 100644 group15/1506_1084478979/1506_1084478979/RemoteSystemsTempFiles/.project create mode 100644 group15/1506_1084478979/1506_1084478979/src/RemoteSystemsTempFiles/.project create mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/ArrayList.java create mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/LinkedList.java create mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/Queue.java create mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/RemoteSystemsTempFiles/.project create mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/Stack.java create mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtil.java create mode 100644 group15/1506_1084478979/1506_1084478979/src/banshee/WorkTwo/ArrayUtilTest.java create mode 100644 group15/1506_1084478979/RemoteSystemsTempFiles/.project create mode 100644 group15/1507_977996067/README.md create mode 100644 group15/1507_977996067/src/task1/MyArrayList.java create mode 100644 group15/1507_977996067/src/task1/MyLinkedList.java create mode 100644 group15/1507_977996067/src/task1/MyList.java create mode 100644 group15/1507_977996067/src/task1/MyQueue.java create mode 100644 group15/1507_977996067/src/task1/MyStack.java create mode 100644 group15/1507_977996067/src/task1/README.md create mode 100644 group15/1507_977996067/src/task2/README.md create mode 100644 group15/1507_977996067/src/task2/array/ArrayUtil.java create mode 100644 group15/1507_977996067/src/task2/array/ArrayUtilTest.java create mode 100644 group15/1507_977996067/src/task2/litestruts/LogOutAction.java create mode 100644 group15/1507_977996067/src/task2/litestruts/LoginAction.java create mode 100644 group15/1507_977996067/src/task2/litestruts/Struts.java create mode 100644 group15/1507_977996067/src/task2/litestruts/StrutsTest.java create mode 100644 group15/1507_977996067/src/task2/litestruts/View.java create mode 100644 group15/1507_977996067/src/task2/litestruts/struts.xml create mode 100644 group15/1510_739253131/src/com/bruce/homework0226/ArrayListV00.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0226/JuintTest.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0226/LinkedListV00.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0226/QueueV00.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0226/StackV00.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0305/array/ArrayUtil.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0305/array/JuintArrayUtil.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0305/mystruts/LoginAction.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0305/mystruts/Struts.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0305/mystruts/StrutsTest.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0305/mystruts/View.java create mode 100644 group15/1510_739253131/src/com/bruce/homework0305/mystruts/struts.xml create mode 100644 group15/1510_739253131/src/com/bruce/utils/MyException.java create mode 100644 group15/1511_714512544/out/production/1511_714512544/com/coderising/litestruts/struts.xml create mode 100644 group15/1511_714512544/src/com/coderising/array/ArrayUtil.java create mode 100644 group15/1511_714512544/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group15/1511_714512544/src/com/coderising/litestruts/LoginAction.java create mode 100644 group15/1511_714512544/src/com/coderising/litestruts/Struts.java create mode 100644 group15/1511_714512544/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group15/1511_714512544/src/com/coderising/litestruts/View.java create mode 100644 group15/1511_714512544/src/com/coderising/litestruts/struts.xml create mode 100644 group15/1511_714512544/src/com/coding/basic/ArrayList.java create mode 100644 group15/1511_714512544/src/com/coding/basic/BinarySearchTree.java create mode 100644 group15/1511_714512544/src/com/coding/basic/BinarySearchTreeNode.java create mode 100644 group15/1511_714512544/src/com/coding/basic/Iterator.java create mode 100644 group15/1511_714512544/src/com/coding/basic/LinkedList.java create mode 100644 group15/1511_714512544/src/com/coding/basic/List.java create mode 100644 group15/1511_714512544/src/com/coding/basic/Queue.java create mode 100644 group15/1511_714512544/src/com/coding/basic/Stack.java create mode 100644 group15/1511_714512544/src/test/com/coding/basic/ArrayListTest.java create mode 100644 group15/1511_714512544/src/test/com/coding/basic/BinarySearchTreeTest.java create mode 100644 group15/1511_714512544/src/test/com/coding/basic/LinkedListTest.java create mode 100644 group15/1511_714512544/src/test/com/coding/basic/QueueTest.java create mode 100644 group15/1511_714512544/src/test/com/coding/basic/StackTest.java create mode 100644 "group15/1511_714512544/\346\226\207\347\253\240\345\234\260\345\235\200.md" create mode 100644 group15/1512_656512403/1512_656512403.md create mode 100644 group15/1512_656512403/src/Iterator.java create mode 100644 group15/1512_656512403/src/List.java create mode 100644 group15/1512_656512403/src/Main.java create mode 100644 group15/1512_656512403/src/MyArrayList.java create mode 100644 group15/1512_656512403/src/MyBinaryTreeNode.java create mode 100644 group15/1512_656512403/src/MyLinkedList.java create mode 100644 group15/1512_656512403/src/MyQuque.java create mode 100644 group15/1512_656512403/src/MyStack.java create mode 100644 group15/1513_121469918/HomeWork01/.classpath create mode 100644 group15/1513_121469918/HomeWork01/.gitignore create mode 100644 group15/1513_121469918/HomeWork01/.project create mode 100644 group15/1513_121469918/HomeWork01/.settings/org.eclipse.core.resources.prefs create mode 100644 group15/1513_121469918/HomeWork01/.settings/org.eclipse.jdt.core.prefs create mode 100644 group15/1513_121469918/HomeWork01/src/coding/ArrayList.java create mode 100644 group15/1513_121469918/HomeWork01/src/coding/BinaryTreeNode.java create mode 100644 group15/1513_121469918/HomeWork01/src/coding/Iterator.java create mode 100644 group15/1513_121469918/HomeWork01/src/coding/LinkedList.java create mode 100644 group15/1513_121469918/HomeWork01/src/coding/List.java create mode 100644 group15/1513_121469918/HomeWork01/src/coding/Queue.java create mode 100644 group15/1513_121469918/HomeWork01/src/coding/Stack.java create mode 100644 group15/1513_121469918/HomeWork20170305/.classpath create mode 100644 group15/1513_121469918/HomeWork20170305/.project create mode 100644 group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.core.resources.prefs create mode 100644 group15/1513_121469918/HomeWork20170305/.settings/org.eclipse.jdt.core.prefs create mode 100644 group15/1513_121469918/HomeWork20170305/bin/com/coderising/litestruts/struts.xml create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coderising/array/ArrayUtil.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/LoginAction.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/Struts.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/View.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coderising/litestruts/struts.xml create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coding/basic/ArrayList.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Iterator.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coding/basic/LinkedList.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coding/basic/List.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Queue.java create mode 100644 group15/1513_121469918/HomeWork20170305/src/com/coding/basic/Stack.java create mode 100644 group15/1514_616019420/.classpath create mode 100644 group15/1514_616019420/.gitignore create mode 100644 group15/1514_616019420/.project create mode 100644 group15/1514_616019420/src/com/coderising/array/ArrayUtil.java create mode 100644 group15/1514_616019420/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group15/1514_616019420/src/com/coderising/litestruts/LoginAction.java create mode 100644 group15/1514_616019420/src/com/coderising/litestruts/Struts.java create mode 100644 group15/1514_616019420/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group15/1514_616019420/src/com/coderising/litestruts/View.java create mode 100644 group15/1514_616019420/src/com/coderising/litestruts/struts.xml create mode 100644 group15/1514_616019420/src/com/coding/basic/ArrayList.java create mode 100644 group15/1514_616019420/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group15/1514_616019420/src/com/coding/basic/Iterator.java create mode 100644 group15/1514_616019420/src/com/coding/basic/LinkedList.java create mode 100644 group15/1514_616019420/src/com/coding/basic/List.java create mode 100644 group15/1514_616019420/src/com/coding/basic/Queue.java create mode 100644 group15/1514_616019420/src/com/coding/basic/Stack.java create mode 100644 group15/1514_616019420/src/com/coding/basic/readme.txt create mode 100644 group15/1515_337959725/.classpath create mode 100644 group15/1515_337959725/.gitignore create mode 100644 group15/1515_337959725/.project create mode 100644 group15/1515_337959725/.settings/org.eclipse.jdt.core.prefs create mode 100644 group15/1515_337959725/src/com/coderising/array/ArrayUtil.java create mode 100644 group15/1515_337959725/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group15/1515_337959725/src/com/coderising/litestruts/LoginAction.java create mode 100644 group15/1515_337959725/src/com/coderising/litestruts/Struts.java create mode 100644 group15/1515_337959725/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group15/1515_337959725/src/com/coderising/litestruts/View.java create mode 100644 group15/1515_337959725/src/com/coderising/litestruts/struts.xml create mode 100644 group15/1515_337959725/src/com/coding/basic/ArrayListTest.java create mode 100644 group15/1515_337959725/src/com/coding/basic/BinaryTreeTest.java create mode 100644 group15/1515_337959725/src/com/coding/basic/IteratorTest.java create mode 100644 group15/1515_337959725/src/com/coding/basic/LinkedListTest.java create mode 100644 group15/1515_337959725/src/com/coding/basic/ListTest.java create mode 100644 group15/1515_337959725/src/com/coding/basic/Queue.java create mode 100644 group15/1515_337959725/src/com/coding/basic/StackTest.java create mode 100644 group15/1517_279137987/src/com/coderising/array/ArrayUtil.java create mode 100644 group15/1517_279137987/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group15/1517_279137987/src/com/coderising/litestruts/LoginAction.java create mode 100644 group15/1517_279137987/src/com/coderising/litestruts/Struts.java create mode 100644 group15/1517_279137987/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group15/1517_279137987/src/com/coderising/litestruts/View.java create mode 100644 group15/1517_279137987/src/com/coderising/litestruts/struts.xml create mode 100644 group15/1517_279137987/src/my/collection/linear/MyArrayList.java create mode 100644 group15/1517_279137987/src/my/collection/linear/MyBinaryTreeNode.java create mode 100644 group15/1517_279137987/src/my/collection/linear/MyIterator.java create mode 100644 group15/1517_279137987/src/my/collection/linear/MyLinkedList.java create mode 100644 group15/1517_279137987/src/my/collection/linear/MyList.java create mode 100644 group15/1517_279137987/src/my/collection/linear/MyQueue.java create mode 100644 group15/1517_279137987/src/my/collection/linear/MyStack.java create mode 100644 group15/1517_279137987/src/my/collection/linearTest/MyArrayListTest.java create mode 100644 group15/1517_279137987/src/my/collection/linearTest/MyBinaryTreeNodeTest.java create mode 100644 group15/1517_279137987/src/my/collection/linearTest/MyLinkedListTest.java create mode 100644 group15/1517_279137987/src/my/collection/linearTest/MyQueueTest.java create mode 100644 group15/1517_279137987/src/my/collection/linearTest/MyStackTest.java create mode 100644 group15/1517_279137987/src/my/collection/linearTestJUnit/MyArrayListTest.java create mode 100644 group15/1517_279137987/src/my/collection/linearTestJUnit/MyBinaryTreeNodeTest.java create mode 100644 group15/1518_164377794/ArrayUtil.java create mode 100644 group15/1519_137845093/.classpath create mode 100644 group15/1519_137845093/.gitignore create mode 100644 group15/1519_137845093/.project create mode 100644 group15/1519_137845093/3.5_homework/array/ArrayUtil.java create mode 100644 group15/1519_137845093/src_1st_homework_1519_137845093/ArrayList.java create mode 100644 group15/1519_137845093/src_1st_homework_1519_137845093/BinaryTreeNode.java create mode 100644 group15/1519_137845093/src_1st_homework_1519_137845093/Iterator.java create mode 100644 group15/1519_137845093/src_1st_homework_1519_137845093/LinkedList.java create mode 100644 group15/1519_137845093/src_1st_homework_1519_137845093/List.java create mode 100644 group15/1519_137845093/src_1st_homework_1519_137845093/Queue.java create mode 100644 group15/1519_137845093/src_1st_homework_1519_137845093/Stack.java create mode 100644 group15/1521_653895972/.gitignore create mode 100644 group15/1521_653895972/src/com/coding/basic/ArrayList.java create mode 100644 group15/1521_653895972/src/com/coding/basic/BasicTest.java create mode 100644 group15/1521_653895972/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group15/1521_653895972/src/com/coding/basic/Iterator.java create mode 100644 group15/1521_653895972/src/com/coding/basic/LinkedList.java create mode 100644 group15/1521_653895972/src/com/coding/basic/List.java create mode 100644 group15/1521_653895972/src/com/coding/basic/Queue.java create mode 100644 group15/1521_653895972/src/com/coding/basic/Stack.java create mode 100644 group15/1521_653895972/src/com/coding/coderising/array/ArrayUtilTest.java create mode 100644 group15/1521_653895972/src/com/coding/coderising/array/SimpleArrayUtil.java create mode 100644 group15/1521_653895972/src/com/coding/coderising/litestruts/LoginAction.java create mode 100644 group15/1521_653895972/src/com/coding/coderising/litestruts/Struts.java create mode 100644 group15/1521_653895972/src/com/coding/coderising/litestruts/StrutsTest.java create mode 100644 group15/1521_653895972/src/com/coding/coderising/litestruts/View.java create mode 100644 group15/1521_653895972/src/com/coding/coderising/litestruts/struts.xml create mode 100644 group15/group15.md create mode 100644 group16/1012075117/DataStructure219/.classpath create mode 100644 group16/1012075117/DataStructure219/.project create mode 100644 group16/1012075117/DataStructure219/.settings/org.eclipse.jdt.core.prefs create mode 100644 group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/ArrayList.java create mode 100644 group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/LinkedList.java create mode 100644 group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/List.java create mode 100644 group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Queue.java create mode 100644 group16/1012075117/DataStructure219/src/com/stackwei/DataStructure/Stack.java create mode 100644 group16/1154151360/.classpath create mode 100644 group16/1154151360/.gitignore create mode 100644 group16/1154151360/.project create mode 100644 group16/1154151360/.settings/org.eclipse.core.resources.prefs create mode 100644 group16/1154151360/src/com/array/ArrayUtil.java create mode 100644 group16/1154151360/src/com/array/ArrayUtilTest.java create mode 100644 group16/1154151360/src/com/list/ArrayList.java create mode 100644 group16/1154151360/src/com/list/LinkedList.java create mode 100644 group16/1154151360/src/com/list/Queue.java create mode 100644 group16/1154151360/src/com/list/Stack.java create mode 100644 group16/1154151360/src/com/litestruts/LoginAction.java create mode 100644 group16/1154151360/src/com/litestruts/Struts.java create mode 100644 group16/1154151360/src/com/litestruts/StrutsTest.java create mode 100644 group16/1154151360/src/com/litestruts/View.java create mode 100644 group16/1154151360/src/com/litestruts/struts.xml create mode 100644 group16/1287642108/0226/src/com/coding/basic/ArrayList.java create mode 100644 group16/1287642108/0226/src/com/coding/basic/Iterator.java create mode 100644 group16/1287642108/0226/src/com/coding/basic/LinkedList.java create mode 100644 group16/1287642108/0226/src/com/coding/basic/List.java create mode 100644 group16/1287642108/0226/src/com/coding/basic/Queue.java create mode 100644 group16/1287642108/0226/src/com/coding/basic/Stack.java create mode 100644 group16/1287642108/0305/src/com/coderising/array/ArrayUtil.java create mode 100644 group16/1287642108/0305/src/com/coderising/litestruts/LoginAction.java create mode 100644 group16/1287642108/0305/src/com/coderising/litestruts/Struts.java create mode 100644 group16/1287642108/0305/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group16/1287642108/0305/src/com/coderising/litestruts/View.java create mode 100644 group16/1287642108/0305/src/com/coderising/litestruts/struts.xml create mode 100644 group16/1325756593/.classpath create mode 100644 group16/1325756593/.gitignore create mode 100644 group16/1325756593/.project create mode 100644 group16/1325756593/dongqihust.readme create mode 100644 group16/1325756593/src/com/coderising/array/ArrayUtil.java create mode 100644 group16/1325756593/src/com/coderising/array/ArrayUtilTest.java create mode 100644 group16/1325756593/src/com/coderising/litestruts/Action.java create mode 100644 group16/1325756593/src/com/coderising/litestruts/LoginAction.java create mode 100644 group16/1325756593/src/com/coderising/litestruts/Struts.java create mode 100644 group16/1325756593/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group16/1325756593/src/com/coderising/litestruts/View.java create mode 100644 group16/1325756593/src/com/coderising/litestruts/struts.xml create mode 100644 group16/1325756593/src/com/dong/week1/ArrayList.java create mode 100644 group16/1325756593/src/com/dong/week1/ArrayListTest.java create mode 100644 group16/1325756593/src/com/dong/week1/BinaryTreeNode.java create mode 100644 group16/1325756593/src/com/dong/week1/Iterator.java create mode 100644 group16/1325756593/src/com/dong/week1/LinkedList.java create mode 100644 group16/1325756593/src/com/dong/week1/List.java create mode 100644 group16/1325756593/src/com/dong/week1/Queue.java create mode 100644 group16/1325756593/src/com/dong/week1/Stack.java create mode 100644 group16/1924332561/.classpath create mode 100644 group16/1924332561/.project create mode 100644 group16/1924332561/.settings/org.eclipse.core.resources.prefs create mode 100644 group16/1924332561/src/com/coding/basic/ArrayList.java create mode 100644 group16/1924332561/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group16/1924332561/src/com/coding/basic/Iterator.java create mode 100644 group16/1924332561/src/com/coding/basic/LinkedList.java create mode 100644 group16/1924332561/src/com/coding/basic/List.java create mode 100644 group16/1924332561/src/com/coding/basic/Queue.java create mode 100644 group16/1924332561/src/com/coding/basic/Stack.java create mode 100644 group16/214074094/readme.txt create mode 100644 group16/214074094/src/main/java/study/coderising/array/ArrayUtil.java create mode 100644 group16/214074094/src/main/java/study/coderising/litestruts/LoginAction.java create mode 100644 group16/214074094/src/main/java/study/coderising/litestruts/LogoutAction.java create mode 100644 group16/214074094/src/main/java/study/coderising/litestruts/Struts.java create mode 100644 group16/214074094/src/main/java/study/coderising/litestruts/StrutsTest.java create mode 100644 group16/214074094/src/main/java/study/coderising/litestruts/View.java create mode 100644 group16/214074094/src/main/java/study/coderising/litestruts/bean/Action.java create mode 100644 group16/214074094/src/main/java/study/coderising/litestruts/bean/Result.java create mode 100644 group16/214074094/src/main/java/study/coding/basic/ArrayList.java create mode 100644 group16/214074094/src/main/java/study/coding/basic/BinaryTreeNode.java create mode 100644 group16/214074094/src/main/java/study/coding/basic/Iterator.java create mode 100644 group16/214074094/src/main/java/study/coding/basic/LinkedList.java create mode 100644 group16/214074094/src/main/java/study/coding/basic/List.java create mode 100644 group16/214074094/src/main/java/study/coding/basic/Queue.java create mode 100644 group16/214074094/src/main/java/study/coding/basic/Stack.java create mode 100644 group16/214074094/src/main/java/study/reading/blog.txt create mode 100644 group16/214074094/src/main/resources/struts.xml create mode 100644 group16/214074094/src/test/java/study/AbstractTest.java create mode 100644 group16/214074094/src/test/java/study/coderising/ArrayUtilTest.java create mode 100644 group16/214074094/src/test/java/study/coding/basic/ArrayListTest.java create mode 100644 group16/214074094/src/test/java/study/coding/basic/BinaryTreeNodeTest.java create mode 100644 group16/214074094/src/test/java/study/coding/basic/LinkedListTest.java create mode 100644 group16/214074094/src/test/java/study/coding/basic/QueueTest.java create mode 100644 group16/214074094/src/test/java/study/coding/basic/StackTest.java create mode 100644 group16/2562124714/src/Test/ArrayListTest.java create mode 100644 group16/2562124714/src/Test/BinaryTreeNodeTest.java create mode 100644 group16/2562124714/src/Test/LinkedListTest.java create mode 100644 group16/2562124714/src/Test/QueueTest.java create mode 100644 group16/2562124714/src/Test/StackTest.java create mode 100644 group16/2562124714/src/Test/TestRunner.java create mode 100644 group16/2562124714/src/com/coding/basic/ArrayList.java create mode 100644 group16/2562124714/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group16/2562124714/src/com/coding/basic/Iterator.java create mode 100644 group16/2562124714/src/com/coding/basic/LinkedList.java create mode 100644 group16/2562124714/src/com/coding/basic/List.java create mode 100644 group16/2562124714/src/com/coding/basic/Queue.java create mode 100644 group16/2562124714/src/com/coding/basic/Stack.java create mode 100644 group16/2562124714/src/com/coding/basic/TestJunit.java create mode 100644 group16/2562124714/src/com/coding/basic/TestRunner.java create mode 100644 group16/2562124714/src/com/coding/basic/TreeData.java create mode 100644 group16/2816977791/.gitignore create mode 100644 group16/2816977791/firstExercise/src/com/coding/basic/ArrayList.java create mode 100644 group16/2816977791/firstExercise/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group16/2816977791/firstExercise/src/com/coding/basic/Iterator.java create mode 100644 group16/2816977791/firstExercise/src/com/coding/basic/LinkedList.java create mode 100644 group16/2816977791/firstExercise/src/com/coding/basic/List.java create mode 100644 group16/2816977791/firstExercise/src/com/coding/basic/Queue.java create mode 100644 group16/2816977791/firstExercise/src/com/coding/basic/Stack.java create mode 100644 group16/2816977791/secondExercise/src/com/coderising/array/ArrayUtil.java create mode 100644 group16/2816977791/secondExercise/src/com/coderising/litestruts/ActionXml.java create mode 100644 group16/2816977791/secondExercise/src/com/coderising/litestruts/LoginAction.java create mode 100644 group16/2816977791/secondExercise/src/com/coderising/litestruts/Struts.java create mode 100644 group16/2816977791/secondExercise/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group16/2816977791/secondExercise/src/com/coderising/litestruts/View.java create mode 100644 group16/2816977791/secondExercise/src/com/coderising/litestruts/struts.xml create mode 100644 group16/313001956/.classpath create mode 100644 group16/313001956/.gitignore create mode 100644 group16/313001956/.project create mode 100644 group16/313001956/.settings/.jsdtscope create mode 100644 group16/313001956/.settings/org.eclipse.jdt.core.prefs create mode 100644 group16/313001956/.settings/org.eclipse.wst.common.component create mode 100644 group16/313001956/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 group16/313001956/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 group16/313001956/WebContent/META-INF/MANIFEST.MF create mode 100644 group16/313001956/src/com/coding/basic/ArrayList.java create mode 100644 group16/313001956/src/com/coding/basic/LinkedList.java create mode 100644 group16/313001956/src/com/coding/basic/Queue.java create mode 100644 group16/313001956/src/com/coding/basic/Stack.java create mode 100644 group16/420355244/Homework1/.classpath create mode 100644 group16/420355244/Homework1/.gitignore create mode 100644 group16/420355244/Homework1/.project create mode 100644 group16/420355244/Homework1/.settings/org.eclipse.jdt.core.prefs create mode 100644 group16/420355244/Homework1/src/com/coding/basic/ArrayList.java create mode 100644 group16/420355244/Homework1/src/com/coding/basic/ArrayListTest.java create mode 100644 group16/420355244/Homework1/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group16/420355244/Homework1/src/com/coding/basic/Iterator.java create mode 100644 group16/420355244/Homework1/src/com/coding/basic/LinkedList.java create mode 100644 group16/420355244/Homework1/src/com/coding/basic/LinkedListTest.java create mode 100644 group16/420355244/Homework1/src/com/coding/basic/List.java create mode 100644 group16/420355244/Homework1/src/com/coding/basic/Queue.java create mode 100644 group16/420355244/Homework1/src/com/coding/basic/QueueTest.java create mode 100644 group16/420355244/Homework1/src/com/coding/basic/Stack.java create mode 100644 group16/420355244/Homework1/src/com/coding/basic/StackTest.java create mode 100644 group16/420355244/Homework2/.classpath create mode 100644 group16/420355244/Homework2/.gitignore create mode 100644 group16/420355244/Homework2/.project create mode 100644 group16/420355244/Homework2/src/com/coderising/action/LoginAction.java create mode 100644 group16/420355244/Homework2/src/com/coderising/array/ArrayUtil.java create mode 100644 group16/420355244/Homework2/src/com/coderising/litestruts/Struts.java create mode 100644 group16/420355244/Homework2/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group16/420355244/Homework2/src/com/coderising/litestruts/View.java create mode 100644 group16/420355244/Homework2/src/com/coderising/litestruts/struts.xml create mode 100644 group16/502059278/.classpath create mode 100644 group16/502059278/.gitignore create mode 100644 group16/502059278/.project create mode 100644 group16/502059278/src/cn/mark/work0219/MyArrayList.java create mode 100644 group16/502059278/src/cn/mark/work0219/MyLinkedList.java create mode 100644 group16/502059278/src/cn/mark/work0219/MyList.java create mode 100644 group16/502059278/src/cn/mark/work0226/ArrayUtil.java create mode 100644 group16/502059278/src/cn/mark/work0226/TestArrayUtil.java create mode 100644 group16/502059278/src/cn/mark/work0226/litestruts/LoginAction.java create mode 100644 group16/502059278/src/cn/mark/work0226/litestruts/Struts.java create mode 100644 group16/502059278/src/cn/mark/work0226/litestruts/StrutsTest.java create mode 100644 group16/502059278/src/cn/mark/work0226/litestruts/View.java create mode 100644 group16/502059278/src/cn/mark/work0226/litestruts/XMLUtils.java create mode 100644 group16/502059278/src/struts.xml create mode 100644 group16/542087872/out/production/coding2017/com/coderising/litestruts/struts.xml create mode 100644 group16/542087872/out/production/coding2017/net/coding/coderising/litestruts/struts.xml create mode 100644 group16/542087872/src/net/coding/basic/ArrayList.java create mode 100644 group16/542087872/src/net/coding/basic/BinaryTreeNode.java create mode 100644 group16/542087872/src/net/coding/basic/Iterator.java create mode 100644 group16/542087872/src/net/coding/basic/LinkedList.java create mode 100644 group16/542087872/src/net/coding/basic/List.java create mode 100644 group16/542087872/src/net/coding/basic/Queue.java create mode 100644 group16/542087872/src/net/coding/basic/Stack.java create mode 100644 group16/542087872/src/net/coding/basic/Test.java create mode 100644 group16/542087872/src/net/coding/coderising/array/ArrayUtil.java create mode 100644 group16/542087872/src/net/coding/coderising/array/ArrayUtilTest.java create mode 100644 group16/542087872/src/net/coding/coderising/litestruts/LoginAction.java create mode 100644 group16/542087872/src/net/coding/coderising/litestruts/LogoutAction.java create mode 100644 group16/542087872/src/net/coding/coderising/litestruts/Struts.java create mode 100644 group16/542087872/src/net/coding/coderising/litestruts/StrutsTest.java create mode 100644 group16/542087872/src/net/coding/coderising/litestruts/View.java create mode 100644 group16/542087872/src/net/coding/coderising/litestruts/struts.xml create mode 100644 group16/63912401/.classpath create mode 100644 group16/63912401/.gitignore create mode 100644 group16/63912401/.project create mode 100644 group16/63912401/src/com/coderising/action/LoginAction.java create mode 100644 group16/63912401/src/com/coderising/array/ArrayUtil.java create mode 100644 group16/63912401/src/com/coderising/litestruts/ActionMapping.java create mode 100644 group16/63912401/src/com/coderising/litestruts/ConfigurationManager.java create mode 100644 group16/63912401/src/com/coderising/litestruts/DefaultAction.java create mode 100644 group16/63912401/src/com/coderising/litestruts/ResultMapping.java create mode 100644 group16/63912401/src/com/coderising/litestruts/Struts.java create mode 100644 group16/63912401/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group16/63912401/src/com/coderising/litestruts/View.java create mode 100644 group16/63912401/src/com/coderising/litestruts/struts.xml create mode 100644 group16/63912401/src/com/coding/basic/ArrayList.java create mode 100644 group16/63912401/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group16/63912401/src/com/coding/basic/Iterator.java create mode 100644 group16/63912401/src/com/coding/basic/LinkedList.java create mode 100644 group16/63912401/src/com/coding/basic/List.java create mode 100644 group16/63912401/src/com/coding/basic/Queue.java create mode 100644 group16/63912401/src/com/coding/basic/Stack.java create mode 100644 group16/63912401/src/com/coding/basic/Stack2.java create mode 100644 group16/932886072/djj/ArrayList.java create mode 100644 group16/932886072/djj/BinaryTreeNode.java create mode 100644 group16/932886072/djj/Iterator.java create mode 100644 group16/932886072/djj/LinkedList.java create mode 100644 group16/932886072/djj/List.java create mode 100644 group16/932886072/djj/Queue.java create mode 100644 group16/932886072/djj/Stack.java create mode 100644 group16/group16.md create mode 100644 group16/out/production/214074094/com/reading/blog_test.txt create mode 100644 group16/out/production/214074094/readme.txt create mode 100644 group16/out/production/214074094/src/com/reading/blog_test.txt create mode 100644 group17/.gitignore create mode 100644 group17/102228177/work2_19/.classpath create mode 100644 group17/102228177/work2_19/.gitignore create mode 100644 group17/102228177/work2_19/.project create mode 100644 group17/102228177/work2_19/src/data2_19/ArrayList.java create mode 100644 group17/102228177/work2_19/src/data2_19/BinaryTreeNode.java create mode 100644 group17/102228177/work2_19/src/data2_19/Iterator.java create mode 100644 group17/102228177/work2_19/src/data2_19/LinkedList.java create mode 100644 group17/102228177/work2_19/src/data2_19/List.java create mode 100644 group17/102228177/work2_19/src/data2_19/Queue.java create mode 100644 group17/102228177/work2_19/src/data2_19/Stack.java create mode 100644 group17/102228177/work2_26/.classpath create mode 100644 group17/102228177/work2_26/.project create mode 100644 group17/102228177/work2_26/.settings/org.eclipse.jdt.core.prefs create mode 100644 group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java create mode 100644 group17/102228177/work2_26/src/com/coderising/litestruts/BeanUtil.java create mode 100644 group17/102228177/work2_26/src/com/coderising/litestruts/Dom4jUtil.java create mode 100644 group17/102228177/work2_26/src/com/coderising/litestruts/LoginAction.java create mode 100644 group17/102228177/work2_26/src/com/coderising/litestruts/Struts.java create mode 100644 group17/102228177/work2_26/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group17/102228177/work2_26/src/com/coderising/litestruts/View.java create mode 100644 group17/102228177/work2_26/src/com/coderising/litestruts/struts.xml create mode 100644 group17/1158154002/.classpath create mode 100644 group17/1158154002/.gitignore create mode 100644 group17/1158154002/.project create mode 100644 group17/1158154002/src/test01/arrayList/ArrayListTest.java create mode 100644 group17/1158154002/src/test01/arrayList/CetrinwArrayList.java create mode 100644 group17/1158154002/src/test01/arrayList/CetrinwList.java create mode 100644 group17/1158154002/src/test01/linkedList/MyLinkedList.java create mode 100644 group17/1158154002/src/test01/linkedList/MyLinkedListTest.java create mode 100644 group17/1158154002/src/test01/queue/Queue.java create mode 100644 group17/1158154002/src/test01/queue/QueueTest.java create mode 100644 group17/1158154002/src/test01/stack/MyStack.java create mode 100644 group17/1158154002/src/test01/tree/Test.java create mode 100644 group17/1158154002/src/test01/tree/Tree.java create mode 100644 group17/1158154002/src/test01/tree/TreeNode.java create mode 100644 group17/1158154002/src/test02/array/ArrayUtil.java create mode 100644 group17/1158154002/src/test02/litestruts/Action.java create mode 100644 group17/1158154002/src/test02/litestruts/LoginAction.java create mode 100644 group17/1158154002/src/test02/litestruts/Struts.java create mode 100644 group17/1158154002/src/test02/litestruts/StrutsTest.java create mode 100644 group17/1158154002/src/test02/litestruts/View.java create mode 100644 group17/1158154002/src/test02/litestruts/sax/SAXParser.java create mode 100644 group17/1158154002/src/test02/litestruts/sax/SAXParserDemo.java create mode 100644 group17/1158154002/src/test02/litestruts/sax/SAXParserHandler.java create mode 100644 group17/1158154002/src/test02/litestruts/struts.xml create mode 100644 group17/1158154002/src/test02/litestruts/util/StringUtil.java create mode 100644 group17/116665530/homework/src/com/coding/basic/MyArrayList.java create mode 100644 group17/116665530/homework/src/com/coding/basic/MyBinaryTreeNode.java create mode 100644 group17/116665530/homework/src/com/coding/basic/MyIterator.java create mode 100644 group17/116665530/homework/src/com/coding/basic/MyLinkedList.java create mode 100644 group17/116665530/homework/src/com/coding/basic/MyList.java create mode 100644 group17/116665530/homework/src/com/coding/basic/MyQueue.java create mode 100644 group17/116665530/homework/src/com/coding/basic/MyStack.java create mode 100644 group17/1204187480/.gitignore create mode 100644 group17/1204187480/code/homework/basic/pom.xml create mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java create mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java create mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java create mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java create mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java create mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java create mode 100644 group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java create mode 100644 group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArrayListTest.java create mode 100644 group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java create mode 100644 group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java create mode 100644 group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java create mode 100644 group17/1204187480/code/homework/coderising/pom.xml create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/action/LoginAction.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/BeanUtils.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/util/StringUtils.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/resources/struts.xml create mode 100644 group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java create mode 100644 group17/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java create mode 100644 group17/1204187480/code/homework/coderising/src/test/java/com/coderising/array/ArrayUtilTest.java create mode 100644 group17/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java create mode 100644 group17/1204187480/code/homework/parent/pom.xml create mode 100644 group17/1204187480/code/homework/pom.xml create mode 100644 "group17/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272" create mode 100644 group17/1264835468/src/assignment/BinaryTree.java create mode 100644 group17/1264835468/src/assignment/BinaryTreeNode.java create mode 100644 group17/1264835468/src/assignment/Iterable.java create mode 100644 group17/1264835468/src/assignment/Iterator.java create mode 100644 group17/1264835468/src/assignment/List.java create mode 100644 group17/1264835468/src/assignment/MyArrayList.java create mode 100644 group17/1264835468/src/assignment/MyLinkedList.java create mode 100644 group17/1264835468/src/assignment/MyQueue.java create mode 100644 group17/1264835468/src/assignment/MyStack.java create mode 100644 group17/1264835468/src/assignment2_26/ArrayUtil.java create mode 100644 group17/1264835468/src/assignment2_26/ArrayUtilTest.java create mode 100644 group17/1264835468/src/assignment2_26/LoginAction.java create mode 100644 group17/1264835468/src/assignment2_26/Struts.java create mode 100644 group17/1264835468/src/assignment2_26/StrutsTest.java create mode 100644 group17/1264835468/src/assignment2_26/View.java create mode 100644 group17/1264835468/src/assignment2_26/XmlParser.java create mode 100644 group17/1264835468/src/struts.xml create mode 100644 group17/1282579502/.classpath create mode 100644 group17/1282579502/.gitignore create mode 100644 group17/1282579502/.project create mode 100644 group17/1282579502/.settings/org.eclipse.jdt.core.prefs create mode 100644 group17/1282579502/src/com/coderising/array/ArrayUtil.java create mode 100644 group17/1282579502/src/com/coderising/array/ut/ArrayUtilTest.java create mode 100644 group17/1282579502/src/com/coderising/litestruts/LoginAction.java create mode 100644 group17/1282579502/src/com/coderising/litestruts/Struts.java create mode 100644 group17/1282579502/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group17/1282579502/src/com/coderising/litestruts/View.java create mode 100644 group17/1282579502/src/com/coderising/litestruts/struts.xml create mode 100644 group17/1282579502/src/com/coderising/parser/TestDriver.java create mode 100644 group17/1282579502/src/com/coderising/parser/XmlParser.java create mode 100644 group17/1282579502/src/com/coding/basic/ArrayList.java create mode 100644 group17/1282579502/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group17/1282579502/src/com/coding/basic/Iterator.java create mode 100644 group17/1282579502/src/com/coding/basic/LinkedList.java create mode 100644 group17/1282579502/src/com/coding/basic/List.java create mode 100644 group17/1282579502/src/com/coding/basic/Queue.java create mode 100644 group17/1282579502/src/com/coding/basic/Stack.java create mode 100644 group17/1282579502/src/com/coding/basic/ut/ArrayListTest.java create mode 100644 group17/1282579502/src/com/coding/basic/ut/BinaryTreeNodeTest.java create mode 100644 group17/1282579502/src/com/coding/basic/ut/LinkedListTest.java create mode 100644 group17/1282579502/src/com/coding/basic/ut/QueueTest.java create mode 100644 group17/1282579502/src/com/coding/basic/ut/StackTest.java create mode 100644 group17/1540186032/First/src/ArrayList.java create mode 100644 group17/1540186032/First/src/BinaryTreeNode.java create mode 100644 group17/1540186032/First/src/Iterator.java create mode 100644 group17/1540186032/First/src/LinkedList.java create mode 100644 group17/1540186032/First/src/List.java create mode 100644 group17/1540186032/First/src/Queue.java create mode 100644 group17/1540186032/First/src/Stack.java create mode 100644 group17/176653813/1766538130226Lesson/.classpath create mode 100644 group17/176653813/1766538130226Lesson/.gitignore create mode 100644 group17/176653813/1766538130226Lesson/.project create mode 100644 group17/176653813/1766538130226Lesson/.settings/org.eclipse.jdt.core.prefs create mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/ArrayList.java create mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/LinkList.java create mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/List.java create mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/Queue.java create mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/Stack.java create mode 100644 group17/176653813/1766538130226Lesson/src/com/coding/basic/Test.java create mode 100644 group17/176653813/RemoteSystemsTempFiles/.project create mode 100644 group17/240094626/.gitignore create mode 100644 group17/240094626/warm-up/.gitignore create mode 100644 group17/240094626/warm-up/src/com/array/ArrayUtil.java create mode 100644 group17/240094626/warm-up/src/com/coderising/litestruts/Struts.java create mode 100644 group17/240094626/warm-up/src/com/coderising/litestruts/exception/StrutsException.java create mode 100644 group17/240094626/warm-up/src/com/coderising/litestruts/struts.xml create mode 100644 group17/240094626/warm-up/src/com/coderising/litestruts/util/FileUtils.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/Iterator.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/List.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/impl/ArrayList.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/impl/BinaryTree.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/impl/LinkedList.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/impl/Queue.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/impl/Stack.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/test/ArrayListTest.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/test/LinkedListTest.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/test/QueueTest.java create mode 100644 group17/240094626/warm-up/src/com/coding/basic/test/StackTest.java create mode 100644 group17/240094626/warm-up/src/com/litestruts/LoginAction.java create mode 100644 group17/240094626/warm-up/src/com/litestruts/Struts.java create mode 100644 group17/240094626/warm-up/src/com/litestruts/StrutsTest.java create mode 100644 group17/240094626/warm-up/src/com/litestruts/View.java create mode 100644 group17/240094626/warm-up/src/com/litestruts/exception/StrutsRunActionException.java create mode 100644 group17/240094626/warm-up/src/com/litestruts/exception/StrutsXMLLoaderException.java create mode 100644 group17/240094626/warm-up/src/com/litestruts/struts.xml create mode 100644 group17/240094626/work_0226/src/com/coderising/array/ArrayUtil.java create mode 100644 group17/240094626/work_0226/src/com/coderising/litestruts/LoginAction.java create mode 100644 group17/240094626/work_0226/src/com/coderising/litestruts/Struts.java create mode 100644 group17/240094626/work_0226/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group17/240094626/work_0226/src/com/coderising/litestruts/View.java create mode 100644 group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsRunActionException.java create mode 100644 group17/240094626/work_0226/src/com/coderising/litestruts/exception/StrutsXMLLoaderException.java create mode 100644 group17/240094626/work_0226/src/com/coderising/litestruts/struts.xml create mode 100644 group17/51075907/HomeWork/.classpath create mode 100644 group17/51075907/HomeWork/.project create mode 100644 group17/51075907/HomeWork/.settings/org.eclipse.jdt.core.prefs create mode 100644 group17/51075907/HomeWork/src/day1_HomeWork/ArrayList.java create mode 100644 group17/51075907/HomeWork/src/day1_HomeWork/LinkedList.java create mode 100644 group17/51075907/HomeWork/src/day1_HomeWork/List.java create mode 100644 group17/51075907/HomeWork/src/day1_HomeWork/Queue.java create mode 100644 group17/51075907/HomeWork/src/day1_HomeWork/Stack.java create mode 100644 group17/516886559/ArrayList.java create mode 100644 group17/516886559/BinaryTreeNode.java create mode 100644 group17/516886559/Iterator.java create mode 100644 group17/516886559/LinkedList.java create mode 100644 group17/516886559/List.java create mode 100644 group17/516886559/Queue.java create mode 100644 group17/516886559/Stack.java create mode 100644 group17/785396327/2.26/binarytree/BinaryTree.java create mode 100644 group17/785396327/2.26/binarytree/DLRSearchType.java create mode 100644 group17/785396327/2.26/binarytree/LDRSearchType.java create mode 100644 group17/785396327/2.26/binarytree/LFSearchType.java create mode 100644 group17/785396327/2.26/binarytree/LRDSearchType.java create mode 100644 group17/785396327/2.26/binarytree/SearchType.java create mode 100644 group17/785396327/2.26/list/ArrayList.java create mode 100644 group17/785396327/2.26/list/Iterator.java create mode 100644 group17/785396327/2.26/list/LinkedList.java create mode 100644 group17/785396327/2.26/list/List.java create mode 100644 group17/785396327/2.26/queue/Queue.java create mode 100644 group17/785396327/2.26/stack/Stack.java create mode 100644 group17/785396327/3.5/array/ArrayUtils.java create mode 100644 group17/785396327/3.5/array/ArrayUtilsTest.java create mode 100644 group17/785396327/3.5/struts/LoginAction.java create mode 100644 group17/785396327/3.5/struts/LoginActionTest.java create mode 100644 group17/785396327/3.5/struts/Struts.java create mode 100644 group17/785396327/3.5/struts/StrutsUtils.java create mode 100644 group17/785396327/3.5/struts/View.java create mode 100644 group17/785396327/3.5/struts/struts.xml create mode 100644 group17/82427129/.gitignore create mode 100644 group17/82427129/JavaUtil/pom.xml create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/array/ArrayUtil.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/LoginAction.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/Struts.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/litestruts/View.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/ArrayList.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/BinaryTreeNode.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/Iterator.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/LinkedList.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/List.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/Queue.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java create mode 100644 group17/82427129/JavaUtil/src/main/resources/liteStruts.xml create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coderising/array/ArrayUtilTest.java create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coderising/litestruts/StrutsTest.java create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/ArrayListTest.java create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/LinkedListTest.java create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/Test.java create mode 100644 group17/865797761/.classpath create mode 100644 group17/865797761/.gitignore create mode 100644 group17/865797761/.project create mode 100644 group17/865797761/.settings/org.eclipse.jdt.core.prefs create mode 100644 group17/865797761/src/Collection/ArrayList.java create mode 100644 group17/865797761/src/Collection/Iterable.java create mode 100644 group17/865797761/src/Collection/Iterator.java create mode 100644 group17/865797761/src/Collection/List.java create mode 100644 group17/865797761/src/Collection/MyArrayList.java create mode 100644 group17/865797761/src/Collection/MyLinkedList.java create mode 100644 group17/865797761/src/Collection/MyQueue.java create mode 100644 group17/876385982/.classpath create mode 100644 group17/876385982/.gitignore create mode 100644 group17/876385982/.project create mode 100644 group17/876385982/src/test/Test.java create mode 100644 group17/article/20170226-20170305.md create mode 100644 group17/article/template.md create mode 100644 "group17/article/\345\206\231\344\270\200\347\257\207\346\226\207\347\253\240\344\273\213\347\273\215cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244\344\273\245\345\217\212\344\273\226\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273_20170226.md" create mode 100644 group17/count/homework.md create mode 100644 group17/group17.md create mode 100644 group18/1049843090/.classpath create mode 100644 group18/1049843090/.gitignore create mode 100644 group18/1049843090/.project create mode 100644 group18/1049843090/src/com/coderising/array/ArrayUtil.java create mode 100644 group18/1049843090/src/com/coding/basic/ArrayList.java create mode 100644 group18/1049843090/src/com/coding/basic/BinaryTree.java create mode 100644 group18/1049843090/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group18/1049843090/src/com/coding/basic/Iterator.java create mode 100644 group18/1049843090/src/com/coding/basic/LinkedList.java create mode 100644 group18/1049843090/src/com/coding/basic/List.java create mode 100644 group18/1049843090/src/com/coding/basic/Queue.java create mode 100644 group18/1049843090/src/com/coding/basic/Stack.java create mode 100644 group18/1049843090/test/com/coding/basic/ArrayListTest.java create mode 100644 group18/1049843090/test/com/coding/basic/LinkedListTest.java create mode 100644 group18/1049843090/test/com/coding/basic/QueueTest.java create mode 100644 group18/1049843090/test/com/coding/basic/StackTest.java create mode 100644 group18/1057617027/.classpath create mode 100644 group18/1057617027/.gitignore create mode 100644 group18/1057617027/.project create mode 100644 group18/1057617027/src/com/coding/basic/ArrayList.java create mode 100644 group18/1057617027/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group18/1057617027/src/com/coding/basic/Iterator.java create mode 100644 group18/1057617027/src/com/coding/basic/LinkedList.java create mode 100644 group18/1057617027/src/com/coding/basic/List.java create mode 100644 group18/1057617027/src/com/coding/basic/Queue.java create mode 100644 group18/1057617027/src/com/coding/basic/Stack.java create mode 100644 group18/1078285863/javaStudy/src/basicStruct/BasicStruct.java create mode 100644 group18/1078285863/javaStudy/src/simpleArrayList/SimpleArrayList.java create mode 100644 group18/1078285863/javaStudy/src/simpleLinkedList/SimpleLinkedList.java create mode 100644 group18/1078285863/javaStudy/src/simpleQueue/SimpleQueue.java create mode 100644 group18/1078285863/javaStudy/src/simpleStack/SimpleStack.java create mode 100644 group18/1159828430/20170219/.classpath create mode 100644 group18/1159828430/20170219/.gitignore create mode 100644 group18/1159828430/20170219/.project create mode 100644 group18/1159828430/20170219/src/com/coding/basic/ArrayList.java create mode 100644 group18/1159828430/20170219/src/com/coding/basic/Iterator.java create mode 100644 group18/1159828430/20170219/src/com/coding/basic/LinkedList.java create mode 100644 group18/1159828430/20170219/src/com/coding/basic/List.java create mode 100644 group18/1159828430/20170219/src/com/coding/basic/Queue.java create mode 100644 group18/1159828430/20170219/src/com/coding/basic/Stack.java create mode 100644 group18/1159828430/README.md create mode 100644 group18/1787597051/.classpath create mode 100644 group18/1787597051/.gitignore create mode 100644 group18/1787597051/.project create mode 100644 group18/1787597051/.settings/org.eclipse.jdt.core.prefs create mode 100644 group18/1787597051/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group18/1787597051/src/com/coding/basic/MyArrayList.java create mode 100644 group18/1787597051/src/com/coding/basic/MyIterator.java create mode 100644 group18/1787597051/src/com/coding/basic/MyLinkedList.java create mode 100644 group18/1787597051/src/com/coding/basic/MyList.java create mode 100644 group18/1787597051/src/com/coding/basic/MyQueue.java create mode 100644 group18/1787597051/src/com/coding/basic/MyStack.java create mode 100644 group18/542330964/.classpath create mode 100644 group18/542330964/.gitignore create mode 100644 group18/542330964/.project create mode 100644 group18/542330964/src/basicstruct/ArrayList.java create mode 100644 group18/542330964/src/basicstruct/BinaryTreeNode.java create mode 100644 group18/542330964/src/basicstruct/Iterator.java create mode 100644 group18/542330964/src/basicstruct/LinkedList.java create mode 100644 group18/542330964/src/basicstruct/List.java create mode 100644 group18/542330964/src/basicstruct/Queue.java create mode 100644 group18/542330964/src/basicstruct/Stack.java create mode 100644 group18/542330964/src/junittest/ArraylistTest.java create mode 100644 group18/542330964/src/junittest/LinkedListTest.java create mode 100644 group18/542330964/src/junittest/QueueTest.java create mode 100644 group18/542330964/src/junittest/StackTest.java create mode 100644 group18/564673292/com/coding/basic/ArrayList.java create mode 100644 group18/564673292/com/coding/basic/BinaryTreeNode.java create mode 100644 group18/564673292/com/coding/basic/Iterable.java create mode 100644 group18/564673292/com/coding/basic/Iterator.java create mode 100644 group18/564673292/com/coding/basic/LinkedList.java create mode 100644 group18/564673292/com/coding/basic/List.java create mode 100644 group18/564673292/com/coding/basic/Queue.java create mode 100644 group18/564673292/com/coding/basic/Stack.java create mode 100644 group18/744888802/dataStructure/pom.xml create mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/ArrayList.java create mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/BinaryTreeNode.java create mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/Iterator.java create mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/LinkedList.java create mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/List.java create mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/Queue.java create mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/Stack.java create mode 100644 group18/744888802/dataStructure/src/main/java/com/coding/basic/TestMain.java create mode 100644 group18/784140710/week01/.gitignore create mode 100644 group18/784140710/week01/src/com/coding/basic/ArrayIterator.java create mode 100644 group18/784140710/week01/src/com/coding/basic/ArrayList.java create mode 100644 group18/784140710/week01/src/com/coding/basic/BinaryTree.java create mode 100644 group18/784140710/week01/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group18/784140710/week01/src/com/coding/basic/Iterator.java create mode 100644 group18/784140710/week01/src/com/coding/basic/LinkedList.java create mode 100644 group18/784140710/week01/src/com/coding/basic/List.java create mode 100644 group18/784140710/week01/src/com/coding/basic/Queue.java create mode 100644 group18/784140710/week01/src/com/coding/basic/Stack.java create mode 100644 group18/784140710/week01/src/com/coding/test/Test01.java create mode 100644 group18/784140710/week01/src/com/coding/test/TestBinaryTree.java create mode 100644 "group18/935542673/Blog/CPU\357\274\214\345\206\205\345\255\230\357\274\214\347\241\254\347\233\230\357\274\214\346\214\207\344\273\244\344\273\245\345\217\212\345\256\203\344\273\254\344\271\213\351\227\264\347\232\204\345\205\263\347\263\273.md" create mode 100644 group18/935542673/Blog/README.md create mode 100644 group18/935542673/Coding/20170219/.classpath create mode 100644 group18/935542673/Coding/20170219/.gitignore create mode 100644 group18/935542673/Coding/20170219/.project create mode 100644 group18/935542673/Coding/20170219/README.md create mode 100644 group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyArrayListTest.java create mode 100644 group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyBinarySearchTreeTest.java create mode 100644 group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyLinkedListTest.java create mode 100644 group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyQueueTest.java create mode 100644 group18/935542673/Coding/20170219/junit/com/ikook/basic_data_structure/MyStackTest.java create mode 100644 group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyArrayList.java create mode 100644 group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyBinarySearchTree.java create mode 100644 group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyIterator.java create mode 100644 group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyLinkedList.java create mode 100644 group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyList.java create mode 100644 group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyQueue.java create mode 100644 group18/935542673/Coding/20170219/src/com/ikook/basic_data_structure/MyStack.java create mode 100644 group18/935542673/Coding/README.md create mode 100644 "group18/935542673/Datum/\345\205\263\344\272\216 .metadata \347\233\256\345\275\225\345\222\214 .gitignore \344\275\277\347\224\250\347\232\204\351\227\256\351\242\230.docx" create mode 100644 group18/935542673/README.md create mode 100644 group18/group18.md create mode 100644 group19/1294642551/.gitignore create mode 100644 group19/1294642551/readme.txt create mode 100644 group19/1294642551/src/arrayTests/ArrayUtil.java create mode 100644 group19/1294642551/src/data_Structures/ArrayList.java create mode 100644 group19/1294642551/src/data_Structures/LinkedList.java create mode 100644 group19/1294642551/src/data_Structures/List.java create mode 100644 group19/1294642551/src/data_Structures/Queue.java create mode 100644 group19/1294642551/src/data_Structures/Stack.java create mode 100644 group19/1294642551/src/struts_Reflect/Struts.java create mode 100644 group19/1294642551/test/arrayTests/ArrayUtilTest.java create mode 100644 group19/1592562638/.gitignore create mode 100644 group19/1592562638/src/ArrayList_self.java create mode 100644 group19/1592562638/src/BinaryTreeNode_self.java create mode 100644 group19/1592562638/src/CollectionTest.java create mode 100644 group19/1592562638/src/KIList.java create mode 100644 group19/1592562638/src/LinkedList_self.java create mode 100644 group19/1592562638/src/Name.java create mode 100644 group19/1592562638/src/Queue_self.java create mode 100644 group19/1592562638/src/Stack_self.java create mode 100644 group19/1592562638/src/com/coderising/action/LoginAction.java create mode 100644 group19/1592562638/src/com/coderising/action/LogoutAction.java create mode 100644 group19/1592562638/src/com/coderising/action/TestMain.java create mode 100644 group19/1592562638/src/com/coderising/action/View.java create mode 100644 group19/1592562638/src/com/coderising/action/struts.xml create mode 100644 "group19/1592562638/\350\257\273\344\271\246\347\254\224\350\256\260/1\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206/\350\257\273\344\271\246\347\254\224\350\256\260_\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206.pdf" create mode 100644 "group19/1592562638/\350\257\273\344\271\246\347\254\224\350\256\260/2\347\216\260\344\273\243\346\223\215\344\275\234\347\263\273\347\273\237[\350\275\254]/\350\257\273\344\271\246\347\254\224\350\256\260_\347\216\260\344\273\243\346\223\215\344\275\234\347\263\273\347\273\237.pdf" create mode 100644 group19/2558178127/.gitignore create mode 100644 group19/2558178127/src/com/cn/kevin/Test.java create mode 100644 group19/2558178127/src/com/coderising/action/LoginAction.java create mode 100644 group19/2558178127/src/com/coderising/array/ArrayUtil.java create mode 100644 group19/2558178127/src/com/coderising/litestruts/Struts.java create mode 100644 group19/2558178127/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group19/2558178127/src/com/coderising/litestruts/View.java create mode 100644 group19/2558178127/src/com/coderising/litestruts/struts.xml create mode 100644 group19/2558178127/src/com/coderising/litestruts/xml/read/XmlService.java create mode 100644 group19/2558178127/src/com/coding/basic/ArrayList.java create mode 100644 group19/2558178127/src/com/coding/basic/Iterator.java create mode 100644 group19/2558178127/src/com/coding/basic/LinkedList.java create mode 100644 group19/2558178127/src/com/coding/basic/List.java create mode 100644 group19/2558178127/src/com/coding/basic/Queue.java create mode 100644 group19/2558178127/src/com/coding/basic/Stack.java create mode 100644 group19/376248270/0-20170215-20170226/README.md create mode 100644 group19/376248270/0-20170215-20170226/arraylist/ArrayList.java create mode 100644 group19/376248270/0-20170215-20170226/arraylist/ArrayListTest.java create mode 100644 group19/376248270/0-20170215-20170226/base/List.java create mode 100644 group19/376248270/0-20170215-20170226/linkedlist/LinkedList.java create mode 100644 group19/376248270/1-20170226-20170305/README.md create mode 100644 group19/376248270/1-20170226-20170305/array/ArrayUtil.java create mode 100644 group19/376248270/1-20170226-20170305/com/coderising/action/LoginAction.java create mode 100644 group19/376248270/1-20170226-20170305/struts/Struts.java create mode 100644 group19/376248270/1-20170226-20170305/struts/StrutsTest.java create mode 100644 group19/376248270/1-20170226-20170305/struts/View.java create mode 100644 group19/376248270/1-20170226-20170305/struts/struts.xml create mode 100644 group19/376248270/README.md create mode 100644 group19/398129523/ArrayList create mode 100644 group19/398129523/LinkedList create mode 100644 group19/398129523/Queue create mode 100644 group19/398129523/Stack create mode 100644 group19/527220084/xukai_coding/.gitignore create mode 100644 group19/527220084/xukai_coding/coding-common/pom.xml create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/array/ArrayUtil.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Action.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/BusinessException.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LoginAction.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/LogoutAction.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/Struts.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/StrutsTest.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/litestruts/View.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/ReflectUtil.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/util/XmlParseHelper.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/ArrayList.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/BinaryTreeNode.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Iterator.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/LinkedList.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/List.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Queue.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/common/Stack.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/resources/struts.xml create mode 100644 group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/ArrayListTest.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/BinaryTreeNodeTest.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/LinkedListTest.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/QueueTest.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/test/java/org/xukai/common/StackTest.java create mode 100644 group19/527220084/xukai_coding/pom.xml create mode 100644 "group19/604322962/cpu\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.txt" create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/List.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/Queue.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/basic/Stack.java create mode 100644 group19/709960951/CodeLearning/src/com/coderising/array/ArrayUtil.java create mode 100644 group19/709960951/CodeLearning/src/com/coderising/litestruts/LoginAction.java create mode 100644 group19/709960951/CodeLearning/src/com/coderising/litestruts/StructsAction.java create mode 100644 group19/709960951/CodeLearning/src/com/coderising/litestruts/Struts.java create mode 100644 group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsManager.java create mode 100644 group19/709960951/CodeLearning/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group19/709960951/CodeLearning/src/com/coderising/litestruts/View.java create mode 100644 group19/709960951/CodeLearning/src/com/coderising/litestruts/struts.xml create mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/ArrayList.java create mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/Iterator.java create mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/LinkedList.java create mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/List.java create mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/Queue.java create mode 100644 group19/709960951/CodeLearning/src/com/coding/basic/Stack.java create mode 100644 group19/972815123/.classpath create mode 100644 group19/972815123/.project create mode 100644 group19/972815123/.settings/org.eclipse.jdt.core.prefs create mode 100644 group19/972815123/src/com/coderising/array/ArrayUtil.java create mode 100644 group19/972815123/src/com/coderising/litestruts/LoginAction.java create mode 100644 group19/972815123/src/com/coderising/litestruts/Main.java create mode 100644 group19/972815123/src/com/coderising/litestruts/Struts.java create mode 100644 group19/972815123/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group19/972815123/src/com/coderising/litestruts/View.java create mode 100644 group19/972815123/src/com/coderising/litestruts/struts.xml create mode 100644 group19/972815123/src/com/coding/basic/ArrayList.java create mode 100644 group19/972815123/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group19/972815123/src/com/coding/basic/Iterator.java create mode 100644 group19/972815123/src/com/coding/basic/LinkedList.java create mode 100644 group19/972815123/src/com/coding/basic/List.java create mode 100644 group19/972815123/src/com/coding/basic/MainTest.java create mode 100644 group19/972815123/src/com/coding/basic/Queue.java create mode 100644 group19/972815123/src/com/coding/basic/Stack.java create mode 100644 group19/972815123/test.txt create mode 100644 group19/976180558/.gitignore create mode 100644 group19/976180558/src/com/coding/basic/ArrayList.java create mode 100644 group19/976180558/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group19/976180558/src/com/coding/basic/Iterator.java create mode 100644 group19/976180558/src/com/coding/basic/LinkedList.java create mode 100644 group19/976180558/src/com/coding/basic/List.java create mode 100644 group19/976180558/src/com/coding/basic/Queue.java create mode 100644 group19/976180558/src/com/coding/basic/Stack.java create mode 100644 group19/group19.md create mode 100644 group20/.gitignore create mode 100644 group20/1040154728/1040154728Learning/src/ArrayList.java create mode 100644 group20/1040154728/1040154728Learning/src/BinaryTreeNode.java create mode 100644 group20/1040154728/1040154728Learning/src/Iterator.java create mode 100644 group20/1040154728/1040154728Learning/src/LinkedList.java create mode 100644 group20/1040154728/1040154728Learning/src/List.java create mode 100644 group20/1040154728/1040154728Learning/src/Queue.java create mode 100644 group20/1040154728/1040154728Learning/src/Stack.java create mode 100644 group20/1040154728/1040154728Learning/src/honoka.md create mode 100644 group20/1107837739/1107837739Learning/lib/dom4j-1.6.1.jar create mode 100644 group20/1107837739/1107837739Learning/lib/fastjson-1.2.7.jar create mode 100644 group20/1107837739/1107837739Learning/lib/hamcrest-core-1.3.jar create mode 100644 group20/1107837739/1107837739Learning/lib/junit-4.12.jar create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/Main.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtil.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/array/ArrayUtilTest.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/LoginAction.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/Struts.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/StrutsTest.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/View.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/dom/StrutsAction.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/StrutsParser.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coderising/litestruts/util/struts.xml create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KArrayList.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KIterator.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KLinkedList.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KList.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListIteratorTest.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/list/KListTest.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KArrayQueue.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueue.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/queue/KQueueTest.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStack.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/stack/KStackTest.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNode.java create mode 100644 group20/1107837739/1107837739Learning/src/org/korben/coding/basic/tree/BinaryTreeNodeTest.java create mode 100644 group20/1107837739/korben.md create mode 100644 group20/1430208241/1430208241leaning/src/GithubWork/ArrayList.java create mode 100644 group20/1430208241/1430208241leaning/src/GithubWork/JunitTest.java create mode 100644 group20/1430208241/1430208241leaning/src/GithubWork/LinkedList.java create mode 100644 group20/1430208241/1430208241leaning/src/GithubWork/List.java create mode 100644 group20/1430208241/1430208241leaning/src/GithubWork/Queue.java create mode 100644 group20/1430208241/1430208241leaning/src/GithubWork/Stack.java create mode 100644 "group20/1430208241/1430208241leaning/src/\346\226\207\347\253\240\345\234\260\345\235\200" create mode 100644 group20/2421586846/DS/src/basic/ArrayList.java create mode 100644 group20/2421586846/DS/src/basic/BinaryTreeNode.java create mode 100644 group20/2421586846/DS/src/basic/Iterator.java create mode 100644 group20/2421586846/DS/src/basic/LinkedList.java create mode 100644 group20/2421586846/DS/src/basic/List.java create mode 100644 group20/2421586846/DS/src/basic/Queue.java create mode 100644 group20/2421586846/DS/src/basic/Stack.java create mode 100644 group20/2421586846/DS/src/basic/Test.java create mode 100644 group20/286166752/src/tests/wiki/liven/code/dataStructures/ArrayListTest.java create mode 100644 group20/286166752/src/tests/wiki/liven/code/dataStructures/LinkedListTest.java create mode 100644 group20/286166752/src/tests/wiki/liven/code/dataStructures/QueueTest.java create mode 100644 group20/286166752/src/tests/wiki/liven/code/dataStructures/StackTest.java create mode 100644 group20/286166752/src/wiki/liven/code/dataStructures/ArrayList.java create mode 100644 group20/286166752/src/wiki/liven/code/dataStructures/LinkedList.java create mode 100644 group20/286166752/src/wiki/liven/code/dataStructures/List.java create mode 100644 group20/286166752/src/wiki/liven/code/dataStructures/Queue.java create mode 100644 group20/286166752/src/wiki/liven/code/dataStructures/Stack.java create mode 100644 group20/331798361/assignment1/src/com/coding/basic/ArrayList.java create mode 100644 group20/331798361/assignment1/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group20/331798361/assignment1/src/com/coding/basic/Iterator.java create mode 100644 group20/331798361/assignment1/src/com/coding/basic/LinkedList.java create mode 100644 group20/331798361/assignment1/src/com/coding/basic/List.java create mode 100644 group20/331798361/assignment1/src/com/coding/basic/Queue.java create mode 100644 group20/331798361/assignment1/src/com/coding/basic/Stack.java create mode 100644 group20/331798361/assignment2/src/array/ArrayUtil.java create mode 100644 group20/331798361/assignment2/src/litestruts/LoginAction.java create mode 100644 group20/331798361/assignment2/src/litestruts/Struts.java create mode 100644 group20/331798361/assignment2/src/litestruts/StrutsTest.java create mode 100644 group20/331798361/assignment2/src/litestruts/View.java create mode 100644 group20/331798361/assignment2/src/litestruts/struts.xml create mode 100644 group20/404130810/src/com/basic/datastructure/ArrayList.java create mode 100644 group20/404130810/src/com/basic/datastructure/LinkedList.java create mode 100644 group20/404130810/src/com/basic/datastructure/List.java create mode 100644 group20/404130810/src/com/basic/datastructure/Queue.java create mode 100644 group20/404130810/src/com/basic/datastructure/Stack.java create mode 100644 group20/404130810/src/com/basic/practice/PolymorphicInJava.java create mode 100644 group20/404130810/src/com/basic/practice/ValuePassInJava.java create mode 100644 group20/404130810/src/com/coderising/array/ArrayUtil.java create mode 100644 group20/404130810/src/com/coderising/litestruts/Struts.java create mode 100644 group20/404130810/src/com/coderising/litestruts/action/LoginAction.java create mode 100644 group20/404130810/src/com/coderising/litestruts/struts.xml create mode 100644 group20/404130810/src/com/coderising/litestruts/test/StrutsTest.java create mode 100644 group20/404130810/src/com/coderising/litestruts/utils/StrutsUtil.java create mode 100644 group20/404130810/src/com/coderising/litestruts/view/View.java create mode 100644 "group20/423184723/Test/\345\215\232\345\256\242\345\234\260\345\235\200" create mode 100644 group20/423184723/src/basic/ArrayList.java create mode 100644 group20/423184723/src/basic/BinaryTreeNode.java create mode 100644 group20/423184723/src/basic/Iterator.java create mode 100644 group20/423184723/src/basic/LinkedList.java create mode 100644 group20/423184723/src/basic/List.java create mode 100644 group20/423184723/src/basic/Queue.java create mode 100644 group20/423184723/src/basic/Stack.java create mode 100644 group20/452472201/.gitignore create mode 100644 group20/452472201/src/com/coding/basic/ArrayList.java create mode 100644 group20/452472201/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group20/452472201/src/com/coding/basic/Iterator.java create mode 100644 group20/452472201/src/com/coding/basic/LinkedList.java create mode 100644 group20/452472201/src/com/coding/basic/List.java create mode 100644 group20/452472201/src/com/coding/basic/Queue.java create mode 100644 group20/452472201/src/com/coding/basic/Stack.java create mode 100644 "group20/452472201/src/com/coding/basic/\345\215\232\345\256\242\351\223\276\346\216\245.txt" create mode 100644 group20/592146505/coderising/src/org/wsc/array/ArrayUtil.java create mode 100644 group20/592146505/coderising/src/org/wsc/array/ArrayUtilTest.java create mode 100644 group20/592146505/coderising/src/org/wsc/litestruts/Action.java create mode 100644 group20/592146505/coderising/src/org/wsc/litestruts/LoginAction.java create mode 100644 group20/592146505/coderising/src/org/wsc/litestruts/Struts.java create mode 100644 group20/592146505/coderising/src/org/wsc/litestruts/StrutsTest.java create mode 100644 group20/592146505/coderising/src/org/wsc/litestruts/View.java create mode 100644 group20/592146505/coderising/src/org/wsc/litestruts/util/DocumentUtil.java create mode 100644 group20/592146505/coderising/src/struts.xml create mode 100644 group20/592146505/data _structure/src/org/wsc/exception/NullElementException.java create mode 100644 group20/592146505/data _structure/src/org/wsc/exception/RepeatingElementException.java create mode 100644 group20/592146505/data _structure/src/org/wsc/list/ArrayList.java create mode 100644 group20/592146505/data _structure/src/org/wsc/list/Iterator.java create mode 100644 group20/592146505/data _structure/src/org/wsc/list/LinkedList.java create mode 100644 group20/592146505/data _structure/src/org/wsc/list/List.java create mode 100644 group20/592146505/data _structure/src/org/wsc/list/Queue.java create mode 100644 group20/592146505/data _structure/src/org/wsc/stack/Stack.java create mode 100644 group20/592146505/data _structure/src/org/wsc/tree_node/BinaryTreeNode.java create mode 100644 "group20/755659358/blogs/blog\345\234\260\345\235\200.txt" create mode 100644 "group20/755659358/blogs/\350\256\241\347\256\227\346\234\272\351\203\250\344\273\266\347\220\206\350\247\243.txt" create mode 100644 group20/755659358/week01/src/liuxincourse/ArrayList.java create mode 100644 group20/755659358/week01/src/liuxincourse/LinkedList.java create mode 100644 group20/755659358/week01/src/liuxincourse/List.java create mode 100644 group20/755659358/week01/src/liuxincourse/Queue.java create mode 100644 group20/755659358/week01/src/liuxincourse/Stack.java create mode 100644 group20/755659358/week01/test/liuxincourse/ArrayListTest.java create mode 100644 group20/755659358/week01/test/liuxincourse/LinkedListTest.java create mode 100644 group20/755659358/week01/test/liuxincourse/QueueTest.java create mode 100644 group20/755659358/week01/test/liuxincourse/StackTest.java create mode 100644 group20/755659358/week01/test/liuxincourse/SuiteTest.java create mode 100644 group20/755659358/week02/src/com/coderising/practice/array/ArrayUtil.java create mode 100644 group20/755659358/week02/src/com/coderising/practice/array/ArrayUtisTest.java create mode 100644 group20/755659358/week02/src/com/coderising/practice/litestruts/LoginAction.java create mode 100644 group20/755659358/week02/src/com/coderising/practice/litestruts/Struts.java create mode 100644 group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsHandler.java create mode 100644 group20/755659358/week02/src/com/coderising/practice/litestruts/StrutsTest.java create mode 100644 group20/755659358/week02/src/com/coderising/practice/litestruts/View.java create mode 100644 group20/755659358/week02/src/com/coderising/practice/litestruts/struts.xml create mode 100644 group20/872045674/20170226/src/com/coding/basic/ArrayList.java create mode 100644 group20/872045674/20170226/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group20/872045674/20170226/src/com/coding/basic/Iterator.java create mode 100644 group20/872045674/20170226/src/com/coding/basic/LinkedList.java create mode 100644 group20/872045674/20170226/src/com/coding/basic/List.java create mode 100644 group20/872045674/20170226/src/com/coding/basic/Queue.java create mode 100644 group20/872045674/20170226/src/com/coding/basic/Stack.java create mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyArrayList.java" create mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyIterator.java" create mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyList.java" create mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyQueue.java" create mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyStack.java" create mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MyTreeNode.java" create mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/SingleLinkedList.java" create mode 100644 "group20/925290009/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240\345\234\260\345\235\200" create mode 100644 "group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtil.java" create mode 100644 "group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/PracticeOfData/ArrayUtilTest.java" create mode 100644 "group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/LoginAction.java" create mode 100644 "group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/ReadXml.java" create mode 100644 "group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/Struts.java" create mode 100644 "group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/StrutsTest.java" create mode 100644 "group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/Struts/View.java" create mode 100644 "group20/925290009/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/\346\226\207\347\253\240.txt" create mode 100644 group20/group20.md create mode 100644 group21/group21.md create mode 100644 group22/group22.md create mode 100644 group23/group23.md create mode 100644 group24/group24.md create mode 100644 group25/group25.md create mode 100644 group26/group26.md create mode 100644 group27/group27.md create mode 100644 liuxin/src/com/coderising/array/ArrayUtil.java create mode 100644 liuxin/src/com/coderising/download/DownloadThread.java create mode 100644 liuxin/src/com/coderising/download/FileDownloader.java create mode 100644 liuxin/src/com/coderising/download/FileDownloaderTest.java create mode 100644 liuxin/src/com/coderising/download/api/Connection.java create mode 100644 liuxin/src/com/coderising/download/api/ConnectionException.java create mode 100644 liuxin/src/com/coderising/download/api/ConnectionManager.java create mode 100644 liuxin/src/com/coderising/download/api/DownloadListener.java create mode 100644 liuxin/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 liuxin/src/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/README.md b/README.md new file mode 100644 index 0000000000..a7d23c04cf --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +## 2017编程提高社群 + +2017编程提高社群代码仓库所在地 \ No newline at end of file diff --git a/group01/1298552064/.classpath b/group01/1298552064/.classpath new file mode 100644 index 0000000000..05cf0dba9e --- /dev/null +++ b/group01/1298552064/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group01/1298552064/.gitignore b/group01/1298552064/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group01/1298552064/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group01/1298552064/.project b/group01/1298552064/.project new file mode 100644 index 0000000000..ddbb7719d0 --- /dev/null +++ b/group01/1298552064/.project @@ -0,0 +1,17 @@ + + + 1298552064Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group01/1298552064/src/week01/basic/Iterator.java b/group01/1298552064/src/week01/basic/Iterator.java new file mode 100644 index 0000000000..e209875b54 --- /dev/null +++ b/group01/1298552064/src/week01/basic/Iterator.java @@ -0,0 +1,8 @@ +package week01.basic; + +public interface Iterator { + public boolean hasNext(); + + public Object next(); + +} diff --git a/group01/1298552064/src/week01/basic/List.java b/group01/1298552064/src/week01/basic/List.java new file mode 100644 index 0000000000..608c1b532b --- /dev/null +++ b/group01/1298552064/src/week01/basic/List.java @@ -0,0 +1,13 @@ +package week01.basic; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group01/1298552064/src/week01/basic/MyArrayList.java b/group01/1298552064/src/week01/basic/MyArrayList.java new file mode 100644 index 0000000000..c4f6572f1c --- /dev/null +++ b/group01/1298552064/src/week01/basic/MyArrayList.java @@ -0,0 +1,131 @@ +package week01.basic; + +import java.util.Arrays; + +public class MyArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + ensureCapacity(size + 1); + + elementData[size++] = o; + } + + public void add(int index, Object o) { + checkPositionIndex(index); + ensureCapacity(size + 1); + + if (index >= size) { + elementData[size++] = o; + } else { + System.arraycopy(elementData, index, elementData, index + 1, size + - index); + + elementData[index] = o; + + size++; + } + } + + public Object get(int index) { + checkElementIndex(index); + return elementData[index]; + } + + public Object remove(int index) { + checkElementIndex(index); + Object removeElement = elementData[index]; + if (index == (size - 1)) { + elementData[index] = null; + size--; + } else { + System.arraycopy(elementData, index + 1, elementData, index, size + - index - 1); + elementData[size - 1] = null; + size--; + } + return removeElement; + } + + public int size() { + return size; + } + + /** + * 保证数组空间充足 + * + * @param minCapacity + */ + private void ensureCapacity(int minCapacity) { + int capacity = elementData.length; + if (minCapacity > capacity) { + capacity += capacity / 2; + grow(capacity); + } + } + + private void checkElementIndex(int index) { + if (!isElementIndex(index)) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + } + } + + private boolean isElementIndex(int index) { + return index >= 0 && index < size; + } + + private void checkPositionIndex(int index) { + if (!isPositionIndex(index)) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + } + } + + private boolean isPositionIndex(int index) { + return index >= 0 && index <= size; + } + + private void grow(int newCapacity) { + elementData = Arrays.copyOf(elementData, newCapacity); + } + + public Iterator iterator() { + return new ArrayListIterator(this); + } + + private class ArrayListIterator implements Iterator { + private MyArrayList list; + private int position = 0; + + private ArrayListIterator(MyArrayList list) { + this.list = list; + } + + @Override + public boolean hasNext() { + if ((position + 1) > size) { + return false; + } + return true; + } + + @Override + public Object next() { + return list.get(position++); + } + } + + @Override + public String toString() { + String elementStr = ""; + for (int i = 0; i < size; i++) { + elementStr += elementData[i] + ","; + } + return "MyArrayList: { size=" + size + ", elementData=" + "[" + + elementStr.substring(0, elementStr.length() - 1) + "]" + " }"; + } +} diff --git a/group01/1298552064/src/week01/basic/MyBinaryTreeNode.java b/group01/1298552064/src/week01/basic/MyBinaryTreeNode.java new file mode 100644 index 0000000000..30e6c810a5 --- /dev/null +++ b/group01/1298552064/src/week01/basic/MyBinaryTreeNode.java @@ -0,0 +1,70 @@ +package week01.basic; + +public class MyBinaryTreeNode { + + private Object data; + private MyBinaryTreeNode left; + private MyBinaryTreeNode right; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public MyBinaryTreeNode getLeft() { + return left; + } + + public void setLeft(MyBinaryTreeNode left) { + this.left = left; + } + + public MyBinaryTreeNode getRight() { + return right; + } + + public void setRight(MyBinaryTreeNode right) { + this.right = right; + } + + public MyBinaryTreeNode insert(Object o) { + if(this.getData() == null && this.getLeft() == null && this.getRight() == null){ + this.setData(o); + this.setLeft(null); + this.setRight(null); + return this; + } + + MyBinaryTreeNode node = new MyBinaryTreeNode(); + MyBinaryTreeNode currentNode = this; + while(true){ + if((Integer) o < (Integer) getData()){ + if(currentNode.getLeft() == null){ + node.setData(o); + node.setLeft(null); + node.setRight(null); + + currentNode.setLeft(node); + return this; + }else{ + currentNode = currentNode.getLeft(); + } + + }else{ + if(currentNode.getRight() == null){ + node.setData(o); + node.setLeft(null); + node.setRight(null); + + currentNode.setRight(node); + return this; + }else{ + currentNode = currentNode.getRight(); + } + } + } + } +} diff --git a/group01/1298552064/src/week01/basic/MyLinkedList.java b/group01/1298552064/src/week01/basic/MyLinkedList.java new file mode 100644 index 0000000000..88db213864 --- /dev/null +++ b/group01/1298552064/src/week01/basic/MyLinkedList.java @@ -0,0 +1,215 @@ +package week01.basic; + +public class MyLinkedList implements List { + + private Node head; + private int size; + + public void add(Object o) { + // 空链表 + if (head == null) { + head = new Node(); + head.data = o; + head.next = null; + } else { + Node p = head; + while (p.next != null) { + p = p.next; + } + + Node target = new Node(); + target.data = o; + target.next = null; + p.next = target; + } + size++; + } + + public void add(int index, Object o) { + // index 是否合法 + checkPositionIndex(index); + if (head == null) { + head = new Node(); + head.data = o; + head.next = null; + } else { + if (index == 0) { + addFirst(o); + } else if (index == size) { + addLast(o); + } else { + Node p = new Node(); + Node p1 = head; + for (int i = 0; i < index - 1; i++) { + p1 = p1.next; + } + p.data = o; + p.next = p1.next; + p1.next = p; + + size++; + } + } + } + + public Object get(int index) { + checkElementIndex(index); + Node p = head; + for (int i = 0; i < index; i++) { + p = p.next; + } + return p.data; + } + + public Object remove(int index) { + checkElementRemove(); + checkElementIndex(index); + + Object removeObject = null; + if (index == 0) { + removeObject = removeFirst(); + } else if (index == (size - 1)) { + removeObject = removeLast(); + } else { + Node p = head; + for (int i = 1; i < index; i++) { + p = p.next; + } + removeObject = p.next.data; + p.next = p.next.next; + size--; + } + return removeObject; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + if (head == null) { + head = new Node(); + head.data = o; + head.next = null; + } else { + Node p = new Node(); + p.data = o; + p.next = head; + head = p; + } + size++; + } + + public void addLast(Object o) { + add(o); + } + + public Object removeFirst() { + checkElementRemove(); + Object removeObject = head.data; + head = head.next; + size--; + return removeObject; + } + + public Object removeLast() { + checkElementRemove(); + + Object removeObject = null; + + if (size == 1) { + removeObject = head.data; + head = head.next; + } else { + Node p = head; + for (int i = 0; i < size; i++) { + if (p.next.next == null) { + removeObject = p.next.data; + p.next = null; + break; + } else { + p = p.next; + } + } + } + size--; + return removeObject; + } + + private boolean isEmpty() { + return size == 0; + } + + private void checkElementRemove() { + if (isEmpty()) { + throw new NullPointerException("The list is empty."); + } + } + + private void checkElementIndex(int index) { + if (!isElementIndex(index)) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + } + } + + private boolean isElementIndex(int index) { + return index >= 0 && index < size; + } + + private void checkPositionIndex(int index) { + if (!isPositionIndex(index)) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + } + } + + private boolean isPositionIndex(int index) { + return index >= 0 && index <= size; + } + + public Iterator iterator() { + return new MyLinkedListIterator(this); + } + + private class MyLinkedListIterator implements Iterator { + private MyLinkedList list = null; + private int position = 0; + + private MyLinkedListIterator(MyLinkedList list) { + this.list = list; + } + + @Override + public boolean hasNext() { + if ((position + 1) > size()) { + return false; + } + return true; + } + + @Override + public Object next() { + return list.get(position++); + } + } + + private static class Node { + Object data; + Node next; + } + + @Override + public String toString() { + String elementStr = ""; + Node p = head; + while (p != null) { + elementStr += p.data + ","; + p = p.next; + } + + return "MyLinkedList: { size=" + size + ", elementData=" + "[" + + elementStr.substring(0, elementStr.length() - 1) + "]" + " }"; + } + +} diff --git a/group01/1298552064/src/week01/basic/MyQueue.java b/group01/1298552064/src/week01/basic/MyQueue.java new file mode 100644 index 0000000000..54008652ff --- /dev/null +++ b/group01/1298552064/src/week01/basic/MyQueue.java @@ -0,0 +1,22 @@ +package week01.basic; + +public class MyQueue { + + private MyLinkedList elementData = new MyLinkedList(); + + public void enQueue(Object o) { + elementData.add(o); + } + + public Object deQueue() { + return elementData.removeFirst(); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group01/1298552064/src/week01/basic/MyStack.java b/group01/1298552064/src/week01/basic/MyStack.java new file mode 100644 index 0000000000..aea4d94e24 --- /dev/null +++ b/group01/1298552064/src/week01/basic/MyStack.java @@ -0,0 +1,25 @@ +package week01.basic; + +public class MyStack { + private MyArrayList elementData = new MyArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + return elementData.remove(size() - 1); + } + + public Object peek() { + return elementData.get(size() - 1); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group01/1298552064/src/week01/test/MyArrayListTest.java b/group01/1298552064/src/week01/test/MyArrayListTest.java new file mode 100644 index 0000000000..219035b46f --- /dev/null +++ b/group01/1298552064/src/week01/test/MyArrayListTest.java @@ -0,0 +1,53 @@ +package week01.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week01.basic.MyArrayList; + + + +public class MyArrayListTest { + + private MyArrayList list = null; + + @Before + public void setUp() throws Exception { + list = new MyArrayList(); + + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + } + + @After + public void tearDown() throws Exception { + list = null; + } + + @Test + public void testAdd(){ + list.add(4, 10); + Assert.assertEquals("MyArrayList: { size=6, elementData=[1,2,3,4,10,5] }", list.toString()); + } + + @Test + public void testGet(){ + Assert.assertEquals((Object)new Integer(3), list.get(2)); + } + + @Test + public void testRemove(){ + list.remove(2); + Assert.assertEquals("MyArrayList: { size=4, elementData=[1,2,4,5] }", list.toString()); + } + + @Test + public void testSize(){ + Assert.assertEquals((Object)new Integer(5), list.size()); + } +} diff --git a/group01/1298552064/src/week01/test/MyLinkedListTest.java b/group01/1298552064/src/week01/test/MyLinkedListTest.java new file mode 100644 index 0000000000..b5d6c048d6 --- /dev/null +++ b/group01/1298552064/src/week01/test/MyLinkedListTest.java @@ -0,0 +1,78 @@ +package week01.test; + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week01.basic.MyLinkedList; + +public class MyLinkedListTest { + + private MyLinkedList list = null; + + @Before + public void setUp() throws Exception { + list = new MyLinkedList(); + + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + } + + @After + public void tearDown() throws Exception { + list = null; + } + + + @Test + public void testAdd(){ + list.add(3,10); + Assert.assertEquals("MyLinkedList: { size=6, elementData=[1,2,3,10,4,5] }",list.toString()); + } + + @Test + public void testAddFirst(){ + list.addFirst(100); + Assert.assertEquals("MyLinkedList: { size=6, elementData=[100,1,2,3,4,5] }",list.toString()); + } + + @Test + public void testAddLast(){ + list.addLast(100); + Assert.assertEquals("MyLinkedList: { size=6, elementData=[1,2,3,4,5,100] }",list.toString()); + } + + @Test + public void testGet(){ + Assert.assertEquals((Object)new Integer(5), list.get(4)); + } + + @Test + public void testRemove(){ + list.remove(3); + Assert.assertEquals("MyLinkedList: { size=4, elementData=[1,2,3,5] }",list.toString()); + } + + @Test + public void testRemoveFirst(){ + list.removeFirst(); + Assert.assertEquals("MyLinkedList: { size=4, elementData=[2,3,4,5] }",list.toString()); + } + + @Test + public void testRemoveLast(){ + list.removeLast(); + Assert.assertEquals("MyLinkedList: { size=4, elementData=[1,2,3,4] }",list.toString()); + } + + @Test + public void testSize(){ + Assert.assertEquals((Object)new Integer(5), list.size()); + } + +} diff --git a/group01/1298552064/src/week01/test/MyQueueTest.java b/group01/1298552064/src/week01/test/MyQueueTest.java new file mode 100644 index 0000000000..f9b7cb63f2 --- /dev/null +++ b/group01/1298552064/src/week01/test/MyQueueTest.java @@ -0,0 +1,48 @@ +package week01.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week01.basic.MyQueue; + +public class MyQueueTest { + + private MyQueue queue = null; + + @Before + public void setUp() throws Exception { + queue = new MyQueue(); + + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + } + + @After + public void tearDown() throws Exception { + queue = null; + } + + @Test + public void testEnQueue(){ + queue.enQueue(4); + Assert.assertEquals((Object)new Integer(4), queue.size()); + } + + @Test + public void testDeQueue(){ + Assert.assertEquals((Object) new Integer(1), queue.deQueue()); + } + + @Test + public void testIsEmpty(){ + Assert.assertFalse(queue.isEmpty()); + } + + @Test + public void testSize(){ + Assert.assertEquals((Object)new Integer(3), queue.size()); + } +} diff --git a/group01/1298552064/src/week01/test/MyStackTest.java b/group01/1298552064/src/week01/test/MyStackTest.java new file mode 100644 index 0000000000..4efbc2b204 --- /dev/null +++ b/group01/1298552064/src/week01/test/MyStackTest.java @@ -0,0 +1,53 @@ +package week01.test; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week01.basic.MyStack; + +public class MyStackTest { + private MyStack stack = null; + + @Before + public void setUp() throws Exception { + stack = new MyStack(); + + stack.push(1); + stack.push(2); + stack.push(3); + } + + @After + public void tearDown() throws Exception { + stack = null; + } + + @Test + public void tearPush() throws Exception { + stack.push(10); + Assert.assertEquals((Object) new Integer(4), stack.size()); + Assert.assertEquals((Object) new Integer(10), stack.peek()); + } + + @Test + public void testPop(){ + Assert.assertEquals((Object) new Integer(3), stack.pop()); + Assert.assertEquals((Object) new Integer(2), stack.size()); + } + + @Test + public void testPeek(){ + Assert.assertEquals((Object) new Integer(3), stack.peek()); + } + + @Test + public void testIsEmpty(){ + Assert.assertFalse(stack.isEmpty()); + } + + @Test + public void testSize(){ + Assert.assertEquals((Object) new Integer(3), stack.size()); + } +} diff --git a/group01/1298552064/src/week02/array/ArrayUtil.java b/group01/1298552064/src/week02/array/ArrayUtil.java new file mode 100644 index 0000000000..9b6c0bebaf --- /dev/null +++ b/group01/1298552064/src/week02/array/ArrayUtil.java @@ -0,0 +1,245 @@ +package week02.array; + +import java.util.Arrays; + +public class ArrayUtil { + + // 工具类,不予许创建实例 + private ArrayUtil() { + } + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static void reverseArray(int[] origin) { + if (origin != null && origin.length > 0) { + int temp = 0; + + // 数组首尾元素置换 + for (int i = 0; i < origin.length / 2; i++) { + temp = origin[i]; + origin[i] = origin[origin.length - i - 1]; + origin[origin.length - i - 1] = temp; + } + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + int[] newArray = null; + if (oldArray != null) { + newArray = new int[oldArray.length]; + int size = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[size] = oldArray[i]; + size++; + } + } + newArray = Arrays.copyOf(newArray, size); + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2) { + int[] newArray = null; + if (array1 != null && array2 != null) { + int size = 0; + + // index1、index2表示array1和array2数组的比较索引 + int index1 = 0, index2 = 0; + newArray = new int[array1.length + array2.length]; + + while (index1 < array1.length && index2 < array2.length) { + if (array1[index1] == array2[index2]) { + newArray[size++] = array1[index1]; + index1++; + index2++; + } else if (array1[index1] < array2[index2]) { + // 数组array1去重 + if (size > 0 && array1[index1] == newArray[size - 1]) { + size--; + } + newArray[size++] = array1[index1]; + index1++; + } else { + // 数组array2去重 + if (size > 0 && array2[index2] == newArray[size - 1]) { + size--; + } + newArray[size++] = array2[index2]; + index2++; + } + } + + // 将数组array1剩下的元素放入 + while (index1 < array1.length) { + newArray[size++] = array1[index1++]; + } + + // 将数组array2剩下的元素放入 + while (index2 < array2.length) { + newArray[size++] = array2[index2++]; + } + + // 合并后有序数组 + newArray = Arrays.copyOf(newArray, size); + } + return newArray; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + int[] newArray = null; + if (oldArray != null) { + newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + + // 计算方法:f(n) = f(n-1) + f(n-2) 采用数组计算 + int[] result = null; + if (max <= 1) { + result = new int[] {}; + } else { + int i = 2; + result = new int[max]; + result[0] = result[1] = 1; + for (; i < max; i++) { + if (result[i - 1] + result[i - 2] < max) { + result[i] = result[i - 1] + result[i - 2]; + } else { + break; + } + } + result = Arrays.copyOf(result, i); + } + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + int[] newArray = new int[] {}; + if (max > 2) { + newArray = new int[max]; + int size = 0, j = 0; + for (int i = 2; i < max; i++) { + for (j = 2; j < i / 2 + 1; j++) { + if (i % j == 0) { + break; + } + } + + if (j == i / 2 + 1) { + newArray[size++] = i; + } + } + newArray = Arrays.copyOf(newArray, size); + } + return newArray; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + int[] newArray = new int[] {}; + if (max > 0) { + newArray = new int[max]; + int size = 0, sum = 0; + for (int i = 1; i < max; i++) { + sum = 0; + for (int j = 1; j < i / 2 + 1; j++) { + if (i % j == 0) { + sum += j; + } + } + if (i == sum) { + newArray[size++] = i; + } + } + newArray = Arrays.copyOf(newArray, size); + } + return newArray; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public static String join(int[] array, String seperator) { + String joinResult = null; + if (array != null) { + joinResult = ""; + for (int i = 0; i < array.length; i++) { + joinResult += array[i] + seperator; + } + joinResult = joinResult.equals("") ? "" : joinResult.substring(0, joinResult.length() - 1); + } + return joinResult; + } + + public static void main(String[] args) { + int[] a = new ArrayUtil().getPerfectNumbers(1000); + for (int i = 0; i < a.length; i++) { + System.out.println(a[i]); + } + + // [2,3,5,7,11,13,17,19] + a = new ArrayUtil().getPrimes(20); + for (int i = 0; i < a.length; i++) { + System.out.println(a[i]); + } + } +} diff --git a/group01/1298552064/src/week02/litestruts/LoginAction.java b/group01/1298552064/src/week02/litestruts/LoginAction.java new file mode 100644 index 0000000000..aec243dd1b --- /dev/null +++ b/group01/1298552064/src/week02/litestruts/LoginAction.java @@ -0,0 +1,42 @@ +package week02.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group01/1298552064/src/week02/litestruts/Struts.java b/group01/1298552064/src/week02/litestruts/Struts.java new file mode 100644 index 0000000000..3cef26c396 --- /dev/null +++ b/group01/1298552064/src/week02/litestruts/Struts.java @@ -0,0 +1,106 @@ +package week02.litestruts; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + * + */ + + try { + + // 0. 读取配置文件struts.xml + SAXReader reader = new SAXReader(); + InputStream in = Struts.class.getResourceAsStream("struts.xml"); + Document document = reader.read(in); + Element root = document.getRootElement(); + + // 与actionName匹配的Element + Element actionElement = null; + String className = null; + + for (Iterator iterator = root.elementIterator("action"); iterator.hasNext();) { + Element e = iterator.next(); + if (e.attributeValue("name").equals(actionName)) { + actionElement = e; + className = e.attributeValue("class"); + break; + } + } + + Class clazz = Class.forName(className); + Object action = clazz.newInstance(); + + // 1. 反射设置属性 + if (parameters != null) { + for (Map.Entry entry : parameters.entrySet()) { + String fieldName = entry.getKey(); + String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); + Class fieldType = clazz.getDeclaredField(fieldName).getType(); + Method method = clazz.getDeclaredMethod(methodName, fieldType); + method.invoke(action, entry.getValue()); + } + } + + // 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method execute = clazz.getDeclaredMethod("execute"); + String result = (String) execute.invoke(action); + + // 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap + Method[] methods = clazz.getDeclaredMethods(); + Map param = new HashMap(); + for (Method method : methods) { + String methodName = method.getName(); + if (method.getName().startsWith("get")) { + String fieldName = methodName.substring(3, 4).toLowerCase() + methodName.substring(4); + Object fieldValue = method.invoke(action); + param.put(fieldName, fieldValue); + } + } + + View view = new View(); + view.setParameters(param); + + // 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + // 放到View对象的jsp字段中。 + for (Iterator iterator = actionElement.elementIterator("result"); iterator.hasNext();) { + Element resultElement = iterator.next(); + if (resultElement.attributeValue("name").equals(result)) { + view.setJsp(resultElement.getText()); + break; + } + } + + return view; + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } +} diff --git a/group01/1298552064/src/week02/litestruts/View.java b/group01/1298552064/src/week02/litestruts/View.java new file mode 100644 index 0000000000..a286412f0e --- /dev/null +++ b/group01/1298552064/src/week02/litestruts/View.java @@ -0,0 +1,26 @@ +package week02.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/1298552064/src/week02/litestruts/struts.xml b/group01/1298552064/src/week02/litestruts/struts.xml new file mode 100644 index 0000000000..01398e9c3d --- /dev/null +++ b/group01/1298552064/src/week02/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/1298552064/src/week02/test/ArrayUtilTest.java b/group01/1298552064/src/week02/test/ArrayUtilTest.java new file mode 100644 index 0000000000..e796b5f845 --- /dev/null +++ b/group01/1298552064/src/week02/test/ArrayUtilTest.java @@ -0,0 +1,75 @@ +package week02.test; + +import org.junit.Assert; +import org.junit.Test; + +import week02.array.ArrayUtil; + +public class ArrayUtilTest { + + @Test + public void testReverseArray() { + int[] a = new int[] { 7, 9, 30, 3 }; + int[] b = new int[] { 7, 9, 30, 3, 4 }; + + ArrayUtil.reverseArray(a); + ArrayUtil.reverseArray(b); + + Assert.assertArrayEquals(new int[] { 3, 30, 9, 7 }, a); + Assert.assertArrayEquals(new int[] { 4, 3, 30, 9, 7 }, b); + } + + @Test + public void testRemoveZero() { + int[] oldArr = new int[] { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 }; + int[] newArray = ArrayUtil.removeZero(oldArr); + Assert.assertArrayEquals(new int[] { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }, newArray); + } + + @Test + public void testMerge() { + int[] a1 = new int[] { 3, 5, 7, 8 }; + int[] a2 = new int[] { 4, 5, 6, 6, 7, 7 }; + int[] a3 = ArrayUtil.merge(a1, a2); + Assert.assertArrayEquals(new int[] { 3, 4, 5, 6, 7, 8 }, a3); + } + + @Test + public void testGrow() { + int[] oldArray = new int[] { 2, 3, 6 }; + int size = 3; + int[] newArray = ArrayUtil.grow(oldArray, size); + Assert.assertArrayEquals(new int[] { 2, 3, 6, 0, 0, 0 }, newArray); + } + + @Test + public void testFibonacci() { + int max = 15; + int max2 = 1; + int[] newArray = ArrayUtil.fibonacci(max); + int[] newArray2 = ArrayUtil.fibonacci(max2); + Assert.assertArrayEquals(new int[] { 1, 1, 2, 3, 5, 8, 13 }, newArray); + Assert.assertArrayEquals(new int[] {}, newArray2); + } + + @Test + public void testGetPrimes() { + int[] newArray = ArrayUtil.getPrimes(23); + Assert.assertArrayEquals(new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }, newArray); + } + + @Test + public void testGetPerfectNumbers() { + int[] newArray = ArrayUtil.getPerfectNumbers(1000); + Assert.assertArrayEquals(new int[] { 6, 28, 496 }, newArray); + } + + @Test + public void testJoin() { + int[] array = new int[] { 3, 8, 9 }; + String seperator = "-"; + String result = ArrayUtil.join(array, seperator); + Assert.assertEquals("3-8-9", result); + } + +} diff --git a/group01/1298552064/src/week02/test/StrutsTest.java b/group01/1298552064/src/week02/test/StrutsTest.java new file mode 100644 index 0000000000..3eb6d01fd0 --- /dev/null +++ b/group01/1298552064/src/week02/test/StrutsTest.java @@ -0,0 +1,41 @@ +package week02.test; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +import week02.litestruts.Struts; +import week02.litestruts.View; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); // 密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group01/1328404806/RemoteSystemsTempFiles/.project b/group01/1328404806/RemoteSystemsTempFiles/.project new file mode 100644 index 0000000000..5447a64fa9 --- /dev/null +++ b/group01/1328404806/RemoteSystemsTempFiles/.project @@ -0,0 +1,12 @@ + + + RemoteSystemsTempFiles + + + + + + + org.eclipse.rse.ui.remoteSystemsTempNature + + diff --git a/group01/1328404806/dataStructure/.classpath b/group01/1328404806/dataStructure/.classpath new file mode 100644 index 0000000000..4e4d00bbfd --- /dev/null +++ b/group01/1328404806/dataStructure/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/group01/1328404806/dataStructure/.gitignore b/group01/1328404806/dataStructure/.gitignore new file mode 100644 index 0000000000..b83d22266a --- /dev/null +++ b/group01/1328404806/dataStructure/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/group01/1328404806/dataStructure/.project b/group01/1328404806/dataStructure/.project new file mode 100644 index 0000000000..d2311ab943 --- /dev/null +++ b/group01/1328404806/dataStructure/.project @@ -0,0 +1,23 @@ + + + dataStructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/group01/1328404806/dataStructure/.settings/org.eclipse.core.resources.prefs b/group01/1328404806/dataStructure/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..f9fe34593f --- /dev/null +++ b/group01/1328404806/dataStructure/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/group01/1328404806/dataStructure/.settings/org.eclipse.jdt.core.prefs b/group01/1328404806/dataStructure/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..abec6ca389 --- /dev/null +++ b/group01/1328404806/dataStructure/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/group01/1328404806/dataStructure/.settings/org.eclipse.m2e.core.prefs b/group01/1328404806/dataStructure/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000..f897a7f1cb --- /dev/null +++ b/group01/1328404806/dataStructure/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/group01/1328404806/dataStructure/pom.xml b/group01/1328404806/dataStructure/pom.xml new file mode 100644 index 0000000000..c1f7aaf8c2 --- /dev/null +++ b/group01/1328404806/dataStructure/pom.xml @@ -0,0 +1,25 @@ + + 4.0.0 + + increaseLearning + dataStructure + 0.0.1-SNAPSHOT + jar + + dataStructure + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + diff --git a/group01/1328404806/dataStructure/src/main/java/ListService/KILinkedList.java b/group01/1328404806/dataStructure/src/main/java/ListService/KILinkedList.java new file mode 100644 index 0000000000..8dc4ecb32b --- /dev/null +++ b/group01/1328404806/dataStructure/src/main/java/ListService/KILinkedList.java @@ -0,0 +1,10 @@ +package ListService; + +//集合接口 +public interface KILinkedList { + + public void add(T t, int pos); + + public T remove(int pos); + +} diff --git a/group01/1328404806/dataStructure/src/main/java/ListService/KIList.java b/group01/1328404806/dataStructure/src/main/java/ListService/KIList.java new file mode 100644 index 0000000000..cad7ff2501 --- /dev/null +++ b/group01/1328404806/dataStructure/src/main/java/ListService/KIList.java @@ -0,0 +1,28 @@ +package ListService; + +//集合接口 +public interface KIList { + + public void add(T item); + + public void add(int index, T item); + + public void set(int index, T item); + + public void remove(int index); + + public void remove(T item); + + public void clear(); + + public boolean contains(T item); + + public boolean isEmpty(); + + public T get(int index); + + public int indexOf(T item); + + public int size(); + +} diff --git a/group01/1328404806/dataStructure/src/main/java/ListService/KIQueueList.java b/group01/1328404806/dataStructure/src/main/java/ListService/KIQueueList.java new file mode 100644 index 0000000000..a6bee9833e --- /dev/null +++ b/group01/1328404806/dataStructure/src/main/java/ListService/KIQueueList.java @@ -0,0 +1,11 @@ +package ListService; + +//集合接口 +public interface KIQueueList { + public T add(T ele); + + public T remove(); + + public Object[] getData(); + +} diff --git a/group01/1328404806/dataStructure/src/main/java/ListService/KIStackList.java b/group01/1328404806/dataStructure/src/main/java/ListService/KIStackList.java new file mode 100644 index 0000000000..1734852fe6 --- /dev/null +++ b/group01/1328404806/dataStructure/src/main/java/ListService/KIStackList.java @@ -0,0 +1,9 @@ +package ListService; + +//集合接口 +public interface KIStackList { + public void push(T ele); + + public void pop(); + +} diff --git a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KArrayList.java b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KArrayList.java new file mode 100644 index 0000000000..6d7a4ab354 --- /dev/null +++ b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KArrayList.java @@ -0,0 +1,192 @@ +package ListServiceImpl; + +import ListService.KIList; + +public class KArrayList implements KIList { + + /** 初始化的容量的大小 */ + private final static int INIT_CAPACITY = 12; + private Object[] mList = null; + + /** 当前的容量 */ + private int mCurrentCapacity = 0; + /** 容器中元素的个数 */ + private int mSize = 0; + + public KArrayList() { + mList = new Object[INIT_CAPACITY]; + mCurrentCapacity = INIT_CAPACITY; + } + + /** + * 插入一个元素到链表尾部 + * + * @param item + */ + public void add(T item) { + if (mSize == mCurrentCapacity) { + expansion(); + } + mList[mSize] = item; + mSize++; + + } + + /** + * 插入一个元素到指定位置,从插入位置及其后面的元素往后移动一个位置 + * + * @param index + * 要插入的位置 + * @param item + */ + public void add(int index, T item) { + if (index < 0 || index >= mSize) { // 不允许index小于0,或者index >= 数组当前大小 + throw new IndexOutOfBoundsException(); + } + if (mSize == mCurrentCapacity) { + expansion(); + } + Object[] newList = new Object[mCurrentCapacity]; + System.arraycopy(mList, 0, newList, 0, index); + System.arraycopy(mList, index, newList, index + 1, mSize - index); + newList[index] = item; + mList = newList; + mSize++; + + } + + /** + * 更新指定位置的元素 + * + * @param index + * @param item + */ + public void set(int index, T item) { + if (index < 0 || index >= mSize) { + throw new IndexOutOfBoundsException(); + } + mList[index] = item; + + } + + /** + * 移除指定位置的元素,后面的元素向前移动一位 + * + * @param index + */ + public void remove(int index) { + if (index < 0 || index >= mSize) { + throw new IndexOutOfBoundsException(); + } + Object[] newList = new Object[mCurrentCapacity]; + System.arraycopy(mList, 0, newList, 0, index); + System.arraycopy(mList, index + 1, newList, index, mSize - index); + mList = newList; + mSize--; + + } + + /** + * 移除链表中特定的元素。(如果item在链表中有多个,只移除第一个) + * + * @param item + */ + public void remove(T item) { + for (int i = 0; i < mSize; i++) { + if (mList[i].equals(item)) { + remove(i); + break; + } + } + + } + + /** + * 将链表清空,capacity不变 + */ + public void clear() { + mList = new Object[mCurrentCapacity]; + mSize = 0; + + } + + /** + * 判断是否包含某个元素 + * + * @param item + * @return true表示有这个元素,false表示没有这个元素 + */ + public boolean contains(T item) { + for (int i = 0; i < mSize; i++) { + if (mList[i].equals(item)) { + return true; + } + } + return false; + } + + /** + * 判断链表是否为空 + * + * @return boolean + */ + public boolean isEmpty() { + return (mSize == 0) ? true : false; + } + + /** + * 获取指定位置的元素 + * + * @param index + * @return + */ + @SuppressWarnings("unchecked") + public T get(int index) { + if (index < 0 || index >= mSize) { + throw new IndexOutOfBoundsException(); + } + return (T) mList[index]; + } + + /** + * 获取特定元素所在的位置。 如果该链表中存在多个相同的元素,只返回第一个的位置,如果找不到,则返回-1。 + * + * @param item + * @return int 如果没找到,返回-1 + */ + public int indexOf(T item) { + for (int i = 0; i < mSize; i++) { + if (mList[i].equals(item)) { + return i; + } + } + return -1; + } + + /** + * 获取当前链表的长度 + * + * @return int + */ + public int size() { + return mSize; + } + + /** + * 扩容,当 mSize == mCurrentCapacity 时调用 + */ + private void expansion() { + Object[] oldList = mList; + Object[] newList = new Object[getNewCapacity()]; + System.arraycopy(oldList, 0, newList, 0, oldList.length); + mList = newList; + } + + /** + * 获取新的容量大小 当满的时候每次增加当前容量的50% + */ + private int getNewCapacity() { + return mCurrentCapacity = mCurrentCapacity + (mCurrentCapacity >> 1); + } + +} diff --git a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KLinkedList.java b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KLinkedList.java new file mode 100644 index 0000000000..cf158d2399 --- /dev/null +++ b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KLinkedList.java @@ -0,0 +1,201 @@ +package ListServiceImpl; + +import java.util.Iterator; + +import ListService.KILinkedList; + +public class KLinkedList implements Iterable, KILinkedList { + + // 记录链表的长度 + private int mSize = 0; + // private int mActionCount = 0; + // 开始和结束节点 + private Node mBeginNode, mLastNode; + + public KLinkedList() { + // TODO Auto-generated constructor stub + init(); + } + + /** + * 初始化一个只有开始节点和结束节点的空链表 + */ + private void init() { + // 将首位节点链接起来 + mBeginNode = new Node(null, null, null); + mLastNode = new Node(null, mBeginNode, null); + mBeginNode.nextNode = mLastNode; + mSize = 0; + // mActionCount++; + } + + public int size() { + return mSize; + } + + public boolean isEmpty() { + return mSize == 0 ? true : false; + } + + /** + * 在链表的pos位置之前放置t_node这个节点 + * + * @param t_node + * 需要放置的节点 + * @param pos + * 放置节点在pos之前 + */ + private void add(Node newNode, int pos) { + // 抛出不合法的位置 + if (pos < 0 || pos > mSize) { + throw new IndexOutOfBoundsException(); + } + + // 链接新节点 + newNode.nextNode = getNode(pos); + getNode(pos - 1).nextNode = newNode; + getNode(pos).preNode = newNode; + // mActionCount++; + mSize++; + + } + + /** + * t 供外部调用,直接在链表的末尾添加,即在mLastNode节点之前 + * + * @param + */ + public void add(T t) { + add(new Node(t, null, null), mSize); + } + + /** + * 往链表pos位置之前添加数据t + * + * @param t + * 添加的数据 + * @param pos + * 添加在pos位置之前 + */ + public void add(T t, int pos) { + add(new Node(t, null, null), pos); + } + + /** + * + * @param pos + * 链表中的某个位置 + * @return 翻去pos位置的节点 (此处的pos的范围是[-1,mSize],此方法是私有方法,外部访问不了,只共此类中呢个访问) + */ + private Node getNode(int pos) { + Node node; + int currentPos; + if (pos == -1) { + // -1的位置是开始节点 + return mBeginNode; + } else if (pos == mSize) { + // mSize的位置是结束的节点 + return mLastNode; + } + // 因为这是双向节点,所以判断一下能提高搜索效率 + if (pos < mSize / 2) { + currentPos = 0; + node = mBeginNode.nextNode; + while (currentPos < pos) { + node = node.nextNode; + currentPos++; + } + } else { + node = mLastNode.preNode; + currentPos = mSize - 1; + while (currentPos > pos) { + node = node.preNode; + currentPos--; + } + } + return node; + } + + public T get(int pos) { + return getNode(pos).t; + } + + public void set(T t, int pos) { + if (pos < 0 || pos >= mSize) { + throw new IndexOutOfBoundsException(); + } + getNode(pos).t = t; + } + + /** + * 删除特定位置的节点 + * + * @param t_node + * 需要删除节点的位置 + * @return + */ + private T remove(Node t_node) { + + t_node.preNode.nextNode = t_node.nextNode; + t_node.nextNode.preNode = t_node.preNode; + // 最好在此处给其设置为空,不要其链接到其他节点,因为已经被销毁,不再持有其他的节点的引用 + t_node.nextNode = null; + t_node.preNode = null; + mSize--; + // mActionCount++; + return t_node.t; + } + + public T remove(int pos) { + if (pos < 0 || pos >= mSize) { + throw new IndexOutOfBoundsException(); + } + Node tempNode = getNode(pos); + remove(tempNode); + return tempNode.t; + } + + public Iterator iterator() { + + return new MyLinkedListIterator(); + } + + private class MyLinkedListIterator implements Iterator { + + private int currentPos = 0; + + public boolean hasNext() { + // TODO Auto-generated method stub + if (currentPos < mSize) { + return true; + } + return false; + } + + public T next() { + // TODO Auto-generated method stub + return (T) getNode(currentPos++).t; + } + + public void remove() { + // TODO Auto-generated method stub + KLinkedList.this.remove(getNode(--currentPos)); + ; + } + + } + + // 静态内部类,定义的节点,双向链表,需要一个指向前面一项的引用域和一个指向后面一项的引用域,方便查找 + private static class Node { + public T t; + public Node preNode; + public Node nextNode; + + public Node(T t, Node preNode, Node nextNode) { + this.preNode = preNode; + this.nextNode = nextNode; + this.t = t; + } + } + +} diff --git a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KQueueList.java b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KQueueList.java new file mode 100644 index 0000000000..1e389ae1ef --- /dev/null +++ b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KQueueList.java @@ -0,0 +1,97 @@ +package ListServiceImpl; + +import java.util.Arrays; +import java.util.Collection; + +import ListService.KIQueueList; + +public class KQueueList implements KIQueueList{ + + /** 初始容量 */ + public static final int DEFAULT_SIZE = 10; + /** 容量不足时翻倍数 */ + public static final float DEFAULT_INCREMENT = 1.5f; + /** 数据 */ + private Object[] elementData; + /** 元素个数 */ + private int elementCount; + /** 数组的头部,即 下次删除数据的 index */ + private int head; + /** 数组的尾部,即 下次插入数据的 index */ + private int tail; + + public KQueueList() { + this(DEFAULT_SIZE); + } + + public KQueueList(int size) { + this.elementData = new Object[size]; + this.elementCount = 0; + this.head = 0; + this.tail = 0; + } + + public KQueueList(Object[] data) { + this.elementData = data; + this.elementCount = data.length; + this.head = 0; + this.tail = 0; + } + + public KQueueList(Collection c) { + this(c.toArray()); + } + + /** + * 添加数据 到尾部 + * + * @param ele + * @return + */ + public T add(T ele) { + if (tail >= elementData.length) { + adjustData(); + } + elementData[tail] = ele; + elementCount++; + tail++; + return ele; + }; + + /** + * 删除数据 从头部 + * + * @return + */ + @SuppressWarnings("unchecked") + public T remove() { + T e = (T) elementData[head]; + elementData[head] = null; + elementCount--; + head++; + return e; + }; + + /** + * 获得当前的数据 + * + * @return + */ + public Object[] getData() { + return Arrays.copyOfRange(this.elementData, this.head, this.tail); + } + + public void adjustData() { + if (tail >= elementData.length) { // tail 处空间不足时调用 + // head 的空位去掉 + int newSize = (elementData.length == elementCount) ? (int) Math.ceil(elementCount * DEFAULT_INCREMENT) + : elementData.length; + elementData = Arrays.copyOfRange(elementData, head, elementData.length); + // 调整空间 + elementData = Arrays.copyOf(elementData, newSize); + tail = elementCount; + head = 0; + } + } + +} diff --git a/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KStackList.java b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KStackList.java new file mode 100644 index 0000000000..3b252cd7f4 --- /dev/null +++ b/group01/1328404806/dataStructure/src/main/java/ListServiceImpl/KStackList.java @@ -0,0 +1,48 @@ +package ListServiceImpl; + +import java.util.Arrays; + +import ListService.KIStackList; + +public class KStackList implements KIStackList{ + Object[] data; + private int capacity; + private int size; + + public KStackList() + { + capacity=16; + size=0; + data=new Object[capacity]; + } + + public void ensureCapacity() { + capacity = capacity * 2; + data = Arrays.copyOf(data, capacity); + } + + //压入栈底 + public void push(T ele) { + if (size < capacity) { + data[size++] = ele; + } else { + ensureCapacity(); + data[size++] = ele; + } + } + + //弹出 + public void pop() { + if (size > 0) { + System.out.println(data[size - 1]); + data[--size] = null; + } else { + System.out.println("Empty stack!"); + } + } + + boolean isEmpty() { + return size == 0; + } + +} diff --git a/group01/1328404806/dataStructure/src/main/java/increaseLearning/dataStructure/App.java b/group01/1328404806/dataStructure/src/main/java/increaseLearning/dataStructure/App.java new file mode 100644 index 0000000000..2787ea64f4 --- /dev/null +++ b/group01/1328404806/dataStructure/src/main/java/increaseLearning/dataStructure/App.java @@ -0,0 +1,13 @@ +package increaseLearning.dataStructure; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/AppTest.java b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/AppTest.java new file mode 100644 index 0000000000..e717bddafe --- /dev/null +++ b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/AppTest.java @@ -0,0 +1,38 @@ +package increaseLearning.dataStructure; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/arrayListTest.java b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/arrayListTest.java new file mode 100644 index 0000000000..a9d55fd05b --- /dev/null +++ b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/arrayListTest.java @@ -0,0 +1,36 @@ +package increaseLearning.dataStructure; + + +import org.junit.Test; + +import ListServiceImpl.KArrayList; +import junit.framework.TestCase; + +public class arrayListTest extends TestCase { + @Test + public void testArrayList() { + + KArrayList arr = new KArrayList(); + + for (int i = 1; i <= 50; i++) { + arr.add(i); + } + + arr.add(10, 99); + arr.add(0, 99); + + System.out.println(arr.get(51)); + System.out.println(arr.get(11)); + + // arr.clear(); + + // System.out.println(arr.contains(99)); + // System.out.println(arr.indexOf(59)); + + arr.remove(11); + + arr = null; + + } + +} diff --git a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/linkedListTest.java b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/linkedListTest.java new file mode 100644 index 0000000000..2c0d0554f6 --- /dev/null +++ b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/linkedListTest.java @@ -0,0 +1,21 @@ +package increaseLearning.dataStructure; + +import org.junit.Test; + +import ListServiceImpl.KLinkedList; +import junit.framework.TestCase; + +public class linkedListTest extends TestCase{ + @Test + public void testLinkedList(){ + KLinkedList linkList=new KLinkedList(); + + + linkList.add(3, 0); + + System.out.println(linkList.get(0)); +// System.out.println("成功!!!"); + + } + +} diff --git a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/queueListTest.java b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/queueListTest.java new file mode 100644 index 0000000000..274faf5b83 --- /dev/null +++ b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/queueListTest.java @@ -0,0 +1,42 @@ +package increaseLearning.dataStructure; + +import org.junit.Assert; +import org.junit.Test; + +import ListServiceImpl.KQueueList; +import junit.framework.TestCase; + +public class queueListTest extends TestCase { + @Test + public void testQueueList() { + KQueueList queueOne = new KQueueList(); + // 第1次 加入个数 + int addCountOne = 30; + // 第1次 删除个数 + int removeCountOne = 20; + // 第2次 加入个数 + int addCountTwo = 10; + + for (int i = 0; i < addCountOne; i++) { + queueOne.add(i); + } + Object[] data = queueOne.getData(); + for (int i = 0; i < data.length; i++) { + Assert.assertTrue((Integer) data[i] == i); + } + + for (int i = 0; i < removeCountOne; i++) { + Assert.assertTrue(queueOne.remove() == i); + } + + for (int i = 0; i < addCountTwo; i++) { + queueOne.add(i * 10); + } + Object[] data2 = queueOne.getData(); + int baseCount = addCountOne - removeCountOne; + for (int i = 0; i < addCountTwo; i++) { + Assert.assertTrue((Integer) data2[baseCount + i] == i * 10); + } + } + +} diff --git a/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/stackListTest.java b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/stackListTest.java new file mode 100644 index 0000000000..50ad4c0a3e --- /dev/null +++ b/group01/1328404806/dataStructure/src/test/java/increaseLearning/dataStructure/stackListTest.java @@ -0,0 +1,26 @@ +package increaseLearning.dataStructure; + +import org.junit.Test; + +import ListServiceImpl.KStackList; +import junit.framework.TestCase; + +public class stackListTest extends TestCase{ + @Test + public void testStackList(){ + KStackList fcStack=new KStackList(); + for(int i=0;i<10;i++) + { + fcStack.push(i); + System.out.println(fcStack); + } + + for(int i=0;i<10;i++) + { + fcStack.pop(); + System.out.println(fcStack); + } + fcStack.pop(); + } + +} diff --git a/group01/1664823950/.classpath b/group01/1664823950/.classpath new file mode 100644 index 0000000000..fb5011632c --- /dev/null +++ b/group01/1664823950/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/group01/1664823950/.gitignore b/group01/1664823950/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group01/1664823950/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group01/1664823950/.project b/group01/1664823950/.project new file mode 100644 index 0000000000..6cca5cf64b --- /dev/null +++ b/group01/1664823950/.project @@ -0,0 +1,21 @@ + + +<<<<<<< HEAD:group01/1664823950/.project + 1664823950 +======= + 1264835468 +>>>>>>> master:group17/1264835468/.project + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group01/1664823950/src/com/coderising/array/ArrayUtil.java b/group01/1664823950/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..56a86160f4 --- /dev/null +++ b/group01/1664823950/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,209 @@ +package com.coderising.array; +import java.util.*; + +import com.sun.org.apache.bcel.internal.generic.NEWARRAY; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin) + { + int[] a = origin; + for (int i = 0; i < a.length; i++) + { + origin[i] = a[a.length-i]; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) + { + ArrayList a= new ArrayList(); + + for (int i : oldArray) + { + if (i != 0) + { + a.add(i); + } + } + + int[] newArray = new int[a.size()]; + for (int i = 0; i < a.size(); i++) + { + newArray[i] = a.get(i); + } + return null; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) + { + for (int i = 0; i < array1.length; i++) + { + for (int j = 0; j < array2.length; j++) + { + if(array1[i] == array2[j]) + { + array2[j] = 0; + } + } + } + + removeZero(array2); + + int[] array3 = new int[array1.length + array2.length]; + + for (int i = 0; i < array1.length; i++) + { + array3[i] = array1[i]; + } + + for (int i = 0; i < array2.length; i++) + { + array3[array1.length + i] = array2[i]; + } + + Arrays.sort(array3); + return array3; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size) + { + return new int[oldArray.length + size]; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max) + { + int top = 1; + int sec = 1; + ArrayList tem = new ArrayList(); + while (top < max) + { + tem.add(top); + int a = top; + top += sec; + sec = a; + } + + + return toArray(tem); + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max) + { + ArrayList tem = new ArrayList(); + for (int i = 0; i < max; i++) + { + if (isPrimes(i)) + { + tem.add(i); + } + } + + return toArray(tem); + } + + private boolean isPrimes(int i) + { + return true; + } + + private int[] toArray(ArrayList tem) + { + int[] newArr = new int[tem.size()]; + for (int i = 0; i < newArr.length; i++) + { + newArr[i] = tem.get(i); + } + return newArr; + } + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) + { + ArrayList tem = new ArrayList(); + for (int i = 0; i < max; i++) + { + if (isPerfectNumbers(i)) + { + tem.add(i); + } + } + + return toArray(tem); + } + + + private boolean isPerfectNumbers(int i) + { + return true; + } + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) + { + String newStr = ""; + for (int i = 0; i < array.length; i++) + { + if(i == array.length-1) + { + seperator = ""; + } + newStr += array[i] + seperator; + } + return newStr; + } + +} diff --git a/group01/1664823950/src/com/coderising/litestruts/LoginAction.java b/group01/1664823950/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group01/1664823950/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group01/1664823950/src/com/coderising/litestruts/Struts.java b/group01/1664823950/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..85e2e22de3 --- /dev/null +++ b/group01/1664823950/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,34 @@ +package com.coderising.litestruts; + +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group01/1664823950/src/com/coderising/litestruts/StrutsTest.java b/group01/1664823950/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group01/1664823950/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group01/1664823950/src/com/coderising/litestruts/View.java b/group01/1664823950/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group01/1664823950/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/1664823950/src/com/coderising/litestruts/struts.xml b/group01/1664823950/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..a6cfe43e6c --- /dev/null +++ b/group01/1664823950/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/1664823950/src/com/coding/basic/ArrayList.java b/group01/1664823950/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..3df8071a0e --- /dev/null +++ b/group01/1664823950/src/com/coding/basic/ArrayList.java @@ -0,0 +1,73 @@ +package com.coding.basic; + +public class ArrayList implements List +{ + + private int size = 0; + + + private Object[] elementData = new Object[100]; + + public void add(Object o) + { + elementData[size] = o; + size ++; + } + + public void add(int index, Object o) + { + if(index > size || index < 0) + { + return; + } + else + { + for (int i = size-1; i > index; i--) + { + elementData[i+1] = elementData[size]; + } + elementData[index] = o; + size++; + } + + } + + public Object get(int index) + { + if(index < size || index >= 0) + { + return elementData[index]; + } + return null; + } + + public Object remove(int index) + { + Object removedObj; + if(index >= size || index < 0) + { + removedObj = null; + } + else + { + removedObj = elementData[index]; + for (int j = index; j < elementData.length; j++) + { + elementData[j] = elementData[j+1]; + } + size--; + } + return removedObj; + } + + public int size() + { + return size; + } + + public Iterator iterator() + { + return null; + } + +} diff --git a/group01/1664823950/src/com/coding/basic/BinaryTreeNode.java b/group01/1664823950/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..4841c1310c --- /dev/null +++ b/group01/1664823950/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,45 @@ +package com.coding.basic; + +public class BinaryTreeNode +{ + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() + { + return data; + } + + public void setData(Object data) + { + this.data = data; + } + + public BinaryTreeNode getLeft() + { + return left; + } + + public void setLeft(BinaryTreeNode left) + { + this.left = left; + } + + public BinaryTreeNode getRight() + { + return right; + } + + public void setRight(BinaryTreeNode right) + { + this.right = right; + } + + public BinaryTreeNode insert(Object o) + { + return null; + } + +} diff --git a/group01/1664823950/src/com/coding/basic/Iterator.java b/group01/1664823950/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..e98814b4c5 --- /dev/null +++ b/group01/1664823950/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public interface Iterator +{ + public boolean hasNext(); + public Object next(); + +} diff --git a/group01/1664823950/src/com/coding/basic/LinkedList.java b/group01/1664823950/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..5cb68effd8 --- /dev/null +++ b/group01/1664823950/src/com/coding/basic/LinkedList.java @@ -0,0 +1,108 @@ +package com.coding.basic; + +public class LinkedList implements List +{ + + private Node head; + private Node tail; + + public void add(Object o) + { + Node n = new Node(o); + tail.next = n; + tail = n; + } + + public void add(int index , Object o) + { + Node n = new Node(o); + getNode(index-1).next = n; + n.next = getNode(index); + } + + private Node getNode(int index) + { + Node n = head; + int counter = 0; + while (counter + + + + + + diff --git a/group01/1814014897/zhouhui/.gitignore b/group01/1814014897/zhouhui/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group01/1814014897/zhouhui/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group01/1814014897/zhouhui/.project b/group01/1814014897/zhouhui/.project new file mode 100644 index 0000000000..fab8d7f04c --- /dev/null +++ b/group01/1814014897/zhouhui/.project @@ -0,0 +1,17 @@ + + + 2017Learning + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group01/1814014897/zhouhui/.settings/org.eclipse.jdt.core.prefs b/group01/1814014897/zhouhui/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..3a21537071 --- /dev/null +++ b/group01/1814014897/zhouhui/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group01/1814014897/zhouhui/src/.project b/group01/1814014897/zhouhui/src/.project new file mode 100644 index 0000000000..f7d6de6781 --- /dev/null +++ b/group01/1814014897/zhouhui/src/.project @@ -0,0 +1,11 @@ + + + src + + + + + + + + diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/ArrayList.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/ArrayList.java new file mode 100644 index 0000000000..23ed3f6bc2 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/ArrayList.java @@ -0,0 +1,75 @@ +package week01.BasicDataStructure; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + ensureCapacity(size + 1); //size increase,in order to have enough capacity. + elementData[size++] = o; //similar to: elementData[size]=o; size++; + } + + private void ensureCapacity(int minCapacity){ + if(minCapacity > elementData.length){ + grow(minCapacity); + } + } + + private void grow(int minCapacity){ + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + ( oldCapacity >> 1 ); + if(newCapacity < minCapacity){ + newCapacity = minCapacity; + } + elementData = Arrays.copyOf(elementData, newCapacity); + + } + + public void add(int index, Object o){ + if(index < 0 || index > size) throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); + ensureCapacity(size+1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + if(index < 0 || index >= size) throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); + return elementData[index]; + } + + public Object remove(int index){ + if(index < 0 || index >= size) throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); + Object data_index = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + elementData[size - 1] = null; + size--; + return data_index; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + + private int pos = 0; + + public boolean hasNext() { + return pos < size; + } + + public Object next() { + return elementData[pos++]; + } + } + +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/BinaryTreeNode.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/BinaryTreeNode.java new file mode 100644 index 0000000000..a4fb2cf8b9 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/BinaryTreeNode.java @@ -0,0 +1,56 @@ +package week01.BasicDataStructure; + +public class BinaryTreeNode{ + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Object data){ + this.data = data; + left = null; + right = null; + } + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + if((Integer)o < (Integer)this.data) + { + if(this.left == null){ + BinaryTreeNode node = new BinaryTreeNode(o); + this.setLeft(node); + return node; + }else{ + return this.left.insert(o); + } + }else{ + if(this.right == null){ + BinaryTreeNode node = new BinaryTreeNode(o); + this.setRight(node); + return node; + }else{ + return this.right.insert(o); + } + } + } + } + + diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Iterator.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Iterator.java new file mode 100644 index 0000000000..0ad3fff8f3 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Iterator.java @@ -0,0 +1,7 @@ +package week01.BasicDataStructure; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/LinkedList.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/LinkedList.java new file mode 100644 index 0000000000..35b1158cd1 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/LinkedList.java @@ -0,0 +1,113 @@ +package week01.BasicDataStructure; + +public class LinkedList implements List { + + private Node head; + private int size = 0; + + public void add(Object o){ + if(head == null){ + head = new Node(o); + }else{ + Node pos = head; + while(pos.next != null){ + pos = pos.next; + } + pos.next = new Node(o); + } + size++; + } + + public void add(int index , Object o){ + if(index < 0 || index >size ) throw new IndexOutOfBoundsException("Index:"+index+",Size"+size); + if(index == 0) { + Node node = new Node(o); + node.next = head; + head = node; + } + else{ + Node pos = head; + for(int i = 0;i < index-1;i++){ + pos = pos.next; + } + Node node = new Node(o); + node.next = pos.next; + pos.next = node; + } + size++; + } + + public Object get(int index){ + if(index < 0 || index >=size ) throw new IndexOutOfBoundsException("Index:"+index+",Size"+size); + Node pos = head; + for(int i = 0;i < index;i++){ + pos = pos.next; + } + return pos.data; + } + + public Object remove(int index){ + if(index < 0 || index >=size ) throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); + Node element = head; + if(index == 0){ + head = head.next; + }else{ + Node pos = head; + for(int i = 0;i < index - 1;i++){ + pos = pos.next; + } + element = pos.next; + pos.next = pos.next.next; + } + size--; + return element.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + add(0,o); + } + public void addLast(Object o){ + add(size,o); + } + public Object removeFirst(){ + return remove(0); + } + public Object removeLast(){ + return remove(size-1); + } + public Iterator iterator(){ + return new LinkedListIterator(); + } + + class LinkedListIterator implements Iterator{ + + private Node node = head; + private int pos = 0; + @Override + public boolean hasNext() { + return pos < size; + } + + @Override + public Object next() { + pos++; + if(pos != 1){ + node = node.next; + } + return node.data; + } + } + + private static class Node{ + Object data; + Node next; + public Node(Object data){ + this.data = data; + next = null; + } + } +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/List.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/List.java new file mode 100644 index 0000000000..7806b75ed3 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/List.java @@ -0,0 +1,9 @@ +package week01.BasicDataStructure; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Queue.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Queue.java new file mode 100644 index 0000000000..e0ab6bbb9c --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Queue.java @@ -0,0 +1,25 @@ +package week01.BasicDataStructure; + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + private int size = 0; + + public void enQueue(Object o){ + linkedList.add(o); + size++; + } + + public Object deQueue(){ + size--; + return linkedList.removeFirst(); + } + + public boolean isEmpty(){ + return linkedList.size() == 0; + } + + public int size(){ + return size; + } +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Stack.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Stack.java new file mode 100644 index 0000000000..53f99b37c7 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructure/Stack.java @@ -0,0 +1,25 @@ +package week01.BasicDataStructure; + +public class Stack { + private ArrayList elementData = new ArrayList(); + private int size = 0; + + public void push(Object o){ + elementData.add(o); + size++; + } + + public Object pop(){ + return elementData.remove(--size); + } + + public Object peek(){ + return elementData.get(size - 1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/AllTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/AllTest.java new file mode 100644 index 0000000000..5d5f07d815 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/AllTest.java @@ -0,0 +1,18 @@ +package week01.BasicDataStructureTest; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ + ArrayListTest.class, + BinaryTreeNodeTest.class, + LinkedListTest.class, + QueueTest.class, + StackTest.class +}) + +public class AllTest { + +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/ArrayListTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/ArrayListTest.java new file mode 100644 index 0000000000..c5513acfda --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/ArrayListTest.java @@ -0,0 +1,72 @@ +package week01.BasicDataStructureTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week01.BasicDataStructure.ArrayList; +import week01.BasicDataStructure.Iterator; + +public class ArrayListTest { + + private ArrayList arrayList = new ArrayList(); + + @Before + public void setUp() throws Exception { + for(int i = 0;i < 100 ; i++){ + arrayList.add(i); + } + } + + @Test + public void testAddObject() { + for(int i = 0;i < 100;i++){ + Assert.assertEquals(arrayList.get(i), i); + } + } + + @Test + public void testAddIntObject() { + arrayList.add(0,10); + arrayList.add(22, 44); + arrayList.add(40, 5); + arrayList.add(100,88); + Assert.assertEquals(arrayList.get(0), 10); + Assert.assertEquals(arrayList.get(22),44); + Assert.assertEquals(arrayList.get(40), 5); + Assert.assertEquals(arrayList.get(100), 88); + } + + @Test + public void testGet() { + Assert.assertEquals(arrayList.get(0), 0); + Assert.assertEquals(arrayList.get(33), 33); + Assert.assertEquals(arrayList.get(77), 77); + Assert.assertEquals(arrayList.get(99), 99); + } + + @Test + public void testRemove() { + Assert.assertEquals(arrayList.remove(0), 0); + Assert.assertEquals(arrayList.remove(0), 1); + Assert.assertEquals(arrayList.remove(97), 99); + Assert.assertEquals(arrayList.size(), 97); + } + + @Test + public void testSize() { + Assert.assertEquals(arrayList.size(), 100); + arrayList.add(5,5); + Assert.assertEquals(arrayList.size(),101); + arrayList.remove(5); + Assert.assertEquals(arrayList.size(), 100); + } + + @Test + public void testIterator() { + Iterator iterator = arrayList.iterator(); + for(int i=0;iterator.hasNext();i++){ + Assert.assertEquals(iterator.next(),i); + } + } +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/BinaryTreeNodeTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..724e6c0e03 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/BinaryTreeNodeTest.java @@ -0,0 +1,80 @@ +package week01.BasicDataStructureTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week01.BasicDataStructure.BinaryTreeNode; + + +public class BinaryTreeNodeTest { + + private BinaryTreeNode root = new BinaryTreeNode(5); + + @Before + public void setUp() throws Exception { + root.insert(2); + root.insert(7); + root.insert(1); + root.insert(6); + } + + @Test + public void testGetData() { + Assert.assertEquals(root.getData(), 5); + Assert.assertEquals(root.getLeft().getData(), 2); + Assert.assertEquals(root.getRight().getData(), 7); + Assert.assertEquals(root.getLeft().getLeft().getData(), 1); + Assert.assertEquals(root.getRight().getLeft().getData(), 6); + } + + @Test + public void testSetData() { + root.setData(8); + Assert.assertEquals(root.getData(),8); + root.getLeft().setData(88); + Assert.assertEquals(root.getLeft().getData(),88); + root.getRight().setData(888); + Assert.assertEquals(root.getRight().getData(),888); + } + + @Test + public void testGetLeft() { + BinaryTreeNode node_left = root.getLeft(); + Assert.assertEquals(node_left.getData(), 2); + BinaryTreeNode node_left_left = root.getLeft().getLeft(); + Assert.assertEquals(node_left_left.getData(), 1); + } + + @Test + public void testSetLeft() { + BinaryTreeNode node = new BinaryTreeNode(100); + root.setLeft(node); + Assert.assertEquals(root.getLeft().getData(), 100); + } + + @Test + public void testGetRight() { + BinaryTreeNode node_right = root.getRight(); + Assert.assertEquals(node_right.getData(), 7); + root.insert(8); + BinaryTreeNode node_right_right = root.getRight().getRight(); + Assert.assertEquals(node_right_right.getData(), 8); + } + + @Test + public void testSetRight() { + BinaryTreeNode node = new BinaryTreeNode(100); + root.setRight(node); + Assert.assertEquals(root.getRight().getData(), 100); + } + + @Test + public void testInsert() { + root.insert(4); + root.insert(8); + Assert.assertEquals(root.getLeft().getRight().getData(), 4); + Assert.assertEquals(root.getRight().getRight().getData(), 8); + } + +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/LinkedListTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/LinkedListTest.java new file mode 100644 index 0000000000..2fb20d12f4 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/LinkedListTest.java @@ -0,0 +1,106 @@ +package week01.BasicDataStructureTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week01.BasicDataStructure.Iterator; +import week01.BasicDataStructure.LinkedList; + +public class LinkedListTest { + + private LinkedList linkedList = new LinkedList(); + + @Before + public void setUp() throws Exception { + for(int i=0;i<100;i++){ + linkedList.add(i); + } + } + + @Test + public void testAddObject() { + for(int i=0;i<200;i++){ + linkedList.add(i); + } + for(int i=0;i<100;i++){ + Assert.assertEquals(linkedList.get(i), i); + } + for(int i=100;i<300;i++){ + Assert.assertEquals(linkedList.get(i), i-100); + } + } + + @Test + public void testAddIntObject() { + linkedList.add(0, 10); + Assert.assertEquals(linkedList.get(0), 10); + linkedList.add(5,60); + Assert.assertEquals(linkedList.get(5), 60); + Assert.assertEquals(linkedList.get(101), 99); + } + + @Test + public void testGet() { + for(int i =0;i<100;i++){ + Assert.assertEquals(linkedList.get(i), i); + } + } + + @Test + public void testRemove() { + Assert.assertEquals(linkedList.remove(0), 0); + Assert.assertEquals(linkedList.remove(0), 1); + Assert.assertEquals(linkedList.size(), 98); + linkedList.remove(97); + Assert.assertEquals(linkedList.get(96), 98); + } + + @Test + public void testSize() { + linkedList.add(0); + Assert.assertEquals(linkedList.size(), 101); + linkedList.add(0, 10); + Assert.assertEquals(linkedList.size(), 102); + linkedList.remove(0); + Assert.assertEquals(linkedList.size(), 101); + } + + @Test + public void testAddFirst() { + linkedList.addFirst(22); + Assert.assertEquals(linkedList.get(0), 22); + linkedList.addFirst(44); + Assert.assertEquals(linkedList.get(0), 44); + Assert.assertEquals(linkedList.size(), 102); + } + + @Test + public void testAddLast() { + linkedList.addLast(22); + Assert.assertEquals(linkedList.get(100), 22); + linkedList.addLast(44); + Assert.assertEquals(linkedList.get(101), 44); + } + + @Test + public void testRemoveFirst() { + Assert.assertEquals(linkedList.removeFirst(), 0); + Assert.assertEquals(linkedList.removeFirst(), 1); + } + + @Test + public void testRemoveLast() { + Assert.assertEquals(linkedList.removeLast(),99 ); + Assert.assertEquals(linkedList.removeLast(), 98); + } + + @Test + public void testIterator() { + Iterator iterator = linkedList.iterator(); + for(int i = 0;iterator.hasNext();i++){ + Assert.assertEquals(iterator.next(), i); + } + } + +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/QueueTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/QueueTest.java new file mode 100644 index 0000000000..7302b5ec38 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/QueueTest.java @@ -0,0 +1,56 @@ +package week01.BasicDataStructureTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week01.BasicDataStructure.Queue; + + +public class QueueTest { + + Queue queue = new Queue(); + + @Before + public void setUp() throws Exception { + for(int i=0;i<100;i++){ + queue.enQueue(i); + } + } + + @Test + public void testEnQueue() { + Assert.assertEquals(queue.size(), 100); + for(int i =0;i<100;i++){ + queue.enQueue(i); + } + Assert.assertEquals(queue.size(), 200); + } + + @Test + public void testDeQueue() { + for(int i =0;i<100;i++){ + Assert.assertEquals(queue.deQueue(), i); + } + + } + + @Test + public void testIsEmpty() { + Assert.assertEquals(queue.isEmpty(), false); + for(int i=0;i<100;i++){ + queue.deQueue(); + } + Assert.assertEquals(queue.isEmpty(), true); + } + + @Test + public void testSize() { + Assert.assertEquals(queue.size(), 100); + queue.enQueue(100); + Assert.assertEquals(queue.size(), 101); + queue.deQueue(); + Assert.assertEquals(queue.size(), 100); + } + +} diff --git a/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/StackTest.java b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/StackTest.java new file mode 100644 index 0000000000..ae6d3a39d4 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week01/BasicDataStructureTest/StackTest.java @@ -0,0 +1,71 @@ +package week01.BasicDataStructureTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week01.BasicDataStructure.Stack; + + +public class StackTest { + + Stack stack = new Stack(); + + @Before + public void setUp() throws Exception { + for(int i =0 ;i <100;i++){ + stack.push(i); + } + } + + @Test + public void testPush() { + Assert.assertEquals(stack.peek(), 99); + for(int i =0;i <200;i++){ + stack.push(i); + } + Assert.assertEquals(stack.peek(), 199); + Assert.assertEquals(stack.size(), 300); + } + + @Test + public void testPop() { + Assert.assertEquals(stack.pop(), 99); + Assert.assertEquals(stack.pop(), 98); + for(int i=0;i<98;i++){ + stack.pop(); + } + Assert.assertEquals(stack.size(), 0); + } + + @Test + public void testPeek() { + for(int i=0;i<100;i++){ + Assert.assertEquals(stack.peek(), 99); + Assert.assertEquals(stack.size(), 100); + } + stack.pop(); + Assert.assertEquals(stack.peek(), 98); + Assert.assertEquals(stack.peek(), 98); + } + + @Test + public void testIsEmpty() { + Assert.assertEquals(stack.isEmpty(), false); + for(int i =0 ;i <100;i++){ + stack.pop(); + } + Assert.assertEquals(stack.isEmpty(), true); + } + + @Test + public void testSize() { + stack.push(100); + Assert.assertEquals(stack.size(), 101); + stack.pop(); + Assert.assertEquals(stack.size(), 100); + stack.peek(); + Assert.assertEquals(stack.size(), 100); + } + +} diff --git a/group01/1814014897/zhouhui/src/week02/array/ArrayUtil.java b/group01/1814014897/zhouhui/src/week02/array/ArrayUtil.java new file mode 100644 index 0000000000..dd939e7d2c --- /dev/null +++ b/group01/1814014897/zhouhui/src/week02/array/ArrayUtil.java @@ -0,0 +1,222 @@ +package week02.array; + +/** + * + * @author Hui Zhou + * @version 1.0 2017-02-28 + * + */ + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if(origin == null) return; + + int mid = origin.length/2; + for(int i=0;iarray4[j+1]){ + int sto = array4[j]; + array4[j] = array4[j+1]; + array4[j+1] = sto; + } + } + } + return array4; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + if(size<0 || oldArray==null) return null; + + int[] newArray = new int[oldArray.length + size]; + for(int i=0;i parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + //读取配置文件struts.xml + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder; + Document doc = null; + View view = new View(); //实例化View(后面调用view,存储parameters以及jsp,最后return view) + try { + builder = factory.newDocumentBuilder(); + File f = new File("src/week02/litestruts/struts.xml"); + doc = builder.parse(f); + } catch (ParserConfigurationException|SAXException|IOException e) { + e.printStackTrace(); + } + + //根据actionName找到相对应的action + Element root = doc.getDocumentElement(); + NodeList actionNode = root.getElementsByTagName("action"); + Element action = null; + for(int i=0;i cls = Class.forName(actionClass); + Object obj = cls.newInstance(); + Method setName = cls.getMethod("setName", String.class); + Method setPassword = cls.getMethod("setPassword", String.class); + setName.invoke(obj, parameters.get("name")); + setPassword.invoke(obj, parameters.get("password")); + + //通过反射调用对象的exectue 方法,并获得返回值 + Method execute = cls.getMethod("execute"); + String exe_val = (String) execute.invoke(obj); + + //通过反射找到对象的所有getter方法,通过反射来调用 + Method[] met = cls.getDeclaredMethods(); + List list = new LinkedList(); + for(int i=0;i param = new HashMap<>(); + for(int i=0;i 配置,以及execute的返回值,确定哪一个jsp,放到View对象的jsp字段中 + if(exe_val.equals("success")) + view.setJsp("/jsp/homepage.jsp"); + else view.setJsp("/jsp/showLogin.jsp"); + + } catch (ClassNotFoundException|InstantiationException|IllegalAccessException + |NoSuchMethodException|SecurityException|IllegalArgumentException|InvocationTargetException e) { + e.printStackTrace(); + } + + return view; + } +} diff --git a/group01/1814014897/zhouhui/src/week02/litestruts/StrutsTest.java b/group01/1814014897/zhouhui/src/week02/litestruts/StrutsTest.java new file mode 100644 index 0000000000..e65f6525bd --- /dev/null +++ b/group01/1814014897/zhouhui/src/week02/litestruts/StrutsTest.java @@ -0,0 +1,41 @@ +package week02.litestruts; + +import java.util.*; +import org.junit.*; + +/** + * @author Hui Zhou + * @version 1.0 2017-02-28 + */ + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group01/1814014897/zhouhui/src/week02/litestruts/View.java b/group01/1814014897/zhouhui/src/week02/litestruts/View.java new file mode 100644 index 0000000000..3043fb5d5a --- /dev/null +++ b/group01/1814014897/zhouhui/src/week02/litestruts/View.java @@ -0,0 +1,28 @@ +package week02.litestruts; + +import java.util.Map; + +/** + * @author Hui Zhou + * @version 1.0 2017-02-28 + */ + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/1814014897/zhouhui/src/week02/litestruts/struts.xml b/group01/1814014897/zhouhui/src/week02/litestruts/struts.xml new file mode 100644 index 0000000000..f449db14dd --- /dev/null +++ b/group01/1814014897/zhouhui/src/week02/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/1925347167/1925347167.md b/group01/1925347167/1925347167.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group01/1925347167/1925347167.md @@ -0,0 +1 @@ + diff --git a/group01/1925347167/Week1 Basic Data Structure/ArrayList.java b/group01/1925347167/Week1 Basic Data Structure/ArrayList.java new file mode 100644 index 0000000000..2797e0b129 --- /dev/null +++ b/group01/1925347167/Week1 Basic Data Structure/ArrayList.java @@ -0,0 +1,64 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + if (fullCheck()) + elementData = Arrays.copyOf(elementData, size*2); + elementData[size++] = o; + } + public void add(int index, Object o){ + + if (fullCheck()) + elementData = Arrays.copyOf(elementData, size*2); + if (!rangeCheck(index)) + throw new IndexOutOfBoundsException(); + for (int i = size; i > index; --i) + elementData[i] = elementData[i-1]; + elementData[index] = o; + size++; + } + + public Object get(int index){ + if (rangeCheck(index)) + return elementData[index]; + throw new IndexOutOfBoundsException(); + } + + public Object remove(int index){ + if (!rangeCheck(index)) + throw new IndexOutOfBoundsException(); + Object rmo = elementData[index]; + for (int i = index; i < size-1; ++i) + elementData[i] = elementData[i-1]; + size--; + return rmo; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return null; + } + + private boolean rangeCheck(int index) { + if (index < 0 || index >= size) + return false; + return true; + } + + private boolean fullCheck() { + if (size >= elementData.length) + return true; + return false; + } + +} diff --git a/group01/1925347167/Week1 Basic Data Structure/BinaryTreeNode.java b/group01/1925347167/Week1 Basic Data Structure/BinaryTreeNode.java new file mode 100644 index 0000000000..45827be3a5 --- /dev/null +++ b/group01/1925347167/Week1 Basic Data Structure/BinaryTreeNode.java @@ -0,0 +1,38 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Object o) { + data = o; + left = null; + right = null; + } + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group01/1925347167/Week1 Basic Data Structure/Iterator.java b/group01/1925347167/Week1 Basic Data Structure/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group01/1925347167/Week1 Basic Data Structure/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group01/1925347167/Week1 Basic Data Structure/LinkedList.java b/group01/1925347167/Week1 Basic Data Structure/LinkedList.java new file mode 100644 index 0000000000..3097f69edc --- /dev/null +++ b/group01/1925347167/Week1 Basic Data Structure/LinkedList.java @@ -0,0 +1,127 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + private int size = 0; + + public void add(Object o){ + Node tmp = head; + while (tmp.next != null) + tmp = tmp.next; + + Node n = new Node(o); + tmp.next = n; + size++; + } + public void add(int index , Object o){ + if (!rangeCheck(index)) + throw new IndexOutOfBoundsException(); + + if (index == 0) { + Node newhead = new Node(o); + newhead.next = head; + head = newhead; + } else { + Node tmp = head; + for (int i = 0; i < index - 1; ++i) + tmp = tmp.next; + Node node = new Node(o); + node.next = tmp.next; + tmp.next = node; + } + + size++; + } + public Object get(int index){ + if (!rangeCheck(index)) + throw new IndexOutOfBoundsException(); + Node tmp = head; + for (int i = 0; i < index - 1; ++i) + tmp = tmp.next; + return tmp.data; + + } + + public Object remove(int index){ + if (!rangeCheck(index)) + throw new IndexOutOfBoundsException(); + + if (index == 0) { + Node oldHead= head; + head = head.next; + size--; + return oldHead.data; + }else { + Node tmp = head; + for (int i = 0; i < index - 1; i++) { + tmp = tmp.next; + } + Node node = tmp.next; + tmp.next = node.next; + size--; + return node.data; + } + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node newHead = new Node(o); + newHead.next = head; + head = newHead; + size++; + } + public void addLast(Object o){ + Node tmp = head; + while (tmp.next != null) { + tmp = tmp.next; + } + Node node = new Node(o); + tmp.next = node; + size++; + } + public Object removeFirst(){ + if (head == null) + throw new IndexOutOfBoundsException(); + Node oldHead = head; + head = head.next; + size--; + return oldHead.data; + } + public Object removeLast(){ + if (head == null) + throw new IndexOutOfBoundsException(); + Node tmp = head; + while (tmp.next.next != null) { + tmp = tmp.next; + } + Node node = tmp.next; + tmp.next = null; + size--; + return node.data; + } + public Iterator iterator(){ + return null; + } + + private boolean rangeCheck(int index) { + if (index < 0 || index >= size) + return false; + return true; + } + + private static class Node{ + Object data; + Node next; + + Node(Object data) { + this.data = data; + next = null; + } + + } +} diff --git a/group01/1925347167/Week1 Basic Data Structure/List.java b/group01/1925347167/Week1 Basic Data Structure/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group01/1925347167/Week1 Basic Data Structure/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group01/1925347167/Week1 Basic Data Structure/Queue.java b/group01/1925347167/Week1 Basic Data Structure/Queue.java new file mode 100644 index 0000000000..b8c394b833 --- /dev/null +++ b/group01/1925347167/Week1 Basic Data Structure/Queue.java @@ -0,0 +1,24 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList llist = new LinkedList(); + + public void enQueue(Object o){ + llist.add(o); + } + + public Object deQueue(){ + if (isEmpty()) + return null; + return llist.removeFirst(); + } + + public boolean isEmpty(){ + return (llist.size()==0); + } + + public int size(){ + return -llist.size(); + } +} diff --git a/group01/1925347167/Week1 Basic Data Structure/Stack.java b/group01/1925347167/Week1 Basic Data Structure/Stack.java new file mode 100644 index 0000000000..4458cb61d7 --- /dev/null +++ b/group01/1925347167/Week1 Basic Data Structure/Stack.java @@ -0,0 +1,28 @@ +package com.coding.basic; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (isEmpty()) + return null; + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + if (elementData.size() == 0) + return null; + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return (elementData.size() == 0); + } + public int size(){ + return elementData.size(); + } +} diff --git a/group01/1925347167/Week1 Basic Data Structure/readme.md b/group01/1925347167/Week1 Basic Data Structure/readme.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/group01/1925347167/Week1 Basic Data Structure/readme.md @@ -0,0 +1 @@ + diff --git a/group01/2137642225/work01/.classpath b/group01/2137642225/work01/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group01/2137642225/work01/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group01/2137642225/work01/.gitignore b/group01/2137642225/work01/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group01/2137642225/work01/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group01/2137642225/work01/.project b/group01/2137642225/work01/.project new file mode 100644 index 0000000000..a703634d61 --- /dev/null +++ b/group01/2137642225/work01/.project @@ -0,0 +1,17 @@ + + + work01 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group01/2137642225/work01/README.md b/group01/2137642225/work01/README.md new file mode 100644 index 0000000000..31114b9ff8 --- /dev/null +++ b/group01/2137642225/work01/README.md @@ -0,0 +1,6 @@ +- 实现基本的数据结构 +# ArrayList +# LinkedList +# Stack +# Queue +# BinaryTree \ No newline at end of file diff --git a/group01/2137642225/work01/src/com/coding/mybasic/ArrayList.java b/group01/2137642225/work01/src/com/coding/mybasic/ArrayList.java new file mode 100644 index 0000000000..047453a4e7 --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/mybasic/ArrayList.java @@ -0,0 +1,139 @@ +package com.coding.mybasic; + +public class ArrayList implements List{ + + private static final int DEF_CAPACITY = 10; + private int size; + private Object[] elementData; + + public ArrayList(){ + elementData = new Object[DEF_CAPACITY]; + } + + public ArrayList(int initCapacity) { + if(initCapacity <= 0){ + throw new RuntimeException("初始化长度必须大于0"); + } + elementData = new Object[initCapacity]; + } + + @Override + public void add(Object element) { + checkArrayOutOfRange(); + elementData[size++] = element; + } + + + @Override + public void add(int index, Object element) { + // 末尾插入 + if(index == size){ + add(element); + return; + } + // index 在 0到size 之间,index之后元素要后移 + checkIndex(index); + checkArrayOutOfRange(); + moveBackwardElement(index); + elementData[index] = element; + size++; + } + + + @Override + public Object get(int index) { + checkIndex(index); + return elementData[index]; + } + + @Override + public Object remove(int index) { + checkIndex(index); + Object temp = elementData[index]; + moveForwardElement(index); + elementData[size--] = null; + return temp; + } + + + + @Override + public int size() { + return size; + } + + @Override + public Iterator iterator() { + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + private int i = 0; + @Override + public boolean hasNext() { + return i < size; + } + + @Override + public Object next() { + checkIndex(i); + return elementData[i++]; + } + + } + + /** + * 数组增长 + * @param newCapacity 新数组容量 + */ + private void grow(int newCapacity) { + Object[] dest = new Object[newCapacity]; + System.arraycopy(elementData, 0, dest , 0, elementData.length); + elementData = dest; + } + + /** + * 检查index index >=0 且 < size + * @param index + * @throws Exception + */ + private void checkIndex(int index) { + if(index < 0){ + throw new RuntimeException("index 必须大于0"); + } + // 越界 + if(index >= size){ + throw new RuntimeException("index 必须小于size:" + size); + } + } + + /** + * 检查数组容量是否已满,已满则扩容 + */ + private void checkArrayOutOfRange() { + if(size >= elementData.length){ + // 扩容 默认新容量是原来容量的2倍 + grow(elementData.length * 2); + } + } + + /** + * 后移元素,从index开始 + * @param index + */ + private void moveBackwardElement(int index) { + for (int i = size; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + } + /** + * 前移元素,从index开始 + * @param index + */ + private void moveForwardElement(int index) { + for (int i = index; i < size; i++) { + elementData[i] = elementData[i + 1]; + } + } + +} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/BinaryTreeNode.java b/group01/2137642225/work01/src/com/coding/mybasic/BinaryTreeNode.java new file mode 100644 index 0000000000..c35cd96d8a --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/mybasic/BinaryTreeNode.java @@ -0,0 +1,73 @@ +package com.coding.mybasic; + +public class BinaryTreeNode { + + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Integer data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Integer o){ + if(o == null){ + throw new RuntimeException("不能插入空值"); + } + BinaryTreeNode searchNode = search(this,o); + if(isExistData(searchNode,o)){ + throw new RuntimeException("该值已存在 无法插入"); + } + if(searchNode != null){ + BinaryTreeNode binaryTreeNode = new BinaryTreeNode(); + binaryTreeNode.setData(o); + if(searchNode.data.intValue() > o.intValue()){ + searchNode.setLeft(binaryTreeNode); + }else{ + searchNode.setRight(binaryTreeNode); + } + } else { + throw new RuntimeException("根节点未赋值,无法插入"); + } + return this; + } + + private boolean isExistData(BinaryTreeNode searchNode,Integer data) { + return searchNode != null && searchNode.data.intValue() == data.intValue(); + + } + + private BinaryTreeNode search(BinaryTreeNode binaryTreeNode, Integer data) { + if(binaryTreeNode == null || binaryTreeNode.data == null){ + return null; + } + Integer curNodeData = binaryTreeNode.data; + if(curNodeData.intValue() > data.intValue()){// 左 curNodeData > data + if(binaryTreeNode.left != null){ + return search(binaryTreeNode.left,data); + } + }else if(curNodeData.intValue() < data.intValue()){ + if(binaryTreeNode.right != null){ + return search(binaryTreeNode.right,data); + } + + } + return binaryTreeNode; + } + +} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/Iterator.java b/group01/2137642225/work01/src/com/coding/mybasic/Iterator.java new file mode 100644 index 0000000000..33d55843cd --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/mybasic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.mybasic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/LinkedList.java b/group01/2137642225/work01/src/com/coding/mybasic/LinkedList.java new file mode 100644 index 0000000000..cbdd293173 --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/mybasic/LinkedList.java @@ -0,0 +1,226 @@ +package com.coding.mybasic; + +public class LinkedList implements List { + + private Node head; + private Node last; + private int size; + + public LinkedList() { + } + + @Override + public void add(Object element) { + if(head == null){ + addHead(element); + }else{ + addLast(element); + } + } + + @Override + public void add(int index, Object element) { + if(index == size){ + add(element); + return; + } + + if(index == 0){ + addFirst(element); + return; + } + checkIndex(index); + insertElement(index - 1,element); + } + + + @Override + public Object get(int index) { + checkIndex(index); + Node node = getNodeByIndex(index); + return node != null ? node.data : null; + } + + @Override + public Object remove(int index) { + + checkIndex(index); + Object element = null; + if(index == 0){ + element = removeFirst(); + } + else if(index == (size - 1)){ + element = removeLast(); + } + else { + element = removeMiddle(index); + } + return element; + } + + + @Override + public int size() { + return size; + } + + + @Override + public Iterator iterator() { + return new LinkedListIterator(); + } + + private class LinkedListIterator implements Iterator{ + private Node node = head; + int i = 0; + @Override + public boolean hasNext() { + return i < size; + } + + @Override + public Object next() { + checkIndex(i); + Object element = node.data; + node = node.next; + i++; + return element; + } + + } + + public void addFirst(Object o){ + Node node = new Node(); + node.data = o; + node.next = head.next; + head = node; + size++; + } + public void addLast(Object o){ + Node node = new Node(); + node.data = o; + node.next = null; + last.next = node; + last = node; + size++; + } + public Object removeFirst(){ + return removeFirstNode(); + } + public Object removeLast(){ + return removeLastNode(); + } + private Object removeMiddle(int index) { + Node temp = getNodeByIndex(index - 1); + Node removeNode = temp.next; + Object element = removeNode.data; + temp.next = removeNode.next; + removeNode = null; + size--; + return element; + } + + /** + * 检查index index >=0 且 < size + * @param index + * @throws Exception + */ + private void checkIndex(int index) { + if(index < 0){ + throw new RuntimeException("index 必须大于0"); + } + // 越界 + if(index >= size){ + throw new RuntimeException("index 必须小于size:" + size); + } + } + + /** + * 添加head + * @param element + */ + private void addHead(Object element) { + head = new Node(); + head.data = element; + head.next = null; + last = head; + size++; + } + /** + * 插入序号在0-size之间的元素,不包含0和size位置 + * @param index + * @param element + */ + private void insertElement(int index, Object element) { + + Node temp = getNodeByIndex(index); + if(temp != null){ + Node node = new Node(); + node.data = element; + node.next = temp.next; + temp.next = node; + } + size++; + } + /** + * 获取下标为index的元素 + * @param index + * @return + */ + private Node getNodeByIndex(int index) { + Node temp = head; + int i = 0; + + while(i < size){ + if(i == index){ + return temp; + } + temp = temp.next; + i++; + } + + return null; + } + /** + * 移除最后一个元素 + * @return + */ + private Object removeLastNode() { + Node node = getNodeByIndex(size - 2); + Node lastNode = node.next; + Object element = lastNode.data; + lastNode = null; + last = node; + size--; + return element; + } + /** + * 移除第一个元素 + * @return + */ + private Object removeFirstNode() { + Node node = head.next; + Object element = head.data; + head = null; + head = node; + size--; + return element; + } + + + + private static class Node{ + Object data; + Node next; + public Node() { + } + @SuppressWarnings("unused") + public Node(Object data, Node next) { + super(); + this.data = data; + this.next = next; + } + + + } +} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/List.java b/group01/2137642225/work01/src/com/coding/mybasic/List.java new file mode 100644 index 0000000000..7cca6b3f71 --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/mybasic/List.java @@ -0,0 +1,10 @@ +package com.coding.mybasic; + +public interface List { + public void add(Object element); + public void add(int index, Object element); + public Object get(int index); + public Object remove(int index); + public int size(); + public Iterator iterator(); +} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/Queue.java b/group01/2137642225/work01/src/com/coding/mybasic/Queue.java new file mode 100644 index 0000000000..68b17c014e --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/mybasic/Queue.java @@ -0,0 +1,30 @@ +package com.coding.mybasic; + +public class Queue { + private LinkedList linkedList = new LinkedList(); + public void enQueue(Object o){ + linkedList.add(o); + } + + public Object deQueue(){ + checkEmptyQueue(); + return linkedList.remove(0); + } + + public boolean isEmpty(){ + return size() <= 0; + } + + public int size(){ + return linkedList.size(); + } + + /** + * 检查队列是否为空 + */ + private void checkEmptyQueue() { + if(isEmpty()){ + throw new RuntimeException("size:" + size() + " 空队列"); + } + } +} diff --git a/group01/2137642225/work01/src/com/coding/mybasic/Stack.java b/group01/2137642225/work01/src/com/coding/mybasic/Stack.java new file mode 100644 index 0000000000..f89deb457a --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/mybasic/Stack.java @@ -0,0 +1,35 @@ +package com.coding.mybasic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + checkEmptyStack(); + return elementData.remove(size() - 1); + } + + public Object peek(){ + checkEmptyStack(); + Object element = elementData.get(size() - 1); + return element; + } + + public boolean isEmpty(){ + return size() <= 0; + } + public int size(){ + return elementData.size(); + } + /** + * 检查栈是否为空 + */ + private void checkEmptyStack() { + if(isEmpty()){ + throw new RuntimeException("size:" + size() + " 空栈"); + } + } +} diff --git a/group01/2137642225/work01/src/com/coding/test/TestArrayList.java b/group01/2137642225/work01/src/com/coding/test/TestArrayList.java new file mode 100644 index 0000000000..b6669c4b98 --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/test/TestArrayList.java @@ -0,0 +1,81 @@ +package com.coding.test; + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.mybasic.ArrayList; +import com.coding.mybasic.Iterator; +import com.coding.mybasic.List; + +public class TestArrayList { + + private List list; + @Before + public void before() { + list = new ArrayList(); + } + + @Test + public void testAddObject() { + list.add("ele"); + Assert.assertEquals("ele", list.get(0)); + } + + @Test + public void testAddIntObject() { + + for (int i = 0; i < 5; i++) { + list.add(i,i); + Assert.assertEquals(i, list.get(i)); + } + + } + + @Test + public void testGet() { + list.add("ss"); + Assert.assertEquals("ss", list.get(0)); + } + + @Test + public void testRemove() { + list.add("we"); + list.add(1, "gga"); + list.add(0, "start"); + list.add(3, "end"); + + Assert.assertEquals("end", list.remove(3)); + + } + + @Test + public void testSize() { + + for (int i = 0; i < 10; i++) { + list.add(i); + } + + Assert.assertEquals(10, list.size()); + } + + @Test + public void testIterator() { + + for (int i = 0; i < 10; i++) { + list.add(i); + } + Iterator iterator = list.iterator(); + int i = 0; + while(iterator.hasNext()){ + Assert.assertEquals(i++, iterator.next()); + } + } + + @After + public void after(){ + + } +} diff --git a/group01/2137642225/work01/src/com/coding/test/TestBinaryTreeNode.java b/group01/2137642225/work01/src/com/coding/test/TestBinaryTreeNode.java new file mode 100644 index 0000000000..760abd8b9a --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/test/TestBinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.mybasic.BinaryTreeNode; + +public class TestBinaryTreeNode { + + private BinaryTreeNode node; + @Before + public void before(){ + node = new BinaryTreeNode(); + } + + @Test + public void testInsert() { + node.insert(1); + node.insert(0); + node.insert(3); + node.insert(-2); + node.insert(-1); + assertEquals(1, node.getData()); + assertEquals(0, node.getLeft().getData()); + assertEquals(3, node.getRight().getData()); + assertEquals(-2, node.getLeft().getLeft().getData()); + assertEquals(-1, node.getLeft().getLeft().getRight().getData()); + } + +} diff --git a/group01/2137642225/work01/src/com/coding/test/TestLinkedList.java b/group01/2137642225/work01/src/com/coding/test/TestLinkedList.java new file mode 100644 index 0000000000..52ac84016c --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/test/TestLinkedList.java @@ -0,0 +1,73 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.mybasic.Iterator; +import com.coding.mybasic.LinkedList; +import com.coding.mybasic.List; + +public class TestLinkedList { + + private List list; + + @Before + public void before(){ + list = new LinkedList(); + } + + @Test + public void testAddObject() { + list.add(1); + + System.out.println(list.get(0)); + assertEquals(1, list.get(0)); + assertEquals(1, list.size()); + } + + @Test + public void testAddIntObject() { + list.add(0,1); + System.out.println(list.get(0)); + assertEquals(1, list.get(0)); + assertEquals(1, list.size()); + } + + @Test + public void testGet() { + fail("Not yet implemented"); + } + + @Test + public void testRemove() { + list.add(0,1); + System.out.println(list.remove(0)); + assertEquals(0, list.size()); + } + + @Test + public void testSize() { + + for(int i = 0; i < 10; i++){ + list.add(i, i); + } + + assertEquals(10, list.size()); + } + + @Test + public void testIterator() { + + for(int i = 0; i < 10; i++){ + list.add(i, i); + } + Iterator iterator = list.iterator(); + int i = 0; + while(iterator.hasNext()){ + assertEquals(i++, iterator.next()); + } + //iterator.next(); + } +} diff --git a/group01/2137642225/work01/src/com/coding/test/TestQueue.java b/group01/2137642225/work01/src/com/coding/test/TestQueue.java new file mode 100644 index 0000000000..d4eb8288b1 --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/test/TestQueue.java @@ -0,0 +1,36 @@ +package com.coding.test; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.mybasic.Queue; + +public class TestQueue { + + private Queue queue; + @Before + public void before(){ + queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + } + @Test + public void testEnQueue() { + queue.enQueue(3); + assertEquals(3, queue.size()); + } + + @Test + public void testDeQueue() { + assertEquals(2, queue.deQueue()); + assertEquals(1, queue.deQueue()); + } + + @Test + public void testSize() { + assertEquals(2, queue.size()); + } + +} diff --git a/group01/2137642225/work01/src/com/coding/test/TestStack.java b/group01/2137642225/work01/src/com/coding/test/TestStack.java new file mode 100644 index 0000000000..f3bade5eb6 --- /dev/null +++ b/group01/2137642225/work01/src/com/coding/test/TestStack.java @@ -0,0 +1,49 @@ +package com.coding.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.coding.mybasic.Stack; + +public class TestStack { + + private Stack stack; + @Before + public void before() { + stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + } + + @Test + public void testPush() { + assertEquals(3, stack.peek()); + } + + @Test + public void testPop() { + assertEquals(3, stack.pop()); + assertEquals(2, stack.pop()); + assertEquals(1, stack.pop()); + //stack.pop(); + //System.out.println(stack.size()); + } + + @Test + public void testPeek() { + assertEquals(3, stack.peek()); + assertEquals(3, stack.pop()); + assertEquals(2, stack.pop()); + //assertEquals(1, stack.pop()); + assertEquals(1, stack.peek()); + } + + @Test + public void testSize() { + assertEquals(3, stack.size()); + } + +} diff --git a/group01/2137642225/work02/.classpath b/group01/2137642225/work02/.classpath new file mode 100644 index 0000000000..dfa83d7793 --- /dev/null +++ b/group01/2137642225/work02/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group01/2137642225/work02/.gitignore b/group01/2137642225/work02/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group01/2137642225/work02/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group01/2137642225/work02/.project b/group01/2137642225/work02/.project new file mode 100644 index 0000000000..8d10821aba --- /dev/null +++ b/group01/2137642225/work02/.project @@ -0,0 +1,17 @@ + + + work02 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group01/2137642225/work02/.settings/org.eclipse.jdt.core.prefs b/group01/2137642225/work02/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..7341ab1683 --- /dev/null +++ b/group01/2137642225/work02/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/group01/2137642225/work02/README.md b/group01/2137642225/work02/README.md new file mode 100644 index 0000000000..ce9e536748 --- /dev/null +++ b/group01/2137642225/work02/README.md @@ -0,0 +1 @@ +-- 实现数组工具类和读取xml \ No newline at end of file diff --git a/group01/2137642225/work02/src/com/coderising/array/ArrayUtil.java b/group01/2137642225/work02/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..0c3dd816c9 --- /dev/null +++ b/group01/2137642225/work02/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,236 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if (origin != null && origin.length > 1) { + int len = origin.length; + int temp; + for(int left = 0,right = len - 1; left < right; left++,right = len - left - 1){ + temp = origin[left]; + origin[left] = origin[right]; + origin[right] = temp; + } + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray){ + int[] newArray = null; + if (oldArray != null && oldArray.length > 0) { + int[] indexArray = new int[oldArray.length]; + int j = 0; + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i] != 0){ + indexArray[j++] = i; + } + } + newArray = new int[j]; + for (int i = 0; i < j; i++) { + newArray[i] = oldArray[indexArray[i]]; + } + indexArray = null; + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + if(array1 == null || array1.length <= 0){ + return array2; + } + if(array2 == null || array2.length <= 0){ + return array1; + } + int[] tempArray = new int[array1.length + array2.length]; + int i = 0,j = 0,k = 0; + for (; i < array1.length && j < array2.length; ) { + if (array1[i] > array2[j]) { + tempArray[k++] = array2[j++]; + } + else if(array1[i] < array2[j]){ + tempArray[k++] = array1[i++]; + } + else { + tempArray[k++] = array1[i++]; + j++; + } + } + // 以array1为结束点 + if(array1[array1.length - 1] > array2[array2.length - 1]){ + for (; i < array1.length;) { + tempArray[k++] = array1[i++]; + } + } else { // 以array2为结束点 + for (; j < array2.length;) { + tempArray[k++] = array1[j++]; + } + } + int[] mergeArray = new int[k]; + for (int l = 0; l < mergeArray.length; l++) { + mergeArray[l] = tempArray[l]; + } + tempArray = null; + return mergeArray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + if(size <= 0){ + throw new RuntimeException("size大于0"); + } + int[] newArray = null; + if(oldArray != null && oldArray.length > 0){ + newArray = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if(max <= 1){ + return new int[0]; + } + int[] tempArray = new int[max]; + int i = 0; + tempArray[i++] = 1; + tempArray[i] = 1; + while(tempArray[i] < max){ + i++; + tempArray[i] = tempArray[i - 1] + tempArray[i - 2]; + } + int[] array = new int[i]; + for (int j = 0; j < array.length; j++) { + array[j] = tempArray[j]; + } + tempArray = null; + return array; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if(max <= 2){ + return new int[0]; + } + int[] tempArray = new int[max]; + int j = 0; + for (int i = 2; i < max; i++) { + if(isPrime(i)){ + tempArray[j++] = i; + } + } + int[] array = new int[j]; + for (int i = 0; i < j; i++) { + array[i] = tempArray[i]; + } + tempArray = null; + return array; + } + + private boolean isPrime(int i) { + for (int j = 2; j < i; j++) { + if(i % j == 0){ + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + if(max <= 2){ + return new int[0]; + } + int[] tempArray = new int[max]; + int j = 0; + for (int i = 3; i < max; i++) { + if(isPerfectNumber(i)){ + tempArray[j++] = i; + } + } + int[] array = new int[j]; + for (int i = 0; i < j; i++) { + array[i] = tempArray[i]; + } + tempArray = null; + return array; + } + + private boolean isPerfectNumber(int num) { + int sum = 1; + for(int i = 2; i < num; i++){ + if(num % i == 0){ + sum += i; + } + } + if(sum == num){ + return true; + } + return false; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + char[] chars = new char[array.length<<1]; + for (int i = 0,j = 1; i < chars.length; i+=2,j+=2) { + chars[i] = (char) (array[i>>1] + 48); + chars[j] = seperator.charAt(0); + } + return new String(chars, 0, chars.length - 1); + } + + +} diff --git a/group01/2137642225/work02/src/com/coderising/litestruts/LoginAction.java b/group01/2137642225/work02/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group01/2137642225/work02/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group01/2137642225/work02/src/com/coderising/litestruts/Struts.java b/group01/2137642225/work02/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..62a1705c41 --- /dev/null +++ b/group01/2137642225/work02/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,338 @@ +package com.coderising.litestruts; + +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + +@SuppressWarnings("unchecked") +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + if(actionName == null || actionName.trim().equals("")){ + throw new RuntimeException("传入的actionName不能为null或者空"); + } + + // 0. 读取配置文件struts.xml ok + URL resource = Struts.class.getResource("/com/coderising/litestruts"); + String path = ""; + try { + path = URLDecoder.decode(resource.getPath(), "UTF-8"); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Map> actionMap = xmlParse(path + File.separator + "struts.xml"); + + // 找到访问的action通过actionName + Map action = findAction(actionName,actionMap); + + //1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + //据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + //("name"="test" , "password"="1234") , + //那就应该调用 setName和setPassword方法 + // 实例化对象 + String className = (String) action.get("class"); + Class clazz = getActionClassByClassName(className); + Object actionObject = buildActionObject(clazz,parameters); + + //2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + // 执行访问的方法 + String result = (String) executeAccessMethod(actionObject,clazz,"execute"); + + //3. 通过反射找到对象的所有getter方法(例如 getMessage), + //通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + //放到View对象的parameters + Map parameterMap = getActionObjectParameters(actionObject,clazz); + + //4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + //放到View对象的jsp字段中。 + String jsp = getViewPath(action,result); + View v = buildView(jsp,parameterMap); + + return v; + } + + private static Class getActionClassByClassName(String className) { + + if(className == null || className.trim().equals("")){ + throw new RuntimeException("没有配置action的class属性"); + } + + try { + return Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 获取配置文件中视图的路径 + * @param action + * @param result + * @return + */ + private static String getViewPath(Map action, String result) { + + if(result != null && !result.trim().equals("")){ + + List> resultList = (List>) action.get("childElementList"); + + if(resultList != null && !resultList.isEmpty()){ + for (Map map : resultList) { + String readResult = (String) map.get("name"); + if(result.equals(readResult)){ + Object jsp = map.get("text"); + if(jsp == null){ + throw new RuntimeException("未找到与返回结果[" + result + "]之对应的视图"); + } + return (String) jsp; + } + } + } + } + return null; + } + + /** + * 执行访问的方法 + * @param actionObject 访问的action实例化的对象 + * @param clazz 访问的action Class + * @param methodName 访问的方法名称 + * @return 方法的执行结果 + */ + private static Object executeAccessMethod(Object actionObject, Class clazz,String methodName) { + try { + Method method = clazz.getMethod(methodName); + return method.invoke(actionObject); + } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 执行action对象的getter方法,将执行结果放入map中 + * @param actionObject 访问的action实例化的对象 + * @param clazz 访问的action Class + * @return + */ + private static Map getActionObjectParameters(Object actionObject, Class clazz) { + + Map parameterMap = new HashMap<>(); + Object result = null; + Method[] declaredMethods = clazz.getDeclaredMethods(); + Class[] parameterTypes = null; + if (declaredMethods != null && declaredMethods.length > 0) { + try { + for (Method method : declaredMethods) { + if (isGetMethod(method)) { + parameterTypes = method.getParameterTypes(); + result = method.invoke(actionObject, (Object[])parameterTypes); + + String methodName = method.getName(); + // getMessage 截取 M(转小写) + 截取essage + String subMethodName = Character.toLowerCase(methodName.charAt(3)) + + methodName.substring(4, methodName.length()); + + parameterMap.put(subMethodName, result); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return parameterMap; + } + + /** + * 建立action对象 + * @param clazz + * @param parameters 传过来的参数 + * @return + */ + private static Object buildActionObject(@SuppressWarnings("rawtypes") Class clazz, Map parameters) { + + Object actionObj = null; + try { + actionObj = clazz.newInstance(); + // 给action对象的属性设置传过来的参数值 + setProperties(clazz, actionObj, parameters); + return actionObj; + } catch (Exception e) { + e.printStackTrace(); + } + if(actionObj == null){ + throw new RuntimeException("无法实例化action:"); + } + return actionObj; + } + + /** + * 建立View对象 + * @param jsp + * @param parameters + * @return + */ + private static View buildView(String jsp,Map parameters) { + + View v = new View(); + v.setJsp(jsp); + v.setParameters(parameters); + + return v; + } + + /** + * 通过actionName在action列表中查找对应的action(map) + * @param actionName + * @param actionMap action列表 + * @return + */ + private static Map findAction(String actionName, Map> actionMap) { + Map action = (actionMap != null && !actionMap.isEmpty()) ? actionMap.get(actionName) : null; + if(action == null){ + throw new RuntimeException("访问的action[" + actionName + "]不存在"); + } + return action; + } + + /** + * 是否是getter方法 + * @param method2 + * @return + */ + private static boolean isGetMethod(Method method2) { + if(method2.getName().startsWith("get")){ + return true; + } + return false; + } + + /** + * 为Action对象设置属性,也就是执行与参数对应的setter方法 + * @param clazz + * @param actionObj + * @param parameters 参数 + * @throws NoSuchMethodException + * @throws SecurityException + * @throws InstantiationException + * @throws IllegalAccessException + * @throws IllegalArgumentException + * @throws InvocationTargetException + */ + private static void setProperties(@SuppressWarnings("rawtypes") Class clazz, Object actionObj, Map parameters) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + + if(parameters != null && !parameters.isEmpty()){ + Set> entrySet = parameters.entrySet(); + for (Entry entry : entrySet) { + String key = entry.getKey(); + String value = entry.getValue(); + Method method = clazz.getMethod("set" + Character.toUpperCase(key.charAt(0)) + key.substring(1, key.length()),String.class); + method.invoke(actionObj, value); + } + } + } + + /** + * 解析xml配置文件 + * @param xmlFilePath + * @return + */ + private static Map> xmlParse(String xmlFilePath) { + File file = new File(xmlFilePath); + SAXReader saxReader = new SAXReader(); + + Map> actionMap = new HashMap<>(); + try { + Document document = saxReader.read(file); + Element rootElement = document.getRootElement(); + actionMap = readActionElement(rootElement); + return actionMap; + } catch (DocumentException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 读取action节点元素 + * @param rootElement + * @return + */ + private static Map> readActionElement(Element rootElement) { + // 存储所有action的信息 + Map> actionMap = new HashMap<>(); + for (Iterator i = rootElement.elementIterator();i.hasNext();) { + Element element = i.next(); + Map action = readElement(element ); + // 设置actionMap key[action的name] value[action map] + actionMap.put((String) action.get("name"), action); + } + return actionMap; + } + + /** + * 读取元素信息 + * @param element + * @return + */ + private static Map readElement(Element element) { + // 读属性 + Map map = readAttribute(element); + String text = readText(element); + map.put("text", text); + List> childElementList = new ArrayList<>(); + // 查找子元素 + for(Iterator iterator = element.elementIterator();iterator.hasNext();){ + childElementList.add(readElement(iterator.next())); + } + if(childElementList != null && !childElementList.isEmpty()){ + map.put("childElementList", childElementList); + } + return map; + } + + /** + * 读取节点的text "text" + * @param element + * @return + */ + private static String readText(Element element) { + return element.getText(); + } + + + /** + * 读取节点的属性值 + * @param element + * @return map key:属性名称 value:属性值 + */ + private static Map readAttribute(Element element) { + Map attrMap = new HashMap<>(); + for (Iterator a = element.attributeIterator();a.hasNext();) { + Attribute attr = a.next(); + attrMap.put(attr.getName(), attr.getData()); + } + return attrMap; + } + +} diff --git a/group01/2137642225/work02/src/com/coderising/litestruts/StrutsTest.java b/group01/2137642225/work02/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..252e901ac0 --- /dev/null +++ b/group01/2137642225/work02/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,44 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group01/2137642225/work02/src/com/coderising/litestruts/View.java b/group01/2137642225/work02/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..61e195c105 --- /dev/null +++ b/group01/2137642225/work02/src/com/coderising/litestruts/View.java @@ -0,0 +1,26 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + @SuppressWarnings("rawtypes") + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + @SuppressWarnings("rawtypes") + public Map getParameters() { + return parameters; + } + @SuppressWarnings("rawtypes") + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/2137642225/work02/src/com/coderising/litestruts/struts.xml b/group01/2137642225/work02/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..6f23f0a83d --- /dev/null +++ b/group01/2137642225/work02/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/2137642225/work02/src/com/coderising/test/ArrayUtilTest.java b/group01/2137642225/work02/src/com/coderising/test/ArrayUtilTest.java new file mode 100644 index 0000000000..adce8033da --- /dev/null +++ b/group01/2137642225/work02/src/com/coderising/test/ArrayUtilTest.java @@ -0,0 +1,76 @@ +package com.coderising.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.coderising.array.ArrayUtil; + +public class ArrayUtilTest { + + private ArrayUtil arrayUtil; + @Before + public void setUp() throws Exception { + arrayUtil = new ArrayUtil(); + } + + @Test + public void testReverseArray() { + int[] array = new int[]{7, 9, 30, 3, 4}; + arrayUtil.reverseArray(array); + assertArrayEquals(new int[]{4,3,30,9,7}, array); + } + + @Test + public void testRemoveZero() { + int[] oldArray = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] newArray = arrayUtil.removeZero(oldArray); + assertEquals(12, newArray.length); + assertArrayEquals(new int[]{1,3,4,5,6,6,5,4,7,6,7,5}, newArray); + } + + @Test + public void testMerge() { + int[] array1 = new int[]{3, 5, 7,8}; + int[] array2 = new int[]{4, 5, 6,7}; + int[] merge = arrayUtil.merge(array1, array2); + assertArrayEquals(new int[]{3,4,5,6,7,8}, merge); + assertEquals(6, merge.length); + } + + @Test + public void testGrow() { + int[] array = new int[]{2,3,6}; + int[] grow = arrayUtil.grow(array, 3); + assertArrayEquals(new int[]{2,3,6,0,0,0}, grow); + assertEquals(6, grow.length); + } + + @Test + public void testFibonacci() { + int[] fibonacci = arrayUtil.fibonacci(15); + assertArrayEquals(new int[]{1,1,2,3,5,8,13}, fibonacci); + assertEquals(7, fibonacci.length); + } + + @Test + public void testGetPrimes() { + int[] primes = arrayUtil.getPrimes(23); + assertArrayEquals(new int[]{2,3,5,7,11,13,17,19}, primes); + assertEquals(8, primes.length); + } + + @Test + public void testGetPerfectNumbers() { + int[] perfectNumbers = arrayUtil.getPerfectNumbers(1000); + assertArrayEquals(new int[]{6,28,496}, perfectNumbers); + } + + @Test + public void testJoin() { + String join = arrayUtil.join(new int[]{3,8,9}, "-"); + assertEquals("3-8-9", join); + } + +} diff --git a/group01/275150374/275150374Learning/src/task01/ArrayList.java b/group01/275150374/275150374Learning/src/task01/ArrayList.java new file mode 100644 index 0000000000..8d604f109e --- /dev/null +++ b/group01/275150374/275150374Learning/src/task01/ArrayList.java @@ -0,0 +1,86 @@ +package task01; + +import java.util.Arrays; + +/**第一周作业 + * 自己实现一个 ArrayList + * Created by eurry on 2017/2/26. + */ +public class ArrayList { + /** + * ArrayList的长度 + */ + private int size = 0; + + private Object[] elementData = {}; + + public void add(Object o){ + elementData = Arrays.copyOf(elementData, size+1); + elementData[size] = o; + size++; + } + + public void add(int index, Object o){ + if(index < size){ + elementData = Arrays.copyOf(elementData, size+1); + System.arraycopy(elementData, index, elementData, index+1, size-index); + elementData[index] = o; + size++; + }else{ + elementData = Arrays.copyOf(elementData, index+1); + elementData[index] = o; + size = index+1; + } + } + + public Object get(int index){ + if(index < size){ + return elementData[index]; + }else{ + throw new IndexOutOfBoundsException("导致对数组范围以外的数据的访问"); + } + } + + public Object remove(int index){ + if(index < size){ + Object re = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, size-index-1); + elementData = Arrays.copyOf(elementData, size-1); + size--; + return re; + }else{ + throw new IndexOutOfBoundsException("导致对数组范围以外的数据的访问"); + } + } + + public int size(){ + return size; + } + + public String toString(){ + String str = null; + if(elementData.length > 0){ + str = ""; + for (Object anElementData : elementData) { + str += anElementData.toString() + ","; + } + str = str.substring(0, str.length()-1); + } + return str; + } + + /** + * 测试 + */ + public static void main(String[] str){ + ArrayList list = new ArrayList(); + list.add("A"); + list.add("B"); + list.add(1, "C"); + list.add("D"); + Object d = list.get(3); + Object dd = list.remove(3); + System.out.println(list.size()); + System.out.println(list.toString()); + } +} diff --git a/group01/275150374/275150374Learning/src/task01/LinkedList.java b/group01/275150374/275150374Learning/src/task01/LinkedList.java new file mode 100644 index 0000000000..23eb1adaae --- /dev/null +++ b/group01/275150374/275150374Learning/src/task01/LinkedList.java @@ -0,0 +1,162 @@ +package task01; + +import java.util.Arrays; + +/**第一周作业 + * 自己实现一个 LinkedList + * Created by eurry on 2017/2/26. + */ +public class LinkedList { + + private int size = 0; + private Node head=null; + + public void add(Object o){ + if(size == 0){ + head = new Node(o); + }else{ + Node next = head; + while(next.next != null){ + next = next.next; + } + next.next = new Node(o); + } + size++; + } + + public void add(int index, Object o){ + if(index <= size){ + if(size == 0){ + add(o); + }else{ + if(index==0){ + addFirst(o); + }else if(index==size){ + add(o); + }else{ + Node next = head; + for(int i=0; i 0){ + Node ele = null; + Node next = head; + for(int i=0; i + + + root + com.coding2017 + 1.0-SNAPSHOT + + 4.0.0 + + basic + + + + org.jvnet.hudson.dom4j + dom4j + + + com.google.guava + guava + + + + junit + junit + + + junit + junit-dep + + + + + \ No newline at end of file diff --git a/group01/280646174/basic/src/main/java/com/coding2017/array/ArrayUtil.java b/group01/280646174/basic/src/main/java/com/coding2017/array/ArrayUtil.java new file mode 100644 index 0000000000..aca4036e16 --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/array/ArrayUtil.java @@ -0,0 +1,275 @@ +package com.coding2017.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if (nullOrEmpty(origin) || origin.length == 1) { + return; + } + + int length = origin.length; + for (int i = 0; i < length / 2; i++) { + swap(origin, i, length - 1 - i); + } + } + + private void swap(int[] array, int index1, int index2) { + int temp = array[index1]; + array[index1] = array[index2]; + array[index2] = temp; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray) { + if (nullOrEmpty(oldArray)) { + return new int[0]; + } + + int[] tempArray = new int[oldArray.length]; + int newLength = 0; + for (int e : oldArray) { + if (e != 0) { + tempArray[newLength++] = e; + } + } + int[] newArray = new int[newLength]; + System.arraycopy(tempArray, 0, newArray, 0, newLength); + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 + * 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + public int[] merge(int[] array1, int[] array2) { + if (nullOrEmpty(array1)) { + return array2; + } + if (nullOrEmpty(array2)) { + return array1; + } + + int index1 = 0; + int index2 = 0; + int length1 = array1.length; + int length2 = array2.length; + int[] tempArray = new int[length1 + length2]; + int pos = 0; + while (index1 < length1 && index2 < length2) { + if (array1[index1] == array2[index2]) { + // 元素相同情况下, 忽略其中一个 + index1++; + } else if (array1[index1] < array2[index2]) { + tempArray[pos++] = array1[index1++]; + } else { + tempArray[pos++] = array2[index2++]; + } + } + + while (index1 < length1) { + tempArray[pos++] = array1[index1++]; + } + while (index2 < length2) { + tempArray[pos++] = array2[index2++]; + } + + if (pos == tempArray.length) { + return tempArray; + } + int[] result = new int[pos]; + System.arraycopy(tempArray, 0, result, 0, pos); + return result; + } + + private boolean nullOrEmpty(int[] array) { + return array == null || array.length == 0; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = + * 3,则返回的新数组为 [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + assert oldArray != null; + assert size >= 0; + + int[] result = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, result, 0, oldArray.length); + return result; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max <= 1) { + return new int[0]; + } + int f1 = 1; + int f2 = 1; + // 超过max的那个pos, 也就是最终长度 + int maxPos = 2; + while (true) { + int curData = f1 + f2; + if (curData > max) { + break; + } + f1 = f2; + f2 = curData; + maxPos++; + } + + int[] result = new int[maxPos]; + f1 = 1; + f2 = 1; + for (int i = 0; i < maxPos; i++) { + if (i == 0 || i == 1) { + result[i] = 1; + } else { + result[i] = f1 + f2; + f1 = f2; + f2 = result[i]; + } + } + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + if (max <= 2) { + return new int[0]; + } + + boolean[] data = new boolean[max]; + + // 1. 把2放置为true + data[2] = true; + + // 2. 把奇数首先初始化为true + for (int i = 3; i < max; i += 2) { + data[i] = true; + } + + // 3. 从3开始到max/2检查素数, 然后把这个数的倍数全都置为false + for (int i = 3; i < max / 2; i += 2) { + data[i] = isPrime(i); + for (int j = 3; i * j < max; j += 2) { + data[i * j] = false; + } + } + + // 4. 查一共多少个 + int primeCount = 0; + for (int i = 0; i < max; i++) { + if (data[i]) { + primeCount++; + } + } + + // 5. 构造结果 + int[] result = new int[primeCount]; + int pos = 0; + for (int i = 0; i < max; i++) { + if (data[i]) { + result[pos++] = i; + } + } + return result; + } + + private boolean isPrime(int n) { + for (int i = 2; i <= n / 2; i++) { + if (n % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + boolean[] data = new boolean[max]; + int count = 0; + for (int i = 0; i < max; i++) { + if (isPerfectNumber(i)) { + data[i] = true; + count++; + } + } + + int[] result = new int[count]; + int pos = 0; + for (int i = 0; i < max; i++) { + if (data[i]) { + result[pos++] = i; + } + } + return result; + } + + private boolean isPerfectNumber(int n) { + if (n <= 0) { + return false; + } + + int temp = 0; + for (int i = 1; i <= n / 2; i++) { + if (n % i == 0) { + temp += i; + } + } + + return temp == n; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + if (nullOrEmpty(array)) { + return ""; + } + StringBuilder builder = new StringBuilder(String.valueOf(array[0])); + for (int i = 1; i < array.length; i++) { + builder.append(seperator).append(array[i]); + } + return builder.toString(); + } +} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/ArrayList.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/ArrayList.java new file mode 100644 index 0000000000..a4199bdbdb --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/basic/ArrayList.java @@ -0,0 +1,100 @@ +package com.coding2017.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[4]; + + public void add(Object o) { + if (noSpace()) { + extendSpace(); + } + + elementData[size++] = o; + } + + private void extendSpace() { + elementData = Arrays.copyOf(elementData, elementData.length * 2); + } + + private boolean noSpace() { + return size == elementData.length; + } + + public void add(int index, Object o) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + if (noSpace()) { + extendSpace(); + } + + if (index == size) { + add(o); + return; + } + + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + return elementData[index]; + } + + public Object remove(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + if (index == size - 1) { + return elementData[--size]; + } + + Object removed = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return removed; + } + + public int size() { + return size; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder("["); + if (size > 0) { + builder.append(get(0)); + } + for (int i = 1; i < size; i++) { + builder.append(", ").append(get(i)); + } + builder.append("]"); + return builder.toString(); + } + + public Iterator iterator() { + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator { + private int pos; + + @Override + public boolean hasNext() { + return pos < size(); + } + + @Override + public Object next() { + return ArrayList.this.get(pos++); + } + } +} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/BinaryTreeNode.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..acf4798b9e --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/basic/BinaryTreeNode.java @@ -0,0 +1,57 @@ +package com.coding2017.basic; + +public class BinaryTreeNode { + + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode insert(Integer o) { + if (o <= data) { + if (left == null) { + left = new BinaryTreeNode(o); + return left; + } + return left.insert(o); + } else { + if (right == null) { + right = new BinaryTreeNode(o); + return right; + } + return right.insert(o); + } + } + + public BinaryTreeNode(Integer data) { + this.data = data; + } + + public Integer getData() { + return data; + } + + public void setData(Integer data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + @Override + public String toString() { + return data + " " + left + " " + right; + } +} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/Iterator.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/Iterator.java new file mode 100644 index 0000000000..19e214cfbb --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding2017.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/LinkedList.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/LinkedList.java new file mode 100644 index 0000000000..5aeeb7c7f8 --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/basic/LinkedList.java @@ -0,0 +1,179 @@ +package com.coding2017.basic; + +public class LinkedList implements List { + + private Node head; + + private Node tail; + + private int size; + + public void add(Object o) { + addLast(o); + } + + public void add(int index, Object o) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + if (index == size) { + addLast(o); + } else if (index == 0) { + addFirst(o); + } else { + Node node = new Node(o); + Node prevNode = getNode(index - 1); + Node nextNode = prevNode.next; + prevNode.next = node; + node.prev = prevNode; + nextNode.prev = node; + node.next = nextNode; + size++; + } + } + + private Node getNode(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + Node node = head; + for (int j = 0; j < index; j++) { + node = node.next; + } + return node; + } + + public Object get(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + return getNode(index).data; + } + + public Object remove(int index) { + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(); + } + + if (index == 0) { + return removeFirst(); + } else if (index == size - 1) { + return removeLast(); + } else { + Node node = getNode(index); + node.prev.next = node.next; + node.next.prev = node.prev; + size--; + return node.data; + } + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node node = new Node(o); + if (size == 0) { + head = node; + tail = node; + } else { + head.prev = node; + node.next = head; + head = node; + } + size++; + } + + public void addLast(Object o) { + if (size == 0) { + addFirst(o); + } else { + Node node = new Node(o); + tail.next = node; + node.prev = tail; + tail = node; + size++; + } + } + + public Object removeFirst() { + if (size == 0) { + throw new IndexOutOfBoundsException(); + } + Node node = head; + if (size == 1) { + head = null; + tail = null; + size--; + } else { + head.next.prev = null; + head = head.next; + size--; + } + return node.data; + } + + public Object removeLast() { + if (size == 0) { + throw new IndexOutOfBoundsException(); + } + if (size == 1) { + return removeFirst(); + } + Node node = tail; + tail.prev.next = null; + tail = tail.prev; + size--; + return node.data; + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder("["); + if (size > 0) { + builder.append(get(0)); + } + for(Node node = head.next; node != null; node = node.next) { + builder.append(", ").append(node.data); + } + builder.append("]"); + return builder.toString(); + } + + private static class Node { + private Object data; + private Node next; + private Node prev; + + public Node() {} + + private Node(Object data) { + this.data = data; + } + } + + private class LinkedListIterator implements Iterator { + private Node node; + + public LinkedListIterator() { + this.node = LinkedList.this.head; + } + + @Override + public boolean hasNext() { + return node != null; + } + + @Override + public Object next() { + Node temp = node; + node = node.next; + return temp.data; + } + } +} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/List.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/List.java new file mode 100644 index 0000000000..0fee4d7a42 --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/basic/List.java @@ -0,0 +1,13 @@ +package com.coding2017.basic; + +public interface List { + void add(Object o); + + void add(int index, Object o); + + Object get(int index); + + Object remove(int index); + + int size(); +} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/Queue.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/Queue.java new file mode 100644 index 0000000000..f611b874e0 --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/basic/Queue.java @@ -0,0 +1,22 @@ +package com.coding2017.basic; + +public class Queue { + + LinkedList list = new LinkedList(); + + public void enQueue(Object o) { + list.addLast(o); + } + + public Object deQueue() { + return list.removeFirst(); + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } +} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/Stack.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/Stack.java new file mode 100644 index 0000000000..3ec7b5788b --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/basic/Stack.java @@ -0,0 +1,25 @@ +package com.coding2017.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + return elementData.remove(elementData.size() - 1); + } + + public Object peek() { + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/litestruts/LoginAction.java b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/LoginAction.java new file mode 100644 index 0000000000..e03337fbd3 --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/LoginAction.java @@ -0,0 +1,42 @@ +package com.coding2017.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/litestruts/Struts.java b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/Struts.java new file mode 100644 index 0000000000..eba40d8412 --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/Struts.java @@ -0,0 +1,127 @@ +package com.coding2017.litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import com.google.common.base.Strings; + +public class Struts { + + private static final String STRUTS_FILE_PATH = "/struts.xml"; + + private static final String ACTION_EXECUTE_METHOD = "execute"; + + /** + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + * ("name"="test" , "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, 放到View对象的jsp字段中。 + * + * @param actionName + * @param parameters + * @return + */ + public static View runAction(String actionName, Map parameters) { + + if (Strings.isNullOrEmpty(actionName)) { + return null; + } + + StrutsDefinition strutsDefinition = StrutsXmlUtil + .parseResource(Struts.class.getResourceAsStream(STRUTS_FILE_PATH)); + if (strutsDefinition == null) { + return null; + } + StrutsDefinition.ActionDefinition actionDefinition = findActionDefinition(strutsDefinition, actionName); + if (actionDefinition == null) { + return null; + } + try { + Class actionClass = Class.forName(actionDefinition.getClazz()); + Object action = actionClass.newInstance(); + setParameter(actionClass, action, parameters); + + Method executeMethod = actionClass.getMethod(ACTION_EXECUTE_METHOD); + String actionResult = (String) executeMethod.invoke(action); + + StrutsDefinition.ResultDefinition resultDefinition = findResultDefinition(actionDefinition, actionResult); + if (resultDefinition == null) { + return null; + } + + View view = new View(); + view.setJsp(resultDefinition.getValue()); + view.setParameters(makeParameters(action, actionClass)); + return view; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + private static Map makeParameters(Object action, Class actionClass) + throws InvocationTargetException, IllegalAccessException { + Method[] methods = actionClass.getMethods(); + Map map = new HashMap(); + for (Method method : methods) { + if (method.getName().startsWith("get")) { + map.put(getField(method.getName()), method.invoke(action)); + } + } + return map; + } + + private static String getField(String getMethodName) { + String field = getMethodName.substring(3); + return field.substring(0, 1).toLowerCase() + field.substring(1); + } + + private static StrutsDefinition.ResultDefinition findResultDefinition( + StrutsDefinition.ActionDefinition actionDefinition, String actionResult) { + for (StrutsDefinition.ResultDefinition resultDefinition : actionDefinition.getResultDefinitions()) { + if (resultDefinition.getName().equals(actionResult)) { + return resultDefinition; + } + } + return null; + } + + private static void setParameter(Class actionClass, Object action, Map parameters) + throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { + for (Map.Entry paramEntry : parameters.entrySet()) { + String setMethodName = getMethodName(paramEntry.getKey()); + Method method = actionClass.getMethod(setMethodName, String.class); + method.invoke(action, paramEntry.getValue()); + } + } + + private static String getMethodName(String field) { + return "set" + field.substring(0, 1).toUpperCase() + field.substring(1); + } + + private static StrutsDefinition.ActionDefinition findActionDefinition(StrutsDefinition strutsDefinition, + String actionName) { + for (StrutsDefinition.ActionDefinition definition : strutsDefinition.getActionDefinitionList()) { + if (actionName.equals(definition.getName())) { + return definition; + } + } + return null; + } + +} diff --git a/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsDefinition.java b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsDefinition.java new file mode 100644 index 0000000000..a54c3c9eb7 --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsDefinition.java @@ -0,0 +1,69 @@ +package com.coding2017.litestruts; + +import java.util.List; + +/** + * Created by kaitao.li on 2017/3/4. + */ +public class StrutsDefinition { + private List actionDefinitionList; + + public List getActionDefinitionList() { + return actionDefinitionList; + } + + public void setActionDefinitionList(List actionDefinitionList) { + this.actionDefinitionList = actionDefinitionList; + } + + public static class ActionDefinition { + private String name; + private String clazz; + private List resultDefinitions; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClazz() { + return clazz; + } + + public void setClazz(String clazz) { + this.clazz = clazz; + } + + public List getResultDefinitions() { + return resultDefinitions; + } + + public void setResultDefinitions(List resultDefinitions) { + this.resultDefinitions = resultDefinitions; + } + } + + public static class ResultDefinition { + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } +} \ No newline at end of file diff --git a/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsXmlUtil.java b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsXmlUtil.java new file mode 100644 index 0000000000..b6f15ddb90 --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/StrutsXmlUtil.java @@ -0,0 +1,58 @@ +package com.coding2017.litestruts; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +/** + * Created by kaitao.li on 2017/3/4. + */ +public class StrutsXmlUtil { + + public static StrutsDefinition parseResource(InputStream inputStream) { + + SAXReader saxReader = new SAXReader(); + Document document; + try { + document = saxReader.read(inputStream); + } catch (DocumentException e) { + throw new RuntimeException("解析xml出错"); + } + + // 获取根节点对象 + Element rootElement = document.getRootElement(); + StrutsDefinition strutsDefinition = new StrutsDefinition(); + Iterator actionIterator = rootElement.elements("action").iterator(); + List actionDefinitions = new ArrayList(); + strutsDefinition.setActionDefinitionList(actionDefinitions); + while (actionIterator.hasNext()) { + Element actionElement = actionIterator.next(); + StrutsDefinition.ActionDefinition actionDefinition = new StrutsDefinition.ActionDefinition(); + actionDefinition.setName(actionElement.attributeValue("name")); + actionDefinition.setClazz(actionElement.attributeValue("class")); + actionDefinitions.add(actionDefinition); + + Iterator resultIterator = actionElement.elements("result").iterator(); + List resultDefinitions = new ArrayList(); + actionDefinition.setResultDefinitions(resultDefinitions); + while (resultIterator.hasNext()) { + Element resultElement = resultIterator.next(); + StrutsDefinition.ResultDefinition resultDefinition = new StrutsDefinition.ResultDefinition(); + resultDefinition.setName(resultElement.attributeValue("name")); + resultDefinition.setValue(resultElement.getTextTrim()); + resultDefinitions.add(resultDefinition); + } + } + return strutsDefinition; + } + + public static void main(String[] args) { + StrutsXmlUtil.parseResource(StrutsXmlUtil.class.getResourceAsStream("/struts.xml")); + } +} \ No newline at end of file diff --git a/group01/280646174/basic/src/main/java/com/coding2017/litestruts/View.java b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/View.java new file mode 100644 index 0000000000..af3374ce24 --- /dev/null +++ b/group01/280646174/basic/src/main/java/com/coding2017/litestruts/View.java @@ -0,0 +1,26 @@ +package com.coding2017.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/280646174/basic/src/main/resources/struts.xml b/group01/280646174/basic/src/main/resources/struts.xml new file mode 100644 index 0000000000..01fc673ed6 --- /dev/null +++ b/group01/280646174/basic/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/array/ArrayUtilTest.java b/group01/280646174/basic/src/test/java/com/coding2017/array/ArrayUtilTest.java new file mode 100644 index 0000000000..23f650dd57 --- /dev/null +++ b/group01/280646174/basic/src/test/java/com/coding2017/array/ArrayUtilTest.java @@ -0,0 +1,72 @@ +package com.coding2017.array; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Created by kaitao.li on 2017/3/4. + */ +public class ArrayUtilTest { + + private ArrayUtil arrayUtil = new ArrayUtil(); + + @Test + public void reverseArray() throws Exception { + int[] oddArray = new int[] { 1, 2, 3 }; + arrayUtil.reverseArray(oddArray); + assertArrayEquals(oddArray, new int[] { 3, 2, 1 }); + + int[] evenArray = new int[] { 1, 2, 3, 4 }; + arrayUtil.reverseArray(evenArray); + assertArrayEquals(evenArray, new int[] { 4, 3, 2, 1 }); + } + + @Test + public void removeZero() throws Exception { + int oldArr[] = new int[] { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 }; + int[] newArray = arrayUtil.removeZero(oldArr); + assertArrayEquals(newArray, new int[] { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }); + } + + @Test + public void merge() throws Exception { + int[] a1 = new int[] { 3, 5, 7, 8 }; + int[] a2 = new int[] { 4, 5, 6, 7 }; + int[] merge = arrayUtil.merge(a1, a2); + assertArrayEquals(merge, new int[] { 3, 4, 5, 6, 7, 8 }); + } + + @Test + public void grow() throws Exception { + int[] oldArray = new int[] { 2, 3, 6 }; + int[] grow = arrayUtil.grow(oldArray, 3); + assertArrayEquals(grow, new int[] { 2, 3, 6, 0, 0, 0 }); + } + + @Test + public void fibonacci() throws Exception { + int[] fibonacci = arrayUtil.fibonacci(15); + assertArrayEquals(fibonacci, new int[] { 1, 1, 2, 3, 5, 8, 13 }); + } + + @Test + public void getPrimes() throws Exception { + int[] primes = arrayUtil.getPrimes(23); + assertArrayEquals(primes, new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }); + } + + @Test + public void getPerfectNumbers() throws Exception { + int[] perfectNumbers = arrayUtil.getPerfectNumbers(1000); + assertArrayEquals(perfectNumbers, new int[] { 6, 28, 496 }); + } + + @Test + public void join() throws Exception { + int[] array = new int[] { 1, 2, 3 }; + assertTrue("1-2-3".equals(arrayUtil.join(array, "-"))); + } + +} \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/basic/ArrayListTest.java b/group01/280646174/basic/src/test/java/com/coding2017/basic/ArrayListTest.java new file mode 100644 index 0000000000..21e9d59694 --- /dev/null +++ b/group01/280646174/basic/src/test/java/com/coding2017/basic/ArrayListTest.java @@ -0,0 +1,79 @@ +package com.coding2017.basic; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by kaitao.li on 17/2/21. + */ +public class ArrayListTest { + @Test + public void testAdd() throws Exception { + ArrayList arrayList = new ArrayList(); + arrayList.add("0"); + Assert.assertTrue(arrayList.get(0).equals("0")); + } + + @Test + public void testAddWithIndex() throws Exception { + ArrayList arrayList = new ArrayList(); + arrayList.add("0"); + arrayList.add("1"); + arrayList.add(1, "2"); + Assert.assertTrue(arrayList.get(1).equals("2")); + Assert.assertTrue(arrayList.get(2).equals("1")); + Assert.assertTrue(arrayList.size() == 3); + } + + @Test + public void get() throws Exception { + ArrayList arrayList = new ArrayList(); + arrayList.add("0"); + arrayList.add("1"); + Assert.assertTrue(arrayList.get(1).equals("1")); + } + + @Test + public void remove() throws Exception { + ArrayList arrayList = new ArrayList(); + arrayList.add("0"); + arrayList.add("1"); + arrayList.add("2"); + Object remove = arrayList.remove(1); + Assert.assertTrue(remove.equals("1")); + Assert.assertTrue(arrayList.size() == 2); + } + + @Test + public void size() throws Exception { + ArrayList arrayList = new ArrayList(); + arrayList.add("0"); + arrayList.add("1"); + Assert.assertEquals(arrayList.size(), 2); + } + + @Test + public void testExtend() { + ArrayList arrayList = new ArrayList(); + arrayList.add("0"); + arrayList.add("1"); + arrayList.add("2"); + arrayList.add("3"); + arrayList.add("4"); + Assert.assertTrue(arrayList.get(4).equals("4")); + } + + @Test + public void iterator() throws Exception { + ArrayList arrayList = new ArrayList(); + arrayList.add("0"); + arrayList.add("1"); + Iterator iterator = arrayList.iterator(); + Assert.assertTrue(iterator.hasNext()); + Assert.assertTrue(iterator.next().equals("0")); + Assert.assertTrue(iterator.hasNext()); + Assert.assertTrue(iterator.next().equals("1")); + Assert.assertTrue(!iterator.hasNext()); + } + +} \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/basic/BinaryTreeNodeTest.java b/group01/280646174/basic/src/test/java/com/coding2017/basic/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..3a9877c596 --- /dev/null +++ b/group01/280646174/basic/src/test/java/com/coding2017/basic/BinaryTreeNodeTest.java @@ -0,0 +1,24 @@ +package com.coding2017.basic; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by kaitao.li on 17/2/24. + */ +public class BinaryTreeNodeTest { + + @Test + public void insert() throws Exception { + BinaryTreeNode binaryTreeNode = new BinaryTreeNode(5); + binaryTreeNode.insert(4); + binaryTreeNode.insert(6); + binaryTreeNode.insert(5); + assertTrue(binaryTreeNode.getLeft().getData() == 4); + assertTrue(binaryTreeNode.getRight().getData() == 6); + assertTrue(binaryTreeNode.getLeft().getRight().getData() == 5); + System.out.println(binaryTreeNode); + } + +} \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/basic/LinkedListTest.java b/group01/280646174/basic/src/test/java/com/coding2017/basic/LinkedListTest.java new file mode 100644 index 0000000000..f6855d3583 --- /dev/null +++ b/group01/280646174/basic/src/test/java/com/coding2017/basic/LinkedListTest.java @@ -0,0 +1,83 @@ +package com.coding2017.basic; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by kaitao.li on 17/2/21. + */ +public class LinkedListTest { + @Test + public void testAdd() throws Exception { + LinkedList list = new LinkedList(); + list.add("0"); + Assert.assertTrue(list.get(0).equals("0")); + } + + @Test + public void testAddWithIndex() throws Exception { + LinkedList list = new LinkedList(); + list.add("0"); + list.add("1"); + list.add(1, "2"); + Assert.assertTrue(list.get(1).equals("2")); + Assert.assertTrue(list.get(2).equals("1")); + Assert.assertTrue(list.size() == 3); + } + + @Test + public void get() throws Exception { + LinkedList list = new LinkedList(); + list.add("0"); + list.add("1"); + Assert.assertTrue(list.get(1).equals("1")); + } + + @Test + public void remove() throws Exception { + LinkedList list = new LinkedList(); + list.add("0"); + list.add("1"); + list.add("2"); + Object remove = list.remove(1); + Assert.assertTrue(remove.equals("1")); + Assert.assertTrue(list.size() == 2); + } + + @Test + public void size() throws Exception { + LinkedList list = new LinkedList(); + list.add("0"); + list.add("1"); + Assert.assertEquals(list.size(), 2); + } + + @Test + public void testAddFirst() { + LinkedList list = new LinkedList(); + list.addFirst("0"); + Assert.assertTrue(list.get(0).equals("0")); + list.addFirst("1"); + Assert.assertTrue(list.get(0).equals("1")); + list.removeFirst(); + Assert.assertTrue(list.get(0).equals("0")); + list.removeLast(); + Assert.assertTrue(list.size() == 0); + } + + @Test + public void iterator() throws Exception { + ArrayList arrayList = new ArrayList(); + arrayList.add("0"); + arrayList.add("1"); + Iterator iterator = arrayList.iterator(); + Assert.assertTrue(iterator.hasNext()); + Assert.assertTrue(iterator.next().equals("0")); + Assert.assertTrue(iterator.hasNext()); + Assert.assertTrue(iterator.next().equals("1")); + Assert.assertTrue(!iterator.hasNext()); + } + +} \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/basic/QueueTest.java b/group01/280646174/basic/src/test/java/com/coding2017/basic/QueueTest.java new file mode 100644 index 0000000000..5fde883433 --- /dev/null +++ b/group01/280646174/basic/src/test/java/com/coding2017/basic/QueueTest.java @@ -0,0 +1,23 @@ +package com.coding2017.basic; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by kaitao.li on 17/2/21. + */ +public class QueueTest { + @Test + public void enQueue() throws Exception { + Queue queue = new Queue(); + queue.enQueue(1); + queue.enQueue(2); + Assert.assertTrue(queue.size() == 2); + Assert.assertTrue(queue.deQueue().equals(1)); + Assert.assertTrue(queue.deQueue().equals(2)); + Assert.assertTrue(queue.isEmpty()); + } + +} \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/basic/StackTest.java b/group01/280646174/basic/src/test/java/com/coding2017/basic/StackTest.java new file mode 100644 index 0000000000..145d22d371 --- /dev/null +++ b/group01/280646174/basic/src/test/java/com/coding2017/basic/StackTest.java @@ -0,0 +1,24 @@ +package com.coding2017.basic; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by kaitao.li on 17/2/21. + */ +public class StackTest { + @Test + public void push() throws Exception { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + Assert.assertTrue(stack.size() == 2); + Assert.assertTrue(stack.peek().equals(2)); + Assert.assertTrue(stack.pop().equals(2)); + Assert.assertTrue(stack.pop().equals(1)); + Assert.assertTrue(stack.isEmpty()); + } + +} \ No newline at end of file diff --git a/group01/280646174/basic/src/test/java/com/coding2017/litestruts/StrutsTest.java b/group01/280646174/basic/src/test/java/com/coding2017/litestruts/StrutsTest.java new file mode 100644 index 0000000000..3d877a0eab --- /dev/null +++ b/group01/280646174/basic/src/test/java/com/coding2017/litestruts/StrutsTest.java @@ -0,0 +1,38 @@ +package com.coding2017.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); // 密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group01/280646174/pom.xml b/group01/280646174/pom.xml new file mode 100644 index 0000000000..75422ec638 --- /dev/null +++ b/group01/280646174/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.coding2017 + root + pom + 1.0-SNAPSHOT + + basic + + + + 4.12 + 4.11 + + + + + + org.jvnet.hudson.dom4j + dom4j + 1.6.1-hudson-3 + + + + com.google.guava + guava + 20.0 + + + + junit + junit + ${junit.junit.version} + test + + + junit + junit-dep + ${junit.junit-dep.version} + test + + + + + \ No newline at end of file diff --git a/group01/349209948/.gitignore b/group01/349209948/.gitignore new file mode 100644 index 0000000000..b3d8633e2b --- /dev/null +++ b/group01/349209948/.gitignore @@ -0,0 +1,3 @@ +/bin/ +*.project +*.classpath \ No newline at end of file diff --git a/group01/349209948/src/week1_0226/ArrayList.java b/group01/349209948/src/week1_0226/ArrayList.java new file mode 100644 index 0000000000..57d25187f8 --- /dev/null +++ b/group01/349209948/src/week1_0226/ArrayList.java @@ -0,0 +1,68 @@ +package week1_0226; +import java.util.Arrays; +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + ensureCapacity(size + 1); + elementData[size++] = o; + } + private void ensureCapacity(int size){ + if (size > elementData.length){ + grow(); + } + } + private void grow(){ + elementData = Arrays.copyOf(elementData, size * 2); + } + public void add(int index, Object o){ + rangeCheckForAdd(index); + ensureCapacity(size + 1); + System.arraycopy(elementData,index, elementData, index + 1, size - index); + elementData[index] = o; + size ++; + } + private void rangeCheckForAdd(int index){ + //index = size时不需要报错? + if (index > size || index < 0){ + throw new IndexOutOfBoundsException(); + } + } + public Object get(int index){ + rangeCheck(index); + return elementData[index]; + } + private void rangeCheck(int index){ + if (index >= size || index < 0){ + throw new IndexOutOfBoundsException(); + } + } + + public Object remove(int index){ + rangeCheck(index); + Object dest = elementData[index]; + System.arraycopy(elementData, index +1, elementData, index, size-index-1); + size --; + return dest; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new Iterator(){ + private int index = 0; + public Object next(){ + return elementData[index++]; + } + public boolean hasNext(){ + return index >= size; + } + }; + } + +} diff --git a/group01/349209948/src/week1_0226/BinaryTreeNode.java b/group01/349209948/src/week1_0226/BinaryTreeNode.java new file mode 100644 index 0000000000..e667bdf15a --- /dev/null +++ b/group01/349209948/src/week1_0226/BinaryTreeNode.java @@ -0,0 +1,37 @@ +package week1_0226; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Object o){ + this.data = o; + } + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + BinaryTreeNode node = new BinaryTreeNode(o); + this.setRight(node); + return node; + } + +} diff --git a/group01/349209948/src/week1_0226/Iterator.java b/group01/349209948/src/week1_0226/Iterator.java new file mode 100644 index 0000000000..3eddc2b726 --- /dev/null +++ b/group01/349209948/src/week1_0226/Iterator.java @@ -0,0 +1,6 @@ +package week1_0226; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group01/349209948/src/week1_0226/LinkedList.java b/group01/349209948/src/week1_0226/LinkedList.java new file mode 100644 index 0000000000..51c9ab8844 --- /dev/null +++ b/group01/349209948/src/week1_0226/LinkedList.java @@ -0,0 +1,129 @@ +package week1_0226; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + private int size = 0; + + public void add(Object o){ + if (head == null) { + head = new Node(o); + } else { + //遍历到链表的尾部 + Node tail = head; + while (tail.next != null) { + tail = tail.next; + } + Node node = new Node(o); + tail.next = node; + } + size ++; + } + public void add(int index , Object o){ + rangeCheckForAdd(index); + if (index ==0) { + Node node = new Node(o); + node.next = head; + head = node; + } else { + Node preHead = head; + for (int i = 0; i < index -1; i ++){ + preHead = head.next; + } + Node node = new Node(o); + node.next = preHead.next; + preHead.next = node; + } + } + public Object get(int index){ + rangeCheck(index); + Node dest = head; + for (int i = 0; i< index; i++){ + dest = dest.next; + } + return dest.data; + } + private void rangeCheck(int index){ + if (index >= size || index <0){ + throw new IndexOutOfBoundsException(); + } + } + public Object remove(int index){ + rangeCheck(index); + Node preDest = head; + for (int i = 0; i < index; i++){ + preDest = preDest.next; + } + Node dest = preDest.next; + preDest.next = dest.next; + size --; + return dest; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node node = new Node(o); + node.next = head; + head = node; + size ++; + } + public void addLast(Object o){ + Node lastNode = head; + while (lastNode.next != null){ + lastNode = lastNode.next; + } + Node node = new Node(o); + lastNode.next = node; + size++; + } + public Object removeFirst(){ + if (head == null) { + throw new NoSuchElementException(); + } + Node headTmp = head; + head = head.next; + size --; + return headTmp; + } + public Object removeLast(){ + if (head == null) { + throw new NoSuchElementException(); + } + if (head.next == null) { + Node dest = head; + head = null; + size --; + return dest; + } + Node preLastNode = head; + while(preLastNode.next.next != null) { + preLastNode = preLastNode.next; + } + Node dest = preLastNode.next; + preLastNode.next = null; + size --; + return dest; + } + public Iterator iterator(){ + return null; + } + private void rangeCheckForAdd(int index){ + if (index > size || index <0){ + throw new IndexOutOfBoundsException(); + } + } + + private static class Node{ + Object data; + Node next; + Node (Object data) { + this.data = data; + next = null; + } + } +} diff --git a/group01/349209948/src/week1_0226/List.java b/group01/349209948/src/week1_0226/List.java new file mode 100644 index 0000000000..ba1577cfaa --- /dev/null +++ b/group01/349209948/src/week1_0226/List.java @@ -0,0 +1,9 @@ +package week1_0226; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group01/349209948/src/week1_0226/Queue.java b/group01/349209948/src/week1_0226/Queue.java new file mode 100644 index 0000000000..a20d6a303e --- /dev/null +++ b/group01/349209948/src/week1_0226/Queue.java @@ -0,0 +1,21 @@ +package week1_0226; + +public class Queue { + + private LinkedList list = new LinkedList(); + public void enQueue(Object o){ + list.add(o); + } + + public Object deQueue(){ + return list.removeFirst(); + } + + public boolean isEmpty(){ + return list.size() == 0; + } + + public int size(){ + return list.size(); + } +} diff --git a/group01/349209948/src/week1_0226/Stack.java b/group01/349209948/src/week1_0226/Stack.java new file mode 100644 index 0000000000..f5d6add66d --- /dev/null +++ b/group01/349209948/src/week1_0226/Stack.java @@ -0,0 +1,29 @@ +package week1_0226; +import java.util.EmptyStackException; +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + checkStack(); + return elementData.remove(elementData.size() - 1); + } + private void checkStack(){ + if (elementData.size() == 0){ + throw new EmptyStackException(); + } + } + public Object peek(){ + checkStack(); + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group01/360176196/.classpath b/group01/360176196/.classpath new file mode 100644 index 0000000000..3c662f3c9b --- /dev/null +++ b/group01/360176196/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/group01/360176196/.gitignore b/group01/360176196/.gitignore new file mode 100644 index 0000000000..5e56e040ec --- /dev/null +++ b/group01/360176196/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/group01/360176196/.project b/group01/360176196/.project new file mode 100644 index 0000000000..a895f05a76 --- /dev/null +++ b/group01/360176196/.project @@ -0,0 +1,17 @@ + + + xqfGit + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group01/360176196/.settings/org.eclipse.core.resources.prefs b/group01/360176196/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/group01/360176196/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/group01/360176196/src/xqfGit/dataStructure/ArrayList.java b/group01/360176196/src/xqfGit/dataStructure/ArrayList.java new file mode 100644 index 0000000000..5996182fbe --- /dev/null +++ b/group01/360176196/src/xqfGit/dataStructure/ArrayList.java @@ -0,0 +1,73 @@ +package xqfGit.dataStructure; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + + public void add(Object o){ + if(this.size >= elementData.length){ + elementData = Arrays.copyOf(elementData, size+1); + elementData[size] = o; + size++; + } + else{ + elementData[size-1] = o; + size++; + } + + } + + public void add(int index, Object o){ + if(index<0 || index>elementData.length){ + throw new ArrayIndexOutOfBoundsException("OutOfBounds"); + } + else{ + System.arraycopy(elementData, index, elementData, index+1, elementData.length+1); + elementData[index] = o; + size++; + } + } + + + public Object get(int index){ + if(index<0 || index>elementData.length){ + throw new ArrayIndexOutOfBoundsException("OutOfBounds"); + } + else{ + return elementData[index]; + } + } + + + public Object remove(int index){ + if(index<0 || index>elementData.length){ + throw new ArrayIndexOutOfBoundsException("OutOfBounds"); + } + else{ + Object reObject = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, elementData.length-1); + size--; + return reObject; + } + } + + public int size(){ + if(this.size < elementData.length){ + return size; + }else{ + elementData = Arrays.copyOf(elementData, size); + return size; + } + } + + + public Iterator iterator(){ + return null; + } + +} diff --git a/group01/360176196/src/xqfGit/dataStructure/BinaryTreeNode.java b/group01/360176196/src/xqfGit/dataStructure/BinaryTreeNode.java new file mode 100644 index 0000000000..7662484884 --- /dev/null +++ b/group01/360176196/src/xqfGit/dataStructure/BinaryTreeNode.java @@ -0,0 +1,49 @@ +package xqfGit.dataStructure; + +import com.sun.swing.internal.plaf.basic.resources.basic; + +public class BinaryTreeNode { + + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + + + + public Integer getData() { + return data; + } + public void setData(Integer data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Integer i){ + + return null; + } + + public BinaryTreeNode (){ + + } + + + + public BinaryTreeNode(BinaryTreeNode b1,BinaryTreeNode b2){ + this.left = b1; + this.right = b2; + } + +} diff --git a/group01/360176196/src/xqfGit/dataStructure/Iterator.java b/group01/360176196/src/xqfGit/dataStructure/Iterator.java new file mode 100644 index 0000000000..ee4842739f --- /dev/null +++ b/group01/360176196/src/xqfGit/dataStructure/Iterator.java @@ -0,0 +1,7 @@ +package xqfGit.dataStructure; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group01/360176196/src/xqfGit/dataStructure/LinkedList.java b/group01/360176196/src/xqfGit/dataStructure/LinkedList.java new file mode 100644 index 0000000000..a663f85b15 --- /dev/null +++ b/group01/360176196/src/xqfGit/dataStructure/LinkedList.java @@ -0,0 +1,116 @@ +package xqfGit.dataStructure; + +public class LinkedList implements List { + + private Node first; + private Node last; + private int size; + + public void add(Object o){ + Node l = new Node(o); + l = last.next; + size++; + } + + public void add(int index , Object o){ + Node l = new Node(o); + Node n = first; + if(size == index){ + l = last.next; + l = last; + size++; + }else{ + Node m = first; + for(int i =0;i array2[i]){ + temp[index] = array2[i]; + index++; + } if(array1[j] == array2[i]){ + temp[index] = array2[i]; + index++; + continue; + } if(array1[j] < array2[i]){ + temp[index] = array1[j]; + index++; + continue; + } + } + } + return temp; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return Arrays.copyOf(oldArray, oldArray.length+size); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int n=0; + int[] temp ={}; + if(max == 1){ + return temp; + }else{ + for(int i =0;i<30;i++){ + if(fibo(i) > max){ + n = i; + break; + } + } + for(int i = 0;i < n;i++){ + temp = Arrays.copyOf(temp, i+1); + temp[temp.length-1] = fibo(i); + } + return temp; + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int[] temp ={}; + for(int i =2;i parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + SAXReader reader = new SAXReader(); + try { + //解析Struts.xml + Document document = reader.read(new File("struts.xml")); + Element root = document.getRootElement(); + List list_child = root.elements(); + String actionname = list_child.get(0).attributeValue("name"); + String actionClass = list_child.get(0).attributeValue("class"); + + //通过反射,创建Action,调用方法。 + try { + Class clazz = Class.forName(actionClass); + Method setName = clazz.getMethod("setName"); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (DocumentException e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/group01/360176196/src/xqfGit/dataStructure/litileStruts/StrutsTest.java b/group01/360176196/src/xqfGit/dataStructure/litileStruts/StrutsTest.java new file mode 100644 index 0000000000..8c9b6cd92e --- /dev/null +++ b/group01/360176196/src/xqfGit/dataStructure/litileStruts/StrutsTest.java @@ -0,0 +1,43 @@ +package xqfGit.dataStructure.litileStruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group01/360176196/src/xqfGit/dataStructure/litileStruts/View.java b/group01/360176196/src/xqfGit/dataStructure/litileStruts/View.java new file mode 100644 index 0000000000..2ec6974941 --- /dev/null +++ b/group01/360176196/src/xqfGit/dataStructure/litileStruts/View.java @@ -0,0 +1,23 @@ +package xqfGit.dataStructure.litileStruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/360176196/src/xqfGit/dataStructure/litileStruts/struts.xml b/group01/360176196/src/xqfGit/dataStructure/litileStruts/struts.xml new file mode 100644 index 0000000000..865d390eb6 --- /dev/null +++ b/group01/360176196/src/xqfGit/dataStructure/litileStruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/378213871/.classpath b/group01/378213871/.classpath new file mode 100644 index 0000000000..d815a5f517 --- /dev/null +++ b/group01/378213871/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group01/378213871/.gitignore b/group01/378213871/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group01/378213871/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group01/378213871/.project b/group01/378213871/.project new file mode 100644 index 0000000000..a6666f301e --- /dev/null +++ b/group01/378213871/.project @@ -0,0 +1,17 @@ + + + coding + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group01/378213871/src/com/coderising/week02/array/ArrayUtil.java b/group01/378213871/src/com/coderising/week02/array/ArrayUtil.java new file mode 100644 index 0000000000..2bfab6dbc3 --- /dev/null +++ b/group01/378213871/src/com/coderising/week02/array/ArrayUtil.java @@ -0,0 +1,255 @@ +package com.coderising.week02.array; + +import java.util.Stack; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + Stack stack = new Stack(); + for(int i = 0; i < origin.length; i++ ) { + stack.push(origin[i]); + } + for(int i = 0; i < origin.length; i++ ) { + int j = (int) stack.pop(); + origin[i] = j; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + if (oldArray == null) { + throw new IllegalArgumentException(); + } + //算出oldArr数组中0的个数 + int zeronum = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] == 0) { + zeronum++; + } + } + int j = 0; //新数组的索引 + int[] newArray = new int[oldArray.length - zeronum]; + //遍历旧数组 + for (int i = 0; i < oldArray.length; i++) { + if(oldArray[i] != 0) { + newArray[j] = oldArray[i]; + j++; + } + } + + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + int array1length = array1.length; + int array2length = array2.length; + int repeat = 0; //初始化两个数组中重复数字的个数为0 + for (int i = 0; i < array1length; i++) { + for (int j = 0; j < array2length; j++) { + if (array1[i] == array2[j]) { + repeat++; + } + } + } + //合并后的数组长度为两个数组长度相加减去重复数字的个数 + int[] mergearray = new int[array1length+array2length-repeat]; + int index1 = 0; //array1数组的当前索引 + int index2 = 0; //array2数组的当前索引 + int indexMerge = 0; //mergearray数组的当前索引 + //循环,只要array1和array2都没有循环完就一直循环 + while (index1 < array1length && index2 < array2length) { + //如果当前array1[index1]比array2[index2]小,则将mergearray[indexMerge]元素置为array1[index1] + //同时index1++,indexMerge++ + if (array1[index1] < array2[index2]) { + mergearray[indexMerge++] = array1[index1++]; + } + //如果当前array1[index1]比array2[index2]大,则将mergearray[indexMerge]元素置为array2[index2] + //同时index2++,indexMerge++ + if (array1[index1] > array2[index2]) { + mergearray[indexMerge++] = array2[index2++]; + } + //如果当前array1[index1]等于array2[index2],则将mergearray[indexMerge]元素置为array1[index1] + //同时index1++,index2++,indexMerge++ + else { + mergearray[indexMerge] = array1[index1]; + index1++; + index2++; + indexMerge++; + } + } + //上个循环能够结束,说明array1已经循环完或array2已经循环完 + //下述两个循环只能有一个满足循环条件 + //只要array1没有循环完,就把array1中剩下的元素依次放入mergearray中 + while (index1 < array1length) { + mergearray[indexMerge++] = array1[index1++]; + } + //只要array2没有循环完,就把array2中剩下的元素依次放入mergearray中 + while (index2 < array2length) { + mergearray[indexMerge++] = array2[index2++]; + } + + return mergearray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int oldLength = oldArray.length; + int[] newArray = new int[oldLength+size]; + System.arraycopy(oldArray, 0, newArray, 0, oldLength); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public static int[] fibonacci(int max){ + int count = 0; //数列项数 + //循环得到数组的长度 + while (fiboindex(count) < max) { + count++; + } + int[] fiboArray = new int[count]; + if(max <= 1) { + fiboArray = new int[] {}; + } else { + for (int i = 0; i < count; i++) { + fiboArray[i] = fiboindex(i); + } + } + return fiboArray; + } + //通过递归的方式推导斐波那契数列 + public static int fiboindex(int n) { + if (n < 2) { + return 1; + } + else { + return fiboindex(n-1) + fiboindex(n-2); + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + if (max < 2) { + throw new IllegalArgumentException(); + } + int i,j; + int count = 0; + int[] maxArray = new int[max]; + for(i = 2; i < max; i++) { + for (j = 2; j <= i; j++) { + if (i % j == 0) { + break; + } + } + if(j >= i) { + maxArray[count]=i; + count++; + } + } + int[] primeArray = new int[count]; + System.arraycopy(maxArray, 0, primeArray, 0, count); + return primeArray; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + if (max < 0) { + throw new IllegalArgumentException(); + } + + int i,j; + int count = 0; + int[] maxArray = new int[max]; + + + for(i = 1; i < max; i++) { + int sum = 0; + for(j = 1; j < i; j++) { + if (i % j == 0) { + sum += j; + } + } + if (sum == i) { + maxArray[count] = i; + count++; + } + } + + int[] perfectArray = new int[count]; + System.arraycopy(maxArray, 0, perfectArray, 0, count); + + return perfectArray; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + if (array == null) { + throw new IllegalArgumentException(); + } + if (array.length == 0) { + return ""; + } + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]); + if(i != array.length - 1) { + sb.append(seperator); + } + } + + return sb.toString(); + } + + +} diff --git a/group01/378213871/src/com/coderising/week02/array/ArrayUtilTest.java b/group01/378213871/src/com/coderising/week02/array/ArrayUtilTest.java new file mode 100644 index 0000000000..8d82ff3095 --- /dev/null +++ b/group01/378213871/src/com/coderising/week02/array/ArrayUtilTest.java @@ -0,0 +1,90 @@ +package com.coderising.week02.array; + + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + + private ArrayUtil arrayUtil; + + @Before + public void setUp() { + arrayUtil = new ArrayUtil(); + } + + @Test + public void testReverseArray() { + int[] a = {}; + arrayUtil.reverseArray(a); + Assert.assertArrayEquals(new int[] {}, a); + + int[] b = {1, 2, 3}; + arrayUtil.reverseArray(b); + Assert.assertArrayEquals(new int[] {3, 2, 1}, b); + + } + + @Test + public void testRemoveZero() { + int oldArr1[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + int newArr1[] = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}; + Assert.assertArrayEquals(newArr1, arrayUtil.removeZero(oldArr1)); + + int oldArr2[] = {0, 0, 0, 0, 0}; + int newArr2[] = {}; + Assert.assertArrayEquals(newArr2, arrayUtil.removeZero(oldArr2)); + + int oldArr3[] = {0, 0, 0, 0, 0, 1, 2, 3}; + int newArr3[] = {1, 2, 3}; + Assert.assertArrayEquals(newArr3, arrayUtil.removeZero(oldArr3)); + + } + + @Test + public void testMerge() { + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + Assert.assertArrayEquals(new int[] {3, 4, 5, 6, 7, 8}, arrayUtil.merge(a1, a2)); + } + + @Test + public void testGrow() { + int[] a1 = {2, 3, 6}; + Assert.assertArrayEquals(new int[] {2, 3, 6, 0, 0, 0}, arrayUtil.grow(a1, 3)); + Assert.assertArrayEquals(new int[] {2, 3, 6}, arrayUtil.grow(a1, 0)); + } + + @Test + public void testFibonacci() { + Assert.assertArrayEquals(new int[] {}, arrayUtil.fibonacci(1)); + Assert.assertArrayEquals(new int[] {1, 1, 2, 3, 5, 8, 13}, arrayUtil.fibonacci(15)); + + int[] a = new int[] {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, + 2584, 4181, 6765}; + Assert.assertArrayEquals(a, arrayUtil.fibonacci(6766)); + + } + + @Test + public void testGetPrimes() { + Assert.assertArrayEquals(new int[] {2, 3, 5, 7, 11, 13, 17, 19}, arrayUtil.getPrimes(23)); + } + + @Test + public void testGetPerfectNumbers() { + Assert.assertArrayEquals(new int[] {6, 28, 496}, arrayUtil.getPerfectNumbers(497)); + Assert.assertArrayEquals(new int[] {6, 28, 496, 8128}, arrayUtil.getPerfectNumbers(8129)); + + } + + @Test + public void testJoin() { + Assert.assertEquals("", arrayUtil.join(new int[] {}, "-")); + Assert.assertEquals("1", arrayUtil.join(new int[] {1}, "-")); + Assert.assertEquals("1-2-8-3-4-5", arrayUtil.join(new int[] {1, 2, 8, 3, 4, 5}, "-")); + + } + +} diff --git a/group01/378213871/src/com/coderising/week02/litestruts/LoginAction.java b/group01/378213871/src/com/coderising/week02/litestruts/LoginAction.java new file mode 100644 index 0000000000..778f151ca7 --- /dev/null +++ b/group01/378213871/src/com/coderising/week02/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.week02.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group01/378213871/src/com/coderising/week02/litestruts/Struts.java b/group01/378213871/src/com/coderising/week02/litestruts/Struts.java new file mode 100644 index 0000000000..b4dadf08d1 --- /dev/null +++ b/group01/378213871/src/com/coderising/week02/litestruts/Struts.java @@ -0,0 +1,110 @@ +package com.coderising.week02.litestruts; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + try { + //将xml转换为输出流 + InputStream inputStream = Struts.class.getResourceAsStream("struts.xml"); + //创建SAXReader读取器,专门用于读取xml + SAXReader saxReader = new SAXReader(); + //读取xml文件,获得Document对象 + Document document = saxReader.read(inputStream); + //actionName对应的类名 + String className = ""; + //获取文档的根节点 + Element rootElement = document.getRootElement(); + Iterator iterator = rootElement.elementIterator("action"); + //actionName对应的action + Element targetAction = null; + //对action节点下的所有子节点进行遍历 + while (iterator.hasNext()) { + Element element = (Element) iterator.next(); + String name = element.attributeValue("name"); + if(name.equals(actionName)) { + className = element.attributeValue("class"); + targetAction = element; + break; + } + } + + Class clazz = Class.forName(className); + Object instance = clazz.newInstance(); + + Set keySet = parameters.keySet(); + for(String key : keySet) { + // 将变量名称拼成set方法名 + String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); + Class type = clazz.getDeclaredField(key).getType(); + Method method = clazz.getDeclaredMethod(methodName, type); + //依次调用相应的set方法 + method.invoke(instance, parameters.get(key)); + } + //通过反射调用对象的exectue方法,并获得返回值 + String result = (String)clazz.getDeclaredMethod("execute").invoke(instance); + + Method[] declaredMethods = clazz.getDeclaredMethods(); + HashMap map = new HashMap<>(); + for (int i = 0; i < declaredMethods.length; i++) { + if (declaredMethods[i].getName().startsWith("get")) { + String fieldValue = (String) declaredMethods[i].invoke(instance); + String fieldName = declaredMethods[i].getName().substring(3, 4).toLowerCase() + + declaredMethods[i].getName().substring(4); + map.put(fieldName, fieldValue); + } + } + + View view = new View(); + view.setParameters(map); + + Iterator elementIterator = targetAction.elementIterator("result"); + while(elementIterator.hasNext()) { + Element element = (Element) elementIterator.next(); + if (result.equals(element.attributeValue("name"))) { + view.setJsp(element.getText()); + } + } + + return view; + + + } catch(Exception e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/group01/378213871/src/com/coderising/week02/litestruts/StrutsTest.java b/group01/378213871/src/com/coderising/week02/litestruts/StrutsTest.java new file mode 100644 index 0000000000..7a89f0f43c --- /dev/null +++ b/group01/378213871/src/com/coderising/week02/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.week02.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group01/378213871/src/com/coderising/week02/litestruts/View.java b/group01/378213871/src/com/coderising/week02/litestruts/View.java new file mode 100644 index 0000000000..2280a6d491 --- /dev/null +++ b/group01/378213871/src/com/coderising/week02/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.week02.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/378213871/src/com/coderising/week02/litestruts/struts.xml b/group01/378213871/src/com/coderising/week02/litestruts/struts.xml new file mode 100644 index 0000000000..9b7e6fa75e --- /dev/null +++ b/group01/378213871/src/com/coderising/week02/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/378213871/src/com/coding/basic/week01/ArrayList.java b/group01/378213871/src/com/coding/basic/week01/ArrayList.java new file mode 100644 index 0000000000..5745209a08 --- /dev/null +++ b/group01/378213871/src/com/coding/basic/week01/ArrayList.java @@ -0,0 +1,74 @@ +package com.coding.basic.week01; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + ensureCapacity(size + 1); + elementData[size++] = o; + } + + public void ensureCapacity(int size) { + if (size > elementData.length) { + grow(); + } + } + + public void grow() { + elementData = Arrays.copyOf(elementData, size * 2); + } + + public void add(int index, Object o){ + if (index < 0 || index >= size) { + throw new ArrayIndexOutOfBoundsException(); + } + ensureCapacity(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + public Object get(int index){ + if (index < 0 || index >= size) { + throw new ArrayIndexOutOfBoundsException(); + } + return elementData[index]; + } + + public Object remove(int index){ + if (index < 0 || index >= size) { + throw new ArrayIndexOutOfBoundsException(); + } + Object removedItem = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return removedItem; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + return new Iterator() { + private int current = 0; + + public boolean hasNext() { + return current < size(); + } + + public Object next() { + if(!hasNext()) { + throw new java.util.NoSuchElementException(); + } + return elementData[current++]; + } + }; + } + +} diff --git a/group01/378213871/src/com/coding/basic/week01/BinaryTreeNode.java b/group01/378213871/src/com/coding/basic/week01/BinaryTreeNode.java new file mode 100644 index 0000000000..36e20a95c5 --- /dev/null +++ b/group01/378213871/src/com/coding/basic/week01/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic.week01; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group01/378213871/src/com/coding/basic/week01/Iterator.java b/group01/378213871/src/com/coding/basic/week01/Iterator.java new file mode 100644 index 0000000000..365e98e8b4 --- /dev/null +++ b/group01/378213871/src/com/coding/basic/week01/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic.week01; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group01/378213871/src/com/coding/basic/week01/LinkedList.java b/group01/378213871/src/com/coding/basic/week01/LinkedList.java new file mode 100644 index 0000000000..dd6f3fb2e6 --- /dev/null +++ b/group01/378213871/src/com/coding/basic/week01/LinkedList.java @@ -0,0 +1,129 @@ +package com.coding.basic.week01; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + + private int size; + + public void add(Object o){ + if (head == null) { + head = new Node(o); + size++; + } else{ + addLast(o); + } + } + public void add(int index , Object o){ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + if (index == 0) { + addFirst(o); + } else { + //定义标记节点sentinelNode,标记节点的下一个节点即为要新加的元素 + Node sentinelNode = head; + for (int i = 0; i < index - 1; i++) { + sentinelNode = sentinelNode.next; + } + Node node = new Node(o); + node.next = sentinelNode.next; + sentinelNode.next = node; + size++; + } + } + public Object get(int index){ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } else { + Node indexNode = head; + for (int i = 0; i < index; i++) { + indexNode = indexNode.next; + } + return indexNode.data; + } + } + public Object remove(int index){ + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } else { + /** + * sentinelNode是所删除节点的上一个节点; + * indexNode是需要被删除的节点 + */ + Node sentinelNode = head; + Node indexNode = head; + for (int i = 0; i < index - 1; i++) { + sentinelNode = sentinelNode.next; + } + for (int i = 0; i < index; i++) { + indexNode = indexNode.next; + } + Node nextIndexNode = indexNode.next; + sentinelNode.next = nextIndexNode; + indexNode.next = null; + size--; + return indexNode.data; + } + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node node = new Node(o); + node.next = head; + head = node; + size++; + } + public void addLast(Object o){ + //定义尾节点并通过while循环找到当前链表的尾节点 + Node tailNode = head; + while (tailNode.next != null) { + tailNode = tailNode.next; + } + Node node = new Node(o); + tailNode.next = node; + size++; + } + public Object removeFirst(){ + if (head == null) { + throw new NoSuchElementException(); + } + Node newNode = head; + head = head.next; + size--; + return newNode.data; + } + public Object removeLast(){ + if (head == null) { + throw new NoSuchElementException(); + } + Node newNode = head; + while (newNode.next.next != null) { + newNode = newNode.next; + } + Node lastNode = newNode.next; + newNode.next = null; + size--; + return lastNode.data; + } + + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; // 下一个节点 + + private Node(Object data) { + this.data = data; + next = null; + } + } +} diff --git a/group01/378213871/src/com/coding/basic/week01/List.java b/group01/378213871/src/com/coding/basic/week01/List.java new file mode 100644 index 0000000000..966ca016e8 --- /dev/null +++ b/group01/378213871/src/com/coding/basic/week01/List.java @@ -0,0 +1,9 @@ +package com.coding.basic.week01; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group01/378213871/src/com/coding/basic/week01/Queue.java b/group01/378213871/src/com/coding/basic/week01/Queue.java new file mode 100644 index 0000000000..1b25880f67 --- /dev/null +++ b/group01/378213871/src/com/coding/basic/week01/Queue.java @@ -0,0 +1,24 @@ +package com.coding.basic.week01; + +public class Queue { + private LinkedList list = new LinkedList(); + //入队列 + public void enQueue(Object o){ + list.add(o); + } + //出队列 + public Object deQueue(){ + if(list.size() == 0) { + return null; + } + return list.removeFirst(); + } + + public boolean isEmpty(){ + return list.size() == 0; + } + + public int size(){ + return list.size(); + } +} diff --git a/group01/378213871/src/com/coding/basic/week01/Stack.java b/group01/378213871/src/com/coding/basic/week01/Stack.java new file mode 100644 index 0000000000..64cfa30da6 --- /dev/null +++ b/group01/378213871/src/com/coding/basic/week01/Stack.java @@ -0,0 +1,35 @@ +package com.coding.basic.week01; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + //入栈 + public void push(Object o){ + elementData.add(o); + + } + + //出栈 + public Object pop(){ + if(elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.remove(elementData.size() - 1); + } + + //读取栈顶元素 + public Object peek(){ + if(elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.get(elementData.size() - 1); + } + public boolean isEmpty(){ + return size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group01/496740686/build.gradle b/group01/496740686/build.gradle new file mode 100644 index 0000000000..864adec57e --- /dev/null +++ b/group01/496740686/build.gradle @@ -0,0 +1,23 @@ + +apply plugin: 'java' +apply plugin: 'maven' + +group = 'com' +version = '0.0.1-SNAPSHOT' + +description = """camile""" + +sourceCompatibility = 1.7 +targetCompatibility = 1.7 + + + +repositories { + + maven { url "http://maven.aliyun.com/nexus/content/groups/public" } +} +dependencies { + // https://mvnrepository.com/artifact/commons-digester/commons-digester + compile group: 'commons-digester', name: 'commons-digester', version: '2.1' + testCompile group: 'junit', name: 'junit', version:'4.12' +} diff --git a/group01/496740686/gradle/wrapper/gradle-wrapper.properties b/group01/496740686/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..7d7e097734 --- /dev/null +++ b/group01/496740686/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Mar 05 11:04:29 CST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.12-all.zip diff --git a/group01/496740686/gradlew b/group01/496740686/gradlew new file mode 100644 index 0000000000..9d82f78915 --- /dev/null +++ b/group01/496740686/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/group01/496740686/gradlew.bat b/group01/496740686/gradlew.bat new file mode 100644 index 0000000000..5f192121eb --- /dev/null +++ b/group01/496740686/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/group01/496740686/settings.gradle b/group01/496740686/settings.gradle new file mode 100644 index 0000000000..e034102924 --- /dev/null +++ b/group01/496740686/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'camile' diff --git a/group01/496740686/src/main/java/com/camile/App.java b/group01/496740686/src/main/java/com/camile/App.java new file mode 100644 index 0000000000..bed0657c53 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/App.java @@ -0,0 +1,13 @@ +package com.camile; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Impl/MyArraryList.java b/group01/496740686/src/main/java/com/camile/_1/Impl/MyArraryList.java new file mode 100644 index 0000000000..bd80233b7e --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Impl/MyArraryList.java @@ -0,0 +1,141 @@ +package com.camile._1.Impl; + +import com.camile._1.Interface.ArrayList; +import com.camile._1.Interface.Iterator; +import com.camile._1.ex.MyArrest; + +/** + * Created by Administrator on 2017/2/25. + */ +public class MyArraryList extends ArrayList { + private Object[] objArr; + private int size; + private int postion; + + public MyArraryList() { + this.objArr = new Object[10]; + this.size = 10; + this.postion = 0; + } + + + public MyArraryList(int size) { + this.objArr = new Object[size]; + this.size = size; + this.postion = 0; + } + + public MyArraryList(Object[] objArr) { + this.objArr = objArr; + this.size = objArr.length; + this.postion = objArr.length - 1; + } + + @Override + public void add(Object o) { + int limit = this.size + (this.size / 2); + Object[] newObjArr = new Object[limit]; + //public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)从指定源数组中复制一个数组, + // 复制从指定的位置开始,到目标数组的指定位置结束。从src引用的源数组到dest引用的目标数组, + // 数组组件的一个子序列被复制下来。被复制的组件的编号等于length参数。 + // 源数组中位置在srcPos到srcPos+length-1之间的组件被分别复制到目标数组中的destPos到destPos+length-1位置。 + System.arraycopy(this.objArr, 0, newObjArr, 0, objArr.length); + this.postion = this.size - 1; + newObjArr[this.postion] = o; + this.size = limit; + objArr = null; + this.objArr = newObjArr; + } + + @Override + public void add(int index, Object o) { + arrIndexVildate(index); + objArr[index - 1] = o; + size++; + } + + @Override + public Object get(int index) { + arrIndexVildate(index); + return objArr[index - 1]; + } + + @Override + public Object remove(int index) { + arrIndexVildate(index); + Object remoteObj = objArr[index - 1]; + objArr[index - 1] = null; + size--; + //TODO need GC ccontrol + return remoteObj; + } + + @Override + public int size() { + return this.size; + } + + @Override + public Iterator iterator() { + return new ArrayListIterator(this); + } + + private class ArrayListIterator implements Iterator { + private MyArraryList arraryList; + private int index; + + public ArrayListIterator(MyArraryList arraryList) { + this.arraryList = arraryList; + this.index = arraryList.size - 1; + } + + + public boolean hasNext() { + if (index > arraryList.size) { + return true; + } else { + return false; + } + } + + + public Object next() { + Object obj = arraryList.get(index); + index++; + return obj; + } + } + + private void arrIndexVildate(int index) { + if (index > size - 1 || index < 0) { + new Exception(String.format("cant than that array index %s,but got %", size - 1, index)); + } + } + + //test method + public static void main(String[] args) { + MyArraryList myArrary = new MyArraryList(); + MyArrest.arrestEq(10, myArrary.size()); + myArrary.add(1, 10); + MyArrest.arrestEq(10, myArrary.get(1)); + myArrary.add(100); + System.out.println(myArrary.get(11)); + myArrary.remove(1); + MyArrest.arrestIsNull(myArrary.get(1)); + if (myArrary.iterator().hasNext()) { + myArrary.iterator().next(); + } + System.out.println("test myArrary2"); + MyArraryList myArrary2 = new MyArraryList(20); + MyArrest.arrestEq(20, myArrary2.size()); + myArrary2.add(1, 10); + MyArrest.arrestEq(10, myArrary2.get(1)); + myArrary2.add(100); + MyArrest.arrestIsNull(myArrary2.get(20)); + myArrary2.remove(1); + MyArrest.arrestIsNull(myArrary2.get(1)); + if (myArrary.iterator().hasNext()) { + myArrary2.iterator().next(); + } + } +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Impl/MyLinkedList.java b/group01/496740686/src/main/java/com/camile/_1/Impl/MyLinkedList.java new file mode 100644 index 0000000000..9a19dfea9d --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Impl/MyLinkedList.java @@ -0,0 +1,177 @@ +package com.camile._1.Impl; + +import com.camile._1.Interface.Iterator; +import com.camile._1.Interface.LinkedList; +import com.camile._1.ex.MyArrest; + +/** + * Created by Administrator on 2017/2/26. + */ +public class MyLinkedList extends LinkedList { + private MyLinkedList.Node head; + private int size = 1; + + public MyLinkedList() { + + } + + private static class Node { + Object data; + MyLinkedList.Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + } + + public void add(Object o) { + if (this.size == 1) { + head.data = o; + return; + } + MyLinkedList.Node newHead = new MyLinkedList.Node(o, this.head); + this.size += 1; + this.head = newHead; + } + + + public void add(int index, Object o) { + IndexVildate(index); + int pos = 0; + if (index == 1) { + this.head = new Node(o, null); + return; + } + for (MyLinkedList.Node node = this.head; node != null; node = node.next) { + pos += 1; + if (pos == index - 1) { + node.data = o; + this.size += 1; + } + } + } + + + public Object get(int index) { + int pos = 0; + for (MyLinkedList.Node node = this.head; node != null; node = node.next) { + if (pos == index - 1) { + return node.data; + } + pos += 1; + } + return null; + } + + + public Object remove(int index) { + IndexVildate(index); + int pos = 0; + MyLinkedList.Node preNode; + for (MyLinkedList.Node node = this.head; node != null; node = node.next) { + pos += 1; + if (pos == index - 2) { + //record previous node + preNode = node; + if (pos == index - 1) { + MyLinkedList.Node willDelNode = node; + preNode.next = node.next; + node = null; + this.size -= 1; + return willDelNode; + } + } + } + return null; + } + + + public int size() { + return this.size; + } + + + public void addFirst(Object o) { + MyLinkedList.Node newHead = this.head; + newHead.data = o; + newHead.next = this.head; + this.size += 1; + this.head = newHead; + } + + + public void addLast(Object o) { + for (MyLinkedList.Node node = this.head; node != null; node = node.next) { + if (node.next == null) { + MyLinkedList.Node lastNode = new MyLinkedList.Node(o, null); + node.next = lastNode; + this.size += 1; + } + } + } + + + public Object removeFirst() { + MyLinkedList.Node oldHead = this.head; + this.head = oldHead.next; + this.size -= 1; + return oldHead; + } + + + public Object removeLast() { + for (MyLinkedList.Node node = this.head; node != null; node = node.next) { + if (node.next == null) { + MyLinkedList.Node willDelNode = node.next; + node.next = null; + this.size -= 1; + return willDelNode; + } + } + return null; + } + + public Iterator iterator() { + return new LinkedListIterator(this); + } + + private class LinkedListIterator implements Iterator { + private MyLinkedList linkedList; + private int index; + + public LinkedListIterator(MyLinkedList linkedList) { + this.linkedList = linkedList; + this.index = linkedList.size; + } + + @Override + public boolean hasNext() { + if (index > linkedList.size) { + return true; + } else { + return false; + } + } + + @Override + public Object next() { + Object obj = linkedList.get(index); + index++; + return obj; + } + } + + private void IndexVildate(int index) { + if (index > this.size || index < 0) { + System.out.println("happend error"); + } + } + + public static void main(String[] args) { + MyLinkedList linkedList = new MyLinkedList(); + linkedList.add(1, 23); + MyArrest.arrestEqByBasicType(1, linkedList.size()); + + } +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Impl/MyQueue.java b/group01/496740686/src/main/java/com/camile/_1/Impl/MyQueue.java new file mode 100644 index 0000000000..c3b18c1c49 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Impl/MyQueue.java @@ -0,0 +1,68 @@ +package com.camile._1.Impl; + +import com.camile._1.Interface.Queue; + +/** + * Created by Administrator on 2017/2/26. + */ +public class MyQueue extends Queue { + + private Node first; // beginning of queue + private Node last; // end of queue + private int size; // number of elements on queue + + private static class Node { + private Object value; + private Node next; + + public Node(Object value, Node next) { + this.value = value; + this.next = next; + } + } + + public MyQueue() { + first = null; + last = null; + int n = 0; + } + + @Override + public void enQueue(Object o) { + Node oldlast = this.last; + this.last = new Node(o, null); + size += 1; + //第一个进队列 + if (isEmpty()) { + first = last; + } else { + oldlast.next = this.last; + } + + } + + @Override + public Object deQueue() { + if (isEmpty()) { + return null; + } else { + Node oldFirst = this.first; + Node newFirst = this.first.next; + this.first = null; + this.first = newFirst; + this.size -= 1; + return oldFirst; + + } + } + + @Override + public boolean isEmpty() { + return first == null; + } + + @Override + public int size() { + return size; + } +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Impl/MyStack.java b/group01/496740686/src/main/java/com/camile/_1/Impl/MyStack.java new file mode 100644 index 0000000000..8acca68e39 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Impl/MyStack.java @@ -0,0 +1,70 @@ +package com.camile._1.Impl; + +import com.camile._1.Interface.ArrayList; +import com.camile._1.Interface.Stack; + + +/** + * Created by Administrator on 2017/2/26. + */ +public class MyStack extends Stack { + + private MyStack.Node first; // beginning of queue + private MyStack.Node last; // end of queue + private int size; // number of elements on queue + + private static class Node { + private Object value; + private MyStack.Node next; + + public Node(Object value, MyStack.Node next) { + this.value = value; + this.next = next; + } + } + + public MyStack() { + first = null; + last = null; + int n = 0; + } + + @Override + public void push(Object o) { + if (isEmpty()) { + MyStack.Node oldFirst = this.first; + this.first = new MyStack.Node(o, null); + size += 1; + //第一个进栈 + if (isEmpty()) { + first = last; + } else { + oldFirst.next = this.last; + } + } + } + + @Override + public Object pop() { + if (isEmpty()) { + return null; + } else { + MyStack.Node oldFirst = this.first; + this.first = oldFirst.next; + this.size -= 1; + return oldFirst; + + } + + } + + @Override + public Object peek() { + return this.first; + } + + @Override + public boolean isEmpty() { + return first == null; + } +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/ArrayList.java b/group01/496740686/src/main/java/com/camile/_1/Interface/ArrayList.java new file mode 100644 index 0000000000..fb9bf7c2f9 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Interface/ArrayList.java @@ -0,0 +1,34 @@ +package com.camile._1.Interface; + + + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/BinaryTreeNode.java b/group01/496740686/src/main/java/com/camile/_1/Interface/BinaryTreeNode.java new file mode 100644 index 0000000000..a38f18788e --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Interface/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.camile._1.Interface; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/Iterator.java b/group01/496740686/src/main/java/com/camile/_1/Interface/Iterator.java new file mode 100644 index 0000000000..ed642f8295 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Interface/Iterator.java @@ -0,0 +1,7 @@ +package com.camile._1.Interface; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/LinkedList.java b/group01/496740686/src/main/java/com/camile/_1/Interface/LinkedList.java new file mode 100644 index 0000000000..25f042f135 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Interface/LinkedList.java @@ -0,0 +1,47 @@ +package com.camile._1.Interface; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/List.java b/group01/496740686/src/main/java/com/camile/_1/Interface/List.java new file mode 100644 index 0000000000..4d1febe487 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Interface/List.java @@ -0,0 +1,9 @@ +package com.camile._1.Interface; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/Queue.java b/group01/496740686/src/main/java/com/camile/_1/Interface/Queue.java new file mode 100644 index 0000000000..4cc27c9f5f --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Interface/Queue.java @@ -0,0 +1,19 @@ +package com.camile._1.Interface; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group01/496740686/src/main/java/com/camile/_1/Interface/Stack.java b/group01/496740686/src/main/java/com/camile/_1/Interface/Stack.java new file mode 100644 index 0000000000..2c138b8493 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/Interface/Stack.java @@ -0,0 +1,22 @@ +package com.camile._1.Interface; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group01/496740686/src/main/java/com/camile/_1/ex/MyArrest.java b/group01/496740686/src/main/java/com/camile/_1/ex/MyArrest.java new file mode 100644 index 0000000000..00a5b19a67 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/ex/MyArrest.java @@ -0,0 +1,75 @@ +package com.camile._1.ex; + +/** + * Created by Administrator on 2017/2/26. + */ +public class MyArrest { + + + public static void arrestEq(T expect, T value) { + if (expect == null || value == null) { + if (expect == value) { + System.out.println("it's ok \n" ); + return; + } else { + System.out.println("happend error \n" ); + return; + } + } + if (expect.equals(value)) { + System.out.println("it's ok \n" ); + return; + } else { + System.out.println("happend error \n" ); + return; + } + } + + public static void arrestEq(T expect, T value, String errorInfo) { + if (expect == null || value == null) { + if (expect == value) { + System.out.println("it's ok \n" ); + return; + } else { + System.out.println("happend error \n" ); + return; + } + } + if (expect.equals(value)) { + System.out.println("it's ok \n" ); + return; + } else { + System.out.println("happend error \n" ); + return; + } + } + + public static void arrestEqByBasicType(T expect, T value) { + if (expect == null || value == null) { + if (expect == value) { + System.out.println("it's ok \n" ); + return; + } else { + System.out.println("happend error \n" ); + return; + } + } + if (expect == value) { + System.out.println("it's ok \n" ); + return; + } else { + System.out.println("happend error \n" ); + return; + } + } + + public static void arrestIsNull(Object obj) { + if (obj == null) { + System.out.println("it's null , you're right \n" ); + return; + } else { + System.out.println("happend error \n" ); + return; + } + } +} diff --git a/group01/496740686/src/main/java/com/camile/_1/package-info.java b/group01/496740686/src/main/java/com/camile/_1/package-info.java new file mode 100644 index 0000000000..b3be782a86 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_1/package-info.java @@ -0,0 +1,8 @@ +/** + * 基本的数据结构 + */ +/** + * @author Camile + * + */ +package com.camile._1; \ No newline at end of file diff --git a/group01/496740686/src/main/java/com/camile/_2/array/ArrayUtil.java b/group01/496740686/src/main/java/com/camile/_2/array/ArrayUtil.java new file mode 100644 index 0000000000..1f00864e04 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_2/array/ArrayUtil.java @@ -0,0 +1,100 @@ +package com.camile._2.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int size = origin.length; + int[] newArr = new int[size]; + for (int index = 0; index + * 配置,以及execute的返回值, 确定哪一个jsp, 放到View对象的jsp字段中 + */ +public class Struts { + + public View runAction(String actionName, Map parameters) { + + Structs structs = makeObjFromXml(readProfiles("struts.xml")); + for (Action a : structs.getActions()) { + if (a.getName().equals(actionName)) { + try { + Class actionClass = Class.forName(a.getClazz()); + Object instance = actionClass.newInstance(); + Field field; + // get field + for (Map.Entry entry : parameters.entrySet()) { + field = actionClass.getDeclaredField(entry.getKey()); + field.setAccessible(true); + field.set(instance, entry.getValue()); + } + Method execute = actionClass.getMethod("execute"); + String resultString = (String) execute.invoke(instance); + Method getMessage = actionClass.getMethod("getMessage"); + String message = (String) getMessage.invoke(instance); + Map map = new HashMap<>(); + map.put("message", message); + View view = new View(); + String viewPath; + for (Result path : a.getResults()) { + if (path.getName().equals(resultString)) { + viewPath = path.getValue(); + view.setParameters(map); + view.setJsp(viewPath); + } + } + return view; + + } catch (NoSuchFieldException | SecurityException e) { + System.out.println("获取参数失败"); + e.printStackTrace(); + } catch (ClassNotFoundException e) { + System.out.println("并没有在xml中找到相关action"); + e.printStackTrace(); + } catch (InstantiationException | IllegalAccessException e) { + System.out.println("获取反射对象失败"); + e.printStackTrace(); + } catch (NoSuchMethodException e) { + System.out.println("获取方法"); + e.printStackTrace(); + } catch (IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + } + + return null; + } + + private URL readProfiles(String filePath) { + ClassLoader classLoader = Struts.class.getClassLoader(); + URL resource = classLoader.getResource(filePath); + if (resource == null) + throw new RuntimeException("文件不存在"); + return resource; + } + + private Structs makeObjFromXml(URL resource) { + Digester digester = new Digester(); + digester.addObjectCreate("struts", Structs.class); + digester.addObjectCreate("struts/action", Action.class); + digester.addSetProperties("struts/action", new String[] { "name", "class" }, new String[] { "name", "clazz" }); + digester.addSetNext("struts/action", "addAction"); + digester.addObjectCreate("struts/action/result", Result.class); + digester.addSetProperties("struts/action/result"); + digester.addBeanPropertySetter("struts/action/result", "value"); + digester.addSetNext("struts/action/result", "addResult"); + try { + return (Structs) digester.parse(resource); + } catch (IOException | SAXException e) { + e.printStackTrace(); + throw new RuntimeException("解析XML文件时发生错误"); + } + } + + public static void main(String[] args) { + + } +} diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/View.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/View.java new file mode 100644 index 0000000000..5715f9152d --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/View.java @@ -0,0 +1,23 @@ +package com.camile._2.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Action.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Action.java new file mode 100644 index 0000000000..c42d674530 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Action.java @@ -0,0 +1,34 @@ +package com.camile._2.litestruts.bean; + +import java.util.ArrayList; +import java.util.List; + +public class Action { + private String name; + private String clazz; + private List results = new ArrayList<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClazz() { + return clazz; + } + + public void setClazz(String clazz) { + this.clazz = clazz; + } + + public void addResult(Result result) { + this.results.add(result); + } + + public List getResults() { + return results; + } +} diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Result.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Result.java new file mode 100644 index 0000000000..d7f37c10d7 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Result.java @@ -0,0 +1,22 @@ +package com.camile._2.litestruts.bean; + +public class Result { + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Structs.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Structs.java new file mode 100644 index 0000000000..71eac8151e --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/Structs.java @@ -0,0 +1,16 @@ +package com.camile._2.litestruts.bean; + +import java.util.ArrayList; +import java.util.List; + +public class Structs { + private List actions = new ArrayList<>(); + + public void addAction(Action action) { + actions.add(action); + } + + public List getActions() { + return actions; + } +} diff --git a/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/package-info.java b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/package-info.java new file mode 100644 index 0000000000..be18e65011 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_2/litestruts/bean/package-info.java @@ -0,0 +1,8 @@ +/** + * + */ +/** + * @author Administrator + * + */ +package com.camile._2.litestruts.bean; \ No newline at end of file diff --git a/group01/496740686/src/main/java/com/camile/_2/package-info.java b/group01/496740686/src/main/java/com/camile/_2/package-info.java new file mode 100644 index 0000000000..603ac63232 --- /dev/null +++ b/group01/496740686/src/main/java/com/camile/_2/package-info.java @@ -0,0 +1,8 @@ +/** + * + */ +/** + * @author Administrator + * + */ +package com.camile._2; \ No newline at end of file diff --git a/group01/496740686/src/main/resources/struts.xml b/group01/496740686/src/main/resources/struts.xml new file mode 100644 index 0000000000..64102ce61b --- /dev/null +++ b/group01/496740686/src/main/resources/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/496740686/src/test/java/com/camile/AppTest.java b/group01/496740686/src/test/java/com/camile/AppTest.java new file mode 100644 index 0000000000..04df4130c1 --- /dev/null +++ b/group01/496740686/src/test/java/com/camile/AppTest.java @@ -0,0 +1,38 @@ +package com.camile; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/group01/496740686/src/test/java/com/camile/_2/StrutsTest.java b/group01/496740686/src/test/java/com/camile/_2/StrutsTest.java new file mode 100644 index 0000000000..192999a494 --- /dev/null +++ b/group01/496740686/src/test/java/com/camile/_2/StrutsTest.java @@ -0,0 +1,46 @@ +package com.camile._2; + +import java.util.HashMap; +import java.util.Map; + +import com.camile._2.litestruts.Struts; +import com.camile._2.litestruts.View; +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + Struts struts = new Struts(); + View view = struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + Struts struts = new Struts(); + View view = struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/List.java b/group01/553624797/code2017/src/com/xxt/DataStructure/List.java new file mode 100644 index 0000000000..473354e821 --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/List.java @@ -0,0 +1,9 @@ +package com.xxt.DataStructure; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/MyArrayList.java b/group01/553624797/code2017/src/com/xxt/DataStructure/MyArrayList.java new file mode 100644 index 0000000000..9d3f3e8f03 --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/MyArrayList.java @@ -0,0 +1,99 @@ +package com.xxt.DataStructure; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Created by star on 2017/2/26. + */ +public class MyArrayList implements List { + + + + private Object[] elementData; + private int size = elementData.length; + + + public MyArrayList(int initialCapacity) { + if (initialCapacity > 0) { + this.elementData = new Object[initialCapacity]; + } else { + throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); + } + } + + public MyArrayList() { + this(10); + } + + + @Override + public void add(Object o) { + ensureCapacity(size + 1); + elementData[size + 1] = o; + } + + @Override + public void add(int index, Object o) { + //判断数组下标是否越界 + if(index < 0 || index > elementData.length){ + throw new IndexOutOfBoundsException("index : "+index+"size : "+size); + } + ensureCapacity(index); + System.arraycopy(elementData, index,elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + @Override + public Object get(int index) { + return elementData[index]; + } + + @Override + public Object remove(int index) { + //判断数组下标是否越界 + if(index < 0 || index > elementData.length){ + throw new IndexOutOfBoundsException("index : "+index+"size : "+size); + } + + + //取出删除的值 + Object oldValue = elementData[index]; + + //做删除操作同样是复制数组 + //计算要删除的数量 + int numMoved = size - index - 1; + if ( numMoved > 0){ + System.arraycopy(elementData, index + 1, elementData, index, numMoved); + } + + //将数组最后一个元素置为空,让GC回收 + elementData[size - 1] = null; + return oldValue; + + } + + @Override + public int size() { + return elementData.length; + } + + + //判断是否扩容 + public void ensureCapacity(int minCapacity) { + //取得当前数组容量 + int currentCapacity = elementData.length; + //如果最小需要的容量小于当前数组容量则需要扩容 + if (minCapacity < currentCapacity) { + int newCapacity = currentCapacity + (currentCapacity >> 1); + //如果扩容后的长度还是小于最小需要的长度,则直接以最小需要的长度作为当前数组的长度 + if (newCapacity < minCapacity) { + newCapacity = minCapacity; + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + } + +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/MyLinkedList.java b/group01/553624797/code2017/src/com/xxt/DataStructure/MyLinkedList.java new file mode 100644 index 0000000000..0c40956197 --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/MyLinkedList.java @@ -0,0 +1,141 @@ +package com.xxt.DataStructure; + +import java.util.Iterator; + +import java.util.LinkedList; +import java.util.function.Consumer; + +/** + * Created by star on 2017/2/25. + */ +public class MyLinkedList implements List{ + + public static class Node{ + E elementData; + Node prerious; + Node next; + + public Node(Node prerious , E elementData, Node next) { + this.prerious = prerious; + this.elementData= elementData; + this.next = next; + } + } + + + + private Node header; + private Node last; + + private int size = 0; + + + //往最后一个节点添加元素 + @Override + public void add(Object elementData) { + addBefore((E) elementData, last); + } + + @Override + public void add(int index, Object elementData) { + addBefore((E) elementData, (index == size ? last : node(index))); + } + + @Override + public Object get(int index) { + return node(index).elementData; + + } + + //获取index位置的节点 + private Node node(int index){ + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("数组下标越界"+size); + } + + if(index < (size >> 1)){ + Node e = header; + for(int i = 0; i < index; i ++){ + e = header.next; + return e; + } + }else { + Node e = last; + for(int i = size - 1; i > index; i--){ + e = last.prerious; + return e; + } + } + return null; + } + + + @Override + public Object remove(int index) { + + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException("inde :" + index); + } + + return remove(node(index)); + } + + + + //返回被删除的节点 + private Object remove(Node e){ + E movedElementData = e.elementData; + + //被删除节点的上个节点指向该节点的下个节点 + e.prerious.next = e.next; + + //被删除节点的下个节点指向该节点的上个节点 + e.next.prerious = e.prerious; + + + //将该节点置为空,让GC能够回收 + e.next = e.prerious = null; + e.elementData = null; + //长度-1 + size--; + return movedElementData; + } + + + @Override + public int size() { + return size; + } + + public Object removeFirst(){ + return remove(header.next); + + + } + + public Object removeLast(){ + return remove(last.prerious); + } + + public Iterator iterator(){ + return null; + } + + + + //插入一个新的节点 + private Node addBefore(E e, Node node){ + + Node newNode = new Node(node.prerious, e, node.next); + + //将上个节点的next指向自己 + newNode.prerious.next = newNode; + + //将下个节点的previous指向自己 + newNode.next.prerious = newNode; + + size++; + return newNode; + } + +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/MyQueue.java b/group01/553624797/code2017/src/com/xxt/DataStructure/MyQueue.java new file mode 100644 index 0000000000..75d878af3b --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/MyQueue.java @@ -0,0 +1,88 @@ +package com.xxt.DataStructure; + +import java.util.Iterator; + +/** + * Created by star on 2017/2/26. + */ +public class MyQueue{ + + + public static class Node{ + Object elementData; + Node prerious; + Node next; + + public Node(Object elementData, Node prerious, Node next) { + this.elementData = elementData; + this.prerious = prerious; + this.next = next; + } + + } + + + private MyQueue.Node header; + private MyQueue.Node last; + + private int size = 0; + + + //入队操作.在链表的头节点插入元素 + public void enQueue(Object o){ + addBefore(o, header); + } + + + //出队操作,返回链表的尾节点的元素 + public Object deQueue(){ + return node(size); + } + + + public boolean isEmpty(){ + return header == last; + } + + + + public int size(){ + return size; + } + + private Node addBefore(Object o , Node node){ + Node newNode = new Node(o, node.prerious, node.next); + + newNode.prerious.next = newNode; + newNode.next.prerious = newNode; + + size++; + return newNode; + + } + + + private Node node(int index){ + if(index < 0 || index > size){ + throw new IndexOutOfBoundsException("数组下标越界"+size); + } + + if(index < (size >> 1)){ + Node e = header; + for(int i = 0; i < index; i ++){ + e = header.next; + return e; + } + }else { + Node e = last; + for(int i = size - 1; i > index; i--){ + e = last.prerious; + return e; + } + } + return null; + } + + + +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/MyStack.java b/group01/553624797/code2017/src/com/xxt/DataStructure/MyStack.java new file mode 100644 index 0000000000..4ac0cf3698 --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/MyStack.java @@ -0,0 +1,52 @@ +package com.xxt.DataStructure; + +import java.util.EmptyStackException; + +/** + * Created by star on 2017/2/26. + */ +public class MyStack { + + + //采用数组实现; + private Object[] array; + //栈顶指针 + private int top; + private final static int size = 100; + + public MyStack(Object[] array, int top) { + this.array = array; + //空栈 + top = -1 ; + } + + public void push(Object elementData){ + //栈满 + if(top == size - 1){ + throw new StackOverflowError(); + }else { + array[++top] = elementData; + } + } + + //弹栈 + public Object pop(){ + if( top == -1){ + throw new EmptyStackException(); + }else { + return array[top--]; + } + } + + public boolean isEmpty(){ + return top == -1; + } + + public Object peek(){ + if(top == -1){ + throw new EmptyStackException(); + }else { + return array[top]; + } + } +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/ArrayList.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/ArrayList.java new file mode 100644 index 0000000000..635c22fa88 --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/ArrayList.java @@ -0,0 +1,36 @@ +package com.xxt.DataStructure.base; + +import com.xxt.DataStructure.base.List; + +import java.util.Iterator; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/BinaryTreeNode.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/BinaryTreeNode.java new file mode 100644 index 0000000000..ada0b84c78 --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.xxt.DataStructure.base; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/Iterator.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Iterator.java new file mode 100644 index 0000000000..4c8b3ae747 --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Iterator.java @@ -0,0 +1,7 @@ +package com.xxt.DataStructure.base; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/LinkedList.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/LinkedList.java new file mode 100644 index 0000000000..924cf10ff0 --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/LinkedList.java @@ -0,0 +1,48 @@ +package com.xxt.DataStructure.base; + +import com.xxt.DataStructure.base.List; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public com.xxt.DataStructure.base.Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/List.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/List.java new file mode 100644 index 0000000000..2148154c46 --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/List.java @@ -0,0 +1,12 @@ +package com.xxt.DataStructure.base; + +/** + * Created by star on 2017/2/26. + */ +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/Queue.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Queue.java new file mode 100644 index 0000000000..5427579179 --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Queue.java @@ -0,0 +1,18 @@ +package com.xxt.DataStructure.base; + +public class Queue { + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group01/553624797/code2017/src/com/xxt/DataStructure/base/Stack.java b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Stack.java new file mode 100644 index 0000000000..9c62bcdceb --- /dev/null +++ b/group01/553624797/code2017/src/com/xxt/DataStructure/base/Stack.java @@ -0,0 +1,24 @@ +package com.xxt.DataStructure.base; + +import com.xxt.DataStructure.base.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group01/751425278/.classpath b/group01/751425278/.classpath new file mode 100644 index 0000000000..c03982172c --- /dev/null +++ b/group01/751425278/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/group01/751425278/.gitignore b/group01/751425278/.gitignore new file mode 100644 index 0000000000..f5f89256ae --- /dev/null +++ b/group01/751425278/.gitignore @@ -0,0 +1,32 @@ +*.class +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +*.iml +*.idea + + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +#ide config +.metadata +.recommenders + + +#macOS +.DS_Store + +.idea/ +*.iml +rebel.* +.rebel.* + +target + +/bin/ diff --git a/group01/751425278/.project b/group01/751425278/.project new file mode 100644 index 0000000000..85d6b2c816 --- /dev/null +++ b/group01/751425278/.project @@ -0,0 +1,17 @@ + + + basicDataStructure + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group01/751425278/src/com/sanmubird/array/ArrayUtil.java b/group01/751425278/src/com/sanmubird/array/ArrayUtil.java new file mode 100644 index 0000000000..e6101d3fca --- /dev/null +++ b/group01/751425278/src/com/sanmubird/array/ArrayUtil.java @@ -0,0 +1,287 @@ +package com.sanmubird.array; + +import java.util.Arrays; + +import com.sanmubird.basicDataStructure.ArrayList; +import com.sanmubird.basicDataStructure.Iterator; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + int[] result = new int[origin.length]; + for(int i = 0 ; i < origin.length ; i++){ + result[i] = origin[origin.length -1 -i]; + System.out.println(result[i]); + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + int countZero = 0 ; + for(int i = 0 ; i < oldArray.length ; i++){ + if(oldArray[i] == 0 ) { + countZero++ ; + } + } + int[] newArray = new int[ oldArray.length - countZero]; + int index = 0 ; + for(int i = 0 ; i < oldArray.length ; i++){ + if(oldArray[i] != 0 ){ + newArray[index] = oldArray[i] ; + System.out.println(newArray[index]); + index++; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + /** + * 第一种思路:不考虑原有的数组是否有序,先将这些数组,混合到一个数组里面,然后再去重,再排序; + * 第二种思路: 能不能使用二叉树的方法快速排序? + * + * */ + + + public int[] merge(int[] array1, int[] array2){ + //先将两个数组合并成为一个数组; + int newLength = array1.length + array2.length; + int[] array3 = Arrays.copyOf(array1, newLength); + for(int i = array1.length ; i < newLength ; i++ ){ + array3[i] = array2[newLength - i -1]; + } + // 对这个数组进行冒泡排序; + int temp ; + for(int i = 0 ; i < array3.length ; i++){ + for(int j = 0 ; j < array3.length - i -1 ; j++){ + if(array3[j+1] < array3[j]){ + temp = array3[j+1]; + array3[j+1] = array3[j]; + array3[j] = temp ; + } + } + } + //计算出排序后的数组中重复值的个数; + int count = 0 ; + for(int i = 0 ; i < array3.length -1 ; i++){ + if(array3[i] == array3[i+1]){ + count++; + } + } + //创建一个新的数组; + int[] array = new int[array3.length - count]; + //把合并后的数组复制到新的数组中去,在复制的过程中,去除重复的元素; + int size = 0 ; + for(int i = 0 ; i < array3.length ; i++){ + if(i < array3.length - 1){ + if(array3[i] == array3[i+1]){ + array[size] = array3[i+1] ; + }else{ + array[size] = array3[i]; + size++; + } + }else{ + array[size] = array3[i]; + } + } + return array; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length+size]; + for(int i = 0 ; i < oldArray.length ; i++){ + newArray[i] = oldArray[i]; + } + for(int i = 0 ; i < newArray.length ; i++){ + System.out.print(newArray[i]+","); + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + int count1 = 0 ; + int result1 ; + for(int i = 1 ; i <= max ;i++ ){ + result1 = getFiBo(i); + if(max >= result1){ + count1++; + }else{ + break; + } + } + System.out.println(count1); + int[] array = new int[count1]; + int count = 0 ; + int result ; + for(int i = 1 ; i <= max ;i++ ){ + result = getFiBo(i); + if(max >= result){ + array[count] = result ; + count++; + }else{ + break; + } + } + + for(int i = 0 ; i < array.length ; i++){ + System.out.println("array["+i+"]:"+array[i]+","); + } + return array; + } + + public static int getFiBo(int i){ + if(i == 1 || i == 2){ + return 1 ; + }else{ + return getFiBo(i-1) + getFiBo(i -2) ; + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int count1 = 0 ; + for(int i = 1 ; i < max ; i++ ){ + if( isPrime(i )){ + count1++; + } + } + int[] array = new int[count1]; + int count = 0 ; + for(int i = 1 ; i < max ; i++ ){ + if( isPrime(i )){ + array[count] = i ; + count++; + } + } + for(int i = 0 ; i < array.length ; i++){ + System.out.println("array["+i+"]:"+array[i]+","); + } + + return array; + } + + public static boolean isPrime(int a ){ + int count = 0 ; + for(int i = 1 ; i <= a ; i++){ + if(a % i == 0 ){ + count++; + } + } + if(count == 2 ){ + return true ; + } + return false ; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max){ + ArrayList al = new ArrayList(); + for(int i = 1 ; i <= max ; i++){ + if(isPerfectNumber(i)){ + al.add(i); + } + } + int[] array = arrayListToArray(al); + for(int i = 0 ; i < array.length ; i++){ + System.out.println("array["+i+"]:"+array[i]+","); + } + return array ; + } + + public static int[] arrayListToArray(ArrayList al){ + int size = al.size(); + int[] array = new int[size]; + for(int i = 0 ; i < size ; i++){ + array[i] = (int) al.get(i); + } + return array ; + } + + public static boolean isPerfectNumber(int a){ + ArrayList al = new ArrayList(); + for(int i = 1 ; i <= a/2 ; i++ ){ + if(a%i == 0){ + al.add(i); + } + } + int sum = 0 ; + Iterator it=al.iterator(); + while(it.hasNext()){ + sum += (int) it.next(); + } + if(a == sum ){ + return true ; + } + return false ; + } + + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator){ + String s = ""; + String ss = ""; + String sss =""; + for(int i = 0 ; i < array.length ; i++){ + if(i == array.length-1){ + sss = array[i]+""; + s += sss; + }else{ + ss = array[i]+seperator; + s += ss; + } + } + return s; + } +} diff --git a/group01/751425278/src/com/sanmubird/basicDataStructure/ArrayList.java b/group01/751425278/src/com/sanmubird/basicDataStructure/ArrayList.java new file mode 100644 index 0000000000..3e6c874d90 --- /dev/null +++ b/group01/751425278/src/com/sanmubird/basicDataStructure/ArrayList.java @@ -0,0 +1,156 @@ +package com.sanmubird.basicDataStructure; + +import java.util.Arrays; + +public class ArrayList implements List { + + /** ArrayList 是一个类,一个类就会有对象,属性,构造方法,方法 + * ArrayList 是基于数组来实现List接口; 那么它的元素就会有 存储在数组中的元素, 和ArrayList的长度 + * 这个地方需要区分size= ArrayList.size() 和 length = Array.length ; + * size 是 已经占用的长度; + * length 是数组的长度; length 》= size 当,size > length 时,数组要动态扩容; + * */ + +// 数组默认的长度 + private static final int DEFAULT_SIZE = 10; + +// ArrayList的大小 + private int size ; + +// 数组中存储的元素 + private Object[] elementData = null; + + private int count ; + +// ArrayList 的构造方法 通过构造方法 可以得到这个类的对象 +// 有参构造方法 + public ArrayList(int i){ + if(i <= 0 ){ + throw new RuntimeException("数组的长度不能小于等于0"); + }else{ + this.elementData = new Object[i]; + this.size = 0 ; // 集合ArrayList的大小; + } + } + // 无参构造方法 + public ArrayList(){ + this(DEFAULT_SIZE); // this 会调用本类中 相同参数(相同的参数个数和参数类型)的构造方法; + } + + /** ArrayList 其他方法分析 + * 目标方法: + * size(); Array的length就是ArrayList的大小 + * get(int index); Array的【index-1】就是 ArrayList的第index位元素 + * add(Object o) ; 这个方法是在数组的末尾顺序添加一个元素; 找到数组的长度size,将array【size-1】= Object + * add(int index , Object o); 这个方法是在数组的指定位置添加一个元素;找到index位,将index位起往后挪一位,并将array【index】=Object + * remove(int index); 这个方法是 删除指定位上的元素,直接将这个位至最后的元素往前挪移一位。 + * + * 工具方法: + * argumentCheck(int index); 判断输入的参数是否合法;比如传入的参数不能比数组长度大,或者不能为负数等 + * ensureCapacity(); 判断当前数组的长度是否足够大,能再容纳下一个元素。 + * + * */ + + +// 对传入的参数进行验证是否合法 如果输入的参数不合法 就抛出异常 + public void argumentCheck(int index){ + if(index >= size || index < 0 ){ // 此处我觉得需要 ‘=’ 因为 index 我觉得是下标 + throw new IndexOutOfBoundsException("插入的下标是:"+index +",但ArrayLsit的长度是:"+size); + } + } + + // 判断是否数组是否溢出的方法 如果数组现在的长度小于所需的最小长度,就需要对数组进行扩容 + public void ensureCapacity(int minCapacity){ + int length = elementData.length; // 得出当前数组的长度 + if(minCapacity > length){ + int newCapacity = length * 3 / 2 + 1 ; //你是否对此有疑问?得出的结果会不会是小数? 答案是不会的,java中算术运算符“/”;两个int类型相除,结果一定是int类型 + if(minCapacity > newCapacity ){ + newCapacity = minCapacity ; + } + count++; + System.out.println("扩容"+count+"次"); + elementData = Arrays.copyOf(elementData, newCapacity);//此处为什么用Arrays.copyOf()而不用System.arraycopy()? + // Arrays.copyOf(): 不仅仅copy数组中的元素,还会创建一个新的数组来存放copy的对象 + // System.arraycopy():仅仅是copy数组中的元素,不会新建一个数组对象,也不会改变原有的数组长度。 + // 在原有数组长度不够的情况下,只能选择新建一个数组,并将原有的数组复制到新数组的办法来解决。 + } + } + + // 得到ArrayList 大小的方法 ; 此处的size 不是Array的length,而是ArrayList中元素的个数 + public int size(){ + return size; + } + +// 传入下标得到元素 + public Object get(int index){ + argumentCheck(index); //需要判断传入的参数是否合法; + return elementData[index]; + } + +// 按顺序在数字尾部添加元素 + public void add(Object o){ + ensureCapacity(size+1); // 判断是否会溢出 + elementData[size++] = o ; //此处使用 size++ 的好处:elementData[size+1];size++; + } + + public void add(int index, Object o){ //这个地方需要搞清楚index的含义:index在此处是下标的意思 + argumentCheck(index); //判断输入的下标是否合法 ---> + // 刚开始的时候 ; 我觉得这个地方不需要加这个判断,因为ArrayList是动态增长的; + // 我还需要想明白这个问题; + ensureCapacity(size+1); // 判断是否会溢出 + int moveLength = size - (index + 1) + 1; // 此处index是下标;下标是从0开始计算的;所以第n位的下标就是(n-1);所以,n = index + 1 + // 此处的 +1 刚开始没想明白,后来组长给举了个例子,1-3 有三个数,但不是通过3-1=2 算出来的 + System.arraycopy(elementData, index, elementData, index+1, moveLength ); + elementData[index] = o ; + size++; + } + + public Object remove(int index){ + argumentCheck(index); //判断输入的下标是否合法 + Object o = elementData[index]; + System.arraycopy(elementData, index, elementData, index-1, size-index); + elementData[size] = null ; + size--; + return o; + } + + public Iterator iterator(){ + return new Iterator(){ + private int index = 0 ; + + @Override + public Object next(){ + return elementData[index++]; + } + @Override + public boolean hasNext() { + return index < size ; + } + }; + } + + public static void main(String [] args){ + ArrayList al = new ArrayList(); + al.add(1); + al.add(2); + al.add(4); + al.add(5); + al.add(6); + al.add(7); + al.add(2,3); + al.add(8); + al.add(9); + al.add(10); + al.add(11); + al.add(13); + al.add(9,12); + al.add(14); + al.add(15); + al.remove(9); + for(int i = 0 ; i < al.size() ; i++ ){ + System.out.println(al.get(i)); + } + System.out.println("al的size是"+al.size()); + System.out.println(al.get(15)); + } +} \ No newline at end of file diff --git a/group01/751425278/src/com/sanmubird/basicDataStructure/BinaryTreeNode.java b/group01/751425278/src/com/sanmubird/basicDataStructure/BinaryTreeNode.java new file mode 100644 index 0000000000..4096c79e36 --- /dev/null +++ b/group01/751425278/src/com/sanmubird/basicDataStructure/BinaryTreeNode.java @@ -0,0 +1,58 @@ +package com.sanmubird.basicDataStructure; + +public class BinaryTreeNode { + /** 二叉树同时具有数组和链表各自的特点:它可以像数组一样迅速查找;也可以像链表一样快速添加; + * 但 删除操作复杂; + * 二叉树是每个节点最多有两个子树的有序树; + * 一个节点的左子点的关键值必须小于此节点,右节点的关键值必须大于或者等于此节点, + * */ + + + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Integer i){ + this.data = i ; + } + + + public Object getData() { + return data; + } + public void setData(Integer i) { + this.data = i; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Integer i){ + BinaryTreeNode node = new BinaryTreeNode(i); + if(i > this.data){ + if(this.getRight() == null ){ + this.setRight(node); + return node; + }else{ + return this.getRight().insert(i); + } + }else{ + if(this.getLeft() == null ){ + this.setLeft(node); + return node ; + }else{ + return this.getLeft().insert(i); + } + } + } + +} \ No newline at end of file diff --git a/group01/751425278/src/com/sanmubird/basicDataStructure/Iterator.java b/group01/751425278/src/com/sanmubird/basicDataStructure/Iterator.java new file mode 100644 index 0000000000..df4a1e3a6d --- /dev/null +++ b/group01/751425278/src/com/sanmubird/basicDataStructure/Iterator.java @@ -0,0 +1,6 @@ +package com.sanmubird.basicDataStructure; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} \ No newline at end of file diff --git a/group01/751425278/src/com/sanmubird/basicDataStructure/LinkedList.java b/group01/751425278/src/com/sanmubird/basicDataStructure/LinkedList.java new file mode 100644 index 0000000000..31703dd5f1 --- /dev/null +++ b/group01/751425278/src/com/sanmubird/basicDataStructure/LinkedList.java @@ -0,0 +1,159 @@ +package com.sanmubird.basicDataStructure; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + /** 链表:是由节点(Node)组成的, + * 而向外暴露的只有一个头节点;我们对链表的所有操作,都是直接或简洁地通过头节点来实现的。 + * 节点(Node)是由 一个 存储的对象和一个对下个节点的引用组成的。 + * Node中最重要的就是引用了,如果说对ArrayList的增删是ArrayCopy的话,那对LinkedList的增删就是改变引用的指向。 + * 因为节点的添加顺序是自右向左的,且最左边的节点是头节点; + * 所以,新添加的节点会在左边,而是新添加的节点会成为新的t头节点。 + * 头节点可以通过对下一个节点的引用,来找到所有的节点; + * 所以:链表里面的属性就有两个,一个是头节点,一个是节点的数量。 + ***/ + private Node head; //定义一个头节点 + private int size ; //节点的数量 + + public LinkedList(){ + this.head = null ; + this.size = 0 ; + } + +// 检查输入的参数是否合法 + public void argumentCheckForAdd(int index){ + if(index > size || index < 0 ){ //这个地反需要验证 index = 0 的情况 + throw new IndexOutOfBoundsException("输入的参数超出了边界!"); + } + } + +// 检查输入的参数是否合法 + public void argumentCheckForOther(int index){ + if(index >= size || index < 0 ){ + throw new IndexOutOfBoundsException("输入的参数超出了边界!"); + } + } + + + public Node getHead(){ + return head ; + } + + public Object get(int index){ + argumentCheckForOther(index); + Node node = head ; + for(int i = 0 ; i < index ; i++){ + node = head.next ; + } + return node.data; + } + public int size(){ + return size; // return this.size 跟 return size ;有区别没有? + } + +// + public void add(Object o){ + Node newNode = new Node(o); //实例化一个要添加的节点 + if(head == null ){ + head = newNode ; + }else{ + Node temp = head ; + while (temp.next != null ){ //这个地方为什么是 temp.next != null ? + // 这个地方的作用就是:取出下一个节点;那么当然是在存在下个节点的情况下,才能取出下个节点 + temp = temp.next ; + // 这样就找到了最后一个节点: temp + } + temp.next = newNode ; + } + size++; + } + +// 这个通过画图,然后看图说话就很容易弄出来。 + public void add(int index , Object o){ + argumentCheckForAdd(index); + if(size == index ) + add(o); + else{ + Node preNode = head ; + for (int i = 0 ; i < index ; i++){ + preNode = preNode.next; + } + Node nextNode = preNode.next ; + Node node = new Node(o); + preNode.next = node; + node.next = nextNode; + size++; + } + } + + public Object remove(int index){ + argumentCheckForOther(index); + Node temp = head ; + for(int i = 0 ; i < index ; i++){ + temp = temp.next ; + } + Node removedNode = temp.next ; + Node nextNode = removedNode.next ; + temp.next = nextNode ; + size--; + return removedNode.data; + } + + + public void addFirst(Object o){ + Node node = new Node(o); + node.next = head ; + head = node ; + size++; + } + + public void addLast(Object o){ + Node lastNode = head ; + while(lastNode.next != null ){ + lastNode = lastNode.next ; + } + Node node = new Node(o); + lastNode.next = node ; + size++; + } + + public void noSuchElement(){ + if(head.next == null){ + throw new NoSuchElementException("没有这个元素"); + } + } + + + public Object removeFirst(){ + noSuchElement(); + Node node = head.next ; + head.next = node.next ; + size--; + return node.data; + } + + public Object removeLast(){ + noSuchElement(); + Node temp = head ; + for(int i = 0 ; i 0){ + this.queArray = new Object[initialSize]; + this.maxSize = initialSize; + this.front = this.rear = 0 ; + }else{ + throw new RuntimeException("初始化的大小不能小于0;"+ initialSize); + } +} + + public void enQueue(Object o){ + if(rear == maxSize){ + throw new RuntimeException("队列已满,无法插入新的元素!"); + }else{ + queArray[rear++] = o ; + } + } + + public Object deQueue(){ + if(isEmpty()){ + throw new RuntimeException("空队列异常!"); + }else{ + Object obj = (Object) queArray[front]; + queArray[front++] = null; + return obj; + } + } + + //判空 + public boolean isEmpty(){ + return rear == front?true:false; + } + + public int size(){ + return rear-front; + } + */ + + + /** 采用链表实现对队列;队列的特点是:先进先出,而且不能插队;所以只能从尾进,从头出。 + * + * */ + private LinkedList ll ; + + public Queue(){ + this.ll = new LinkedList(); + } + + public void enQueue(Object o){ + ll.addLast(o); + } + + public Object deQueue(){ + return ll.removeLast(); + } + + public boolean isEmpty(){ + return ll.getHead().next == null ? true: false; + } + + public int size(){ + return ll.size(); + } +} \ No newline at end of file diff --git a/group01/751425278/src/com/sanmubird/basicDataStructure/Stack.java b/group01/751425278/src/com/sanmubird/basicDataStructure/Stack.java new file mode 100644 index 0000000000..7c6b03b3df --- /dev/null +++ b/group01/751425278/src/com/sanmubird/basicDataStructure/Stack.java @@ -0,0 +1,50 @@ +package com.sanmubird.basicDataStructure; + +public class Stack { + + private Object[] arrayStack ;// + private int maxSize ; //栈容量 + private int top ; //栈指针; + + public Stack(int initialSize){ + if(initialSize >= 0 ){ + this.arrayStack = new Object[initialSize]; + this.maxSize = initialSize ; + this.top = -1 ; + }else{ + throw new RuntimeException("初始化的大小不能小于0"+initialSize); + } + } + + // 进栈,进栈的第一个元素的top = 0 ; + public void push(Object o){ + if(top == maxSize -1 ){ + throw new RuntimeException("栈已满,无法将元素插入栈"); + }else{ + arrayStack[++top] = o ; + } + } + + public Object pop(){ + if(top == -1){ + throw new RuntimeException("栈为空!"); + }else{ + return arrayStack[top--]; + } + } + +// 查看栈顶元素,但是不移除 + public Object peek(){ + if(top == -1){ + throw new RuntimeException("栈为空!"); + }else{ + return arrayStack[top]; + } + } + public boolean isEmpty(){ + return top == -1 ? true : false; + } + public int size(){ + return arrayStack.length; + } +} \ No newline at end of file diff --git a/group01/751425278/src/com/sanmubird/litestruts/LoginAction.java b/group01/751425278/src/com/sanmubird/litestruts/LoginAction.java new file mode 100644 index 0000000000..63d91a4bac --- /dev/null +++ b/group01/751425278/src/com/sanmubird/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.sanmubird.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group01/751425278/src/com/sanmubird/litestruts/Struts.java b/group01/751425278/src/com/sanmubird/litestruts/Struts.java new file mode 100644 index 0000000000..3334beda30 --- /dev/null +++ b/group01/751425278/src/com/sanmubird/litestruts/Struts.java @@ -0,0 +1,125 @@ +package com.sanmubird.litestruts; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.ParserConfigurationException; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.xml.sax.SAXException; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + View view = new View(); + String actionClassPath = null ; + Class actionClass; + String resultName = null; + List actionElement = parseXML(); + try { + for(Element e : actionElement){ + if("action".equals(e.getName())){ + if(e.attributeValue("name").equals(actionName)){ + actionClassPath = e.attributeValue("class"); + actionClass = Class.forName(actionClassPath); + Object actionClassInstance = actionClass.newInstance(); //通过反射 得到类的对象 + + if(parameters != null){ + for(Map.Entry entry : parameters.entrySet()){ + String filedName = entry.getKey(); + String methodName = "set"+toUpperFirstLetter(filedName); + Class filedType = actionClass.getDeclaredField(filedName).getType(); + Method method = actionClass.getDeclaredMethod(methodName, filedType); + method.invoke(actionClassInstance, entry.getValue());//对当前对象的实例化; + } + } + + Method execute = actionClass.getDeclaredMethod("execute"); + String result = (String) execute.invoke(actionClassInstance); //得到execute执行的结果 + + Method[] methods = actionClass.getDeclaredMethods(); + Map param = new HashMap(); + for(Method method : methods){ + String methodName = method.getName(); + if(method.getName().startsWith("get")){ + String filedName = methodName.substring(3,4).toLowerCase()+methodName.substring(4); + Object filedValue = method.invoke(actionClassInstance); + param.put(filedName, filedValue); + } + } + + view.setParameters(param); + List resultElement = e.elements(); + for(Element e1 : resultElement ){ + if("result".equals(e1.getName())){ + resultName = e1.attributeValue("name"); + if(resultName.equals(result)){ + view.setJsp(e1.getText()); + break; + } + } + } + } + } + } + }catch (Exception e1) { + e1.printStackTrace(); + } + return view ; + } + + public static List parseXML(){ + SAXReader reader = new SAXReader(); + List firstList = null; + try { + + InputStream in = Struts.class.getClassLoader().getResourceAsStream("com/sanmubird/litestruts/struts.xml");// 要加载的文件和.class文件在同一个目录下; + // Class.getClassLoader.getResourceAsStream(String path); 默认是从ClassPath根下获取的; + // Class.getResourceAsStream(String path) path(/dirName/fileName)是从ClassPath根下获取的,没有/则是从本.class文件同目录中获取的; + Document doc = reader.read(in); + Element root = doc.getRootElement(); + firstList = root.elements(); + } catch (Exception e) { + e.printStackTrace(); + } + return firstList; + } + + public static String toUpperFirstLetter(String s){ + if(s != "" ){ + String s1 = s.substring(0,1).toUpperCase(); + String other = s.substring(1); + return s1+other; + }else{ + throw new RuntimeException("传入的参数不能是空 或 '' "); + } + } + +} diff --git a/group01/751425278/src/com/sanmubird/litestruts/StrutsTest.java b/group01/751425278/src/com/sanmubird/litestruts/StrutsTest.java new file mode 100644 index 0000000000..75e642de87 --- /dev/null +++ b/group01/751425278/src/com/sanmubird/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.sanmubird.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group01/751425278/src/com/sanmubird/litestruts/View.java b/group01/751425278/src/com/sanmubird/litestruts/View.java new file mode 100644 index 0000000000..840fcb1ef3 --- /dev/null +++ b/group01/751425278/src/com/sanmubird/litestruts/View.java @@ -0,0 +1,23 @@ +package com.sanmubird.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/751425278/src/com/sanmubird/litestruts/struts.xml b/group01/751425278/src/com/sanmubird/litestruts/struts.xml new file mode 100644 index 0000000000..8d05fbd92d --- /dev/null +++ b/group01/751425278/src/com/sanmubird/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/765324639/src/zavier/week01/basic/ArrayList.java b/group01/765324639/src/zavier/week01/basic/ArrayList.java new file mode 100644 index 0000000000..4c727d8429 --- /dev/null +++ b/group01/765324639/src/zavier/week01/basic/ArrayList.java @@ -0,0 +1,85 @@ +package zavier.week01.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + @Override + public void add(Object o) { + ensureCapacity(size + 1); + elementData[size++] = o; + } + + private void ensureCapacity(int size) { + if (size > elementData.length) { + grow(); + } + } + + private void grow() { + elementData = Arrays.copyOf(elementData, size * 2); + } + + @Override + public void add(int index, Object o) { + rangeCheckForAdd(index); + ensureCapacity(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + private void rangeCheckForAdd(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + } + + @Override + public Object get(int index) { + rangeCheck(index); + return elementData[index]; + } + + private void rangeCheck(int index) { + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(); + } + } + + @Override + public Object remove(int index) { + rangeCheck(index); + Object dest = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return dest; + } + + @Override + public int size() { + return size; + } + + public Iterator iterator() { + return new Iterator() { + + private int index = 0; + + @Override + public Object next() { + return elementData[index++]; + } + + @Override + public boolean hasNext() { + return index < size; + } + }; + } + +} diff --git a/group01/765324639/src/zavier/week01/basic/BinaryTreeNode.java b/group01/765324639/src/zavier/week01/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..bb259a6808 --- /dev/null +++ b/group01/765324639/src/zavier/week01/basic/BinaryTreeNode.java @@ -0,0 +1,63 @@ +package zavier.week01.basic; + +public class BinaryTreeNode { + + private Integer data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(Integer data) { + this.data = data; + } + + public Integer getData() { + return data; + } + + public void setData(Integer data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Integer o) { + + if (o > this.data) { + + if (this.getRight() == null) { + BinaryTreeNode node = new BinaryTreeNode(o); + this.setRight(node); + return node; + } else { + return this.getRight().insert(o); + } + + } else { + + if (this.getLeft() == null) { + BinaryTreeNode node = new BinaryTreeNode(o); + this.setLeft(node); + return node; + } else { + return this.getLeft().insert(o); + } + + } + + } + +} diff --git a/group01/765324639/src/zavier/week01/basic/Iterator.java b/group01/765324639/src/zavier/week01/basic/Iterator.java new file mode 100644 index 0000000000..34be879b68 --- /dev/null +++ b/group01/765324639/src/zavier/week01/basic/Iterator.java @@ -0,0 +1,8 @@ +package zavier.week01.basic; + +public interface Iterator { + public boolean hasNext(); + + public Object next(); + +} diff --git a/group01/765324639/src/zavier/week01/basic/LinkedList.java b/group01/765324639/src/zavier/week01/basic/LinkedList.java new file mode 100644 index 0000000000..a6268b0712 --- /dev/null +++ b/group01/765324639/src/zavier/week01/basic/LinkedList.java @@ -0,0 +1,148 @@ +package zavier.week01.basic; + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + + private int size = 0; + + @Override + public void add(Object o) { + if (head == null) { + head = new Node(o); + } else { + Node tail = head; + while (tail.next != null) { + tail = tail.next; + } + Node node = new Node(o); + + tail.next = node; + } + size++; + } + + @Override + public void add(int index, Object o) { + rangeCheckForAdd(index); + if (index == 0) { + Node node = new Node(o); + node.next = head; + head = node; + } else { + Node preDest = head; + for (int i = 0; i < index - 1; i++) { + preDest = preDest.next; + } + Node node = new Node(o); + node.next = preDest.next; + preDest.next = node; + } + + size++; + } + + private void rangeCheckForAdd(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException(); + } + } + + @Override + public Object get(int index) { + rangeCheck(index); + + Node dest = head; + for (int i = 0; i < index; i++) { + dest = dest.next; + } + return dest.data; + } + + private void rangeCheck(int index) { + if (index >= size || index < 0) { + throw new IndexOutOfBoundsException(); + } + } + + @Override + public Object remove(int index) { + rangeCheck(index); + + Node preDest = head; + for (int i = 0; i < index - 1; i++) { + preDest = preDest.next; + } + Node dest = preDest.next; + preDest.next = dest.next; + + size--; + return dest.data; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object o) { + Node node = new Node(o); + node.next = head; + head = node; + size++; + } + + public void addLast(Object o) { + Node lastNode = head; + while (lastNode.next != null) { + lastNode = lastNode.next; + } + + Node node = new Node(o); + lastNode.next = node; + size++; + } + + public Object removeFirst() { + if (head == null) { + throw new NoSuchElementException(); + } + Node target = head; + head = head.next; + size--; + return target.data; + } + + public Object removeLast() { + if (head == null) { + throw new NoSuchElementException(); + } + + Node preDest = head; + while (preDest.next.next != null) { + preDest = preDest.next; + } + Node dest = preDest.next; + preDest.next = null; + + size--; + return dest.data; + } + + public Iterator iterator() { + return null; + } + + + private static class Node { + Object data; + Node next; + + Node(Object data) { + this.data = data; + next = null; + } + } +} diff --git a/group01/765324639/src/zavier/week01/basic/List.java b/group01/765324639/src/zavier/week01/basic/List.java new file mode 100644 index 0000000000..51d96b47e8 --- /dev/null +++ b/group01/765324639/src/zavier/week01/basic/List.java @@ -0,0 +1,13 @@ +package zavier.week01.basic; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group01/765324639/src/zavier/week01/basic/Queue.java b/group01/765324639/src/zavier/week01/basic/Queue.java new file mode 100644 index 0000000000..e22cc6238f --- /dev/null +++ b/group01/765324639/src/zavier/week01/basic/Queue.java @@ -0,0 +1,25 @@ +package zavier.week01.basic; + +public class Queue { + + private LinkedList list = new LinkedList(); + + public void enQueue(Object o) { + list.add(o); + } + + public Object deQueue() { + if (list.size() == 0) { + return null; + } + return list.removeFirst(); + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } +} diff --git a/group01/765324639/src/zavier/week01/basic/Stack.java b/group01/765324639/src/zavier/week01/basic/Stack.java new file mode 100644 index 0000000000..40874fc8aa --- /dev/null +++ b/group01/765324639/src/zavier/week01/basic/Stack.java @@ -0,0 +1,33 @@ +package zavier.week01.basic; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + if (elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.remove(elementData.size() - 1); + } + + public Object peek() { + if (elementData.size() == 0) { + throw new EmptyStackException(); + } + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} diff --git a/group01/765324639/src/zavier/week01/test/AllTests.java b/group01/765324639/src/zavier/week01/test/AllTests.java new file mode 100644 index 0000000000..eba75cf178 --- /dev/null +++ b/group01/765324639/src/zavier/week01/test/AllTests.java @@ -0,0 +1,12 @@ +package zavier.week01.test; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ArrayListTest.class, LinkedListTest.class, QueueTest.class, StackTest.class, + BinaryTreeNodeTest.class}) +public class AllTests { + +} diff --git a/group01/765324639/src/zavier/week01/test/ArrayListTest.java b/group01/765324639/src/zavier/week01/test/ArrayListTest.java new file mode 100644 index 0000000000..69bd7ae4c7 --- /dev/null +++ b/group01/765324639/src/zavier/week01/test/ArrayListTest.java @@ -0,0 +1,91 @@ +package zavier.week01.test; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import zavier.week01.basic.ArrayList; +import zavier.week01.basic.Iterator; + +public class ArrayListTest { + + private ArrayList arrayList = new ArrayList(); + + @Before + public void setUp() { + for (int i = 0; i < 500; i++) { + arrayList.add(i); + } + } + + @Test + public void testAddObject() { + for (int i = 0; i < 500; i++) { + arrayList.add(i); + } + } + + @Test + public void testAddIntObject() { + arrayList.add(100, -100); + Assert.assertEquals(-100, arrayList.get(100)); + Assert.assertEquals(100, arrayList.get(101)); + Assert.assertEquals(501, arrayList.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testAddIllegalIntObject() { + arrayList.add(1000, 5); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testAddNegativeIntObject() { + arrayList.add(-1, 5); + } + + @Test + public void testGet() { + for (int i = 0; i < 500; i++) { + Assert.assertEquals(i, ((Integer) arrayList.get(i)).intValue()); + } + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testIllegalGet() { + arrayList.get(500); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testNegativeGet() { + arrayList.get(-10); + } + + @Test + public void testRemove() { + Assert.assertEquals(100, arrayList.remove(100)); + Assert.assertEquals(101, arrayList.get(100)); + Assert.assertEquals(499, arrayList.size()); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testIllegalRemove() { + arrayList.remove(500); + } + + @Test + public void testSize() { + Assert.assertEquals(500, arrayList.size()); + } + + @Test + public void testIterator() { + Iterator iterator = arrayList.iterator(); + int i = 0; + while (iterator.hasNext()) { + Assert.assertEquals(i, iterator.next()); + i++; + } + Assert.assertEquals(500, i); + } + +} diff --git a/group01/765324639/src/zavier/week01/test/BinaryTreeNodeTest.java b/group01/765324639/src/zavier/week01/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..d1b99e111c --- /dev/null +++ b/group01/765324639/src/zavier/week01/test/BinaryTreeNodeTest.java @@ -0,0 +1,33 @@ +package zavier.week01.test; + +import org.junit.Assert; +import org.junit.Test; + +import zavier.week01.basic.BinaryTreeNode; + +public class BinaryTreeNodeTest { + + private BinaryTreeNode root = new BinaryTreeNode(5); + + @Test + public void testInsert() { + root.insert(2); + root.insert(7); + root.insert(1); + root.insert(6); + + Assert.assertEquals((Integer) 5, root.getData()); + Assert.assertEquals((Integer) 2, root.getLeft().getData()); + Assert.assertEquals((Integer) 1, root.getLeft().getLeft().getData()); + Assert.assertEquals(null, root.getLeft().getRight()); + Assert.assertEquals((Integer) 7, root.getRight().getData()); + Assert.assertEquals((Integer) 6, root.getRight().getLeft().getData()); + Assert.assertEquals(null, root.getRight().getRight()); + + root.insert(4); + root.insert(8); + Assert.assertEquals((Integer) 4, root.getLeft().getRight().getData()); + Assert.assertEquals((Integer) 8, root.getRight().getRight().getData()); + } + +} diff --git a/group01/765324639/src/zavier/week01/test/LinkedListTest.java b/group01/765324639/src/zavier/week01/test/LinkedListTest.java new file mode 100644 index 0000000000..f807addc3b --- /dev/null +++ b/group01/765324639/src/zavier/week01/test/LinkedListTest.java @@ -0,0 +1,109 @@ +package zavier.week01.test; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import zavier.week01.basic.LinkedList; + + +public class LinkedListTest { + + private LinkedList linkedList = new LinkedList(); + + @Before + public void setUp() { + for (int i = 0; i < 500; i++) { + linkedList.add(i); + } + } + + @Test + public void testAddObject() { + for (int i = 0; i < 100; i++) { + linkedList.add(i); + } + Assert.assertEquals(600, linkedList.size()); + } + + @Test + public void testAddIntObject() { + linkedList.add(100, -100); + Assert.assertEquals(-100, linkedList.get(100)); + Assert.assertEquals(100, linkedList.get(101)); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testAddIllegalIntObject() { + linkedList.add(1000, 10); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testAddNegativeIntObject() { + linkedList.add(-10, 10); + } + + @Test + public void testGet() { + for (int i = 0; i < 500; i++) { + Assert.assertEquals(i, ((Integer) linkedList.get(i)).intValue()); + } + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testIllegalGet() { + linkedList.get(500); + } + + @Test(expected = IndexOutOfBoundsException.class) + public void testNegativeGet() { + linkedList.get(-10); + } + + @Test + public void testRemove() { + Assert.assertEquals(100, linkedList.remove(100)); + Assert.assertEquals(101, linkedList.get(100)); + Assert.assertEquals(499, linkedList.size()); + } + + @Test + public void testSize() { + Assert.assertEquals(500, linkedList.size()); + linkedList.add(10); + Assert.assertEquals(501, linkedList.size()); + } + + @Test + public void testAddFirst() { + linkedList.addFirst(-10); + Assert.assertEquals(-10, linkedList.get(0)); + linkedList.addFirst(-100); + Assert.assertEquals(-100, linkedList.get(0)); + Assert.assertEquals(-10, linkedList.get(1)); + } + + @Test + public void testAddLast() { + linkedList.addLast(-9); + Assert.assertEquals(-9, linkedList.get(linkedList.size() - 1)); + linkedList.addLast(-8); + Assert.assertEquals(-8, linkedList.get(linkedList.size() - 1)); + Assert.assertEquals(-9, linkedList.get(linkedList.size() - 2)); + } + + @Test + public void testRemoveFirst() { + Assert.assertEquals(0, linkedList.removeFirst()); + Assert.assertEquals(1, linkedList.removeFirst()); + Assert.assertEquals(498, linkedList.size()); + } + + @Test + public void testRemoveLast() { + Assert.assertEquals(499, linkedList.removeLast()); + Assert.assertEquals(498, linkedList.removeLast()); + Assert.assertEquals(498, linkedList.size()); + } + +} diff --git a/group01/765324639/src/zavier/week01/test/QueueTest.java b/group01/765324639/src/zavier/week01/test/QueueTest.java new file mode 100644 index 0000000000..b26fe5b5bb --- /dev/null +++ b/group01/765324639/src/zavier/week01/test/QueueTest.java @@ -0,0 +1,49 @@ +package zavier.week01.test; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import zavier.week01.basic.Queue; + +public class QueueTest { + + private Queue queue = new Queue(); + + @Before + public void setUp() { + for (int i = 0; i < 500; i++) { + queue.enQueue(i); + } + } + + @Test + public void testEnQueue() { + for (int i = 0; i < 100; i++) { + queue.enQueue(i); + } + Assert.assertEquals(600, queue.size()); + } + + @Test + public void testDeQueue() { + for (int i = 0; i < 500; i++) { + Assert.assertEquals(i, queue.deQueue()); + } + Assert.assertNull(queue.deQueue()); + Assert.assertNull(queue.deQueue()); + } + + @Test + public void testIsEmpty() { + Assert.assertFalse(queue.isEmpty()); + Queue q = new Queue(); + Assert.assertTrue(q.isEmpty()); + } + + @Test + public void testSize() { + Assert.assertEquals(500, queue.size()); + } + +} diff --git a/group01/765324639/src/zavier/week01/test/StackTest.java b/group01/765324639/src/zavier/week01/test/StackTest.java new file mode 100644 index 0000000000..71bcc6cc61 --- /dev/null +++ b/group01/765324639/src/zavier/week01/test/StackTest.java @@ -0,0 +1,60 @@ +package zavier.week01.test; + +import java.util.EmptyStackException; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import zavier.week01.basic.Stack; + + +public class StackTest { + + private Stack stack = new Stack(); + + @Before + public void setUp() { + for (int i = 0; i < 500; i++) { + stack.push(i); + } + } + + @Test + public void testPush() { + for (int i = 0; i < 100; i++) { + stack.push(i); + } + Assert.assertEquals(600, stack.size()); + } + + @Test(expected = EmptyStackException.class) + public void testPop() { + for (int i = 0; i < 500; i++) { + Assert.assertEquals(499 - i, stack.pop()); + } + stack.pop(); + } + + @Test + public void testPeek() { + Assert.assertEquals(499, stack.peek()); + Assert.assertEquals(499, stack.peek()); + stack.pop(); + Assert.assertEquals(498, stack.peek()); + } + + @Test + public void testIsEmpty() { + Assert.assertFalse(stack.isEmpty()); + Assert.assertTrue(new Stack().isEmpty()); + } + + @Test + public void testSize() { + Assert.assertEquals(500, stack.size()); + stack.pop(); + Assert.assertEquals(499, stack.size()); + } + +} diff --git a/group01/765324639/src/zavier/week02/coderising/array/ArrayUtil.java b/group01/765324639/src/zavier/week02/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..591fec9b70 --- /dev/null +++ b/group01/765324639/src/zavier/week02/coderising/array/ArrayUtil.java @@ -0,0 +1,263 @@ +package zavier.week02.coderising.array; + +import zavier.week01.basic.ArrayList; +import zavier.week01.basic.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = [7, 9, 30, 3, 4] , + * 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if (origin == null) { + throw new IllegalArgumentException(); + } + + int temp; + for (int i = 0; i < origin.length / 2; i++) { + temp = origin[i]; + origin[i] = origin[origin.length - 1 - i]; + origin[origin.length - 1 - i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + if (oldArray == null) { + throw new IllegalArgumentException(); + } + + int[] noZeroArray = new int[oldArray.length]; + int index = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + noZeroArray[index++] = oldArray[i]; + } + } + + return copyOf(noZeroArray, index); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = [3, 5, 7,8] a2 = [4, + * 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + if (array1 == null || array2 == null) { + throw new IllegalArgumentException(); + } + + int indexOfArray1 = 0; + int indexOfArray2 = 0; + int totalLength = array1.length + array2.length; + int[] destArr = new int[totalLength]; + + for (int i = 0; i < totalLength; i++) { + if (indexOfArray1 >= array1.length) { + // array1填充完毕,将array2填充剩下的元素 + arrayCopy(array2, indexOfArray2, destArr, i, array2.length - indexOfArray2); + int actualSize = i + array2.length - indexOfArray2; + return copyOf(destArr, actualSize); + } + + if (indexOfArray2 >= array2.length) { + arrayCopy(array1, indexOfArray1, destArr, i, array1.length - indexOfArray1); + int actualSize = i + array1.length - indexOfArray1; + return copyOf(destArr, actualSize); + } + + if (array1[indexOfArray1] < array2[indexOfArray2]) { + destArr[i] = array1[indexOfArray1]; + indexOfArray1++; + } else if (array1[indexOfArray1] == array2[indexOfArray2]) { + destArr[i] = array1[indexOfArray1]; + indexOfArray1++; + indexOfArray2++; // 去除重复元素 + } else { + destArr[i] = array2[indexOfArray2]; + indexOfArray2++; + } + + } + // array1.length、array2.length均为0的情况 + return new int[0]; + } + + private void arrayCopy(int[] src, int srcPos, int[] dest, int destPos, int length) { + for (int i = 0; i < length; i++) { + dest[destPos++] = src[srcPos++]; + } + } + + private int[] copyOf(int[] original, int newLength) { + int[] dest = new int[newLength]; + for (int i = 0; i < newLength; i++) { + dest[i] = original[i]; + } + return dest; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size 注意,老数组的元素在新数组中需要保持 例如 oldArray + * = [2,3,6] , size = 3,则返回的新数组为 [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + if (oldArray == null || size < 0) { + throw new IllegalArgumentException(); + } + + int newSize = oldArray.length + size; + int[] newArray = new int[newSize]; + for (int i = 0; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max < 0) { + throw new IllegalArgumentException(); + } + if (max == 1) { + return new int[] {}; + } + + ArrayList list = new ArrayList(); + list.add(1); + list.add(1); + + int i = 0; + while (true) { + int num = (int) list.get(i) + (int) list.get(i + 1); + if (num < max) { + list.add(num); + } else { + break; + } + i++; + } + + return intListToArray(list); + } + + private int[] intListToArray(List list) { + int[] array = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i] = (int) list.get(i); + } + return array; + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + if (max < 0) { + throw new IllegalArgumentException(); + } + + ArrayList list = new ArrayList(); + for (int i = 2; i < max; i++) { + if (isPrime(i)) { + list.add(i); + } + } + return intListToArray(list); + } + + private boolean isPrime(int num) { + for (int i = 2; i <= num / 2; i++) { + if (num % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + if (max < 0) { + throw new IllegalArgumentException(); + } + + ArrayList list = new ArrayList(); + for (int i = 2; i < max; i++) { + if (isPerfectNumber(i)) { + list.add(i); + } + } + return intListToArray(list); + } + + private boolean isPerfectNumber(int num) { + int sumOfFactor = 1; + for (int i = 2; i <= num / 2; i++) { + if (num % i == 0) { + sumOfFactor += i; + } + } + if (sumOfFactor == num) { + return true; + } + return false; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + if (array == null) { + throw new IllegalArgumentException(); + } + if (array.length == 0) { + return ""; + } + + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + builder.append(array[i]).append(seperator); + } + return builder.substring(0, builder.length() - seperator.length()); + } + + +} diff --git a/group01/765324639/src/zavier/week02/coderising/array/ArrayUtilTest.java b/group01/765324639/src/zavier/week02/coderising/array/ArrayUtilTest.java new file mode 100644 index 0000000000..d0e6fa11d8 --- /dev/null +++ b/group01/765324639/src/zavier/week02/coderising/array/ArrayUtilTest.java @@ -0,0 +1,133 @@ +package zavier.week02.coderising.array; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + + private ArrayUtil arrayUtil; + + @Before + public void setUp() { + arrayUtil = new ArrayUtil(); + } + + @Test + public void testReverseArray() { + int[] a = {}; + arrayUtil.reverseArray(a); + Assert.assertArrayEquals(new int[] {}, a); + + int[] b = {1, 2, 3}; + arrayUtil.reverseArray(b); + Assert.assertArrayEquals(new int[] {3, 2, 1}, b); + + int[] c = {1, 2, 3, 4}; + arrayUtil.reverseArray(c); + Assert.assertArrayEquals(new int[] {4, 3, 2, 1}, c); + + int[] d = new int[5000]; + int[] d1 = new int[5000]; + for (int i = 0; i < 5000; i++) { + d[i] = i; + d1[i] = 4999 - i; + } + arrayUtil.reverseArray(d); + Assert.assertArrayEquals(d1, d); + } + + @Test(expected = IllegalArgumentException.class) + public void testRemoveZero() { + int oldArr1[] = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; + int newArr1[] = {1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5}; + Assert.assertArrayEquals(newArr1, arrayUtil.removeZero(oldArr1)); + + int oldArr2[] = {0, 0, 0, 0, 0}; + int newArr2[] = {}; + Assert.assertArrayEquals(newArr2, arrayUtil.removeZero(oldArr2)); + + int oldArr3[] = {0, 0, 0, 0, 0, 1, 2, 3}; + int newArr3[] = {1, 2, 3}; + Assert.assertArrayEquals(newArr3, arrayUtil.removeZero(oldArr3)); + + int oldArr4[] = {1, 2, 3, 0, 0, 0, 0, 0}; + int newArr4[] = {1, 2, 3}; + Assert.assertArrayEquals(newArr4, arrayUtil.removeZero(oldArr4)); + + int oldArr5[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0}; + int newArr5[] = {1, 2, 3, 4}; + Assert.assertArrayEquals(newArr5, arrayUtil.removeZero(oldArr5)); + + int oldArr6[] = {}; + int newArr6[] = {}; + Assert.assertArrayEquals(newArr6, oldArr6); + + arrayUtil.removeZero(null); + } + + @Test + public void testMerge() { + int[] a1 = {3, 5, 7, 8}; + int[] a2 = {4, 5, 6, 7}; + Assert.assertArrayEquals(new int[] {3, 4, 5, 6, 7, 8}, arrayUtil.merge(a1, a2)); + + int[] b1 = {1, 2, 9, 100}; + int[] b2 = {3, 4, 5, 90, 100}; + Assert.assertArrayEquals(new int[] {1, 2, 3, 4, 5, 9, 90, 100}, arrayUtil.merge(b1, b2)); + + int[] c1 = {}; + int[] c2 = {1, 2, 3}; + Assert.assertArrayEquals(new int[] {1, 2, 3}, arrayUtil.merge(c1, c2)); + + int[] d1 = {}; + int[] d2 = {}; + Assert.assertArrayEquals(new int[] {}, arrayUtil.merge(d1, d2)); + } + + @Test + public void testGrow() { + int[] a1 = {2, 3, 6}; + Assert.assertArrayEquals(new int[] {2, 3, 6, 0, 0, 0}, arrayUtil.grow(a1, 3)); + Assert.assertArrayEquals(new int[] {2, 3, 6}, arrayUtil.grow(a1, 0)); + } + + @Test + public void testFibonacci() { + Assert.assertArrayEquals(new int[] {}, arrayUtil.fibonacci(1)); + Assert.assertArrayEquals(new int[] {1, 1, 2, 3, 5, 8, 13}, arrayUtil.fibonacci(15)); + + int[] a = new int[] {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, + 2584, 4181, 6765}; + Assert.assertArrayEquals(a, arrayUtil.fibonacci(6766)); + } + + @Test + public void testGetPrimes() { + Assert.assertArrayEquals(new int[] {}, arrayUtil.getPrimes(1)); + Assert.assertArrayEquals(new int[] {}, arrayUtil.getPrimes(2)); + Assert.assertArrayEquals(new int[] {2, 3, 5, 7, 11, 13, 17, 19}, arrayUtil.getPrimes(23)); + Assert.assertArrayEquals(new int[] {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, + 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, + 149, 151, 157, 163, 167, 173, 179}, arrayUtil.getPrimes(181)); + } + + @Test + public void testGetPerfectNumbers() { + Assert.assertArrayEquals(new int[] {6}, arrayUtil.getPerfectNumbers(7)); + Assert.assertArrayEquals(new int[] {6, 28}, arrayUtil.getPerfectNumbers(496)); + Assert.assertArrayEquals(new int[] {6, 28, 496}, arrayUtil.getPerfectNumbers(497)); + Assert.assertArrayEquals(new int[] {6, 28, 496, 8128}, arrayUtil.getPerfectNumbers(8129)); + + } + + @Test + public void testJoin() { + Assert.assertEquals("", arrayUtil.join(new int[] {}, "-")); + Assert.assertEquals("1", arrayUtil.join(new int[] {1}, "-")); + Assert.assertEquals("1-2-8-3-4-5", arrayUtil.join(new int[] {1, 2, 8, 3, 4, 5}, "-")); + Assert.assertEquals("1*-*2*-*8*-*3*-*4*-*5", + arrayUtil.join(new int[] {1, 2, 8, 3, 4, 5}, "*-*")); + } + +} diff --git a/group01/765324639/src/zavier/week02/coderising/litestruts/LoginAction.java b/group01/765324639/src/zavier/week02/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..07e32bcfb3 --- /dev/null +++ b/group01/765324639/src/zavier/week02/coderising/litestruts/LoginAction.java @@ -0,0 +1,42 @@ +package zavier.week02.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * + * @author liuxin + * + */ +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group01/765324639/src/zavier/week02/coderising/litestruts/Struts.java b/group01/765324639/src/zavier/week02/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..044b889e2f --- /dev/null +++ b/group01/765324639/src/zavier/week02/coderising/litestruts/Struts.java @@ -0,0 +1,117 @@ +package zavier.week02.coderising.litestruts; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) 据parameters中的数据,调用对象的setter方法, + * 例如parameters中的数据是 ("name"="test" , "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} + * , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, 放到View对象的jsp字段中。 + * + */ + + try { + + SAXReader reader = new SAXReader(); + InputStream struts = Struts.class.getResourceAsStream("struts.xml"); + Document document = null; + try { + document = reader.read(struts); + } catch (DocumentException e) { + e.printStackTrace(); + } + + String className = ""; // actionName对应的类名 + Element rootElement = document.getRootElement(); + Iterator iterator = rootElement.elementIterator("action"); + Element targetAction = null; // actionName对应的action + while (iterator.hasNext()) { + Element element = (Element) iterator.next(); + String name = element.attributeValue("name"); + if (name.equals(actionName)) { + className = element.attributeValue("class"); + targetAction = element; + break; + } + } + + + Class class1 = Class.forName(className); + Object instance = class1.newInstance(); + + Set keySet = parameters.keySet(); + for (String key : keySet) { + // 将变量名拼成对应的set方法名 + String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); + Class type = class1.getDeclaredField(key).getType(); + Method method = class1.getDeclaredMethod(methodName, type); + // 依次调用对应的set方法 + method.invoke(instance, parameters.get(key)); + } + + String result = (String) class1.getDeclaredMethod("execute").invoke(instance); + + Method[] declaredMethods = class1.getDeclaredMethods(); + HashMap map = new HashMap<>(); + for (int i = 0; i < declaredMethods.length; i++) { + if (declaredMethods[i].getName().startsWith("get")) { + String fieldValue = (String) declaredMethods[i].invoke(instance); + String fieldName = methodNameToFieldName(declaredMethods[i].getName()); + map.put(fieldName, fieldValue); + } + } + + View view = new View(); + view.setParameters(map); + + Iterator elementIterator = targetAction.elementIterator("result"); + while (elementIterator.hasNext()) { + Element element = (Element) elementIterator.next(); + if (result.equals(element.attributeValue("name"))) { + view.setJsp(element.getText()); + } + } + + return view; + + + } catch (Exception e1) { + e1.printStackTrace(); + } + + return null; + } + + private static String methodNameToFieldName(String methodName) { + if (!methodName.startsWith("get") && !methodName.startsWith("set")) { + throw new IllegalArgumentException(); + } + + return methodName.substring(3, 4).toLowerCase() + methodName.substring(4); + } + +} diff --git a/group01/765324639/src/zavier/week02/coderising/litestruts/StrutsTest.java b/group01/765324639/src/zavier/week02/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..536d71bd4f --- /dev/null +++ b/group01/765324639/src/zavier/week02/coderising/litestruts/StrutsTest.java @@ -0,0 +1,42 @@ +package zavier.week02.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); // 密码和预设的不一致 + + View view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", + view.getParameters().get("message")); + } +} diff --git a/group01/765324639/src/zavier/week02/coderising/litestruts/View.java b/group01/765324639/src/zavier/week02/coderising/litestruts/View.java new file mode 100644 index 0000000000..55cfdb7233 --- /dev/null +++ b/group01/765324639/src/zavier/week02/coderising/litestruts/View.java @@ -0,0 +1,26 @@ +package zavier.week02.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/765324639/src/zavier/week02/coderising/litestruts/struts.xml b/group01/765324639/src/zavier/week02/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..6124872e92 --- /dev/null +++ b/group01/765324639/src/zavier/week02/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/819048836/lvxg2017/src/basic/BinaryTree.java b/group01/819048836/lvxg2017/src/basic/BinaryTree.java new file mode 100644 index 0000000000..ae9f46807b --- /dev/null +++ b/group01/819048836/lvxg2017/src/basic/BinaryTree.java @@ -0,0 +1,41 @@ +package basic; + +public class BinaryTree { + private BinaryTreeNode root;//根节点 + + //插入操作 + public void insert(int value){ + BinaryTreeNode newNode = new BinaryTreeNode(value); + if(root==null){ + root = newNode; + root.setLeft(null); + root.setRight(null); + }else{ + BinaryTreeNode currentNode = root; + BinaryTreeNode parentNode; + while(true) + { + parentNode = currentNode; + //往右放 + if(newNode.getData()>currentNode.getData()){ + currentNode = currentNode.getRight(); + if(currentNode ==null){ + parentNode.setRight(newNode); + return; + } + }else if(newNode.getData()<=currentNode.getData()){ + currentNode = currentNode.getLeft(); + if(currentNode ==null){ + parentNode.setLeft(newNode); + return; + } + } + + } + + } + + + } + +} diff --git a/group01/819048836/lvxg2017/src/basic/BinaryTreeNode.java b/group01/819048836/lvxg2017/src/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..0a62b68df9 --- /dev/null +++ b/group01/819048836/lvxg2017/src/basic/BinaryTreeNode.java @@ -0,0 +1,34 @@ +package basic; + +//������ +public class BinaryTreeNode { + private int data;//节点值 + private BinaryTreeNode left; //左子节点 + private BinaryTreeNode right;//右子节点 + public BinaryTreeNode(int data){ + this.data =data; + this.left = null; + this.right = null; + } + public void setDate(int data){ + this.data =data; + } + public int getData(){ + return data; + } + public BinaryTreeNode getLeft(){ + return left; + } + public BinaryTreeNode getRight(){ + return right; + } + public void setLeft(BinaryTreeNode left){ + this.left = left; + } + public void setRight(BinaryTreeNode right){ + this.right =right; + } + + + +} diff --git a/group01/819048836/lvxg2017/src/basic/MyArrayList.java b/group01/819048836/lvxg2017/src/basic/MyArrayList.java new file mode 100644 index 0000000000..e6d4e3dcd4 --- /dev/null +++ b/group01/819048836/lvxg2017/src/basic/MyArrayList.java @@ -0,0 +1,88 @@ +package basic; +/** + * + * + * @author lvxg + * + */ +public class MyArrayList { + private Object[] element; + private int size; + private static final Object[] EMPTY = new Object[10]; + + public MyArrayList() { + this.element = EMPTY; + } + + public boolean add(Object o) { + if (size < element.length) { + element[size] = o; + size++; + } else { + //数组扩容 + grow(); + element[size] = o; + size++; + } + return true; + } + + //根据索引添加 + public boolean add(int index, Object o) { + rangeCheckForAdd(index); + if (size < element.length + 1) { + Object[] e = new Object[element.length+1]; + System.arraycopy(element, 0, e, 0, index); + e[index] = o; + System.arraycopy(element, index, e, index + 1, element.length-index); + element = e; + size++; + } + return true; + } + + public Object get(int index) { + rangeCheck(index); + return element[index]; + } + + public Object remove(int index) { + rangeCheck(index); + Object oldValue = element[index]; + int numMoved = size - index-1; + if(numMoved>0){ + System.arraycopy(element, index+1, element, index, numMoved); + } + element[--size] =null; + return oldValue; + } + public int size() { + return size; + } + private void rangeCheck(int index) { + if (index >= size) + throw new IndexOutOfBoundsException(); + } + private void rangeCheckForAdd(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException(); + } + } + + //数组扩容方法 + private void grow() { + Object[] e = new Object[size * 2]; + System.arraycopy(element, 0, e, 0, element.length); + element = e; + + } + + public static void main(String[] args) { + MyArrayList m = new MyArrayList(); + for (int i = 0; i < 10; i++) { + m.add(i); + } + m.add(2, "123"); + } + +} diff --git a/group01/819048836/lvxg2017/src/basic/MyLinkedList.java b/group01/819048836/lvxg2017/src/basic/MyLinkedList.java new file mode 100644 index 0000000000..a9040bbbaa --- /dev/null +++ b/group01/819048836/lvxg2017/src/basic/MyLinkedList.java @@ -0,0 +1,168 @@ +package basic; + + + +/** + * 链表 + * + * @author lvxg + * + */ +public class MyLinkedList { + // 头节点 + private Node first; + // 尾节点 + private Node last; + // 链表长度 + private int size = 0; + + public boolean add(Object o) { + linklast(o); + return true; + } + /** + * 根据索引添加节点 + * @param index + * @param o + */ + public void add(int index, Object o) { + checkPositionIndex(index); + if (index == size) { + linklast(o); + } else { + final Node succ = node(index); + final Node pred = succ.prev; + Node newNode = new Node(o, pred, succ); + if (pred == null) { + first = newNode; + } else { + pred.next = newNode; + } + size++; + } + } + //根据索引删除节点 + private Object remove(int index){ + Object x= unllink(node(index)); + return x; + } + private Object remove(){ + Object x = unllink(node(size)); + return x; + } + @SuppressWarnings("unused") + private Object get(int index) + { + Node f = first; + for (int i = 0; i < index; i++) { + f = f.next; + } + return f.data; + } + @SuppressWarnings("unused") + private int size(){ + return size; + } + @SuppressWarnings("unused") + private void addFirst(Object o){ + Node f= first; + Node newNode = new Node(o, f, null); + f.prev = newNode; + first = newNode; + } + @SuppressWarnings("unused") + private void addLast(Object o){ + Node l = last; + Node newNode = new Node(o, null, l); + l.next = newNode; + last = newNode; + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + + private void linklast(Object e) { + final Node l = last; + final Node newNode = new Node(e, null, l); + last = newNode; + if (l == null) { + first = newNode; + } else { + l.next = newNode; + } + size++; + + } + + private Object unllink(Node x) { + final Object element = x.data; + final Node next = x.next; + final Node prev = x.prev; + if (prev == null) { + first = next; + } else { + prev.next = next; + x.next = null; + x.prev = null; + } + if (next == null) { + last = prev; + x.next = null; + } + size--; + x.data = null; + return element; + } + + private Node node(int index) { + if (index < (size >> 1)) { + Node x = first; + for (int i = 0; i < index; i++) { + x = x.next; + } + return x; + } else { + Node x = last; + for (int i = size - 1; i > index; i--) { + x = x.prev; + } + return x; + } + } + + private static class Node { + Object data; // 节点值 + Node next;// 后继节点 + Node prev;// 前驱节点 + + public Node(Object o, Node n, Node p) { + this.data = o; + this.prev = p; + this.next = n; + } + } + + private void checkPositionIndex(int index) { + if (!isPositionIndex(index)) { + throw new IndexOutOfBoundsException(); + } + } + + private boolean isPositionIndex(int index) { + return index >= 0 && index <= size; + } + + public static void main(String[] args) { + MyLinkedList l = new MyLinkedList(); + l.add("1"); + l.add("2"); + l.add("3"); + l.add(2, "4"); + l.remove(); + l.remove(1); + } + +} diff --git a/group01/819048836/lvxg2017/src/basic/Queue.java b/group01/819048836/lvxg2017/src/basic/Queue.java new file mode 100644 index 0000000000..7520854ec4 --- /dev/null +++ b/group01/819048836/lvxg2017/src/basic/Queue.java @@ -0,0 +1,43 @@ +package basic; + +public class Queue { + private Node first; + private Node last; + private int size = 0; + + //入列 + @SuppressWarnings("unused") + private void enQueue(Object o) { + final Node f = first; + final Node newNode = new Node(o, f, null); + f.prev = newNode; + } + public int size(){ + return size; + } +public boolean isEmpty(){ + return size>=0; +} + // 出列 + @SuppressWarnings("unused") + private Object deQueue() { + final Node l = last; + final Node p = l.prev; + last = p; + p.next = null; + return l; + } + + private static class Node { + Object data; + Node next; + Node prev; + + public Node(Object o, Node n, Node p) { + this.data = o; + this.prev = p; + this.next = n; + } + } + +} diff --git a/group01/819048836/lvxg2017/src/basic/Stack.java b/group01/819048836/lvxg2017/src/basic/Stack.java new file mode 100644 index 0000000000..2325836de1 --- /dev/null +++ b/group01/819048836/lvxg2017/src/basic/Stack.java @@ -0,0 +1,58 @@ +package basic; + +//ջ +public class Stack { + private Node first; + private Node last; + private int size = 0; + + // 出栈 + private void pop() { + removeLast(); + } + + // 入栈 + private void push(Object o) { + addLast(o); + } + private boolean isEmpty(){ + if(size==0){ + return true; + }else{ + return false; + } + } + private int size(){ + return size; + } + private void removeLast(){ + final Node f = last.prev; + last = f; + f.next =null; + } + + + private void addLast(Object o){ + final Node f= first; + final Node l = last; + final Node newNode = new Node(o, last, null); + if(f==null){ + first =newNode; + }else{ + l.next = newNode; + } + size++; + } + + private static class Node { + Object data; + Node next; + Node prev; + + public Node(Object o, Node n, Node p) { + this.data = o; + this.prev = p; + this.next = n; + } + } +} diff --git a/group01/819048836/lvxg2017/src/com/coderising/ArrayUtil.java b/group01/819048836/lvxg2017/src/com/coderising/ArrayUtil.java new file mode 100644 index 0000000000..68c4208ede --- /dev/null +++ b/group01/819048836/lvxg2017/src/com/coderising/ArrayUtil.java @@ -0,0 +1,226 @@ +package com.coderising; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static void reverseArray(int[] origin) { + for (int i = 0; i < origin.length / 2; i++) { + int temp = origin[i]; + origin[i] = origin[origin.length - i - 1]; + origin[origin.length - i - 1] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + int size = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + size++; + } + } + int[] newArray = new int[size]; + int j = 0; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[j++] = oldArray[i]; + } + } + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2) { + int[] newArr = new int[array1.length + array2.length]; + int index1 = 0; + int index2 = 0; + int z = 0; + for (int i = 0; i < array2.length; i++) { + if (array1[index1] - array2[index2] > 0) { + newArr[z++] = array2[index2]; + } + } + + return null; + } + + public static int[] merge1(int[] array1, int[] array2) { + int size = 0; + for (int i = 0; i < array1.length; i++) { + for (int j = 0; j < array2.length; j++) { + if (array1[i] == array2[j]) { + size++; + } + } + } + int[] newArr = new int[array1.length + array2.length - size]; + int z = 0; + for (int i = 0; i < array1.length; i++) { + for (int j = 0; j < array2.length; j++) { + if (array1[i] < array2[j]) { + newArr[z++] = array1[i]; + break; + } else if (array1[i] > array2[j]) { + newArr[z++] = array2[j]; + break; + } else if (array1[i] == array2[j]) { + newArr[z++] = array1[i]; + break; + } + + } + } + System.out.println(size); + return null; + } + + /** + * 把一个已存满数据的数组oldArray的容量进行扩展,扩展后的新数据大小为OldArray,length+size + * 注意,老数组的元素在新数组中需要保持 + * + * @param args + */ + public static int[] grow(int[] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, size); + return newArray; + } + + /** + * 裴波那契数列为:1,1,2,3,5,8,13,21。。。 例如max = 15,则返回的数组应该为[1,1,2,3,5,8,13] max =1 + * ,则返回空数组[] + * + * @param args + */ + public static int[] fibonacci(int max) { + if (max == 1) { + int[] arr = new int[0]; + return arr; + } + int x = 1; + int y = 1; + int temp = 0; + int size = 0; + while (true) { + temp = y; + y = x + y; + x = temp; + if (y >= max) { + break; + } + size++; + + } + int[] array = new int[size + 2]; + array[0] = 1; + array[1] = 1; + int j = 2; + int m = 1; + int n = 1; + int temp1 = 1; + while (true) { + temp1 = n; + n = m + n; + m = temp1; + if (n >= max) { + break; + } + size++; + array[j++] = n; + } + return array; + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + */ + public static int[] getPrimes(int max) { + int i = 0; + for (int j = 2; j < max; j++) { + boolean b = false; + for (int j2 = 2; j2 < j; j2++) { + if (j % j2 == 0) { + b = true; + break; + } + } + if (b == false) { + i++; + } + } + int[] arr = new int[i]; + int z = 0; + for (int j = 2; j < max; j++) { + boolean b = false; + for (int j2 = 2; j2 < j; j2++) { + if (j % j2 == 0) { + b = true; + break; + } + } + if (b == false) { + arr[z++] = j; + } + } + return arr; + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator) { + for (int i = 0; i < array.length; i++) { + if (i == 0) { + seperator = array[i] + ""; + } else { + seperator = seperator + "-" + "" + array[i] + ""; + } + } + return seperator; + } + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max){ + return null; + } + + public static void main(String[] args) { + int[] a = { 1, 3, 5, 6 }; + int[] b = { 2, 3, 4, 5, 7 }; + int[] ab = ArrayUtil.fibonacci(30); + int array[] = { 1, 2, 3, 4 }; + String s = ArrayUtil.join(array, new String()); + System.out.println(s); + } +} diff --git a/group01/819048836/lvxg2017/src/com/coderising/action/LoginAction.java b/group01/819048836/lvxg2017/src/com/coderising/action/LoginAction.java new file mode 100644 index 0000000000..1c89562c51 --- /dev/null +++ b/group01/819048836/lvxg2017/src/com/coderising/action/LoginAction.java @@ -0,0 +1,36 @@ +package com.coderising.action; + +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group01/819048836/lvxg2017/src/com/coderising/action/Struts.java b/group01/819048836/lvxg2017/src/com/coderising/action/Struts.java new file mode 100644 index 0000000000..62ac33bc52 --- /dev/null +++ b/group01/819048836/lvxg2017/src/com/coderising/action/Struts.java @@ -0,0 +1,102 @@ +package com.coderising.action; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + * + */ + try { + SAXReader reader = new SAXReader(); + InputStream in = Struts.class.getResourceAsStream("struts.xml"); + Document document = reader.read(in); + Element root = document.getRootElement(); + System.out.println(root); + System.out.println(document); + + // 与actionName匹配的Element + Element actionElement = null; + String className = null; + + for (Iterator iterator = root.elementIterator("action"); iterator.hasNext();) { + Element e = iterator.next(); + if (e.attributeValue("name").equals(actionName)) { + actionElement = e; + className = e.attributeValue("class"); + break; + } + } + Class clazz = Class.forName(className); + Object instance = clazz.newInstance(); + Set keySet = parameters.keySet(); + for (String key : keySet) { + String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); + Class type = clazz.getDeclaredField(key).getType(); + Method method = clazz.getDeclaredMethod(methodName, type); + // 依次调用对应的set方法 + method.invoke(instance, parameters.get(key)); + } + String result = (String) clazz.getDeclaredMethod("execute").invoke(instance); + // 反射调用getter方法 + Method[] methods =clazz.getDeclaredMethods(); + Map param = new HashMap<>(); + for (Method method : methods) { + String methodname = method.getName(); + if(method.getName().startsWith("get")){ + String fieldName = methodname.substring(3, 4).toLowerCase() + methodname.substring(4); + Object fieldValue = method.invoke(instance); + param.put(fieldName, fieldValue); + } + } + View view = new View(); + view.setParameters(param); + for (Iterator iterator = actionElement.elementIterator("result"); iterator.hasNext();) { + Element resultElement = iterator.next(); + if (resultElement.attributeValue("name").equals(result)) { + view.setJsp(resultElement.getText()); + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + public static void main(String[] args) { + Map map = new HashMap<>(); + map.put("name", "test"); + map.put("password", "1234"); + Struts.runAction("login", map); + + } +} diff --git a/group01/819048836/lvxg2017/src/com/coderising/action/StrutsTest.java b/group01/819048836/lvxg2017/src/com/coderising/action/StrutsTest.java new file mode 100644 index 0000000000..c9bf8d3efe --- /dev/null +++ b/group01/819048836/lvxg2017/src/com/coderising/action/StrutsTest.java @@ -0,0 +1,24 @@ +package com.coderising.action; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class StrutsTest { + + + @Test + public void testLoginActionSuccess() { + // File f = new + + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + + } +} diff --git a/group01/819048836/lvxg2017/src/com/coderising/action/View.java b/group01/819048836/lvxg2017/src/com/coderising/action/View.java new file mode 100644 index 0000000000..11cb1872e5 --- /dev/null +++ b/group01/819048836/lvxg2017/src/com/coderising/action/View.java @@ -0,0 +1,23 @@ +package com.coderising.action; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group01/819048836/lvxg2017/src/com/coderising/action/struts.xml b/group01/819048836/lvxg2017/src/com/coderising/action/struts.xml new file mode 100644 index 0000000000..90cf18b7da --- /dev/null +++ b/group01/819048836/lvxg2017/src/com/coderising/action/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group01/895457260/code/src/algorithm/ArrayUtil.java b/group01/895457260/code/src/algorithm/ArrayUtil.java new file mode 100644 index 0000000000..bb5a25a93a --- /dev/null +++ b/group01/895457260/code/src/algorithm/ArrayUtil.java @@ -0,0 +1,239 @@ +package algorithm; + +import datastructure.basic.ArrayList; + +import java.util.stream.Stream; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int head = 0; + int rear = origin.length - 1; + for (; head < rear; ++head, --rear) { + if (origin[head] != origin[rear]) { + int t = origin[head]; + origin[head] = origin[rear]; + origin[rear] = t; + } + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int count = 0; + int[] tempArray = new int[oldArray.length]; + for (int i : oldArray) { + if (i != 0) { + tempArray[count++] = i; + } + } + int[] newArray = new int[count]; + System.arraycopy(tempArray, 0, newArray, 0, count); + return newArray; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int[] tempArray = new int[array1.length + array2.length]; + int count = 0; + int p1 = 0, p2 = 0; + + while (p1 < array1.length && p2 < array2.length) { + if (array1[p1] < array2[p2]) { + if (count == 0 || array1[p1] != tempArray[count - 1]) { + tempArray[count++] = array1[p1]; + } + p1++; + } else if (array1[p1] > array2[p2]) { + if (count == 0 || array2[p2] != tempArray[count - 1]) { + tempArray[count++] = array2[p2++]; + } + p2++; + } else { + if (count == 0 || array1[p1] != tempArray[count - 1]) { + tempArray[count++] = array1[p1++]; + } + p1++; + p2++; + } + } + while (p1 < array1.length) { + if (count == 0 || array1[p1] != tempArray[count - 1]) { + tempArray[count++] = array1[p1]; + } + p1++; + } + while (p2 < array2.length) { + if (count == 0 || array2[p2] != tempArray[count - 1]) { + tempArray[count++] = array2[p2]; + } + p2++; + } + + int[] newArray = new int[count]; + System.arraycopy(tempArray, 0, newArray, 0, count); + return newArray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size) { + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max <= 1) { + return new int[0]; + } + + ArrayList list = new ArrayList(); + list.add(1); + list.add(1); + while (true) { + int a = (int) (list.get(list.size() - 1)); + int b = (int) (list.get(list.size() - 2)); + if (a + b < max) { + list.add(a + b); + } else { + break; + } + } + int[] result = new int[list.size()]; + for (int i = 0; i < list.size(); ++i) { + result[i] = (int) list.get(i); + } + return result; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max) { + if (max <= 2) { + return new int[0]; + } + + ArrayList list = new ArrayList(); + for (int i = 2; true; ++i) { + if (i >= max) { + break; + } else if (isPrime(i)) { + list.add(i); + } + } + + int[] result = new int[list.size()]; + for (int i = 0; i < list.size(); ++i) { + result[i] = (int) list.get(i); + } + return result; + } + + private boolean isPrime(int n) { + for (int i = 2; i <= Math.sqrt(n); ++i) { + if (n % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + if (max <= 6) { + return new int[0]; + } + + ArrayList list = new ArrayList(); + for (int i = 2; true; ++i) { + if (i >= max) { + break; + } else if (isPerfect(i)) { + list.add(i); + } + } + + int[] result = new int[list.size()]; + for (int i = 0; i < list.size(); ++i) { + result[i] = (int) list.get(i); + } + return result; + } + + private boolean isPerfect(int n) { + int sum = 1; + for (int i = 2; i <= n / 2; ++i) { + if (sum > n) { + return false; + } + if (n % i == 0) { + sum += i; + } + } + return sum == n; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + if (array.length == 0) { + return ""; + } + StringBuilder builder = new StringBuilder(); + builder.append(array[0]); + for (int i = 1; i < array.length; ++i) { + builder.append(seperator).append(array[i]); + } + return builder.toString(); + } +} diff --git a/group01/895457260/code/src/algorithm/test/ArrayUtilTest.java b/group01/895457260/code/src/algorithm/test/ArrayUtilTest.java new file mode 100644 index 0000000000..85f04f3b31 --- /dev/null +++ b/group01/895457260/code/src/algorithm/test/ArrayUtilTest.java @@ -0,0 +1,234 @@ +package algorithm.test; + +import algorithm.ArrayUtil; +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** + * ArrayUtil Tester. + * + * @author + * @version 1.0 + * @since

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⁡H5h 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